aboutsummaryrefslogtreecommitdiffhomepage
path: root/aarch64/isel.c
diff options
context:
space:
mode:
authorlemon <lsof@mailbox.org>2025-12-31 17:06:44 +0100
committerlemon <lsof@mailbox.org>2025-12-31 17:18:56 +0100
commit6969a59985115385974adc4464de972bd10ac9e0 (patch)
treec236ab01e95c357cbd02ad05b289ea55eb1a84a3 /aarch64/isel.c
parent97c6d5c44f30b29b52d1dc431ab9f2df4bb47fd2 (diff)
aarch64 floats
Diffstat (limited to 'aarch64/isel.c')
-rw-r--r--aarch64/isel.c12
1 files changed, 11 insertions, 1 deletions
diff --git a/aarch64/isel.c b/aarch64/isel.c
index 2e82361..b65f87a 100644
--- a/aarch64/isel.c
+++ b/aarch64/isel.c
@@ -99,6 +99,16 @@ fixarg(union ref *r, struct instr *ins, struct block *blk, int *curi)
}
}
goto Reg;
+ } else if (isfltcon(*r)) {
+ enum irclass k = concls(*r), ki = KI32 + k-KF32;
+ if (conht[r->i].f != 0.0) {
+ union ref gpr = insertinstr(blk, (*curi)++, mkinstr(Ocopy, ki, mkintcon(ki, conht[r->i].i)));
+ *r = insertinstr(blk, (*curi)++, mkinstr(Ocopy, k, gpr));
+ } else if (oiscmp(op)) {
+ return;
+ } else {
+ *r = insertinstr(blk, (*curi)++, mkinstr(Ocopy, k, *r));
+ }
} else if (r->t == RSTACK) {
struct instr adr = mkinstr(Oadd, KPTR, mkref(RREG, FP), mkintcon(KI32, -r->i));
if (op == Ocopy)
@@ -303,7 +313,7 @@ static const uchar storesz[] = {
static void
loadstoreaddr(struct block *blk, union ref *r, int *curi, enum op op)
{
- uint siz = oisload(op) ? loadsz[op] : storesz[op];
+ uint siz = oisload(op) ? loadsz[op-Oloads8] : storesz[op-Ostorei8];
if (isimm32(*r)) {
*r = mkaddr((struct addr){.base = *r});
} else if (isaddrcon(*r, 0)) {