diff options
author | Richard Kenner <kenner@gcc.gnu.org> | 1993-03-05 18:41:22 -0500 |
---|---|---|
committer | Richard Kenner <kenner@gcc.gnu.org> | 1993-03-05 18:41:22 -0500 |
commit | 9cea6503647587279c871fd4dfa1878efaebf596 (patch) | |
tree | 0549abefbe08cc0f18b5c4c025e40952f2f8466c /gcc/config/alpha/alpha.md | |
parent | 6076248a1ea124e4368566e0d1590df6834fe4ea (diff) | |
download | gcc-9cea6503647587279c871fd4dfa1878efaebf596.zip gcc-9cea6503647587279c871fd4dfa1878efaebf596.tar.gz gcc-9cea6503647587279c871fd4dfa1878efaebf596.tar.bz2 |
Add new define_split for doing sign-extended adds of some large
constants using sNaddl.
From-SVN: r3662
Diffstat (limited to 'gcc/config/alpha/alpha.md')
-rw-r--r-- | gcc/config/alpha/alpha.md | 24 |
1 files changed, 24 insertions, 0 deletions
diff --git a/gcc/config/alpha/alpha.md b/gcc/config/alpha/alpha.md index a9c2586..698fa66 100644 --- a/gcc/config/alpha/alpha.md +++ b/gcc/config/alpha/alpha.md @@ -123,6 +123,30 @@ subl %r1,%n2,%0" [(set_attr "type" "iaddlog")]) +(define_split + [(set (match_operand:DI 0 "register_operand" "") + (sign_extend:DI + (plus:SI (match_operand:SI 1 "register_operand" "") + (match_operand:SI 2 "const_int_operand" "")))) + (clobber (match_operand:SI 3 "register_operand" ""))] + "! add_operand (operands[2], SImode) && INTVAL (operands[2]) > 0 + && INTVAL (operands[2]) % 4 == 0" + [(set (match_dup 3) (match_dup 4)) + (set (match_dup 0) (sign_extend:DI (plus:SI (mult:SI (match_dup 3) + (match_dup 5)) + (match_dup 1))))] + " +{ + HOST_WIDE_INT val = INTVAL (operands[2]) / 4; + int mult = 4; + + if (val % 2 == 0) + val /= 2, mult = 8; + + operands[4] = GEN_INT (val); + operands[5] = GEN_INT (mult); +}") + (define_insn "adddi3" [(set (match_operand:DI 0 "register_operand" "=r,r,r") (plus:DI (match_operand:DI 1 "reg_or_0_operand" "%rJ,%rJ,%rJ") |