From 5bf92e20913144dd2f78754dd76310e75786e478 Mon Sep 17 00:00:00 2001 From: Richard Henderson Date: Sun, 30 Mar 2003 11:00:12 -0800 Subject: [PATCH] re PR c/10083 (alpha: ICE while building swi-prolog-packages) PR c/10083 * config/alpha/alpha.md (umuldi3_highpart): Change to expander; don't zero_extend const inputs. * gcc.c-torture/compile/20030330-1.c: New. From-SVN: r65047 --- gcc/ChangeLog | 6 +++++ gcc/config/alpha/alpha.md | 22 +++++++++++++++---- .../gcc.c-torture/compile/20030330-1.c | 7 ++++++ 3 files changed, 31 insertions(+), 4 deletions(-) create mode 100644 gcc/testsuite/gcc.c-torture/compile/20030330-1.c diff --git a/gcc/ChangeLog b/gcc/ChangeLog index c38187b764b..7c5433c39dc 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2003-03-30 Richard Henderson + + PR c/10083 + * config/alpha/alpha.md (umuldi3_highpart): Change to expander; + don't zero_extend const inputs. + 2003-03-30 Kazu Hirata * reload1.c (reload_cse_move2add): Fix a comment typo. diff --git a/gcc/config/alpha/alpha.md b/gcc/config/alpha/alpha.md index b4518df1662..8ae7aca2747 100644 --- a/gcc/config/alpha/alpha.md +++ b/gcc/config/alpha/alpha.md @@ -750,17 +750,31 @@ fadd,fmul,fcpys,fdiv,fsqrt,misc,mvi,ftoi,itof,multi,none" "mulqv %r1,%2,%0" [(set_attr "type" "imul")]) -(define_insn "umuldi3_highpart" +(define_expand "umuldi3_highpart" + [(set (match_operand:DI 0 "register_operand" "") + (truncate:DI + (lshiftrt:TI + (mult:TI (zero_extend:TI + (match_operand:DI 1 "register_operand" "")) + (match_operand:DI 2 "reg_or_8bit_operand" "")) + (const_int 64))))] + "" +{ + if (REG_P (operands[2])) + operands[2] = gen_rtx_ZERO_EXTEND (TImode, operands[2]); +}) + +(define_insn "*umuldi3_highpart_reg" [(set (match_operand:DI 0 "register_operand" "=r") (truncate:DI (lshiftrt:TI (mult:TI (zero_extend:TI - (match_operand:DI 1 "reg_or_0_operand" "%rJ")) + (match_operand:DI 1 "register_operand" "r")) (zero_extend:TI - (match_operand:DI 2 "reg_or_8bit_operand" "rI"))) + (match_operand:DI 2 "register_operand" "r"))) (const_int 64))))] "" - "umulh %r1,%2,%0" + "umulh %1,%2,%0" [(set_attr "type" "imul") (set_attr "opsize" "udi")]) diff --git a/gcc/testsuite/gcc.c-torture/compile/20030330-1.c b/gcc/testsuite/gcc.c-torture/compile/20030330-1.c new file mode 100644 index 00000000000..a5d5de23b7a --- /dev/null +++ b/gcc/testsuite/gcc.c-torture/compile/20030330-1.c @@ -0,0 +1,7 @@ +/* PR c/10083 */ +/* This will result in a very small constant for umul_highpart, which + uncovered a bug in the Alpha machine description. */ + +unsigned long f(unsigned long x) { + return x % 0x3fffffffffffffff; +} -- 2.30.2