| @@ -156,27 +156,27 @@ | | | @@ -156,27 +156,27 @@ |
156 | }) | | 156 | }) |
157 | | | 157 | |
158 | (define_expand "atomic_test_and_set" | | 158 | (define_expand "atomic_test_and_set" |
159 | [(match_operand:QI 0 "register_operand" "") ;; bool output | | 159 | [(match_operand:QI 0 "register_operand" "") ;; bool output |
160 | (match_operand:QI 1 "memory_operand" "+YR") ;; memory | | 160 | (match_operand:QI 1 "memory_operand" "+YR") ;; memory |
161 | (match_operand:SI 2 "const_int_operand" "")] ;; model | | 161 | (match_operand:SI 2 "const_int_operand" "")] ;; model |
162 | "TARGET_ATOMIC" | | 162 | "TARGET_ATOMIC" |
163 | { | | 163 | { |
164 | /* We have no QImode atomics, so use the address LSBs to form a mask, | | 164 | /* We have no QImode atomics, so use the address LSBs to form a mask, |
165 | then use an aligned SImode atomic. */ | | 165 | then use an aligned SImode atomic. */ |
166 | rtx result = operands[0]; | | 166 | rtx result = operands[0]; |
167 | rtx mem = operands[1]; | | 167 | rtx mem = operands[1]; |
168 | rtx model = operands[2]; | | 168 | rtx model = operands[2]; |
169 | rtx addr = XEXP (mem, 0); | | 169 | rtx addr = force_reg (Pmode, XEXP (mem, 0)); |
170 | | | 170 | |
171 | rtx aligned_addr = gen_reg_rtx (Pmode); | | 171 | rtx aligned_addr = gen_reg_rtx (Pmode); |
172 | emit_move_insn (aligned_addr, gen_rtx_AND (Pmode, addr, GEN_INT (-4))); | | 172 | emit_move_insn (aligned_addr, gen_rtx_AND (Pmode, addr, GEN_INT (-4))); |
173 | | | 173 | |
174 | rtx aligned_mem = change_address (mem, SImode, aligned_addr); | | 174 | rtx aligned_mem = change_address (mem, SImode, aligned_addr); |
175 | set_mem_alias_set (aligned_mem, 0); | | 175 | set_mem_alias_set (aligned_mem, 0); |
176 | | | 176 | |
177 | rtx offset = gen_reg_rtx (SImode); | | 177 | rtx offset = gen_reg_rtx (SImode); |
178 | emit_move_insn (offset, gen_rtx_AND (SImode, gen_lowpart (SImode, addr), | | 178 | emit_move_insn (offset, gen_rtx_AND (SImode, gen_lowpart (SImode, addr), |
179 | GEN_INT (3))); | | 179 | GEN_INT (3))); |
180 | | | 180 | |
181 | rtx tmp = gen_reg_rtx (SImode); | | 181 | rtx tmp = gen_reg_rtx (SImode); |
182 | emit_move_insn (tmp, GEN_INT (1)); | | 182 | emit_move_insn (tmp, GEN_INT (1)); |