amdgcn: Fix addsub bug The vec_fmsubadd instuction actually had add twice, by mistake. Also improve code-gen for all the complex patterns by using properly undefined values. Mostly this just prevents the compiler reserving space in the stack frame. gcc/ChangeLog: * config/gcn/gcn-valu.md (cmul3): Use gcn_gen_undef. (cml4): Likewise. (vec_addsub3): Likewise. (cadd3): Likewise. (vec_fmaddsub4): Likewise. (vec_fmsubadd4): Likewise, and use sub for the odd lanes. diff --git a/gcc/config/gcn/gcn-valu.md b/gcc/config/gcn/gcn-valu.md index 44c48468dd6..7290cdc2fd0 100644 --- a/gcc/config/gcn/gcn-valu.md +++ b/gcc/config/gcn/gcn-valu.md @@ -2323,8 +2323,9 @@ (define_expand "cmul3" rtx even = gen_rtx_REG (DImode, EXEC_REG); emit_move_insn (even, get_exec (0x5555555555555555UL)); rtx dest = operands[0]; - emit_insn (gen_3_exec (dest, t1, t1_perm, dest, even)); - // a*c-b*d 0 + emit_insn (gen_3_exec (dest, t1, t1_perm, + gcn_gen_undef (mode), + even)); // a*c-b*d 0 rtx t2_perm = gen_reg_rtx (mode); emit_insn (gen_dpp_swap_pairs (t2_perm, t2)); // b*c a*d @@ -2368,7 +2369,8 @@ (define_expand "cml4" rtx even = gen_rtx_REG (DImode, EXEC_REG); emit_move_insn (even, get_exec (0x5555555555555555UL)); rtx dest = operands[0]; - emit_insn (gen_sub3_exec (dest, t1, t2_perm, dest, even)); + emit_insn (gen_sub3_exec (dest, t1, t2_perm, + gcn_gen_undef (mode), even)); rtx odd = gen_rtx_REG (DImode, EXEC_REG); emit_move_insn (odd, get_exec (0xaaaaaaaaaaaaaaaaUL)); @@ -2392,7 +2394,8 @@ (define_expand "vec_addsub3" rtx dest = operands[0]; rtx x = operands[1]; rtx y = operands[2]; - emit_insn (gen_sub3_exec (dest, x, y, dest, even)); + emit_insn (gen_sub3_exec (dest, x, y, gcn_gen_undef (mode), + even)); rtx odd = gen_rtx_REG (DImode, EXEC_REG); emit_move_insn (odd, get_exec (0xaaaaaaaaaaaaaaaaUL)); emit_insn (gen_add3_exec (dest, x, y, dest, odd)); @@ -2419,7 +2422,9 @@ (define_expand "cadd3" rtx even = gen_rtx_REG (DImode, EXEC_REG); emit_move_insn (even, get_exec (0x5555555555555555UL)); - emit_insn (gen_3_exec (dest, x, y, dest, even)); + emit_insn (gen_3_exec (dest, x, y, + gcn_gen_undef (mode), + even)); rtx odd = gen_rtx_REG (DImode, EXEC_REG); emit_move_insn (odd, get_exec (0xaaaaaaaaaaaaaaaaUL)); emit_insn (gen_3_exec (dest, x, y, dest, odd)); @@ -2439,7 +2444,8 @@ (define_expand "vec_fmaddsub4" rtx even = gen_rtx_REG (DImode, EXEC_REG); emit_move_insn (even, get_exec (0x5555555555555555UL)); rtx dest = operands[0]; - emit_insn (gen_sub3_exec (dest, t1, operands[3], dest, even)); + emit_insn (gen_sub3_exec (dest, t1, operands[3], + gcn_gen_undef (mode), even)); rtx odd = gen_rtx_REG (DImode, EXEC_REG); emit_move_insn (odd, get_exec (0xaaaaaaaaaaaaaaaaUL)); emit_insn (gen_add3_exec (dest, t1, operands[3], dest, odd)); @@ -2459,10 +2465,11 @@ (define_expand "vec_fmsubadd4" rtx even = gen_rtx_REG (DImode, EXEC_REG); emit_move_insn (even, get_exec (0x5555555555555555UL)); rtx dest = operands[0]; - emit_insn (gen_add3_exec (dest, t1, operands[3], dest, even)); + emit_insn (gen_add3_exec (dest, t1, operands[3], + gcn_gen_undef (mode), even)); rtx odd = gen_rtx_REG (DImode, EXEC_REG); emit_move_insn (odd, get_exec (0xaaaaaaaaaaaaaaaaUL)); - emit_insn (gen_add3_exec (dest, t1, operands[3], dest, odd)); + emit_insn (gen_sub3_exec (dest, t1, operands[3], dest, odd)); DONE; })