===================================================================
@@ -4700,13 +4700,8 @@
(const_string "ignore")))])
(define_expand "zero_extendhisi2"
- [(set (match_operand:SI 0 "arith_reg_operand" "")
- (zero_extend:SI (match_operand:HI 1 "general_extend_operand" "")))]
- ""
-{
- if (! TARGET_SHMEDIA && ! arith_reg_operand (operands[1], HImode))
- operands[1] = copy_to_mode_reg (HImode, operands[1]);
-})
+ [(set (match_operand:SI 0 "arith_reg_dest" "")
+ (zero_extend:SI (match_operand:HI 1 "zero_extend_operand" "")))])
(define_insn "*zero_extendhisi2_compact"
[(set (match_operand:SI 0 "arith_reg_dest" "=r")
@@ -4745,13 +4740,8 @@
})
(define_expand "zero_extendqisi2"
- [(set (match_operand:SI 0 "arith_reg_operand" "")
- (zero_extend:SI (match_operand:QI 1 "general_extend_operand" "")))]
- ""
-{
- if (! TARGET_SHMEDIA && ! arith_reg_operand (operands[1], QImode))
- operands[1] = copy_to_mode_reg (QImode, operands[1]);
-})
+ [(set (match_operand:SI 0 "arith_reg_dest" "")
+ (zero_extend:SI (match_operand:QI 1 "zero_extend_operand" "")))])
(define_insn "*zero_extendqisi2_compact"
[(set (match_operand:SI 0 "arith_reg_dest" "=r")
===================================================================
@@ -368,6 +368,13 @@
: nonimmediate_operand) (op, mode);
})
+;; Returns 1 if the operand can be used in a zero_extend.
+(define_predicate "zero_extend_operand"
+ (ior (and (match_test "TARGET_SHMEDIA")
+ (match_operand 0 "general_extend_operand"))
+ (and (match_test "! TARGET_SHMEDIA")
+ (match_operand 0 "arith_reg_operand"))))
+
;; Returns 1 if OP can be source of a simple move operation. Same as
;; general_operand, but a LABEL_REF is valid, PRE_DEC is invalid as
;; are subregs of system registers.