Commit b8074dbe by Denis Chertykov Committed by Denis Chertykov

ip2k.c (ip2k_set_compare): Remove all const_double stuff.

	* config/ip2k/ip2k.c (ip2k_set_compare): Remove all const_double
	stuff.
	(ip2k_gen_unsigned_comp_branch): Handle CONST_INT and
	CONST_DOUBLE constants.

From-SVN: r56686
parent 4c322bff
2002-08-30 Denis Chertykov <denisc@overta.ru>
* config/ip2k/ip2k.c (ip2k_set_compare): Remove all const_double
stuff.
(ip2k_gen_unsigned_comp_branch): Handle CONST_INT and
CONST_DOUBLE constants.
2002-08-30 Jason Thorpe <thorpej@wasabisystems.com> 2002-08-30 Jason Thorpe <thorpej@wasabisystems.com>
* config/alpha/alpha.h (TARGET_CPU_CPP_BUILTINS): Move language- * config/alpha/alpha.h (TARGET_CPU_CPP_BUILTINS): Move language-
......
...@@ -1075,25 +1075,6 @@ ip2k_set_compare (x, y) ...@@ -1075,25 +1075,6 @@ ip2k_set_compare (x, y)
rtx x; rtx x;
rtx y; rtx y;
{ {
/* If we're doing a DImode compare then force any CONST_INT second
operand to be CONST_DOUBLE. */
if (GET_MODE (x) == DImode && GET_CODE (y) == CONST_INT)
{
rtx value;
size_t i;
value = rtx_alloc (CONST_DOUBLE);
PUT_MODE (value, VOIDmode);
CONST_DOUBLE_LOW (value) = INTVAL (y);
CONST_DOUBLE_HIGH (value) = INTVAL (y) > 0 ? 0 : -1;
for (i = 2; i < (sizeof CONST_DOUBLE_FORMAT - 1); i++)
XWINT (value, i) = 0;
y = value;
}
ip2k_compare_operands[0] = x; ip2k_compare_operands[0] = x;
ip2k_compare_operands[1] = y; ip2k_compare_operands[1] = y;
return ""; return "";
...@@ -1675,6 +1656,8 @@ ip2k_gen_unsigned_comp_branch (insn, code, label) ...@@ -1675,6 +1656,8 @@ ip2k_gen_unsigned_comp_branch (insn, code, label)
int imm_cmp = 0; int imm_cmp = 0;
int can_use_skip = 0; int can_use_skip = 0;
rtx ninsn; rtx ninsn;
HOST_WIDE_INT const_low;
HOST_WIDE_INT const_high;
operands[2] = label; operands[2] = label;
...@@ -2332,10 +2315,10 @@ ip2k_gen_unsigned_comp_branch (insn, code, label) ...@@ -2332,10 +2315,10 @@ ip2k_gen_unsigned_comp_branch (insn, code, label)
{ {
if (INTVAL (operands[0]) == 0) if (INTVAL (operands[0]) == 0)
{ {
OUT_AS2 (mov, w, %A0); OUT_AS2 (mov, w, %A1);
OUT_AS2 (or, w, %B0); OUT_AS2 (or, w, %B1);
OUT_AS2 (or, w, %C0); OUT_AS2 (or, w, %C1);
OUT_AS2 (or, w, %D0); OUT_AS2 (or, w, %D1);
OUT_AS1 (snz,); OUT_AS1 (snz,);
OUT_AS1 (page, %2); OUT_AS1 (page, %2);
OUT_AS1 (jmp, %2); OUT_AS1 (jmp, %2);
...@@ -2377,10 +2360,10 @@ ip2k_gen_unsigned_comp_branch (insn, code, label) ...@@ -2377,10 +2360,10 @@ ip2k_gen_unsigned_comp_branch (insn, code, label)
{ {
if (INTVAL (operands[0]) == 0) if (INTVAL (operands[0]) == 0)
{ {
OUT_AS2 (mov, w, %A0); OUT_AS2 (mov, w, %A1);
OUT_AS2 (or, w, %B0); OUT_AS2 (or, w, %B1);
OUT_AS2 (or, w, %C0); OUT_AS2 (or, w, %C1);
OUT_AS2 (or, w, %D0); OUT_AS2 (or, w, %D1);
OUT_AS1 (sz,); OUT_AS1 (sz,);
OUT_AS1 (page, %2); OUT_AS1 (page, %2);
OUT_AS1 (jmp, %2); OUT_AS1 (jmp, %2);
...@@ -2465,6 +2448,16 @@ ip2k_gen_unsigned_comp_branch (insn, code, label) ...@@ -2465,6 +2448,16 @@ ip2k_gen_unsigned_comp_branch (insn, code, label)
break; break;
case DImode: case DImode:
if (GET_CODE (operands[1]) == CONST_INT)
{
const_low = INTVAL (operands[1]);
const_high = (const_low >= 0) - 1;
}
else if (GET_CODE (operands[1]) == CONST_DOUBLE)
{
const_low = CONST_DOUBLE_LOW (operands[1]);
const_high = CONST_DOUBLE_HIGH (operands[1]);
}
switch (code) switch (code)
{ {
case EQ: case EQ:
...@@ -2519,14 +2512,14 @@ ip2k_gen_unsigned_comp_branch (insn, code, label) ...@@ -2519,14 +2512,14 @@ ip2k_gen_unsigned_comp_branch (insn, code, label)
{ {
if (imm_cmp) if (imm_cmp)
{ {
s = (CONST_DOUBLE_HIGH (operands[1]) >> 24) & 0xff; s = (const_high >> 24) & 0xff;
t = (CONST_DOUBLE_HIGH (operands[1]) >> 16) & 0xff; t = (const_high >> 16) & 0xff;
u = (CONST_DOUBLE_HIGH (operands[1]) >> 8) & 0xff; u = (const_high >> 8) & 0xff;
v = CONST_DOUBLE_HIGH (operands[1]) & 0xff; v = const_high & 0xff;
w = (CONST_DOUBLE_LOW (operands[1]) >> 24) & 0xff; w = (const_low >> 24) & 0xff;
x = (CONST_DOUBLE_LOW (operands[1]) >> 16) & 0xff; x = (const_low >> 16) & 0xff;
y = (CONST_DOUBLE_LOW (operands[1]) >> 8) & 0xff; y = (const_low >> 8) & 0xff;
z = CONST_DOUBLE_LOW (operands[1]) & 0xff; z = const_low & 0xff;
} }
OUT_AS2 (mov, w, %S1); OUT_AS2 (mov, w, %S1);
...@@ -2648,14 +2641,14 @@ ip2k_gen_unsigned_comp_branch (insn, code, label) ...@@ -2648,14 +2641,14 @@ ip2k_gen_unsigned_comp_branch (insn, code, label)
{ {
if (imm_cmp) if (imm_cmp)
{ {
s = (CONST_DOUBLE_HIGH (operands[1]) >> 24) & 0xff; s = (const_high >> 24) & 0xff;
t = (CONST_DOUBLE_HIGH (operands[1]) >> 16) & 0xff; t = (const_high >> 16) & 0xff;
u = (CONST_DOUBLE_HIGH (operands[1]) >> 8) & 0xff; u = (const_high >> 8) & 0xff;
v = CONST_DOUBLE_HIGH (operands[1]) & 0xff; v = const_high & 0xff;
w = (CONST_DOUBLE_LOW (operands[1]) >> 24) & 0xff; w = (const_low >> 24) & 0xff;
x = (CONST_DOUBLE_LOW (operands[1]) >> 16) & 0xff; x = (const_low >> 16) & 0xff;
y = (CONST_DOUBLE_LOW (operands[1]) >> 8) & 0xff; y = (const_low >> 8) & 0xff;
z = CONST_DOUBLE_LOW (operands[1]) & 0xff; z = const_low & 0xff;
} }
OUT_AS2 (mov, w, %S1); OUT_AS2 (mov, w, %S1);
...@@ -2734,13 +2727,11 @@ ip2k_gen_unsigned_comp_branch (insn, code, label) ...@@ -2734,13 +2727,11 @@ ip2k_gen_unsigned_comp_branch (insn, code, label)
if (imm_sub) if (imm_sub)
{ {
/* > 0xffffffffffffffff never suceeds! */ /* > 0xffffffffffffffff never suceeds! */
if (((CONST_DOUBLE_HIGH (operands[1]) & 0xffffffff) if (((const_high & 0xffffffff) != 0xffffffff)
!= 0xffffffff) || ((const_low & 0xffffffff) != 0xffffffff))
|| ((CONST_DOUBLE_LOW (operands[1]) & 0xffffffff)
!= 0xffffffff))
{ {
operands[3] = GEN_INT (CONST_DOUBLE_LOW (operands[1]) + 1); operands[3] = GEN_INT (const_low + 1);
operands[4] = GEN_INT (CONST_DOUBLE_HIGH (operands[1]) operands[4] = GEN_INT (const_high
+ (INTVAL (operands[3]) ? 0 : 1)); + (INTVAL (operands[3]) ? 0 : 1));
OUT_AS2 (mov, w, %D3); OUT_AS2 (mov, w, %D3);
OUT_AS2 (sub, w, %Z0); OUT_AS2 (sub, w, %Z0);
...@@ -2790,27 +2781,38 @@ ip2k_gen_unsigned_comp_branch (insn, code, label) ...@@ -2790,27 +2781,38 @@ ip2k_gen_unsigned_comp_branch (insn, code, label)
case GEU: case GEU:
if (imm_sub) if (imm_sub)
{ {
if ((CONST_DOUBLE_HIGH (operands[0]) == 0) HOST_WIDE_INT const_low0;
&& (CONST_DOUBLE_LOW (operands[0]) == 0)) HOST_WIDE_INT const_high0;
if (GET_CODE (operands[0]) == CONST_INT)
{ {
OUT_AS2 (mov, w, %S0); const_low0 = INTVAL (operands[0]);
OUT_AS2 (or, w, %T0); const_high0 = (const_low >= 0) - 1;
OUT_AS2 (or, w, %U0); }
OUT_AS2 (or, w, %V0); else if (GET_CODE (operands[0]) == CONST_DOUBLE)
OUT_AS2 (or, w, %W0); {
OUT_AS2 (or, w, %X0); const_low0 = CONST_DOUBLE_LOW (operands[0]);
OUT_AS2 (or, w, %Y0); const_high0 = CONST_DOUBLE_HIGH (operands[0]);
OUT_AS2 (or, w, %Z0); }
if (const_high0 == 0 && const_low0 == 0)
{
OUT_AS2 (mov, w, %S1);
OUT_AS2 (or, w, %T1);
OUT_AS2 (or, w, %U1);
OUT_AS2 (or, w, %V1);
OUT_AS2 (or, w, %W1);
OUT_AS2 (or, w, %X1);
OUT_AS2 (or, w, %Y1);
OUT_AS2 (or, w, %Z1);
OUT_AS1 (snz,); OUT_AS1 (snz,);
OUT_AS1 (page, %2); OUT_AS1 (page, %2);
OUT_AS1 (jmp, %2); OUT_AS1 (jmp, %2);
} }
else else
{ {
operands[3] = GEN_INT (CONST_DOUBLE_LOW (operands[0]) - 1); operands[3] = GEN_INT (const_low0 - 1);
operands[4] = GEN_INT (CONST_DOUBLE_HIGH (operands[0]) operands[4] = GEN_INT (const_high0 - (const_low0 ? 1 : 0));
- (CONST_DOUBLE_LOW (operands[0])
? 1 : 0));
OUT_AS2 (mov, w, %D3); OUT_AS2 (mov, w, %D3);
OUT_AS2 (sub, w, %Z1); OUT_AS2 (sub, w, %Z1);
OUT_AS2 (mov, w, %C3); OUT_AS2 (mov, w, %C3);
...@@ -2859,27 +2861,38 @@ ip2k_gen_unsigned_comp_branch (insn, code, label) ...@@ -2859,27 +2861,38 @@ ip2k_gen_unsigned_comp_branch (insn, code, label)
case LTU: case LTU:
if (imm_sub) if (imm_sub)
{ {
if ((CONST_DOUBLE_HIGH (operands[0]) == 0) HOST_WIDE_INT const_low0;
&& (CONST_DOUBLE_LOW (operands[0]) == 0)) HOST_WIDE_INT const_high0;
if (GET_CODE (operands[0]) == CONST_INT)
{
const_low0 = INTVAL (operands[0]);
const_high0 = (const_low >= 0) - 1;
}
else if (GET_CODE (operands[0]) == CONST_DOUBLE)
{
const_low0 = CONST_DOUBLE_LOW (operands[0]);
const_high0 = CONST_DOUBLE_HIGH (operands[0]);
}
if (const_high0 == 0 && const_low0 == 0)
{ {
OUT_AS2 (mov, w, %S0); OUT_AS2 (mov, w, %S1);
OUT_AS2 (or, w, %T0); OUT_AS2 (or, w, %T1);
OUT_AS2 (or, w, %U0); OUT_AS2 (or, w, %U1);
OUT_AS2 (or, w, %V0); OUT_AS2 (or, w, %V1);
OUT_AS2 (or, w, %W0); OUT_AS2 (or, w, %W1);
OUT_AS2 (or, w, %X0); OUT_AS2 (or, w, %X1);
OUT_AS2 (or, w, %Y0); OUT_AS2 (or, w, %Y1);
OUT_AS2 (or, w, %Z0); OUT_AS2 (or, w, %Z1);
OUT_AS1 (sz,); OUT_AS1 (sz,);
OUT_AS1 (page, %2); OUT_AS1 (page, %2);
OUT_AS1 (jmp, %2); OUT_AS1 (jmp, %2);
} }
else else
{ {
operands[3] = GEN_INT (CONST_DOUBLE_LOW (operands[0]) - 1); operands[3] = GEN_INT (const_low0 - 1);
operands[4] = GEN_INT (CONST_DOUBLE_HIGH (operands[0]) operands[4] = GEN_INT (const_high0 - (const_low0 ? 1 : 0));
- (CONST_DOUBLE_LOW (operands[0])
? 1 : 0));
OUT_AS2 (mov, w, %D3); OUT_AS2 (mov, w, %D3);
OUT_AS2 (sub, w, %Z1); OUT_AS2 (sub, w, %Z1);
OUT_AS2 (mov, w, %C3); OUT_AS2 (mov, w, %C3);
...@@ -2928,10 +2941,8 @@ ip2k_gen_unsigned_comp_branch (insn, code, label) ...@@ -2928,10 +2941,8 @@ ip2k_gen_unsigned_comp_branch (insn, code, label)
case LEU: case LEU:
if (imm_sub) if (imm_sub)
{ {
if (((CONST_DOUBLE_HIGH (operands[1]) & 0xffffffff) if (((const_high & 0xffffffff) == 0xffffffff)
== 0xffffffff) && ((const_low & 0xffffffff) == 0xffffffff))
&& ((CONST_DOUBLE_LOW (operands[1]) & 0xffffffff)
== 0xffffffff))
{ {
/* <= 0xffffffffffffffff always suceeds. */ /* <= 0xffffffffffffffff always suceeds. */
OUT_AS1 (page, %2); OUT_AS1 (page, %2);
...@@ -2939,8 +2950,8 @@ ip2k_gen_unsigned_comp_branch (insn, code, label) ...@@ -2939,8 +2950,8 @@ ip2k_gen_unsigned_comp_branch (insn, code, label)
} }
else else
{ {
operands[3] = GEN_INT (CONST_DOUBLE_LOW (operands[1]) + 1); operands[3] = GEN_INT (const_low + 1);
operands[4] = GEN_INT (CONST_DOUBLE_HIGH (operands[1]) operands[4] = GEN_INT (const_high
+ (INTVAL (operands[3]) ? 0 : 1)); + (INTVAL (operands[3]) ? 0 : 1));
OUT_AS2 (mov, w, %D3); OUT_AS2 (mov, w, %D3);
OUT_AS2 (sub, w, %Z0); OUT_AS2 (sub, w, %Z0);
......
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