A few more minor optimisations.

This commit is contained in:
David Given 2018-09-20 00:39:13 +02:00
parent ac856f3b09
commit cb20856aea
2 changed files with 46 additions and 1 deletions

View file

@ -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;

View file

@ -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;
}