summaryrefslogtreecommitdiff
path: root/utils
diff options
context:
space:
mode:
authorforsyth <forsyth@vitanuova.com>2010-04-27 13:16:18 +0100
committerforsyth <forsyth@vitanuova.com>2010-04-27 13:16:18 +0100
commit983e672a40437a3c5dac0c6c4b929eef57e5f017 (patch)
tree35af731941c70ba169ae2be42126eb46eda22101 /utils
parentebd861fe7c7767f146017b35ca30bae1d39a0b26 (diff)
20100427-1316
Diffstat (limited to 'utils')
-rw-r--r--utils/qc/enam.c33
-rw-r--r--utils/qc/list.c36
-rw-r--r--utils/qc/machcap.c86
-rw-r--r--utils/qc/swt.c5
4 files changed, 128 insertions, 32 deletions
diff --git a/utils/qc/enam.c b/utils/qc/enam.c
index 98d0edcf..e09c3f94 100644
--- a/utils/qc/enam.c
+++ b/utils/qc/enam.c
@@ -346,21 +346,18 @@ char *anames[] =
"FXNMSUB",
"FXCPNMSUB",
"FXCSNMSUB",
- "FPMOVD",
"FPABS",
"FPNEG",
"FPRSP",
"FPNABS",
- "FSMOVD",
"FSCMP",
"FSABS",
"FSNEG",
"FSNABS",
- "FXMOVD",
"FPCTIW",
"FPCTIWZ",
- "FSMOVP",
- "FPMOVS",
+ "FMOVSPD",
+ "FMOVPSD",
"FXCPNPMA",
"FXCSNPMA",
"FXCPNSMA",
@@ -369,18 +366,18 @@ char *anames[] =
"FXCXNSMA",
"FXCXMA",
"FXCXNMS",
- "FMOVSS",
- "FMOVSSU",
- "FMOVSD",
- "FMOVSDU",
- "FMOVXS",
- "FMOVSXU",
- "FMOVXD",
- "FMOVXDU",
- "FMOVPS",
- "FMOVPSU",
- "FMOVPD",
- "FMOVPDU",
- "FMOVPIW",
+ "FSMOVS",
+ "FSMOVSU",
+ "FSMOVD",
+ "FSMOVDU",
+ "FXMOVS",
+ "FXMOVSU",
+ "FXMOVD",
+ "FXMOVDU",
+ "FPMOVS",
+ "FPMOVSU",
+ "FPMOVD",
+ "FPMOVDU",
+ "FPMOVIW",
"LAST",
};
diff --git a/utils/qc/list.c b/utils/qc/list.c
index 2f7eeb18..f0f98a13 100644
--- a/utils/qc/list.c
+++ b/utils/qc/list.c
@@ -42,7 +42,7 @@ Bconv(Fmt *fp)
int
Pconv(Fmt *fp)
{
- char str[STRINGSZ];
+ char str[STRINGSZ], *s;
Prog *p;
int a;
@@ -50,17 +50,16 @@ Pconv(Fmt *fp)
a = p->as;
if(a == ADATA)
sprint(str, " %A %D/%d,%D", a, &p->from, p->reg, &p->to);
- else
- if(p->as == ATEXT)
+ else if(p->as == ATEXT)
sprint(str, " %A %D,%d,%D", a, &p->from, p->reg, &p->to);
- else
- if(p->reg == NREG)
- sprint(str, " %A %D,%D", a, &p->from, &p->to);
- else
- if(p->from.type != D_FREG)
- sprint(str, " %A %D,R%d,%D", a, &p->from, p->reg, &p->to);
- else
- sprint(str, " %A %D,F%d,%D", a, &p->from, p->reg, &p->to);
+ else {
+ s = seprint(str, str+sizeof(str), " %A %D", a, &p->from);
+ if(p->reg != NREG)
+ s = seprint(s, str+sizeof(str), ",%c%d", p->from.type==D_FREG? 'F': 'R', p->reg);
+ if(p->from3.type != D_NONE)
+ s = seprint(s, str+sizeof(str), ",%D", &p->from3);
+ seprint(s, s+sizeof(str), ",%D", &p->to);
+ }
return fmtstrcpy(fp, str);
}
@@ -196,10 +195,25 @@ Nconv(Fmt *fp)
char str[STRINGSZ];
Adr *a;
Sym *s;
+ int i, l, b, n;
a = va_arg(fp->args, Adr*);
s = a->sym;
if(s == S) {
+ if(a->offset > 64 || -a->offset > 64) {
+ n = 0;
+ l = a->offset & 1;
+ for(i=0; i<32; i++){
+ b = (a->offset >> i) & 1;
+ if(b != l)
+ n++;
+ l = b;
+ }
+ if(n < 2) {
+ sprint(str, "%#lux", a->offset);
+ goto out;
+ }
+ }
sprint(str, "%ld", a->offset);
goto out;
}
diff --git a/utils/qc/machcap.c b/utils/qc/machcap.c
index 5fae5731..e9f9a988 100644
--- a/utils/qc/machcap.c
+++ b/utils/qc/machcap.c
@@ -1,16 +1,98 @@
#include "gc.h"
-/* default, like old cc */
int
machcap(Node *n)
{
if(n == Z)
- return 0; /* test */
+ return 1; /* test */
switch(n->op){
+
+ case OADD:
+ case OAND:
+ case OOR:
+ case OSUB:
+ case OXOR:
+ if(typev[n->left->type->etype])
+ return 1;
+ break;
+
+ case OMUL:
+ case OLMUL:
+ case OASMUL:
+ case OASLMUL:
+ return 1;
+
+ case OLSHR:
+ case OASHR:
+ case OASHL:
+ case OASASHL:
+ case OASASHR:
+ case OASLSHR:
+ return 1;
+
+ case OCAST:
+ if(typev[n->type->etype]) {
+ if(!typefd[n->left->type->etype])
+ return 1;
+ } else if(!typefd[n->type->etype]) {
+ if(typev[n->left->type->etype])
+ return 1;
+ }
+ break;
+
case OCOMMA:
case OCOND:
case OLIST:
+ case OANDAND:
+ case OOROR:
+ case ONOT:
return 1;
+
+ case OCOM:
+ case ONEG:
+ if(typechl[n->left->type->etype])
+ return 1;
+ if(typev[n->left->type->etype])
+ return 1;
+ return 0;
+
+ case OASADD:
+ case OASSUB:
+ case OASAND:
+ case OASOR:
+ case OASXOR:
+ return 1;
+
+ case OPOSTINC:
+ case OPOSTDEC:
+ case OPREINC:
+ case OPREDEC:
+ return 1;
+
+ case OEQ:
+ case ONE:
+ case OLE:
+ case OGT:
+ case OLT:
+ case OGE:
+ case OHI:
+ case OHS:
+ case OLO:
+ case OLS:
+ return 1;
+
+ case ODIV:
+ case OLDIV:
+ case OLMOD:
+ case OMOD:
+ return 0;
+
+ case OASDIV:
+ case OASLDIV:
+ case OASLMOD:
+ case OASMOD:
+ return 0;
+
}
return 0;
}
diff --git a/utils/qc/swt.c b/utils/qc/swt.c
index 0170bad1..f0edacc8 100644
--- a/utils/qc/swt.c
+++ b/utils/qc/swt.c
@@ -1,6 +1,5 @@
#include "gc.h"
-int hasdoubled;
static int doubleflag;
void
@@ -370,12 +369,16 @@ zwrite(Biobuf *b, Prog *p, int sf, int st)
bf[0] = p->as;
bf[1] = p->as>>8;
bf[2] = p->reg;
+ if(p->from3.type != D_NONE)
+ bf[2] |= 0x40;
l = p->lineno;
bf[3] = l;
bf[4] = l>>8;
bf[5] = l>>16;
bf[6] = l>>24;
bp = zaddr(bf+7, &p->from, sf);
+ if(bf[2] & 0x40)
+ bp = zaddr(bp, &p->from3, 0);
bp = zaddr(bp, &p->to, st);
Bwrite(b, bf, bp-bf);
}