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
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
|
; $Id: tstDisasm-1A.asm $
;; @file
; VBox disassembler: Assembler test routines
;
;
; Copyright (C) 2006-2019 Oracle Corporation
;
; This file is part of VirtualBox Open Source Edition (OSE), as
; available from http://www.virtualbox.org. This file is free software;
; you can redistribute it and/or modify it under the terms of the GNU
; General Public License (GPL) as published by the Free Software
; Foundation, in version 2 as it comes in the "COPYING" file of the
; VirtualBox OSE distribution. VirtualBox OSE is distributed in the
; hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
;
;*******************************************************************************
;* Header Files *
;*******************************************************************************
%include "iprt/asmdefs.mac"
;%include "VBox/vmm/vm.mac"
;%include "VBox/err.mac"
;%include "VBox/vmm/stam.mac"
;%include "iprt/x86.mac"
BITS 32
%if __YASM_VERSION_ID__ >= 001020001h ; v1.2.0.1 and greater, make sure to exclude v1.2.0.0.
%define pmulhrwa pmulhrw
%endif
BEGINCODE
align 16
BEGINPROC TestProc32
xor eax, eax
mov al, 4
lea edx, [4]
mov edx, 4
mov eax, 4
shl eax, 4
shl edx, 4
shr edx, 4
mov eax, edx
mov eax, ecx
mov edx, eax
mov ecx, eax
DB 0xF0, 0x0F, 0x22, 0xC0
DB 0xF0, 0x0F, 0x20, 0xC0
smsw word [edx+16]
; invept eax, dqword [ecx]
DB 0x66, 0x0F, 0x38, 0x80, 0x1
; invept eax, dqword [ecx]
DB 0x66, 0x0F, 0x38, 0x81, 0x1
mov eax, dword [ecx]
mov word [edi], 0123ah
movzx eax,byte [edx]
movzx eax,word [edx]
mov dword [es:ebx + 1234h], 0789h
mov word [fs:ebx + ecx], 0654h
mov byte [esi + eax*4], 054h
mov bl, byte [ds:ebp + 1234h]
mov al, [cs:1234h + ecx*8]
mov al, [cs:1234h]
mov ax, [cs:1234h]
mov eax, [cs:1234h]
lock cmpxchg [ecx], eax
lock cmpxchg [ecx], ax
lock cmpxchg [ecx], dl
movzx ESI,word [EAX]
in al, dx
in ax, dx
in eax, dx
mov ebx, [ecx + eax*4 + 17]
mov ebx, [ebp + eax*4 + 4]
mov ebx, [ebp + eax*4]
int 80h
in al, 60h
in ax, dx
out 64h, eax
movss xmm0, xmm1
movss xmm3, [eax]
movss [eax], xmm4
movsd xmm6, xmm1
pause
nop
; 3Dnow!
pavgusb mm1, mm0
pf2id mm5, mm4
pf2iw mm6, mm3
pfacc mm7, mm2
pfadd mm5, mm4
pfcmpeq mm6, mm3
pfcmpge mm2, mm7
pfcmpgt mm4, mm5
pfmax mm3, mm6
pfmin mm1, mm0
pfmul mm5, mm4
pmulhrwa mm3, mm6
pfnacc mm4, mm5
pfpnacc mm3, mm6
pfrcp mm0, mm1
pfrcpit1 mm2, mm7
pfrcpit2 mm4, mm5
pfrsqrt mm7, mm2
pfrsqit1 mm1, mm0
pfsub mm6, mm3
pfsubr mm0, mm1
pi2fd mm7, mm2
pi2fw mm0, mm1
pswapd mm2, mm7
pavgusb mm1, qword [es:eax+000000010h]
pf2id mm5, qword [ds:esi+000101010h]
pf2iw mm6, qword [fs:esi+000101010h]
pfacc mm7, qword [gs:esi+000101010h]
pfadd mm5, qword [ esi+000101010h]
pfcmpeq mm6, qword [ edi*8+000101010h]
pfcmpge mm2, qword [es:esi+000100010h]
pfcmpgt mm4, qword [es:esi+000101010h]
pfmax mm3, qword [es:esi+000101010h]
pfmin mm1, qword [es:esi+000101010h]
pfmul mm5, qword [es:esi+000101000h]
pmulhrwa mm3, qword [es:eax+0ffffffffh]
pfnacc mm4, qword [es:ebx+000101010h]
pfpnacc mm3, qword [es:edx+000102900h]
pfrcp mm0, qword [es:ecx+000101020h]
pfrcpit1 mm2, qword [es:ebp+000101510h]
pfrcpit2 mm4, qword [es:esp+000101310h]
pfrsqrt mm7, qword [es:esi+0f0106010h]
pfrsqit1 mm1, qword [es:edi+0001f1010h]
pfsub mm6, qword [es:esi*2]
pfsubr mm0, qword [es:esi*3]
pi2fd mm7, qword [es:esi*4]
pi2fw mm0, qword [es:esi*5]
pswapd mm2, qword [es:esi*8]
pmulhrwa mm0, qword [ds:ebp+edi*8+00f000001h]
; MMX
psubusb mm1, mm3
cvtpi2pd xmm0, mm3
paddd mm1, mm3
paddd xmm1, xmm3
%if __YASM_VERSION_ID__ >= 001030000h ; Old yasm doesn't support the instructions below
adcx eax, ebx
adcx eax, [edi]
adox eax, ebx
adox eax, [edi]
adox eax, [edi + 1000h]
tzcnt ax, bx
tzcnt eax, ebx
tzcnt ax, [edi]
tzcnt eax, [edi]
tzcnt eax, [edi + 1000h]
vpmovsxbw ymm0, xmm1
vpmovzxbq ymm1, [100h]
vgatherqps xmm0,dword [eax+xmm0*2],xmm0
vgatherqpd xmm0,qword [eax+xmm0*2],xmm0
%endif
movbe eax, [edi]
movbe ebx, [edi + 1000h]
movbe ax, [edi]
movbe [edi], eax
crc32 eax, bl
crc32 eax, bx
crc32 eax, ebx
crc32 eax, byte [edi]
crc32 eax, word [edi]
crc32 eax, dword [edi]
popcnt ax, bx
popcnt eax, ebx
popcnt ax, [edi]
popcnt eax, [edi]
popcnt eax, [edi + 1000h]
lzcnt ax, bx
lzcnt eax, ebx
lzcnt ax, [edi]
lzcnt eax, [edi]
lzcnt eax, [edi + 1000h]
vmread eax, ebx
vmwrite eax, ebx
movd mm0, [edi]
movq mm0, [edi]
movq mm0, mm1
vmovups xmm0, xmm1
vmovaps ymm0, ymm1
vunpcklps xmm0, xmm1, xmm2
vunpcklps ymm0, ymm1, ymm2
lddqu xmm1, [ds:ebp+edi*8+00f000001h]
vlddqu xmm1, [ds:ebp+edi*8+00f000001h]
vlddqu ymm1, [ds:ebp+edi*8+00f000001h]
vpmovsxbw xmm0,qword [0x100]
vbroadcastf128 ymm0,oword [0x100]
palignr mm0, mm1, 1
vpinsrb xmm0, xmm1, eax, 1
vpinsrb xmm0, xmm1, [100h], 1
vinsertps xmm0, xmm1, xmm2, 1
vinsertps xmm0, xmm1, [100h], 1
vblendvps xmm0, xmm1, xmm2, xmm3
vblendvps ymm0, ymm1, ymm2, ymm3
aesimc xmm0, xmm1
pmovzxbq xmm0, xmm1
pmovzxbq xmm1, [100h]
vfmaddsub132pd ymm1, ymm2, ymm3
ENDPROC TestProc32
%ifndef RT_OS_OS2
BITS 64
align 16
BEGINPROC TestProc64
mov cr8, rax
mov cr8, rbx
mov [0xfffe0080], rax
mov [0xfffe0080], rbx
mov rax, cr8
mov rbx, cr8
mov rax, [0xfffe0080]
mov rbx, [0xfffe0080]
divsd xmm1, xmm0
; invept rdi, dqword [rsi]
DB 0x66, 0x0F, 0x38, 0x80, 0x3E
; invept rcx, dqword [rdx]
DB 0x66, 0x0F, 0x38, 0x80, 0xA
;invvpid rdi, dqword [rsi]
DB 0x66, 0x0F, 0x38, 0x81, 0x3E
; invvpid rcx, dqword [rdx]
DB 0x66, 0x0F, 0x38, 0x81, 0xA
mov rdi, [rsi]
mov rcx, [rdx]
db 48h
db 0c7h
db 42h
db 18h
db 20h
db 3eh
db 23h
db 80h
call qword [r8+10h]
; test
db 48h
db 8bh
db 44h
db 0ah
db 0f8h
;incorrectly assembled by yasm; REX.W should not be added!
;test rax, dword 0cc90cc90h
db 8bh
db 04h
db 8dh
db 00h
db 00h
db 0feh
db 0ffh
mov qword [rcx+rdx], 0
mov dword [rcx+rdx], 0
and [r15], rax
movzx rcx, sil
and sil, 3
movzx ecx, ah
and ah, 3
sub rcx, 1234h
mov rax, qword [0cc90cc90h]
mov rax, qword [00c90cc90h]
mov rax, dword 0cc90cc90h
mov rax, qword 0ffffcc90cc90h
movzx rax,byte [edx]
movzx rax,word [edx]
movzx rax,byte [rdx]
lock cmpxchg [rcx], rax
lock cmpxchg [rcx], ax
lock cmpxchg [r15], dl
movzx RSI, word [R8]
in al, dx
in ax, dx
in eax, dx
mov rbx, [rcx + rax*4 + 17]
mov rbx, [rbp + rax*4 + 4]
mov rbx, [rbp + rax*4]
mov rbx, [ebp + eax*4]
int 80h
in al, 60h
in ax, dx
out 64h, eax
movss xmm0, xmm14
movsd xmm6, xmm1
movbe eax, [rdi]
movbe ax, [rdi]
movbe rax, [rdi]
crc32 eax, bl
crc32 eax, bx
crc32 eax, ebx
crc32 eax, byte [edi]
crc32 eax, word [edi]
crc32 eax, dword [edi]
crc32 rax, bl
crc32 rax, byte [rdi]
crc32 rax, qword [rdi]
%if __YASM_VERSION_ID__ >= 001030000h ; Old yasm doesn't support the instructions below
adcx eax, ebx
adcx rax, rbx
adcx r8, r11
adcx r8d, edx
adox eax, ebx
adox eax, [edi]
adox eax, [edi + 1000h]
adox rax, rbx
adox rax, [rdi]
adox rax, [rdi + 1000h]
adox rax, [edi + 1000h]
tzcnt ax, bx
tzcnt eax, ebx
tzcnt rax, rbx
tzcnt ax, [edi]
tzcnt eax, [edi]
tzcnt eax, [edi + 1000h]
vpunpcklbw ymm1, ymm2, ymm3
vpmovsxbw ymm4,[0x100]
vgatherqpd xmm0,qword [rbx+xmm11*2],xmm2
%endif
popcnt ax, bx
popcnt eax, ebx
popcnt rax, rbx
popcnt ax, [edi]
popcnt eax, [edi]
popcnt eax, [edi + 1000h]
popcnt rax, [rdi + 1000h]
lzcnt ax, bx
lzcnt eax, ebx
lzcnt rax, rbx
lzcnt ax, [edi]
lzcnt eax, [edi]
lzcnt eax, [edi + 1000h]
lzcnt eax, [rdi]
lzcnt ax, [rdi]
lzcnt rax, [rdi]
lzcnt r8d, [rdi]
vmread rax, rbx
vmwrite rax, rbx
getsec
movd mm0, [rdi]
movq mm0, [edi]
movq mm0, mm1
vmovups xmm0, xmm1
vmovaps ymm0, ymm1
vunpcklps xmm0, xmm1, xmm2
vunpcklps ymm0, ymm1, ymm2
vunpcklps ymm0, ymm10, ymm2
vmovups xmm5, xmm9
vcmpps xmm1, xmm2, xmm3, 12
lddqu xmm1, [ebp+edi*8+00f000001h]
vlddqu xmm1, [rbp+rdi*8+00f000001h]
vlddqu ymm1, [rbp+rdi*8+00f000001h]
vbroadcastf128 ymm0,oword [0x100]
vmovlps xmm0, xmm1, [100h]
vmovlps xmm0, xmm1, [eax + ebx]
vmovlps xmm0, xmm1, [rax + rbx]
vmovlps xmm10, xmm1, [rax]
vblendvpd xmm0, xmm1, [100h], xmm3
dpps xmm0, xmm1, 1
extractps eax, xmm2, 3
vzeroupper
vzeroall
movlps xmm0, [100h]
movlps xmm0, [eax + ebx]
movlps xmm10, [rax + rbx]
movhlps xmm0, xmm1
ret
ENDPROC TestProc64
%endif ; !OS2
|