// File: BartMassey[P]ancient-raytracer/xform.cc
// Function: xform::xform(xform_types, point)
xform::xform( enum xform_types t, point r ) {
  int i, j;

  assert( r.d() > 2 );
  m = &mv;
  mi = &miv;
  for( i = 0; i < 4; i++ )
    for( j = 0; j < 4; j++ ) {
      (*m)[i][j] = 0;
      (*mi)[i][j] = 0;
    }
  switch( t ) {
  case XFORM_TRANSLATE:
    (*m)[0][0] = 1;
    (*m)[1][1] = 1;
    (*m)[2][2] = 1;
    (*m)[3][3] = 1;
    (*m)[0][3] = r[0];
    (*m)[1][3] = r[1];
    (*m)[2][3] = r[2];
    (*mi)[0][0] = 1;
    (*mi)[1][1] = 1;
    (*mi)[2][2] = 1;
    (*mi)[3][3] = 1;
    (*mi)[0][3] = -r[0];
    (*mi)[1][3] = -r[1];
    (*mi)[2][3] = -r[2];
    break;
  case XFORM_SCALE:
    assert( r[0] > TINY && r[1] > TINY && r[2] > TINY );
    (*m)[0][0] = r[0];
    (*m)[1][1] = r[1];
    (*m)[2][2] = r[2];
    (*m)[3][3] = 1;
    (*mi)[0][0] = 1.0/r[0];
    (*mi)[1][1] = 1.0/r[1];
    (*mi)[2][2] = 1.0/r[2];
    (*mi)[3][3] = 1;
    break;
  default:
    assert( 0 );
  }
}

// Assembly:
pushq %rbp
movq %rsp, %rbp
subq $0x40, %rsp
movq %rdx, -0x38(%rbp)
movq %rdi, %rax
movq -0x38(%rbp), %rdi
movq %rdi, -0x30(%rbp)
movq %rax, -0x8(%rbp)
movl %esi, -0xc(%rbp)
movq %rdi, -0x18(%rbp)
movq -0x8(%rbp), %rax
movq %rax, -0x28(%rbp)
leaq 0x875f(%rip), %rcx      # 0xea50
addq $0x10, %rcx
movq %rcx, (%rax)
callq 0x3f20
cmpl $0x2, %eax
jle 0x6304
jmp 0x6323
leaq 0x5143(%rip), %rdi      # 0xb44e
leaq 0x50ee(%rip), %rsi      # 0xb400
movl $0x5f, %edx
leaq 0x513a(%rip), %rcx      # 0xb458
callq 0x20b0
movq -0x28(%rbp), %rax
movq %rax, %rcx
addq $0x18, %rcx
movq %rcx, 0x8(%rax)
movq %rax, %rcx
addq $0x58, %rcx
movq %rcx, 0x10(%rax)
movl $0x0, -0x1c(%rbp)
cmpl $0x4, -0x1c(%rbp)
jge 0x63a9
movl $0x0, -0x20(%rbp)
cmpl $0x4, -0x20(%rbp)
jge 0x639c
movq -0x28(%rbp), %rax
movq 0x8(%rax), %rcx
movslq -0x1c(%rbp), %rdx
shlq $0x4, %rdx
addq %rdx, %rcx
movslq -0x20(%rbp), %rdx
xorps %xmm0, %xmm0
movss %xmm0, (%rcx,%rdx,4)
movq 0x10(%rax), %rax
movslq -0x1c(%rbp), %rcx
shlq $0x4, %rcx
addq %rcx, %rax
movslq -0x20(%rbp), %rcx
xorps %xmm0, %xmm0
movss %xmm0, (%rax,%rcx,4)
movl -0x20(%rbp), %eax
addl $0x1, %eax
movl %eax, -0x20(%rbp)
jmp 0x6351
jmp 0x639e
movl -0x1c(%rbp), %eax
addl $0x1, %eax
movl %eax, -0x1c(%rbp)
jmp 0x6344
movl -0xc(%rbp), %eax
movl %eax, -0x3c(%rbp)
subl $0x1, %eax
je 0x63c7
jmp 0x63b6
movl -0x3c(%rbp), %eax
subl $0x2, %eax
je 0x6546
jmp 0x670b
movq -0x28(%rbp), %rax
movq -0x30(%rbp), %rdi
movq 0x8(%rax), %rcx
movss 0x4c29(%rip), %xmm0     # 0xb004
movss %xmm0, (%rcx)
movq 0x8(%rax), %rcx
movss 0x4c19(%rip), %xmm0     # 0xb004
movss %xmm0, 0x14(%rcx)
movq 0x8(%rax), %rcx
movss 0x4c08(%rip), %xmm0     # 0xb004
movss %xmm0, 0x28(%rcx)
movq 0x8(%rax), %rax
movss 0x4bf7(%rip), %xmm0     # 0xb004
movss %xmm0, 0x3c(%rax)
xorl %esi, %esi
callq 0x32c0
movq -0x30(%rbp), %rdi
movq %rax, %rcx
movq -0x28(%rbp), %rax
movss (%rcx), %xmm0
movq 0x8(%rax), %rax
movss %xmm0, 0xc(%rax)
movl $0x1, %esi
callq 0x32c0
movq -0x30(%rbp), %rdi
movq %rax, %rcx
movq -0x28(%rbp), %rax
movss (%rcx), %xmm0
movq 0x8(%rax), %rax
movss %xmm0, 0x1c(%rax)
movl $0x2, %esi
callq 0x32c0
movq -0x30(%rbp), %rdi
movq %rax, %rcx
movq -0x28(%rbp), %rax
movss (%rcx), %xmm0
movq 0x8(%rax), %rcx
movss %xmm0, 0x2c(%rcx)
movq 0x10(%rax), %rcx
movss 0x4b83(%rip), %xmm0     # 0xb004
movss %xmm0, (%rcx)
movq 0x10(%rax), %rcx
movss 0x4b73(%rip), %xmm0     # 0xb004
movss %xmm0, 0x14(%rcx)
movq 0x10(%rax), %rcx
movss 0x4b62(%rip), %xmm0     # 0xb004
movss %xmm0, 0x28(%rcx)
movq 0x10(%rax), %rax
movss 0x4b51(%rip), %xmm0     # 0xb004
movss %xmm0, 0x3c(%rax)
xorl %esi, %esi
callq 0x32c0
movq -0x30(%rbp), %rdi
movq %rax, %rcx
movq -0x28(%rbp), %rax
movss (%rcx), %xmm0
movd %xmm0, %ecx
xorl $0x80000000, %ecx       # imm = 0x80000000
movd %ecx, %xmm0
movq 0x10(%rax), %rax
movss %xmm0, 0xc(%rax)
movl $0x1, %esi
callq 0x32c0
movq -0x30(%rbp), %rdi
movq %rax, %rcx
movq -0x28(%rbp), %rax
movss (%rcx), %xmm0
movd %xmm0, %ecx
xorl $0x80000000, %ecx       # imm = 0x80000000
movd %ecx, %xmm0
movq 0x10(%rax), %rax
movss %xmm0, 0x1c(%rax)
movl $0x2, %esi
callq 0x32c0
movq %rax, %rcx
movq -0x28(%rbp), %rax
movss (%rcx), %xmm0
movd %xmm0, %ecx
xorl $0x80000000, %ecx       # imm = 0x80000000
movd %ecx, %xmm0
movq 0x10(%rax), %rax
movss %xmm0, 0x2c(%rax)
jmp 0x672a
movq -0x30(%rbp), %rdi
xorl %esi, %esi
callq 0x32c0
movss (%rax), %xmm0
cvtss2sd %xmm0, %xmm0
xorl %eax, %eax
movsd 0x4ad5(%rip), %xmm1     # 0xb038
ucomisd %xmm1, %xmm0
movb %al, -0x3d(%rbp)
jbe 0x65bd
movq -0x30(%rbp), %rdi
movl $0x1, %esi
callq 0x32c0
movss (%rax), %xmm0
cvtss2sd %xmm0, %xmm0
xorl %eax, %eax
movsd 0x4aac(%rip), %xmm1     # 0xb038
ucomisd %xmm1, %xmm0
movb %al, -0x3d(%rbp)
jbe 0x65bd
movq -0x30(%rbp), %rdi
movl $0x2, %esi
callq 0x32c0
movss (%rax), %xmm0
cvtss2sd %xmm0, %xmm0
movsd 0x4a85(%rip), %xmm1     # 0xb038
ucomisd %xmm1, %xmm0
seta %al
movb %al, -0x3d(%rbp)
movb -0x3d(%rbp), %al
testb $0x1, %al
jne 0x65c6
jmp 0x65c8
jmp 0x65e7
leaq 0x4eaf(%rip), %rdi      # 0xb47e
leaq 0x4e2a(%rip), %rsi      # 0xb400
movl $0x79, %edx
leaq 0x4e76(%rip), %rcx      # 0xb458
callq 0x20b0
movq -0x30(%rbp), %rdi
xorl %esi, %esi
callq 0x32c0
movq -0x30(%rbp), %rdi
movq %rax, %rcx
movq -0x28(%rbp), %rax
movss (%rcx), %xmm0
movq 0x8(%rax), %rax
movss %xmm0, (%rax)
movl $0x1, %esi
callq 0x32c0
movq -0x30(%rbp), %rdi
movq %rax, %rcx
movq -0x28(%rbp), %rax
movss (%rcx), %xmm0
movq 0x8(%rax), %rax
movss %xmm0, 0x14(%rax)
movl $0x2, %esi
callq 0x32c0
movq -0x30(%rbp), %rdi
movq %rax, %rcx
movq -0x28(%rbp), %rax
movss (%rcx), %xmm0
movq 0x8(%rax), %rcx
movss %xmm0, 0x28(%rcx)
movq 0x8(%rax), %rax
movss 0x49ab(%rip), %xmm0     # 0xb004
movss %xmm0, 0x3c(%rax)
xorl %esi, %esi
callq 0x32c0
movq -0x30(%rbp), %rdi
movq %rax, %rcx
movq -0x28(%rbp), %rax
movss (%rcx), %xmm0
cvtss2sd %xmm0, %xmm1
movsd 0x49c0(%rip), %xmm0     # 0xb040
divsd %xmm1, %xmm0
cvtsd2ss %xmm0, %xmm0
movq 0x10(%rax), %rax
movss %xmm0, (%rax)
movl $0x1, %esi
callq 0x32c0
movq -0x30(%rbp), %rdi
movq %rax, %rcx
movq -0x28(%rbp), %rax
movss (%rcx), %xmm0
cvtss2sd %xmm0, %xmm1
movsd 0x498b(%rip), %xmm0     # 0xb040
divsd %xmm1, %xmm0
cvtsd2ss %xmm0, %xmm0
movq 0x10(%rax), %rax
movss %xmm0, 0x14(%rax)
movl $0x2, %esi
callq 0x32c0
movq %rax, %rcx
movq -0x28(%rbp), %rax
movss (%rcx), %xmm0
cvtss2sd %xmm0, %xmm1
movsd 0x4959(%rip), %xmm0     # 0xb040
divsd %xmm1, %xmm0
cvtsd2ss %xmm0, %xmm0
movq 0x10(%rax), %rcx
movss %xmm0, 0x28(%rcx)
movq 0x10(%rax), %rax
movss 0x4900(%rip), %xmm0     # 0xb004
movss %xmm0, 0x3c(%rax)
jmp 0x672a
leaq 0x4bd1(%rip), %rdi      # 0xb2e3
leaq 0x4ce7(%rip), %rsi      # 0xb400
movl $0x84, %edx
leaq 0x4d33(%rip), %rcx      # 0xb458
callq 0x20b0
addq $0x40, %rsp
popq %rbp
retq