ack/mach/proto/mcg/table

137 lines
1.9 KiB
Plaintext

PATTERNS
/* Special */
reg;
PAIR(BLOCK4, BLOCK4);
/* Miscellaneous special things */
PUSH4(in:reg)
emit "push %in"
cost 4;
reg = POP4
emit "pop %reg"
cost 4;
RET
emit "ret"
cost 4;
SETRET4(in:reg)
emit "mov r0, %in"
cost 4;
/* Memory operations */
STORE4(addr:address, value:reg)
emit "str %value, %addr"
cost 4;
reg = LOAD4(addr:address)
emit "ldr %reg, %addr"
cost 4;
reg = LOAD1(addr:address)
emit "ldrb %reg, %addr"
cost 4;
reg = CIU14(LOAD1(addr:address))
emit "ldrb %reg, %addr"
cost 4;
reg = CII14(CIU41(CIU14(LOAD1(addr:address))))
emit "ldrsb %reg, %addr"
cost 4;
/* Locals */
reg = in:LOCAL4
emit "add %reg, fp, #$in"
cost 4;
address = in:LOCAL4
fragment "[fp, #$in]";
/* Memory addressing modes */
address = ADD4(addr:reg, offset:CONST)
fragment "[%addr, #$offset]";
address = addr:reg
fragment "[%addr]";
/* Branches */
JUMP(addr:BLOCK4)
emit "b $addr"
cost 4;
CJUMPEQ(value:tristate, PAIR(true:BLOCK4, false:BLOCK4))
emit "beq $true"
emit "bne $false"
cost 8;
/* Comparisons */
tristate = COMPARES4(left:reg, right:aluparam)
outs CC
emit "cmp %left, %right"
cost 4;
reg = tristate
emit "mov %reg, #0"
emit "movlt %reg, #-1"
emit "movgt %reg, #1"
cost 12;
/* Conversions */
reg = CII14(CIU41(value:reg))
emit "sxtb %reg, %value"
cost 4;
reg = CIU41(in:reg)
emit "and %reg, %in, #0xff"
cost 4;
/* ALU operations */
reg = ADD4(left:reg, right:aluparam)
emit "add %reg, %left, %right"
cost 4;
reg = ADD4(left:aluparam, right:reg)
emit "add %reg, %right, %left"
cost 4;
aluparam = value:CONST4
fragment "#$value";
aluparam = reg;
reg = value:aluparam
emit "mov %reg, %value"
cost 4;
reg = value:LABEL4
emit "adr %reg, $value"
cost 4;
reg = value:BLOCK4
emit "adr %reg, $value"
cost 4;
reg = value:CONST4
emit "ldr %reg, #$value"
cost 4;