diff options
author | Andrew Stubbs <ams@codesourcery.com> | 2023-04-26 15:23:48 +0100 |
---|---|---|
committer | Andrew Stubbs <ams@codesourcery.com> | 2023-04-27 10:31:40 +0100 |
commit | a410f603fcaf2b963af5607eb359907fe273426e (patch) | |
tree | cc4bf9f06e2e99af95d53e4ca56c5937a0102e26 /gcc | |
parent | fe884508f6b92ae84ba888b1fc431327ed0b2388 (diff) | |
download | gcc-a410f603fcaf2b963af5607eb359907fe273426e.zip gcc-a410f603fcaf2b963af5607eb359907fe273426e.tar.gz gcc-a410f603fcaf2b963af5607eb359907fe273426e.tar.bz2 |
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 (cmul<conj_op><mode>3): Use gcn_gen_undef.
(cml<addsub_as><mode>4): Likewise.
(vec_addsub<mode>3): Likewise.
(cadd<rot><mode>3): Likewise.
(vec_fmaddsub<mode>4): Likewise.
(vec_fmsubadd<mode>4): Likewise, and use sub for the odd lanes.
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog.omp | 9 | ||||
-rw-r--r-- | gcc/config/gcn/gcn-valu.md | 23 |
2 files changed, 24 insertions, 8 deletions
diff --git a/gcc/ChangeLog.omp b/gcc/ChangeLog.omp index 72948e4..c8a12d1 100644 --- a/gcc/ChangeLog.omp +++ b/gcc/ChangeLog.omp @@ -1,3 +1,12 @@ +2023-04-27 Andrew Stubbs <ams@codesourcery.com> + + * config/gcn/gcn-valu.md (cmul<conj_op><mode>3): Use gcn_gen_undef. + (cml<addsub_as><mode>4): Likewise. + (vec_addsub<mode>3): Likewise. + (cadd<rot><mode>3): Likewise. + (vec_fmaddsub<mode>4): Likewise. + (vec_fmsubadd<mode>4): Likewise, and use sub for the odd lanes. + 2023-04-21 Andrew Stubbs <ams@codesourcery.com> Backport from mainline: diff --git a/gcc/config/gcn/gcn-valu.md b/gcc/config/gcn/gcn-valu.md index ae532d9..a6380f9 100644 --- a/gcc/config/gcn/gcn-valu.md +++ b/gcc/config/gcn/gcn-valu.md @@ -2382,8 +2382,9 @@ rtx even = gen_rtx_REG (DImode, EXEC_REG); emit_move_insn (even, get_exec (0x5555555555555555UL)); rtx dest = operands[0]; - emit_insn (gen_<cmul_subadd><mode>3_exec (dest, t1, t1_perm, dest, even)); - // a*c-b*d 0 + emit_insn (gen_<cmul_subadd><mode>3_exec (dest, t1, t1_perm, + gcn_gen_undef (<MODE>mode), + even)); // a*c-b*d 0 rtx t2_perm = gen_reg_rtx (<MODE>mode); emit_insn (gen_dpp_swap_pairs<mode> (t2_perm, t2)); // b*c a*d @@ -2427,7 +2428,8 @@ rtx even = gen_rtx_REG (DImode, EXEC_REG); emit_move_insn (even, get_exec (0x5555555555555555UL)); rtx dest = operands[0]; - emit_insn (gen_sub<mode>3_exec (dest, t1, t2_perm, dest, even)); + emit_insn (gen_sub<mode>3_exec (dest, t1, t2_perm, + gcn_gen_undef (<MODE>mode), even)); rtx odd = gen_rtx_REG (DImode, EXEC_REG); emit_move_insn (odd, get_exec (0xaaaaaaaaaaaaaaaaUL)); @@ -2451,7 +2453,8 @@ rtx dest = operands[0]; rtx x = operands[1]; rtx y = operands[2]; - emit_insn (gen_sub<mode>3_exec (dest, x, y, dest, even)); + emit_insn (gen_sub<mode>3_exec (dest, x, y, gcn_gen_undef (<MODE>mode), + even)); rtx odd = gen_rtx_REG (DImode, EXEC_REG); emit_move_insn (odd, get_exec (0xaaaaaaaaaaaaaaaaUL)); emit_insn (gen_add<mode>3_exec (dest, x, y, dest, odd)); @@ -2478,7 +2481,9 @@ rtx even = gen_rtx_REG (DImode, EXEC_REG); emit_move_insn (even, get_exec (0x5555555555555555UL)); - emit_insn (gen_<cadd_subadd><mode>3_exec (dest, x, y, dest, even)); + emit_insn (gen_<cadd_subadd><mode>3_exec (dest, x, y, + gcn_gen_undef (<MODE>mode), + even)); rtx odd = gen_rtx_REG (DImode, EXEC_REG); emit_move_insn (odd, get_exec (0xaaaaaaaaaaaaaaaaUL)); emit_insn (gen_<cadd_addsub><mode>3_exec (dest, x, y, dest, odd)); @@ -2498,7 +2503,8 @@ rtx even = gen_rtx_REG (DImode, EXEC_REG); emit_move_insn (even, get_exec (0x5555555555555555UL)); rtx dest = operands[0]; - emit_insn (gen_sub<mode>3_exec (dest, t1, operands[3], dest, even)); + emit_insn (gen_sub<mode>3_exec (dest, t1, operands[3], + gcn_gen_undef (<MODE>mode), even)); rtx odd = gen_rtx_REG (DImode, EXEC_REG); emit_move_insn (odd, get_exec (0xaaaaaaaaaaaaaaaaUL)); emit_insn (gen_add<mode>3_exec (dest, t1, operands[3], dest, odd)); @@ -2518,10 +2524,11 @@ rtx even = gen_rtx_REG (DImode, EXEC_REG); emit_move_insn (even, get_exec (0x5555555555555555UL)); rtx dest = operands[0]; - emit_insn (gen_add<mode>3_exec (dest, t1, operands[3], dest, even)); + emit_insn (gen_add<mode>3_exec (dest, t1, operands[3], + gcn_gen_undef (<MODE>mode), even)); rtx odd = gen_rtx_REG (DImode, EXEC_REG); emit_move_insn (odd, get_exec (0xaaaaaaaaaaaaaaaaUL)); - emit_insn (gen_add<mode>3_exec (dest, t1, operands[3], dest, odd)); + emit_insn (gen_sub<mode>3_exec (dest, t1, operands[3], dest, odd)); DONE; }) |