// File: /workspace/github_c_makefile_star2_O3/nkanaev[P]tipsy/src/tipsy.c
// Function: obj_normalize
void obj_normalize(Obj *obj) {
  Vec min = {FLT_MAX, FLT_MAX, FLT_MAX}, max = {FLT_MIN, FLT_MIN, FLT_MIN};
  for (int i = 0; i < obj->v->len; i++) {
    Vec v = VREF(list_get(obj->v, i));
    min.x = fminf(min.x, v.x); max.x = fmaxf(max.x, v.x);
    min.y = fminf(min.y, v.y); max.y = fmaxf(max.y, v.y);
    min.z = fminf(min.z, v.z); max.z = fmaxf(max.z, v.z);
  }

  Vec size = vec_sub(max, min);
  float W = fmaxf(fmaxf(size.x, size.y), size.z);

  for (int i = 0; i < obj->v->len; i++) {
    Vec *v = (Vec*)list_get(obj->v, i);
    v->x = ((v->x - min.x) / W*2 - size.x/W);
    v->y = -((v->y - min.y) / W*2 - size.y/W);
    v->z = -((v->z - min.z) / W*2 - size.z/W);
  }

  for (int i = 0; i < obj->vn->len; i++) {
    Vec *vn = (Vec*)list_get(obj->vn, i);
    Vec nrm = vec_nrm(*vn);
    vn->x = nrm.x;
    vn->y = -nrm.y;
    vn->z = -nrm.z;
  }
}

// Assembly:
movq (%rdi), %rcx
movslq 0x8(%rcx), %rax
testq %rax, %rax
jle 0x8fe4
movq (%rcx), %rdx
movslq 0x10(%rcx), %rsi
addq $0x8, %rdx
movaps 0x3ebb(%rip), %xmm7     # 0xce00
movss 0x3e4f(%rip), %xmm4     # 0xcd9c
movaps 0x3e9c(%rip), %xmm5     # 0xcdf0
movss 0x3e3c(%rip), %xmm0     # 0xcd98
movq %rax, %r8
movaps %xmm7, %xmm3
movaps %xmm5, %xmm1
movaps %xmm4, %xmm2
movss (%rdx), %xmm6
movsd -0x8(%rdx), %xmm8
cmpunordps %xmm3, %xmm3
movaps %xmm8, %xmm9
andps %xmm3, %xmm9
movaps %xmm8, %xmm10
maxps %xmm7, %xmm10
andnps %xmm10, %xmm3
orps %xmm9, %xmm3
cmpunordps %xmm1, %xmm1
movaps %xmm8, %xmm7
andps %xmm1, %xmm7
minps %xmm5, %xmm8
andnps %xmm8, %xmm1
orps %xmm7, %xmm1
movaps %xmm6, %xmm5
minss %xmm0, %xmm5
cmpunordss %xmm0, %xmm0
movaps %xmm0, %xmm7
andps %xmm6, %xmm7
andnps %xmm5, %xmm0
orps %xmm7, %xmm0
cmpunordss %xmm2, %xmm2
movaps %xmm2, %xmm5
andps %xmm6, %xmm5
maxss %xmm4, %xmm6
andnps %xmm6, %xmm2
orps %xmm5, %xmm2
addq %rsi, %rdx
movaps %xmm1, %xmm5
movaps %xmm2, %xmm4
movaps %xmm3, %xmm7
decq %r8
jne 0x8f68
jmp 0x9002
movss 0x3dac(%rip), %xmm0     # 0xcd98
movaps 0x3dfd(%rip), %xmm1     # 0xcdf0
movss 0x3da1(%rip), %xmm2     # 0xcd9c
movaps 0x3dfe(%rip), %xmm3     # 0xce00
testl %eax, %eax
jle 0x90bc
movaps %xmm3, %xmm4
subss %xmm1, %xmm4
shufps $0xd4, %xmm3, %xmm2     # xmm2 = xmm2[0,1],xmm3[1,3]
shufps $0x52, %xmm3, %xmm2     # xmm2 = xmm2[2,0],xmm3[1,1]
shufps $0xd4, %xmm1, %xmm0     # xmm0 = xmm0[0,1],xmm1[1,3]
shufps $0x52, %xmm1, %xmm0     # xmm0 = xmm0[2,0],xmm1[1,1]
subps %xmm0, %xmm2
movaps %xmm2, %xmm5
shufps $0x55, %xmm2, %xmm5     # xmm5 = xmm5[1,1],xmm2[1,1]
movaps %xmm4, %xmm3
cmpunordss %xmm4, %xmm3
movaps %xmm3, %xmm6
andps %xmm2, %xmm6
movaps %xmm2, %xmm7
maxss %xmm4, %xmm7
andnps %xmm7, %xmm3
orps %xmm6, %xmm3
movaps %xmm5, %xmm6
maxss %xmm3, %xmm6
cmpunordss %xmm3, %xmm3
movaps %xmm3, %xmm7
andnps %xmm6, %xmm7
andps %xmm5, %xmm3
orps %xmm7, %xmm3
movq (%rcx), %rdx
movslq 0x10(%rcx), %rcx
movaps 0x1fc4(%rip), %xmm5     # 0xb030
xorps %xmm5, %xmm4
divss %xmm3, %xmm4
xorps %xmm5, %xmm2
movaps %xmm3, %xmm6
shufps $0x0, %xmm3, %xmm6      # xmm6 = xmm6[0,0],xmm3[0,0]
divps %xmm6, %xmm2
addq $0x4, %rdx
movss -0x4(%rdx), %xmm7
subss %xmm1, %xmm7
divss %xmm3, %xmm7
addss %xmm7, %xmm7
addss %xmm4, %xmm7
movss %xmm7, -0x4(%rdx)
movsd (%rdx), %xmm7
subps %xmm0, %xmm7
divps %xmm6, %xmm7
addps %xmm7, %xmm7
addps %xmm2, %xmm7
xorps %xmm5, %xmm7
movlps %xmm7, (%rdx)
addq %rcx, %rdx
decq %rax
jne 0x9084
movq 0x8(%rdi), %rdx
movslq 0x8(%rdx), %rax
testq %rax, %rax
jle 0x9143
movq (%rdx), %rcx
movslq 0x10(%rdx), %rdx
addq $0x8, %rcx
movss 0x1fe4(%rip), %xmm0     # 0xb0c0
movaps 0x1f4d(%rip), %xmm1     # 0xb030
movsd -0x8(%rcx), %xmm2
movss (%rcx), %xmm3
movaps %xmm2, %xmm4
shufps $0x55, %xmm2, %xmm4     # xmm4 = xmm4[1,1],xmm2[1,1]
movaps %xmm4, %xmm5
mulss %xmm4, %xmm5
movaps %xmm2, %xmm6
mulss %xmm2, %xmm6
addss %xmm5, %xmm6
movaps %xmm3, %xmm5
mulss %xmm3, %xmm5
addss %xmm6, %xmm5
sqrtss %xmm5, %xmm5
movaps %xmm0, %xmm6
divss %xmm5, %xmm6
mulss %xmm6, %xmm2
movss %xmm2, -0x8(%rcx)
xorps %xmm1, %xmm4
mulss %xmm6, %xmm4
movss %xmm4, -0x4(%rcx)
xorps %xmm1, %xmm6
mulss %xmm3, %xmm6
movss %xmm6, (%rcx)
addq %rdx, %rcx
decq %rax
jne 0x90e3
retq