qbe

Internal scc patchset buffer for QBE
Log | Files | Refs | README | LICENSE

commit 1162359a198ab6a18a734cb9f7955d0b28e342b6
parent c9f04db881e8ec0bb0beeba6274a5755c46cb534
Author: Alexey Yerin <yyp@disroot.org>
Date:   Sun, 12 Jun 2022 22:29:32 +0300

rv64: implement Oswap for floating-point types

Diffstat:
Mrv64/all.h | 11+++++++----
Mrv64/emit.c | 8+++++---
Mrv64/targ.c | 7+++----
3 files changed, 15 insertions(+), 11 deletions(-)

diff --git a/rv64/all.h b/rv64/all.h @@ -11,22 +11,25 @@ enum Rv64Reg { S1, S2, S3, S4, S5, S6, S7, S8, S9, S10, S11, /* globally live */ - FP, SP, GP, TP, RA, T6, + FP, SP, GP, TP, RA, /* FP caller-save */ - FT0, FT1, FT2, FT3, FT4, FT5, FT6, FT7, FT8, FT9, FT10, FT11, + FT0, FT1, FT2, FT3, FT4, FT5, FT6, FT7, FT8, FT9, FT10, FA0, FA1, FA2, FA3, FA4, FA5, FA6, FA7, /* FP callee-save */ FS0, FS1, FS2, FS3, FS4, FS5, FS6, FS7, FS8, FS9, FS10, FS11, + /* reserved (see rv64/emit.c) */ + T6, FT11, + NFPR = FS11 - FT0 + 1, - NGPR = T6 - T0 + 1, + NGPR = RA - T0 + 1, NGPS = A7 - T0 + 1, NFPS = FA7 - FT0 + 1, NCLR = (S11 - S1 + 1) + (FS11 - FS0 + 1), }; -MAKESURE(reg_not_tmp, FS11 < (int)Tmp0); +MAKESURE(reg_not_tmp, FT11 < (int)Tmp0); struct Rv64Op { char imm; diff --git a/rv64/emit.c b/rv64/emit.c @@ -89,6 +89,7 @@ static struct { { Ocopy, Ki, "mv %=, %0" }, { Ocopy, Ka, "fmv.%k %=, %0" }, { Oswap, Ki, "mv %?, %0\n\tmv %0, %1\n\tmv %1, %?" }, + { Oswap, Ka, "fmv.%k %?, %0\n\tfmv.%k %0, %1\n\tfmv.%k %1, %?" }, { Oreqz, Ki, "seqz %=, %0" }, { Ornez, Ki, "snez %=, %0" }, { Ocall, Kw, "jalr %0" }, @@ -101,16 +102,17 @@ static char *rname[] = { [GP] = "gp", [TP] = "tp", [RA] = "ra", - [T6] = "t6", [T0] = "t0", "t1", "t2", "t3", "t4", "t5", [A0] = "a0", "a1", "a2", "a3", "a4", "a5", "a6", "a7", [S1] = "s1", "s2", "s3", "s4", "s5", "s6", "s7", "s8", "s9", "s10", "s11", [FT0] = "ft0", "ft1", "ft2", "ft3", "ft4", "ft5", "ft6", "ft7", - "ft8", "ft9", "ft10", "ft11", + "ft8", "ft9", "ft10", [FA0] = "fa0", "fa1", "fa2", "fa3", "fa4", "fa5", "fa6", "fa7", [FS0] = "fs0", "fs1", "fs2", "fs3", "fs4", "fs5", "fs6", "fs7", "fs8", "fs9", "fs10", "fs11", + [T6] = "t6", + [FT11] = "ft11", }; static int64_t @@ -162,7 +164,7 @@ emitf(char *s, Ins *i, Fn *fn, FILE *f) if (KBASE(k) == 0) fputs("t6", f); else - abort(); + fputs("ft11", f); break; case 'k': if (i->cls != Kl) diff --git a/rv64/targ.c b/rv64/targ.c @@ -11,7 +11,7 @@ int rv64_rsave[] = { A0, A1, A2, A3, A4, A5, A6, A7, FA0, FA1, FA2, FA3, FA4, FA5, FA6, FA7, FT0, FT1, FT2, FT3, FT4, FT5, FT6, FT7, - FT8, FT9, FT10, FT11, + FT8, FT9, FT10, -1 }; int rv64_rclob[] = { @@ -22,8 +22,7 @@ int rv64_rclob[] = { -1 }; -/* T6 used as swap register (TODO: is there a better choice?) */ -#define RGLOB (BIT(FP) | BIT(SP) | BIT(GP) | BIT(TP) | BIT(RA) | BIT(T6)) +#define RGLOB (BIT(FP) | BIT(SP) | BIT(GP) | BIT(TP) | BIT(RA)) static int rv64_memargs(int op) @@ -39,7 +38,7 @@ Target T_rv64 = { .fpr0 = FT0, .nfpr = NFPR, .rglob = RGLOB, - .nrglob = 6, + .nrglob = 5, .rsave = rv64_rsave, .nrsave = {NGPS, NFPS}, .retregs = rv64_retregs,