sparc.md (muldi3_v8plus): Remove H constraint.

* config/sparc/sparc.md (muldi3_v8plus): Remove H constraint.
	Handle CONST_INT as second argument.
	* config/sparc/sparc.c (set_extends): Remove first argument.
	Properly handle AND, CONST_INT and CONST_DOUBLE, handle IOR, XOR and
	MOV.
	(sparc_check_64): Abort if first argument is not REG.
	If it is DImode REG, look at the lower register of the register
	pair.

	* config/sparc/sparc.c (load_pic_register, restore_regs,
	output_return, sparc_v8plus_shift, sparc_function_profiler,
	sparc_function_block_profiler, sparc_block_profiler): Fix output
	formatting.

	* gcc.dg/ultrasp3.c: New test.

From-SVN: r37738
This commit is contained in:
Jakub Jelinek 2000-11-25 18:38:58 +01:00 committed by Jakub Jelinek
parent 4fe0a76c67
commit 4df1190a74
5 changed files with 141 additions and 57 deletions

View File

@ -1,3 +1,19 @@
2000-11-25 Jakub Jelinek <jakub@redhat.com>
* config/sparc/sparc.md (muldi3_v8plus): Remove H constraint.
Handle CONST_INT as second argument.
* config/sparc/sparc.c (set_extends): Remove first argument.
Properly handle AND, CONST_INT and CONST_DOUBLE, handle IOR, XOR and
MOV.
(sparc_check_64): Abort if first argument is not REG.
If it is DImode REG, look at the lower register of the register
pair.
* config/sparc/sparc.c (load_pic_register, restore_regs,
output_return, sparc_v8plus_shift, sparc_function_profiler,
sparc_function_block_profiler, sparc_block_profiler): Fix output
formatting.
2000-11-25 Alexandre Oliva <aoliva@redhat.com>
* config/sh/sh.h (TARGET_NONE): New.

View File

@ -153,7 +153,7 @@ static rtx *ultra_find_type PARAMS ((int, rtx *, int));
static void ultra_build_types_avail PARAMS ((rtx *, int));
static void ultra_flush_pipeline PARAMS ((void));
static void ultra_rescan_pipeline_state PARAMS ((rtx *, int));
static int set_extends PARAMS ((rtx, rtx));
static int set_extends PARAMS ((rtx));
static void output_restore_regs PARAMS ((FILE *, int));
/* Option handling. */
@ -2852,7 +2852,7 @@ load_pic_register ()
if (align > 0)
ASM_OUTPUT_ALIGN (asm_out_file, align);
ASM_OUTPUT_INTERNAL_LABEL (asm_out_file, "LGETPC", 0);
fputs ("\tretl\n\tadd %o7,%l7,%l7\n", asm_out_file);
fputs ("\tretl\n\tadd\t%o7, %l7, %l7\n", asm_out_file);
}
/* Initialize every time through, since we can't easily
@ -3253,11 +3253,11 @@ restore_regs (file, low, high, base, offset, n_regs)
base, offset + 4 * n_regs, reg_names[i]),
n_regs += 2;
else
fprintf (file, "\tld\t[%s+%d],%s\n",
fprintf (file, "\tld\t[%s+%d], %s\n",
base, offset + 4 * n_regs, reg_names[i]),
n_regs += 2;
else if (regs_ever_live[i+1] && ! call_used_regs[i+1])
fprintf (file, "\tld\t[%s+%d],%s\n",
fprintf (file, "\tld\t[%s+%d], %s\n",
base, offset + 4 * n_regs + 4, reg_names[i+1]),
n_regs += 2;
}
@ -5417,9 +5417,9 @@ output_return (operands)
else
{
if ((actual_fsize & 0x3ff) != 0)
return "sethi %%hi(%a0),%%g1\n\tor %%g1,%%lo(%a0),%%g1\n\tretl\n\tadd %%sp,%%g1,%%sp";
return "sethi\t%%hi(%a0), %%g1\n\tor\t%%g1, %%lo(%a0), %%g1\n\tretl\n\tadd\t%%sp, %%g1, %%sp";
else
return "sethi %%hi(%a0),%%g1\n\tretl\n\tadd %%sp,%%g1,%%sp";
return "sethi\t%%hi(%a0), %%g1\n\tretl\n\tadd\t%%sp, %%g1, %%sp";
}
}
else if (TARGET_V9)
@ -7978,8 +7978,8 @@ sparc_issue_rate ()
}
static int
set_extends(x, insn)
rtx x, insn;
set_extends (insn)
rtx insn;
{
register rtx pat = PATTERN (insn);
@ -8003,27 +8003,40 @@ set_extends(x, insn)
return 1;
case AND:
{
rtx op0 = XEXP (SET_SRC (pat), 0);
rtx op1 = XEXP (SET_SRC (pat), 1);
if (GET_CODE (op1) == CONST_INT)
return INTVAL (op1) >= 0;
if (GET_CODE (XEXP (SET_SRC (pat), 0)) == REG
&& sparc_check_64 (XEXP (SET_SRC (pat), 0), insn) == 1)
return 1;
if (GET_CODE (op1) == REG
&& sparc_check_64 ((op1), insn) == 1)
if (GET_CODE (op0) != REG)
return 0;
if (sparc_check_64 (op0, insn) == 1)
return 1;
return (GET_CODE (op1) == REG && sparc_check_64 (op1, insn) == 1);
}
case IOR:
case XOR:
{
rtx op0 = XEXP (SET_SRC (pat), 0);
rtx op1 = XEXP (SET_SRC (pat), 1);
if (GET_CODE (op0) != REG || sparc_check_64 (op0, insn) <= 0)
return 0;
if (GET_CODE (op1) == CONST_INT)
return INTVAL (op1) >= 0;
return (GET_CODE (op1) == REG && sparc_check_64 (op1, insn) == 1);
}
case ASHIFT:
case LSHIFTRT:
return GET_MODE (SET_SRC (pat)) == SImode;
/* Positive integers leave the high bits zero. */
case CONST_DOUBLE:
return ! (CONST_DOUBLE_LOW (x) & 0x80000000);
return ! (CONST_DOUBLE_LOW (SET_SRC (pat)) & 0x80000000);
case CONST_INT:
return ! (INTVAL (x) & 0x80000000);
return ! (INTVAL (SET_SRC (pat)) & 0x80000000);
case ASHIFTRT:
case SIGN_EXTEND:
return - (GET_MODE (SET_SRC (pat)) == SImode);
case REG:
return sparc_check_64 (SET_SRC (pat), insn);
default:
return 0;
}
@ -8145,10 +8158,16 @@ sparc_check_64 (x, insn)
the single set and return the correct value or fail to recognize
it and return 0. */
int set_once = 0;
rtx y = x;
if (GET_CODE (x) == REG
&& flag_expensive_optimizations
&& REG_N_SETS (REGNO (x)) == 1)
if (GET_CODE (x) != REG)
abort ();
if (GET_MODE (x) == DImode)
y = gen_rtx_REG (SImode, REGNO (x) + WORDS_BIG_ENDIAN);
if (flag_expensive_optimizations
&& REG_N_SETS (REGNO (y)) == 1)
set_once = 1;
if (insn == 0)
@ -8178,8 +8197,10 @@ sparc_check_64 (x, insn)
if (GET_CODE (pat) != SET)
return 0;
if (rtx_equal_p (x, SET_DEST (pat)))
return set_extends (x, insn);
if (reg_overlap_mentioned_p (SET_DEST (pat), x))
return set_extends (insn);
if (y && rtx_equal_p (y, SET_DEST (pat)))
return set_extends (insn);
if (reg_overlap_mentioned_p (SET_DEST (pat), y))
return 0;
}
}
@ -8199,21 +8220,21 @@ sparc_v8plus_shift (operands, insn, opcode)
operands[3] = operands[0];
if (GET_CODE (operands[1]) == CONST_INT)
{
output_asm_insn ("mov %1,%3", operands);
output_asm_insn ("mov\t%1, %3", operands);
}
else
{
output_asm_insn ("sllx %H1,32,%3", operands);
output_asm_insn ("sllx\t%H1, 32, %3", operands);
if (sparc_check_64 (operands[1], insn) <= 0)
output_asm_insn ("srl %L1,0,%L1", operands);
output_asm_insn ("or %L1,%3,%3", operands);
output_asm_insn ("srl\t%L1, 0, %L1", operands);
output_asm_insn ("or\t%L1, %3, %3", operands);
}
strcpy(asm_code, opcode);
if (which_alternative != 2)
return strcat (asm_code, " %0,%2,%L0\n\tsrlx %L0,32,%H0");
return strcat (asm_code, "\t%0, %2, %L0\n\tsrlx\t%L0, 32, %H0");
else
return strcat (asm_code, " %3,%2,%3\n\tsrlx %3,32,%H0\n\tmov %3,%L0");
return strcat (asm_code, "\t%3, %2, %3\n\tsrlx\t%3, 32, %H0\n\tmov\t%3, %L0");
}
@ -8250,22 +8271,22 @@ sparc_function_profiler (file, labelno)
ASM_GENERATE_INTERNAL_LABEL (buf, "LP", labelno);
if (! TARGET_ARCH64)
fputs ("\tst\t%g2,[%fp-4]\n", file);
fputs ("\tst\t%g2, [%fp-4]\n", file);
fputs ("\tsethi\t%hi(", file);
assemble_name (file, buf);
fputs ("),%o0\n", file);
fputs ("), %o0\n", file);
fputs ("\tcall\t", file);
assemble_name (file, MCOUNT_FUNCTION);
putc ('\n', file);
fputs ("\t or\t%o0,%lo(", file);
fputs ("\t or\t%o0, %lo(", file);
assemble_name (file, buf);
fputs ("),%o0\n", file);
fputs ("), %o0\n", file);
if (! TARGET_ARCH64)
fputs ("\tld\t[%fp-4],%g2\n", file);
fputs ("\tld\t[%fp-4], %g2\n", file);
}
@ -8337,17 +8358,17 @@ sparc_function_block_profiler(file, block_or_label)
{
fputs ("\tsethi\t%hi(", file);
assemble_name (file, LPBX);
fputs ("),%o0\n", file);
fputs ("), %o0\n", file);
fprintf (file, "\tsethi\t%%hi(%d),%%o1\n", block_or_label);
fprintf (file, "\tsethi\t%%hi(%d), %%o1\n", block_or_label);
fputs ("\tor\t%o0,%lo(", file);
fputs ("\tor\t%o0, %lo(", file);
assemble_name (file, LPBX);
fputs ("),%o0\n", file);
fputs ("), %o0\n", file);
fprintf (file, "\tcall\t%s__bb_init_trace_func\n", user_label_prefix);
fprintf (file, "\t or\t%%o1,%%lo(%d),%%o1\n", block_or_label);
fprintf (file, "\t or\t%%o1, %%lo(%d), %%o1\n", block_or_label);
}
else if (profile_block_flag != 0)
{
@ -8356,11 +8377,11 @@ sparc_function_block_profiler(file, block_or_label)
fputs ("\tsethi\t%hi(", file);
assemble_name (file, LPBX);
fputs ("),%o0\n", file);
fputs ("), %o0\n", file);
fputs ("\tld\t[%lo(", file);
assemble_name (file, LPBX);
fputs (")+%o0],%o1\n", file);
fputs (")+%o0], %o1\n", file);
fputs ("\ttst\t%o1\n", file);
@ -8377,9 +8398,9 @@ sparc_function_block_profiler(file, block_or_label)
putc ('\n', file);
}
fputs ("\t or\t%o0,%lo(", file);
fputs ("\t or\t%o0, %lo(", file);
assemble_name (file, LPBX);
fputs ("),%o0\n", file);
fputs ("), %o0\n", file);
fprintf (file, "\tcall\t%s__bb_init_func\n\t nop\n", user_label_prefix);
@ -8464,27 +8485,27 @@ sparc_block_profiler(file, blockno)
{
ASM_GENERATE_INTERNAL_LABEL (LPBX, "LPBX", 0);
fprintf (file, "\tsethi\t%%hi(%s__bb),%%g1\n", user_label_prefix);
fprintf (file, "\tsethi\t%%hi(%d),%%g%d\n", blockno, bbreg);
fprintf (file, "\tor\t%%g1,%%lo(%s__bb),%%g1\n", user_label_prefix);
fprintf (file, "\tor\t%%g%d,%%lo(%d),%%g%d\n", bbreg, blockno, bbreg);
fprintf (file, "\tsethi\t%%hi(%s__bb), %%g1\n", user_label_prefix);
fprintf (file, "\tsethi\t%%hi(%d), %%g%d\n", blockno, bbreg);
fprintf (file, "\tor\t%%g1, %%lo(%s__bb), %%g1\n", user_label_prefix);
fprintf (file, "\tor\t%%g%d, %%lo(%d), %%g%d\n", bbreg, blockno, bbreg);
fprintf (file, "\tst\t%%g%d,[%%g1]\n", bbreg);
fprintf (file, "\tst\t%%g%d, [%%g1]\n", bbreg);
fputs ("\tsethi\t%hi(", file);
assemble_name (file, LPBX);
fprintf (file, "),%%g%d\n", bbreg);
fprintf (file, "), %%g%d\n", bbreg);
fputs ("\tor\t%o2,%lo(", file);
fputs ("\tor\t%o2, %lo(", file);
assemble_name (file, LPBX);
fprintf (file, "),%%g%d\n", bbreg);
fprintf (file, "), %%g%d\n", bbreg);
fprintf (file, "\tst\t%%g%d,[%%g1+4]\n", bbreg);
fprintf (file, "\tmov\t%%o7,%%g%d\n", bbreg);
fprintf (file, "\tst\t%%g%d, [%%g1 + 4]\n", bbreg);
fprintf (file, "\tmov\t%%o7, %%g%d\n", bbreg);
fprintf (file, "\tcall\t%s__bb_trace_func\n\t nop\n", user_label_prefix);
fprintf (file, "\tmov\t%%g%d,%%o7\n", bbreg);
fprintf (file, "\tmov\t%%g%d, %%o7\n", bbreg);
}
else if (profile_block_flag != 0)
{
@ -8492,18 +8513,18 @@ sparc_block_profiler(file, blockno)
fputs ("\tsethi\t%hi(", file);
assemble_name (file, LPBX);
fprintf (file, "+%d),%%g1\n", blockno*4);
fprintf (file, "+%d), %%g1\n", blockno*4);
fputs ("\tld\t[%g1+%lo(", file);
assemble_name (file, LPBX);
if (TARGET_ARCH64 && USE_AS_OFFSETABLE_LO10)
fprintf (file, ")+%d],%%g%d\n", blockno*4, bbreg);
fprintf (file, ")+%d], %%g%d\n", blockno*4, bbreg);
else
fprintf (file, "+%d)],%%g%d\n", blockno*4, bbreg);
fprintf (file, "+%d)], %%g%d\n", blockno*4, bbreg);
fprintf (file, "\tadd\t%%g%d,1,%%g%d\n", bbreg, bbreg);
fprintf (file, "\tadd\t%%g%d, 1, %%g%d\n", bbreg, bbreg);
fprintf (file, "\tst\t%%g%d,[%%g1+%%lo(", bbreg);
fprintf (file, "\tst\t%%g%d, [%%g1+%%lo(", bbreg);
assemble_name (file, LPBX);
if (TARGET_ARCH64 && USE_AS_OFFSETABLE_LO10)
fprintf (file, ")+%d]\n", blockno*4);

View File

@ -6088,7 +6088,7 @@
(define_insn "muldi3_v8plus"
[(set (match_operand:DI 0 "register_operand" "=r,h")
(mult:DI (match_operand:DI 1 "arith_double_operand" "%r,0")
(match_operand:DI 2 "arith_double_operand" "rHI,rHI")))
(match_operand:DI 2 "arith_double_operand" "rI,rI")))
(clobber (match_scratch:SI 3 "=&h,X"))
(clobber (match_scratch:SI 4 "=&h,X"))]
"TARGET_V8PLUS"
@ -6098,6 +6098,13 @@
output_asm_insn (\"srl\\t%L1, 0, %L1\", operands);
if (which_alternative == 1)
output_asm_insn (\"sllx\\t%H1, 32, %H1\", operands);
if (GET_CODE (operands[2]) == CONST_INT)
{
if (which_alternative == 1)
return \"or\\t%L1, %H1, %H1\\n\\tmulx\\t%H1, %2, %L0\;srlx\\t%L0, 32, %H0\";
else
return \"sllx\\t%H1, 32, %3\\n\\tor\\t%L1, %3, %3\\n\\tmulx\\t%3, %2, %3\\n\\tsrlx\\t%3, 32, %H0\\n\\tmov\\t%3, %L0\";
}
if (sparc_check_64 (operands[2], insn) <= 0)
output_asm_insn (\"srl\\t%L2, 0, %L2\", operands);
if (which_alternative == 1)

View File

@ -1,3 +1,7 @@
2000-11-25 Jakub Jelinek <jakub@redhat.com>
* gcc.dg/ultrasp3.c: New test.
2000-11-25 Neil Booth <neilb@earthling.net>
* gcc.dg/cpp/include2.c: Update test to be locale independent.

View File

@ -0,0 +1,36 @@
/* { dg-options "" } */
/* { dg-options "-mcpu=ultrasparc -mv8plus" { target sparc-*-* } } */
unsigned long long foo (unsigned long long x)
{
return 0x73500000735LL * x;
}
unsigned long long a, b;
unsigned long p;
unsigned long long bar (void)
{
unsigned long long c = a | b;
return 0x73500000735LL * c;
}
unsigned long long baz (void)
{
unsigned long long c = (p + 345) & -2;
return c * a;
}
main ()
{
if (foo (0x56789LL) != 0x26f32e5d26f32e5dLL)
abort ();
a = 0x8000000080000000LL;
b = 0x0000000180000001LL;
if (bar () != 0x120480000735LL)
abort ();
p = 0xffffffff;
if (baz () != 0xac00000000LL)
abort ();
exit (0);
}