func (v *gen) genFunction(fn *ir.Function) { v.nl() v.emitDirec(".globl %s", fn.Name()) v.emitDirec(".type %s,@function", fn.Name()) v.emitLabel("%s:", fn.Name()) // setup the stack v.emitOp("pushl @ebp") v.emitOp("movl @esp, @ebp") v.emitOp("pusha") v.emitOp("andl $-16, @esp") // align SP to 16-byte boundary alloc := v.target.newAllocator() alloc.allocFunction(fn) v.emitOp("subl $%d, @esp", alloc.stackSize) // actually allocate the stack vars labelNames := make(map[*ir.Block]string) for _, block := range fn.Blocks() { labelNames[block] = v.nextLabelName() } for _, block := range fn.Blocks() { v.genBlock(block, alloc, labelNames) } }