package asmc import ( "git.urbach.dev/cli/q/src/asm" "git.urbach.dev/cli/q/src/config" "git.urbach.dev/cli/q/src/x86" ) func (c *compiler) store(x asm.Instruction) { switch x.Type { case asm.TypeMemoryNumber: operands := c.assembler.Param.MemoryNumber[x.Index] if operands.Address.OffsetRegister < 0 { c.code = x86.StoreNumber(c.code, operands.Address.Base, operands.Address.Offset, operands.Address.Length, operands.Number) } else { c.code = x86.StoreDynamicNumber(c.code, operands.Address.Base, operands.Address.OffsetRegister, operands.Address.Length, operands.Number) } case asm.TypeMemoryLabel: operands := c.assembler.Param.MemoryLabel[x.Index] start := len(c.code) if operands.Address.OffsetRegister < 0 { c.code = x86.StoreNumber(c.code, operands.Address.Base, operands.Address.Offset, operands.Address.Length, 0b00_00_00_00) } else { c.code = x86.StoreDynamicNumber(c.code, operands.Address.Base, operands.Address.OffsetRegister, operands.Address.Length, 0b00_00_00_00) } size := 4 opSize := len(c.code) - size - start c.codePointers = append(c.codePointers, &pointer{ Position: Address(len(c.code) - size), OpSize: uint8(opSize), Size: uint8(size), Resolve: func() Address { destination, exists := c.codeLabels[operands.Label.Name] if !exists { panic("unknown label") } return config.BaseAddress + c.codeStart + destination }, }) case asm.TypeMemoryRegister: operands := c.assembler.Param.MemoryRegister[x.Index] if operands.Address.OffsetRegister < 0 { c.code = x86.StoreRegister(c.code, operands.Address.Base, operands.Address.Offset, operands.Address.Length, operands.Register) } else { c.code = x86.StoreDynamicRegister(c.code, operands.Address.Base, operands.Address.OffsetRegister, operands.Address.Length, operands.Register) } } }