"Fossies" - the Fresh Open Source Software Archive 
Member "fasm/source/avx.inc" (21 Feb 2022, 70907 Bytes) of package /linux/misc/fasm-1.73.30.tgz:
As a special service "Fossies" has tried to format the requested source page into HTML format using (guessed) fasm source code syntax highlighting (style:
standard) with prefixed line numbers.
Alternatively you can here
view or
download the uninterpreted source code file.
See also the latest
Fossies "Diffs" side-by-side code changes report for "avx.inc":
1.73.29_vs_1.73.30.
1
2 ; flat assembler core
3 ; Copyright (c) 1999-2022, Tomasz Grysztar.
4 ; All rights reserved.
5
6 avx_single_source_pd_instruction_er_evex:
7 or [vex_required],8
8 avx_single_source_pd_instruction_er:
9 or [operand_flags],2+4+8
10 jmp avx_pd_instruction
11 avx_single_source_pd_instruction_sae_evex:
12 or [vex_required],8
13 or [operand_flags],2+4
14 jmp avx_pd_instruction
15 avx_pd_instruction_imm8:
16 mov [immediate_size],1
17 jmp avx_pd_instruction
18 avx_pd_instruction_er:
19 or [operand_flags],8
20 avx_pd_instruction_sae:
21 or [operand_flags],4
22 avx_pd_instruction:
23 mov [opcode_prefix],66h
24 or [rex_prefix],80h
25 mov cx,0800h
26 jmp avx_instruction_with_broadcast
27 avx_pd_instruction_38_evex:
28 or [vex_required],8
29 mov [supplemental_code],al
30 mov al,38h
31 jmp avx_pd_instruction
32 avx_cvtps2dq_instruction:
33 mov [opcode_prefix],66h
34 jmp avx_single_source_ps_instruction_er
35 avx_cvtudq2ps_instruction:
36 mov [opcode_prefix],0F2h
37 avx_single_source_ps_instruction_er_evex:
38 or [vex_required],8
39 avx_single_source_ps_instruction_er:
40 or [operand_flags],2+4+8
41 jmp avx_ps_instruction
42 avx_single_source_ps_instruction_noevex:
43 or [operand_flags],2
44 or [vex_required],2
45 jmp avx_ps_instruction
46 avx_ps_instruction_imm8:
47 mov [immediate_size],1
48 jmp avx_ps_instruction
49 avx_ps_instruction_er:
50 or [operand_flags],8
51 avx_ps_instruction_sae:
52 or [operand_flags],4
53 avx_ps_instruction:
54 mov cx,0400h
55 jmp avx_instruction_with_broadcast
56 avx_ps_instruction_66_38_evex:
57 or [vex_required],8
58 mov [opcode_prefix],66h
59 mov [supplemental_code],al
60 mov al,38h
61 jmp avx_ps_instruction
62 avx_sd_instruction_er:
63 or [operand_flags],8
64 avx_sd_instruction_sae:
65 or [operand_flags],4
66 avx_sd_instruction:
67 mov [opcode_prefix],0F2h
68 or [rex_prefix],80h
69 mov cl,8
70 jmp avx_instruction
71 avx_ss_instruction_er:
72 or [operand_flags],8
73 avx_ss_instruction_sae:
74 or [operand_flags],4
75 avx_ss_instruction:
76 mov [opcode_prefix],0F3h
77 mov cl,4
78 jmp avx_instruction
79 avx_ss_instruction_noevex:
80 or [vex_required],2
81 jmp avx_ss_instruction
82 avx_single_source_q_instruction_38_evex:
83 or [operand_flags],2
84 avx_q_instruction_38_evex:
85 or [vex_required],8
86 avx_q_instruction_38:
87 mov [supplemental_code],al
88 mov al,38h
89 jmp avx_q_instruction
90 avx_q_instruction_38_w1_evex:
91 or [vex_required],8
92 avx_q_instruction_38_w1:
93 or [rex_prefix],8
94 jmp avx_q_instruction_38
95 avx_q_instruction_3a_imm8_w1:
96 or [rex_prefix],8
97 jmp avx_q_instruction_3a_imm8
98 avx_q_instruction_3a_imm8_evex:
99 or [vex_required],8
100 avx_q_instruction_3a_imm8:
101 mov [immediate_size],1
102 mov [supplemental_code],al
103 mov al,3Ah
104 jmp avx_q_instruction
105 avx_q_instruction_evex:
106 or [vex_required],8
107 avx_q_instruction:
108 or [rex_prefix],80h
109 mov ch,8
110 jmp avx_pi_instruction
111 avx_single_source_d_instruction_38_evex_w1:
112 or [rex_prefix],8
113 avx_single_source_d_instruction_38_evex:
114 or [vex_required],8
115 avx_single_source_d_instruction_38:
116 or [operand_flags],2
117 jmp avx_d_instruction_38
118 avx_d_instruction_38_evex:
119 or [vex_required],8
120 avx_d_instruction_38:
121 mov [supplemental_code],al
122 mov al,38h
123 jmp avx_d_instruction
124 avx_d_instruction_3a_imm8_evex:
125 mov [immediate_size],1
126 or [vex_required],8
127 mov [supplemental_code],al
128 mov al,3Ah
129 jmp avx_d_instruction
130 avx_single_source_d_instruction_imm8:
131 or [operand_flags],2
132 mov [immediate_size],1
133 jmp avx_d_instruction
134 avx_d_instruction_evex:
135 or [vex_required],8
136 avx_d_instruction:
137 mov ch,4
138 jmp avx_pi_instruction
139 avx_bw_instruction_3a_imm8_w1_evex:
140 or [rex_prefix],8
141 avx_bw_instruction_3a_imm8_evex:
142 mov [immediate_size],1
143 or [vex_required],8
144 mov [supplemental_code],al
145 mov al,3Ah
146 jmp avx_bw_instruction
147 avx_single_source_bw_instruction_38:
148 or [operand_flags],2
149 avx_bw_instruction_38:
150 mov [supplemental_code],al
151 mov al,38h
152 avx_bw_instruction:
153 xor ch,ch
154 avx_pi_instruction:
155 mov [opcode_prefix],66h
156 xor cl,cl
157 jmp avx_instruction_with_broadcast
158 avx_bw_instruction_38_w1_evex:
159 or [rex_prefix],8
160 avx_bw_instruction_38_evex:
161 or [vex_required],8
162 jmp avx_bw_instruction_38
163 avx_pd_instruction_noevex:
164 xor cl,cl
165 or [vex_required],2
166 mov [opcode_prefix],66h
167 jmp avx_instruction
168 avx_ps_instruction_noevex:
169 or [vex_required],2
170 mov [opcode_prefix],0F2h
171 xor cl,cl
172 jmp avx_instruction
173 avx_instruction:
174 xor ch,ch
175 avx_instruction_with_broadcast:
176 mov [mmx_size],cl
177 mov [broadcast_size],ch
178 mov [base_code],0Fh
179 mov [extended_code],al
180 avx_xop_common:
181 or [vex_required],1
182 lods byte [esi]
183 call get_size_operator
184 cmp al,10h
185 jne invalid_operand
186 avx_reg:
187 lods byte [esi]
188 call convert_avx_register
189 mov [postbyte_register],al
190 call take_avx512_mask
191 avx_vex_reg:
192 test [operand_flags],2
193 jnz avx_vex_reg_ok
194 lods byte [esi]
195 cmp al,','
196 jne invalid_operand
197 call take_avx_register
198 mov [vex_register],al
199 avx_vex_reg_ok:
200 mov al,[mmx_size]
201 or al,al
202 jz avx_regs_size_ok
203 mov ah,[operand_size]
204 or ah,ah
205 jz avx_regs_size_ok
206 cmp al,ah
207 je avx_regs_size_ok
208 ja invalid_operand_size
209 cmp ah,16
210 jne invalid_operand_size
211 avx_regs_size_ok:
212 lods byte [esi]
213 cmp al,','
214 jne invalid_operand
215 avx_regs_rm:
216 call take_avx_rm
217 jc avx_regs_reg
218 mov al,[immediate_size]
219 cmp al,1
220 je mmx_imm8
221 jb instruction_ready
222 cmp al,-4
223 je sse_cmp_mem_ok
224 cmp byte [esi],','
225 jne invalid_operand
226 inc esi
227 call take_avx_register
228 shl al,4
229 jc invalid_operand
230 or byte [value],al
231 test al,80h
232 jz avx_regs_mem_reg_store
233 cmp [code_type],64
234 jne invalid_operand
235 avx_regs_mem_reg_store:
236 call take_imm4_if_needed
237 call store_instruction_with_imm8
238 jmp instruction_assembled
239 avx_regs_reg:
240 mov bl,al
241 call take_avx512_rounding
242 mov al,[immediate_size]
243 cmp al,1
244 je mmx_nomem_imm8
245 jb nomem_instruction_ready
246 cmp al,-4
247 je sse_cmp_nomem_ok
248 lods byte [esi]
249 cmp al,','
250 jne invalid_operand
251 mov al,bl
252 shl al,4
253 jc invalid_operand
254 or byte [value],al
255 test al,80h
256 jz avx_regs_reg_
257 cmp [code_type],64
258 jne invalid_operand
259 avx_regs_reg_:
260 call take_avx_rm
261 jc avx_regs_reg_reg
262 cmp [immediate_size],-2
263 jg invalid_operand
264 or [rex_prefix],8
265 call take_imm4_if_needed
266 call store_instruction_with_imm8
267 jmp instruction_assembled
268 avx_regs_reg_reg:
269 shl al,4
270 jc invalid_operand
271 and byte [value],1111b
272 or byte [value],al
273 call take_imm4_if_needed
274 call store_nomem_instruction
275 mov al,byte [value]
276 stos byte [edi]
277 jmp instruction_assembled
278 take_avx_rm:
279 xor cl,cl
280 xchg cl,[operand_size]
281 lods byte [esi]
282 call get_size_operator
283 cmp al,'['
284 je take_avx_mem
285 cmp al,10h
286 jne invalid_operand
287 mov [operand_size],cl
288 lods byte [esi]
289 call convert_avx_register
290 or cl,cl
291 jnz avx_reg_ok
292 or cl,[mmx_size]
293 jz avx_reg_ok
294 cmp ah,cl
295 je avx_reg_ok
296 jb invalid_operand_size
297 cmp ah,16
298 jne invalid_operand_size
299 avx_reg_ok:
300 stc
301 ret
302 take_avx_mem:
303 push ecx
304 call get_address
305 cmp byte [esi],'{'
306 jne avx_mem_ok
307 inc esi
308 lods byte [esi]
309 cmp al,1Fh
310 jne invalid_operand
311 mov al,[esi]
312 shr al,4
313 cmp al,1
314 jne invalid_operand
315 mov al,[mmx_size]
316 or al,al
317 jnz avx_mem_broadcast_check
318 mov eax,[esp]
319 or al,al
320 jnz avx_mem_broadcast_check
321 mov al,[broadcast_size]
322 mov [mmx_size],al
323 mov ah,cl
324 lods byte [esi]
325 and al,1111b
326 mov cl,al
327 mov al,[broadcast_size]
328 shl al,cl
329 mov [esp],al
330 mov cl,ah
331 jmp avx_mem_broadcast_ok
332 avx_mem_broadcast_check:
333 bsf eax,eax
334 xchg al,[broadcast_size]
335 mov [mmx_size],al
336 bsf eax,eax
337 jz invalid_operand
338 mov ah,[broadcast_size]
339 sub ah,al
340 lods byte [esi]
341 and al,1111b
342 cmp al,ah
343 jne invalid_operand_size
344 avx_mem_broadcast_ok:
345 or [vex_required],40h
346 lods byte [esi]
347 cmp al,'}'
348 jne invalid_operand
349 avx_mem_ok:
350 pop eax
351 or al,al
352 jz avx_mem_size_deciding
353 xchg al,[operand_size]
354 cmp [mmx_size],0
355 jne avx_mem_size_enforced
356 or al,al
357 jz avx_mem_size_ok
358 cmp al,[operand_size]
359 jne operand_sizes_do_not_match
360 avx_mem_size_ok:
361 clc
362 ret
363 avx_mem_size_deciding:
364 mov al,[operand_size]
365 cmp [mmx_size],0
366 jne avx_mem_size_enforced
367 cmp al,16
368 je avx_mem_size_ok
369 cmp al,32
370 je avx_mem_size_ok
371 cmp al,64
372 je avx_mem_size_ok
373 or al,al
374 jnz invalid_operand_size
375 call recoverable_unknown_size
376 avx_mem_size_enforced:
377 or al,al
378 jz avx_mem_size_ok
379 cmp al,[mmx_size]
380 je avx_mem_size_ok
381 jmp invalid_operand_size
382 take_imm4_if_needed:
383 cmp [immediate_size],-3
384 jne imm4_ok
385 push ebx ecx edx
386 lods byte [esi]
387 cmp al,','
388 jne invalid_operand
389 lods byte [esi]
390 cmp al,'('
391 jne invalid_operand
392 call get_byte_value
393 test al,11110000b
394 jnz value_out_of_range
395 or byte [value],al
396 pop edx ecx ebx
397 imm4_ok:
398 ret
399 take_avx512_mask:
400 cmp byte [esi],'{'
401 jne avx512_masking_ok
402 test [operand_flags],10h
403 jnz invalid_operand
404 inc esi
405 lods byte [esi]
406 cmp al,14h
407 jne invalid_operand
408 lods byte [esi]
409 mov ah,al
410 shr ah,4
411 cmp ah,5
412 jne invalid_operand
413 and al,111b
414 or al,al
415 jz invalid_operand
416 mov [mask_register],al
417 or [vex_required],20h
418 lods byte [esi]
419 cmp al,'}'
420 jne invalid_operand
421 cmp byte [esi],'{'
422 jne avx512_masking_ok
423 test [operand_flags],20h
424 jnz invalid_operand
425 inc esi
426 lods byte [esi]
427 cmp al,1Fh
428 jne invalid_operand
429 lods byte [esi]
430 or al,al
431 jnz invalid_operand
432 or [mask_register],80h
433 lods byte [esi]
434 cmp al,'}'
435 jne invalid_operand
436 avx512_masking_ok:
437 retn
438 take_avx512_rounding:
439 test [operand_flags],4+8
440 jz avx512_rounding_done
441 test [operand_flags],8
442 jz avx512_rounding_allowed
443 cmp [mmx_size],0
444 jne avx512_rounding_allowed
445 cmp [operand_size],64
446 jne avx512_rounding_done
447 avx512_rounding_allowed:
448 cmp byte [esi],','
449 jne avx512_rounding_done
450 cmp byte [esi+1],'{'
451 jne avx512_rounding_done
452 add esi,2
453 mov [rounding_mode],0
454 or [vex_required],40h
455 test [operand_flags],8
456 jz take_sae
457 or [vex_required],80h
458 lods byte [esi]
459 cmp al,1Fh
460 jne invalid_operand
461 lods byte [esi]
462 mov ah,al
463 shr ah,4
464 cmp ah,2
465 jne invalid_operand
466 and al,11b
467 mov [rounding_mode],al
468 lods byte [esi]
469 cmp al,'-'
470 jne invalid_operand
471 take_sae:
472 lods byte [esi]
473 cmp al,1Fh
474 jne invalid_operand
475 lods byte [esi]
476 cmp al,30h
477 jne invalid_operand
478 lods byte [esi]
479 cmp al,'}'
480 jne invalid_operand
481 avx512_rounding_done:
482 retn
483
484 avx_movdqu_instruction:
485 mov ah,0F3h
486 jmp avx_movdq_instruction
487 avx_movdqa_instruction:
488 mov ah,66h
489 avx_movdq_instruction:
490 mov [opcode_prefix],ah
491 or [vex_required],2
492 jmp avx_movps_instruction
493 avx512_movdqu16_instruction:
494 or [rex_prefix],8
495 avx512_movdqu8_instruction:
496 mov ah,0F2h
497 jmp avx_movdq_instruction_evex
498 avx512_movdqu64_instruction:
499 or [rex_prefix],8
500 avx512_movdqu32_instruction:
501 mov ah,0F3h
502 jmp avx_movdq_instruction_evex
503 avx512_movdqa64_instruction:
504 or [rex_prefix],8
505 avx512_movdqa32_instruction:
506 mov ah,66h
507 avx_movdq_instruction_evex:
508 mov [opcode_prefix],ah
509 or [vex_required],8
510 jmp avx_movps_instruction
511 avx_movpd_instruction:
512 mov [opcode_prefix],66h
513 or [rex_prefix],80h
514 avx_movps_instruction:
515 or [operand_flags],2
516 mov [base_code],0Fh
517 mov [extended_code],al
518 or [vex_required],1
519 xor al,al
520 mov [mmx_size],al
521 mov [broadcast_size],al
522 lods byte [esi]
523 call get_size_operator
524 cmp al,10h
525 je avx_reg
526 inc [extended_code]
527 test [extended_code],1
528 jnz avx_mem
529 add [extended_code],-1+10h
530 avx_mem:
531 cmp al,'['
532 jne invalid_operand
533 call get_address
534 or [operand_flags],20h
535 call take_avx512_mask
536 lods byte [esi]
537 cmp al,','
538 jne invalid_operand
539 call take_avx_register
540 mov [postbyte_register],al
541 jmp instruction_ready
542 avx_movntpd_instruction:
543 or [rex_prefix],80h
544 avx_movntdq_instruction:
545 mov [opcode_prefix],66h
546 avx_movntps_instruction:
547 mov [base_code],0Fh
548 mov [extended_code],al
549 or [vex_required],1
550 or [operand_flags],10h
551 mov [mmx_size],0
552 lods byte [esi]
553 call get_size_operator
554 jmp avx_mem
555 avx_compress_q_instruction:
556 or [rex_prefix],8
557 avx_compress_d_instruction:
558 or [vex_required],8
559 mov [mmx_size],0
560 call setup_66_0f_38
561 lods byte [esi]
562 call get_size_operator
563 cmp al,10h
564 jne avx_mem
565 lods byte [esi]
566 call convert_avx_register
567 mov bl,al
568 call take_avx512_mask
569 lods byte [esi]
570 cmp al,','
571 jne invalid_operand
572 call take_avx_register
573 mov [postbyte_register],al
574 jmp nomem_instruction_ready
575 avx_lddqu_instruction:
576 mov ah,0F2h
577 or [vex_required],2
578 avx_load_instruction:
579 mov [opcode_prefix],ah
580 mov [base_code],0Fh
581 mov [extended_code],al
582 mov [mmx_size],0
583 or [vex_required],1
584 call take_avx_register
585 mov [postbyte_register],al
586 lods byte [esi]
587 cmp al,','
588 jne invalid_operand
589 lods byte [esi]
590 call get_size_operator
591 cmp al,'['
592 jne invalid_operand
593 call get_address
594 jmp instruction_ready
595 avx_movntdqa_instruction:
596 mov [supplemental_code],al
597 mov al,38h
598 mov ah,66h
599 jmp avx_load_instruction
600 avx_movq_instruction:
601 or [rex_prefix],8
602 mov [mmx_size],8
603 jmp avx_mov_instruction
604 avx_movd_instruction:
605 mov [mmx_size],4
606 avx_mov_instruction:
607 or [vex_required],1
608 mov [opcode_prefix],66h
609 mov [base_code],0Fh
610 mov [extended_code],7Eh
611 lods byte [esi]
612 call get_size_operator
613 cmp al,10h
614 je avx_movd_reg
615 cmp al,'['
616 jne invalid_operand
617 call get_address
618 mov al,[mmx_size]
619 not al
620 and [operand_size],al
621 jnz invalid_operand_size
622 lods byte [esi]
623 cmp al,','
624 jne invalid_operand
625 lods byte [esi]
626 call get_size_operator
627 cmp al,10h
628 jne invalid_operand
629 lods byte [esi]
630 call convert_avx_register
631 cmp ah,16
632 jne invalid_operand_size
633 mov [postbyte_register],al
634 cmp [mmx_size],8
635 jne instruction_ready
636 and [rex_prefix],not 8
637 or [rex_prefix],80h
638 mov [extended_code],0D6h
639 jmp instruction_ready
640 avx_movd_reg:
641 lods byte [esi]
642 cmp al,0C0h
643 jae avx_movd_xmmreg
644 call convert_register
645 cmp ah,[mmx_size]
646 jne invalid_operand_size
647 mov [operand_size],0
648 mov bl,al
649 lods byte [esi]
650 cmp al,','
651 jne invalid_operand
652 lods byte [esi]
653 call get_size_operator
654 cmp al,10h
655 jne invalid_operand
656 lods byte [esi]
657 call convert_avx_register
658 cmp ah,16
659 jne invalid_operand_size
660 mov [postbyte_register],al
661 avx_movd_reg_ready:
662 test [rex_prefix],8
663 jz nomem_instruction_ready
664 cmp [code_type],64
665 jne illegal_instruction
666 jmp nomem_instruction_ready
667 avx_movd_xmmreg:
668 sub [extended_code],10h
669 call convert_avx_register
670 cmp ah,16
671 jne invalid_operand_size
672 mov [postbyte_register],al
673 mov [operand_size],0
674 lods byte [esi]
675 cmp al,','
676 jne invalid_operand
677 lods byte [esi]
678 call get_size_operator
679 cmp al,10h
680 je avx_movd_xmmreg_reg
681 cmp al,'['
682 jne invalid_operand
683 call get_address
684 mov al,[mmx_size]
685 cmp al,8
686 jne avx_movd_xmmreg_mem_ready
687 call avx_movq_xmmreg_xmmreg_opcode
688 avx_movd_xmmreg_mem_ready:
689 not al
690 test [operand_size],al
691 jnz invalid_operand_size
692 jmp instruction_ready
693 avx_movd_xmmreg_reg:
694 lods byte [esi]
695 cmp al,0C0h
696 jae avx_movq_xmmreg_xmmreg
697 call convert_register
698 cmp ah,[mmx_size]
699 jne invalid_operand_size
700 mov bl,al
701 jmp avx_movd_reg_ready
702 avx_movq_xmmreg_xmmreg:
703 cmp [mmx_size],8
704 jne invalid_operand
705 call avx_movq_xmmreg_xmmreg_opcode
706 call convert_avx_register
707 cmp ah,16
708 jne invalid_operand_size
709 mov bl,al
710 jmp nomem_instruction_ready
711 avx_movq_xmmreg_xmmreg_opcode:
712 and [rex_prefix],not 8
713 or [rex_prefix],80h
714 add [extended_code],10h
715 mov [opcode_prefix],0F3h
716 ret
717 avx_movddup_instruction:
718 or [vex_required],1
719 mov [opcode_prefix],0F2h
720 mov [base_code],0Fh
721 mov [extended_code],al
722 or [rex_prefix],80h
723 xor al,al
724 mov [mmx_size],al
725 mov [broadcast_size],al
726 lods byte [esi]
727 call get_size_operator
728 cmp al,10h
729 jne invalid_operand
730 lods byte [esi]
731 call convert_avx_register
732 mov [postbyte_register],al
733 cmp ah,16
734 ja avx_movddup_size_ok
735 mov [mmx_size],8
736 avx_movddup_size_ok:
737 call take_avx512_mask
738 jmp avx_vex_reg_ok
739 avx_movlpd_instruction:
740 mov [opcode_prefix],66h
741 or [rex_prefix],80h
742 avx_movlps_instruction:
743 mov [base_code],0Fh
744 mov [extended_code],al
745 mov [mmx_size],8
746 mov [broadcast_size],0
747 or [vex_required],1
748 lods byte [esi]
749 call get_size_operator
750 cmp al,10h
751 jne avx_movlps_mem
752 lods byte [esi]
753 call convert_avx_register
754 mov [postbyte_register],al
755 lods byte [esi]
756 cmp al,','
757 jne invalid_operand
758 call take_avx_register
759 mov [vex_register],al
760 cmp [operand_size],16
761 jne invalid_operand
762 mov [operand_size],0
763 lods byte [esi]
764 cmp al,','
765 jne invalid_operand
766 call take_avx_rm
767 jc invalid_operand
768 jmp instruction_ready
769 avx_movlps_mem:
770 cmp al,'['
771 jne invalid_operand
772 call get_address
773 avx_movlps_mem_:
774 mov al,[operand_size]
775 or al,al
776 jz avx_movlps_mem_size_ok
777 cmp al,[mmx_size]
778 jne invalid_operand_size
779 mov [operand_size],0
780 avx_movlps_mem_size_ok:
781 lods byte [esi]
782 cmp al,','
783 jne invalid_operand
784 call take_avx_register
785 cmp ah,16
786 jne invalid_operand
787 mov [postbyte_register],al
788 inc [extended_code]
789 jmp instruction_ready
790 avx_movhlps_instruction:
791 mov [base_code],0Fh
792 mov [extended_code],al
793 or [vex_required],1
794 call take_avx_register
795 cmp ah,16
796 jne invalid_operand
797 mov [postbyte_register],al
798 lods byte [esi]
799 cmp al,','
800 jne invalid_operand
801 call take_avx_register
802 mov [vex_register],al
803 lods byte [esi]
804 cmp al,','
805 jne invalid_operand
806 call take_avx_register
807 mov bl,al
808 jmp nomem_instruction_ready
809 avx_movsd_instruction:
810 mov al,0F2h
811 mov cl,8
812 or [rex_prefix],80h
813 jmp avx_movs_instruction
814 avx_movss_instruction:
815 mov al,0F3h
816 mov cl,4
817 avx_movs_instruction:
818 mov [opcode_prefix],al
819 mov [mmx_size],cl
820 or [vex_required],1
821 mov [base_code],0Fh
822 mov [extended_code],10h
823 lods byte [esi]
824 call get_size_operator
825 cmp al,10h
826 jne avx_movs_mem
827 lods byte [esi]
828 call convert_avx_register
829 cmp ah,16
830 jne invalid_operand
831 mov [postbyte_register],al
832 call take_avx512_mask
833 xor cl,cl
834 xchg cl,[operand_size]
835 lods byte [esi]
836 cmp al,','
837 jne invalid_operand
838 lods byte [esi]
839 call get_size_operator
840 cmp al,10h
841 jne avx_movs_reg_mem
842 mov [operand_size],cl
843 lods byte [esi]
844 call convert_avx_register
845 mov [vex_register],al
846 lods byte [esi]
847 cmp al,','
848 jne invalid_operand
849 call take_avx_register
850 mov bl,al
851 cmp bl,8
852 jb nomem_instruction_ready
853 inc [extended_code]
854 xchg bl,[postbyte_register]
855 jmp nomem_instruction_ready
856 avx_movs_reg_mem:
857 cmp al,'['
858 jne invalid_operand
859 call get_address
860 mov al,[operand_size]
861 or al,al
862 jz avx_movs_reg_mem_ok
863 cmp al,[mmx_size]
864 jne invalid_operand_size
865 avx_movs_reg_mem_ok:
866 jmp instruction_ready
867 avx_movs_mem:
868 cmp al,'['
869 jne invalid_operand
870 call get_address
871 or [operand_flags],20h
872 call take_avx512_mask
873 jmp avx_movlps_mem_
874
875 avx_comiss_instruction:
876 or [operand_flags],2+4+10h
877 mov cl,4
878 jmp avx_instruction
879 avx_comisd_instruction:
880 or [operand_flags],2+4+10h
881 mov [opcode_prefix],66h
882 or [rex_prefix],80h
883 mov cl,8
884 jmp avx_instruction
885 avx_movshdup_instruction:
886 or [operand_flags],2
887 mov [opcode_prefix],0F3h
888 xor cl,cl
889 jmp avx_instruction
890 avx_cvtqq2pd_instruction:
891 mov [opcode_prefix],0F3h
892 or [vex_required],8
893 or [operand_flags],2+4+8
894 or [rex_prefix],8
895 mov cx,0800h
896 jmp avx_instruction_with_broadcast
897 avx_pshuf_w_instruction:
898 mov [opcode_prefix],al
899 or [operand_flags],2
900 mov [immediate_size],1
901 mov al,70h
902 xor cl,cl
903 jmp avx_instruction
904 avx_single_source_128bit_instruction_38_noevex:
905 or [operand_flags],2
906 avx_128bit_instruction_38_noevex:
907 mov cl,16
908 jmp avx_instruction_38_noevex
909 avx_single_source_instruction_38_noevex:
910 or [operand_flags],2
911 jmp avx_pi_instruction_38_noevex
912 avx_pi_instruction_38_noevex:
913 xor cl,cl
914 avx_instruction_38_noevex:
915 or [vex_required],2
916 avx_instruction_38:
917 mov [opcode_prefix],66h
918 mov [supplemental_code],al
919 mov al,38h
920 jmp avx_instruction
921 avx_ss_instruction_3a_imm8_noevex:
922 mov cl,4
923 jmp avx_instruction_3a_imm8_noevex
924 avx_sd_instruction_3a_imm8_noevex:
925 mov cl,8
926 jmp avx_instruction_3a_imm8_noevex
927 avx_single_source_128bit_instruction_3a_imm8_noevex:
928 or [operand_flags],2
929 avx_128bit_instruction_3a_imm8_noevex:
930 mov cl,16
931 jmp avx_instruction_3a_imm8_noevex
932 avx_triple_source_instruction_3a_noevex:
933 xor cl,cl
934 mov [immediate_size],-1
935 mov byte [value],0
936 jmp avx_instruction_3a_noevex
937 avx_single_source_instruction_3a_imm8_noevex:
938 or [operand_flags],2
939 avx_pi_instruction_3a_imm8_noevex:
940 xor cl,cl
941 avx_instruction_3a_imm8_noevex:
942 mov [immediate_size],1
943 avx_instruction_3a_noevex:
944 or [vex_required],2
945 avx_instruction_3a:
946 mov [opcode_prefix],66h
947 mov [supplemental_code],al
948 mov al,3Ah
949 jmp avx_instruction
950 avx_pi_instruction_3a_imm8:
951 xor cl,cl
952 mov [immediate_size],1
953 jmp avx_instruction_3a
954 avx_pclmulqdq_instruction:
955 mov byte [value],al
956 mov [immediate_size],-4
957 xor cl,cl
958 mov al,44h
959 or [operand_flags],10h
960 jmp avx_instruction_3a
961 avx_instruction_38_nomask:
962 or [operand_flags],10h
963 xor cl,cl
964 jmp avx_instruction_38
965
966 avx512_single_source_pd_instruction_sae_imm8:
967 or [operand_flags],2
968 avx512_pd_instruction_sae_imm8:
969 or [rex_prefix],8
970 mov cx,0800h
971 jmp avx512_instruction_sae_imm8
972 avx512_single_source_ps_instruction_sae_imm8:
973 or [operand_flags],2
974 avx512_ps_instruction_sae_imm8:
975 mov cx,0400h
976 jmp avx512_instruction_sae_imm8
977 avx512_sd_instruction_sae_imm8:
978 or [rex_prefix],8
979 mov cx,0008h
980 jmp avx512_instruction_sae_imm8
981 avx512_ss_instruction_sae_imm8:
982 mov cx,0004h
983 avx512_instruction_sae_imm8:
984 or [operand_flags],4
985 avx512_instruction_imm8:
986 or [vex_required],8
987 mov [opcode_prefix],66h
988 mov [immediate_size],1
989 mov [supplemental_code],al
990 mov al,3Ah
991 jmp avx_instruction_with_broadcast
992 avx512_pd_instruction_er:
993 or [operand_flags],4+8
994 jmp avx512_pd_instruction
995 avx512_single_source_pd_instruction_sae:
996 or [operand_flags],4
997 avx512_single_source_pd_instruction:
998 or [operand_flags],2
999 avx512_pd_instruction:
1000 or [rex_prefix],8
1001 mov cx,0800h
1002 jmp avx512_instruction
1003 avx512_ps_instruction_er:
1004 or [operand_flags],4+8
1005 jmp avx512_ps_instruction
1006 avx512_single_source_ps_instruction_sae:
1007 or [operand_flags],4
1008 avx512_single_source_ps_instruction:
1009 or [operand_flags],2
1010 avx512_ps_instruction:
1011 mov cx,0400h
1012 jmp avx512_instruction
1013 avx512_sd_instruction_er:
1014 or [operand_flags],8
1015 avx512_sd_instruction_sae:
1016 or [operand_flags],4
1017 avx512_sd_instruction:
1018 or [rex_prefix],8
1019 mov cx,0008h
1020 jmp avx512_instruction
1021 avx512_ss_instruction_er:
1022 or [operand_flags],8
1023 avx512_ss_instruction_sae:
1024 or [operand_flags],4
1025 avx512_ss_instruction:
1026 mov cx,0004h
1027 avx512_instruction:
1028 or [vex_required],8
1029 mov [opcode_prefix],66h
1030 mov [supplemental_code],al
1031 mov al,38h
1032 jmp avx_instruction_with_broadcast
1033 avx512_exp2pd_instruction:
1034 or [rex_prefix],8
1035 or [operand_flags],2+4
1036 mov cx,0840h
1037 jmp avx512_instruction
1038 avx512_exp2ps_instruction:
1039 or [operand_flags],2+4
1040 mov cx,0440h
1041 jmp avx512_instruction
1042
1043 fma_instruction_pd:
1044 or [rex_prefix],8
1045 mov cx,0800h
1046 jmp fma_instruction
1047 fma_instruction_ps:
1048 mov cx,0400h
1049 jmp fma_instruction
1050 fma_instruction_sd:
1051 or [rex_prefix],8
1052 mov cx,0008h
1053 jmp fma_instruction
1054 fma_instruction_ss:
1055 mov cx,0004h
1056 fma_instruction:
1057 or [operand_flags],4+8
1058 mov [opcode_prefix],66h
1059 mov [supplemental_code],al
1060 mov al,38h
1061 jmp avx_instruction_with_broadcast
1062
1063 fma4_instruction_p:
1064 xor cl,cl
1065 jmp fma4_instruction
1066 fma4_instruction_sd:
1067 mov cl,8
1068 jmp fma4_instruction
1069 fma4_instruction_ss:
1070 mov cl,4
1071 fma4_instruction:
1072 mov [immediate_size],-2
1073 mov byte [value],0
1074 jmp avx_instruction_3a_noevex
1075
1076 avx_cmp_pd_instruction:
1077 mov [opcode_prefix],66h
1078 or [rex_prefix],80h
1079 mov cx,0800h
1080 jmp avx_cmp_instruction
1081 avx_cmp_ps_instruction:
1082 mov cx,0400h
1083 jmp avx_cmp_instruction
1084 avx_cmp_sd_instruction:
1085 mov [opcode_prefix],0F2h
1086 or [rex_prefix],80h
1087 mov cx,0008h
1088 jmp avx_cmp_instruction
1089 avx_cmp_ss_instruction:
1090 mov [opcode_prefix],0F3h
1091 mov cx,0004h
1092 avx_cmp_instruction:
1093 mov byte [value],al
1094 mov [immediate_size],-4
1095 or [operand_flags],4+20h
1096 mov al,0C2h
1097 jmp avx_cmp_common
1098 avx_cmpeqq_instruction:
1099 or [rex_prefix],80h
1100 mov ch,8
1101 mov [supplemental_code],al
1102 mov al,38h
1103 jmp avx_cmp_pi_instruction
1104 avx_cmpeqd_instruction:
1105 mov ch,4
1106 jmp avx_cmp_pi_instruction
1107 avx_cmpeqb_instruction:
1108 xor ch,ch
1109 jmp avx_cmp_pi_instruction
1110 avx512_cmp_uq_instruction:
1111 or [rex_prefix],8
1112 mov ch,8
1113 mov ah,1Eh
1114 jmp avx_cmp_pi_instruction_evex
1115 avx512_cmp_ud_instruction:
1116 mov ch,4
1117 mov ah,1Eh
1118 jmp avx_cmp_pi_instruction_evex
1119 avx512_cmp_q_instruction:
1120 or [rex_prefix],8
1121 mov ch,8
1122 mov ah,1Fh
1123 jmp avx_cmp_pi_instruction_evex
1124 avx512_cmp_d_instruction:
1125 mov ch,4
1126 mov ah,1Fh
1127 jmp avx_cmp_pi_instruction_evex
1128 avx512_cmp_uw_instruction:
1129 or [rex_prefix],8
1130 avx512_cmp_ub_instruction:
1131 xor ch,ch
1132 mov ah,3Eh
1133 jmp avx_cmp_pi_instruction_evex
1134 avx512_cmp_w_instruction:
1135 or [rex_prefix],8
1136 avx512_cmp_b_instruction:
1137 xor ch,ch
1138 mov ah,3Fh
1139 avx_cmp_pi_instruction_evex:
1140 mov byte [value],al
1141 mov [immediate_size],-4
1142 mov [supplemental_code],ah
1143 mov al,3Ah
1144 or [vex_required],8
1145 avx_cmp_pi_instruction:
1146 xor cl,cl
1147 or [operand_flags],20h
1148 mov [opcode_prefix],66h
1149 avx_cmp_common:
1150 mov [mmx_size],cl
1151 mov [broadcast_size],ch
1152 mov [extended_code],al
1153 mov [base_code],0Fh
1154 lods byte [esi]
1155 call get_size_operator
1156 cmp al,14h
1157 je avx_maskreg
1158 cmp al,10h
1159 jne invalid_operand
1160 or [vex_required],2
1161 jmp avx_reg
1162 avx_maskreg:
1163 cmp [operand_size],0
1164 jne invalid_operand_size
1165 or [vex_required],8
1166 lods byte [esi]
1167 call convert_mask_register
1168 mov [postbyte_register],al
1169 call take_avx512_mask
1170 jmp avx_vex_reg
1171 avx512_fpclasspd_instruction:
1172 or [rex_prefix],8
1173 mov cx,0800h
1174 jmp avx_fpclass_instruction
1175 avx512_fpclassps_instruction:
1176 mov cx,0400h
1177 jmp avx_fpclass_instruction
1178 avx512_fpclasssd_instruction:
1179 or [rex_prefix],8
1180 mov cx,0008h
1181 jmp avx_fpclass_instruction
1182 avx512_fpclassss_instruction:
1183 mov cx,0004h
1184 avx_fpclass_instruction:
1185 mov [broadcast_size],ch
1186 mov [mmx_size],cl
1187 or [operand_flags],2
1188 call setup_66_0f_3a
1189 mov [immediate_size],1
1190 lods byte [esi]
1191 cmp al,14h
1192 je avx_maskreg
1193 jmp invalid_operand
1194 avx512_ptestnmd_instruction:
1195 mov ch,4
1196 jmp avx512_ptestnm_instruction
1197 avx512_ptestnmq_instruction:
1198 or [rex_prefix],8
1199 mov ch,8
1200 jmp avx512_ptestnm_instruction
1201 avx512_ptestnmw_instruction:
1202 or [rex_prefix],8
1203 avx512_ptestnmb_instruction:
1204 xor ch,ch
1205 avx512_ptestnm_instruction:
1206 mov ah,0F3h
1207 jmp avx512_ptest_instruction
1208 avx512_ptestmd_instruction:
1209 mov ch,4
1210 jmp avx512_ptestm_instruction
1211 avx512_ptestmq_instruction:
1212 or [rex_prefix],8
1213 mov ch,8
1214 jmp avx512_ptestm_instruction
1215 avx512_ptestmw_instruction:
1216 or [rex_prefix],8
1217 avx512_ptestmb_instruction:
1218 xor ch,ch
1219 avx512_ptestm_instruction:
1220 mov ah,66h
1221 avx512_ptest_instruction:
1222 xor cl,cl
1223 mov [opcode_prefix],ah
1224 mov [supplemental_code],al
1225 mov al,38h
1226 or [vex_required],8
1227 jmp avx_cmp_common
1228
1229 mask_shift_instruction_q:
1230 or [rex_prefix],8
1231 mask_shift_instruction_d:
1232 or [operand_flags],2
1233 or [immediate_size],1
1234 mov [opcode_prefix],66h
1235 mov [supplemental_code],al
1236 mov al,3Ah
1237 jmp mask_instruction
1238 mask_instruction_single_source_b:
1239 mov [opcode_prefix],66h
1240 jmp mask_instruction_single_source_w
1241 mask_instruction_single_source_d:
1242 mov [opcode_prefix],66h
1243 mask_instruction_single_source_q:
1244 or [rex_prefix],8
1245 mask_instruction_single_source_w:
1246 or [operand_flags],2
1247 jmp mask_instruction
1248 mask_instruction_b:
1249 mov [opcode_prefix],66h
1250 jmp mask_instruction_w
1251 mask_instruction_d:
1252 mov [opcode_prefix],66h
1253 mask_instruction_q:
1254 or [rex_prefix],8
1255 mask_instruction_w:
1256 mov [operand_size],32
1257 mask_instruction:
1258 or [vex_required],1
1259 mov [base_code],0Fh
1260 mov [extended_code],al
1261 call take_mask_register
1262 mov [postbyte_register],al
1263 test [operand_flags],2
1264 jnz mask_instruction_nds_ok
1265 lods byte [esi]
1266 cmp al,','
1267 jne invalid_operand
1268 call take_mask_register
1269 mov [vex_register],al
1270 mask_instruction_nds_ok:
1271 lods byte [esi]
1272 cmp al,','
1273 jne invalid_operand
1274 call take_mask_register
1275 mov bl,al
1276 cmp [immediate_size],0
1277 jne mmx_nomem_imm8
1278 jmp nomem_instruction_ready
1279 take_mask_register:
1280 lods byte [esi]
1281 cmp al,14h
1282 jne invalid_operand
1283 lods byte [esi]
1284 convert_mask_register:
1285 mov ah,al
1286 shr ah,4
1287 cmp ah,5
1288 jne invalid_operand
1289 and al,1111b
1290 ret
1291 kmov_instruction:
1292 mov [mmx_size],al
1293 or [vex_required],1
1294 mov [base_code],0Fh
1295 mov [extended_code],90h
1296 lods byte [esi]
1297 cmp al,14h
1298 je kmov_maskreg
1299 cmp al,10h
1300 je kmov_reg
1301 call get_size_operator
1302 inc [extended_code]
1303 cmp al,'['
1304 jne invalid_argument
1305 call get_address
1306 lods byte [esi]
1307 cmp al,','
1308 jne invalid_operand
1309 call take_mask_register
1310 mov [postbyte_register],al
1311 kmov_with_mem:
1312 mov ah,[mmx_size]
1313 mov al,[operand_size]
1314 or al,al
1315 jz kmov_mem_size_ok
1316 cmp al,ah
1317 jne invalid_operand_size
1318 kmov_mem_size_ok:
1319 call setup_kmov_prefix
1320 jmp instruction_ready
1321 setup_kmov_prefix:
1322 cmp ah,4
1323 jb kmov_w_ok
1324 or [rex_prefix],8
1325 kmov_w_ok:
1326 test ah,1 or 4
1327 jz kmov_prefix_ok
1328 mov [opcode_prefix],66h
1329 kmov_prefix_ok:
1330 ret
1331 kmov_maskreg:
1332 lods byte [esi]
1333 call convert_mask_register
1334 mov [postbyte_register],al
1335 lods byte [esi]
1336 cmp al,','
1337 jne invalid_operand
1338 lods byte [esi]
1339 cmp al,14h
1340 je kmov_maskreg_maskreg
1341 cmp al,10h
1342 je kmov_maskreg_reg
1343 call get_size_operator
1344 cmp al,'['
1345 jne invalid_argument
1346 call get_address
1347 jmp kmov_with_mem
1348 kmov_maskreg_maskreg:
1349 lods byte [esi]
1350 call convert_mask_register
1351 mov bl,al
1352 mov ah,[mmx_size]
1353 call setup_kmov_prefix
1354 jmp nomem_instruction_ready
1355 kmov_maskreg_reg:
1356 add [extended_code],2
1357 lods byte [esi]
1358 call convert_register
1359 kmov_with_reg:
1360 mov bl,al
1361 mov al,[mmx_size]
1362 mov ah,4
1363 cmp al,ah
1364 jbe kmov_reg_size_check
1365 mov ah,al
1366 kmov_reg_size_check:
1367 cmp ah,[operand_size]
1368 jne invalid_operand_size
1369 cmp al,8
1370 je kmov_f2_w1
1371 cmp al,2
1372 ja kmov_f2
1373 je nomem_instruction_ready
1374 mov [opcode_prefix],66h
1375 jmp nomem_instruction_ready
1376 kmov_f2_w1:
1377 or [rex_prefix],8
1378 cmp [code_type],64
1379 jne illegal_instruction
1380 kmov_f2:
1381 mov [opcode_prefix],0F2h
1382 jmp nomem_instruction_ready
1383 kmov_reg:
1384 add [extended_code],3
1385 lods byte [esi]
1386 call convert_register
1387 mov [postbyte_register],al
1388 lods byte [esi]
1389 cmp al,','
1390 jne invalid_operand
1391 call take_mask_register
1392 jmp kmov_with_reg
1393 avx512_pmov_m2_instruction_w1:
1394 or [rex_prefix],8
1395 avx512_pmov_m2_instruction:
1396 or [vex_required],8
1397 call setup_f3_0f_38
1398 call take_avx_register
1399 mov [postbyte_register],al
1400 lods byte [esi]
1401 cmp al,','
1402 jne invalid_operand
1403 call take_mask_register
1404 mov bl,al
1405 jmp nomem_instruction_ready
1406 avx512_pmov_2m_instruction_w1:
1407 or [rex_prefix],8
1408 avx512_pmov_2m_instruction:
1409 or [vex_required],8
1410 call setup_f3_0f_38
1411 call take_mask_register
1412 mov [postbyte_register],al
1413 lods byte [esi]
1414 cmp al,','
1415 jne invalid_operand
1416 call take_avx_register
1417 mov bl,al
1418 jmp nomem_instruction_ready
1419 setup_f3_0f_38:
1420 mov [extended_code],38h
1421 mov [supplemental_code],al
1422 mov [base_code],0Fh
1423 mov [opcode_prefix],0F3h
1424 ret
1425
1426 vzeroall_instruction:
1427 mov [operand_size],32
1428 vzeroupper_instruction:
1429 mov [base_code],0Fh
1430 mov [extended_code],al
1431 and [displacement_compression],0
1432 call store_vex_instruction_code
1433 jmp instruction_assembled
1434 vstmxcsr_instruction:
1435 or [vex_required],2
1436 jmp stmxcsr_instruction
1437
1438 avx_perm2f128_instruction:
1439 or [vex_required],2
1440 xor ch,ch
1441 avx_instruction_imm8_without_128bit:
1442 mov [immediate_size],1
1443 mov ah,3Ah
1444 jmp avx_instruction_without_128bit
1445 avx512_shuf_q_instruction:
1446 or [rex_prefix],8
1447 or [vex_required],8
1448 mov ch,8
1449 jmp avx_instruction_imm8_without_128bit
1450 avx512_shuf_d_instruction:
1451 or [vex_required],8
1452 mov ch,4
1453 jmp avx_instruction_imm8_without_128bit
1454 avx_permd_instruction:
1455 mov ah,38h
1456 mov ch,4
1457 avx_instruction_without_128bit:
1458 xor cl,cl
1459 call setup_avx_66_supplemental
1460 call take_avx_register
1461 cmp ah,32
1462 jb invalid_operand_size
1463 mov [postbyte_register],al
1464 call take_avx512_mask
1465 jmp avx_vex_reg
1466 setup_avx_66_supplemental:
1467 mov [opcode_prefix],66h
1468 mov [broadcast_size],ch
1469 mov [mmx_size],cl
1470 mov [base_code],0Fh
1471 mov [extended_code],ah
1472 mov [supplemental_code],al
1473 or [vex_required],1
1474 ret
1475 avx_permq_instruction:
1476 or [rex_prefix],8
1477 mov ch,8
1478 jmp avx_permil_instruction
1479 avx_permilpd_instruction:
1480 or [rex_prefix],80h
1481 mov ch,8
1482 jmp avx_permil_instruction
1483 avx_permilps_instruction:
1484 mov ch,4
1485 avx_permil_instruction:
1486 or [operand_flags],2
1487 xor cl,cl
1488 mov ah,3Ah
1489 call setup_avx_66_supplemental
1490 call take_avx_register
1491 cmp [supplemental_code],4
1492 jae avx_permil_size_ok
1493 cmp ah,32
1494 jb invalid_operand_size
1495 avx_permil_size_ok:
1496 mov [postbyte_register],al
1497 call take_avx512_mask
1498 lods byte [esi]
1499 cmp al,','
1500 jne invalid_operand
1501 call take_avx_rm
1502 jnc mmx_imm8
1503 mov bl,al
1504 cmp byte [esi],','
1505 jne invalid_operand
1506 mov al,[esi+1]
1507 cmp al,11h
1508 jne avx_permil_rm_or_imm8
1509 mov al,[esi+3]
1510 avx_permil_rm_or_imm8:
1511 cmp al,'('
1512 je mmx_nomem_imm8
1513 mov [vex_register],bl
1514 inc esi
1515 mov [extended_code],38h
1516 mov al,[supplemental_code]
1517 cmp al,4
1518 jb avx_permq_rm
1519 add [supplemental_code],8
1520 jmp avx_regs_rm
1521 avx_permq_rm:
1522 or [vex_required],8
1523 shl al,5
1524 neg al
1525 add al,36h
1526 mov [supplemental_code],al
1527 jmp avx_regs_rm
1528 vpermil_2pd_instruction:
1529 mov [immediate_size],-2
1530 mov byte [value],al
1531 mov al,49h
1532 jmp vpermil2_instruction_setup
1533 vpermil_2ps_instruction:
1534 mov [immediate_size],-2
1535 mov byte [value],al
1536 mov al,48h
1537 jmp vpermil2_instruction_setup
1538 vpermil2_instruction:
1539 mov [immediate_size],-3
1540 mov byte [value],0
1541 vpermil2_instruction_setup:
1542 or [vex_required],2
1543 mov [base_code],0Fh
1544 mov [supplemental_code],al
1545 mov al,3Ah
1546 xor cl,cl
1547 jmp avx_instruction
1548
1549 avx_shift_q_instruction_evex:
1550 or [vex_required],8
1551 avx_shift_q_instruction:
1552 or [rex_prefix],80h
1553 mov cl,8
1554 jmp avx_shift_instruction
1555 avx_shift_d_instruction:
1556 mov cl,4
1557 jmp avx_shift_instruction
1558 avx_shift_bw_instruction:
1559 xor cl,cl
1560 avx_shift_instruction:
1561 mov [broadcast_size],cl
1562 mov [mmx_size],0
1563 mov [opcode_prefix],66h
1564 mov [base_code],0Fh
1565 mov [extended_code],al
1566 or [vex_required],1
1567 call take_avx_register
1568 mov [postbyte_register],al
1569 call take_avx512_mask
1570 lods byte [esi]
1571 cmp al,','
1572 jne invalid_operand
1573 xor cl,cl
1574 xchg cl,[operand_size]
1575 lods byte [esi]
1576 call get_size_operator
1577 cmp al,'['
1578 je avx_shift_reg_mem
1579 mov [operand_size],cl
1580 cmp al,10h
1581 jne invalid_operand
1582 lods byte [esi]
1583 call convert_avx_register
1584 mov [vex_register],al
1585 lods byte [esi]
1586 cmp al,','
1587 jne invalid_operand
1588 push esi
1589 xor cl,cl
1590 xchg cl,[operand_size]
1591 lods byte [esi]
1592 call get_size_operator
1593 cmp al,10h
1594 je avx_shift_reg_reg_reg
1595 pop esi
1596 cmp al,'['
1597 je avx_shift_reg_reg_mem
1598 xchg cl,[operand_size]
1599 test cl,not 1
1600 jnz invalid_operand_size
1601 dec esi
1602 call convert_avx_shift_opcode
1603 mov bl,al
1604 jmp mmx_nomem_imm8
1605 convert_avx_shift_opcode:
1606 mov al,[extended_code]
1607 mov ah,al
1608 and ah,1111b
1609 add ah,70h
1610 mov [extended_code],ah
1611 shr al,4
1612 sub al,0Ch
1613 shl al,1
1614 xchg al,[postbyte_register]
1615 xchg al,[vex_register]
1616 ret
1617 avx_shift_reg_reg_reg:
1618 pop eax
1619 lods byte [esi]
1620 call convert_xmm_register
1621 xchg cl,[operand_size]
1622 mov bl,al
1623 jmp nomem_instruction_ready
1624 avx_shift_reg_reg_mem:
1625 mov [mmx_size],16
1626 push ecx
1627 lods byte [esi]
1628 call get_size_operator
1629 call get_address
1630 pop eax
1631 xchg al,[operand_size]
1632 test al,al
1633 jz instruction_ready
1634 cmp al,16
1635 jne invalid_operand_size
1636 jmp instruction_ready
1637 avx_shift_reg_mem:
1638 or [vex_required],8
1639 call take_avx_mem
1640 call convert_avx_shift_opcode
1641 jmp mmx_imm8
1642 avx_shift_dq_instruction:
1643 mov [postbyte_register],al
1644 mov [opcode_prefix],66h
1645 mov [base_code],0Fh
1646 mov [extended_code],73h
1647 or [vex_required],1
1648 mov [mmx_size],0
1649 call take_avx_register
1650 mov [vex_register],al
1651 lods byte [esi]
1652 cmp al,','
1653 jne invalid_operand
1654 lods byte [esi]
1655 call get_size_operator
1656 cmp al,'['
1657 je avx_shift_dq_reg_mem
1658 cmp al,10h
1659 jne invalid_operand
1660 lods byte [esi]
1661 call convert_avx_register
1662 mov bl,al
1663 jmp mmx_nomem_imm8
1664 avx_shift_dq_reg_mem:
1665 or [vex_required],8
1666 call get_address
1667 jmp mmx_imm8
1668 avx512_rotate_q_instruction:
1669 mov cl,8
1670 or [rex_prefix],cl
1671 jmp avx512_rotate_instruction
1672 avx512_rotate_d_instruction:
1673 mov cl,4
1674 avx512_rotate_instruction:
1675 mov [broadcast_size],cl
1676 mov [postbyte_register],al
1677 mov [opcode_prefix],66h
1678 mov [base_code],0Fh
1679 mov [extended_code],72h
1680 or [vex_required],8
1681 mov [mmx_size],0
1682 mov [immediate_size],1
1683 call take_avx_register
1684 mov [vex_register],al
1685 call take_avx512_mask
1686 jmp avx_vex_reg_ok
1687
1688 avx_pmovsxbq_instruction:
1689 mov cl,2
1690 jmp avx_pmovsx_instruction
1691 avx_pmovsxbd_instruction:
1692 mov cl,4
1693 jmp avx_pmovsx_instruction
1694 avx_pmovsxbw_instruction:
1695 mov cl,8
1696 avx_pmovsx_instruction:
1697 mov [mmx_size],cl
1698 or [vex_required],1
1699 call setup_66_0f_38
1700 call take_avx_register
1701 mov [postbyte_register],al
1702 call take_avx512_mask
1703 lods byte [esi]
1704 cmp al,','
1705 jne invalid_operand
1706 xor al,al
1707 xchg al,[operand_size]
1708 bsf ecx,eax
1709 sub cl,4
1710 shl [mmx_size],cl
1711 push eax
1712 lods byte [esi]
1713 call get_size_operator
1714 cmp al,10h
1715 je avx_pmovsx_reg_reg
1716 cmp al,'['
1717 jne invalid_operand
1718 call get_address
1719 pop eax
1720 xchg al,[operand_size]
1721 or al,al
1722 jz instruction_ready
1723 cmp al,[mmx_size]
1724 jne invalid_operand_size
1725 jmp instruction_ready
1726 avx_pmovsx_reg_reg:
1727 lods byte [esi]
1728 call convert_avx_register
1729 mov bl,al
1730 cmp ah,[mmx_size]
1731 je avx_pmovsx_xmmreg_reg_size_ok
1732 jb invalid_operand_size
1733 cmp ah,16
1734 jne invalid_operand_size
1735 avx_pmovsx_xmmreg_reg_size_ok:
1736 pop eax
1737 mov [operand_size],al
1738 jmp nomem_instruction_ready
1739 avx512_pmovqb_instruction:
1740 mov cl,2
1741 jmp avx512_pmov_instruction
1742 avx512_pmovdb_instruction:
1743 mov cl,4
1744 jmp avx512_pmov_instruction
1745 avx512_pmovwb_instruction:
1746 mov cl,8
1747 avx512_pmov_instruction:
1748 mov [mmx_size],cl
1749 or [vex_required],8
1750 mov [extended_code],38h
1751 mov [supplemental_code],al
1752 mov [base_code],0Fh
1753 mov [opcode_prefix],0F3h
1754 lods byte [esi]
1755 call get_size_operator
1756 cmp al,10h
1757 je avx512_pmov_reg
1758 cmp al,'['
1759 jne invalid_operand
1760 call get_address
1761 or [operand_flags],20h
1762 call avx512_pmov_common
1763 or al,al
1764 jz instruction_ready
1765 cmp al,[mmx_size]
1766 jne invalid_operand_size
1767 jmp instruction_ready
1768 avx512_pmov_common:
1769 call take_avx512_mask
1770 xor al,al
1771 xchg al,[operand_size]
1772 push eax
1773 lods byte [esi]
1774 cmp al,','
1775 jne invalid_operand
1776 call take_avx_register
1777 mov [postbyte_register],al
1778 mov al,ah
1779 mov ah,cl
1780 bsf ecx,eax
1781 sub cl,4
1782 shl [mmx_size],cl
1783 mov cl,ah
1784 pop eax
1785 ret
1786 avx512_pmov_reg:
1787 lods byte [esi]
1788 call convert_avx_register
1789 mov bl,al
1790 call avx512_pmov_common
1791 cmp al,[mmx_size]
1792 je nomem_instruction_ready
1793 jb invalid_operand_size
1794 cmp al,16
1795 jne invalid_operand_size
1796 jmp nomem_instruction_ready
1797
1798 avx_broadcast_128_instruction_noevex:
1799 or [vex_required],2
1800 mov cl,10h
1801 jmp avx_broadcast_instruction
1802 avx512_broadcast_32x2_instruction:
1803 mov cl,08h
1804 jmp avx_broadcast_instruction_evex
1805 avx512_broadcast_32x4_instruction:
1806 mov cl,10h
1807 jmp avx_broadcast_instruction_evex
1808 avx512_broadcast_32x8_instruction:
1809 mov cl,20h
1810 jmp avx_broadcast_instruction_evex
1811 avx512_broadcast_64x2_instruction:
1812 mov cl,10h
1813 jmp avx_broadcast_instruction_w1_evex
1814 avx512_broadcast_64x4_instruction:
1815 mov cl,20h
1816 avx_broadcast_instruction_w1_evex:
1817 or [rex_prefix],8
1818 avx_broadcast_instruction_evex:
1819 or [vex_required],8
1820 jmp avx_broadcast_instruction
1821 avx_broadcastss_instruction:
1822 mov cl,4
1823 jmp avx_broadcast_instruction
1824 avx_broadcastsd_instruction:
1825 or [rex_prefix],80h
1826 mov cl,8
1827 jmp avx_broadcast_instruction
1828 avx_pbroadcastb_instruction:
1829 mov cl,1
1830 jmp avx_broadcast_pi_instruction
1831 avx_pbroadcastw_instruction:
1832 mov cl,2
1833 jmp avx_broadcast_pi_instruction
1834 avx_pbroadcastd_instruction:
1835 mov cl,4
1836 jmp avx_broadcast_pi_instruction
1837 avx_pbroadcastq_instruction:
1838 mov cl,8
1839 or [rex_prefix],80h
1840 avx_broadcast_pi_instruction:
1841 or [operand_flags],40h
1842 avx_broadcast_instruction:
1843 mov [opcode_prefix],66h
1844 mov [supplemental_code],al
1845 mov al,38h
1846 mov [mmx_size],cl
1847 mov [base_code],0Fh
1848 mov [extended_code],al
1849 or [vex_required],1
1850 call take_avx_register
1851 cmp ah,[mmx_size]
1852 je invalid_operand_size
1853 test [operand_flags],40h
1854 jnz avx_broadcast_destination_size_ok
1855 cmp [mmx_size],4
1856 je avx_broadcast_destination_size_ok
1857 cmp [supplemental_code],59h
1858 je avx_broadcast_destination_size_ok
1859 cmp ah,16
1860 je invalid_operand_size
1861 avx_broadcast_destination_size_ok:
1862 xor ah,ah
1863 xchg ah,[operand_size]
1864 push eax
1865 call take_avx512_mask
1866 lods byte [esi]
1867 cmp al,','
1868 jne invalid_operand
1869 lods byte [esi]
1870 call get_size_operator
1871 cmp al,10h
1872 je avx_broadcast_reg_reg
1873 cmp al,'['
1874 jne invalid_operand
1875 call get_address
1876 pop eax
1877 xchg ah,[operand_size]
1878 mov [postbyte_register],al
1879 mov al,[broadcast_size]
1880 mov al,[mmx_size]
1881 cmp al,ah
1882 je instruction_ready
1883 or al,al
1884 jz instruction_ready
1885 or ah,ah
1886 jz instruction_ready
1887 jmp invalid_operand_size
1888 avx_broadcast_reg_reg:
1889 lods byte [esi]
1890 test [operand_flags],40h
1891 jz avx_broadcast_reg_avx_reg
1892 cmp al,60h
1893 jb avx_broadcast_reg_general_reg
1894 cmp al,80h
1895 jb avx_broadcast_reg_avx_reg
1896 cmp al,0C0h
1897 jb avx_broadcast_reg_general_reg
1898 avx_broadcast_reg_avx_reg:
1899 call convert_avx_register
1900 mov bl,al
1901 mov al,[mmx_size]
1902 or al,al
1903 jz avx_broadcast_reg_avx_reg_size_ok
1904 cmp ah,16
1905 jne invalid_operand_size
1906 cmp al,ah
1907 jae invalid_operand
1908 avx_broadcast_reg_avx_reg_size_ok:
1909 pop eax
1910 xchg ah,[operand_size]
1911 mov [postbyte_register],al
1912 test [vex_required],2
1913 jnz invalid_operand
1914 jmp nomem_instruction_ready
1915 avx_broadcast_reg_general_reg:
1916 call convert_register
1917 mov bl,al
1918 mov al,[mmx_size]
1919 or al,al
1920 jz avx_broadcast_reg_general_reg_size_ok
1921 cmp al,ah
1922 je avx_broadcast_reg_general_reg_size_ok
1923 ja invalid_operand_size
1924 cmp ah,4
1925 jne invalid_operand_size
1926 avx_broadcast_reg_general_reg_size_ok:
1927 cmp al,4
1928 jb avx_broadcast_reg_general_reg_ready
1929 cmp al,8
1930 mov al,3
1931 jne avx_broadcast_reg_general_reg_ready
1932 or [rex_prefix],8
1933 avx_broadcast_reg_general_reg_ready:
1934 add al,7Ah-1
1935 mov [supplemental_code],al
1936 or [vex_required],8
1937 pop eax
1938 xchg ah,[operand_size]
1939 mov [postbyte_register],al
1940 jmp nomem_instruction_ready
1941
1942 avx512_extract_64x4_instruction:
1943 or [rex_prefix],8
1944 avx512_extract_32x8_instruction:
1945 or [vex_required],8
1946 mov cl,32
1947 jmp avx_extractf_instruction
1948 avx512_extract_64x2_instruction:
1949 or [rex_prefix],8
1950 avx512_extract_32x4_instruction:
1951 or [vex_required],8
1952 mov cl,16
1953 jmp avx_extractf_instruction
1954 avx_extractf128_instruction:
1955 or [vex_required],2
1956 mov cl,16
1957 avx_extractf_instruction:
1958 mov [mmx_size],cl
1959 call setup_66_0f_3a
1960 lods byte [esi]
1961 call get_size_operator
1962 cmp al,10h
1963 je avx_extractf_reg
1964 cmp al,'['
1965 jne invalid_operand
1966 call get_address
1967 xor al,al
1968 xchg al,[operand_size]
1969 or al,al
1970 jz avx_extractf_mem_size_ok
1971 cmp al,[mmx_size]
1972 jne invalid_operand_size
1973 avx_extractf_mem_size_ok:
1974 call take_avx512_mask
1975 lods byte [esi]
1976 cmp al,','
1977 jne invalid_operand
1978 call take_avx_register
1979 cmp ah,[mmx_size]
1980 jbe invalid_operand_size
1981 mov [postbyte_register],al
1982 jmp mmx_imm8
1983 avx_extractf_reg:
1984 lods byte [esi]
1985 call convert_avx_register
1986 cmp ah,[mmx_size]
1987 jne invalid_operand_size
1988 push eax
1989 call take_avx512_mask
1990 mov [operand_size],0
1991 lods byte [esi]
1992 cmp al,','
1993 jne invalid_operand
1994 call take_avx_register
1995 cmp ah,[mmx_size]
1996 jbe invalid_operand_size
1997 mov [postbyte_register],al
1998 pop ebx
1999 jmp mmx_nomem_imm8
2000 avx512_insert_64x4_instruction:
2001 or [rex_prefix],8
2002 avx512_insert_32x8_instruction:
2003 or [vex_required],8
2004 mov cl,32
2005 jmp avx_insertf_instruction
2006 avx512_insert_64x2_instruction:
2007 or [rex_prefix],8
2008 avx512_insert_32x4_instruction:
2009 or [vex_required],8
2010 mov cl,16
2011 jmp avx_insertf_instruction
2012 avx_insertf128_instruction:
2013 or [vex_required],2
2014 mov cl,16
2015 avx_insertf_instruction:
2016 mov [mmx_size],cl
2017 mov [broadcast_size],0
2018 call setup_66_0f_3a
2019 call take_avx_register
2020 cmp ah,[mmx_size]
2021 jbe invalid_operand
2022 mov [postbyte_register],al
2023 call take_avx512_mask
2024 lods byte [esi]
2025 cmp al,','
2026 jne invalid_operand
2027 call take_avx_register
2028 mov [vex_register],al
2029 mov al,[mmx_size]
2030 xchg al,[operand_size]
2031 push eax
2032 lods byte [esi]
2033 cmp al,','
2034 jne invalid_operand
2035 lods byte [esi]
2036 call get_size_operator
2037 cmp al,10h
2038 je avx_insertf_reg_reg_reg
2039 cmp al,'['
2040 jne invalid_operand
2041 call get_address
2042 pop eax
2043 mov [operand_size],al
2044 jmp mmx_imm8
2045 avx_insertf_reg_reg_reg:
2046 lods byte [esi]
2047 call convert_avx_register
2048 mov bl,al
2049 pop eax
2050 mov [operand_size],al
2051 jmp mmx_nomem_imm8
2052 avx_extract_b_instruction:
2053 mov cl,1
2054 jmp avx_extract_instruction
2055 avx_extract_w_instruction:
2056 mov cl,2
2057 jmp avx_extract_instruction
2058 avx_extract_q_instruction:
2059 or [rex_prefix],8
2060 mov cl,8
2061 jmp avx_extract_instruction
2062 avx_extract_d_instruction:
2063 mov cl,4
2064 avx_extract_instruction:
2065 mov [mmx_size],cl
2066 call setup_66_0f_3a
2067 or [vex_required],1
2068 lods byte [esi]
2069 call get_size_operator
2070 cmp al,10h
2071 je avx_extractps_reg
2072 cmp al,'['
2073 jne invalid_operand
2074 call get_address
2075 mov al,[mmx_size]
2076 not al
2077 and [operand_size],al
2078 jnz invalid_operand_size
2079 lods byte [esi]
2080 cmp al,','
2081 jne invalid_operand
2082 lods byte [esi]
2083 call get_size_operator
2084 cmp al,10h
2085 jne invalid_operand
2086 lods byte [esi]
2087 call convert_avx_register
2088 cmp ah,16
2089 jne invalid_operand_size
2090 mov [postbyte_register],al
2091 jmp mmx_imm8
2092 avx_extractps_reg:
2093 lods byte [esi]
2094 call convert_register
2095 mov bl,al
2096 mov al,[mmx_size]
2097 cmp ah,al
2098 jb invalid_operand_size
2099 cmp ah,4
2100 je avx_extractps_reg_size_ok
2101 cmp ah,8
2102 jne invalid_operand_size
2103 cmp [code_type],64
2104 jne invalid_operand
2105 cmp al,4
2106 jae avx_extractps_reg_size_ok
2107 or [rex_prefix],8
2108 avx_extractps_reg_size_ok:
2109 mov [operand_size],0
2110 lods byte [esi]
2111 cmp al,','
2112 jne invalid_operand
2113 lods byte [esi]
2114 call get_size_operator
2115 cmp al,10h
2116 jne invalid_operand
2117 lods byte [esi]
2118 call convert_avx_register
2119 cmp ah,16
2120 jne invalid_operand_size
2121 mov [postbyte_register],al
2122 cmp [supplemental_code],15h
2123 jne mmx_nomem_imm8
2124 mov [extended_code],0C5h
2125 xchg bl,[postbyte_register]
2126 jmp mmx_nomem_imm8
2127 avx_insertps_instruction:
2128 mov [immediate_size],1
2129 or [operand_flags],10h
2130 mov [opcode_prefix],66h
2131 mov [supplemental_code],al
2132 mov al,3Ah
2133 mov cl,4
2134 jmp avx_instruction
2135 avx_pinsrb_instruction:
2136 mov cl,1
2137 jmp avx_pinsr_instruction_3a
2138 avx_pinsrw_instruction:
2139 mov cl,2
2140 jmp avx_pinsr_instruction
2141 avx_pinsrd_instruction:
2142 mov cl,4
2143 jmp avx_pinsr_instruction_3a
2144 avx_pinsrq_instruction:
2145 cmp [code_type],64
2146 jne illegal_instruction
2147 mov cl,8
2148 or [rex_prefix],8
2149 avx_pinsr_instruction_3a:
2150 mov [supplemental_code],al
2151 mov al,3Ah
2152 avx_pinsr_instruction:
2153 mov [opcode_prefix],66h
2154 mov [base_code],0Fh
2155 mov [extended_code],al
2156 mov [mmx_size],cl
2157 or [vex_required],1
2158 call take_avx_register
2159 cmp ah,16
2160 jne invalid_operand_size
2161 mov [postbyte_register],al
2162 lods byte [esi]
2163 cmp al,','
2164 jne invalid_operand
2165 call take_avx_register
2166 mov [vex_register],al
2167 jmp pinsr_xmmreg
2168
2169 avx_cvtudq2pd_instruction:
2170 or [vex_required],8
2171 avx_cvtdq2pd_instruction:
2172 mov [opcode_prefix],0F3h
2173 mov cl,4
2174 jmp avx_cvt_d_instruction
2175 avx_cvtps2qq_instruction:
2176 or [operand_flags],8
2177 avx_cvttps2qq_instruction:
2178 or [operand_flags],4
2179 or [vex_required],8
2180 mov [opcode_prefix],66h
2181 mov cl,4
2182 jmp avx_cvt_d_instruction
2183 avx_cvtps2pd_instruction:
2184 or [operand_flags],4
2185 mov cl,4
2186 avx_cvt_d_instruction:
2187 mov [base_code],0Fh
2188 mov [extended_code],al
2189 or [vex_required],1
2190 mov [broadcast_size],cl
2191 call take_avx_register
2192 mov [postbyte_register],al
2193 call take_avx512_mask
2194 lods byte [esi]
2195 cmp al,','
2196 jne invalid_operand
2197 xor ecx,ecx
2198 xchg cl,[operand_size]
2199 mov al,cl
2200 shr al,1
2201 mov [mmx_size],al
2202 lods byte [esi]
2203 call get_size_operator
2204 cmp al,'['
2205 je avx_cvt_d_reg_mem
2206 cmp al,10h
2207 jne invalid_operand
2208 mov [operand_size],0
2209 lods byte [esi]
2210 call convert_avx_register
2211 cmp ah,[mmx_size]
2212 je avx_cvt_d_reg_reg_size_ok
2213 jb invalid_operand_size
2214 cmp ah,16
2215 jne invalid_operand_size
2216 avx_cvt_d_reg_reg_size_ok:
2217 mov bl,al
2218 mov [operand_size],cl
2219 call take_avx512_rounding
2220 jmp nomem_instruction_ready
2221 avx_cvt_d_reg_mem:
2222 call take_avx_mem
2223 jmp instruction_ready
2224 avx_cvtpd2dq_instruction:
2225 or [operand_flags],4+8
2226 mov [opcode_prefix],0F2h
2227 jmp avx_cvt_q_instruction
2228 avx_cvtuqq2ps_instruction:
2229 mov [opcode_prefix],0F2h
2230 avx_cvtpd2udq_instruction:
2231 or [operand_flags],8
2232 avx_cvttpd2udq_instruction:
2233 or [operand_flags],4
2234 or [vex_required],8
2235 jmp avx_cvt_q_instruction
2236 avx_cvtpd2ps_instruction:
2237 or [operand_flags],8
2238 avx_cvttpd2dq_instruction:
2239 or [operand_flags],4
2240 mov [opcode_prefix],66h
2241 avx_cvt_q_instruction:
2242 mov [broadcast_size],8
2243 mov [base_code],0Fh
2244 mov [extended_code],al
2245 or [vex_required],1
2246 or [rex_prefix],80h
2247 call take_avx_register
2248 mov [postbyte_register],al
2249 push eax
2250 call take_avx512_mask
2251 lods byte [esi]
2252 cmp al,','
2253 jne invalid_operand
2254 xor al,al
2255 mov [operand_size],al
2256 mov [mmx_size],al
2257 call take_avx_rm
2258 jnc avx_cvt_q_reg_mem
2259 mov bl,al
2260 pop eax
2261 call avx_cvt_q_check_size
2262 call take_avx512_rounding
2263 jmp nomem_instruction_ready
2264 avx_cvt_q_reg_mem:
2265 pop eax
2266 call avx_cvt_q_check_size
2267 jmp instruction_ready
2268 avx_cvt_q_check_size:
2269 mov al,[operand_size]
2270 or al,al
2271 jz avx_cvt_q_size_not_specified
2272 cmp al,64
2273 ja invalid_operand_size
2274 shr al,1
2275 cmp al,ah
2276 je avx_cvt_q_size_ok
2277 ja invalid_operand_size
2278 cmp ah,16
2279 jne invalid_operand_size
2280 avx_cvt_q_size_ok:
2281 ret
2282 avx_cvt_q_size_not_specified:
2283 cmp ah,64 shr 1
2284 jne recoverable_unknown_size
2285 mov [operand_size],64
2286 ret
2287 avx_cvttps2udq_instruction:
2288 or [vex_required],8
2289 or [operand_flags],2+4
2290 mov cx,0400h
2291 jmp avx_instruction_with_broadcast
2292 avx_cvttps2dq_instruction:
2293 mov [opcode_prefix],0F3h
2294 or [operand_flags],2+4
2295 mov cx,0400h
2296 jmp avx_instruction_with_broadcast
2297 avx_cvtph2ps_instruction:
2298 mov [opcode_prefix],66h
2299 mov [supplemental_code],al
2300 or [operand_flags],4
2301 mov al,38h
2302 xor cl,cl
2303 jmp avx_cvt_d_instruction
2304 avx_cvtps2ph_instruction:
2305 call setup_66_0f_3a
2306 or [vex_required],1
2307 or [operand_flags],4
2308 lods byte [esi]
2309 call get_size_operator
2310 cmp al,10h
2311 je vcvtps2ph_reg
2312 cmp al,'['
2313 jne invalid_operand
2314 call get_address
2315 call take_avx512_mask
2316 lods byte [esi]
2317 cmp al,','
2318 jne invalid_operand
2319 shl [operand_size],1
2320 call take_avx_register
2321 mov [postbyte_register],al
2322 shr ah,1
2323 mov [mmx_size],ah
2324 jmp mmx_imm8
2325 vcvtps2ph_reg:
2326 lods byte [esi]
2327 call convert_avx_register
2328 mov bl,al
2329 call take_avx512_mask
2330 xor cl,cl
2331 xchg cl,[operand_size]
2332 shl cl,1
2333 lods byte [esi]
2334 cmp al,','
2335 jne invalid_operand
2336 call take_avx_register
2337 mov [postbyte_register],al
2338 or cl,cl
2339 jz vcvtps2ph_reg_size_ok
2340 cmp cl,ah
2341 je vcvtps2ph_reg_size_ok
2342 jb invalid_operand_size
2343 cmp ah,16
2344 jne invalid_operand_size
2345 vcvtps2ph_reg_size_ok:
2346 call take_avx512_rounding
2347 jmp mmx_nomem_imm8
2348
2349 avx_cvtsd2usi_instruction:
2350 or [operand_flags],8
2351 avx_cvttsd2usi_instruction:
2352 or [vex_required],8
2353 jmp avx_cvttsd2si_instruction
2354 avx_cvtsd2si_instruction:
2355 or [operand_flags],8
2356 avx_cvttsd2si_instruction:
2357 mov ah,0F2h
2358 mov cl,8
2359 jmp avx_cvt_2si_instruction
2360 avx_cvtss2usi_instruction:
2361 or [operand_flags],8
2362 avx_cvttss2usi_instruction:
2363 or [vex_required],8
2364 jmp avx_cvttss2si_instruction
2365 avx_cvtss2si_instruction:
2366 or [operand_flags],8
2367 avx_cvttss2si_instruction:
2368 mov ah,0F3h
2369 mov cl,4
2370 avx_cvt_2si_instruction:
2371 or [operand_flags],2+4
2372 mov [mmx_size],cl
2373 mov [broadcast_size],0
2374 mov [opcode_prefix],ah
2375 mov [base_code],0Fh
2376 mov [extended_code],al
2377 or [vex_required],1
2378 lods byte [esi]
2379 call get_size_operator
2380 cmp al,10h
2381 jne invalid_operand
2382 lods byte [esi]
2383 call convert_register
2384 mov [postbyte_register],al
2385 mov [operand_size],0
2386 cmp ah,4
2387 je avx_cvt_2si_reg
2388 cmp ah,8
2389 jne invalid_operand_size
2390 call operand_64bit
2391 avx_cvt_2si_reg:
2392 lods byte [esi]
2393 cmp al,','
2394 jne invalid_operand
2395 call take_avx_rm
2396 jnc instruction_ready
2397 mov bl,al
2398 call take_avx512_rounding
2399 jmp nomem_instruction_ready
2400 avx_cvtusi2sd_instruction:
2401 or [vex_required],8
2402 avx_cvtsi2sd_instruction:
2403 mov ah,0F2h
2404 mov cl,8
2405 jmp avx_cvtsi_instruction
2406 avx_cvtusi2ss_instruction:
2407 or [vex_required],8
2408 avx_cvtsi2ss_instruction:
2409 mov ah,0F3h
2410 mov cl,4
2411 avx_cvtsi_instruction:
2412 or [operand_flags],2+4+8
2413 mov [mmx_size],cl
2414 mov [opcode_prefix],ah
2415 mov [base_code],0Fh
2416 mov [extended_code],al
2417 or [vex_required],1
2418 call take_avx_register
2419 cmp ah,16
2420 jne invalid_operand_size
2421 mov [postbyte_register],al
2422 lods byte [esi]
2423 cmp al,','
2424 jne invalid_operand
2425 call take_avx_register
2426 mov [vex_register],al
2427 lods byte [esi]
2428 cmp al,','
2429 jne invalid_operand
2430 mov [operand_size],0
2431 lods byte [esi]
2432 call get_size_operator
2433 cmp al,'['
2434 je avx_cvtsi_reg_reg_mem
2435 cmp al,10h
2436 jne invalid_operand
2437 lods byte [esi]
2438 call convert_register
2439 mov bl,al
2440 cmp ah,4
2441 je avx_cvtsi_reg_reg_reg32
2442 cmp ah,8
2443 jne invalid_operand_size
2444 call operand_64bit
2445 avx_cvtsi_rounding:
2446 call take_avx512_rounding
2447 jmp nomem_instruction_ready
2448 avx_cvtsi_reg_reg_reg32:
2449 cmp [mmx_size],8
2450 jne avx_cvtsi_rounding
2451 jmp nomem_instruction_ready
2452 avx_cvtsi_reg_reg_mem:
2453 call get_address
2454 mov al,[operand_size]
2455 mov [mmx_size],al
2456 or al,al
2457 jz single_mem_nosize
2458 cmp al,4
2459 je instruction_ready
2460 cmp al,8
2461 jne invalid_operand_size
2462 call operand_64bit
2463 jmp instruction_ready
2464
2465 avx_maskmov_w1_instruction:
2466 or [rex_prefix],8
2467 avx_maskmov_instruction:
2468 call setup_66_0f_38
2469 mov [mmx_size],0
2470 or [vex_required],2
2471 lods byte [esi]
2472 call get_size_operator
2473 cmp al,10h
2474 jne avx_maskmov_mem
2475 lods byte [esi]
2476 call convert_avx_register
2477 mov [postbyte_register],al
2478 lods byte [esi]
2479 cmp al,','
2480 jne invalid_operand
2481 call take_avx_register
2482 mov [vex_register],al
2483 lods byte [esi]
2484 cmp al,','
2485 jne invalid_operand
2486 lods byte [esi]
2487 call get_size_operator
2488 cmp al,'['
2489 jne invalid_operand
2490 call get_address
2491 jmp instruction_ready
2492 avx_maskmov_mem:
2493 cmp al,'['
2494 jne invalid_operand
2495 call get_address
2496 lods byte [esi]
2497 cmp al,','
2498 jne invalid_operand
2499 call take_avx_register
2500 mov [vex_register],al
2501 lods byte [esi]
2502 cmp al,','
2503 jne invalid_operand
2504 call take_avx_register
2505 mov [postbyte_register],al
2506 add [supplemental_code],2
2507 jmp instruction_ready
2508 avx_movmskpd_instruction:
2509 mov [opcode_prefix],66h
2510 avx_movmskps_instruction:
2511 mov [base_code],0Fh
2512 mov [extended_code],50h
2513 or [vex_required],2
2514 lods byte [esi]
2515 call get_size_operator
2516 cmp al,10h
2517 jne invalid_operand
2518 lods byte [esi]
2519 call convert_register
2520 mov [postbyte_register],al
2521 cmp ah,4
2522 je avx_movmskps_reg_ok
2523 cmp ah,8
2524 jne invalid_operand_size
2525 cmp [code_type],64
2526 jne invalid_operand
2527 avx_movmskps_reg_ok:
2528 mov [operand_size],0
2529 lods byte [esi]
2530 cmp al,','
2531 jne invalid_operand
2532 call take_avx_register
2533 mov bl,al
2534 jmp nomem_instruction_ready
2535 avx_maskmovdqu_instruction:
2536 or [vex_required],2
2537 jmp maskmovdqu_instruction
2538 avx_pmovmskb_instruction:
2539 or [vex_required],2
2540 mov [opcode_prefix],66h
2541 mov [base_code],0Fh
2542 mov [extended_code],al
2543 lods byte [esi]
2544 call get_size_operator
2545 cmp al,10h
2546 jne invalid_operand
2547 lods byte [esi]
2548 call convert_register
2549 cmp ah,4
2550 je avx_pmovmskb_reg_size_ok
2551 cmp [code_type],64
2552 jne invalid_operand_size
2553 cmp ah,8
2554 jnz invalid_operand_size
2555 avx_pmovmskb_reg_size_ok:
2556 mov [postbyte_register],al
2557 mov [operand_size],0
2558 lods byte [esi]
2559 cmp al,','
2560 jne invalid_operand
2561 call take_avx_register
2562 mov bl,al
2563 jmp nomem_instruction_ready
2564
2565 gather_pd_instruction:
2566 or [rex_prefix],8
2567 gather_ps_instruction:
2568 call setup_66_0f_38
2569 or [vex_required],4
2570 or [operand_flags],20h
2571 call take_avx_register
2572 mov [postbyte_register],al
2573 call take_avx512_mask
2574 lods byte [esi]
2575 cmp al,','
2576 jne invalid_operand
2577 xor cl,cl
2578 xchg cl,[operand_size]
2579 push ecx
2580 lods byte [esi]
2581 call get_size_operator
2582 cmp al,'['
2583 jne invalid_argument
2584 call get_address
2585 pop eax
2586 xchg al,[operand_size]
2587 gather_mem_size_check:
2588 mov ah,4
2589 test [rex_prefix],8
2590 jz gather_elements_size_ok
2591 add ah,ah
2592 gather_elements_size_ok:
2593 mov [mmx_size],ah
2594 test al,al
2595 jz gather_mem_size_ok
2596 cmp al,ah
2597 jne invalid_operand_size
2598 gather_mem_size_ok:
2599 cmp byte [esi],','
2600 je gather_reg_mem_reg
2601 test [vex_required],20h
2602 jz invalid_operand
2603 mov ah,[operand_size]
2604 mov al,80h
2605 jmp gather_arguments_ok
2606 gather_reg_mem_reg:
2607 or [vex_required],2
2608 inc esi
2609 call take_avx_register
2610 gather_arguments_ok:
2611 mov [vex_register],al
2612 cmp al,[postbyte_register]
2613 je disallowed_combination_of_registers
2614 mov al,bl
2615 and al,11111b
2616 cmp al,[postbyte_register]
2617 je disallowed_combination_of_registers
2618 cmp al,[vex_register]
2619 je disallowed_combination_of_registers
2620 mov al,bl
2621 shr al,5
2622 cmp al,0Ch shr 1
2623 je gather_vr128
2624 mov ah,32
2625 cmp al,6 shr 1
2626 jne gather_regular
2627 add ah,ah
2628 gather_regular:
2629 mov al,[rex_prefix]
2630 shr al,3
2631 xor al,[supplemental_code]
2632 test al,1
2633 jz gather_uniform
2634 test [supplemental_code],1
2635 jz gather_double
2636 mov al,ah
2637 xchg al,[operand_size]
2638 add al,al
2639 cmp al,ah
2640 jne invalid_operand_size
2641 jmp instruction_ready
2642 gather_double:
2643 add ah,ah
2644 gather_uniform:
2645 cmp ah,[operand_size]
2646 jne invalid_operand_size
2647 jmp instruction_ready
2648 gather_vr128:
2649 cmp ah,16
2650 je instruction_ready
2651 cmp ah,32
2652 jne invalid_operand_size
2653 test [supplemental_code],1
2654 jnz invalid_operand_size
2655 test [rex_prefix],8
2656 jz invalid_operand_size
2657 jmp instruction_ready
2658 scatter_pd_instruction:
2659 or [rex_prefix],8
2660 scatter_ps_instruction:
2661 call setup_66_0f_38
2662 or [vex_required],4+8
2663 or [operand_flags],20h
2664 lods byte [esi]
2665 call get_size_operator
2666 cmp al,'['
2667 jne invalid_argument
2668 call get_address
2669 call take_avx512_mask
2670 lods byte [esi]
2671 cmp al,','
2672 jne invalid_operand
2673 xor al,al
2674 xchg al,[operand_size]
2675 push eax
2676 call take_avx_register
2677 mov [postbyte_register],al
2678 pop eax
2679 jmp gather_mem_size_check
2680 gatherpf_qpd_instruction:
2681 mov ah,0C7h
2682 jmp gatherpf_pd_instruction
2683 gatherpf_dpd_instruction:
2684 mov ah,0C6h
2685 gatherpf_pd_instruction:
2686 or [rex_prefix],8
2687 mov cl,8
2688 jmp gatherpf_instruction
2689 gatherpf_qps_instruction:
2690 mov ah,0C7h
2691 jmp gatherpf_ps_instruction
2692 gatherpf_dps_instruction:
2693 mov ah,0C6h
2694 gatherpf_ps_instruction:
2695 mov cl,4
2696 gatherpf_instruction:
2697 mov [mmx_size],cl
2698 mov [postbyte_register],al
2699 mov al,ah
2700 call setup_66_0f_38
2701 or [vex_required],4+8
2702 or [operand_flags],20h
2703 lods byte [esi]
2704 call get_size_operator
2705 cmp al,'['
2706 jne invalid_argument
2707 call get_address
2708 call take_avx512_mask
2709 mov ah,[mmx_size]
2710 mov al,[operand_size]
2711 or al,al
2712 jz gatherpf_mem_size_ok
2713 cmp al,ah
2714 jne invalid_operand_size
2715 gatherpf_mem_size_ok:
2716 mov [operand_size],64
2717 mov al,6 shr 1
2718 cmp ah,4
2719 je gatherpf_check_vsib
2720 cmp [supplemental_code],0C6h
2721 jne gatherpf_check_vsib
2722 mov al,0Eh shr 1
2723 gatherpf_check_vsib:
2724 mov ah,bl
2725 shr ah,5
2726 cmp al,ah
2727 jne invalid_operand
2728 jmp instruction_ready
2729
2730 bmi_instruction:
2731 mov [base_code],0Fh
2732 mov [extended_code],38h
2733 mov [supplemental_code],0F3h
2734 mov [postbyte_register],al
2735 bmi_reg:
2736 or [vex_required],2
2737 lods byte [esi]
2738 call get_size_operator
2739 cmp al,10h
2740 jne invalid_operand
2741 lods byte [esi]
2742 call convert_register
2743 mov [vex_register],al
2744 lods byte [esi]
2745 cmp al,','
2746 jne invalid_operand
2747 lods byte [esi]
2748 call get_size_operator
2749 cmp al,10h
2750 je bmi_reg_reg
2751 cmp al,'['
2752 jne invalid_argument
2753 call get_address
2754 call operand_32or64
2755 jmp instruction_ready
2756 bmi_reg_reg:
2757 lods byte [esi]
2758 call convert_register
2759 mov bl,al
2760 call operand_32or64
2761 jmp nomem_instruction_ready
2762 operand_32or64:
2763 mov al,[operand_size]
2764 cmp al,4
2765 je operand_32or64_ok
2766 cmp al,8
2767 jne invalid_operand_size
2768 cmp [code_type],64
2769 jne invalid_operand
2770 or [rex_prefix],8
2771 operand_32or64_ok:
2772 ret
2773 pdep_instruction:
2774 mov [opcode_prefix],0F2h
2775 jmp andn_instruction
2776 pext_instruction:
2777 mov [opcode_prefix],0F3h
2778 andn_instruction:
2779 mov [base_code],0Fh
2780 mov [extended_code],38h
2781 mov [supplemental_code],al
2782 or [vex_required],2
2783 lods byte [esi]
2784 call get_size_operator
2785 cmp al,10h
2786 jne invalid_operand
2787 lods byte [esi]
2788 call convert_register
2789 mov [postbyte_register],al
2790 lods byte [esi]
2791 cmp al,','
2792 jne invalid_operand
2793 jmp bmi_reg
2794 sarx_instruction:
2795 mov [opcode_prefix],0F3h
2796 jmp bzhi_instruction
2797 shrx_instruction:
2798 mov [opcode_prefix],0F2h
2799 jmp bzhi_instruction
2800 shlx_instruction:
2801 mov [opcode_prefix],66h
2802 bzhi_instruction:
2803 mov [base_code],0Fh
2804 mov [extended_code],38h
2805 mov [supplemental_code],al
2806 or [vex_required],2
2807 call get_reg_mem
2808 jc bzhi_reg_reg
2809 call get_vex_source_register
2810 jc invalid_operand
2811 call operand_32or64
2812 jmp instruction_ready
2813 bzhi_reg_reg:
2814 call get_vex_source_register
2815 jc invalid_operand
2816 call operand_32or64
2817 jmp nomem_instruction_ready
2818 get_vex_source_register:
2819 lods byte [esi]
2820 cmp al,','
2821 jne invalid_operand
2822 lods byte [esi]
2823 call get_size_operator
2824 cmp al,10h
2825 jne no_vex_source_register
2826 lods byte [esi]
2827 call convert_register
2828 mov [vex_register],al
2829 clc
2830 ret
2831 no_vex_source_register:
2832 stc
2833 ret
2834 bextr_instruction:
2835 mov [base_code],0Fh
2836 mov [extended_code],38h
2837 mov [supplemental_code],al
2838 or [vex_required],2
2839 call get_reg_mem
2840 jc bextr_reg_reg
2841 call get_vex_source_register
2842 jc bextr_reg_mem_imm32
2843 call operand_32or64
2844 jmp instruction_ready
2845 bextr_reg_reg:
2846 call get_vex_source_register
2847 jc bextr_reg_reg_imm32
2848 call operand_32or64
2849 jmp nomem_instruction_ready
2850 setup_bextr_imm_opcode:
2851 mov [xop_opcode_map],0Ah
2852 mov [base_code],10h
2853 call operand_32or64
2854 ret
2855 bextr_reg_mem_imm32:
2856 call get_imm32
2857 call setup_bextr_imm_opcode
2858 jmp store_instruction_with_imm32
2859 bextr_reg_reg_imm32:
2860 call get_imm32
2861 call setup_bextr_imm_opcode
2862 store_nomem_instruction_with_imm32:
2863 call store_nomem_instruction
2864 mov eax,dword [value]
2865 call mark_relocation
2866 stos dword [edi]
2867 jmp instruction_assembled
2868 get_imm32:
2869 cmp al,'('
2870 jne invalid_operand
2871 push edx ebx ecx
2872 call get_dword_value
2873 mov dword [value],eax
2874 pop ecx ebx edx
2875 ret
2876 rorx_instruction:
2877 mov [opcode_prefix],0F2h
2878 mov [base_code],0Fh
2879 mov [extended_code],3Ah
2880 mov [supplemental_code],al
2881 or [vex_required],2
2882 call get_reg_mem
2883 jc rorx_reg_reg
2884 call operand_32or64
2885 jmp mmx_imm8
2886 rorx_reg_reg:
2887 call operand_32or64
2888 jmp mmx_nomem_imm8
2889
2890 tbm_instruction:
2891 mov [xop_opcode_map],9
2892 mov ah,al
2893 shr ah,4
2894 and al,111b
2895 mov [base_code],ah
2896 mov [postbyte_register],al
2897 jmp bmi_reg
2898
2899 llwpcb_instruction:
2900 or [vex_required],2
2901 mov [xop_opcode_map],9
2902 mov [base_code],12h
2903 mov [postbyte_register],al
2904 lods byte [esi]
2905 call get_size_operator
2906 cmp al,10h
2907 jne invalid_operand
2908 lods byte [esi]
2909 call convert_register
2910 mov bl,al
2911 call operand_32or64
2912 jmp nomem_instruction_ready
2913 lwpins_instruction:
2914 or [vex_required],2
2915 mov [xop_opcode_map],0Ah
2916 mov [base_code],12h
2917 mov [vex_register],al
2918 lods byte [esi]
2919 call get_size_operator
2920 cmp al,10h
2921 jne invalid_operand
2922 lods byte [esi]
2923 call convert_register
2924 mov [postbyte_register],al
2925 lods byte [esi]
2926 cmp al,','
2927 jne invalid_operand
2928 xor cl,cl
2929 xchg cl,[operand_size]
2930 lods byte [esi]
2931 call get_size_operator
2932 cmp al,10h
2933 je lwpins_reg_reg
2934 cmp al,'['
2935 jne invalid_argument
2936 push ecx
2937 call get_address
2938 pop eax
2939 xchg al,[operand_size]
2940 test al,al
2941 jz lwpins_reg_mem_size_ok
2942 cmp al,4
2943 jne invalid_operand_size
2944 lwpins_reg_mem_size_ok:
2945 call prepare_lwpins
2946 jmp store_instruction_with_imm32
2947 lwpins_reg_reg:
2948 lods byte [esi]
2949 call convert_register
2950 cmp ah,4
2951 jne invalid_operand_size
2952 mov [operand_size],cl
2953 mov bl,al
2954 call prepare_lwpins
2955 jmp store_nomem_instruction_with_imm32
2956 prepare_lwpins:
2957 lods byte [esi]
2958 cmp al,','
2959 jne invalid_operand
2960 lods byte [esi]
2961 call get_imm32
2962 call operand_32or64
2963 mov al,[vex_register]
2964 xchg al,[postbyte_register]
2965 mov [vex_register],al
2966 ret
2967
2968 xop_single_source_sd_instruction:
2969 or [operand_flags],2
2970 mov [mmx_size],8
2971 jmp xop_instruction_9
2972 xop_single_source_ss_instruction:
2973 or [operand_flags],2
2974 mov [mmx_size],4
2975 jmp xop_instruction_9
2976 xop_single_source_instruction:
2977 or [operand_flags],2
2978 mov [mmx_size],0
2979 xop_instruction_9:
2980 mov [base_code],al
2981 mov [xop_opcode_map],9
2982 jmp avx_xop_common
2983 xop_single_source_128bit_instruction:
2984 or [operand_flags],2
2985 mov [mmx_size],16
2986 jmp xop_instruction_9
2987 xop_triple_source_128bit_instruction:
2988 mov [immediate_size],-1
2989 mov byte [value],0
2990 mov [mmx_size],16
2991 jmp xop_instruction_8
2992 xop_128bit_instruction:
2993 mov [immediate_size],-2
2994 mov byte [value],0
2995 mov [mmx_size],16
2996 xop_instruction_8:
2997 mov [base_code],al
2998 mov [xop_opcode_map],8
2999 jmp avx_xop_common
3000 xop_pcom_b_instruction:
3001 mov ah,0CCh
3002 jmp xop_pcom_instruction
3003 xop_pcom_d_instruction:
3004 mov ah,0CEh
3005 jmp xop_pcom_instruction
3006 xop_pcom_q_instruction:
3007 mov ah,0CFh
3008 jmp xop_pcom_instruction
3009 xop_pcom_w_instruction:
3010 mov ah,0CDh
3011 jmp xop_pcom_instruction
3012 xop_pcom_ub_instruction:
3013 mov ah,0ECh
3014 jmp xop_pcom_instruction
3015 xop_pcom_ud_instruction:
3016 mov ah,0EEh
3017 jmp xop_pcom_instruction
3018 xop_pcom_uq_instruction:
3019 mov ah,0EFh
3020 jmp xop_pcom_instruction
3021 xop_pcom_uw_instruction:
3022 mov ah,0EDh
3023 xop_pcom_instruction:
3024 mov byte [value],al
3025 mov [immediate_size],-4
3026 mov [mmx_size],16
3027 mov [base_code],ah
3028 mov [xop_opcode_map],8
3029 jmp avx_xop_common
3030 vpcmov_instruction:
3031 or [vex_required],2
3032 mov [immediate_size],-2
3033 mov byte [value],0
3034 mov [mmx_size],0
3035 mov [base_code],al
3036 mov [xop_opcode_map],8
3037 jmp avx_xop_common
3038 xop_shift_instruction:
3039 mov [base_code],al
3040 or [vex_required],2
3041 mov [xop_opcode_map],9
3042 call take_avx_register
3043 cmp ah,16
3044 jne invalid_operand
3045 mov [postbyte_register],al
3046 lods byte [esi]
3047 cmp al,','
3048 jne invalid_operand
3049 lods byte [esi]
3050 call get_size_operator
3051 cmp al,'['
3052 je xop_shift_reg_mem
3053 cmp al,10h
3054 jne invalid_operand
3055 lods byte [esi]
3056 call convert_xmm_register
3057 mov [vex_register],al
3058 lods byte [esi]
3059 cmp al,','
3060 jne invalid_operand
3061 push esi
3062 xor cl,cl
3063 xchg cl,[operand_size]
3064 lods byte [esi]
3065 call get_size_operator
3066 pop esi
3067 xchg cl,[operand_size]
3068 cmp al,'['
3069 je xop_shift_reg_reg_mem
3070 cmp al,10h
3071 jne xop_shift_reg_reg_imm
3072 call take_avx_register
3073 mov bl,al
3074 xchg bl,[vex_register]
3075 jmp nomem_instruction_ready
3076 xop_shift_reg_reg_mem:
3077 or [rex_prefix],8
3078 lods byte [esi]
3079 call get_size_operator
3080 call get_address
3081 jmp instruction_ready
3082 xop_shift_reg_reg_imm:
3083 xor bl,bl
3084 xchg bl,[vex_register]
3085 cmp [base_code],94h
3086 jae invalid_operand
3087 add [base_code],30h
3088 mov [xop_opcode_map],8
3089 dec esi
3090 jmp mmx_nomem_imm8
3091 xop_shift_reg_mem:
3092 call get_address
3093 lods byte [esi]
3094 cmp al,','
3095 jne invalid_operand
3096 push esi
3097 xor cl,cl
3098 xchg cl,[operand_size]
3099 lods byte [esi]
3100 call get_size_operator
3101 pop esi
3102 xchg cl,[operand_size]
3103 cmp al,10h
3104 jne xop_shift_reg_mem_imm
3105 call take_avx_register
3106 mov [vex_register],al
3107 jmp instruction_ready
3108 xop_shift_reg_mem_imm:
3109 cmp [base_code],94h
3110 jae invalid_operand
3111 add [base_code],30h
3112 mov [xop_opcode_map],8
3113 dec esi
3114 jmp mmx_imm8
3115
3116 avx512_4vnniw_instruction:
3117 mov [opcode_prefix],0F2h
3118 mov [base_code],0Fh
3119 mov [extended_code],38h
3120 mov [supplemental_code],al
3121 mov [mmx_size],16
3122 mov [broadcast_size],0
3123 or [vex_required],8
3124 call take_avx_register
3125 mov [postbyte_register],al
3126 call take_avx512_mask
3127 lods byte [esi]
3128 cmp al,','
3129 jne invalid_operand
3130 call take_avx_register
3131 mov [vex_register],al
3132 cmp byte [esi],'+'
3133 jne reg4_ok
3134 inc esi
3135 cmp dword [esi],29030128h
3136 jne invalid_operand
3137 lods dword [esi]
3138 reg4_ok:
3139 cmp [operand_size],64
3140 jne invalid_operand_size
3141 mov [operand_size],0
3142 lods byte [esi]
3143 cmp al,','
3144 jne invalid_operand
3145 call take_avx_rm
3146 jc invalid_operand
3147 mov [operand_size],64
3148 jmp instruction_ready
3149
3150 set_evex_mode:
3151 mov [evex_mode],al
3152 jmp instruction_assembled
3153
3154 take_avx_register:
3155 lods byte [esi]
3156 call get_size_operator
3157 cmp al,10h
3158 jne invalid_operand
3159 lods byte [esi]
3160 convert_avx_register:
3161 mov ah,al
3162 and al,1Fh
3163 and ah,0E0h
3164 sub ah,60h
3165 jb invalid_operand
3166 jz avx512_register_size
3167 sub ah,60h
3168 jb invalid_operand
3169 jnz avx_register_size_ok
3170 mov ah,16
3171 jmp avx_register_size_ok
3172 avx512_register_size:
3173 mov ah,64
3174 avx_register_size_ok:
3175 cmp al,8
3176 jb match_register_size
3177 cmp [code_type],64
3178 jne invalid_operand
3179 jmp match_register_size
3180 store_vex_instruction_code:
3181 test [rex_prefix],10h
3182 jnz invalid_operand
3183 test [vex_required],0F8h
3184 jnz store_evex_instruction_code
3185 test [vex_register],10000b
3186 jnz store_evex_instruction_code
3187 cmp [operand_size],64
3188 je store_evex_instruction_code
3189 mov al,[base_code]
3190 cmp al,0Fh
3191 jne store_xop_instruction_code
3192 test [vex_required],2
3193 jnz prepare_vex
3194 cmp [evex_mode],0
3195 je prepare_vex
3196 cmp [displacement_compression],1
3197 jne prepare_vex
3198 cmp edx,80h
3199 jb prepare_vex
3200 cmp edx,-80h
3201 jae prepare_vex
3202 mov al,bl
3203 or al,bh
3204 shr al,4
3205 cmp al,2
3206 je prepare_vex
3207 call compress_displacement
3208 cmp [displacement_compression],2
3209 ja prepare_evex
3210 jb prepare_vex
3211 dec [displacement_compression]
3212 mov edx,[uncompressed_displacement]
3213 prepare_vex:
3214 mov ah,[extended_code]
3215 cmp ah,38h
3216 je store_vex_0f38_instruction_code
3217 cmp ah,3Ah
3218 je store_vex_0f3a_instruction_code
3219 test [rex_prefix],1011b
3220 jnz store_vex_0f_instruction_code
3221 mov [edi+2],ah
3222 mov byte [edi],0C5h
3223 mov al,[vex_register]
3224 not al
3225 shl al,3
3226 mov ah,[rex_prefix]
3227 shl ah,5
3228 and ah,80h
3229 xor al,ah
3230 call get_vex_lpp_bits
3231 mov [edi+1],al
3232 call check_vex
3233 add edi,3
3234 ret
3235 get_vex_lpp_bits:
3236 cmp [operand_size],32
3237 jne get_vex_pp_bits
3238 or al,100b
3239 get_vex_pp_bits:
3240 mov ah,[opcode_prefix]
3241 cmp ah,66h
3242 je vex_66
3243 cmp ah,0F3h
3244 je vex_f3
3245 cmp ah,0F2h
3246 je vex_f2
3247 test ah,ah
3248 jnz disallowed_combination_of_registers
3249 ret
3250 vex_f2:
3251 or al,11b
3252 ret
3253 vex_f3:
3254 or al,10b
3255 ret
3256 vex_66:
3257 or al,1
3258 ret
3259 store_vex_0f38_instruction_code:
3260 mov al,11100010b
3261 mov ah,[supplemental_code]
3262 jmp make_c4_vex
3263 store_vex_0f3a_instruction_code:
3264 mov al,11100011b
3265 mov ah,[supplemental_code]
3266 jmp make_c4_vex
3267 store_vex_0f_instruction_code:
3268 mov al,11100001b
3269 make_c4_vex:
3270 mov [edi+3],ah
3271 mov byte [edi],0C4h
3272 mov ah,[rex_prefix]
3273 shl ah,5
3274 xor al,ah
3275 mov [edi+1],al
3276 call check_vex
3277 mov al,[vex_register]
3278 xor al,1111b
3279 shl al,3
3280 mov ah,[rex_prefix]
3281 shl ah,4
3282 and ah,80h
3283 or al,ah
3284 call get_vex_lpp_bits
3285 mov [edi+2],al
3286 add edi,4
3287 ret
3288 check_vex:
3289 cmp [code_type],64
3290 je vex_ok
3291 not al
3292 test al,11000000b
3293 jnz invalid_operand
3294 test [rex_prefix],40h
3295 jnz invalid_operand
3296 vex_ok:
3297 ret
3298 store_xop_instruction_code:
3299 mov [edi+3],al
3300 mov byte [edi],8Fh
3301 mov al,[xop_opcode_map]
3302 mov ah,[rex_prefix]
3303 test ah,40h
3304 jz xop_ok
3305 cmp [code_type],64
3306 jne invalid_operand
3307 xop_ok:
3308 not ah
3309 shl ah,5
3310 xor al,ah
3311 mov [edi+1],al
3312 mov al,[vex_register]
3313 xor al,1111b
3314 shl al,3
3315 mov ah,[rex_prefix]
3316 shl ah,4
3317 and ah,80h
3318 or al,ah
3319 call get_vex_lpp_bits
3320 mov [edi+2],al
3321 add edi,4
3322 ret
3323 store_evex_instruction_code:
3324 test [vex_required],2
3325 jnz invalid_operand
3326 cmp [base_code],0Fh
3327 jne invalid_operand
3328 cmp [displacement_compression],1
3329 jne prepare_evex
3330 call compress_displacement
3331 prepare_evex:
3332 mov ah,[extended_code]
3333 cmp ah,38h
3334 je store_evex_0f38_instruction_code
3335 cmp ah,3Ah
3336 je store_evex_0f3a_instruction_code
3337 mov al,11110001b
3338 make_evex:
3339 mov [edi+4],ah
3340 mov byte [edi],62h
3341 mov ah,[rex_prefix]
3342 shl ah,5
3343 xor al,ah
3344 mov ah,[vex_required]
3345 and ah,10h
3346 xor al,ah
3347 mov [edi+1],al
3348 call check_vex
3349 mov al,[vex_register]
3350 not al
3351 and al,1111b
3352 shl al,3
3353 mov ah,[rex_prefix]
3354 shl ah,4
3355 or ah,[rex_prefix]
3356 and ah,80h
3357 or al,ah
3358 or al,100b
3359 call get_vex_pp_bits
3360 mov [edi+2],al
3361 mov al,[vex_register]
3362 not al
3363 shr al,1
3364 and al,1000b
3365 test [vex_required],80h
3366 jne evex_rounding
3367 mov ah,[operand_size]
3368 cmp ah,16
3369 jbe evex_l_ok
3370 or al,ah
3371 jmp evex_l_ok
3372 evex_rounding:
3373 mov ah,[rounding_mode]
3374 shl ah,5
3375 or al,ah
3376 evex_l_ok:
3377 test [vex_required],20h
3378 jz evex_zaaa_ok
3379 or al,[mask_register]
3380 evex_zaaa_ok:
3381 test [vex_required],40h
3382 jz evex_b_ok
3383 or al,10h
3384 evex_b_ok:
3385 mov [edi+3],al
3386 add edi,5
3387 ret
3388 store_evex_0f38_instruction_code:
3389 mov al,11110010b
3390 mov ah,[supplemental_code]
3391 jmp make_evex
3392 store_evex_0f3a_instruction_code:
3393 mov al,11110011b
3394 mov ah,[supplemental_code]
3395 jmp make_evex
3396 compress_displacement:
3397 mov ebp,ecx
3398 mov [uncompressed_displacement],edx
3399 or edx,edx
3400 jz displacement_compressed
3401 xor ecx,ecx
3402 mov cl,[mmx_size]
3403 test cl,cl
3404 jnz calculate_displacement_scale
3405 mov cl,[operand_size]
3406 calculate_displacement_scale:
3407 bsf ecx,ecx
3408 jz displacement_compression_ok
3409 xor eax,eax
3410 shrd eax,edx,cl
3411 jnz displacement_not_compressed
3412 sar edx,cl
3413 cmp edx,80h
3414 jb displacement_compressed
3415 cmp edx,-80h
3416 jnb displacement_compressed
3417 shl edx,cl
3418 displacement_not_compressed:
3419 inc [displacement_compression]
3420 jmp displacement_compression_ok
3421 displacement_compressed:
3422 add [displacement_compression],2
3423 displacement_compression_ok:
3424 mov ecx,ebp
3425 ret