aboutsummaryrefslogtreecommitdiff
path: root/gcc/config/alpha/alpha.md
diff options
context:
space:
mode:
authorRichard Kenner <kenner@gcc.gnu.org>1993-03-05 18:41:22 -0500
committerRichard Kenner <kenner@gcc.gnu.org>1993-03-05 18:41:22 -0500
commit9cea6503647587279c871fd4dfa1878efaebf596 (patch)
tree0549abefbe08cc0f18b5c4c025e40952f2f8466c /gcc/config/alpha/alpha.md
parent6076248a1ea124e4368566e0d1590df6834fe4ea (diff)
downloadgcc-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.md24
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")