Skip to content

Instantly share code, notes, and snippets.

@usrnatc
Created February 3, 2026 02:35
Show Gist options
  • Select an option

  • Save usrnatc/979f1338a63a3d75e9162f730653ef8f to your computer and use it in GitHub Desktop.

Select an option

Save usrnatc/979f1338a63a3d75e9162f730653ef8f to your computer and use it in GitHub Desktop.
collection of x87 maths routines
align(16)
PowF32 proc
movss dword ptr [rsp + 8], xmm0
movss dword ptr [rsp + 16], xmm1
fld dword ptr [rsp + 16]
fld dword ptr [rsp + 8]
fyl2x
fld st(0)
frndint
fsub st(1), st(0)
fxch st(1)
f2xm1
fld1
faddp st(1), st(0)
fscale
fstp st(1)
fstp dword ptr [rsp + 8]
movss xmm0, dword ptr [rsp + 8]
ret
PowF32 endp
align(16)
ExpF32 proc
movss dword ptr [rsp + 8], xmm0
fldl2e
fld dword ptr [rsp + 8]
fmulp st(1), st(0)
fld st(0)
frndint
fsub st(1), st(0)
fxch st(1)
f2xm1
fld1
faddp st(1), st(0)
fscale
fstp st(1)
fstp dword ptr [rsp + 8]
movss xmm0, dword ptr [rsp + 8]
ret
ExpF32 endp
align(16)
LnF32 proc
movss dword ptr [rsp + 8], xmm0
fldln2
fld dword ptr [rsp + 8]
fyl2x
fstp dword ptr [rsp + 8]
movss xmm0, dword ptr [rsp + 8]
ret
LnF32 endp
align(16)
Log10F32 proc
movss dword ptr [rsp + 8], xmm0
fldlg2
fld dword ptr [rsp + 8]
fyl2x
fstp dword ptr [rsp + 8]
movss xmm0, dword ptr [rsp + 8]
ret
Log10F32 endp
align(16)
Log2F32 proc
movss dword ptr [rsp + 8], xmm0
fld1
fld dword ptr [rsp + 8]
fyl2x
fstp dword ptr [rsp + 8]
movss xmm0, dword ptr [rsp + 8]
ret
Log2F32 endp
align(16)
SinF32 proc
movss dword ptr [rsp + 8], xmm0
fld dword ptr [rsp + 8]
fsin
fstp dword ptr [rsp + 8]
movss xmm0, dword ptr [rsp + 8]
ret
SinF32 endp
align(16)
CosF32 proc
movss dword ptr [rsp + 8], xmm0
fld dword ptr [rsp + 8]
fcos
fstp dword ptr [rsp + 8]
movss xmm0, dword ptr [rsp + 8]
ret
CosF32 endp
align(16) ;; NOTE: void SinCosF32(f32 Val, OUT f32* SinRes, OUT f32* CosRes)
SinCosF32 proc
movss dword ptr [rsp + 8], xmm0
fld dword ptr [rsp + 8]
fsincos
fstp dword ptr [r8]
fstp dword ptr [rdx]
ret
SinCosF32 endp
align(16)
TanF32 proc
movss dword ptr [rsp + 8], xmm0
fld dword ptr [rsp + 8]
fptan
fstp st(0)
fstp dword ptr [rsp + 8]
movss xmm0, dword ptr [rsp + 8]
ret
TanF32 endp
align(16)
ArcSinF32 proc
movss dword ptr [rsp + 8], xmm0
fld dword ptr [rsp + 8]
fld st(0)
fmul st(0), st(0)
fld1
fsubrp st(1), st(0)
fsqrt
fpatan
fstp dword ptr [rsp + 8]
movss xmm0, dword ptr [rsp + 8]
ret
ArcSinF32 endp
align(16)
ArcCosF32 proc
movss dword ptr [rsp + 8], xmm0
fld dword ptr [rsp + 8]
fld st(0)
fmul st(0), st(0)
fld1
fsubrp st(1), st(0)
fsqrt
fxch st(1)
fpatan
fstp dword ptr [rsp + 8]
movss xmm0, dword ptr [rsp + 8]
ret
ArcCosF32 endp
align(16)
ArcTanF32 proc
movss dword ptr [rsp + 8], xmm0
fld dword ptr [rsp + 8]
fld1
fpatan
fstp dword ptr [rsp + 8]
movss xmm0, dword ptr [rsp + 8]
ret
ArcTanF32 endp
align(16)
ArcTan2F32 proc
movss dword ptr [rsp + 8], xmm0
movss dword ptr [rsp + 16], xmm1
fld dword ptr [rsp + 8]
fld dword ptr [rsp + 16]
fpatan
fstp dword ptr [rsp + 8]
movss xmm0, dword ptr [rsp + 8]
ret
ArcTan2F32 endp
align(16)
PowF64 proc
movsd qword ptr [rsp + 8], xmm0
movsd qword ptr [rsp + 16], xmm1
fld qword ptr [rsp + 16]
fld qword ptr [rsp + 8]
fyl2x
fld st(0)
frndint
fsub st(1), st(0)
fxch st(1)
f2xm1
fld1
faddp st(1), st(0)
fscale
fstp st(1)
fstp qword ptr [rsp + 8]
movsd xmm0, qword ptr [rsp + 8]
ret
PowF64 endp
align(16)
ExpF64 proc
movsd qword ptr [rsp + 8], xmm0
fldl2e
fld qword ptr [rsp + 8]
fmulp st(1), st(0)
fld st(0)
frndint
fsub st(1), st(0)
fxch st(1)
f2xm1
fld1
faddp st(1), st(0)
fscale
fstp st(1)
fstp qword ptr [rsp + 8]
movsd xmm0, qword ptr [rsp + 8]
ret
ExpF64 endp
align(16)
LnF64 proc
movsd qword ptr [rsp + 8], xmm0
fldln2
fld qword ptr [rsp + 8]
fyl2x
fstp qword ptr [rsp + 8]
movsd xmm0, qword ptr [rsp + 8]
ret
LnF64 endp
align(16)
Log10F64 proc
movsd qword ptr [rsp + 8], xmm0
fldlg2
fld qword ptr [rsp + 8]
fyl2x
fstp qword ptr [rsp + 8]
movsd xmm0, qword ptr [rsp + 8]
ret
Log10F64 endp
align(16)
Log2F64 proc
movsd qword ptr [rsp + 8], xmm0
fld1
fld qword ptr [rsp + 8]
fyl2x
fstp qword ptr [rsp + 8]
movsd xmm0, qword ptr [rsp + 8]
ret
Log2F64 endp
align(16)
SinF64 proc
movsd qword ptr [rsp + 8], xmm0
fld qword ptr [rsp + 8]
fsin
fstp qword ptr [rsp + 8]
movsd xmm0, qword ptr [rsp + 8]
ret
SinF64 endp
align(16)
CosF64 proc
movsd qword ptr [rsp + 8], xmm0
fld qword ptr [rsp + 8]
fcos
fstp qword ptr [rsp + 8]
movsd xmm0, qword ptr [rsp + 8]
ret
CosF64 endp
align(16) ;; NOTE: void SinCosF64(f64 Val, OUT f64* SinRes, OUT f64* CosRes)
SinCosF64 proc
movsd qword ptr [rsp + 8], xmm0
fld qword ptr [rsp + 8]
fsincos
fstp qword ptr [r8]
fstp qword ptr [rdx]
ret
SinCosF64 endp
align(16)
TanF64 proc
movsd qword ptr [rsp + 8], xmm0
fld qword ptr [rsp + 8]
fptan
fstp st(0)
fstp qword ptr [rsp + 8]
movsd xmm0, qword ptr [rsp + 8]
ret
TanF64 endp
align(16)
ArcSinF64 proc
movsd qword ptr [rsp + 8], xmm0
fld qword ptr [rsp + 8]
fld st(0)
fmul st(0), st(0)
fld1
fsubrp st(1), st(0)
fsqrt
fpatan
fstp qword ptr [rsp + 8]
movsd xmm0, qword ptr [rsp + 8]
ret
ArcSinF64 endp
align(16)
ArcCosF64 proc
movsd qword ptr [rsp + 8], xmm0
fld qword ptr [rsp + 8]
fld st(0)
fmul st(0), st(0)
fld1
fsubrp st(1), st(0)
fsqrt
fxch st(1)
fpatan
fstp qword ptr [rsp + 8]
movsd xmm0, qword ptr [rsp + 8]
ret
ArcCosF64 endp
align(16)
ArcTanF64 proc
movsd qword ptr [rsp + 8], xmm0
fld qword ptr [rsp + 8]
fld1
fpatan
fstp qword ptr [rsp + 8]
movsd xmm0, qword ptr [rsp + 8]
ret
ArcTanF64 endp
align(16)
ArcTan2F64 proc
movsd qword ptr [rsp + 8], xmm0
movsd qword ptr [rsp + 16], xmm1
fld qword ptr [rsp + 8]
fld qword ptr [rsp + 16]
fpatan
fstp qword ptr [rsp + 8]
movsd xmm0, qword ptr [rsp + 8]
ret
ArcTan2F64 endp
align(16)
InvSqrtF64 proc
movsd qword ptr [rsp + 8], xmm0
fld1
fld qword ptr [rsp + 8]
fsqrt
fdivp st(1), st(0)
fstp qword ptr [rsp + 8]
movsd xmm0, qword ptr [rsp + 8]
ret
InvSqrtF64 endp
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment