package codegen import ( "slices" "git.urbach.dev/cli/q/src/asm" "git.urbach.dev/cli/q/src/ssa" ) func (f *Function) executeCas(step *Step, instr *ssa.Cas) { address := f.ValueToStep[instr.Arguments[0]] oldValue := f.ValueToStep[instr.Arguments[1]] newValue := f.ValueToStep[instr.Arguments[2]] live := slices.Concat(step.Live, []*Step{address, oldValue, newValue}) addressRegister := f.resolveOperand(address, live) oldValueRegister := f.resolveOperand(oldValue, live, addressRegister) newValueRegister := f.resolveOperand(newValue, live, addressRegister, oldValueRegister) oldValueRegister = f.arch.casOldValue(f, oldValueRegister) f.Assembler.Append(&asm.CompareAndSwap{ OldValue: oldValueRegister, NewValue: newValueRegister, Address: addressRegister, Length: 8, }) }