Replacing variable swaps that use a temporary variable with a call to std::swap. Tested against arm-none-eabi target including a variant with neon enabled.
2015-XX-XX Bilyan Borisov <bilyan.bori...@arm.com> * config/arm/arm.c (thumb_output_move_mem_multiple): Replaced operands[4] operands[5] swap with std::swap, removed tmp variable. (arm_evpc_neon_vzip): Replaced in0/in1 and out0/out1 swaps with std::swap, removed x variable. (arm_evpc_neon_vtrn): Replaced in0/int1 and out0/out1 swaos with std::swap, removed x variable. (arm_expand_vec_perm_const_1): Replaced d->op0/d->op1 swap with std::swap, removed x variable. (arm_evpc_neon_vuzp): Replaced in0/in1 and out0/out1 swaps with std::swap, removed x variable.
diff --git a/gcc/config/arm/arm.c b/gcc/config/arm/arm.c index fa4e083adfe215b5820237f3cc6b449dbdefc778..dc549fe470e5a82d740cf8014057ee2cc1d54085 100644 --- a/gcc/config/arm/arm.c +++ b/gcc/config/arm/arm.c @@ -25362,17 +25362,12 @@ thumb_load_double_from_address (rtx *operands) const char * thumb_output_move_mem_multiple (int n, rtx *operands) { - rtx tmp; - switch (n) { case 2: if (REGNO (operands[4]) > REGNO (operands[5])) - { - tmp = operands[4]; - operands[4] = operands[5]; - operands[5] = tmp; - } + std::swap (operands[4], operands[5]); + output_asm_insn ("ldmia\t%1!, {%4, %5}", operands); output_asm_insn ("stmia\t%0!, {%4, %5}", operands); break; @@ -27885,7 +27880,7 @@ static bool arm_evpc_neon_vuzp (struct expand_vec_perm_d *d) { unsigned int i, odd, mask, nelt = d->nelt; - rtx out0, out1, in0, in1, x; + rtx out0, out1, in0, in1; rtx (*gen)(rtx, rtx, rtx, rtx); if (GET_MODE_UNIT_SIZE (d->vmode) >= 8) @@ -27929,14 +27924,14 @@ arm_evpc_neon_vuzp (struct expand_vec_perm_d *d) in1 = d->op1; if (BYTES_BIG_ENDIAN) { - x = in0, in0 = in1, in1 = x; + std::swap (in0, in1); odd = !odd; } out0 = d->target; out1 = gen_reg_rtx (d->vmode); if (odd) - x = out0, out0 = out1, out1 = x; + std::swap (out0, out1); emit_insn (gen (out0, in0, in1, out1)); return true; @@ -27948,7 +27943,7 @@ static bool arm_evpc_neon_vzip (struct expand_vec_perm_d *d) { unsigned int i, high, mask, nelt = d->nelt; - rtx out0, out1, in0, in1, x; + rtx out0, out1, in0, in1; rtx (*gen)(rtx, rtx, rtx, rtx); if (GET_MODE_UNIT_SIZE (d->vmode) >= 8) @@ -27996,14 +27991,14 @@ arm_evpc_neon_vzip (struct expand_vec_perm_d *d) in1 = d->op1; if (BYTES_BIG_ENDIAN) { - x = in0, in0 = in1, in1 = x; + std::swap (in0, in1); high = !high; } out0 = d->target; out1 = gen_reg_rtx (d->vmode); if (high) - x = out0, out0 = out1, out1 = x; + std::swap (out0, out1); emit_insn (gen (out0, in0, in1, out1)); return true; @@ -28089,7 +28084,7 @@ static bool arm_evpc_neon_vtrn (struct expand_vec_perm_d *d) { unsigned int i, odd, mask, nelt = d->nelt; - rtx out0, out1, in0, in1, x; + rtx out0, out1, in0, in1; rtx (*gen)(rtx, rtx, rtx, rtx); if (GET_MODE_UNIT_SIZE (d->vmode) >= 8) @@ -28134,14 +28129,14 @@ arm_evpc_neon_vtrn (struct expand_vec_perm_d *d) in1 = d->op1; if (BYTES_BIG_ENDIAN) { - x = in0, in0 = in1, in1 = x; + std::swap (in0, in1); odd = !odd; } out0 = d->target; out1 = gen_reg_rtx (d->vmode); if (odd) - x = out0, out0 = out1, out1 = x; + std::swap (out0, out1); emit_insn (gen (out0, in0, in1, out1)); return true; @@ -28264,14 +28259,11 @@ arm_expand_vec_perm_const_1 (struct expand_vec_perm_d *d) if (d->perm[0] >= d->nelt) { unsigned i, nelt = d->nelt; - rtx x; for (i = 0; i < nelt; ++i) d->perm[i] = (d->perm[i] + nelt) & (2 * nelt - 1); - x = d->op0; - d->op0 = d->op1; - d->op1 = x; + std::swap (d->op0, d->op1); } if (TARGET_NEON)