hi,
I'm trying to learn mips backend by making some changes to it.I
just tried to decrease the number of general purpose registers to 25
but following error was generated.
dp-bit.c: In function '__muldf3':
dp-bit.c:953: error: insn does not satisfy its constraints:
(insn 677 231 616 19 dp-bit.c:871 (set (reg/v:DI 24 $24 [orig:55 res2 ] [55])
(reg:DI 2 $2)) 3 {*movdi_32bit} (nil)
(nil))
dp-bit.c:953: internal compiler error: in
reload_cse_simplify_operands, at postreload.c:394
I'm compiling the code by setting -msoft-float option and no floating
point register is being used.
Following are the changes made to mips backend
/*25 general purpose ,2 accumulator, 3 fake ,3 dummy entries *\
#define FIRST_PSEUDO_REGISTER 33
#define FIXED_REGISTERS \
{ \
1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \
0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, \
0, \
}
#define CALL_USED_REGISTERS \
{ \
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, \
0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 1, 1, 0, 0, \
0, \
}
#define GP_REG_FIRST 0
#define GP_REG_LAST 24
#define GP_REG_NUM (GP_REG_LAST - GP_REG_FIRST + 1)
#define GP_DBX_FIRST 0
#define MD_REG_FIRST 26
#define MD_REG_LAST 27
#define MD_REG_NUM (MD_REG_LAST - MD_REG_FIRST + 1)
#define MD_DBX_FIRST 25
#define AT_REGNUM (GP_REG_FIRST + 1)
#define HI_REGNUM (MD_REG_FIRST + 0)
#define LO_REGNUM (MD_REG_FIRST + 1)
enum reg_class
{
NO_REGS, /* no registers in set */
PIC_FN_ADDR_REG, /* SVR4 PIC function address register */
V1_REG, /* Register $v1 ($3) used for TLS access. */
LEA_REGS, /* Every GPR except $25 */
GR_REGS, /* integer registers */
HI_REG, /* hi register */
LO_REG, /* lo register */
MD_REGS, /* multiply/divide registers (hi/lo) */
HI_AND_GR_REGS, /* union classes */
LO_AND_GR_REGS,
ALL_REGS, /* all registers */
LIM_REG_CLASSES /* max value + 1 */
};
#define REG_CLASS_CONTENTS
\
{
\
{ 0x00000000, 0x00000000, }, /* no registers */ \
{ 0x00040000, 0x00000000, }, /* SVR4 PIC function address register $18*/ \
{ 0x00000008, 0x00000000, }, /* only $v1 */ \
{ 0x01bfffff, 0x00000000, }, /* Every other GPR except $18 */ \
{ 0x01ffffff, 0x00000000, }, /* integer registers */ \
{ 0x04000000, 0x00000000, }, /* hi register */ \
{ 0x08000000, 0x00000000, }, /* lo register */ \
{ 0x0c000000, 0x00000000, }, /* mul/div registers */ \
{ 0x05ffffff, 0x00000000, }, /* union classes */ \
{ 0x09ffffff, 0x00000000, }, \
{ 0xffffffff, 0x00000001, } /* all registers */ \
}
#define REGISTER_NAMES \
{ "$0", "$1", "$2", "$3", "$4", "$5", "$6", "$7", \
"$8", "$9", "$10", "$11", "$12", "$13", "$14", "$15", \
"$16", "$17", "$18", "$19", "$20", "$21", "$sp", "$fp", \
"$24", "", "hi", "lo", "$arg", "$frame", "", "", \
"", \
}
#define ADDITIONAL_REGISTER_NAMES \
{ \
{ "$22", 22 + GP_REG_FIRST }, \
{ "$23", 23 + GP_REG_FIRST }, \
{ "at", 1 + GP_REG_FIRST }, \
{ "v0", 2 + GP_REG_FIRST }, \
{ "v1", 3 + GP_REG_FIRST }, \
{ "a0", 4 + GP_REG_FIRST }, \
{ "a1", 5 + GP_REG_FIRST }, \
{ "a2", 6 + GP_REG_FIRST }, \
{ "a3", 7 + GP_REG_FIRST }, \
{ "t0", 8 + GP_REG_FIRST }, \
{ "t1", 9 + GP_REG_FIRST }, \
{ "t2", 10 + GP_REG_FIRST }, \
{ "t3", 11 + GP_REG_FIRST }, \
{ "t4", 12 + GP_REG_FIRST }, \
{ "t5", 13 + GP_REG_FIRST }, \
{ "t6", 14 + GP_REG_FIRST }, \
{ "t7", 15 + GP_REG_FIRST }, \
{ "s0", 16 + GP_REG_FIRST }, \
{ "s1", 17 + GP_REG_FIRST }, \
{ "s2", 18 + GP_REG_FIRST }, \
{ "s3", 19 + GP_REG_FIRST }, \
{ "s4", 20 + GP_REG_FIRST }, \
{ "gp", 21 + GP_REG_FIRST }, \
{ "sp", 22 + GP_REG_FIRST }, \
{ "fp", 23 + GP_REG_FIRST }, \
{ "ra", 24 + GP_REG_FIRST }, \
ALL_COP_ADDITIONAL_REGISTER_NAMES \
}
/* Register to use for pushing function arguments. */
#define STACK_POINTER_REGNUM (GP_REG_FIRST + 22)
/* These two registers don't really exist: they get eliminated to either
the stack or hard frame pointer. */
#define ARG_POINTER_REGNUM 28
#define FRAME_POINTER_REGNUM 29
/* $30 is not available on the mips16, so we use $17 as the frame
pointer. */
#define HARD_FRAME_POINTER_REGNUM GP_REG_FIRST + 23
#define ELIMINABLE_REGS \
{{ ARG_POINTER_REGNUM, STACK_POINTER_REGNUM}, \
{ ARG_POINTER_REGNUM, GP_REG_FIRST + 23}, \
{ FRAME_POINTER_REGNUM, STACK_POINTER_REGNUM}, \
{ FRAME_POINTER_REGNUM, GP_REG_FIRST + 23}} \
In mips.c file following changes are made
const enum reg_class mips_regno_to_class[] =
{
LEA_REGS, LEA_REGS, LEA_REGS, V1_REG,
LEA_REGS, LEA_REGS, LEA_REGS, LEA_REGS,
LEA_REGS, LEA_REGS, LEA_REGS, LEA_REGS,
LEA_REGS, LEA_REGS, LEA_REGS, LEA_REGS,
LEA_REGS, LEA_REGS, PIC_FN_ADDR_REG, LEA_REGS,
LEA_REGS, LEA_REGS, LEA_REGS, LEA_REGS,
LEA_REGS, HI_REG, LO_REG, ALL_REGS,
ALL_REGS, ALL_REGS, ALL_REGS, ALL_REGS,
ALL_REGS,
};
and replaced the $31 with $24.
Would you please tell me what might be the cause of error.When i
comment out FLO_type
multiply (FLO_type arg_a, FLO_type arg_b) function in dp-bit.c file
,everything compiles successfully.
thanks,
shaz