Skip to content

Instantly share code, notes, and snippets.

@kalomaze
Last active January 23, 2025 01:11
Show Gist options
  • Save kalomaze/701cc95ecbb31dbdbc5970872c2e7d2d to your computer and use it in GitHub Desktop.
Save kalomaze/701cc95ecbb31dbdbc5970872c2e7d2d to your computer and use it in GitHub Desktop.
DeepSeek r1 MIPS decompilation test

What the original function actually looked like:

f32 atan2(f32 startX, f32 startZ, f32 endX, f32 endZ) {
    f32 xDiff = endX - startX;
    f32 zDiff = endZ - startZ;
    f32 absXDiff = fabsf(xDiff);
    f32 absZDiff = fabsf(zDiff);
    f32 ret;

    if (absZDiff < absXDiff) {
        ret = (absZDiff / absXDiff) * 45.0f;
        ret *= sAtanFactors[round(2.0f * ret)];
        if (xDiff >= 0.0f) {
            if (zDiff >= 0.0f) {
                return ret + 90.0f;
            } else {
                return 90.0f - ret;
            }
        }
        if (zDiff >= 0.0f) {
            return 270.0f - ret;
        } else {
            return ret + 270.0f;
        }
    } else {
        if (absZDiff == 0.0f) {
            return 0.0f;
        }
        ret = (absXDiff / absZDiff) * 45.0f;
        ret *= sAtanFactors[round(2.0f * ret)];
        if (zDiff >= 0.0f) {
            if (xDiff >= 0.0f) {
                return 180.0f - ret;
            } else {
                return ret + 180.0f;
            }
        } else if (!(xDiff >= 0.0f)) {
            return 360.0f - ret;
        }
    }
    return ret;
}

What r1 gave me:

#include <math.h>

// External lookup table for precomputed coefficients (likely generated during compilation)
extern float D_80074414[];

float atan2_custom(float x1, float y1, float x2, float y2) {
    float dx = x2 - x1;
    float dy = y2 - y1;
    float abs_dx = fabsf(dx);
    float abs_dy = fabsf(dy);
    float ratio, angle;
    int index;

    if (abs_dy < abs_dx) {
        // Case 1: |dy| < |dx|, use dy/dx ratio
        ratio = abs_dy / abs_dx * 45.0f;
        index = round(ratio * 2.0f);
        angle = ratio * D_80074414[index];

        // Adjust angle based on quadrant
        if (dx >= 0.0f) {
            angle = (dy >= 0.0f) ? (90.0f + angle) : (90.0f - angle);
        } else {
            angle = (dy >= 0.0f) ? (270.0f - angle) : (270.0f + angle);
        }
    } else {
        // Case 2: |dx| <= |dy|, use dx/dy ratio
        if (abs_dy == 0.0f) return 0.0f; // Avoid division by zero

        ratio = abs_dx / abs_dy * 45.0f;
        index = round(ratio * 2.0f);
        angle = ratio * D_80074414[index];

        // Adjust angle based on quadrant
        if (dy >= 0.0f) {
            angle = (dx >= 0.0f) ? (180.0f - angle) : (180.0f + angle);
        } else {
            angle = (dx >= 0.0f) ? (360.0f - angle) : (360.0f + angle);
        }
    }

    return angle;
}

The MIPS context that r1 was given:

glabel atan2
/* 5080 80029C80 44863000 */  mtc1      $a2, $f6
/* 5084 80029C84 27BDFFC8 */  addiu     $sp, $sp, -0x38
/* 5088 80029C88 F7BA0030 */  sdc1      $f26, 0x30($sp)
/* 508C 80029C8C 460C3681 */  sub.s     $f26, $f6, $f12
/* 5090 80029C90 44873000 */  mtc1      $a3, $f6
/* 5094 80029C94 AFBF0010 */  sw        $ra, 0x10($sp)
/* 5098 80029C98 F7B80028 */  sdc1      $f24, 0x28($sp)
/* 509C 80029C9C 460E3601 */  sub.s     $f24, $f6, $f14
/* 50A0 80029CA0 F7B60020 */  sdc1      $f22, 0x20($sp)
/* 50A4 80029CA4 F7B40018 */  sdc1      $f20, 0x18($sp)
/* 50A8 80029CA8 4600D105 */  abs.s     $f4, $f26
/* 50AC 80029CAC 4600C005 */  abs.s     $f0, $f24
/* 50B0 80029CB0 4604003C */  c.lt.s    $f0, $f4
/* 50B4 80029CB4 00000000 */  nop
/* 50B8 80029CB8 45000029 */  bc1f      .L80029D60
/* 50BC 80029CBC 00000000 */   nop
/* 50C0 80029CC0 3C014234 */  lui       $at, (0x42340000 >> 16)
/* 50C4 80029CC4 44811000 */  mtc1      $at, $f2
/* 50C8 80029CC8 46040003 */  div.s     $f0, $f0, $f4
/* 50CC 80029CCC 46020502 */  mul.s     $f20, $f0, $f2
/* 50D0 80029CD0 00000000 */  nop
/* 50D4 80029CD4 0C00A6B1 */  jal       round
/* 50D8 80029CD8 4614A300 */   add.s    $f12, $f20, $f20
/* 50DC 80029CDC 00021080 */  sll       $v0, $v0, 2
/* 50E0 80029CE0 3C018007 */  lui       $at, %hi(D_80074414)
/* 50E4 80029CE4 00220821 */  addu      $at, $at, $v0
/* 50E8 80029CE8 C4204414 */  lwc1      $f0, %lo(D_80074414)($at)
/* 50EC 80029CEC 4600A502 */  mul.s     $f20, $f20, $f0
/* 50F0 80029CF0 00000000 */  nop
/* 50F4 80029CF4 44800000 */  mtc1      $zero, $f0
/* 50F8 80029CF8 00000000 */  nop
/* 50FC 80029CFC 461A003E */  c.le.s    $f0, $f26
/* 5100 80029D00 00000000 */  nop
/* 5104 80029D04 4500000D */  bc1f      .L80029D3C
/* 5108 80029D08 00000000 */   nop
/* 510C 80029D0C 4618003E */  c.le.s    $f0, $f24
/* 5110 80029D10 00000000 */  nop
/* 5114 80029D14 45000005 */  bc1f      .L80029D2C
/* 5118 80029D18 00000000 */   nop
/* 511C 80029D1C 3C0142B4 */  lui       $at, (0x42B40000 >> 16)
/* 5120 80029D20 44810000 */  mtc1      $at, $f0
/* 5124 80029D24 0800A781 */  j         .L80029E04
/* 5128 80029D28 4600A000 */   add.s    $f0, $f20, $f0
.L80029D2C:
/* 512C 80029D2C 3C0142B4 */  lui       $at, (0x42B40000 >> 16)
/* 5130 80029D30 44810000 */  mtc1      $at, $f0
/* 5134 80029D34 0800A781 */  j         .L80029E04
/* 5138 80029D38 46140001 */   sub.s    $f0, $f0, $f20
.L80029D3C:
/* 513C 80029D3C 4618003E */  c.le.s    $f0, $f24
/* 5140 80029D40 3C014387 */  lui       $at, (0x43870000 >> 16)
/* 5144 80029D44 44810000 */  mtc1      $at, $f0
/* 5148 80029D48 4503002E */  bc1tl     .L80029E04
/* 514C 80029D4C 46140001 */   sub.s    $f0, $f0, $f20
/* 5150 80029D50 3C014387 */  lui       $at, (0x43870000 >> 16)
/* 5154 80029D54 44810000 */  mtc1      $at, $f0
/* 5158 80029D58 0800A781 */  j         .L80029E04
/* 515C 80029D5C 4600A000 */   add.s    $f0, $f20, $f0
.L80029D60:
/* 5160 80029D60 4480B000 */  mtc1      $zero, $f22
/* 5164 80029D64 00000000 */  nop
/* 5168 80029D68 46160032 */  c.eq.s    $f0, $f22
/* 516C 80029D6C 00000000 */  nop
/* 5170 80029D70 45020003 */  bc1fl     .L80029D80
/* 5174 80029D74 46002003 */   div.s    $f0, $f4, $f0
/* 5178 80029D78 0800A781 */  j         .L80029E04
/* 517C 80029D7C 4600B006 */   mov.s    $f0, $f22
.L80029D80:
/* 5180 80029D80 3C014234 */  lui       $at, (0x42340000 >> 16)
/* 5184 80029D84 44811000 */  mtc1      $at, $f2
/* 5188 80029D88 00000000 */  nop
/* 518C 80029D8C 46020502 */  mul.s     $f20, $f0, $f2
/* 5190 80029D90 00000000 */  nop
/* 5194 80029D94 0C00A6B1 */  jal       round
/* 5198 80029D98 4614A300 */   add.s    $f12, $f20, $f20
/* 519C 80029D9C 00021080 */  sll       $v0, $v0, 2
/* 51A0 80029DA0 3C018007 */  lui       $at, %hi(D_80074414)
/* 51A4 80029DA4 00220821 */  addu      $at, $at, $v0
/* 51A8 80029DA8 C4204414 */  lwc1      $f0, %lo(D_80074414)($at)
/* 51AC 80029DAC 4618B03E */  c.le.s    $f22, $f24
/* 51B0 80029DB0 4600A502 */  mul.s     $f20, $f20, $f0
/* 51B4 80029DB4 00000000 */  nop
/* 51B8 80029DB8 4500000A */  bc1f      .L80029DE4
/* 51BC 80029DBC 00000000 */   nop
/* 51C0 80029DC0 461AB03E */  c.le.s    $f22, $f26
/* 51C4 80029DC4 3C014334 */  lui       $at, (0x43340000 >> 16)
/* 51C8 80029DC8 44810000 */  mtc1      $at, $f0
/* 51CC 80029DCC 4503000D */  bc1tl     .L80029E04
/* 51D0 80029DD0 46140001 */   sub.s    $f0, $f0, $f20
/* 51D4 80029DD4 3C014334 */  lui       $at, (0x43340000 >> 16)
/* 51D8 80029DD8 44810000 */  mtc1      $at, $f0
/* 51DC 80029DDC 0800A781 */  j         .L80029E04
/* 51E0 80029DE0 4600A000 */   add.s    $f0, $f20, $f0
.L80029DE4:
/* 51E4 80029DE4 461AB03E */  c.le.s    $f22, $f26
/* 51E8 80029DE8 00000000 */  nop
/* 51EC 80029DEC 45010005 */  bc1t      .L80029E04
/* 51F0 80029DF0 4600A006 */   mov.s    $f0, $f20
/* 51F4 80029DF4 3C0143B4 */  lui       $at, (0x43B40000 >> 16)
/* 51F8 80029DF8 44810000 */  mtc1      $at, $f0
/* 51FC 80029DFC 00000000 */  nop
/* 5200 80029E00 46140001 */  sub.s     $f0, $f0, $f20
.L80029E04:
/* 5204 80029E04 8FBF0010 */  lw        $ra, 0x10($sp)
/* 5208 80029E08 D7BA0030 */  ldc1      $f26, 0x30($sp)
/* 520C 80029E0C D7B80028 */  ldc1      $f24, 0x28($sp)
/* 5210 80029E10 D7B60020 */  ldc1      $f22, 0x20($sp)
/* 5214 80029E14 D7B40018 */  ldc1      $f20, 0x18($sp)
/* 5218 80029E18 03E00008 */  jr        $ra
/* 521C 80029E1C 27BD0038 */   addiu    $sp, $sp, 0x38
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment