Commit 01d3224a by Eric Botcazou Committed by Eric Botcazou

re PR rtl-optimization/11018 ([SPARC] -mcpu=ultrasparc busts tar-1.13.25)

	PR optimization/11018
	* config/sparc/sparc.c (sparc_v8plus_shift): Use which_alternative
	consistently to decide whether the scratch register is really
	required.

From-SVN: r67429
parent ef0139b1
2003-06-04 Eric Botcazou <ebotcazou@libertysurf.fr>
PR optimization/11018
* config/sparc/sparc.c (sparc_v8plus_shift): Use which_alternative
consistently to decide whether the scratch register is really
required.
2003-06-04 Eric Botcazou <ebotcazou@libertysurf.fr>
PR optimization/10876
* config/sparc/sparc.h (CONST_OK_FOR_LETTER): Add
new 'O' constraint for constant 4096.
......
......@@ -3401,7 +3401,7 @@ mem_min_alignment (mem, desired)
/* Vectors to keep interesting information about registers where it can easily
be got. We use to use the actual mode value as the bit number, but there
be got. We used to use the actual mode value as the bit number, but there
are more than 32 modes now. Instead we use two tables: one indexed by
hard register number, and one indexed by mode. */
......@@ -7969,6 +7969,8 @@ sparc_check_64 (x, insn)
return 0;
}
/* Returns assembly code to perform a DImode shift using
a 64-bit global or out register on SPARC-V8+. */
char *
sparc_v8plus_shift (operands, insn, opcode)
rtx *operands;
......@@ -7977,8 +7979,11 @@ sparc_v8plus_shift (operands, insn, opcode)
{
static char asm_code[60];
if (GET_CODE (operands[3]) == SCRATCH)
/* The scratch register is only required when the destination
register is not a 64-bit global or out register. */
if (which_alternative != 2)
operands[3] = operands[0];
if (GET_CODE (operands[1]) == CONST_INT)
{
output_asm_insn ("mov\t%1, %3", operands);
......@@ -7992,6 +7997,7 @@ sparc_v8plus_shift (operands, insn, opcode)
}
strcpy(asm_code, opcode);
if (which_alternative != 2)
return strcat (asm_code, "\t%0, %2, %L0\n\tsrlx\t%L0, 32, %H0");
else
......
2003-06-04 Eric Botcazou <ebotcazou@libertysurf.fr>
* gcc.dg/ultrasp9.c: New test.
2003-06-04 Eric Botcazou <ebotcazou@libertysurf.fr>
* gcc.c-torture/compile/20030604-1.c: New test.
* gcc.dg/sparc-constant-1.c: New test.
......
/* PR optimization/11018 */
/* Originator: <partain@dcs.gla.ac.uk> */
/* { dg-do run { target sparc*-*-* } } */
/* { dg-options "-O2 -mcpu=ultrasparc" } */
/* This used to fail on 32-bit Ultrasparc because
of broken DImode shift patterns. */
extern void abort(void);
typedef unsigned long long uint64_t;
typedef unsigned int size_t;
void to_octal (uint64_t value, char *where, size_t size)
{
uint64_t v = value;
size_t i = size;
do
{
where[--i] = '0' + (v & ((1 << 3) - 1));
v >>= 3;
}
while (i);
}
int main (void)
{
char buf[8];
to_octal(010644, buf, 6);
if (buf[1] != '1')
abort();
return 0;
}
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