JALR_REGS, JALR_REGS, JALR_REGS, JALR_REGS,
JALR_REGS, JALR_REGS, JALR_REGS, JALR_REGS,
SIBCALL_REGS, SIBCALL_REGS, SIBCALL_REGS, SIBCALL_REGS,
- FP_REGS, FP_REGS, FP_REGS, FP_REGS,
- FP_REGS, FP_REGS, FP_REGS, FP_REGS,
- FP_REGS, FP_REGS, FP_REGS, FP_REGS,
- FP_REGS, FP_REGS, FP_REGS, FP_REGS,
- FP_REGS, FP_REGS, FP_REGS, FP_REGS,
- FP_REGS, FP_REGS, FP_REGS, FP_REGS,
- FP_REGS, FP_REGS, FP_REGS, FP_REGS,
- FP_REGS, FP_REGS, FP_REGS, FP_REGS,
+ RVC_FP_REGS, RVC_FP_REGS, RVC_FP_REGS, RVC_FP_REGS,
+ RVC_FP_REGS, RVC_FP_REGS, RVC_FP_REGS, RVC_FP_REGS,
+ RVC_FP_REGS, RVC_FP_REGS, RVC_FP_REGS, RVC_FP_REGS,
+ RVC_FP_REGS, RVC_FP_REGS, RVC_FP_REGS, RVC_FP_REGS,
+ RVC_FP_REGS, RVC_FP_REGS, RVC_FP_REGS, RVC_FP_REGS,
+ RVC_FP_REGS, RVC_FP_REGS, RVC_FP_REGS, RVC_FP_REGS,
+ RVC_FP_REGS, RVC_FP_REGS, RVC_FP_REGS, RVC_FP_REGS,
+ RVC_FP_REGS, RVC_FP_REGS, RVC_FP_REGS, RVC_FP_REGS,
FRAME_REGS, FRAME_REGS, NO_REGS, NO_REGS,
NO_REGS, NO_REGS, NO_REGS, NO_REGS,
NO_REGS, NO_REGS, NO_REGS, NO_REGS,
riscv_secondary_memory_needed (machine_mode mode, reg_class_t class1,
reg_class_t class2)
{
+ bool class1_is_fpr = class1 == FP_REGS || class1 == RVC_FP_REGS;
+ bool class2_is_fpr = class2 == FP_REGS || class2 == RVC_FP_REGS;
return (!riscv_v_ext_mode_p (mode)
&& GET_MODE_SIZE (mode).to_constant () > UNITS_PER_WORD
- && (class1 == FP_REGS) != (class2 == FP_REGS)
+ && (class1_is_fpr != class2_is_fpr)
&& !TARGET_XTHEADFMV
&& !TARGET_ZFA);
}
riscv_register_move_cost (machine_mode mode,
reg_class_t from, reg_class_t to)
{
- if ((from == FP_REGS && to == GR_REGS) ||
- (from == GR_REGS && to == FP_REGS))
+ bool from_is_fpr = from == FP_REGS || from == RVC_FP_REGS;
+ bool from_is_gpr = from == GR_REGS || from == RVC_GR_REGS;
+ bool to_is_fpr = to == FP_REGS || to == RVC_FP_REGS;
+ bool to_is_gpr = to == GR_REGS || to == RVC_GR_REGS;
+ if ((from_is_fpr && to == to_is_gpr) ||
+ (from_is_gpr && to_is_fpr))
return tune_param->fmv_cost;
if (from == V_REGS)
{
NO_REGS, /* no registers in set */
SIBCALL_REGS, /* registers used by indirect sibcalls */
+ RVC_GR_REGS, /* RVC general registers */
JALR_REGS, /* registers used by indirect calls */
GR_REGS, /* integer registers */
+ RVC_FP_REGS, /* RVC floating-point registers */
FP_REGS, /* floating-point registers */
FRAME_REGS, /* arg pointer and frame pointer */
VM_REGS, /* v0.t registers */
{ \
"NO_REGS", \
"SIBCALL_REGS", \
+ "RVC_GR_REGS", \
"JALR_REGS", \
"GR_REGS", \
+ "RVC_FP_REGS", \
"FP_REGS", \
"FRAME_REGS", \
"VM_REGS", \
{ \
{ 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, /* NO_REGS */ \
{ 0xf003fcc0, 0x00000000, 0x00000000, 0x00000000 }, /* SIBCALL_REGS */ \
+ { 0x0000ff00, 0x00000000, 0x00000000, 0x00000000 }, /* RVC_GR_REGS */ \
{ 0xffffffc0, 0x00000000, 0x00000000, 0x00000000 }, /* JALR_REGS */ \
{ 0xffffffff, 0x00000000, 0x00000000, 0x00000000 }, /* GR_REGS */ \
+ { 0x00000000, 0x0000ff00, 0x00000000, 0x00000000 }, /* RVC_FP_REGS */ \
{ 0x00000000, 0xffffffff, 0x00000000, 0x00000000 }, /* FP_REGS */ \
{ 0x00000000, 0x00000000, 0x00000003, 0x00000000 }, /* FRAME_REGS */ \
{ 0x00000000, 0x00000000, 0x00000000, 0x00000001 }, /* V0_REGS */ \