mirror of
git://gcc.gnu.org/git/gcc.git
synced 2025-04-21 05:00:23 +08:00
(pattern for HImode PSHM): Corrected.
(trunchiqi2, zero_extendqihi2, extendhftqf2): Corrected. (pattern for movhi of CONST_INT to REG): Corrected. (divmodqi pattern for DISN): Corrected. (all shift patterns): Corrected. From-SVN: r10594
This commit is contained in:
parent
7838976cf7
commit
04ac5b95df
@ -55,7 +55,7 @@
|
||||
[(set (match_operand:QI 0 "push_operand" "=<")
|
||||
(match_operand:QI 1 "general_operand" "r"))]
|
||||
""
|
||||
"pshm r%1,r%1")
|
||||
"pshm r%1,r%1 ; stackptr = R%0")
|
||||
|
||||
(define_insn ""
|
||||
[(set (match_operand:HI 0 "push_operand" "=<")
|
||||
@ -63,9 +63,12 @@
|
||||
""
|
||||
"*
|
||||
{
|
||||
rtx new_operands[2];
|
||||
rtx new_operands[3];
|
||||
new_operands[2] = operands[0];
|
||||
new_operands[0] = operands[1];
|
||||
new_operands[1] = gen_rtx(CONST_INT,VOIDmode,REGNO(operands[1])+1);
|
||||
output_asm_insn(\"pshm r%0,r%1 ; stackptr = r%2\",new_operands);
|
||||
return \";\";
|
||||
} ")
|
||||
|
||||
(define_insn ""
|
||||
@ -74,11 +77,12 @@
|
||||
""
|
||||
"*
|
||||
{
|
||||
rtx new_operands[2];
|
||||
rtx new_operands[3];
|
||||
new_operands[2] = operands[0];
|
||||
new_operands[0] = operands[1];
|
||||
new_operands[1] = gen_rtx(CONST_INT,VOIDmode,REGNO(operands[1])+1);
|
||||
output_asm_insn(\"pshm r%0,r%1\",new_operands);
|
||||
return \"\;\";
|
||||
output_asm_insn(\"pshm r%0,r%1 ; stackptr = r%2\",new_operands);
|
||||
return \";\";
|
||||
} ")
|
||||
|
||||
(define_insn ""
|
||||
@ -87,11 +91,12 @@
|
||||
""
|
||||
"*
|
||||
{
|
||||
rtx new_operands[2];
|
||||
rtx new_operands[3];
|
||||
new_operands[2] = operands[0];
|
||||
new_operands[0] = operands[1];
|
||||
new_operands[1] = gen_rtx(CONST_INT,VOIDmode,REGNO(operands[1])+2);
|
||||
output_asm_insn(\"pshm r%0,r%1\",new_operands);
|
||||
return \"\;\";
|
||||
output_asm_insn(\"pshm r%0,r%1 ; stackptr = r%2\",new_operands);
|
||||
return \";\";
|
||||
} ")
|
||||
|
||||
;; stackpop
|
||||
@ -111,7 +116,7 @@
|
||||
new_operands[0] = operands[0];
|
||||
new_operands[1] = gen_rtx(CONST_INT,VOIDmode,REGNO(operands[0])+1);
|
||||
output_asm_insn(\"popm r%0,r%1\",new_operands);
|
||||
return \"\;\";
|
||||
return \";\";
|
||||
} ")
|
||||
|
||||
(define_insn ""
|
||||
@ -124,7 +129,7 @@
|
||||
new_operands[0] = operands[0];
|
||||
new_operands[1] = gen_rtx(CONST_INT,VOIDmode,REGNO(operands[0])+1);
|
||||
output_asm_insn(\"popm r%0,r%1\",new_operands);
|
||||
return \"\;\";
|
||||
return \";\";
|
||||
} ")
|
||||
|
||||
(define_insn ""
|
||||
@ -137,7 +142,7 @@
|
||||
new_operands[0] = operands[0];
|
||||
new_operands[1] = gen_rtx(CONST_INT,VOIDmode,REGNO(operands[0])+2);
|
||||
output_asm_insn(\"popm r%0,r%1\",new_operands);
|
||||
return \"\;\";
|
||||
return \";\";
|
||||
} ")
|
||||
|
||||
;; Test operations. These shouldn't really occur for 1750:
|
||||
@ -262,8 +267,11 @@
|
||||
""
|
||||
"*
|
||||
{
|
||||
REGNO(operands[1]) += 1;
|
||||
return \"lr r%0,r%1 ;trunchiqi2\";
|
||||
rtx new_operands[2];
|
||||
new_operands[0] = operands[0];
|
||||
new_operands[1] = gen_rtx (REG, HImode, REGNO(operands[1]) + 1);
|
||||
output_asm_insn(\"lr r%0,r%1 ;trunchiqi2\",new_operands);
|
||||
return \";\";
|
||||
} ")
|
||||
|
||||
;; zero extension instructions
|
||||
@ -274,17 +282,23 @@
|
||||
""
|
||||
"*
|
||||
{
|
||||
rtx new_opnds[2];
|
||||
output_asm_insn(\"xorr r%0,r%0 ;zero_extendqihi2\",operands);
|
||||
REGNO(operands[0]) += 1;
|
||||
new_opnds[0] = gen_rtx (REG, HImode, REGNO(operands[0]) + 1);
|
||||
new_opnds[1] = operands[1];
|
||||
switch (which_alternative)
|
||||
{
|
||||
case 0:
|
||||
return \"lr r%0,r%1\";
|
||||
output_asm_insn(\"lr r%0,r%1\",new_opnds);
|
||||
break;
|
||||
case 1:
|
||||
return \"l r%0,%1\";
|
||||
output_asm_insn(\"l r%0,%1\",new_opnds);
|
||||
break;
|
||||
case 2:
|
||||
return \"lim r%0,%1\";
|
||||
output_asm_insn(\"lim r%0,%1\",new_opnds);
|
||||
break;
|
||||
}
|
||||
return \";\";
|
||||
} ")
|
||||
|
||||
;; sign extension instructions
|
||||
@ -304,18 +318,18 @@
|
||||
; 1750 HF-to-TQF extend: just append 16 bits (least signif.) with all bits zero
|
||||
(define_insn "extendhftqf2"
|
||||
[(set (match_operand:TQF 0 "register_operand" "=r,r")
|
||||
(float_extend:TQF
|
||||
(match_operand:HF 1 "general_operand" "r,m")))]
|
||||
(float_extend:TQF (match_operand:HF 1 "general_operand" "r,m")))]
|
||||
""
|
||||
"*
|
||||
{
|
||||
REGNO(operands[0]) += 2;
|
||||
output_asm_insn(\"xorr r%0,r%0 ;extendhftqf2\",operands);
|
||||
REGNO(operands[0]) -= 2;
|
||||
rtx new_opnds[2];
|
||||
new_opnds[0] = gen_rtx (REG, QImode, REGNO(operands[0]) + 2);
|
||||
new_opnds[1] = operands[1];
|
||||
output_asm_insn(\"xorr r%0,r%0 ;extendhftqf2\",new_opnds);
|
||||
if (which_alternative == 0)
|
||||
return \"dlr r%0,r%1\";
|
||||
return \"dlr r%0,r%1 ; put condition codes back on track\";
|
||||
else
|
||||
return \"dl r%0,%1\";
|
||||
return \"dl r%0,%1 ; put condition codes back on track\";
|
||||
} ")
|
||||
|
||||
; 1750 TQF-to-HF truncate is a no-op: just leave away the least signif. 16 bits
|
||||
@ -386,38 +400,42 @@
|
||||
|
||||
;; 32-bit moves
|
||||
|
||||
;; Set HIreg to constant
|
||||
; Set HIreg to constant
|
||||
(define_insn ""
|
||||
[(set (match_operand:HI 0 "register_operand" "=r")
|
||||
(match_operand 1 "immediate_operand" "i"))]
|
||||
(match_operand:HI 1 "immediate_operand" "i"))]
|
||||
""
|
||||
"*
|
||||
if (GET_CODE(operands[1]) == CONST_INT)
|
||||
{
|
||||
rtx new_opnds[2];
|
||||
int val = INTVAL(operands[1]);
|
||||
if (val >= 0)
|
||||
{
|
||||
if (val <= 65535)
|
||||
{
|
||||
output_asm_insn(\"xorr r%0,r%0 ;movhi cst->reg\",operands);
|
||||
operands[0] = gen_rtx(REG,QImode,REGNO(operands[0]) + 1);
|
||||
new_opnds[0] = gen_rtx(REG,QImode,REGNO(operands[0]));
|
||||
new_opnds[1] = operands[1];
|
||||
output_asm_insn(\"xorr r%0,r%0 ;movhi cst->reg\",new_opnds);
|
||||
REGNO(new_opnds[0]) += 1;
|
||||
if (val == 0)
|
||||
return \"xorr r%0,r%0\";
|
||||
output_asm_insn(\"xorr r%0,r%0\",new_opnds);
|
||||
else if (val <= 16)
|
||||
return \"lisp r%0,%1\";
|
||||
output_asm_insn(\"lisp r%0,%1\",new_opnds);
|
||||
else
|
||||
return \"lim r%0,%1\";
|
||||
output_asm_insn(\"lim r%0,%1\",new_opnds);
|
||||
return \";\";
|
||||
}
|
||||
}
|
||||
else if (val >= -16)
|
||||
return \"lisn r%0,%J1\;dsra r%0,16 ;movhi cst\";
|
||||
INTVAL(operands[1]) >>= 16;
|
||||
output_asm_insn(\"lim r%0,%1 ;movhi cst->reg\",operands);
|
||||
REGNO(operands[0]) += 1;
|
||||
INTVAL(operands[1]) = val & 0xFFFF;
|
||||
return \"lim r%0,%1\";
|
||||
new_opnds[0] = gen_rtx(REG, QImode, REGNO(operands[0]));
|
||||
new_opnds[1] = gen_rtx(CONST_INT,VOIDmode,(INTVAL(operands[1])) >> 16);
|
||||
output_asm_insn(\"lim r%0,%1 ;movhi cst->reg\",new_opnds);
|
||||
INTVAL(new_opnds[1]) = val & 0xFFFF;
|
||||
REGNO(new_opnds[0]) += 1;
|
||||
output_asm_insn(\"lim r%0,%1\",new_opnds);
|
||||
return \";\";
|
||||
}
|
||||
return \"lim r%0,%1\;dsra r%0,16 ;movhi cst\";
|
||||
")
|
||||
|
||||
(define_insn "movhi"
|
||||
@ -671,8 +689,15 @@
|
||||
istr = \"disp\";
|
||||
break;
|
||||
case 1:
|
||||
INTVAL(operands[2]) = - INTVAL(operands[2]); /* to be corrected */
|
||||
istr = \"disn\";
|
||||
{
|
||||
rtx new_opnds[4];
|
||||
new_opnds[0] = operands[0];
|
||||
new_opnds[1] = operands[1];
|
||||
new_opnds[2] = gen_rtx (CONST_INT, VOIDmode, -INTVAL(operands[2]));
|
||||
new_opnds[3] = operands[3];
|
||||
istr = \"disn\";
|
||||
return (char *)mod_regno_adjust(istr,new_opnds);
|
||||
}
|
||||
break;
|
||||
case 2:
|
||||
istr = \"dvim\";
|
||||
@ -880,7 +905,7 @@
|
||||
(define_insn "ashlqi3"
|
||||
[(set (match_operand:QI 0 "register_operand" "=r,r")
|
||||
(ashift:QI (match_operand:QI 1 "register_operand" "0,0")
|
||||
(match_operand:QI 2 "general_operand" "I,r")))]
|
||||
(match_operand:QI 2 "nonmemory_operand" "I,r")))]
|
||||
""
|
||||
"@
|
||||
sll r%0,%2
|
||||
@ -889,11 +914,24 @@
|
||||
(define_insn "ashlhi3"
|
||||
[(set (match_operand:HI 0 "register_operand" "=r,r")
|
||||
(ashift:HI (match_operand:HI 1 "register_operand" "0,0")
|
||||
(match_operand:QI 2 "general_operand" "L,r")))]
|
||||
(match_operand:QI 2 "nonmemory_operand" "L,r")))]
|
||||
"" ; the 'L' constraint is a slight imprecise...
|
||||
"@
|
||||
dsll r%0,%2
|
||||
dslr r%0,r%2 ")
|
||||
"*
|
||||
if (which_alternative == 1)
|
||||
return \"dslr r%0,r%2\";
|
||||
else if (INTVAL(operands[2]) <= 16)
|
||||
return \"dsll r%0,%2\";
|
||||
else
|
||||
{
|
||||
rtx new_opnds[2];
|
||||
new_opnds[0] = gen_rtx (REG, QImode, REGNO(operands[0]));
|
||||
new_opnds[1] = gen_rtx (REG, QImode, REGNO(operands[0]) + 1);
|
||||
output_asm_insn(\"lr r%0,r%1 ; ashlhi3 shiftcount > 16\",new_opnds);
|
||||
new_opnds[1] = gen_rtx (CONST_INT, VOIDmode, INTVAL(operands[2]) - 16);
|
||||
output_asm_insn(\"sll r%0,%1\",new_opnds);
|
||||
return \";\";
|
||||
} ")
|
||||
|
||||
|
||||
;; Right shift by a variable shiftcount works by negating the shift count,
|
||||
;; then emitting a right shift with the shift count negated. This means
|
||||
@ -901,9 +939,9 @@
|
||||
;; prevents converting shifts to ZERO_EXTRACTs with negative positions,
|
||||
;; which isn't valid.
|
||||
(define_expand "lshrqi3"
|
||||
[(set (match_operand:QI 0 "general_operand" "=g")
|
||||
[(set (match_operand:QI 0 "general_operand" "=r")
|
||||
(lshiftrt:QI (match_operand:QI 1 "general_operand" "0")
|
||||
(match_operand:QI 2 "general_operand" "g")))]
|
||||
(match_operand:QI 2 "nonmemory_operand" "g")))]
|
||||
""
|
||||
"
|
||||
{
|
||||
@ -916,7 +954,7 @@
|
||||
(lshiftrt:QI (match_operand:QI 1 "register_operand" "0")
|
||||
(match_operand:QI 2 "immediate_operand" "I")))]
|
||||
""
|
||||
"srl r%0,%1")
|
||||
"srl r%0,%2")
|
||||
|
||||
(define_insn ""
|
||||
[(set (match_operand:QI 0 "register_operand" "=r")
|
||||
@ -926,23 +964,35 @@
|
||||
"slr r%0,r%2 ")
|
||||
|
||||
;; Same thing for HImode.
|
||||
|
||||
(define_expand "lshrhi3"
|
||||
[(set (match_operand:HI 0 "general_operand" "=g")
|
||||
(lshiftrt:HI (match_operand:HI 1 "general_operand" "0")
|
||||
(match_operand:QI 2 "general_operand" "g")))]
|
||||
[(set (match_operand:HI 0 "register_operand" "=r")
|
||||
(lshiftrt:HI (match_operand:HI 1 "register_operand" "0")
|
||||
(match_operand:QI 2 "nonmemory_operand" "g")))]
|
||||
""
|
||||
"
|
||||
{
|
||||
if (GET_CODE (operands[2]) != CONST_INT)
|
||||
operands[2] = gen_rtx (NEG, QImode, negate_rtx (QImode, operands[2]));
|
||||
}")
|
||||
{
|
||||
if (GET_CODE (operands[2]) != CONST_INT)
|
||||
operands[2] = gen_rtx (NEG, QImode, negate_rtx (QImode, operands[2]));
|
||||
}")
|
||||
|
||||
(define_insn ""
|
||||
[(set (match_operand:HI 0 "register_operand" "=r")
|
||||
(lshiftrt:HI (match_operand:HI 1 "register_operand" "0")
|
||||
(match_operand:QI 2 "immediate_operand" "L")))]
|
||||
""
|
||||
"dsrl r%0,%1")
|
||||
"*
|
||||
{
|
||||
rtx new_opnds[2];
|
||||
int amount = INTVAL(operands[2]);
|
||||
if (amount <= 16)
|
||||
return \"dsrl r%0,%2\";
|
||||
output_asm_insn(\"dsrl r%0,16 ; lshrhi3 shiftcount > 16\",operands);
|
||||
new_opnds[0] = gen_rtx (REG, QImode, REGNO(operands[0]) + 1);
|
||||
new_opnds[1] = gen_rtx (CONST_INT, VOIDmode, amount - 16);
|
||||
output_asm_insn(\"srl r%0,%1\",new_opnds);
|
||||
return \";\";
|
||||
} ")
|
||||
|
||||
(define_insn ""
|
||||
[(set (match_operand:HI 0 "register_operand" "=r")
|
||||
@ -953,22 +1003,22 @@
|
||||
|
||||
;; Same applies for arithmetic shift right.
|
||||
(define_expand "ashrqi3"
|
||||
[(set (match_operand:QI 0 "general_operand" "=g")
|
||||
[(set (match_operand:QI 0 "general_operand" "=r")
|
||||
(ashiftrt:QI (match_operand:QI 1 "general_operand" "0")
|
||||
(match_operand:QI 2 "general_operand" "g")))]
|
||||
(match_operand:QI 2 "nonmemory_operand" "g")))]
|
||||
""
|
||||
"
|
||||
{
|
||||
if (GET_CODE (operands[2]) != CONST_INT)
|
||||
operands[2] = gen_rtx (NEG, QImode, negate_rtx (QImode, operands[2]));
|
||||
}")
|
||||
{
|
||||
if (GET_CODE (operands[2]) != CONST_INT)
|
||||
operands[2] = gen_rtx (NEG, QImode, negate_rtx (QImode, operands[2]));
|
||||
}")
|
||||
|
||||
(define_insn ""
|
||||
[(set (match_operand:QI 0 "register_operand" "=r")
|
||||
(ashiftrt:QI (match_operand:QI 1 "register_operand" "0")
|
||||
(match_operand:QI 2 "immediate_operand" "I")))]
|
||||
""
|
||||
"sra r%0,%1")
|
||||
"sra r%0,%2")
|
||||
|
||||
(define_insn ""
|
||||
[(set (match_operand:QI 0 "register_operand" "=r")
|
||||
@ -979,22 +1029,33 @@
|
||||
|
||||
;; HImode arithmetic shift right.
|
||||
(define_expand "ashrhi3"
|
||||
[(set (match_operand:HI 0 "general_operand" "=g")
|
||||
[(set (match_operand:HI 0 "general_operand" "=r")
|
||||
(ashiftrt:HI (match_operand:HI 1 "general_operand" "0")
|
||||
(match_operand:QI 2 "general_operand" "g")))]
|
||||
(match_operand:QI 2 "nonmemory_operand" "g")))]
|
||||
""
|
||||
"
|
||||
{
|
||||
if (GET_CODE (operands[2]) != CONST_INT)
|
||||
operands[2] = gen_rtx (NEG, QImode, negate_rtx (QImode, operands[2]));
|
||||
}")
|
||||
{
|
||||
if (GET_CODE (operands[2]) != CONST_INT)
|
||||
operands[2] = gen_rtx (NEG, QImode, negate_rtx (QImode, operands[2]));
|
||||
}")
|
||||
|
||||
(define_insn ""
|
||||
[(set (match_operand:HI 0 "register_operand" "=r")
|
||||
(ashiftrt:HI (match_operand:HI 1 "register_operand" "0")
|
||||
(match_operand:QI 2 "immediate_operand" "L")))]
|
||||
""
|
||||
"dsra r%0,%1")
|
||||
"*
|
||||
{
|
||||
rtx new_opnds[2];
|
||||
int amount = INTVAL(operands[2]);
|
||||
if (amount <= 16)
|
||||
return \"dsra r%0,%2\";
|
||||
output_asm_insn(\"dsra r%0,16 ; ashrhi3 shiftcount > 16\",operands);
|
||||
new_opnds[0] = gen_rtx (REG, QImode, REGNO(operands[0]) + 1);
|
||||
new_opnds[1] = gen_rtx (CONST_INT, VOIDmode, amount - 16);
|
||||
output_asm_insn(\"sra r%0,%1\",new_opnds);
|
||||
return \";\";
|
||||
} ")
|
||||
|
||||
(define_insn ""
|
||||
[(set (match_operand:HI 0 "register_operand" "=r")
|
||||
@ -1009,7 +1070,7 @@
|
||||
(define_insn "rotlqi3"
|
||||
[(set (match_operand:QI 0 "register_operand" "=r,r")
|
||||
(rotate:QI (match_operand:QI 1 "register_operand" "0,0")
|
||||
(match_operand:QI 2 "general_operand" "I,r")))]
|
||||
(match_operand:QI 2 "nonmemory_operand" "I,r")))]
|
||||
""
|
||||
"@
|
||||
slc r%0,%2
|
||||
@ -1018,7 +1079,7 @@
|
||||
(define_insn "rotlhi3"
|
||||
[(set (match_operand:HI 0 "register_operand" "=r,r")
|
||||
(rotate:HI (match_operand:HI 1 "register_operand" "0,0")
|
||||
(match_operand:QI 2 "general_operand" "I,r")))]
|
||||
(match_operand:QI 2 "nonmemory_operand" "I,r")))]
|
||||
""
|
||||
"@
|
||||
dslc r%0,%2
|
||||
@ -1034,7 +1095,7 @@
|
||||
(define_insn "rotrhi3"
|
||||
[(set (match_operand:HI 0 "register_operand" "=r")
|
||||
(rotatert:HI (match_operand:HI 1 "register_operand" "0")
|
||||
(match_operand:QI 2 "general_operand" "r")))]
|
||||
(match_operand:QI 2 "nonmemory_operand" "r")))]
|
||||
""
|
||||
"neg r%2,r%2\;dscr r%0,r%2 ")
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user