summaryrefslogtreecommitdiffstats
path: root/src/VBox/Disassembler/testcase/tstDisasm-1A.asm
blob: 112f703798d2ca8d826f8645fa734e6903eccae8 (plain)
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
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
; $Id: tstDisasm-1A.asm $
;; @file
; VBox disassembler: Assembler test routines
;

;
; Copyright (C) 2006-2023 Oracle and/or its affiliates.
;
; This file is part of VirtualBox base platform packages, as
; available from https://www.virtualbox.org.
;
; This program is free software; you can redistribute it and/or
; modify it under the terms of the GNU General Public License
; as published by the Free Software Foundation, in version 3 of the
; License.
;
; This program is distributed in the hope that it will be useful, but
; WITHOUT ANY WARRANTY; without even the implied warranty of
; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
; General Public License for more details.
;
; You should have received a copy of the GNU General Public License
; along with this program; if not, see <https://www.gnu.org/licenses>.
;
; SPDX-License-Identifier: GPL-3.0-only
;

;*******************************************************************************
;* 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

%ifndef __YASM_VERSION_ID__
 %define __YASM_VERSION_ID__ 001010000h ; v1.2.0.0 for OS/2
%endif
%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]
%ifndef RT_OS_OS2 ; nasm objects to this
        pmulhrwa    mm3, qword [es:eax+0ffffffffh]
%endif
        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

%ifndef RT_OS_OS2
        blsr eax, ebx
        blsi eax, [ebx]
%endif
        db 0c4h, 0e2h, 0f8h, 0f3h, 01bh ;  blsi rax, dword [ebx] - but VEX.W=1 is ignored, so same as previous
%ifndef RT_OS_OS2
        blsmsk eax, [ebx+edi*2]
        shlx eax, ebx, ecx
%endif

        pmovmskb eax, mm2
        pmovmskb eax, xmm3
        vpmovmskb eax, xmm3
%ifndef RT_OS_OS2
        vpmovmskb eax, ymm3
%endif

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

        blsr eax, ebx
        blsr rax, rbx
        blsi eax, [rbx]
        blsi rax, [rbx]
        db 0c4h, 0e2h, 0f8h | 4, 0f3h, 01bh ; blsi rax, [rbx] with VEX.L=1 - should be invalid
        blsmsk eax, [rbx+rdi*2]
        blsmsk rax, [rbx+rdi*2]
        blsmsk r8, [rbx+rdi*2]

        shlx   eax, ebx, ecx
        shlx   r8, rax, r15

        pmovmskb eax, mm2
        pmovmskb r9, mm2
        pmovmskb eax, xmm3
        pmovmskb r10, xmm3
        vpmovmskb eax, xmm3
        vpmovmskb rax, xmm3
        vpmovmskb r11, ymm9

        ret
ENDPROC   TestProc64
%endif ; !OS2