I very grateful for your help and wisdom
Testcase and MD Patch attached
unsigned long f (unsigned char *P)
{
unsigned long C;
C = ((unsigned long)P[1] << 24)
| ((unsigned long)P[2] << 16)
| ((unsigned long)P[3] << 8)
| ((unsigned long)P[4] << 0);
return C;
}
Index: avr.md
===================================================================
--- avr.md (revision 132380)
+++ avr.md (working copy)
@@ -251,8 +251,8 @@
(set_attr "cc" "none")])
(define_insn "*movhi"
- [(set (match_operand:HI 0 "nonimmediate_operand" "=r,r,m,d,*r,q,r")
- (match_operand:HI 1 "general_operand" "r,m,rL,i,i,r,q"))]
+ [(set (match_operand:HI 0 "nonimmediate_operand" "=r,r,Qm,d,*r,q,r")
+ (match_operand:HI 1 "general_operand" "r,Qm,rL,i,i,r,q"))]
"(register_operand (operands[0],HImode)
|| register_operand (operands[1],HImode) || const0_rtx == operands[1])"
"* return output_movhi (insn, operands, NULL);"
@@ -1126,73 +1126,310 @@
[(set_attr "length" "1,1")
(set_attr "cc" "set_zn,set_zn")])
-(define_insn "andhi3"
- [(set (match_operand:HI 0 "register_operand" "=r,d,r")
- (and:HI (match_operand:HI 1 "register_operand" "%0,0,0")
- (match_operand:HI 2 "nonmemory_operand" "r,i,M")))
- (clobber (match_scratch:QI 3 "=X,X,&d"))]
+(define_mode_iterator HIDI [(HI "") (SI "") (DI "")])
+(define_mode_iterator SIDI [(SI "") (DI "")])
+(define_mode_iterator DIDI [(DI "")])
+
+(define_insn_and_split "and<mode>3"
+[(set (match_operand:HIDI 0 "register_operand" "=r,d")
+ (and:HIDI (match_operand:HIDI 1 "register_operand" "%0,0")
+ (match_operand:HIDI 2 "nonmemory_operand" "r,i")))
+ ]
""
- "*{
- if (which_alternative==0)
- return (AS2 (and,%A0,%A2) CR_TAB
- AS2 (and,%B0,%B2));
- else if (which_alternative==1)
+ "#"
+ ""
+ [(const_int 0)]
{
+ int i;
+ enum machine_mode mode;
+ mode = GET_MODE(operands[0]);
+ int size = GET_MODE_SIZE(mode);
+
if (GET_CODE (operands[2]) == CONST_INT)
{
- int mask = INTVAL (operands[2]);
- if ((mask & 0xff) != 0xff)
- output_asm_insn (AS2 (andi,%A0,lo8(%2)), operands);
- if ((mask & 0xff00) != 0xff00)
- output_asm_insn (AS2 (andi,%B0,hi8(%2)), operands);
- return \"\";
+ HOST_WIDE_INT x = INTVAL (operands[2]);
+
+ for (i = 0; i < size; i++)
+ {
+ rtx dest = simplify_gen_subreg (QImode, operands[0], mode, i);
+ rtx src1 = simplify_gen_subreg (QImode, operands[1], mode, i);
+ int byte = (x & 0xff);
+ rtx src2 = gen_int_mode (byte, QImode);
+ if (byte == 0x00)
+ {
+ emit_move_insn (dest, const0_rtx);
}
- return (AS2 (andi,%A0,lo8(%2)) CR_TAB
- AS2 (andi,%B0,hi8(%2)));
+ else if (byte == 0xff)
+ {
+ emit_move_insn (dest, src1);
}
- return (AS2 (ldi,%3,lo8(%2)) CR_TAB
- AS2 (and,%A0,%3) CR_TAB
- AS1 (clr,%B0));
-}"
- [(set_attr "length" "2,2,3")
- (set_attr "cc" "set_n,clobber,set_n")])
+ else
+ {
+ emit_move_insn (dest, gen_rtx_AND (QImode, src1, src2));
+ }
+ x= x >> 8;
+ }
+ }
+ else
+ {
+ for (i = 0; i < size; i++)
+ {
+ rtx dest = simplify_gen_subreg (QImode, operands[0], mode, i);
+ rtx src1 = simplify_gen_subreg (QImode, operands[1], mode, i);
+ rtx src2 = simplify_gen_subreg (QImode, operands[2], mode, i);
+ emit_move_insn (dest, gen_rtx_AND (QImode, src1, src2));
+ }
+ }
+ DONE;
+ }
+ )
+
+;(define_insn_and_split "ziorQI3"
+;[(set (match_operand:QI 0 "nonimmediate_operand" "=rm")
+; (ior:QI (match_operand:QI 1 "general_operand" "0")
+; (const_int 0)))
+; ]
+; "0"
+; "#"
+; ""
+; [(const_int 0)]
+; ""
+; )
-(define_insn "andsi3"
- [(set (match_operand:SI 0 "register_operand" "=r,d")
- (and:SI (match_operand:SI 1 "register_operand" "%0,0")
- (match_operand:SI 2 "nonmemory_operand" "r,i")))]
+
+(define_insn_and_split "ior<mode>3"
+[(set (match_operand:HIDI 0 "register_operand" "=r,d")
+ (ior:HIDI (match_operand:HIDI 1 "register_operand" "%0,0")
+ (match_operand:HIDI 2 "nonmemory_operand" "r,i")))
+ ]
""
- "*{
- if (which_alternative==0)
- return (AS2 (and, %0,%2) CR_TAB
- AS2 (and, %B0,%B2) CR_TAB
- AS2 (and, %C0,%C2) CR_TAB
- AS2 (and, %D0,%D2));
- else if (which_alternative==1)
+ "#"
+ ""
+ [(const_int 0)]
{
+ int i;
+ enum machine_mode mode;
+ mode = GET_MODE(operands[0]);
+ int size = GET_MODE_SIZE(mode);
+
if (GET_CODE (operands[2]) == CONST_INT)
{
- HOST_WIDE_INT mask = INTVAL (operands[2]);
- if ((mask & 0xff) != 0xff)
- output_asm_insn (AS2 (andi,%A0,lo8(%2)), operands);
- if ((mask & 0xff00) != 0xff00)
- output_asm_insn (AS2 (andi,%B0,hi8(%2)), operands);
- if ((mask & 0xff0000L) != 0xff0000L)
- output_asm_insn (AS2 (andi,%C0,hlo8(%2)), operands);
- if ((mask & 0xff000000L) != 0xff000000L)
- output_asm_insn (AS2 (andi,%D0,hhi8(%2)), operands);
- return \"\";
+ HOST_WIDE_INT x = INTVAL (operands[2]);
+
+ for (i = 0; i < size; i++)
+ {
+ rtx dest = simplify_gen_subreg (QImode, operands[0], mode, i);
+ rtx src1 = simplify_gen_subreg (QImode, operands[1], mode, i);
+ int byte = (x & 0xff);
+ rtx src2 = gen_int_mode (byte, QImode);
+ if (byte == 0x00)
+ {
+ emit_move_insn (dest, src1);
}
- return (AS2 (andi, %A0,lo8(%2)) CR_TAB
- AS2 (andi, %B0,hi8(%2)) CR_TAB
- AS2 (andi, %C0,hlo8(%2)) CR_TAB
- AS2 (andi, %D0,hhi8(%2)));
+ else if (byte == 0xff)
+ {
+ emit_move_insn (dest, constm1_rtx);
}
- return \"bug\";
-}"
- [(set_attr "length" "4,4")
- (set_attr "cc" "set_n,set_n")])
+ else
+ {
+ emit_move_insn (dest, gen_rtx_IOR (QImode, src1, src2));
+ }
+ x= x >> 8;
+ }
+ }
+ else
+ {
+ for (i = 0; i < size; i++)
+ {
+ rtx dest = simplify_gen_subreg (QImode, operands[0], mode, i);
+ rtx src1 = simplify_gen_subreg (QImode, operands[1], mode, i);
+ rtx src2 = simplify_gen_subreg (QImode, operands[2], mode, i);
+ emit_move_insn (dest, gen_rtx_IOR (QImode, src1, src2));
+ }
+ }
+ DONE;
+ }
+ )
+
+;;need rtl peephole to find NOT patterns????
+;; NEED split for pop/push and fix post_inc bobo
+;;
+(define_insn_and_split "xor<mode>3"
+[(set (match_operand:HIDI 0 "register_operand" "=r")
+ (xor:HIDI (match_operand:HIDI 1 "register_operand" "%0")
+ (match_operand:HIDI 2 "register_operand" "r")))
+ ]
+ ""
+ "#"
+ ""
+ [(const_int 0)]
+ {
+ int i;
+ enum machine_mode mode;
+ mode = GET_MODE(operands[0]);
+ int size = GET_MODE_SIZE(mode);
+
+ {
+ for (i = 0; i < size; i++)
+ {
+ rtx dest = simplify_gen_subreg (QImode, operands[0], mode, i);
+ rtx src1 = simplify_gen_subreg (QImode, operands[1], mode, i);
+ rtx src2 = simplify_gen_subreg (QImode, operands[2], mode, i);
+ emit_move_insn (dest, gen_rtx_XOR (QImode, src1, src2));
+ }
+ }
+ DONE;
+ }
+ )
+
+
+(define_insn_and_split "one_cmpl<mode>2"
+[(set (match_operand:HIDI 0 "register_operand" "=r")
+ (not:HIDI (match_operand:HIDI 1 "register_operand" "0")))]
+ ""
+ "#"
+ ""
+ [(const_int 0)]
+ {
+ int i;
+ enum machine_mode mode;
+ mode = GET_MODE(operands[0]);
+ int size = GET_MODE_SIZE(mode);
+
+ {
+ for (i = 0; i < size; i++)
+ {
+ rtx dest = simplify_gen_subreg (QImode, operands[0], mode, i);
+ rtx src1 = simplify_gen_subreg (QImode, operands[1], mode, i);
+ emit_move_insn (dest, gen_rtx_NOT (QImode, src1));
+ }
+ }
+ DONE;
+ }
+ )
+
+;; xx<---x xx<---x xx<---x xx<---x xx<---x xx<---x xx<---x xx<---x xx<---x
+;; zero extend
+
+
+(define_insn_and_split "zero_extendqi<mode>2"
+ [(set (match_operand:HIDI 0 "nonimmediate_operand" "")
+ (zero_extend:HIDI (match_operand:QI 1 "nonimmediate_operand" "")))]
+ ""
+ "#"
+ ""
+ [(const_int 0)]
+ "
+ int i;
+ enum machine_mode dmode = GET_MODE (operands[0]);
+ int dsize = GET_MODE_SIZE (dmode);
+ enum machine_mode smode = GET_MODE (operands[1]);
+ int ssize = GET_MODE_SIZE (smode);
+
+ rtx dword = simplify_gen_subreg (smode, operands[0], dmode, 0);
+ emit_move_insn (dword, operands[1]);
+
+ for (i = ssize; i < dsize; i++)
+ {
+ rtx dbyte = simplify_gen_subreg (QImode, operands[0], dmode, i);
+ emit_move_insn (dbyte, const0_rtx);
+ }
+ DONE;
+ ")
+
+(define_insn_and_split "zero_extendhi<mode>2"
+ [(set (match_operand:SIDI 0 "nonimmediate_operand" "")
+ (zero_extend:SIDI (match_operand:HI 1 "nonimmediate_operand" "")))]
+ ""
+ "#"
+ ""
+ [(const_int 0)]
+ "
+ int i;
+ enum machine_mode dmode = GET_MODE (operands[0]);
+ int dsize = GET_MODE_SIZE (dmode);
+ enum machine_mode smode = GET_MODE (operands[1]);
+ int ssize = GET_MODE_SIZE (smode);
+
+ rtx dword = simplify_gen_subreg (smode, operands[0], dmode, 0);
+ emit_move_insn (dword, operands[1]);
+
+ for (i = ssize; i < dsize; i++)
+ {
+ rtx dbyte = simplify_gen_subreg (QImode, operands[0], dmode, i);
+ emit_move_insn (dbyte, const0_rtx);
+ }
+ DONE;
+ ")
+ (define_insn_and_split "zero_extendsi<mode>2"
+ [(set (match_operand:DIDI 0 "nonimmediate_operand" "")
+ (zero_extend:DIDI (match_operand:SI 1 "nonimmediate_operand" "")))]
+ ""
+ "#"
+ ""
+ [(const_int 0)]
+ "
+ int i;
+ enum machine_mode dmode = GET_MODE (operands[0]);
+ int dsize = GET_MODE_SIZE (dmode);
+ enum machine_mode smode = GET_MODE (operands[1]);
+ int ssize = GET_MODE_SIZE (smode);
+
+ rtx dword = simplify_gen_subreg (smode, operands[0], dmode, 0);
+ emit_move_insn (dword, operands[1]);
+
+ for (i = ssize; i < dsize; i++)
+ {
+ rtx dbyte = simplify_gen_subreg (QImode, operands[0], dmode, i);
+ emit_move_insn (dbyte, const0_rtx);
+ }
+ DONE;
+ ")
+;byte shift is just a series of moves
+;check src OR dest is in register, so the move will be ok
+
+(define_insn_and_split "ashl<mode>3_const2p"
+ [(set (match_operand:HIDI 0 "nonimmediate_operand" "")
+
+ (ashift:HIDI (match_operand:HIDI 1 "register_operand" "")
+ (match_operand:HIDI 2 "const_int_operand" "i"))
+)
+ ]
+ "((INTVAL (operands[2]) % 8) == 0)
+ "
+ "#"
+ ""
+ [(const_int 0)]
+ {
+ int i;
+ enum machine_mode mode;
+ mode = GET_MODE(operands[0]);
+ int size = GET_MODE_SIZE(mode);
+
+ HOST_WIDE_INT x = INTVAL (operands[2]);
+ rtx dbytes[8], sbytes[8];
+ for (i = 0; i < size; i++)
+ {
+ dbytes[i] = simplify_gen_subreg (QImode, operands[0], mode, i);
+ sbytes[i] = simplify_gen_subreg (QImode, operands[1], mode, i);
+
+ }
+ int shift = x / 8;
+ if (shift > size) shift = size;
+ for (i = shift; i < size; i++)
+ {
+ emit_move_insn (dbytes[i], sbytes[i - shift]);
+ }
+ for (i = 0; i < shift; i++)
+ {
+ emit_move_insn (dbytes[i], const0_rtx);
+ }
+
+ }
+)
+
+
;;|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
;; ior
@@ -1207,88 +1444,10 @@
[(set_attr "length" "1,1")
(set_attr "cc" "set_zn,set_zn")])
-(define_insn "iorhi3"
- [(set (match_operand:HI 0 "register_operand" "=r,d")
- (ior:HI (match_operand:HI 1 "register_operand" "%0,0")
- (match_operand:HI 2 "nonmemory_operand" "r,i")))]
- ""
- "*{
- if (which_alternative==0)
- return (AS2 (or,%A0,%A2) CR_TAB
- AS2 (or,%B0,%B2));
- if (GET_CODE (operands[2]) == CONST_INT)
- {
- int mask = INTVAL (operands[2]);
- if (mask & 0xff)
- output_asm_insn (AS2 (ori,%A0,lo8(%2)), operands);
- if (mask & 0xff00)
- output_asm_insn (AS2 (ori,%B0,hi8(%2)), operands);
- return \"\";
- }
- return (AS2 (ori,%0,lo8(%2)) CR_TAB
- AS2 (ori,%B0,hi8(%2)));
-}"
- [(set_attr "length" "2,2")
- (set_attr "cc" "set_n,clobber")])
-(define_insn "*iorhi3_clobber"
- [(set (match_operand:HI 0 "register_operand" "=r,r")
- (ior:HI (match_operand:HI 1 "register_operand" "%0,0")
- (match_operand:HI 2 "immediate_operand" "M,i")))
- (clobber (match_scratch:QI 3 "=&d,&d"))]
- ""
- "@
- ldi %3,lo8(%2)\;or %A0,%3
- ldi %3,lo8(%2)\;or %A0,%3\;ldi %3,hi8(%2)\;or %B0,%3"
- [(set_attr "length" "2,4")
- (set_attr "cc" "clobber,set_n")])
-
-(define_insn "iorsi3"
- [(set (match_operand:SI 0 "register_operand" "=r,d")
- (ior:SI (match_operand:SI 1 "register_operand" "%0,0")
- (match_operand:SI 2 "nonmemory_operand" "r,i")))]
- ""
- "*{
- if (which_alternative==0)
- return (AS2 (or, %0,%2) CR_TAB
- AS2 (or, %B0,%B2) CR_TAB
- AS2 (or, %C0,%C2) CR_TAB
- AS2 (or, %D0,%D2));
- if (GET_CODE (operands[2]) == CONST_INT)
- {
- HOST_WIDE_INT mask = INTVAL (operands[2]);
- if (mask & 0xff)
- output_asm_insn (AS2 (ori,%A0,lo8(%2)), operands);
- if (mask & 0xff00)
- output_asm_insn (AS2 (ori,%B0,hi8(%2)), operands);
- if (mask & 0xff0000L)
- output_asm_insn (AS2 (ori,%C0,hlo8(%2)), operands);
- if (mask & 0xff000000L)
- output_asm_insn (AS2 (ori,%D0,hhi8(%2)), operands);
- return \"\";
- }
- return (AS2 (ori, %A0,lo8(%2)) CR_TAB
- AS2 (ori, %B0,hi8(%2)) CR_TAB
- AS2 (ori, %C0,hlo8(%2)) CR_TAB
- AS2 (ori, %D0,hhi8(%2)));
-}"
- [(set_attr "length" "4,4")
- (set_attr "cc" "set_n,clobber")])
-
-(define_insn "*iorsi3_clobber"
- [(set (match_operand:SI 0 "register_operand" "=r,r")
- (ior:SI (match_operand:SI 1 "register_operand" "%0,0")
- (match_operand:SI 2 "immediate_operand" "M,i")))
- (clobber (match_scratch:QI 3 "=&d,&d"))]
- ""
- "@
- ldi %3,lo8(%2)\;or %A0,%3
- ldi %3,lo8(%2)\;or %A0,%3\;ldi %3,hi8(%2)\;or %B0,%3\;ldi %3,hlo8(%2)\;or
%C0,%3\;ldi %3,hhi8(%2)\;or %D0,%3"
- [(set_attr "length" "2,8")
- (set_attr "cc" "clobber,set_n")])
-
;;^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
;; xor
+;TODO cant we spec intger and force reload - thus dealing with 0xff and 0?
(define_insn "xorqi3"
[(set (match_operand:QI 0 "register_operand" "=r")
@@ -1299,27 +1458,7 @@
[(set_attr "length" "1")
(set_attr "cc" "set_zn")])
-(define_insn "xorhi3"
- [(set (match_operand:HI 0 "register_operand" "=r")
- (xor:HI (match_operand:HI 1 "register_operand" "%0")
- (match_operand:HI 2 "register_operand" "r")))]
- ""
- "eor %0,%2
- eor %B0,%B2"
- [(set_attr "length" "2")
- (set_attr "cc" "set_n")])
-(define_insn "xorsi3"
- [(set (match_operand:SI 0 "register_operand" "=r")
- (xor:SI (match_operand:SI 1 "register_operand" "%0")
- (match_operand:SI 2 "register_operand" "r")))]
- ""
- "eor %0,%2
- eor %B0,%B2
- eor %C0,%C2
- eor %D0,%D2"
- [(set_attr "length" "4")
- (set_attr "cc" "set_n")])
;;<< << << << << << << << << << << << << << << << << << << << << << << << << <<
;; arithmetic shift left
@@ -1615,7 +1754,7 @@
(set_attr "cc" "set_n,set_n")])
;; !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-;; not
+;; not TODO use expander
(define_insn "one_cmplqi2"
[(set (match_operand:QI 0 "register_operand" "=r")
@@ -1625,26 +1764,7 @@
[(set_attr "length" "1")
(set_attr "cc" "set_czn")])
-(define_insn "one_cmplhi2"
- [(set (match_operand:HI 0 "register_operand" "=r")
- (not:HI (match_operand:HI 1 "register_operand" "0")))]
- ""
- "com %0
- com %B0"
- [(set_attr "length" "2")
- (set_attr "cc" "set_n")])
-(define_insn "one_cmplsi2"
- [(set (match_operand:SI 0 "register_operand" "=r")
- (not:SI (match_operand:SI 1 "register_operand" "0")))]
- ""
- "com %0
- com %B0
- com %C0
- com %D0"
- [(set_attr "length" "4")
- (set_attr "cc" "set_n")])
-
;; xx<---x xx<---x xx<---x xx<---x xx<---x xx<---x xx<---x xx<---x xx<---x
;; sign extend
@@ -1682,99 +1802,8 @@
(const_int 6))])
(set_attr "cc" "set_n,set_n")])
-;; xx<---x xx<---x xx<---x xx<---x xx<---x xx<---x xx<---x xx<---x xx<---x
-;; zero extend
-(define_insn_and_split "zero_extendqihi2"
- [(set (match_operand:HI 0 "register_operand" "=r")
- (zero_extend:HI (match_operand:QI 1 "register_operand" "r")))]
- ""
- "#"
- "reload_completed"
- [(set (match_dup 2) (match_dup 1))
- (set (match_dup 3) (const_int 0))]
- "unsigned int low_off = subreg_lowpart_offset (QImode, HImode);
- unsigned int high_off = subreg_highpart_offset (QImode, HImode);
-
- operands[2] = simplify_gen_subreg (QImode, operands[0], HImode, low_off);
- operands[3] = simplify_gen_subreg (QImode, operands[0], HImode, high_off);
- ")
-(define_insn_and_split "zero_extendqisi2"
- [(set (match_operand:SI 0 "register_operand" "=r")
- (zero_extend:SI (match_operand:QI 1 "register_operand" "r")))]
- ""
- "#"
- "reload_completed"
- [(set (match_dup 2) (zero_extend:HI (match_dup 1)))
- (set (match_dup 3) (const_int 0))]
- "unsigned int low_off = subreg_lowpart_offset (HImode, SImode);
- unsigned int high_off = subreg_highpart_offset (HImode, SImode);
-
- operands[2] = simplify_gen_subreg (HImode, operands[0], SImode, low_off);
- operands[3] = simplify_gen_subreg (HImode, operands[0], SImode, high_off);
- ")
-
-(define_insn_and_split "zero_extendhisi2"
- [(set (match_operand:SI 0 "register_operand" "=r")
- (zero_extend:SI (match_operand:HI 1 "register_operand" "r")))]
- ""
- "#"
- "reload_completed"
- [(set (match_dup 2) (match_dup 1))
- (set (match_dup 3) (const_int 0))]
- "unsigned int low_off = subreg_lowpart_offset (HImode, SImode);
- unsigned int high_off = subreg_highpart_offset (HImode, SImode);
-
- operands[2] = simplify_gen_subreg (HImode, operands[0], SImode, low_off);
- operands[3] = simplify_gen_subreg (HImode, operands[0], SImode, high_off);
- ")
-
-(define_insn_and_split "zero_extendqidi2"
- [(set (match_operand:DI 0 "register_operand" "=r")
- (zero_extend:DI (match_operand:QI 1 "register_operand" "r")))]
- ""
- "#"
- "reload_completed"
- [(set (match_dup 2) (zero_extend:SI (match_dup 1)))
- (set (match_dup 3) (const_int 0))]
- "unsigned int low_off = subreg_lowpart_offset (SImode, DImode);
- unsigned int high_off = subreg_highpart_offset (SImode, DImode);
-
- operands[2] = simplify_gen_subreg (SImode, operands[0], DImode, low_off);
- operands[3] = simplify_gen_subreg (SImode, operands[0], DImode, high_off);
- ")
-
-(define_insn_and_split "zero_extendhidi2"
- [(set (match_operand:DI 0 "register_operand" "=r")
- (zero_extend:DI (match_operand:HI 1 "register_operand" "r")))]
- ""
- "#"
- "reload_completed"
- [(set (match_dup 2) (zero_extend:SI (match_dup 1)))
- (set (match_dup 3) (const_int 0))]
- "unsigned int low_off = subreg_lowpart_offset (SImode, DImode);
- unsigned int high_off = subreg_highpart_offset (SImode, DImode);
-
- operands[2] = simplify_gen_subreg (SImode, operands[0], DImode, low_off);
- operands[3] = simplify_gen_subreg (SImode, operands[0], DImode, high_off);
- ")
-
-(define_insn_and_split "zero_extendsidi2"
- [(set (match_operand:DI 0 "register_operand" "=r")
- (zero_extend:DI (match_operand:SI 1 "register_operand" "r")))]
- ""
- "#"
- "reload_completed"
- [(set (match_dup 2) (match_dup 1))
- (set (match_dup 3) (const_int 0))]
- "unsigned int low_off = subreg_lowpart_offset (SImode, DImode);
- unsigned int high_off = subreg_highpart_offset (SImode, DImode);
-
- operands[2] = simplify_gen_subreg (SImode, operands[0], DImode, low_off);
- operands[3] = simplify_gen_subreg (SImode, operands[0], DImode, high_off);
- ")
-
;;<=><=><=><=><=><=><=><=><=><=><=><=><=><=><=><=><=><=><=><=><=><=><=><=><=>
;; compare