summaryrefslogtreecommitdiff
path: root/libmeidogte/vectornormals.s
blob: 0dbe1e870171282a9e7c7bb61f7cd15f58820ec8 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
.set noreorder
.set noat

.include "gtereg.h"
.include "inline_s.h"

.section .text


.global VectorNormalS
.type VectorNormalS, @function
VectorNormalS:
	lw		$t0, 0($a0)
	lw		$t1, 4($a0)
	lw		$t2, 8($a0)
	
	mtc2	$t0, C2_IR1
	mtc2	$t1, C2_IR2
	mtc2	$t2, C2_IR3
	
	nSQR(0)
	
	mfc2	$t3, C2_MAC1
	mfc2	$t4, C2_MAC2
	mfc2	$t5, C2_MAC3
	
	add		$t3, $t4
	add		$v0, $t3, $t5
	mtc2	$v0, C2_LZCS
	nop
	nop
	mfc2	$v1, C2_LZCR
	
	addiu	$at, $0 , -2
	and		$v1, $at
	
	addiu	$t6, $0 , 0x1f
	sub		$t6, $v1
	sra		$t6, 1
	addiu	$t3, $v1, -24
	
	bltz	$t3, $value_neg
	nop
	b		$value_pos
	sllv	$t4, $v0, $t3
$value_neg:
	addiu	$t3, $0 , 24
	sub		$t3, $v1
	srav	$t4, $v0, $t3
$value_pos:
	addi	$t4, -64
	sll		$t4, 1
	
	la		$t5, _norm_table
	addu	$t5, $t4
	lh		$t5, 0($t5)
	nop
	
	mtc2	$t5, C2_IR0
	mtc2	$t0, C2_IR1
	mtc2	$t1, C2_IR2
	mtc2	$t2, C2_IR3
	
	nGPF(0)
	
	mfc2	$t0, C2_MAC1
	mfc2	$t1, C2_MAC2
	mfc2	$t2, C2_MAC3
	
	sra		$t0, $t6
	sra		$t1, $t6
	sra		$t2, $t6
	
	sh		$t0, 0($a1)
	sh		$t1, 2($a1)
	jr		$ra
	sh		$t2, 4($a1)


.section .data

_norm_table:
	.hword	0x1000, 0x0FE0, 0x0FC1, 0x0FA3, 0x0F85, 0x0F68, 0x0F4C, 0x0F30
	.hword	0x0F15, 0x0EFB, 0x0EE1, 0x0EC7, 0x0EAE, 0x0E96, 0x0E7E, 0x0E66
	.hword	0x0E4F, 0x0E38, 0x0E22, 0x0E0C, 0x0DF7, 0x0DE2, 0x0DCD, 0x0DB9
	.hword	0x0DA5, 0x0D91, 0x0D7E, 0x0D6B, 0x0D58, 0x0D45, 0x0D33, 0x0D21
	.hword	0x0D10, 0x0CFF, 0x0CEE, 0x0CDD, 0x0CCC, 0x0CBC, 0x0CAC, 0x0C9C
	.hword	0x0C8D, 0x0C7D, 0x0C6E, 0x0C5F, 0x0C51, 0x0C42, 0x0C34, 0x0C26
	.hword	0x0C18, 0x0C0A, 0x0BFD, 0x0BEF, 0x0BE2, 0x0BD5, 0x0BC8, 0x0BBB
	.hword	0x0BAF, 0x0BA2, 0x0B96, 0x0B8A, 0x0B7E, 0x0B72, 0x0B67, 0x0B5B
	.hword	0x0B50, 0x0B45, 0x0B39, 0x0B2E, 0x0B24, 0x0B19, 0x0B0E, 0x0B04
	.hword	0x0AF9, 0x0AEF, 0x0AE5, 0x0ADB, 0x0AD1, 0x0AC7, 0x0ABD, 0x0AB4
	.hword	0x0AAA, 0x0AA1, 0x0A97, 0x0A8E, 0x0A85, 0x0A7C, 0x0A73, 0x0A6A
	.hword	0x0A61, 0x0A59, 0x0A50, 0x0A47, 0x0A3F, 0x0A37, 0x0A2E, 0x0A26
	.hword	0x0A1E, 0x0A16, 0x0A0E, 0x0A06, 0x09FE, 0x09F6, 0x09EF, 0x09E7
	.hword	0x09E0, 0x09D8, 0x09D1, 0x09C9, 0x09C2, 0x09BB, 0x09B4, 0x09AD
	.hword	0x09A5, 0x099E, 0x0998, 0x0991, 0x098A, 0x0983, 0x097C, 0x0976
	.hword	0x096F, 0x0969, 0x0962, 0x095C, 0x0955, 0x094F, 0x0949, 0x0943
	.hword	0x093C, 0x0936, 0x0930, 0x092A, 0x0924, 0x091E, 0x0918, 0x0912
	.hword	0x090D, 0x0907, 0x0901, 0x08FB, 0x08F6, 0x08F0, 0x08EB, 0x08E5
	.hword	0x08E0, 0x08DA, 0x08D5, 0x08CF, 0x08CA, 0x08C5, 0x08BF, 0x08BA
	.hword	0x08B5, 0x08B0, 0x08AB, 0x08A6, 0x08A1, 0x089C, 0x0897, 0x0892
	.hword	0x088D, 0x0888, 0x0883, 0x087E, 0x087A, 0x0875, 0x0870, 0x086B
	.hword	0x0867, 0x0862, 0x085E, 0x0859, 0x0855, 0x0850, 0x084C, 0x0847
	.hword	0x0843, 0x083E, 0x083A, 0x0836, 0x0831, 0x082D, 0x0829, 0x0824
	.hword	0x0820, 0x081C, 0x0818, 0x0814, 0x0810, 0x080C, 0x0808, 0x0804