Compilation 2014
Code Generation Issues
Aslan Askarov aslan@cs.au.dk Based on slides by E. Ernst
Code Generation Issues Aslan Askarov aslan@cs.au.dk Based on slides - - PowerPoint PPT Presentation
Compilation 2014 Code Generation Issues Aslan Askarov aslan@cs.au.dk Based on slides by E. Ernst Administrativia November 28 guest lecture by Filip Sieczkowski (AU) Memory Models December 12 guest lecture by Kevin
Aslan Askarov aslan@cs.au.dk Based on slides by E. Ernst
.text # PROCEDURE tigermain .globl tigermain .func tigermain .type tigermain, @function tigermain: # FRAME tigermain(1 formals, 10 locals) pushl %ebp movl %esp, %ebp subl $44, %esp # SP, FP, calleesaves, argregs have values L2_blocks: # x86gen:122 movl %ebp, -8(%ebp) # x86gen:246 x86frame:575 movl -8(%ebp), %ebx # x86gen:251 x86frame:367 addl $-4, %ebx # x86gen:251 x86frame:372 . . . movl -28(%ebp), %eax # x86gen:117 x86frame:582 jmp L1_block_done # x86gen:172 L1_block_done: # x86gen:122 # FP, SP, RV, calleesaves still live leave ret .size tigermain, .-tigermain .endfunc # END tigermain
.data L0_string: .long 13 .asciz "DefaultString"
addl $17, %esp addl %eax, %ebx call Label cltd cmpl $17, %ecx cmpl %eax, %edx idivl %ebx imull %eax je Label jg Label jge Label jl Label jle Label jmp Label jne Label leave movl $17, %eax movl $Label, %eax movl %eax, %ebx movl %eax, 17(%ebp) movl %esp, %ebp movl 17(%ebp), %eax negl %eax pushl %eax pushl %ebp ret subl $17, %esp subl %eax, %ebx
saved_FP localVar_1 ... localVar_m temp_1 ... temp_p ... (args for next)
FP
SP
(prev.frame) ... arg_k ... arg_1 staticLink returnAddr
SP SP SP
Memory[FP] Memory[FP-4*1] Memory[FP-who_cares] Memory[FP+4] Memory[saved_FP], Memory[FP+8] Memory[FP+4*(2+1)] Memory[FP+4*(2+k)] Memory[FP-4*m] Memory[FP-4*(m+1)] Memory[FP-4*(m+p)] Memory[staticLink]?
Top of frame: known early Bottom: known later
L33_f: . . . pushl %ebx pushl %ebp call L3_g addl $8, %esp . . . L3_g: pushl %ebp movl %esp, %ebp subl $44, %esp . . . leave ret
. . . | munchStm (T.MOVE (T.TEMP t, T.CALL (T.NAME l, args))) = ( emit (A.OPER { assem = "\tcall " ^ S.name l , src = munchArgs args , dst = F.calldefs , jump = NONE , doc = "x86gen:68"}) ; emit (freeArgs (length args)) ; emit (moveInstr F.EAX t "70")) emit (A.OPER { assem = "\taddl `s1, `d0" , src = [r, munchExp e2] (* old-r used *) , dst = [r] , jump = NONE , doc = "x86gen:270"})
tigermain: pushl %ebp movl %esp, %ebp subl $44, %esp L2_blocks: movl %ebp, t111 addl $-4, t111 movl t111, t110 movl $0, t112 pushl t112 movl $10, t113 pushl t113 call initArray . . . tigermain: pushl %ebp movl %esp, %ebp subl $44, %esp L2_blocks: movl %ebp, -8(%ebp) movl -8(%ebp), %ebx addl $-4, %ebx movl %ebx, -8(%ebp) movl -8(%ebp), %ebx movl %ebx, -20(%ebp) movl -12(%ebp), %ebx movl $0, %ebx movl %ebx, -12(%ebp) movl -12(%ebp), %ebx pushl %ebx movl -16(%ebp), %ebx movl $10, %ebx movl %ebx, -16(%ebp) movl -16(%ebp), %ebx pushl %ebx call initArray . . .
src dst
src dst
R1 R2
fun expand (A.OPER {src=s0::ss, jump = SOME (j::js), ...}) = raise Bug "Encountered OPER that uses temps and jumps" | expand (i as (A.OPER {src=[], dst=[], ...})) = [i] | expand (i as A.OPER {assem, src=[s0], dst=[], jump, doc}) = if isRegister s0 then [i] else (* s0 other temp *) [ A.OPER { assem = "\tmovl " ^ ofs s0 ^ "(%ebp), `d0" , src = [] , dst = [EBX] , jump = NONE , doc = doc ^ " x86frame:265"} , A.OPER { assem = assem , src = [EBX] , dst = [] , jump = jump , doc = doc ^ " x86frame:270"}] . . .
. . . | expand (i as A.OPER {assem, src=[s0], dst=[], jump, doc}) = if isRegister s0 then [i] else (* s0 other temp *) [ A.OPER { assem = "\tmovl " ^ ofs s0 ^ "(%ebp), `d0" , src = [] , dst = [EBX] , jump = NONE , doc = doc ^ " x86frame:265"} , A.OPER { assem = assem , src = [EBX] , dst = [] , jump = jump , doc = doc ^ " x86frame:270"}] . . .