A few more minor optimisations.
This commit is contained in:
parent
ac856f3b09
commit
cb20856aea
|
@ -306,20 +306,38 @@ PATTERNS
|
||||||
emit "lhu %out, %addr"
|
emit "lhu %out, %addr"
|
||||||
cost 4;
|
cost 4;
|
||||||
|
|
||||||
|
out:(int)reg = EXTENDH.I(LOADH.I(addr:address))
|
||||||
|
emit "lh %out, %addr"
|
||||||
|
cost 4;
|
||||||
|
|
||||||
out:(int)ushort0 = LOADH.I(label:LABEL.I)
|
out:(int)ushort0 = LOADH.I(label:LABEL.I)
|
||||||
emit "lui at, ha16[$label]"
|
emit "lui at, ha16[$label]"
|
||||||
emit "lhu %out, lo16[$label] (at)"
|
emit "lhu %out, lo16[$label] (at)"
|
||||||
cost 8;
|
cost 8;
|
||||||
|
|
||||||
|
out:(int)reg = EXTENDH.I(LOADH.I(label:LABEL.I))
|
||||||
|
emit "lui at, ha16[$label]"
|
||||||
|
emit "lh %out, lo16[$label] (at)"
|
||||||
|
cost 8;
|
||||||
|
|
||||||
out:(int)ubyte0 = LOADB.I(addr:address)
|
out:(int)ubyte0 = LOADB.I(addr:address)
|
||||||
emit "lbu %out, %addr"
|
emit "lbu %out, %addr"
|
||||||
cost 4;
|
cost 4;
|
||||||
|
|
||||||
|
out:(int)reg = EXTENDB.I(LOADB.I(addr:address))
|
||||||
|
emit "lb %out, %addr"
|
||||||
|
cost 4;
|
||||||
|
|
||||||
out:(int)ubyte0 = LOADB.I(label:LABEL.I)
|
out:(int)ubyte0 = LOADB.I(label:LABEL.I)
|
||||||
emit "lui at, ha16[$label]"
|
emit "lui at, ha16[$label]"
|
||||||
emit "lbu %out, lo16[$label] (at)"
|
emit "lbu %out, lo16[$label] (at)"
|
||||||
cost 8;
|
cost 8;
|
||||||
|
|
||||||
|
out:(int)reg = EXTENDB.I(LOADB.I(label:LABEL.I))
|
||||||
|
emit "lui at, ha16[$label]"
|
||||||
|
emit "lb %out, lo16[$label] (at)"
|
||||||
|
cost 8;
|
||||||
|
|
||||||
out:(float)reg = LOAD.F(addr:address)
|
out:(float)reg = LOAD.F(addr:address)
|
||||||
emit "lwc1 %out, %addr"
|
emit "lwc1 %out, %addr"
|
||||||
cost 4;
|
cost 4;
|
||||||
|
|
|
@ -7,14 +7,41 @@ LABEL_STARTER '.';
|
||||||
%%;
|
%%;
|
||||||
|
|
||||||
X, Y, Z { TRUE };
|
X, Y, Z { TRUE };
|
||||||
|
R { TRUE };
|
||||||
|
|
||||||
%%;
|
%%;
|
||||||
|
|
||||||
/* Whitespace is significant here! */
|
/* Whitespace is significant here! */
|
||||||
|
|
||||||
addiu RNZ, RNZ, 0 -> ;
|
addiu R, R, X : addiu R, R, Y { plus(X, Y, Z) } -> addiu R, R, Z ;
|
||||||
|
|
||||||
|
addiu X, X, 0 -> ;
|
||||||
|
|
||||||
b X : nop : labdef X -> labdef X ;
|
b X : nop : labdef X -> labdef X ;
|
||||||
|
|
||||||
%%;
|
%%;
|
||||||
|
|
||||||
|
/* Does it fit a signed 16-bit integer? */
|
||||||
|
static int fits16(long l) {
|
||||||
|
return l >= -32768 && l <= 32767;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Tries sum = a + b with signed 16-bit integers. */
|
||||||
|
int plus(const char *a, const char *b, const char *sum)
|
||||||
|
{
|
||||||
|
long la, lb, lsum;
|
||||||
|
char *end;
|
||||||
|
|
||||||
|
la = strtol(a, &end, 10);
|
||||||
|
if (*a == '\0' || *end != '\0' || !fits16(la))
|
||||||
|
return 0;
|
||||||
|
lb = strtol(b, &end, 10);
|
||||||
|
if (*b == '\0' || *end != '\0' || !fits16(lb))
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
lsum = la + lb;
|
||||||
|
if (!fits16(lsum))
|
||||||
|
return 0;
|
||||||
|
snprintf(sum, 7, "%ld", lsum);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in a new issue