module Platform.AArch64.FloatRoutine import Compiler.MachineAArch64 import Compiler.MachineAArch64Assembly import Platform.AArch64.RoutineEmitter -- x0 holds a binary64 value's bits, not a pointer. Only x0/x1 and flags -- change. Eleven exponent bits equal to 2047 identify infinities/NaNs; -- all finite values, including signed zero and subnormals, return zero. def aarch64Float64FiniteAssembly = (ahrEmit (constructor AArch64Instruction AArch64ShiftRightImmediate (constructor AArch64Register AArch64X0) (constructor AArch64Register AArch64X0) 52) (ahrMovImm (constructor AArch64Register AArch64X1) 2047 (ahrEmit (constructor AArch64Instruction AArch64AndRegister (constructor AArch64Register AArch64X0) (constructor AArch64Register AArch64X0) (constructor AArch64Register AArch64X1)) (ahrEmit (constructor AArch64Instruction AArch64CompareImmediate (constructor AArch64Register AArch64X0) 2047) (constructor AArch64Assembly AArch64AssemblyBranchIf (constructor AArch64Condition AArch64NotEqual) b"finite" (ahrMovImm (constructor AArch64Register AArch64X0) 1 (ahrReturn (ahrLabel b"finite" (ahrMovImm (constructor AArch64Register AArch64X0) 0 (ahrReturn ahrEnd)))))))))) def aarch64Float64FiniteCode = (aarch64RoutineBytes aarch64Float64FiniteAssembly)