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; /* 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.ivalue"; 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;