Commit ae526227 by Jim Wilson

(adddi3, subdi3, anddi3, iordi3, xordi3): Corresponding changes.

(one_cmpldi3): Don't allow constants for operand 1.

From-SVN: r7173
parent 23b8a89f
...@@ -1789,12 +1789,16 @@ ...@@ -1789,12 +1789,16 @@
} }
else if (GET_CODE (op2) == CONST_DOUBLE) else if (GET_CODE (op2) == CONST_DOUBLE)
{ {
int sign = CONST_DOUBLE_HIGH (op2); rtx xoperands[4];
operands[2] = gen_rtx (CONST_INT, VOIDmode, xoperands[0] = operands[0];
CONST_DOUBLE_LOW (operands[1])); xoperands[1] = operands[1];
if (sign < 0) xoperands[2] = GEN_INT (CONST_DOUBLE_LOW (op2));
return \"addcc %R1,%2,%R0\;addx %1,-1,%0\"; xoperands[3] = GEN_INT (CONST_DOUBLE_HIGH (op2));
return \"addcc %R1,%2,%R0\;addx %1,0,%0\"; if (xoperands[2] == const0_rtx && xoperands[0] == xoperands[1])
output_asm_insn (\"add %1,%3,%0\", xoperands);
else
output_asm_insn (\"addcc %R1,%2,%R0\;addx %1,%3,%0\", xoperands);
return \"\";
} }
return \"addcc %R1,%R2,%R0\;addx %1,%2,%0\"; return \"addcc %R1,%R2,%R0\;addx %1,%2,%0\";
}" }"
...@@ -1847,12 +1851,16 @@ ...@@ -1847,12 +1851,16 @@
} }
else if (GET_CODE (op2) == CONST_DOUBLE) else if (GET_CODE (op2) == CONST_DOUBLE)
{ {
int sign = CONST_DOUBLE_HIGH (op2); rtx xoperands[4];
operands[2] = gen_rtx (CONST_INT, VOIDmode, xoperands[0] = operands[0];
CONST_DOUBLE_LOW (operands[1])); xoperands[1] = operands[1];
if (sign < 0) xoperands[2] = GEN_INT (CONST_DOUBLE_LOW (op2));
return \"subcc %R1,%2,%R0\;subx %1,-1,%0\"; xoperands[3] = GEN_INT (CONST_DOUBLE_HIGH (op2));
return \"subcc %R1,%2,%R0\;subx %1,0,%0\"; if (xoperands[2] == const0_rtx && xoperands[0] == xoperands[1])
output_asm_insn (\"sub %1,%3,%0\", xoperands);
else
output_asm_insn (\"subcc %R1,%2,%R0\;subx %1,%3,%0\", xoperands);
return \"\";
} }
return \"subcc %R1,%R2,%R0\;subx %1,%2,%0\"; return \"subcc %R1,%R2,%R0\;subx %1,%2,%0\";
}" }"
...@@ -2117,12 +2125,15 @@ ...@@ -2117,12 +2125,15 @@
} }
else if (GET_CODE (op2) == CONST_DOUBLE) else if (GET_CODE (op2) == CONST_DOUBLE)
{ {
int sign = CONST_DOUBLE_HIGH (op2); rtx xoperands[4];
operands[2] = gen_rtx (CONST_INT, VOIDmode, xoperands[0] = operands[0];
CONST_DOUBLE_LOW (operands[1])); xoperands[1] = operands[1];
if (sign < 0) xoperands[2] = GEN_INT (CONST_DOUBLE_LOW (op2));
return \"mov %1,%0\;and %R1,%2,%R0\"; xoperands[3] = GEN_INT (CONST_DOUBLE_HIGH (op2));
return \"mov 0,%0\;and %R1,%2,%R0\"; /* We could optimize then operands[1] == operands[0]
and either half of the constant is -1. */
output_asm_insn (\"and %R1,%2,%R0\;and %1,%3,%0\", xoperands);
return \"\";
} }
return \"and %1,%2,%0\;and %R1,%R2,%R0\"; return \"and %1,%2,%0\;and %R1,%R2,%R0\";
}" }"
...@@ -2192,12 +2203,15 @@ ...@@ -2192,12 +2203,15 @@
} }
else if (GET_CODE (op2) == CONST_DOUBLE) else if (GET_CODE (op2) == CONST_DOUBLE)
{ {
int sign = CONST_DOUBLE_HIGH (op2); rtx xoperands[4];
operands[2] = gen_rtx (CONST_INT, VOIDmode, xoperands[0] = operands[0];
CONST_DOUBLE_LOW (operands[1])); xoperands[1] = operands[1];
if (sign < 0) xoperands[2] = GEN_INT (CONST_DOUBLE_LOW (op2));
return \"mov -1,%0\;or %R1,%2,%R0\"; xoperands[3] = GEN_INT (CONST_DOUBLE_HIGH (op2));
return \"mov %1,%0\;or %R1,%2,%R0\"; /* We could optimize then operands[1] == operands[0]
and either half of the constant is 0. */
output_asm_insn (\"or %R1,%2,%R0\;or %1,%3,%0\", xoperands);
return \"\";
} }
return \"or %1,%2,%0\;or %R1,%R2,%R0\"; return \"or %1,%2,%0\;or %R1,%R2,%R0\";
}" }"
...@@ -2267,12 +2281,15 @@ ...@@ -2267,12 +2281,15 @@
} }
else if (GET_CODE (op2) == CONST_DOUBLE) else if (GET_CODE (op2) == CONST_DOUBLE)
{ {
int sign = CONST_DOUBLE_HIGH (op2); rtx xoperands[4];
operands[2] = gen_rtx (CONST_INT, VOIDmode, xoperands[0] = operands[0];
CONST_DOUBLE_LOW (operands[1])); xoperands[1] = operands[1];
if (sign < 0) xoperands[2] = GEN_INT (CONST_DOUBLE_LOW (op2));
return \"xor %1,-1,%0\;xor %R1,%2,%R0\"; xoperands[3] = GEN_INT (CONST_DOUBLE_HIGH (op2));
return \"mov %1,%0\;xor %R1,%2,%R0\"; /* We could optimize then operands[1] == operands[0]
and either half of the constant is 0. */
output_asm_insn (\"xor %R1,%2,%R0\;xor %1,%3,%0\", xoperands);
return \"\";
} }
return \"xor %1,%2,%0\;xor %R1,%R2,%R0\"; return \"xor %1,%2,%0\;xor %R1,%R2,%R0\";
}" }"
...@@ -2442,37 +2459,16 @@ ...@@ -2442,37 +2459,16 @@
;; We cannot use the "not" pseudo insn because the Sun assembler ;; We cannot use the "not" pseudo insn because the Sun assembler
;; does not know how to make it work for constants. ;; does not know how to make it work for constants.
(define_expand "one_cmpldi2" (define_expand "one_cmpldi2"
[(set (match_operand:DI 0 "register_operand" "=r") [(set (match_operand:DI 0 "register_operand" "")
(not:DI (match_operand:DI 1 "arith_double_operand" "rHI")))] (not:DI (match_operand:DI 1 "register_operand" "")))]
"" ""
"") "")
(define_insn "" (define_insn ""
[(set (match_operand:DI 0 "register_operand" "=r") [(set (match_operand:DI 0 "register_operand" "=r")
(not:DI (match_operand:DI 1 "arith_double_operand" "rHI")))] (not:DI (match_operand:DI 1 "register_operand" "r")))]
"" ""
"* "xnor %%g0,%1,%0\;xnor %%g0,%R1,%R0"
{
rtx op1 = operands[1];
if (GET_CODE (op1) == CONST_INT)
{
int sign = INTVAL (op1);
if (sign < 0)
return \"xnor %%g0,%1,%R0\;xnor %%g0,-1,%0\";
return \"xnor %%g0,%1,%R0\;xnor %%g0,0,%0\";
}
else if (GET_CODE (op1) == CONST_DOUBLE)
{
int sign = CONST_DOUBLE_HIGH (op1);
operands[1] = gen_rtx (CONST_INT, VOIDmode,
CONST_DOUBLE_LOW (operands[1]));
if (sign < 0)
return \"xnor %%g0,%1,%R0\;xnor %%g0,-1,%0\";
return \"xnor %%g0,%1,%R0\;xnor %%g0,0,%0\";
}
return \"xnor %%g0,%1,%0\;xnor %%g0,%R1,%R0\";
}"
[(set_attr "type" "unary") [(set_attr "type" "unary")
(set_attr "length" "2")]) (set_attr "length" "2")])
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment