Something went wrong. Try again.
🌱 A minimal programming language and compiler. git.urbach.dev/cli/q
high-performance programming-language compiler
Something went wrong. Try again.
1234567891011121314151617181920212223242526272829303132333435363738394041424344package codegen
import ( "git.urbach.dev/cli/q/src/asm" "git.urbach.dev/cli/q/src/cpu" "git.urbach.dev/cli/q/src/ssa")
// moveValuesToRegisters moves the values to the destination registers.func (f *Function) moveValuesToRegisters(values []ssa.Value, registers []cpu.Register, live []*Step) { moves := make([]*asm.Move, 0, len(values)) sourceSteps := map[cpu.Register]*Step{}
for i, arg := range values { sourceStep := f.ValueToStep[arg] source := sourceStep.Register destination := registers[i]
if f.isSpilled(source) { sourceSteps[source] = sourceStep }
moves = append(moves, &asm.Move{ Destination: destination, Source: source, }) }
free := f.freeTempRegisters(live) scheduled, ok := ScheduleMoves(moves, free)
if !ok { panic("no free register for move scheduling") }
for _, move := range scheduled { if f.isSpilled(move.Source) { f.loadSpill(sourceSteps[move.Source], move.Destination) continue }
f.Assembler.Append(move) }}