(i960_output_ldconst): New code for XFmode.
Also, move SFmode code to immediately after DFmode code. (S_MODES, D_MODES): Handle XFmode. (XF_MODES): Was TF_MODES, handle XFmode instead of TFmode. (hard_regno_mode_ok): Replace TFmode with XFmode. (i960_output_long_double): New function. From-SVN: r9738
This commit is contained in:
parent
c19a80671b
commit
37aba8501f
@ -570,8 +570,8 @@ emit_move_sequence (operands, mode)
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* Emit insns to load a constant. Uses several strategies to try to use
|
||||
as few insns as possible. */
|
||||
/* Emit insns to load a constant to non-floating point registers.
|
||||
Uses several strategies to try to use as few insns as possible. */
|
||||
|
||||
char *
|
||||
i960_output_ldconst (dst, src)
|
||||
@ -593,6 +593,30 @@ i960_output_ldconst (dst, src)
|
||||
output_asm_insn ("ldconst %1,%0", operands);
|
||||
return "";
|
||||
}
|
||||
else if (mode == XFmode)
|
||||
{
|
||||
REAL_VALUE_TYPE d;
|
||||
long value_long[3];
|
||||
int i;
|
||||
|
||||
if (fp_literal_zero (src, XFmode))
|
||||
return "movt 0,%0";
|
||||
|
||||
REAL_VALUE_FROM_CONST_DOUBLE (d, src);
|
||||
REAL_VALUE_TO_TARGET_LONG_DOUBLE (d, value_long);
|
||||
|
||||
output_asm_insn ("# ldconst %1,%0",operands);
|
||||
|
||||
for (i = 0; i < 3; i++)
|
||||
{
|
||||
operands[0] = gen_rtx (REG, SImode, REGNO (dst) + i);
|
||||
operands[1] = GEN_INT (value_long[i]);
|
||||
output_asm_insn (i960_output_ldconst (operands[0], operands[1]),
|
||||
operands);
|
||||
}
|
||||
|
||||
return "";
|
||||
}
|
||||
else if (mode == DFmode)
|
||||
{
|
||||
rtx first, second;
|
||||
@ -614,6 +638,21 @@ i960_output_ldconst (dst, src)
|
||||
operands);
|
||||
return "";
|
||||
}
|
||||
else if (mode == SFmode)
|
||||
{
|
||||
REAL_VALUE_TYPE d;
|
||||
long value;
|
||||
|
||||
REAL_VALUE_FROM_CONST_DOUBLE (d, src);
|
||||
REAL_VALUE_TO_TARGET_SINGLE (d, value);
|
||||
|
||||
output_asm_insn ("# ldconst %1,%0",operands);
|
||||
operands[0] = gen_rtx (REG, SImode, REGNO (dst));
|
||||
operands[1] = gen_rtx (CONST_INT, VOIDmode, value);
|
||||
output_asm_insn (i960_output_ldconst (operands[0], operands[1]),
|
||||
operands);
|
||||
return "";
|
||||
}
|
||||
else if (mode == TImode)
|
||||
{
|
||||
/* ??? This is currently not handled at all. */
|
||||
@ -650,21 +689,6 @@ i960_output_ldconst (dst, src)
|
||||
xoperands);
|
||||
/* The lower word is emitted as normally. */
|
||||
}
|
||||
else if (mode == SFmode)
|
||||
{
|
||||
REAL_VALUE_TYPE d;
|
||||
long value;
|
||||
|
||||
REAL_VALUE_FROM_CONST_DOUBLE (d, src);
|
||||
REAL_VALUE_TO_TARGET_SINGLE (d, value);
|
||||
|
||||
output_asm_insn ("# ldconst %1,%0",operands);
|
||||
operands[0] = gen_rtx (REG, SImode, REGNO (dst));
|
||||
operands[1] = gen_rtx (CONST_INT, VOIDmode, value);
|
||||
output_asm_insn (i960_output_ldconst (operands[0], operands[1]),
|
||||
operands);
|
||||
return "";
|
||||
}
|
||||
else
|
||||
{
|
||||
rsrc1 = INTVAL (src);
|
||||
@ -1851,12 +1875,12 @@ i960_alignment (size, align)
|
||||
#define S_MODES \
|
||||
(~C_MODES \
|
||||
& ~ ((1 << (int) DImode) | (1 << (int) TImode) \
|
||||
| (1 << (int) DFmode) | (1 << (int) TFmode)))
|
||||
| (1 << (int) DFmode) | (1 << (int) XFmode)))
|
||||
|
||||
/* Modes for double-word (and smaller) quantities. */
|
||||
#define D_MODES \
|
||||
(~C_MODES \
|
||||
& ~ ((1 << (int) TImode) | (1 << (int) TFmode)))
|
||||
& ~ ((1 << (int) TImode) | (1 << (int) XFmode)))
|
||||
|
||||
/* Modes for quad-word quantities. */
|
||||
#define T_MODES (~C_MODES)
|
||||
@ -1868,7 +1892,7 @@ i960_alignment (size, align)
|
||||
#define DF_MODES (SF_MODES | (1 << (int) DFmode) | (1 << (int) SCmode))
|
||||
|
||||
/* Modes for quad-float quantities. */
|
||||
#define TF_MODES (DF_MODES | (1 << (int) TFmode) | (1 << (int) DCmode))
|
||||
#define XF_MODES (DF_MODES | (1 << (int) XFmode) | (1 << (int) DCmode))
|
||||
|
||||
unsigned int hard_regno_mode_ok[FIRST_PSEUDO_REGISTER] = {
|
||||
T_MODES, S_MODES, D_MODES, S_MODES, T_MODES, S_MODES, D_MODES, S_MODES,
|
||||
@ -1876,7 +1900,7 @@ unsigned int hard_regno_mode_ok[FIRST_PSEUDO_REGISTER] = {
|
||||
T_MODES, S_MODES, D_MODES, S_MODES, T_MODES, S_MODES, D_MODES, S_MODES,
|
||||
T_MODES, S_MODES, D_MODES, S_MODES, T_MODES, S_MODES, D_MODES, S_MODES,
|
||||
|
||||
TF_MODES, TF_MODES, TF_MODES, TF_MODES, C_MODES};
|
||||
XF_MODES, XF_MODES, XF_MODES, XF_MODES, C_MODES};
|
||||
|
||||
|
||||
/* Return the minimum alignment of an expression rtx X in bytes. This takes
|
||||
@ -2104,6 +2128,23 @@ i960_function_arg (cum, mode, type, named)
|
||||
|
||||
/* Floating-point support. */
|
||||
|
||||
void
|
||||
i960_output_long_double (file, value)
|
||||
FILE *file;
|
||||
REAL_VALUE_TYPE value;
|
||||
{
|
||||
long value_long[3];
|
||||
char dstr[30];
|
||||
|
||||
REAL_VALUE_TO_TARGET_LONG_DOUBLE (value, value_long);
|
||||
REAL_VALUE_TO_DECIMAL (value, "%.20g", dstr);
|
||||
|
||||
fprintf (file,
|
||||
"\t.word\t0x%08lx\t\t# %s\n\t.word\t0x%08lx\n\t.word\t0x%08lx\n",
|
||||
value_long[0], dstr, value_long[1], value_long[2]);
|
||||
fprintf (file, "\t.word\t0x0\n");
|
||||
}
|
||||
|
||||
void
|
||||
i960_output_double (file, value)
|
||||
FILE *file;
|
||||
|
Loading…
Reference in New Issue
Block a user