From d4ce962fe33f3eca8da0b4ab2b5a81cc5359b71f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sigrid=20Solveig=20Hafl=C3=ADnud=C3=B3ttir?= Date: Tue, 16 May 2023 15:39:00 +0000 Subject: 7l: use floating point immediates where possible --- sys/src/cmd/7l/asm.c | 30 ++++++++++-------------------- sys/src/cmd/7l/asmout.c | 11 +++++------ 2 files changed, 15 insertions(+), 26 deletions(-) (limited to 'sys/src') diff --git a/sys/src/cmd/7l/asm.c b/sys/src/cmd/7l/asm.c index 0b3b444fa..399a037b2 100644 --- a/sys/src/cmd/7l/asm.c +++ b/sys/src/cmd/7l/asm.c @@ -589,27 +589,17 @@ datblk(long s, long n, int str) write(cout, buf.dbuf, n); } -static Ieee chipfloats[] = { - {0x00000000, 0x00000000}, /* 0 */ - {0x00000000, 0x3ff00000}, /* 1 */ - {0x00000000, 0x40000000}, /* 2 */ - {0x00000000, 0x40080000}, /* 3 */ - {0x00000000, 0x40100000}, /* 4 */ - {0x00000000, 0x40140000}, /* 5 */ - {0x00000000, 0x3fe00000}, /* .5 */ - {0x00000000, 0x40240000}, /* 10 */ -}; - int chipfloat(Ieee *e) { - Ieee *p; - int n; - - for(n = sizeof(chipfloats)/sizeof(chipfloats[0]); --n >= 0;){ - p = &chipfloats[n]; - if(p->l == e->l && p->h == e->h && 0) - return n; /* TO DO: return imm8 encoding */ - } - return -1; + int n, Bbbbbbbbb; + + if(e->l != 0 || (e->h & 0xffffU) != 0) + return -1; + n = e->h >> 16; + Bbbbbbbbb = (n>>6) & 0x1ff; + if(Bbbbbbbbb != 0x100 && Bbbbbbbbb != 0xff) + return -1; + n = (n & 0x8000) >> 8 | (n & 0x7f); + return n; } diff --git a/sys/src/cmd/7l/asmout.c b/sys/src/cmd/7l/asmout.c index 9d29c30e3..342c35687 100644 --- a/sys/src/cmd/7l/asmout.c +++ b/sys/src/cmd/7l/asmout.c @@ -742,12 +742,11 @@ asmout(Prog *p, Optab *o) o1 = oprrr(p->as); if(p->from.type == D_FCONST) { rf = chipfloat(p->from.ieee); - if(rf < 0 || 1){ + if(rf < 0) diag("invalid floating-point immediate\n%P", p); - rf = 0; - } - rf |= (1<<3); - } else + rf = rf<<(13-5) | 1<<(12-5); + o1 &= ~(0x10<<10); + }else rf = p->from.reg; rt = p->to.reg; r = p->reg; @@ -756,7 +755,7 @@ asmout(Prog *p, Optab *o) rf = 0; }else if(r == NREG) r = rt; - o1 |= (rf << 16) | (r<<5) | rt; + o1 |= rf<<16 | r<<5 | rt; break; case 56: /* floating point compare */ -- cgit v1.2.3