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.
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748package core
import ( "strings"
"git.urbach.dev/cli/q/src/errors" "git.urbach.dev/cli/q/src/ssa" "git.urbach.dev/cli/q/src/types")
// MaxInputRegisters is the portable register limit.const MaxInputRegisters = 7
// compileInputs registers every input as an identifier.func (f *Function) compileInputs() error { offset := 0 registers := 0
for i, input := range f.Input { structType, isStructType := types.Unwrap(input.Typ).(*types.Struct) registers += inputRegisterCount(input)
if strings.HasPrefix(input.Name, "_") { if isStructType { offset += inputRegisterCount(input) - 1 }
continue }
if isStructType { var structure *ssa.Struct structure, offset = f.composeStruct(structType, input, i, offset) f.Block().Identify(input.Name, structure) continue }
input.Index = uint8(offset + i) f.Block().Identify(input.Name, input) f.Append(input) }
if registers > MaxInputRegisters { return errors.New(&RegisterLimitExceeded{Function: f.Name(), Required: registers, Available: MaxInputRegisters}, f.File, f.Input[len(f.Input)-1].Source) }
return nil}