aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKazu Hirata <kazu@cs.umass.edu>2003-02-19 13:00:27 +0000
committerKazu Hirata <kazu@gcc.gnu.org>2003-02-19 13:00:27 +0000
commitf4c07fbf588555c9f4b7c1cdb32215af51feb78e (patch)
tree23c5b79743aad719a4478ecc73ac830ba2449882
parent590734b6544d296f3d4cf74713f7a1e723d03fbe (diff)
downloadgcc-f4c07fbf588555c9f4b7c1cdb32215af51feb78e.zip
gcc-f4c07fbf588555c9f4b7c1cdb32215af51feb78e.tar.gz
gcc-f4c07fbf588555c9f4b7c1cdb32215af51feb78e.tar.bz2
h8300.md (extendqisi2): Change to an expander.
* config/h8300/h8300.md (extendqisi2): Change to an expander. (*extendqisi2_h8300): New. (*extendqisi2_h8300hs): Likewise. From-SVN: r63104
-rw-r--r--gcc/ChangeLog6
-rw-r--r--gcc/config/h8300/h8300.md26
2 files changed, 29 insertions, 3 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 405b081..7bd6a72 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,5 +1,11 @@
2003-02-19 Kazu Hirata <kazu@cs.umass.edu>
+ * config/h8300/h8300.md (extendqisi2): Change to an expander.
+ (*extendqisi2_h8300): New.
+ (*extendqisi2_h8300hs): Likewise.
+
+2003-02-19 Kazu Hirata <kazu@cs.umass.edu>
+
* config/h8300/h8300-protos.h: Update the prototype for
split_adds_subs. Remove the prototypes for
const_int_le_2_operand and const_int_le_6_operand.
diff --git a/gcc/config/h8300/h8300.md b/gcc/config/h8300/h8300.md
index 817b52d..2332c4b 100644
--- a/gcc/config/h8300/h8300.md
+++ b/gcc/config/h8300/h8300.md
@@ -2101,10 +2101,14 @@
[(set_attr "length" "2")
(set_attr "cc" "set_znv")])
-;; The compiler can synthesize a H8/300H variant of this which is
-;; just as efficient as one that we'd create
-(define_insn "extendqisi2"
+(define_expand "extendqisi2"
[(set (match_operand:SI 0 "register_operand" "=r,r")
+ (sign_extend:SI (match_operand:QI 1 "register_operand" "")))]
+ ""
+ "")
+
+(define_insn "*extendqisi2_h8300"
+ [(set (match_operand:SI 0 "register_operand" "")
(sign_extend:SI (match_operand:QI 1 "general_operand_src" "0,g>")))]
"TARGET_H8300"
"@
@@ -2113,6 +2117,22 @@
[(set_attr "length" "8,12")
(set_attr "cc" "clobber,clobber")])
+;; The following pattern is needed because without the pattern, the
+;; combiner would split (sign_extend:SI (reg:QI)) into into two 24-bit
+;; shifts, one ashift and one ashiftrt.
+
+(define_insn_and_split "*extendqisi2_h8300hs"
+ [(set (match_operand:SI 0 "register_operand" "=r")
+ (sign_extend:SI (match_operand:QI 1 "register_operand" "0")))]
+ "(TARGET_H8300H || TARGET_H8300S)"
+ "#"
+ "&& reload_completed"
+ [(set (match_dup 2)
+ (sign_extend:HI (match_dup 1)))
+ (set (match_dup 0)
+ (sign_extend:SI (match_dup 2)))]
+ "operands[2] = gen_rtx_REG (HImode, REGNO (operands[0]));")
+
(define_expand "extendhisi2"
[(set (match_operand:SI 0 "register_operand" "")
(sign_extend:SI (match_operand:HI 1 "register_operand" "")))]