Compilation 2016
Instruction Selection
Aslan Askarov aslan@cs.au.dk Partially based on slides by E. Ernst
Instruction Selection Aslan Askarov aslan@cs.au.dk Partially based - - PowerPoint PPT Presentation
Compilation 2016 Instruction Selection Aslan Askarov aslan@cs.au.dk Partially based on slides by E. Ernst Where are we? High-level source code Translation to Lexing/Parsing Semantic analysis LLVM-- IR Low-level target
Aslan Askarov aslan@cs.au.dk Partially based on slides by E. Ernst
High-level source code Low-level target code Lexing/Parsing Translation to LLVM-- IR Register allocation Semantic analysis Instruction selection
process is relatively straightforward
IR Tree language, there is more work to be done at this phase
signature TREE = sig type label = Temp.label datatype stm = MOVE of exp * exp | EXP of exp | JUMP of exp * label list | CJUMP of relop * exp * exp * label * label | SEQ of stm * stm | LABEL of label and exp = CONST of int | NAME of label | TEMP of Temp.temp | BINOP of binop * exp * exp | MEM of exp | CALL of exp * exp list | ESEQ of stm * exp and binop = PLUS | MINUS | MUL | DIV | AND | OR | LSHIFT | RSHIFT | ARSHIFT | XOR and relop = EQ | NE | LT | GT | LE | GE | ULT | ULE | UGT | UGE ... end
machine instructions typically do several things
express IR trees using instructions
BINOP CONST e c PLUS MEM + CONST e c MEM
top-down traversal = reverse order
flexible locations
ADD ri ⃪ rj + rk MUL ri ⃪ rj * rk SUB ri ⃪ rj - rk DIV ri ⃪ rj / rk ADDI ri ⃪ rj + c SUBI ri ⃪ rj - c LOAD ri ⃪ M[rj + c]
(no name) ri
t TEMP TEMP
shorthand:
DIV ri ⃪ rj / rk SUB ri ⃪ rj - rk MUL ri ⃪ rj * rk ADD ri ⃪ rj + rk
+
/
multiple interpretations — multiple patterns
SUBI ri ⃪ rj - c ADDI ri ⃪ rj + c
CONST + CONST + CONST
LOAD ri ⃪ M[rj + c]
MEM + CONST MEM CONST MEM + CONST MEM
STORE M[ri + c] ⃪ rj
MEM MOVE MEM + CONST MOVE MEM + CONST MOVE MEM CONST MOVE
MOVE(MEM,_) simultaneously
MOVEMM[ri] ⃪ M[rj]
MEM MOVE MEM
MEM MOVE MEM + + MEM * + FP CONST a TEMP i CONST 4 FP CONST x
MEM MOVE MEM + + MEM * + FP CONST a TEMP i CONST 4 FP CONST x LOAD r1 ⃪ M[FP + a] ADDI r2 ⃪ r0 + 4 MUL r2 ⃪ ri * r2 ADD r1 ⃪ r1 + r2 LOAD r2 ⃪ M[FP + x] STORE M[r1 + 0] ⃪ r2
MEM MOVE MEM + + MEM * + FP CONST a TEMP i CONST 4 FP CONST x LOAD r1 ⃪ M[FP + a] ADDI r2 ⃪ r0 + 4 MUL r2 ⃪ ri * r2 ADD r1 ⃪ r1 + r2
MEM MOVE MEM + + MEM * + FP CONST a TEMP i CONST 4 FP CONST x ADDI r1 ⃪ r0 + a ADD r1 ⃪ FP + r1 LOAD r1 ⃪ M[r1 + 0] ADDI r2 ⃪ r0 + 4 MUL r2 ⃪ ri * r2 ADD r1 ⃪ r1 + r2 ADDI r2 ⃪ r0 + x ADD r2 ⃪ FP + r2
based on each tile (reality: cost is not additive!)
MEM MOVE MEM + + MEM * + FP CONST a TEMP i CONST 4 FP CONST x LOAD r1 ⃪ M[FP + a] ADDI r2 ⃪ r0 + 4 MUL r2 ⃪ ri * r2 ADD r1 ⃪ r1 + r2 ADDI r2 ⃪ FP + x
more complex than maximal munch
(recursion: process children, then current node)
adding cost of T to cost of T's leaves
have register classes: data vs. address registers
produce result in the wrong type of register
usage not unlike parser generators
d ➜ MEM(+(a,CONST)) d ➜ MEM(+(CONST ,a)) d ➜ MEM(CONST) d ➜ MEM(a) d ➜ a a ➜ d
generation