-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathmath.s
More file actions
317 lines (251 loc) · 5.69 KB
/
math.s
File metadata and controls
317 lines (251 loc) · 5.69 KB
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
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
.section .data
.global ePI
ePI: .float 3.14159265359
fsc0: .float .99940307
fsc1: .float -.16582324
fsc2: .float .00760291
fcc0: .float .9996949
fcc1: .float -.49558072
fcc2: .float .03679168
negate_mask: .float -1.0, -1.0, -1.0, -1.0
.section .text
.global make_vec
make_vec:
pushq %rbp
movq %rsp, %rbp
subq $32, %rsp
movq $16, %rcx
call malloc
vpxor %xmm0, %xmm0, %xmm0
vmovups %xmm0, (%rax)
addq $32, %rsp
popq %rbp
ret
.global free_vec
free_vec:
pushq %rbp
movq %rsp, %rbp
subq $32, %rsp
call free
addq $32, %rsp
popq %rbp
ret
.global make_matrix
make_matrix:
pushq %rbp
movq %rsp, %rbp
subq $32, %rsp
movq $64, %rcx
call malloc
vpxor %ymm1, %ymm1, %ymm1
vmovups %ymm1, (%rax)
vmovups %ymm1, 32(%rax)
addq $32, %rsp
popq %rbp
ret
.global free_matrix
free_matrix:
pushq %rbp
movq %rsp, %rbp
subq $32, %rsp
call free
addq $32, %rsp
popq %rbp
ret
.global qsin
qsin:
vmulss %xmm0, %xmm0, %xmm1
movss %xmm1, %xmm5
movss fsc0(%rip), %xmm2
movss fsc1(%rip), %xmm3
movss fsc2(%rip), %xmm4
vfmadd132ss %xmm4, %xmm3, %xmm5
vfmadd132ss %xmm1, %xmm2, %xmm5
vmulss %xmm0, %xmm5, %xmm0
ret
.global qcos
qcos:
vmulss %xmm0, %xmm0, %xmm1
movss %xmm1, %xmm5
movss fcc0(%rip), %xmm2
movss fcc1(%rip), %xmm3
movss fcc2(%rip), %xmm4
vfmadd132ss %xmm4, %xmm3, %xmm5
vfmadd132ss %xmm1, %xmm2, %xmm5
movss %xmm5, %xmm0
ret
.global vmod
vmod:
vmovups (%rcx), %xmm0
vmulps %xmm0, %xmm0, %xmm0
vhaddps %xmm0, %xmm0, %xmm2
vhaddps %xmm2, %xmm2, %xmm0
sqrtss %xmm0, %xmm0
movss %xmm0, -4(%rbp)
movl -4(%rbp), %eax
ret
.global vneg
vneg:
vmovups (%rcx), %xmm0
vmovups negate_mask(%rip), %xmm1
vmulps %xmm0, %xmm1, %xmm0
vmovups %xmm0, (%rdx)
ret
.global vnorm
vnorm:
call vmod
movl %eax, -4(%rbp)
vbroadcastss -4(%rbp), %xmm0
vmovups (%rcx), %xmm1
vdivps %xmm0, %xmm1, %xmm0
vmovups %xmm0, (%rdx)
ret
.global vndc
vndc:
vbroadcastss 12(%rcx), %xmm0
vmovups (%rcx), %xmm1
vdivps %xmm0, %xmm1, %xmm0
vmovups %xmm0, (%rdx)
ret
.global vdot
vdot:
vmovups (%rcx), %xmm0
vmovups (%rdx), %xmm1
vmulps %xmm0, %xmm1, %xmm0
pxor %xmm2, %xmm2
vhaddps %xmm0, %xmm0, %xmm2
vhaddps %xmm2, %xmm2, %xmm0
vmovd %xmm0, %eax
ret
.global vcross
vcross:
movss 4(%rcx), %xmm0
mulss 8(%rdx), %xmm0
movss 8(%rcx), %xmm1
mulss 4(%rdx), %xmm1
subss %xmm1, %xmm0
movss %xmm0, (%r8)
movss (%rcx), %xmm0
mulss 8(%rdx), %xmm0
movss 8(%rcx), %xmm1
mulss (%rdx), %xmm1
subss %xmm0, %xmm1
movss %xmm1, 4(%r8)
movss (%rcx), %xmm0
mulss 4(%rdx), %xmm0
movss 4(%rcx), %xmm1
mulss (%rdx), %xmm1
subss %xmm1, %xmm0
movss %xmm0, 8(%r8)
ret
.global _256_mulmv
_256_mulmv:
vmovups (%rdx), %xmm1
vmovups (%rcx), %xmm0
vmulps %xmm0, %xmm1, %xmm0
vhaddps %xmm0, %xmm0, %xmm2
vhaddps %xmm2, %xmm2, %xmm0
movss %xmm0, (%r8)
vmovups 16(%rcx), %xmm0
vmulps %xmm0, %xmm1, %xmm0
vhaddps %xmm0, %xmm0, %xmm2
vhaddps %xmm2, %xmm2, %xmm0
movss %xmm0, 4(%r8)
vmovups 32(%rcx), %xmm0
vmulps %xmm0, %xmm1, %xmm0
vhaddps %xmm0, %xmm0, %xmm2
vhaddps %xmm2, %xmm2, %xmm0
movss %xmm0, 8(%r8)
vmovups 48(%rcx), %xmm0
vmulps %xmm0, %xmm1, %xmm0
vhaddps %xmm0, %xmm0, %xmm2
vhaddps %xmm2, %xmm2, %xmm0
movss %xmm0, 12(%r8)
ret
.global _512_mulmv
_512_mulmv:
vmovups (%rcx), %zmm1
vbroadcasti32x4 (%rdx), %zmm2
vmulps %zmm1, %zmm2, %zmm1
vmovshdup %zmm1, %zmm2
vaddps %zmm2, %zmm1, %zmm1
vpermilps $0x4E, %zmm1, %zmm2
vaddps %zmm2, %zmm1, %zmm1
movl $0x1111, %eax
kmovw %eax, %k1
vcompressps %zmm1, %zmm1 {%k1}{z}
vmovups %xmm1, (%r8)
ret
.global _256_mulqq
_256_mulqq:
movss 12(%rcx), %xmm0
mulss (%rdx), %xmm0
movss %xmm0, %xmm1
movss (%rcx), %xmm0
mulss 12(%rdx), %xmm0
addss %xmm0, %xmm1
movss 4(%rcx), %xmm0
mulss 8(%rdx), %xmm0
addss %xmm0, %xmm1
movss 8(%rcx), %xmm0
mulss 4(%rdx), %xmm0
subss %xmm0, %xmm1
movss %xmm1, (%r8)
movss 12(%rcx), %xmm0
mulss 4(%rdx), %xmm0
movss %xmm0, %xmm1
movss (%rcx), %xmm0
mulss 8(%rdx), %xmm0
subss %xmm0, %xmm1
movss 4(%rcx), %xmm0
mulss 12(%rdx), %xmm0
addss %xmm0, %xmm1
movss 8(%rcx), %xmm0
mulss (%rdx), %xmm0
addss %xmm0, %xmm1
movss %xmm1, 4(%r8)
movss 12(%rcx), %xmm0
mulss 8(%rdx), %xmm0
movss %xmm0, %xmm1
movss (%rcx), %xmm0
mulss 4(%rdx), %xmm0
addss %xmm0, %xmm1
movss 4(%rcx), %xmm0
mulss (%rdx), %xmm0
subss %xmm0, %xmm1
movss 8(%rcx), %xmm0
mulss 12(%rdx), %xmm0
addss %xmm0, %xmm1
movss %xmm1, 8(%r8)
movss 12(%rcx), %xmm0
mulss 12(%rdx), %xmm0
movss %xmm0, %xmm1
movss (%rcx), %xmm0
mulss (%rdx), %xmm0
subss %xmm0, %xmm1
movss 4(%rcx), %xmm0
mulss 4(%rdx), %xmm0
subss %xmm0, %xmm1
movss 8(%rcx), %xmm0
mulss 8(%rdx), %xmm0
subss %xmm0, %xmm1
movss %xmm1, 12(%r8)
ret
.global _512_mulqq
_512_mulqq:
call vcross
vmovups (%r8), %xmm2
vbroadcastss 12(%rcx), %xmm0
vmulps (%rdx), %xmm0, %xmm0
vbroadcastss 12(%rdx), %xmm1
vmulps (%rcx), %xmm1, %xmm1
vaddps %xmm1, %xmm0, %xmm0
vaddps %xmm2, %xmm0, %xmm3
call vdot
vmovd %eax, %xmm2
movss 12(%rdx), %xmm1
vmulss 12(%rcx), %xmm1, %xmm1
subss %xmm2, %xmm1
vmovups %xmm3, (%r8)
movss %xmm2, 12(%r8)
ret