// // cosf from 0x18012af90 to 0x18012b48f (1279 bytes) // // 20 xrefs: // > sub_180028BE0 @ 0x180028d64 // > sub_180032180 @ 0x1800323be // > sub_180032180 @ 0x1800323f9 // > sub_180032180 @ 0x18003245e // > sub_180032180 @ 0x18003247e // > sub_180032180 @ 0x18003249d // > sub_180032180 @ 0x1800324e3 // > sub_180032180 @ 0x18003254b // > sub_180032180 @ 0x18003258b // > sub_180032180 @ 0x18003264f // > sub_180053BD0 @ 0x180053c0b // > sub_180069DE0 @ 0x180069e1b // > sub_18006B8A0 @ 0x18006b8db // > sub_18006E7E0 @ 0x18006e82d // > sub_180077F30 @ 0x180077f6b // > sub_1800894D0 @ 0x180089524 // > sub_1800899C0 @ 0x180089a1b // > sub_1800F8FF0 @ 0x1800f905e // > sub_1800F8FF0 @ 0x1800f9080 // > @ 0x180202b10 // // This function is hookable on this platform! // // Using BromaIDA 8.0.0 @ https://github.com/Stazzical/BromaIDA // Using bindings at commit ba9f177b at Thu Jul 16 22:52:06 2026 from https://github.com/geode-sdk/bindings // // local variable allocation has failed, the output may be wrong! float __cdecl cosf(float X) { __int64 v1; // rcx unsigned __int64 v2; // r10 char v3; // al __m128i v4; // xmm0 double v5; // xmm2_8 double v6; // xmm4_8 double v7; // xmm2_8 double v8; // xmm2_8 if ( !dword_1801F4D54 ) { if ( (_mm_cvtsi128_si32(*(__m128i *)&X) & 0x7F800000) != 0x7F800000 ) { *(double *)&X = X; v2 = *(_QWORD *)&X & 0x7FFFFFFFFFFFFFFFLL; if ( (*(_QWORD *)&X & 0x7FFFFFFFFFFFFFFFuLL) > 0x3FE921FB54442D18LL ) { if ( v2 >= 0x411E848000000000LL ) { *(double *)&X = _remainder_piby2d2f_forAsm(v1, *(_QWORD *)&X, 1); } else { v4 = _mm_cvttpd_epi32((__m128d)COERCE_UNSIGNED_INT64(*(double *)&v2 * 0.6366197723675814 + 0.5)); v5 = _mm_cvtepi32_pd(v4).m128d_f64[0]; v6 = *(double *)&v2 - 1.570796326734126 * v5; v3 = _mm_cvtsi128_si32(v4); *(double *)&X = v6 - 6.077100506506192e-11 * v5; if ( (__int64)((v2 >> 52) - ((unsigned __int64)(2LL * *(_QWORD *)&X) >> 53)) > 15 ) *(double *)&X = v6 - 6.077100506303966e-11 * v5 - (2.022266248795951e-21 * v5 - (v6 - (v6 - 6.077100506303966e-11 * v5) - 6.077100506303966e-11 * v5)); if ( (unsigned __int64)(2 * COERCE__INT64(v6 - 6.077100506506192e-11 * v5)) >> 53 < 0x3F2 ) { if ( (unsigned __int64)(2 * COERCE__INT64(v6 - 6.077100506506192e-11 * v5)) >> 53 <= 0x3DE ) { if ( (v3 & 1) == 0 ) *(_QWORD *)&X = 0x3FF0000000000000LL; } else { v7 = *(double *)&X * *(double *)&X; if ( (v3 & 1) != 0 ) *(double *)&X = *(double *)&X - 0.1666666666666667 * *(double *)&X * v7; else *(double *)&X = 1.0 - v7 * 0.5; } goto Lcosf_sse2_adjust_region; } } } else { v3 = 0; } v8 = *(double *)&X * *(double *)&X; if ( (v3 & 1) != 0 ) *(double *)&X = *(double *)&X + ((0.000002755731922398589 * v8 + -0.0001984126984126984) * (v8 * v8) + 0.008333333333333333 * v8 + -0.1666666666666667) * (*(double *)&X * v8); else *(double *)&X = -0.5 * v8 + 1.0 + ((-0.0000002755731922398589 * v8 + 0.0000248015873015873) * (v8 * v8) + -0.001388888888888889 * v8 + 0.04166666666666666) * (v8 * v8); Lcosf_sse2_adjust_region: if ( ((v3 + 1) & 2) != 0 ) *(double *)&X = 0.0 - *(double *)&X; return *(double *)&X; } return cosf_special(); } __asm { vmovd eax, xmm0 } if ( (_EAX & 0x7F800000) == 0x7F800000 ) return cosf_special(); __asm { vcvtss2sd xmm5, xmm0, xmm0 vmovq r9, xmm5 } _R9 = _R9 & 0x7FFFFFFFFFFFFFFFLL; if ( _R9 > 0x3FE921FB54442D18LL ) { __asm { vmovq xmm0, r9 } if ( _R9 >= 0x41E921FB60000000LL ) { __asm { vmovq xmm0, r9 } _RAX = _remainder_piby2_fma3(); } else { __asm { vandpd xmm1, xmm0, cs:xmmword_180171AF0 vmovapd xmm2, cs:xmmword_180171A60 vfmadd213sd xmm2, xmm1, cs:qword_180171A50 vcvttpd2dq xmm2, xmm2 vpmovsxdq xmm1, xmm2 vandpd xmm4, xmm1, cs:xmmword_180171B00 vshufps xmm1, xmm1, xmm1, 8 vcvtdq2pd xmm1, xmm1 vmovdqa xmm2, xmm0 vfnmadd231sd xmm2, xmm1, cs:qword_180171A90 vmulsd xmm3, xmm1, cs:qword_180171AA0 vsubsd xmm0, xmm2, xmm3 vsubsd xmm2, xmm2, xmm0 vsubsd xmm1, xmm2, xmm3 vmovq rax, xmm4 } } if ( (_RAX & 1) != 0 ) { __asm { vmovsd xmm1, cs:qword_180175680 vmulsd xmm3, xmm0, xmm0 vfmadd231sd xmm1, xmm3, cs:qword_180175688 vfmadd213sd xmm1, xmm3, cs:qword_180175678 vfmadd213sd xmm1, xmm3, cs:qword_180175670 vmulsd xmm3, xmm0, xmm3 vfmadd231sd xmm0, xmm1, xmm3 } } else { __asm { vmovapd xmm2, cs:xmmword_180171A40 vmulsd xmm3, xmm0, xmm0 vmulsd xmm1, xmm3, cs:qword_180171A50 vsubsd xmm2, xmm2, xmm1 vmovsd xmm1, cs:qword_180175658 vfmadd231sd xmm1, xmm3, cs:qword_180175660 vfmadd213sd xmm1, xmm3, cs:qword_180175650 vfmadd213sd xmm1, xmm3, cs:qword_180175648 vmulsd xmm3, xmm3, xmm3 vmovdqa xmm0, xmm2 vfmadd231sd xmm0, xmm1, xmm3 } } _RAX = (unsigned __int64)(_RAX + 1) >> 1 << 63; __asm { vmovq xmm3, rax vxorpd xmm0, xmm0, xmm3 vcvtsd2ss xmm0, xmm0, xmm0 } } else if ( _R9 >= 0x3F80000000000000LL ) { *(double *)&_XMM0 = *(double *)&_XMM5; __asm { vmovapd xmm2, cs:xmmword_180171A40 vmulsd xmm3, xmm0, xmm0 vmulsd xmm1, xmm3, cs:qword_180171A50 vsubsd xmm2, xmm2, xmm1 vmovsd xmm1, cs:qword_180175658 vfmadd231sd xmm1, xmm3, cs:qword_180175660 vfmadd213sd xmm1, xmm3, cs:qword_180175650 vfmadd213sd xmm1, xmm3, cs:qword_180175648 vmulsd xmm3, xmm3, xmm3 vmovdqa xmm0, xmm2 vfmadd231sd xmm0, xmm1, xmm3 vcvtsd2ss xmm0, xmm0, xmm0 } } else if ( _R9 >= 0x3F20000000000000LL ) { __asm { vmulsd xmm0, xmm5, cs:qword_180171A50 vfnmadd213sd xmm0, xmm5, qword ptr cs:xmmword_180171A40 vcvtsd2ss xmm0, xmm0, xmm0 } } else { __asm { vaddss xmm1, xmm0, cs:dword_180171B40 vmovd xmm0, cs:dword_180171B48 } } return X; }