Skip to content

Commit 986b697

Browse files
kito-chengstephanosio
authored andcommitted
RISC-V: Add cr and cf constraint
gcc/ChangeLog: * config/riscv/constraints.md (cr): New. (cf): New. * config/riscv/riscv.h (reg_class): Add RVC_GR_REGS and RVC_FP_REGS. (REG_CLASS_NAMES): Ditto. (REG_CLASS_CONTENTS): Ditto. * doc/md.texi: Document cr and cf constraint. * config/riscv/riscv.cc (riscv_regno_to_class): Update FP_REGS to RVC_FP_REGS since it smaller set. (riscv_secondary_memory_needed): Handle RVC_FP_REGS. (riscv_register_move_cost): Ditto. gcc/testsuite/ChangeLog: * gcc.target/riscv/constraint-cf-zfinx.c: New. * gcc.target/riscv/constraint-cf.c: New. * gcc.target/riscv/constraint-cr.c: New. (cherry picked from commit 4688857)
1 parent eff9536 commit 986b697

File tree

7 files changed

+77
-11
lines changed

7 files changed

+77
-11
lines changed

gcc/config/riscv/constraints.md

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,12 @@
3333
(define_register_constraint "l" "JALR_REGS"
3434
"@internal")
3535

36+
(define_register_constraint "cr" "RVC_GR_REGS"
37+
"RVC general purpose register (x8-x15).")
38+
39+
(define_register_constraint "cf" "TARGET_HARD_FLOAT ? RVC_FP_REGS : (TARGET_ZFINX ? RVC_GR_REGS : NO_REGS)"
40+
"RVC floating-point registers (f8-f15), if available, reuse GPR as FPR when use zfinx.")
41+
3642
;; General constraints
3743

3844
(define_constraint "I"

gcc/config/riscv/riscv.cc

Lines changed: 17 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -333,14 +333,14 @@ const enum reg_class riscv_regno_to_class[FIRST_PSEUDO_REGISTER] = {
333333
JALR_REGS, JALR_REGS, JALR_REGS, JALR_REGS,
334334
JALR_REGS, JALR_REGS, JALR_REGS, JALR_REGS,
335335
SIBCALL_REGS, SIBCALL_REGS, SIBCALL_REGS, SIBCALL_REGS,
336-
FP_REGS, FP_REGS, FP_REGS, FP_REGS,
337-
FP_REGS, FP_REGS, FP_REGS, FP_REGS,
338-
FP_REGS, FP_REGS, FP_REGS, FP_REGS,
339-
FP_REGS, FP_REGS, FP_REGS, FP_REGS,
340-
FP_REGS, FP_REGS, FP_REGS, FP_REGS,
341-
FP_REGS, FP_REGS, FP_REGS, FP_REGS,
342-
FP_REGS, FP_REGS, FP_REGS, FP_REGS,
343-
FP_REGS, FP_REGS, FP_REGS, FP_REGS,
336+
RVC_FP_REGS, RVC_FP_REGS, RVC_FP_REGS, RVC_FP_REGS,
337+
RVC_FP_REGS, RVC_FP_REGS, RVC_FP_REGS, RVC_FP_REGS,
338+
RVC_FP_REGS, RVC_FP_REGS, RVC_FP_REGS, RVC_FP_REGS,
339+
RVC_FP_REGS, RVC_FP_REGS, RVC_FP_REGS, RVC_FP_REGS,
340+
RVC_FP_REGS, RVC_FP_REGS, RVC_FP_REGS, RVC_FP_REGS,
341+
RVC_FP_REGS, RVC_FP_REGS, RVC_FP_REGS, RVC_FP_REGS,
342+
RVC_FP_REGS, RVC_FP_REGS, RVC_FP_REGS, RVC_FP_REGS,
343+
RVC_FP_REGS, RVC_FP_REGS, RVC_FP_REGS, RVC_FP_REGS,
344344
FRAME_REGS, FRAME_REGS, NO_REGS, NO_REGS,
345345
NO_REGS, NO_REGS, NO_REGS, NO_REGS,
346346
NO_REGS, NO_REGS, NO_REGS, NO_REGS,
@@ -8425,9 +8425,11 @@ static bool
84258425
riscv_secondary_memory_needed (machine_mode mode, reg_class_t class1,
84268426
reg_class_t class2)
84278427
{
8428+
bool class1_is_fpr = class1 == FP_REGS || class1 == RVC_FP_REGS;
8429+
bool class2_is_fpr = class2 == FP_REGS || class2 == RVC_FP_REGS;
84288430
return (!riscv_v_ext_mode_p (mode)
84298431
&& GET_MODE_SIZE (mode).to_constant () > UNITS_PER_WORD
8430-
&& (class1 == FP_REGS) != (class2 == FP_REGS)
8432+
&& (class1_is_fpr != class2_is_fpr)
84318433
&& !TARGET_XTHEADFMV
84328434
&& !TARGET_ZFA);
84338435
}
@@ -8438,8 +8440,12 @@ static int
84388440
riscv_register_move_cost (machine_mode mode,
84398441
reg_class_t from, reg_class_t to)
84408442
{
8441-
if ((from == FP_REGS && to == GR_REGS) ||
8442-
(from == GR_REGS && to == FP_REGS))
8443+
bool from_is_fpr = from == FP_REGS || from == RVC_FP_REGS;
8444+
bool from_is_gpr = from == GR_REGS || from == RVC_GR_REGS;
8445+
bool to_is_fpr = to == FP_REGS || to == RVC_FP_REGS;
8446+
bool to_is_gpr = to == GR_REGS || to == RVC_GR_REGS;
8447+
if ((from_is_fpr && to == to_is_gpr) ||
8448+
(from_is_gpr && to_is_fpr))
84438449
return tune_param->fmv_cost;
84448450

84458451
return riscv_secondary_memory_needed (mode, from, to) ? 8 : 2;

gcc/config/riscv/riscv.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -508,8 +508,10 @@ enum reg_class
508508
{
509509
NO_REGS, /* no registers in set */
510510
SIBCALL_REGS, /* registers used by indirect sibcalls */
511+
RVC_GR_REGS, /* RVC general registers */
511512
JALR_REGS, /* registers used by indirect calls */
512513
GR_REGS, /* integer registers */
514+
RVC_FP_REGS, /* RVC floating-point registers */
513515
FP_REGS, /* floating-point registers */
514516
FRAME_REGS, /* arg pointer and frame pointer */
515517
VM_REGS, /* v0.t registers */
@@ -531,8 +533,10 @@ enum reg_class
531533
{ \
532534
"NO_REGS", \
533535
"SIBCALL_REGS", \
536+
"RVC_GR_REGS", \
534537
"JALR_REGS", \
535538
"GR_REGS", \
539+
"RVC_FP_REGS", \
536540
"FP_REGS", \
537541
"FRAME_REGS", \
538542
"VM_REGS", \
@@ -556,8 +560,10 @@ enum reg_class
556560
{ \
557561
{ 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, /* NO_REGS */ \
558562
{ 0xf003fcc0, 0x00000000, 0x00000000, 0x00000000 }, /* SIBCALL_REGS */ \
563+
{ 0x0000ff00, 0x00000000, 0x00000000, 0x00000000 }, /* RVC_GR_REGS */ \
559564
{ 0xffffffc0, 0x00000000, 0x00000000, 0x00000000 }, /* JALR_REGS */ \
560565
{ 0xffffffff, 0x00000000, 0x00000000, 0x00000000 }, /* GR_REGS */ \
566+
{ 0x00000000, 0x0000ff00, 0x00000000, 0x00000000 }, /* RVC_FP_REGS */ \
561567
{ 0x00000000, 0xffffffff, 0x00000000, 0x00000000 }, /* FP_REGS */ \
562568
{ 0x00000000, 0x00000000, 0x00000003, 0x00000000 }, /* FRAME_REGS */ \
563569
{ 0x00000000, 0x00000000, 0x00000000, 0x00000001 }, /* V0_REGS */ \

gcc/doc/md.texi

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3721,6 +3721,13 @@ A vector register, excluding v0 (if available).
37213721
@item vm
37223722
A vector register, only v0 (if available).
37233723

3724+
@item cr
3725+
RVC general purpose register (x8-x15).
3726+
3727+
@item cf
3728+
RVC floating-point registers (f8-f15), if available, reuse GPR as FPR when use
3729+
zfinx.
3730+
37243731
@end table
37253732

37263733
@item RX---@file{config/rx/constraints.md}
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
/* { dg-do compile } */
2+
/* { dg-skip-if "" { *-*-* } { "-flto" } { "" } } */
3+
/* { dg-options "-march=rv64i_zfinx -mabi=lp64" } */
4+
/* { dg-final { check-function-bodies "**" "" } } */
5+
6+
void foo(float a0, float a1, float a2, float a3, float a4, float a5, float a6, float a7, float m0, float m1) {
7+
/*
8+
** foo:
9+
** ...
10+
** fadd.s\s*t0,\s*(a[0-5]|s[0-1]),\s*(a[0-5]|s[0-1])
11+
** ...
12+
*/
13+
__asm__ volatile("fadd.s t0, %0, %0" : : "cf" (m0));
14+
}
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
/* { dg-do compile } */
2+
/* { dg-skip-if "" { *-*-* } { "-flto" } { "" } } */
3+
/* { dg-options "-march=rv64if -mabi=lp64" } */
4+
/* { dg-final { check-function-bodies "**" "" } } */
5+
6+
void foo(float a0, float a1, float a2, float a3, float a4, float a5, float a6, float a7, float m0, float m1) {
7+
/*
8+
** foo:
9+
** ...
10+
** fadd.s\s*ft0,\s*f(a[0-5]|s[0-1]),\s*f(a[0-5]|s[0-1])
11+
** ...
12+
*/
13+
__asm__ volatile("fadd.s ft0, %0, %0" : : "cf" (m0));
14+
}
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
/* { dg-do compile } */
2+
/* { dg-skip-if "" { *-*-* } { "-flto" } { "" } } */
3+
/* { dg-final { check-function-bodies "**" "" } } */
4+
5+
void foo(int a0, int a1, int a2, int a3, int a4, int a5, int a6, int a7, int m0, int m1) {
6+
/*
7+
** foo:
8+
** ...
9+
** addi\s*t0,\s*(a[0-5]|s[0-1]),\s*(a[0-5]|s[0-1])
10+
** ...
11+
*/
12+
__asm__ volatile("addi t0, %0, %0" : : "cr" (m0) : "memory");
13+
}

0 commit comments

Comments
 (0)