module Platform.AArch64.WordArithmetic import Compiler.MachineAArch64 import Compiler.MachineAArch64Assembly import Platform.AArch64.RoutineEmitter -- x0 destination, x1 left, x2 right. Unsigned addition overflow is equivalent -- to the wrapped sum being below the left operand. Test before storing so a -- rejected update cannot change the destination or reuse a frame version. -- Return zero on success or one on overflow, matching Runtime.NativeWordArithmetic. def aarch64CheckedWordAddAssembly = (ahrEmit (constructor AArch64Instruction AArch64AddRegister (constructor AArch64Register AArch64X3) (constructor AArch64Register AArch64X1) (constructor AArch64Register AArch64X2)) (ahrEmit (constructor AArch64Instruction AArch64CompareRegister (constructor AArch64Register AArch64X3) (constructor AArch64Register AArch64X1)) (app (lambda unrestricted tail : (family AArch64Assembly) . (constructor AArch64Assembly AArch64AssemblyBranchIf (constructor AArch64Condition AArch64CarryClear) b"overflow" tail)) (ahrEmit (constructor AArch64Instruction AArch64StoreMemory64 (constructor AArch64Register AArch64X0) 0 (constructor AArch64Register AArch64X3)) (ahrMovImm (constructor AArch64Register AArch64X0) 0 (ahrReturn (ahrLabel b"overflow" (ahrMovImm (constructor AArch64Register AArch64X0) 1 (ahrReturn ahrEnd))))))))) def aarch64CheckedWordAddCode = (aarch64RoutineBytes aarch64CheckedWordAddAssembly)