├── .gitignore ├── LICENSE ├── Makefile ├── README.md └── src ├── 0-preamble.fs ├── 1-assembler.fs ├── 2-forth.fs ├── 3-main.fs ├── constants.c └── yotta.s /.gitignore: -------------------------------------------------------------------------------- 1 | /bin 2 | *.swo 3 | *.swp 4 | .exrc 5 | 6 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | Copyright (C) 2024 by Azul Mota 2 | 3 | Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted. 4 | 5 | THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE 6 | -------------------------------------------------------------------------------- /Makefile: -------------------------------------------------------------------------------- 1 | ENGINE := src/yotta.s 2 | CHAPTERS := src/0-preamble.fs \ 3 | src/1-assembler.fs \ 4 | src/2-forth.fs \ 5 | src/3-main.fs 6 | 7 | .PHONY: run-linux run-macos time-linux time-macos 8 | run-linux: bin/yotta-linux-x64 9 | bin/yotta-linux-x64 10 | time-linux: bin/yotta-linux-x64 11 | time bin/yotta-linux-x64 12 | run-macos: bin/yotta-macos-x64 13 | bin/yotta-macos-x64 14 | time-macos: bin/yotta-macos-x64 15 | time bin/yotta-macos-x64 16 | 17 | bin/constants: src/constants.c 18 | gcc -o bin/constants src/constants.c 19 | 20 | bin/yotta-macos-x64: bin/yotta-macos-x64.o 21 | bin/yotta-macos-x64.o: $(ENGINE) $(CHAPTERS) | bin 22 | nasm -DOS_MACOS -f macho64 -o bin/yotta-macos-x64.o $(ENGINE) 23 | 24 | bin/yotta-linux-x64: bin/yotta-linux-x64.o 25 | bin/yotta-linux-x64.o: $(ENGINE) $(CHAPTERS) | bin 26 | nasm -DOS_LINUX -f elf64 -o bin/yotta-linux-x64.o $(ENGINE) 27 | 28 | bin: 29 | mkdir bin 30 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Yotta 2 | 3 | Welcome to Yotta! Yotta is a minimalistic forth-like language. Its most distinctive feature is that it comes with very few primitives: 4 | 5 | - `$XX` emits the machine code `XX` given in hexadecimal. 6 | - `^XX` emits machine code that emits machine code `XX`. 7 | - `: A` defines a new word `A` 8 | 9 | The rest is built-up from there. Yotta is split into several parts, in the `src` directory: 10 | 11 | - [`src/0-preamble.fs`](https://github.com/typeswitch-dev/yotta/blob/main/src/0-preamble.fs) is the zeroth chapter. It defines some bare necessities, like `;` and comments. 12 | - [`src/1-assembler.fs`](https://github.com/typeswitch-dev/yotta/blob/main/src/1-assembler.fs) defines an x86-64 assembler inside of yotta. 13 | - [`src/2-forth.fs`](https://github.com/typeswitch-dev/yotta/blob/main/src/2-forth.fs) defines a set of forth-like words, built on top of the assembler. 14 | - [`src/3-main.fs`](https://github.com/typeswitch-dev/yotta/blob/main/src/3-main.fs) is the program. 15 | - [`src/yotta.s`](https://github.com/typeswitch-dev/yotta/blob/main/src/yotta.s) contains the engine, written in NASM x86-64 assembly. 16 | 17 | If this piques your interest, I recommend reading the [preamble](https://github.com/typeswitch-dev/yotta/blob/main/src/0-preamble.fs) and the [forth chapter](https://github.com/typeswitch-dev/yotta/blob/main/src/2-forth.fs), and the rest as interests you. 18 | 19 | This code supports x86-64 linux and macos: 20 | 21 | - To build and run on linux, use `make run-linux`. 22 | - To build and run on intel macs, use `make run-macos`. 23 | -------------------------------------------------------------------------------- /src/0-preamble.fs: -------------------------------------------------------------------------------- 1 | : ; ^C3 ; 2 | : SKIP-UNTIL ^AC ^3A ^C2 ^75 ^FB ; 3 | : \ $B2 $0A SKIP-UNTIL ; 4 | : ( $B2 $29 SKIP-UNTIL ; 5 | 6 | \ Welcome to yotta! Yotta is a minimalistic forth-like language 7 | \ that has three primitives: 8 | \ 9 | \ $XX Compile the byte XX (in hex). 10 | \ ^XX Compile code that compiles the byte XX (in hex). 11 | \ : A Define the word A 12 | \ 13 | \ Once a word is defined, it can be invoked by name. All definitions are 14 | \ executed immediately (i.e. all words are "immediate"). As a result, 15 | \ most words will compile something when executed. Words will either emit 16 | \ machine code directly (using ^XX), or they will use "CALL>" to emit a 17 | \ call instruction, or "INLINE>" to inline the rest of the word. 18 | \ 19 | \ To program in yotta, we could do everything in machine code, but it would 20 | \ be very hard to read. Our first order of business will be to build up an 21 | \ assembler for x86-64 machine code. This will introduce a number of words 22 | \ that mimic assembler syntax. For example, 23 | \ MOVQ< RAX, RCX 24 | \ will emit the appropriate (MOV RAX, RCX) instruction, and it looks like 25 | \ the expression, but there's actually three words being executed here, 26 | \ "MOVQ<", "RAX," and "RCX". Other than the caret ^XX and dollar $XX 27 | \ notations, yotta does not have syntax, so the punctuation is part of the 28 | \ word. 29 | \ 30 | \ We're going to introduce a number of words that are only useful for 31 | \ assembling x86-64 instructions, so we'll place them in a separate 32 | \ ASSEMBLER wordlist. So actually our zero-th order of business is to 33 | \ define a few words that control which wordlist we're creating new 34 | \ words in. Unfortunately we have to write these directly in machine code. 35 | 36 | \ User field offsets. Keep this in sync with "struc USER" in the ASM source. 37 | \ These are memory offsets from RBP, for various fields that the engine 38 | \ manages. RBP points to the "user area" and also to a big chunk of R/W 39 | \ memory initially. 40 | : $USER.HERE ^00000000 ; \ HERE pointer. 41 | : $USER.PROG ^00000008 ; \ PROG pointer -- pointer into base of program memory. 42 | : $USER.KERS ^00000010 ; \ Kernel source pointer. 43 | : $USER.EVAL ^00000018 ; \ Literal evaluator pointer. 44 | : $USER.NAME ^00000020 ; \ Name buffer. 45 | : $USER.KERW ^00000040 ; \ Kernel wordlist. 46 | : $USER.MINW ^00000048 ; \ Minimal wordlist. (What you get when you use ONLY.) 47 | : $USER.ASMW ^00000050 ; \ Assembler wordlist. 48 | : $USER.FORW ^00000058 ; \ Forth wordlist. 49 | : $USER.PRGW ^00000060 ; \ Program wordlist. 50 | : $USER.DICT ^00000068 ; \ Dictionary pointer. 51 | : $USER.WORD ^00000070 ; \ "WORD" primitive 52 | : $USER.FIND ^00000078 ; \ "FIND" primitive 53 | : $USER.OSID ^00000080 ; \ operating system id ( 1 = linux, 2 = macos ) 54 | : $USER.SORD ^00000090 ; 55 | 56 | \ Dict field offsets. Keep in sync with "struc DICT" in the ASM source. 57 | \ The dictionary is a linked list of definitions. 58 | : $DICT.LINK ^00 ; \ Link to previous dictionary entry. 59 | : $DICT.NAME ^08 ; \ Length byte + 31 bytes of name data, padded with spaces. 60 | : $DICT.CODE ^28 ; \ Pointer to code that will get executed when word is read. 61 | : $DICT.DATA ^30 ; \ Extra data associated with the word. 62 | 63 | : CALL> ( -- ) 64 | \ Exit the current word, and compile a call to the rest 65 | \ of the word. The typical usage is at the start of a word 66 | \ definition, to turn the whole definition into a word that 67 | \ simply compiles a call to itself. For example, 68 | \ 69 | \ : SQUARE CALL> DUP * ; 70 | \ 71 | \ will make it so that when SQUARE is interpreted, it will 72 | \ compile a call into its body (the DUP * part). Thus CALL> 73 | \ is like the default compilation action of most forths. 74 | \ Using CALL> in the assembler saves us about 3KB so it's 75 | \ worth it to define this directly in machine code before 76 | \ we have the assembler up and running. 77 | 78 | ^E8 \ emit E8 byte ( E8 xx xx xx xx = CALL NEAR ) 79 | $48 $8D $05 $00000001 \ LEA RAX, [RIP+1] 80 | $48 $2B $C7 \ SUB RAX, RDI 81 | $AB \ STOSL 82 | $C3 \ RET 83 | 84 | ^E8 \ emit E8 byte 85 | $58 \ POP RAX 86 | $48 $8D $40 $FC \ LEA RAX, [RAX-4] 87 | $48 $2B $C7 \ SUB RAX, RDI 88 | $AB \ STOSL 89 | ; 90 | 91 | : SET-CURRENT CALL> 92 | \ Change current dictionary based on offset to RBP. 93 | $48 $03 $C5 \ ADD RAX, RBP 94 | $48 $89 $85 $USER.DICT \ MOV [RBP+USER.DICT], RAX 95 | ; 96 | 97 | : [KERNEL-DEFINITIONS] ( -- ) 98 | \ Change current dictionary to KERNEL. 99 | $B8 $USER.KERW SET-CURRENT ; 100 | 101 | : [FORTH-DEFINITIONS] ( -- ) 102 | \ Change current dictionary to FORTH. 103 | $B8 $USER.FORW SET-CURRENT ; 104 | 105 | : [PROGRAM-DEFINITIONS] ( -- ) 106 | \ Change current dictionary to PROGRAM. 107 | $B8 $USER.PRGW SET-CURRENT ; 108 | 109 | : [ASSEMBLER-DEFINITIONS] ( -- ) 110 | \ Change current dictionary to ASSEMBLER. 111 | $B8 $USER.ASMW SET-CURRENT ; 112 | 113 | : [MINIMAL-DEFINITIONS] ( -- ) 114 | \ Change current dictionary to MINIMAL. 115 | $B8 $USER.MINW SET-CURRENT ; 116 | 117 | [KERNEL-DEFINITIONS] 118 | 119 | 120 | : ^USER.OSID CALL> 121 | $B8 $USER.OSID $AB ; 122 | 123 | : SYSCALL-ID; 124 | ^48 ^8B ^85 ^USER.OSID \ MOV RAX,[RBP+USER.OSID] 125 | ^48 ^8D ^0D ^00000001 \ LEA RCX,[RIP+1] 126 | ^8B ^04 ^81 \ MOV EAX,[4*RAX+RCX] 127 | ^AB \ STOSD 128 | ^C3 ; \ RET 129 | 130 | \ linux macos 131 | : $SYS_EXIT SYSCALL-ID; $0000003C $02000001 132 | : $SYS_READ SYSCALL-ID; $00000000 $02000003 133 | : $SYS_WRITE SYSCALL-ID; $00000001 $02000004 134 | -------------------------------------------------------------------------------- /src/1-assembler.fs: -------------------------------------------------------------------------------- 1 | [KERNEL-DEFINITIONS] 2 | 3 | : ASM-PANIC CALL> 4 | \ Print "ASM PANIC!\n" to stderr and exit with code 4. 5 | \ This is used when there is a problem with the way 6 | \ the assembler was used. Note that an absence of 7 | \ panic does not guarantee a valid instruction -- this 8 | \ assembler has almost no validation. 9 | $B8 $43 $21 $0A $00 \ MOVL#: RAX 'C!\n\0' 10 | $50 \ PUSHQ# RAX 11 | 12 | $48 $B8 $41 $53 $4D $20 13 | $50 $41 $4E $49 \ MOVQ#: RAX 'ASM PANI' 14 | $50 \ PUSHQ# RAX 15 | 16 | $B8 $SYS_WRITE \ MOVL#: RAX SYS_WRITE 17 | $BF $00000002 \ MOVL#: RDI 0x00000002 ( stderr ) 18 | $48 $8B $F4 \ MOVQ< RSI, RSP 19 | $BA $0000000B \ MOVL#: RDX 0x00000004 ( length ) 20 | $0F $05 \ SYSCALL 21 | $58 \ POPQ# RAX 22 | 23 | $B8 $SYS_EXIT \ MOVL#: RAX SYS_EXIT 24 | $BF $00000004 \ MOVL#: RDI 0x00000004 25 | $0F $05 \ SYSCALL 26 | ; 27 | 28 | : NO-REX/VEX ( -- R8:0 ) CALL> 29 | $4D $33 $C0 ; \ XOR R8, R8 30 | : REX/VEX ( -- R8:RDI ) CALL> 31 | $49 $89 $F8 ; \ MOV R8, RDI 32 | : OPCODE ( -- R9:RDI ) CALL> 33 | $49 $89 $F9 ; \ MOV R9, RDI 34 | 35 | : SHIFT-OP ( R9 RDI -- R9+1 RDI+1 ) CALL> 36 | \ Shift the entire OP up by one byte to make room for prefix. 37 | $50 \ PUSH RAX 38 | $49 $8B $41 $08 \ MOVQ< RAX, [R9]. $08 39 | $49 $89 $41 $09 \ MOVQ> RAX, [R9]. $09 40 | $49 $8B $41 $00 \ MOVQ< RAX, [R9]. $00 41 | $49 $89 $41 $01 \ MOVQ> RAX, [R9]. $01 42 | $4D $8D $49 $01 \ LEAQ< R9, [R9]. $01 43 | $48 $8D $7F $01 \ LEAQ< RDI, [RDI]. $01 44 | $58 \ POP RAX 45 | ; 46 | 47 | : IS-REX ( R8 -- R8 ZF:is-rex ) CALL> 48 | \ Check that R8 points to a REX prefix byte. 49 | \ Result is returned in ZF: 50 | \ ZF=1 means it is a REX prefix. 51 | \ ZF=0 means it's not a REX prefix. 52 | $50 \ PUSHQ# RAX 53 | $41 $8A $00 \ MOVB< AL, [R8] 54 | $24 $F0 \ AND-AL. $F0 55 | $3C $40 \ CMP-AL. $40 56 | $58 \ POPQ# RAX 57 | ; 58 | 59 | : IS-VEX2 ( R8 -- R8 ZF:is-vex2 ) CALL> 60 | \ Check that R8 points to the start of a 2-byte VEX prefix. 61 | \ Result is returned in ZF: 62 | \ ZF=1 means it is 2-byte VEX prefix. 63 | \ ZF=0 means it's not a 2-byte VEX prefix. 64 | $41 $80 $38 $C5 \ CMPB_. [R8] $C5 65 | ; 66 | 67 | : IS-VEX3 ( R8 -- R8 ZF:is-vex3 ) CALL> 68 | \ Check that R8 points to the start of a 3-byte VEX prefix. 69 | \ Result is returned in ZF: 70 | \ ZF=1 means it is 3-byte VEX prefix. 71 | \ ZF=0 means it's not a 3-byte VEX prefix. 72 | $41 $80 $38 $C4 \ CMPB_. [R8] $C4 73 | ; 74 | 75 | : IS-EVEX ( R8 -- R8 ZF:is-evex ) CALL> 76 | \ Check that R8 points to the start of a EVEX prefix. 77 | \ Result is returned in ZF: 78 | \ ZF=1 means it is EVEX prefix. 79 | \ ZF=0 means it's not a EVEX prefix. 80 | $41 $80 $38 $62 \ CMPB_. [R8] $62 81 | ; 82 | 83 | : PREPARE-REX ( R8:x|0 R9:op -- R8:x|REX R9:op ZF:is-rex ) CALL> 84 | \ Make sure REX prefix exists, insert it if necessary. 85 | \ Note that R9 points to the current opcode (after 86 | \ legacy prefixes and REX prefix if it exists) and 87 | \ R8 points to the REX prefix. R8 is NULL if the 88 | \ current instruction doesn't have a REX prefix yet. 89 | \ So what PREPARE-REX tries to do is create a blank 90 | \ REX prefix if it's missing. 91 | \ If a VEX or EVEX prefix exists instead, this word 92 | \ leaves them alone, does not insert a REX prefix. 93 | $4D $85 $C0 \ TEST R8, R8 94 | $75 $0C \ JNZ +12 95 | $4D $8B $C1 \ MOVQ< R8, R9 96 | SHIFT-OP 97 | $41 $C6 $00 $40 \ MOVB_. [R8] 0x40 98 | IS-REX 99 | ; 100 | 101 | : PREPARE-VEX3 ( R8:x|VEX2 R9:op -- R8:x|VEX3 R9:op ZF:is-vex3 ) CALL> 102 | \ Convert a 2-byte VEX prefix, if present, into 103 | \ a 3-byte VEX prefix. The 3-byte version is needed 104 | \ to encode WXB bits and a different map_select. 105 | IS-VEX2 106 | $74 $06 \ JZ +06 107 | IS-VEX3 108 | $C3 \ RET 109 | SHIFT-OP \ converting VEX2 to VEX3 110 | $50 \ PUSH RAX 111 | $41 $C6 $00 $C4 \ MOVB_. [R8] 0xC4 112 | $41 $8A $40 $01 \ MOVB< RAX, [R8]. 0x01 113 | $24 $7F \ AND-AL. 0x7F 114 | $41 $88 $40 $02 \ MOVB> RAX, [R8]. 0x02 115 | $41 $8A $40 $01 \ MOVB< RAX, [R8]. 0x01 116 | $24 $80 \ AND-AL. 0x80 117 | $0C $61 \ OR-AL. 0x61 118 | $41 $88 $40 $01 \ MOVB> RAX, [R8]. 0x01 119 | $58 \ POP RAX 120 | IS-VEX3 121 | ; 122 | 123 | : PREPARE-EVEX ( R8:VEX2|VEX3|EVEX -- R8:EVEX ZF:is-evex ) CALL> 124 | \ Convert a VEX prefix into an EVEX prefix. 125 | PREPARE-VEX3 126 | $74 $06 \ JZ +06 127 | IS-EVEX 128 | $C3 \ RET 129 | SHIFT-OP \ converting VEX3 to EVEX: 130 | $50 \ PUSH RAX 131 | $41 $C6 $00 $62 \ MOVB_. [R8] 0x62 132 | $41 $80 $48 $01 $10 \ ORB_. [R8]. 0x01 0x10 (set R' bit) 133 | $41 $8A $40 $02 \ MOVB< RAX, [R8]. 0x02 134 | $24 $04 \ AND-AL. 0x04 (get old L bit) 135 | $C0 $E0 $03 \ SHLB_. RAX 0x03 (move L to new position) 136 | $0C $04 \ OR-AL. 0x04 (set V' bit) 137 | $41 $88 $40 $03 \ MOVB> RAX, [R8]. 0x03 (store 4th byte of EVEX) 138 | $41 $80 $48 $02 $04 \ ORB_. [R8]. 0x02 0x04 (set mandatory 1 bit) 139 | $58 \ POP RAX 140 | IS-EVEX 141 | ; 142 | 143 | : +W CALL> 144 | PREPARE-REX 145 | $75 $05 \ JNZ +05 146 | $41 $80 $08 $08 \ ORB_. [R8] 0x08 147 | $C3 \ RET 148 | PREPARE-VEX3 149 | $74 $07 \ JZ +07 \ VEX3 and EVEX have W bit in same place 150 | IS-EVEX 151 | $75 $06 \ JNZ +06 152 | $41 $80 $48 $02 $08 \ ORB_. [R8]. 0x02 0x08 153 | $C3 \ RET 154 | ASM-PANIC ; 155 | 156 | : R=1 CALL> 157 | PREPARE-REX 158 | $75 $05 \ JNZ +5 159 | $41 $80 $08 $04 \ ORB_. [R8] 0x04 160 | $C3 \ RET 161 | IS-VEX2 162 | $74 $12 \ JZ +14 163 | IS-VEX3 164 | $74 $07 \ JZ +7 165 | IS-EVEX 166 | $75 $06 \ JNZ +6 167 | $41 $80 $60 $01 $7F \ ANDB_. [R8]. 0x01 0x7F 168 | $C3 \ RET 169 | ASM-PANIC ; 170 | : R=2 CALL> 171 | PREPARE-EVEX 172 | $75 $06 \ JNZ +6 173 | $41 $80 $60 $01 $EF \ ANDB_. [R8]. 0x01 0xEF 174 | $C3 \ RET 175 | ASM-PANIC ; 176 | : R=3 CALL> 177 | PREPARE-EVEX 178 | $75 $06 \ JNZ +6 179 | $41 $80 $60 $01 $6F \ ANDB_. [R8]. 0x01 0x6F 180 | $C3 \ RET 181 | ASM-PANIC ; 182 | 183 | : +V' CALL> 184 | PREPARE-EVEX 185 | $75 $06 \ JNZ +06 186 | $41 $80 $60 $03 $F7 \ ANDB_. [R8]. 0x01 0xF7 (clear V' bit) 187 | $C3 \ RET 188 | ASM-PANIC ; 189 | 190 | : +X CALL> 191 | PREPARE-REX 192 | $75 $05 \ JNZ +05 193 | $41 $80 $08 $02 \ ORB_. [R8] 0x02 194 | $C3 \ RET 195 | PREPARE-VEX3 196 | $74 $07 \ JZ +7 197 | IS-EVEX 198 | $75 $06 \ JNZ +06 199 | $41 $80 $60 $01 $BF \ ANDB_. [R8]. 0x01 0xBF 200 | $C3 \ RET 201 | ASM-PANIC ; 202 | \ High 16 of X register is stored in EVEX.V' (when using VSIB) 203 | : X2 CALL> +V' ; 204 | : X3 CALL> +V' +X ; 205 | 206 | : +B CALL> 207 | PREPARE-REX 208 | $75 $05 \ JNZ +05 209 | $41 $80 $08 $01 \ ORB_. [R8] 0x01 210 | $C3 \ RET 211 | PREPARE-VEX3 212 | $74 $07 \ JZ +7 213 | IS-EVEX 214 | $75 $06 \ JNZ +06 215 | $41 $80 $60 $01 $DF \ ANDB_. [R8]. 0x01 0xDF 216 | $C3 \ RET 217 | ASM-PANIC ; 218 | 219 | \ High 16 of B register is stored in EVEX.X 220 | : B=2 CALL> 221 | PREPARE-EVEX 222 | $75 $06 \ JNZ +06 223 | $41 $80 $60 $01 $BF \ ANDB_. [R8]. 0x01 0xBF 224 | $C3 \ RET 225 | ASM-PANIC ; 226 | : B=3 CALL> 227 | PREPARE-EVEX 228 | $75 $06 \ JNZ +06 229 | $41 $80 $60 $01 $9F \ ANDB_. [R8]. 0x01 0x9F 230 | $C3 \ RET 231 | ASM-PANIC ; 232 | 233 | : >VVVVV ( AL:0..31 R8:EVEX|VEX2|VEX3 -- R8:EVEX|VEX2|VEX3 ) CALL> 234 | \ Update VEX/EVEX prefix with vvvv given in AL. 235 | $3C $10 \ CMP-AL. 0x10 236 | $72 $05 \ JB +5 237 | +V' \ Set V' 238 | $24 $0F \ AND-AL. 0x0F 239 | $34 $0F \ XOR-AL. 0x0F 240 | $C0 $E0 $03 \ SHLB_. RAX 0x03 241 | IS-VEX2 242 | $75 $0A \ JNZ +10 243 | $41 $80 $60 $01 $87 \ ANDB_. [R8]. 0x01 0x87 244 | $41 $08 $40 $01 \ ORB> RAX, [R8]. 0x01 245 | $C3 \ RET 246 | IS-VEX3 247 | $74 $07 \ JZ +7 248 | IS-EVEX 249 | $75 $0A \ JNZ +10 250 | $41 $80 $60 $02 $87 \ ANDB_. [R8]. 0x02 0x87 251 | $41 $08 $40 $02 \ ORB> RAX, [R8]. 0x02 252 | $C3 \ RET 253 | ASM-PANIC ; 254 | 255 | : V=0 CALL> $50 $B0 $00 >VVVVV $58 ; : V=16 CALL> $50 $B0 $10 >VVVVV $58 ; 256 | : V=1 CALL> $50 $B0 $01 >VVVVV $58 ; : V=17 CALL> $50 $B0 $11 >VVVVV $58 ; 257 | : V=2 CALL> $50 $B0 $02 >VVVVV $58 ; : V=18 CALL> $50 $B0 $12 >VVVVV $58 ; 258 | : V=3 CALL> $50 $B0 $03 >VVVVV $58 ; : V=19 CALL> $50 $B0 $13 >VVVVV $58 ; 259 | : V=4 CALL> $50 $B0 $04 >VVVVV $58 ; : V=20 CALL> $50 $B0 $14 >VVVVV $58 ; 260 | : V=5 CALL> $50 $B0 $05 >VVVVV $58 ; : V=21 CALL> $50 $B0 $15 >VVVVV $58 ; 261 | : V=6 CALL> $50 $B0 $06 >VVVVV $58 ; : V=22 CALL> $50 $B0 $16 >VVVVV $58 ; 262 | : V=7 CALL> $50 $B0 $07 >VVVVV $58 ; : V=23 CALL> $50 $B0 $17 >VVVVV $58 ; 263 | : V=8 CALL> $50 $B0 $08 >VVVVV $58 ; : V=24 CALL> $50 $B0 $18 >VVVVV $58 ; 264 | : V=9 CALL> $50 $B0 $09 >VVVVV $58 ; : V=25 CALL> $50 $B0 $19 >VVVVV $58 ; 265 | : V=10 CALL> $50 $B0 $0A >VVVVV $58 ; : V=26 CALL> $50 $B0 $1A >VVVVV $58 ; 266 | : V=11 CALL> $50 $B0 $0B >VVVVV $58 ; : V=27 CALL> $50 $B0 $1B >VVVVV $58 ; 267 | : V=12 CALL> $50 $B0 $0C >VVVVV $58 ; : V=28 CALL> $50 $B0 $1C >VVVVV $58 ; 268 | : V=13 CALL> $50 $B0 $0D >VVVVV $58 ; : V=29 CALL> $50 $B0 $1D >VVVVV $58 ; 269 | : V=14 CALL> $50 $B0 $0E >VVVVV $58 ; : V=30 CALL> $50 $B0 $1E >VVVVV $58 ; 270 | : V=15 CALL> $50 $B0 $0F >VVVVV $58 ; : V=31 CALL> $50 $B0 $1F >VVVVV $58 ; 271 | 272 | : OPB CALL> NO-REX/VEX OPCODE ; 273 | : OPW CALL> ^66 NO-REX/VEX OPCODE ; 274 | : OPL CALL> NO-REX/VEX OPCODE ; 275 | : OPQ CALL> REX/VEX ^48 OPCODE ; 276 | 277 | : VEX.SX.NP.0F CALL> REX/VEX ^C5 ^F8 OPCODE ; 278 | : VEX.SX.66.0F CALL> REX/VEX ^C5 ^F9 OPCODE ; 279 | : VEX.SX.F3.0F CALL> REX/VEX ^C5 ^FA OPCODE ; 280 | : VEX.SX.F2.0F CALL> REX/VEX ^C5 ^FB OPCODE ; 281 | : VEX.SX.NP.0F38 CALL> REX/VEX ^C4 ^E2 ^78 OPCODE ; 282 | : VEX.SX.66.0F38 CALL> REX/VEX ^C4 ^E2 ^79 OPCODE ; 283 | : VEX.SX.F3.0F38 CALL> REX/VEX ^C4 ^E2 ^7A OPCODE ; 284 | : VEX.SX.F2.0F38 CALL> REX/VEX ^C4 ^E2 ^7B OPCODE ; 285 | : VEX.SX.NP.0F3A CALL> REX/VEX ^C4 ^E3 ^78 OPCODE ; 286 | : VEX.SX.66.0F3A CALL> REX/VEX ^C4 ^E3 ^79 OPCODE ; 287 | : VEX.SX.F3.0F3A CALL> REX/VEX ^C4 ^E3 ^7A OPCODE ; 288 | : VEX.SX.F2.0F3A CALL> REX/VEX ^C4 ^E3 ^7B OPCODE ; 289 | : VEX.DX.NP.0F CALL> REX/VEX ^C4 ^E1 ^F8 OPCODE ; 290 | : VEX.DX.66.0F CALL> REX/VEX ^C4 ^E1 ^F9 OPCODE ; 291 | : VEX.DX.F3.0F CALL> REX/VEX ^C4 ^E1 ^FA OPCODE ; 292 | : VEX.DX.F2.0F CALL> REX/VEX ^C4 ^E1 ^FB OPCODE ; 293 | : VEX.DX.NP.0F38 CALL> REX/VEX ^C4 ^E2 ^F8 OPCODE ; 294 | : VEX.DX.66.0F38 CALL> REX/VEX ^C4 ^E2 ^F9 OPCODE ; 295 | : VEX.DX.F3.0F38 CALL> REX/VEX ^C4 ^E2 ^FA OPCODE ; 296 | : VEX.DX.F2.0F38 CALL> REX/VEX ^C4 ^E2 ^FB OPCODE ; 297 | : VEX.DX.NP.0F3A CALL> REX/VEX ^C4 ^E3 ^F8 OPCODE ; 298 | : VEX.DX.66.0F3A CALL> REX/VEX ^C4 ^E3 ^F9 OPCODE ; 299 | : VEX.DX.F3.0F3A CALL> REX/VEX ^C4 ^E3 ^FA OPCODE ; 300 | : VEX.DX.F2.0F3A CALL> REX/VEX ^C4 ^E3 ^FB OPCODE ; 301 | 302 | : VEX.SY.NP.0F CALL> REX/VEX ^C5 ^FC OPCODE ; 303 | : VEX.SY.66.0F CALL> REX/VEX ^C5 ^FD OPCODE ; 304 | : VEX.SY.F3.0F CALL> REX/VEX ^C5 ^FE OPCODE ; 305 | : VEX.SY.F2.0F CALL> REX/VEX ^C5 ^FF OPCODE ; 306 | : VEX.SY.NP.0F38 CALL> REX/VEX ^C4 ^E2 ^7C OPCODE ; 307 | : VEX.SY.66.0F38 CALL> REX/VEX ^C4 ^E2 ^7D OPCODE ; 308 | : VEX.SY.F3.0F38 CALL> REX/VEX ^C4 ^E2 ^7E OPCODE ; 309 | : VEX.SY.F2.0F38 CALL> REX/VEX ^C4 ^E2 ^7F OPCODE ; 310 | : VEX.SY.NP.0F3A CALL> REX/VEX ^C4 ^E3 ^7C OPCODE ; 311 | : VEX.SY.66.0F3A CALL> REX/VEX ^C4 ^E3 ^7D OPCODE ; 312 | : VEX.SY.F3.0F3A CALL> REX/VEX ^C4 ^E3 ^7E OPCODE ; 313 | : VEX.SY.F2.0F3A CALL> REX/VEX ^C4 ^E3 ^7F OPCODE ; 314 | : VEX.DY.NP.0F CALL> REX/VEX ^C4 ^E1 ^FC OPCODE ; 315 | : VEX.DY.66.0F CALL> REX/VEX ^C4 ^E1 ^FD OPCODE ; 316 | : VEX.DY.F3.0F CALL> REX/VEX ^C4 ^E1 ^FE OPCODE ; 317 | : VEX.DY.F2.0F CALL> REX/VEX ^C4 ^E1 ^FF OPCODE ; 318 | : VEX.DY.NP.0F38 CALL> REX/VEX ^C4 ^E2 ^FC OPCODE ; 319 | : VEX.DY.66.0F38 CALL> REX/VEX ^C4 ^E2 ^FD OPCODE ; 320 | : VEX.DY.F3.0F38 CALL> REX/VEX ^C4 ^E2 ^FE OPCODE ; 321 | : VEX.DY.F2.0F38 CALL> REX/VEX ^C4 ^E2 ^FF OPCODE ; 322 | : VEX.DY.NP.0F3A CALL> REX/VEX ^C4 ^E3 ^FC OPCODE ; 323 | : VEX.DY.66.0F3A CALL> REX/VEX ^C4 ^E3 ^FD OPCODE ; 324 | : VEX.DY.F3.0F3A CALL> REX/VEX ^C4 ^E3 ^FE OPCODE ; 325 | : VEX.DY.F2.0F3A CALL> REX/VEX ^C4 ^E3 ^FF OPCODE ; 326 | 327 | : EVEX.SX.NP.0F CALL> REX/VEX ^62 ^F1 ^7C ^08 OPCODE ; 328 | : EVEX.SX.66.0F CALL> REX/VEX ^62 ^F1 ^7D ^08 OPCODE ; 329 | : EVEX.SX.F3.0F CALL> REX/VEX ^62 ^F1 ^7E ^08 OPCODE ; 330 | : EVEX.SX.F2.0F CALL> REX/VEX ^62 ^F1 ^7F ^08 OPCODE ; 331 | : EVEX.SX.NP.0F38 CALL> REX/VEX ^62 ^F2 ^7C ^08 OPCODE ; 332 | : EVEX.SX.66.0F38 CALL> REX/VEX ^62 ^F2 ^7D ^08 OPCODE ; 333 | : EVEX.SX.F3.0F38 CALL> REX/VEX ^62 ^F2 ^7E ^08 OPCODE ; 334 | : EVEX.SX.F2.0F38 CALL> REX/VEX ^62 ^F2 ^7F ^08 OPCODE ; 335 | : EVEX.SX.NP.0F3A CALL> REX/VEX ^62 ^F3 ^7C ^08 OPCODE ; 336 | : EVEX.SX.66.0F3A CALL> REX/VEX ^62 ^F3 ^7D ^08 OPCODE ; 337 | : EVEX.SX.F3.0F3A CALL> REX/VEX ^62 ^F3 ^7E ^08 OPCODE ; 338 | : EVEX.SX.F2.0F3A CALL> REX/VEX ^62 ^F3 ^7F ^08 OPCODE ; 339 | : EVEX.DX.NP.0F CALL> REX/VEX ^62 ^F1 ^FC ^08 OPCODE ; 340 | : EVEX.DX.66.0F CALL> REX/VEX ^62 ^F1 ^FD ^08 OPCODE ; 341 | : EVEX.DX.F3.0F CALL> REX/VEX ^62 ^F1 ^FE ^08 OPCODE ; 342 | : EVEX.DX.F2.0F CALL> REX/VEX ^62 ^F1 ^FF ^08 OPCODE ; 343 | : EVEX.DX.NP.0F38 CALL> REX/VEX ^62 ^F2 ^FC ^08 OPCODE ; 344 | : EVEX.DX.66.0F38 CALL> REX/VEX ^62 ^F2 ^FD ^08 OPCODE ; 345 | : EVEX.DX.F3.0F38 CALL> REX/VEX ^62 ^F2 ^FE ^08 OPCODE ; 346 | : EVEX.DX.F2.0F38 CALL> REX/VEX ^62 ^F2 ^FF ^08 OPCODE ; 347 | : EVEX.DX.NP.0F3A CALL> REX/VEX ^62 ^F3 ^FC ^08 OPCODE ; 348 | : EVEX.DX.66.0F3A CALL> REX/VEX ^62 ^F3 ^FD ^08 OPCODE ; 349 | : EVEX.DX.F3.0F3A CALL> REX/VEX ^62 ^F3 ^FE ^08 OPCODE ; 350 | : EVEX.DX.F2.0F3A CALL> REX/VEX ^62 ^F3 ^FF ^08 OPCODE ; 351 | 352 | : EVEX.SY.NP.0F CALL> REX/VEX ^62 ^F1 ^7C ^28 OPCODE ; 353 | : EVEX.SY.66.0F CALL> REX/VEX ^62 ^F1 ^7D ^28 OPCODE ; 354 | : EVEX.SY.F3.0F CALL> REX/VEX ^62 ^F1 ^7E ^28 OPCODE ; 355 | : EVEX.SY.F2.0F CALL> REX/VEX ^62 ^F1 ^7F ^28 OPCODE ; 356 | : EVEX.SY.NP.0F38 CALL> REX/VEX ^62 ^F2 ^7C ^28 OPCODE ; 357 | : EVEX.SY.66.0F38 CALL> REX/VEX ^62 ^F2 ^7D ^28 OPCODE ; 358 | : EVEX.SY.F3.0F38 CALL> REX/VEX ^62 ^F2 ^7E ^28 OPCODE ; 359 | : EVEX.SY.F2.0F38 CALL> REX/VEX ^62 ^F2 ^7F ^28 OPCODE ; 360 | : EVEX.SY.NP.0F3A CALL> REX/VEX ^62 ^F3 ^7C ^28 OPCODE ; 361 | : EVEX.SY.66.0F3A CALL> REX/VEX ^62 ^F3 ^7D ^28 OPCODE ; 362 | : EVEX.SY.F3.0F3A CALL> REX/VEX ^62 ^F3 ^7E ^28 OPCODE ; 363 | : EVEX.SY.F2.0F3A CALL> REX/VEX ^62 ^F3 ^7F ^28 OPCODE ; 364 | : EVEX.DY.NP.0F CALL> REX/VEX ^62 ^F1 ^FC ^28 OPCODE ; 365 | : EVEX.DY.66.0F CALL> REX/VEX ^62 ^F1 ^FD ^28 OPCODE ; 366 | : EVEX.DY.F3.0F CALL> REX/VEX ^62 ^F1 ^FE ^28 OPCODE ; 367 | : EVEX.DY.F2.0F CALL> REX/VEX ^62 ^F1 ^FF ^28 OPCODE ; 368 | : EVEX.DY.NP.0F38 CALL> REX/VEX ^62 ^F2 ^FC ^28 OPCODE ; 369 | : EVEX.DY.66.0F38 CALL> REX/VEX ^62 ^F2 ^FD ^28 OPCODE ; 370 | : EVEX.DY.F3.0F38 CALL> REX/VEX ^62 ^F2 ^FE ^28 OPCODE ; 371 | : EVEX.DY.F2.0F38 CALL> REX/VEX ^62 ^F2 ^FF ^28 OPCODE ; 372 | : EVEX.DY.NP.0F3A CALL> REX/VEX ^62 ^F3 ^FC ^28 OPCODE ; 373 | : EVEX.DY.66.0F3A CALL> REX/VEX ^62 ^F3 ^FD ^28 OPCODE ; 374 | : EVEX.DY.F3.0F3A CALL> REX/VEX ^62 ^F3 ^FE ^28 OPCODE ; 375 | : EVEX.DY.F2.0F3A CALL> REX/VEX ^62 ^F3 ^FF ^28 OPCODE ; 376 | 377 | : EVEX.SZ.NP.0F CALL> REX/VEX ^62 ^F1 ^7C ^48 OPCODE ; 378 | : EVEX.SZ.66.0F CALL> REX/VEX ^62 ^F1 ^7D ^48 OPCODE ; 379 | : EVEX.SZ.F3.0F CALL> REX/VEX ^62 ^F1 ^7E ^48 OPCODE ; 380 | : EVEX.SZ.F2.0F CALL> REX/VEX ^62 ^F1 ^7F ^48 OPCODE ; 381 | : EVEX.SZ.NP.0F38 CALL> REX/VEX ^62 ^F2 ^7C ^48 OPCODE ; 382 | : EVEX.SZ.66.0F38 CALL> REX/VEX ^62 ^F2 ^7D ^48 OPCODE ; 383 | : EVEX.SZ.F3.0F38 CALL> REX/VEX ^62 ^F2 ^7E ^48 OPCODE ; 384 | : EVEX.SZ.F2.0F38 CALL> REX/VEX ^62 ^F2 ^7F ^48 OPCODE ; 385 | : EVEX.SZ.NP.0F3A CALL> REX/VEX ^62 ^F3 ^7C ^48 OPCODE ; 386 | : EVEX.SZ.66.0F3A CALL> REX/VEX ^62 ^F3 ^7D ^48 OPCODE ; 387 | : EVEX.SZ.F3.0F3A CALL> REX/VEX ^62 ^F3 ^7E ^48 OPCODE ; 388 | : EVEX.SZ.F2.0F3A CALL> REX/VEX ^62 ^F3 ^7F ^48 OPCODE ; 389 | : EVEX.DZ.NP.0F CALL> REX/VEX ^62 ^F1 ^FC ^48 OPCODE ; 390 | : EVEX.DZ.66.0F CALL> REX/VEX ^62 ^F1 ^FD ^48 OPCODE ; 391 | : EVEX.DZ.F3.0F CALL> REX/VEX ^62 ^F1 ^FE ^48 OPCODE ; 392 | : EVEX.DZ.F2.0F CALL> REX/VEX ^62 ^F1 ^FF ^48 OPCODE ; 393 | : EVEX.DZ.NP.0F38 CALL> REX/VEX ^62 ^F2 ^FC ^48 OPCODE ; 394 | : EVEX.DZ.66.0F38 CALL> REX/VEX ^62 ^F2 ^FD ^48 OPCODE ; 395 | : EVEX.DZ.F3.0F38 CALL> REX/VEX ^62 ^F2 ^FE ^48 OPCODE ; 396 | : EVEX.DZ.F2.0F38 CALL> REX/VEX ^62 ^F2 ^FF ^48 OPCODE ; 397 | : EVEX.DZ.NP.0F3A CALL> REX/VEX ^62 ^F3 ^FC ^48 OPCODE ; 398 | : EVEX.DZ.66.0F3A CALL> REX/VEX ^62 ^F3 ^FD ^48 OPCODE ; 399 | : EVEX.DZ.F3.0F3A CALL> REX/VEX ^62 ^F3 ^FE ^48 OPCODE ; 400 | : EVEX.DZ.F2.0F3A CALL> REX/VEX ^62 ^F3 ^FF ^48 OPCODE ; 401 | 402 | \ Opcode extensions. These are modrm bytes with the REG field 403 | \ prefilled, and the MOD field set to 3 (which is the default 404 | \ we use). 405 | : /0 CALL> ^C0 ; 406 | : /1 CALL> ^C8 ; 407 | : /2 CALL> ^D0 ; 408 | : /3 CALL> ^D8 ; 409 | : /4 CALL> ^E0 ; 410 | : /5 CALL> ^E8 ; 411 | : /6 CALL> ^F0 ; 412 | : /7 CALL> ^F8 ; 413 | 414 | [ASSEMBLER-DEFINITIONS] 415 | 416 | \ Legacy prefixes 417 | : LOCK ^F0 ; : REP ^F3 ; : REPE ^F3 ; : REPNE ^F2 ; 418 | : FS: ^64 ; : GS: ^65 ; 419 | 420 | \ Ops that take no arguments. 421 | 422 | : NOP OPL ^90 ; : PAUSE ^F3 OPL ^90 ; 423 | : CBW OPW ^98 ; : CWDE OPL ^98 ; : CDQE OPQ ^98 ; 424 | : CWD OPW ^99 ; : CDQ OPL ^99 ; : CQO OPQ ^99 ; 425 | : FWAIT OPB ^9B ; 426 | : PUSHFW OPW ^9C ; : PUSHFQ OPL ^9C ; 427 | : POPFW OPW ^9D ; : POPFQ OPL ^9D ; 428 | 429 | : INSB OPB ^6C ; : INSW OPW ^A5 ; : INSD OPL ^A5 ; 430 | : OUTSB OPB ^6E ; : OUTSW OPW ^A5 ; : OUTSD OPL ^A5 ; : MOVSQ OPQ ^A5 ; 431 | : MOVSB OPB ^A4 ; : MOVSW OPW ^A5 ; : MOVSL OPL ^A5 ; : MOVSQ OPQ ^A5 ; 432 | : CMPSB OPB ^A6 ; : CMPSW OPW ^A7 ; : CMPSL OPL ^A7 ; : CMPSQ OPQ ^A7 ; 433 | : STOSB OPB ^AA ; : STOSW OPW ^AB ; : STOSL OPL ^AB ; : STOSQ OPQ ^AB ; 434 | : LODSB OPB ^AC ; : LODSW OPW ^AD ; : LODSL OPL ^AD ; : LODSQ OPQ ^AD ; 435 | : SCASB OPB ^AE ; : SCASW OPW ^AF ; : SCASL OPL ^AF ; : LODSQ OPQ ^AF ; 436 | 437 | : RET OPL ^C3 ; 438 | : LEAVE OPL ^C9 ; 439 | : FRET OPL ^CB ; 440 | : INT3 OPB ^CC ; 441 | : IRETW OPW ^CF ; : IRETL OPL ^CF ; : IRETQ OPQ ^CF ; 442 | 443 | : XLATB OPB ^D7 ; 444 | 445 | : INB-DX OPB ^EC ; : INW-DX OPW ^ED ; : INL-DX OPL ^ED ; 446 | : OUTB-DX OPB ^EE ; : OUTW-DX OPW ^EF ; : OUTL-DX OPL ^EF ; 447 | 448 | : INT1 OPB ^F1 ; 449 | : HLT OPB ^F4 ; 450 | : CMC OPB ^F5 ; \ Complement carry flag. 451 | : CLC OPB ^F8 ; \ Clear carry flag 452 | : STC OPB ^F9 ; \ Set carry flag 453 | : CLI OPB ^FA ; \ Clear interrupt flag 454 | : STI OPB ^FB ; \ Set interrput flag 455 | : CLD OPB ^FC ; \ Clear direction flag 456 | : STD OPB ^FD ; \ Set direction flag 457 | 458 | : SYSCALL OPL ^0F ^05 ; 459 | : RDPMC OPL ^0F ^33 ; 460 | 461 | : PUSHFS OPL ^0F ^A0 ; 462 | : POPFS OPL ^0F ^A1 ; 463 | : CPUID OPL ^0F ^A2 ; 464 | : PUSHGS OPL ^0F ^A8 ; 465 | : POPGS OPL ^0F ^A9 ; 466 | 467 | \ Ops that expect both a register and modrm argument. 468 | \ E.g. MOVQ< RBX, [RAX] 469 | : ADDB> OPB ^00 ; : ADCB> OPB ^10 ; : ANDB> OPB ^20 ; : XORB> OPB ^30 ; 470 | : ADDW> OPW ^01 ; : ADCW> OPW ^11 ; : ANDW> OPW ^21 ; : XORW> OPW ^31 ; 471 | : ADDL> OPL ^01 ; : ADCL> OPL ^11 ; : ANDL> OPL ^21 ; : XORL> OPL ^31 ; 472 | : ADDQ> OPQ ^01 ; : ADCQ> OPQ ^11 ; : ANDQ> OPQ ^21 ; : XORQ> OPQ ^31 ; 473 | 474 | : ADDB< OPB ^02 ; : ADCB< OPB ^12 ; : ANDB< OPB ^22 ; : XORB< OPB ^32 ; 475 | : ADDW< OPW ^03 ; : ADCW< OPW ^13 ; : ANDW< OPW ^23 ; : XORW< OPW ^33 ; 476 | : ADDL< OPL ^03 ; : ADCL< OPL ^13 ; : ANDL< OPL ^23 ; : XORL< OPL ^33 ; 477 | : ADDQ< OPQ ^03 ; : ADCQ< OPQ ^13 ; : ANDQ< OPQ ^23 ; : XORQ< OPQ ^33 ; 478 | 479 | : ORB> OPB ^08 ; : SBBB> OPB ^18 ; : SUBB> OPB ^28 ; : CMPB> OPB ^38 ; 480 | : ORW> OPW ^09 ; : SBBW> OPW ^19 ; : SUBW> OPW ^29 ; : CMPW> OPW ^39 ; 481 | : ORL> OPL ^09 ; : SBBL> OPL ^19 ; : SUBL> OPL ^29 ; : CMPL> OPL ^39 ; 482 | : ORQ> OPQ ^09 ; : SBBQ> OPQ ^19 ; : SUBQ> OPQ ^29 ; : CMPQ> OPQ ^39 ; 483 | 484 | : ORB< OPB ^0A ; : SBBB< OPB ^1A ; : SUBB< OPB ^2A ; : CMPB< OPB ^3A ; 485 | : ORW< OPW ^0B ; : SBBW< OPW ^1B ; : SUBW< OPW ^2B ; : CMPW< OPW ^3B ; 486 | : ORL< OPL ^0B ; : SBBL< OPL ^1B ; : SUBL< OPL ^2B ; : CMPL< OPL ^3B ; 487 | : ORQ< OPQ ^0B ; : SBBQ< OPQ ^1B ; : SUBQ< OPQ ^2B ; : CMPQ< OPQ ^3B ; 488 | 489 | : TESTB> OPB ^84 ; : XCHGB> OPB ^84 ; 490 | : TESTW> OPW ^85 ; : XCHGW> OPW ^85 ; 491 | : TESTL> OPL ^85 ; : XCHGL> OPL ^85 ; 492 | : TESTQ> OPQ ^85 ; : XCHGQ> OPQ ^85 ; 493 | 494 | : MOVB> OPB ^88 ; : MOVB< OPB ^8A ; 495 | : MOVW> OPW ^89 ; : MOVW< OPW ^8B ; 496 | : MOVL> OPL ^89 ; : MOVL< OPL ^8B ; 497 | : MOVQ> OPQ ^89 ; : MOVQ< OPQ ^8B ; 498 | 499 | : LEAW< OPW ^8D ; 500 | : LEAL< OPL ^8D ; 501 | : LEAQ< OPQ ^8D ; 502 | 503 | : BTW> OPW ^0F ^A3 ; : BTL> OPL ^0F ^A3 ; : BTQ> OPQ ^0F ^A3 ; 504 | : SHLDW> OPW ^0F ^A5 ; : SHLDL> OPL ^0F ^A5 ; : SHLDQ> OPQ ^0F ^A5 ; 505 | : BTSW> OPW ^0F ^AB ; : BTSL> OPL ^0F ^AB ; : BTSQ> OPQ ^0F ^AB ; 506 | : SHRDW> OPW ^0F ^AD ; : SHRDL> OPL ^0F ^AD ; : SHRDQ> OPQ ^0F ^AD ; 507 | : IMULW< OPW ^0F ^AF ; : IMULL< OPL ^0F ^AF ; : IMULQ< OPQ ^0F ^AF ; 508 | 509 | : CMPXCHGB> OPB ^0F ^B0 ; 510 | : CMPXCHGW> OPW ^0F ^B1 ; 511 | : CMPXCHGL> OPL ^0F ^B1 ; 512 | : CMPXCHGQ> OPQ ^0F ^B1 ; 513 | 514 | : BTRW> OPW ^0F ^B3 ; : BTRL> OPL ^0F ^B3 ; : BTRQ> OPQ ^0F ^B3 ; 515 | : BTCW> OPW ^0F ^BB ; : BTCL> OPL ^0F ^BB ; : BTCQ> OPQ ^0F ^BB ; 516 | 517 | : POPCNTW< ^F3 OPW ^0F ^B8 ; 518 | : POPCNTL< ^F3 OPL ^0F ^B8 ; 519 | : POPCNTQ< ^F3 OPQ ^0F ^B8 ; 520 | 521 | : BSFW< OPW ^0F ^BC ; : BSFL< OPL ^0F ^BC ; : BSFQ< OPQ ^0F ^BC ; 522 | : BSRW< OPW ^0F ^BD ; : BSRL< OPL ^0F ^BD ; : BSRQ< OPQ ^0F ^BD ; 523 | 524 | : TZCNTW< ^F3 OPW ^0F ^BC ; : LZCNTW< ^F3 OPW ^0F ^BD ; 525 | : TZCNTL< ^F3 OPL ^0F ^BC ; : LZCNTL< ^F3 OPL ^0F ^BD ; 526 | : TZCNTQ< ^F3 OPQ ^0F ^BC ; : LZCNTQ< ^F3 OPQ ^0F ^BD ; 527 | 528 | : MOVZXWB< OPW ^0F ^B6 ; : MOVSXWB< OPW ^0F ^BE ; 529 | : MOVZXLB< OPL ^0F ^B6 ; : MOVSXLB< OPL ^0F ^BE ; 530 | : MOVZXQB< OPQ ^0F ^B6 ; : MOVSXQB< OPQ ^0F ^BE ; 531 | : MOVZXLW< OPL ^0F ^B7 ; : MOVSXLW< OPL ^0F ^BF ; 532 | : MOVZXQW< OPQ ^0F ^B7 ; : MOVSXQW< OPQ ^0F ^BF ; 533 | ( -------------------- ) : MOVSXQL< OPQ ^63 ; 534 | 535 | : MOVNTIL> OPL ^0F ^C3 ; 536 | : MOVNTIQ> OPQ ^0F ^C3 ; 537 | 538 | \ these need a memory operand 539 | : MOVBEW< OPW ^0F ^38 ^F0 ; : MOVBEW> OPW ^0F ^38 ^F1 ; 540 | : MOVBEL< OPL ^0F ^38 ^F0 ; : MOVBEL> OPL ^0F ^38 ^F1 ; 541 | : MOVBEQ< OPQ ^0F ^39 ^F0 ; : MOVBEQ> OPQ ^0F ^39 ^F1 ; 542 | 543 | : CRC32B< ^F2 OPB ^0F ^38 ^F0 ; 544 | : CRC32W< ^F2 OPW ^0F ^38 ^F1 ; 545 | : CRC32L< ^F2 OPL ^0F ^38 ^F1 ; 546 | : CRC32Q< ^F2 OPQ ^0F ^38 ^F1 ; 547 | 548 | : ADCXL< ^66 OPL ^0F ^38 ^F6 ; 549 | : ADCXQ< ^66 OPQ ^0F ^38 ^F6 ; 550 | : ADOXL< ^F3 OPL ^0F ^38 ^F6 ; 551 | : ADOXQ< ^F3 OPQ ^0F ^38 ^F6 ; 552 | 553 | \ Ops that expect register, modrm, and immediate arguments. 554 | \ (Do not write a comma after the modrm argument!) 555 | \ E.g. IMULW<. RAX, RCX $0A 556 | : IMULW<. OPW ^6B ; : IMULW<.. OPW ^69 ; 557 | : IMULL<. OPL ^6B ; : IMULL<: OPL ^69 ; 558 | : IMULQ<. OPQ ^6B ; : IMULQ<: OPQ ^69 ; 559 | 560 | : SHLDW>. OPW ^0F ^A4 ; : SHLDL>. OPL ^0F ^A4 ; : SHLDQ>. OPQ ^0F ^A4 ; 561 | : SHRDW>. OPW ^0F ^AC ; : SHRDL>. OPL ^0F ^AC ; : SHRDQ>. OPQ ^0F ^AC ; 562 | 563 | \ Ops that expect an immediate. 564 | : ADD-AL. OPB ^04 ; : ADC-AL. OPB ^14 ; 565 | : ADD-AX.. OPW ^05 ; : ADC-AX.. OPW ^15 ; 566 | : ADD-EAX: OPL ^05 ; : ADC-EAX: OPL ^15 ; 567 | : ADD-RAX: OPQ ^05 ; : ADC-RAX: OPQ ^15 ; 568 | 569 | : AND-AL. OPB ^24 ; : XOR-AL. OPB ^34 ; 570 | : AND-AX.. OPW ^25 ; : XOR-AX.. OPW ^35 ; 571 | : AND-EAX: OPL ^25 ; : XOR-EAX: OPL ^35 ; 572 | : AND-RAX: OPQ ^25 ; : XOR-RAX: OPQ ^35 ; 573 | 574 | : OR-AL. OPB ^0C ; : SBB-AL. OPB ^1C ; 575 | : OR-AX.. OPW ^0D ; : SBB-AX.. OPW ^1D ; 576 | : OR-EAX: OPL ^0D ; : SBB-EAX: OPL ^1D ; 577 | : OR-RAX: OPQ ^0D ; : SBB-RAX: OPQ ^1D ; 578 | 579 | : SUB-AL. OPB ^2C ; : CMP-AL. OPB ^3C ; 580 | : SUB-AX.. OPW ^2D ; : CMP-AX.. OPW ^3C ; 581 | : SUB-EAX: OPL ^2D ; : CMP-EAX: OPL ^3D ; 582 | : SUB-RAX: OPQ ^2D ; : CMP-RAX: OPQ ^3D ; 583 | 584 | : PUSHW.. OPW ^68 ; 585 | : PUSHQ. OPL ^6A ; \ Pushes 64-bits even without REX.W prefix 586 | : PUSHQ: OPL ^68 ; \ Pushes 64-bits even without REX.W prefix 587 | 588 | : MOV-AL-@:: OPB ^A0 ; : MOV-AL-!:: OPB ^A2 ; 589 | : MOV-AX-@:: OPW ^A1 ; : MOV-AX-!:: OPW ^A3 ; 590 | : MOV-EAX-@:: OPL ^A1 ; : MOV-EAX-!:: OPL ^A3 ; 591 | : MOV-RAX-@:: OPQ ^A1 ; : MOV-RAX-!:: OPQ ^A3 ; 592 | 593 | : TEST-AL. OPB ^A8 ; : TEST-AX.. OPW ^A9 ; 594 | : TEST-EAX: OPL ^A9 ; : TEST-RAX: OPQ ^A9 ; 595 | 596 | : RET.. OPL ^C2 ; \ RET while popping extra bytes 597 | : ENTER... OPL ^C8 ; 598 | : FRET.. OPL ^CA ; 599 | : INT. OPB ^CD ; 600 | 601 | : INB. OPB ^E4 ; : INW. OPW ^E5 ; : INL. OPL ^E5 ; 602 | : OUTB. OPB ^E6 ; : OUTW. OPW ^E7 ; : OUTL. OPL ^E7 ; 603 | 604 | \ Short jumps. These expect an immediate signed byte offset. 605 | : JO. ^70 ; : JNO. ^71 ; : JB. ^72 ; : JAE. ^73 ; 606 | : JZ. ^74 ; : JNZ. ^75 ; : JBE. ^76 ; : JA. ^77 ; 607 | : JS. ^78 ; : JNS. ^79 ; : JPE. ^7A ; : JPO. ^7B ; 608 | : JL. ^7C ; : JGE. ^7D ; : JLE. ^7E ; : JG. ^7F ; 609 | : JMP. ^EB ; : JE. ^74 ; : JNE. ^75 ; 610 | : LOOPNE. ^E0 ; : LOOPE. ^E1 ; : LOOP. ^E2 ; : JRCXZ. ^E3 ; 611 | 612 | \ Near jumps. These expect an immediate signed dword offset. 613 | : JO: ^0F ^80 ; : JNO: ^0F ^81 ; : JB: ^0F ^82 ; : JAE: ^0F ^83 ; 614 | : JZ: ^0F ^84 ; : JNZ: ^0F ^85 ; : JBE: ^0F ^86 ; : JA: ^0F ^87 ; 615 | : JS: ^0F ^88 ; : JNS: ^0F ^89 ; : JPE: ^0F ^8A ; : JPO: ^0F ^8B ; 616 | : JL: ^0F ^8C ; : JGE: ^0F ^8D ; : JLE: ^0F ^8E ; : JG: ^0F ^8F ; 617 | : JMP: ^E9 ; : JE: ^0F ^84 ; : JNE: ^0F ^85 ; 618 | : CALL: ^E8 ; 619 | 620 | \ Ops that expect a direct register argument. 621 | \ (Do not write a comma after the direct register argument!) 622 | \ E.g. PUSHQ# RAX 623 | \ POPQ# R15 624 | : PUSHW# OPW ^50 ; 625 | : POPW# OPW ^58 ; 626 | : PUSHQ# OPL ^50 ; \ forced to 64 bits 627 | : POPQ# OPL ^58 ; \ forced to 64 bits 628 | 629 | : XCHGW-AX# OPW ^90 ; 630 | : XCHGL-EAX# OPL ^90 ; 631 | : XCHGQ-RAX# OPQ ^90 ; 632 | 633 | : BSWAPL# OPL ^0F ^C8 ; 634 | : BSWAPQ# OPQ ^0F ^C8 ; 635 | 636 | : RDFSBASEL# ^F3 OPL ^0F ^AE /0 ; 637 | : RDFSBASEQ# ^F3 OPQ ^0F ^AE /0 ; 638 | : RDGSBASEL# ^F3 OPL ^0F ^AE /1 ; 639 | : RDGSBASEQ# ^F3 OPQ ^0F ^AE /1 ; 640 | : WRFSBASEL# ^F3 OPL ^0F ^AE /2 ; 641 | : WRFSBASEQ# ^F3 OPQ ^0F ^AE /2 ; 642 | : WRGSBASEL# ^F3 OPL ^0F ^AE /3 ; 643 | : WRGSBASEQ# ^F3 OPQ ^0F ^AE /3 ; 644 | 645 | \ Ops that expect a direct register argument and an immediate. 646 | \ (Do not write a comma after the direct register argument!) 647 | \ E.g. MOVL#: RAX $10203040 ( MOV EAX, 10203040h ) 648 | \ MOVW#: R13 $1020 ( MOV R13, 1020h ) 649 | : MOVB#. OPB ^B0 ; 650 | : MOVW#.. OPW ^B8 ; 651 | : MOVL#: OPL ^B8 ; 652 | : MOVQ#:: OPQ ^B8 ; 653 | 654 | \ Ops that expect a modrm argument only. 655 | 656 | : SHLB_1 OPB ^D0 /4 ; : SHRB_1 OPB ^D0 /5 ; : SARB_1 OPB ^D0 /7 ; 657 | : SHLW_1 OPW ^D1 /4 ; : SHRW_1 OPW ^D1 /5 ; : SARW_1 OPW ^D1 /7 ; 658 | : SHLL_1 OPL ^D1 /4 ; : SHRL_1 OPL ^D1 /5 ; : SARL_1 OPL ^D1 /7 ; 659 | : SHLQ_1 OPQ ^D1 /4 ; : SHRQ_1 OPQ ^D1 /5 ; : SARQ_1 OPQ ^D1 /7 ; 660 | 661 | : SHLB_CL OPB ^D2 /4 ; : SHRB_CL OPB ^D2 /5 ; : SARB_CL OPB ^D2 /7 ; 662 | : SHLW_CL OPW ^D3 /4 ; : SHRW_CL OPW ^D3 /5 ; : SARW_CL OPW ^D3 /7 ; 663 | : SHLL_CL OPL ^D3 /4 ; : SHRL_CL OPL ^D3 /5 ; : SARL_CL OPL ^D3 /7 ; 664 | : SHLQ_CL OPQ ^D3 /4 ; : SHRQ_CL OPQ ^D3 /5 ; : SARQ_CL OPQ ^D3 /7 ; 665 | 666 | : POPW_ OPW ^8F /0 ; 667 | : PUSHW_ OPW ^FF /6 ; 668 | : POPQ_ OPL ^8F /0 ; \ forced to 64 bits 669 | : PUSHQ_ OPL ^FF /6 ; \ forced to 64 bits 670 | 671 | : NOTB_ OPB ^F6 /2 ; : NEGB_ OPB ^F6 /3 ; 672 | : NOTW_ OPW ^F7 /2 ; : NEGW_ OPW ^F7 /3 ; 673 | : NOTL_ OPL ^F7 /2 ; : NEGL_ OPL ^F7 /3 ; 674 | : NOTQ_ OPQ ^F7 /2 ; : NEGQ_ OPQ ^F7 /3 ; 675 | : MULB_ OPB ^F6 /4 ; : IMULB_ OPB ^F6 /5 ; 676 | : MULW_ OPW ^F7 /4 ; : IMULW_ OPW ^F7 /5 ; 677 | : MULL_ OPL ^F7 /4 ; : IMULL_ OPL ^F7 /5 ; 678 | : MULQ_ OPQ ^F7 /4 ; : IMULQ_ OPQ ^F7 /5 ; 679 | : DIVB_ OPB ^F6 /6 ; : IDIVB_ OPB ^F6 /7 ; 680 | : DIVW_ OPW ^F7 /6 ; : IDIVW_ OPW ^F7 /7 ; 681 | : DIVL_ OPL ^F7 /6 ; : IDIVL_ OPL ^F7 /7 ; 682 | : DIVQ_ OPQ ^F7 /6 ; : IDIVQ_ OPQ ^F7 /7 ; 683 | 684 | : INCB_ OPB ^FE /0 ; : DECB_ OPB ^FE /1 ; 685 | : INCW_ OPW ^FF /0 ; : DECW_ OPW ^FF /1 ; 686 | : INCL_ OPL ^FF /0 ; : DECL_ OPL ^FF /1 ; 687 | : INCQ_ OPQ ^FF /0 ; : DECQ_ OPQ ^FF /1 ; 688 | 689 | : CALLQ_ OPL ^FF /2 ; \ forced to 64 bits 690 | : JUMPQ_ OPL ^FF /4 ; \ forced to 64 bits 691 | 692 | : SETO_ OPB ^0F ^90 /0 ; : SETNO_ OPB ^0F ^91 /0 ; 693 | : SETB_ OPB ^0F ^92 /0 ; : SETAE_ OPB ^0F ^93 /0 ; 694 | : SETZ_ OPB ^0F ^94 /0 ; : SETNZ_ OPB ^0F ^95 /0 ; 695 | : SETBE_ OPB ^0F ^96 /0 ; : SETA_ OPB ^0F ^97 /0 ; 696 | : SETS_ OPB ^0F ^98 /0 ; : SETNS_ OPB ^0F ^99 /0 ; 697 | : SETPE_ OPB ^0F ^9A /0 ; : SETPO_ OPB ^0F ^9B /0 ; 698 | : SETL_ OPB ^0F ^9C /0 ; : SETGE_ OPB ^0F ^9D /0 ; 699 | : SETLE_ OPB ^0F ^9E /0 ; : SETG_ OPB ^0F ^9F /0 ; 700 | 701 | : CMPXCHG8B_ OPL ^0F ^C7 /1 ; \ must take memory operand 702 | : CMPXCHG16B_ OPQ ^0F ^C7 /1 ; \ must take memory operand 703 | 704 | \ Ops that expect a modrm argument and an immediate. 705 | 706 | : ADDB_. OPB ^80 /0 ; : ORB_. OPB ^80 /1 ; 707 | : ADDW_. OPW ^83 /0 ; : ORW_. OPW ^83 /1 ; 708 | : ADDL_. OPL ^83 /0 ; : ORL_. OPL ^83 /1 ; 709 | : ADDQ_. OPQ ^83 /0 ; : ORQ_. OPQ ^83 /1 ; 710 | : ADDW_.. OPW ^81 /0 ; : ORW_.. OPW ^81 /1 ; 711 | : ADDL_: OPL ^81 /0 ; : ORL_: OPL ^81 /1 ; 712 | : ADDQ_: OPQ ^81 /0 ; : ORQ_: OPQ ^81 /1 ; 713 | 714 | : ADCB_. OPB ^80 /2 ; : SBBB_. OPB ^80 /3 ; 715 | : ADCW_. OPW ^83 /2 ; : SBBW_. OPW ^83 /3 ; 716 | : ADCL_. OPL ^83 /2 ; : SBBL_. OPL ^83 /3 ; 717 | : ADCQ_. OPQ ^83 /2 ; : SBBQ_. OPQ ^83 /3 ; 718 | : ADCW_.. OPW ^81 /2 ; : SBBW_.. OPW ^81 /3 ; 719 | : ADCL_: OPL ^81 /2 ; : SBBL_: OPL ^81 /3 ; 720 | : ADCQ_: OPQ ^81 /2 ; : SBBQ_: OPQ ^81 /3 ; 721 | 722 | : ANDB_. OPB ^80 /4 ; : SUBB_. OPB ^80 /5 ; 723 | : ANDW_. OPW ^83 /4 ; : SUBW_. OPW ^83 /5 ; 724 | : ANDL_. OPL ^83 /4 ; : SUBL_. OPL ^83 /5 ; 725 | : ANDQ_. OPQ ^83 /4 ; : SUBQ_. OPQ ^83 /5 ; 726 | : ANDW_.. OPW ^81 /4 ; : SUBW_.. OPW ^81 /5 ; 727 | : ANDL_: OPL ^81 /4 ; : SUBL_: OPL ^81 /5 ; 728 | : ANDQ_: OPQ ^81 /4 ; : SUBQ_: OPQ ^81 /5 ; 729 | 730 | : XORB_. OPB ^80 /6 ; : CMPB_. OPB ^80 /7 ; 731 | : XORW_. OPW ^83 /6 ; : CMPW_. OPW ^83 /7 ; 732 | : XORL_. OPL ^83 /6 ; : CMPL_. OPL ^83 /7 ; 733 | : XORQ_. OPQ ^83 /6 ; : CMPQ_. OPQ ^83 /7 ; 734 | : XORW_.. OPW ^81 /6 ; : CMPW_.. OPW ^81 /7 ; 735 | : XORL_: OPL ^81 /6 ; : CMPL_: OPL ^81 /7 ; 736 | : XORQ_: OPQ ^81 /6 ; : CMPQ_: OPQ ^81 /7 ; 737 | 738 | : SHLB_. OPB ^C0 /4 ; : SHRB_. OPB ^C0 /5 ; : SARB_. OPB ^C0 /7 ; 739 | : SHLW_. OPW ^C1 /4 ; : SHRW_. OPW ^C1 /5 ; : SARW_. OPW ^C1 /7 ; 740 | : SHLL_. OPL ^C1 /4 ; : SHRL_. OPL ^C1 /5 ; : SARL_. OPL ^C1 /7 ; 741 | : SHLQ_. OPQ ^C1 /4 ; : SHRQ_. OPQ ^C1 /5 ; : SARQ_. OPQ ^C1 /7 ; 742 | 743 | : MOVB_. OPB ^C6 /0 ; 744 | : MOVW_.. OPW ^C7 /0 ; 745 | : MOVL_: OPL ^C7 /0 ; 746 | : MOVQ_: OPQ ^C7 /0 ; \ 32-bit immediate sign-extended to 64-bits 747 | 748 | : TESTB_. OPB ^F6 /0 ; 749 | : TESTW_.. OPW ^F7 /0 ; 750 | : TESTL_: OPL ^F7 /0 ; 751 | : TESTQ_: OPQ ^F7 /0 ; \ 32-bit immediate sign-extended to 64-bits 752 | 753 | : BTW_. OPW ^0F ^BA /4 ; : BTL_. OPL ^0F ^BA /4 ; : BTQ_. OPQ ^0F ^BA /4 ; 754 | : BTSW_. OPW ^0F ^BA /5 ; : BTSL_. OPL ^0F ^BA /5 ; : BTSQ_. OPQ ^0F ^BA /5 ; 755 | : BTRW_. OPW ^0F ^BA /6 ; : BTRL_. OPL ^0F ^BA /6 ; : BTRQ_. OPQ ^0F ^BA /6 ; 756 | : BTCW_. OPW ^0F ^BA /7 ; : BTCL_. OPL ^0F ^BA /7 ; : BTCQ_. OPQ ^0F ^BA /7 ; 757 | 758 | \ SSE, AVX 759 | 760 | : MOVUPSX< OPL ^0F ^10 ; : MOVUPSX> OPL ^0F ^11 ; 761 | : VMOVUPSX< VEX.SX.NP.0F ^10 ; : VMOVUPSX> VEX.SX.NP.0F ^11 ; 762 | : VMOVUPSY< VEX.SY.NP.0F ^10 ; : VMOVUPSY> VEX.SY.NP.0F ^11 ; 763 | : VMOVUPSZ< EVEX.SZ.NP.0F ^10 ; : VMOVUPSZ> EVEX.SZ.NP.0F ^11 ; 764 | : MOVUPDX< ^66 OPL ^0F ^10 ; : MOVUPDX> ^66 OPL ^0F ^11 ; 765 | : VMOVUPDX< VEX.DX.66.0F ^10 ; : VMOVUPDX> VEX.DX.66.0F ^11 ; 766 | : VMOVUPDY< VEX.DY.66.0F ^10 ; : VMOVUPDY> VEX.DY.66.0F ^11 ; 767 | : VMOVUPDZ< EVEX.DZ.66.0F ^10 ; : VMOVUPDZ> EVEX.DZ.66.0F ^11 ; 768 | : MOVSSX< ^F3 OPL ^0F ^10 ; : MOVSSX> ^F3 OPL ^0F ^11 ; 769 | : VMOVSSXM< VEX.SX.F3.0F ^10 ; : VMOVSSXM> VEX.SX.F3.0F ^11 ; 770 | : VMOVSSXX+ VEX.SX.F3.0F ^10 ; : VMOVSSXX+> VEX.SX.F3.0F ^11 ; 771 | : MOVSDX< ^F2 OPL ^0F ^10 ; : MOVSDX> ^F2 OPL ^0F ^11 ; 772 | : VMOVSDXM< VEX.DX.F2.0F ^10 ; : VMOVSDXM> VEX.DX.F2.0F ^11 ; 773 | : VMOVSDXX+ VEX.DX.F2.0F ^10 ; : VMOVSDXX+> VEX.DX.F2.0F ^11 ; 774 | : MOVLPSXM< OPL ^0F ^12 ; : MOVLPSXM> OPL ^0F ^13 ; 775 | : VMOVLPSXM+ VEX.SX.NP.0F ^12 ; : VMOVLPSXM> VEX.SX.NP.0F ^13 ; 776 | : MOVHLPSXX< OPL ^0F ^12 ; 777 | : VMOVHLPSXX+ VEX.SX.NP.0F ^12 ; 778 | : MOVLPDXM< ^66 OPL ^0F ^12 ; : MOVLPDXM> ^66 OPL ^0F ^13 ; 779 | : VMOVLPDXM+ VEX.DX.66.0F ^12 ; : VMOVLPDXM> VEX.DX.66.0F ^13 ; 780 | : MOVSLDUPX< ^F3 OPL ^0F ^12 ; 781 | : VMOVSLDUPX< VEX.SX.F3.0F ^12 ; 782 | : VMOVSLDUPY< VEX.SY.F3.0F ^12 ; 783 | : VMOVSLDUPZ< EVEX.SZ.F3.0F ^12 ; 784 | : MOVDDUPX< ^F2 OPL ^0F ^12 ; 785 | : VMOVDDUPX< VEX.DX.F2.0F ^12 ; 786 | : VMOVDDUPY< VEX.DY.F2.0F ^12 ; 787 | : VMOVDDUPZ< EVEX.DZ.F2.0F ^12 ; 788 | : UNPCKLPS< OPL ^0F ^14 ; : UNPCKHPS< OPL ^0F ^15 ; 789 | : VUNPCKLPSX+ VEX.SX.NP.0F ^14 ; : VUNPCKHPSX+ VEX.SX.NP.0F ^15 ; 790 | : VUNPCKLPSY+ VEX.SY.NP.0F ^14 ; : VUNPCKHPSY+ VEX.SY.NP.0F ^15 ; 791 | : VUNPCKLPSY+ EVEX.SZ.NP.0F ^14 ; : VUNPCKHPSZ+ EVEX.SZ.NP.0F ^15 ; 792 | : UNPCKLPD< ^66 OPL ^0F ^14 ; : UNPCKHPD< ^66 OPL ^0F ^15 ; 793 | : VUNPCKLPDX+ VEX.DX.66.0F ^14 ; : VUNPCKHPDX+ VEX.DX.66.0F ^15 ; 794 | : VUNPCKLPDY+ VEX.DY.66.0F ^14 ; : VUNPCKHPDY+ VEX.DY.66.0F ^15 ; 795 | : VUNPCKLPDZ+ EVEX.DZ.66.0F ^14 ; : VUNPCKHPDZ+ EVEX.DZ.66.0F ^15 ; 796 | : MOVHPSXM< OPL ^0F ^16 ; : MOVHPSXM> OPL ^0F ^17 ; 797 | : VMOVHPSXM+ VEX.SX.NP.0F ^16 ; : VMOVHPSXM> VEX.SX.NP.0F ^17 ; 798 | : MOVLHPSXX< OPL ^0F ^16 ; 799 | : VMOVLHPSXX+ VEX.SX.NP.0F ^16 ; 800 | : MOVHPDXM< ^66 OPL ^0F ^16 ; : MOVHPDXM> ^66 OPL ^0F ^17 ; 801 | : VMOVHPDXM+ VEX.SX.66.0F ^16 ; : VMOVHPDXM> VEX.SX.66.0F ^17 ; 802 | : MOVSHDUPX< ^F3 OPL ^0F ^16 ; 803 | : VMOVSHDUPX< VEX.SX.F3.0F ^16 ; 804 | : VMOVSHDUPY< VEX.SY.F3.0F ^16 ; 805 | : VMOVSHDUPZ< EVEX.SZ.F3.0F ^16 ; 806 | 807 | : MOVAPSX< OPL ^0F ^28 ; : MOVAPSX> OPL ^0F ^29 ; 808 | : VMOVAPSX< VEX.SX.NP.0F ^28 ; : VMOVAPSX> VEX.SX.NP.0F ^29 ; 809 | : VMOVAPSY< VEX.SY.NP.0F ^28 ; : VMOVAPSY> VEX.SY.NP.0F ^29 ; 810 | : VMOVAPSZ< EVEX.SZ.NP.0F ^28 ; : VMOVAPSZ> EVEX.SZ.NP.0F ^29 ; 811 | : MOVAPDX< ^66 OPL ^0F ^28 ; : MOVAPDX> ^66 OPL ^0F ^29 ; 812 | : VMOVAPDX< VEX.DX.66.0F ^28 ; : VMOVAPDX> VEX.DX.66.0F ^29 ; 813 | : VMOVAPDY< VEX.DY.66.0F ^28 ; : VMOVAPDY> VEX.DY.66.0F ^29 ; 814 | : VMOVAPDZ< EVEX.DZ.66.0F ^28 ; : VMOVAPDZ> EVEX.DZ.66.0F ^29 ; 815 | : CVTPI2PSXM< OPL ^0F ^2A ; : MOVNTPSXM> OPL ^0F ^2B ; 816 | : VMOVNTPSXM> VEX.SX.NP.0F ^2B ; 817 | : VMOVNTPSYM> VEX.SY.NP.0F ^2B ; 818 | : VMOVNTPSZM> EVEX.SZ.NP.0F ^2B ; 819 | : CVTPI2PDXM< ^66 OPL ^0F ^2A ; : MOVNTPDXM> ^66 OPL ^0F ^2B ; 820 | : VMOVNTPDXM> VEX.DX.66.0F ^2B ; 821 | : VMOVNTPDYM> VEX.DY.66.0F ^2B ; 822 | : VMOVNTPDZM> EVEX.DZ.66.0F ^2B ; 823 | : CVTSI2SSXL< ^F3 OPL ^0F ^2A ; 824 | : VCVTSI2SSXL+ VEX.SX.F3.0F ^2A ; 825 | : CVTSI2SSXQ< ^F3 OPQ ^0F ^2A ; 826 | : VCVTSI2SSXQ+ VEX.DX.F3.0F ^2A ; 827 | : CVTSI2SDXL< ^F2 OPL ^0F ^2A ; 828 | : VCVTSI2SDXL+ VEX.SX.F2.0F ^2A ; 829 | : CVTSI2SDXQ< ^F2 OPQ ^0F ^2A ; 830 | : VCVTSI2SDXQ+ VEX.DX.F2.0F ^2A ; 831 | : CVTTSS2SILX< ^F3 OPL ^0F ^2C ; : CVTSS2SILX< ^F3 OPL ^0F ^2D ; 832 | : CVTTSS2SIQX< ^F3 OPQ ^0F ^2C ; : CVTSS2SIQX< ^F3 OPQ ^0F ^2D ; 833 | : VCVTTSS2SILX< VEX.SX.F3.0F ^2C ; : VCVTSS2SILX< VEX.SX.F3.0F ^2D ; 834 | : VCVTTSS2SIQX< VEX.DX.F3.0F ^2C ; : VCVTSS2SIQX< VEX.DX.F3.0F ^2D ; 835 | : CVTTSD2SILX< ^F2 OPL ^0F ^2C ; : CVTSD2SILX< ^F2 OPL ^0F ^2D ; 836 | : CVTTSD2SIQX< ^F2 OPQ ^0F ^2C ; : CVTSD2SIQX< ^F2 OPQ ^0F ^2D ; 837 | : VCVTTSD2SILX< VEX.SX.F2.0F ^2C ; : VCVTSD2SILX< VEX.SX.F2.0F ^2D ; 838 | : VCVTTSD2SIQX< VEX.DX.F2.0F ^2C ; : VCVTSD2SIQX< VEX.DX.F2.0F ^2D ; 839 | : UCOMISSX< OPL ^0F ^2E ; : COMISSX< OPL ^0F ^2F ; 840 | : VUCOMISSX< VEX.SX.NP.0F ^2E ; : VCOMISSX< VEX.SX.NP.0F ^2F ; 841 | : UCOMISDX< ^66 OPL ^0F ^2E ; : COMISDX< ^66 OPL ^0F ^2F ; 842 | : VUCOMISDX< VEX.DX.66.0F ^2E ; : VCOMISDX< VEX.DX.66.0F ^2F ; 843 | 844 | : MOVMSKPSX< OPL ^0F ^50 ; : SQRTPSX< OPL ^0F ^51 ; 845 | : VMOVMSKPSX< VEX.SX.NP.0F ^50 ; : VSQRTPSX< VEX.SX.NP.0F ^51 ; 846 | : VMOVMSKPSY< VEX.SY.NP.0F ^50 ; : VSQRTPSY< VEX.SY.NP.0F ^51 ; 847 | : VSQRTPSZ< EVEX.SZ.NP.0F ^51 ; 848 | : MOVMSKPDX< ^66 OPL ^0F ^50 ; : SQRTPDX< ^66 OPL ^0F ^51 ; 849 | : VMOVMSKPDX< VEX.SX.66.0F ^50 ; : VSQRTPDX< VEX.DX.66.0F ^51 ; 850 | : VMOVMSKPDY< VEX.SY.66.0F ^50 ; : VSQRTPDY< VEX.DY.66.0F ^51 ; 851 | : VSQRTPDZ< EVEX.DZ.66.0F ^51 ; 852 | : SQRTSSX< ^F3 OPL ^0F ^51 ; 853 | : VSQRTSSX+ VEX.SX.F3.0F ^51 ; 854 | : SQRTSDX< ^F2 OPL ^0F ^51 ; 855 | : VSQRTSDX+ VEX.DX.F2.0F ^51 ; 856 | : RSQRTPSX< OPL ^0F ^52 ; : RCPPSX< OPL ^0F ^53 ; 857 | : VRSQRTPSX< VEX.SX.NP.0F ^52 ; : VRCPPSX< VEX.SX.NP.0F ^53 ; 858 | : VRSQRTPSY< VEX.SY.NP.0F ^52 ; : VRCPPSY< VEX.SY.NP.0F ^53 ; 859 | : RSQRTSSX< ^F3 OPL ^0F ^52 ; : RCPSSX< ^F3 OPL ^0F ^53 ; 860 | : VRSQRTSSX+ VEX.SX.F3.0F ^52 ; : VRCPSSX+ VEX.SX.F3.0F ^53 ; 861 | : ANDPSX< OPL ^0F ^54 ; : ANDNPSX< OPL ^0F ^55 ; 862 | : VANDPSX+ VEX.SX.NP.0F ^54 ; : VANDNPSX+ VEX.SX.NP.0F ^55 ; 863 | : VANDPSY+ VEX.SY.NP.0F ^54 ; : VANDNPSY+ VEX.SY.NP.0F ^55 ; 864 | : VANDPSZ+ EVEX.SZ.NP.0F ^54 ; : VANDNPSZ+ EVEX.SZ.NP.0F ^55 ; 865 | : ANDPDX< ^66 OPL ^0F ^54 ; : ANDNPDX< ^66 OPL ^0F ^55 ; 866 | : VANDPDX+ VEX.DX.66.0F ^54 ; : VANDNPDX+ VEX.DX.66.0F ^55 ; 867 | : VANDPDY+ VEX.DY.66.0F ^54 ; : VANDNPDY+ VEX.DY.66.0F ^55 ; 868 | : VANDPDZ+ EVEX.DZ.66.0F ^54 ; : VANDNPDZ+ EVEX.DZ.66.0F ^55 ; 869 | : ORPSX< OPL ^0F ^56 ; : XORPSX< OPL ^0F ^57 ; 870 | : VORPSX+ VEX.SX.NP.0F ^56 ; : VXORPSX+ VEX.SX.NP.0F ^57 ; 871 | : VORPSY+ VEX.SY.NP.0F ^56 ; : VXORPSY+ VEX.SY.NP.0F ^57 ; 872 | : VORPSZ+ EVEX.SZ.NP.0F ^56 ; : VXORPSZ+ EVEX.SZ.NP.0F ^57 ; 873 | : ORPDX< ^66 OPL ^0F ^56 ; : XORPDX< ^66 OPL ^0F ^57 ; 874 | : VORPDX+ VEX.DX.66.0F ^56 ; : VXORPDX+ VEX.DX.66.0F ^57 ; 875 | : VORPDY+ VEX.DY.66.0F ^56 ; : VXORPDY+ VEX.DY.66.0F ^57 ; 876 | : VORPDZ+ EVEX.DZ.66.0F ^56 ; : VXORPDZ+ EVEX.DZ.66.0F ^57 ; 877 | : ADDPSX< OPL ^0F ^58 ; : MULPSX< OPL ^0F ^59 ; 878 | : VADDPSX+ VEX.SX.NP.0F ^58 ; : VMULPSX+ VEX.SX.NP.0F ^59 ; 879 | : VADDPSY+ VEX.SY.NP.0F ^58 ; : VMULPSY+ VEX.SY.NP.0F ^59 ; 880 | : VADDPSZ+ EVEX.SZ.NP.0F ^58 ; : VMULPSZ+ EVEX.SZ.NP.0F ^59 ; 881 | : ADDPDX< ^66 OPL ^0F ^58 ; : MULPDX< ^66 OPL ^0F ^59 ; 882 | : VADDPDX+ VEX.DX.66.0F ^58 ; : VMULPDX+ VEX.DX.66.0F ^59 ; 883 | : VADDPDY+ VEX.DY.66.0F ^58 ; : VMULPDY+ VEX.DY.66.0F ^59 ; 884 | : VADDPDZ+ EVEX.DZ.66.0F ^58 ; : VMULPDZ+ EVEX.DZ.66.0F ^59 ; 885 | : ADDSSX< ^F3 OPL ^0F ^58 ; : MULSSX< ^F3 OPL ^0F ^59 ; 886 | : VADDSSX+ VEX.SX.F3.0F ^58 ; : VMULSSX+ VEX.SX.F3.0F ^59 ; 887 | : ADDSDX< ^F2 OPL ^0F ^58 ; : MULSDX< ^F2 OPL ^0F ^59 ; 888 | : VADDSDX+ VEX.DX.F2.0F ^58 ; : VMULSDX+ VEX.DX.F2.0F ^59 ; 889 | : CVTPS2PDX< OPL ^0F ^5A ; : CVTDQ2PSX< OPL ^0F ^5B ; 890 | : VCVTPS2PDX< VEX.SX.NP.0F ^5A ; : VCVTDQ2PSX< VEX.SX.NP.0F ^5B ; 891 | : VCVTPS2PDY< VEX.SY.NP.0F ^5A ; : VCVTDQ2PSY< VEX.SY.NP.0F ^5B ; 892 | : VCVTPS2PDZ< EVEX.SZ.NP.0F ^5A ; : VCVTDQ2PSZ< EVEX.SZ.NP.0F ^5B ; 893 | : CVTPD2PSX< ^66 OPL ^0F ^5A ; : CVTPS2DQX< ^66 OPL ^0F ^5B ; 894 | : VCVTPD2PSX< VEX.DX.66.0F ^5A ; : VCVTPS2DQX< VEX.SX.66.0F ^5B ; 895 | : VCVTPD2PSY< VEX.DY.66.0F ^5A ; : VCVTPS2DQY< VEX.SY.66.0F ^5B ; 896 | : VCVTPD2PSZ< EVEX.DZ.66.0F ^5A ; : VCVTPS2DQZ< EVEX.SZ.66.0F ^5B ; 897 | : CVTSS2SDX< ^F3 OPL ^0F ^5A ; : CVTTPS2DQX< ^F3 OPL ^0F ^5B ; 898 | : VCVTSS2SDX+ VEX.SX.F3.0F ^5A ; : VCVTTPS2DQX< VEX.SX.F3.0F ^5B ; 899 | : VCVTTPS2DQY< VEX.SY.F3.0F ^5B ; 900 | : VCVTTPS2DQZ< EVEX.SZ.F3.0F ^5B ; 901 | : CVTSD2SSX< ^F2 OPL ^0F ^5A ; 902 | : VCVTSD2SSX+ VEX.DX.F2.0F ^5A ; 903 | : SUBPSX< OPL ^0F ^5C ; : MINPSX< OPL ^0F ^5D ; 904 | : VSUBPSX+ VEX.SX.NP.0F ^5C ; : VMINPSX+ VEX.SX.NP.0F ^5D ; 905 | : VSUBPSY+ VEX.SY.NP.0F ^5C ; : VMINPSY+ VEX.SY.NP.0F ^5D ; 906 | : VSUBPSZ+ EVEX.SZ.NP.0F ^5C ; : VMINPSZ+ EVEX.SZ.NP.0F ^5D ; 907 | : SUBPDX< ^66 OPL ^0F ^5C ; : MINPDX< ^66 OPL ^0F ^5D ; 908 | : VSUBPDX+ VEX.DX.66.0F ^5C ; : VMINPDX+ VEX.DX.66.0F ^5D ; 909 | : VSUBPDY+ VEX.DY.66.0F ^5C ; : VMINPDY+ VEX.DY.66.0F ^5D ; 910 | : VSUBPDZ+ EVEX.DZ.66.0F ^5C ; : VMINPDZ+ EVEX.DZ.66.0F ^5D ; 911 | : SUBSSX< ^F3 OPL ^0F ^5C ; : MINSSX< ^F3 OPL ^0F ^5D ; 912 | : VSUBSSX+ VEX.SX.F3.0F ^5C ; : VMINSSX+ VEX.SX.F3.0F ^5D ; 913 | : SUBSDX< ^F2 OPL ^0F ^5C ; : MINSDX< ^F2 OPL ^0F ^5D ; 914 | : VSUBSDX+ VEX.DX.F2.0F ^5C ; : VMINSDX+ VEX.DX.F2.0F ^5D ; 915 | : DIVPSX< OPL ^0F ^5E ; : MAXPSX< OPL ^0F ^5F ; 916 | : VDIVPSX+ VEX.SX.NP.0F ^5E ; : VMAXPSX+ VEX.SX.NP.0F ^5F ; 917 | : VDIVPSY+ VEX.SY.NP.0F ^5E ; : VMAXPSY+ VEX.SY.NP.0F ^5F ; 918 | : VDIVPSZ+ EVEX.SZ.NP.0F ^5E ; : VMAXPSZ+ EVEX.SZ.NP.0F ^5F ; 919 | : DIVPDX< ^66 OPL ^0F ^5E ; : MAXPDX< ^66 OPL ^0F ^5F ; 920 | : VDIVPDX+ VEX.DX.66.0F ^5E ; : VMAXPDX+ VEX.DX.66.0F ^5F ; 921 | : VDIVPDY+ VEX.DY.66.0F ^5E ; : VMAXPDY+ VEX.DY.66.0F ^5F ; 922 | : VDIVPDZ+ EVEX.DZ.66.0F ^5E ; : VMAXPDZ+ EVEX.DZ.66.0F ^5F ; 923 | : DIVSSX< ^F3 OPL ^0F ^5E ; : MAXSSX< ^F3 OPL ^0F ^5F ; 924 | : VDIVSSX+ VEX.SX.F3.0F ^5E ; : VMAXSSX+ VEX.SX.F3.0F ^5F ; 925 | : DIVSDX< ^F2 OPL ^0F ^5E ; : MAXSDX< ^F2 OPL ^0F ^5F ; 926 | : VDIVSDX+ VEX.DX.F2.0F ^5E ; : VMAXSDX+ VEX.DX.F2.0F ^5F ; 927 | 928 | : PUNPCKLBWX< ^66 OPL ^0F ^60 ; : PUNPCKLWDX< ^66 OPL ^0F ^61 ; 929 | : VPUNPCKLBWX+ VEX.SX.66.0F ^60 ; : VPUNPCKLWDX+ VEX.SX.66.0F ^61 ; 930 | : VPUNPCKLBWY+ VEX.SY.66.0F ^60 ; : VPUNPCKLWDY+ VEX.SY.66.0F ^61 ; 931 | : VPUNPCKLBWZ+ EVEX.SZ.66.0F ^60 ; : VPUNPCKLWDZ+ EVEX.SZ.66.0F ^61 ; 932 | : PUNPCKLDQX< ^66 OPL ^0F ^62 ; : PACKSSWBX< ^66 OPL ^0F ^63 ; 933 | : VPUNPCKLDQX+ VEX.SX.66.0F ^62 ; : VPACKSSWBX+ VEX.SX.66.0F ^63 ; 934 | : VPUNPCKLDQY+ VEX.SY.66.0F ^62 ; : VPACKSSWBY+ VEX.SY.66.0F ^63 ; 935 | : VPUNPCKLDQZ+ EVEX.SZ.66.0F ^62 ; : VPACKSSWBZ+ EVEX.SZ.66.0F ^63 ; 936 | : PCMPGTBX< ^66 OPL ^0F ^64 ; : PCMPGTWX< ^66 OPL ^0F ^65 ; 937 | : VPCMPGTBX+ VEX.SX.66.0F ^64 ; : VPCMPGTWX+ VEX.SX.66.0F ^65 ; 938 | : VPCMPGTBY+ VEX.SY.66.0F ^64 ; : VPCMPGTWY+ VEX.SY.66.0F ^65 ; 939 | : VPCMPGTBZ+ EVEX.SZ.66.0F ^64 ; : VPCMPGTWZ+ EVEX.SZ.66.0F ^65 ; 940 | : PCMPGTDX< ^66 OPL ^0F ^66 ; : PACKUSWBX< ^66 OPL ^0F ^67 ; 941 | : VPCMPGTDX+ VEX.SX.66.0F ^66 ; : VPACKUSWBX+ VEX.SX.66.0F ^67 ; 942 | : VPCMPGTDY+ VEX.SY.66.0F ^66 ; : VPACKUSWBY+ VEX.SY.66.0F ^67 ; 943 | : VPCMPGTDZ+ EVEX.SZ.66.0F ^66 ; : VPACKUSWBZ+ EVEX.SZ.66.0F ^67 ; 944 | 945 | : PUNPCKHBWX< ^66 OPL ^0F ^68 ; : PUNPCKHWDX< ^66 OPL ^0F ^69 ; 946 | : VPUNPCKHBWX+ VEX.SX.66.0F ^68 ; : VPUNPCKHWDX+ VEX.SX.66.0F ^69 ; 947 | : VPUNPCKHBWY+ VEX.SY.66.0F ^68 ; : VPUNPCKHWDY+ VEX.SY.66.0F ^69 ; 948 | : VPUNPCKHBWZ+ EVEX.SZ.66.0F ^68 ; : VPUNPCKHWDZ+ EVEX.SZ.66.0F ^69 ; 949 | : PUNPCKHDQX< ^66 OPL ^0F ^6A ; : PACKSSDWX< ^66 OPL ^0F ^6B ; 950 | : VPUNPCKHDQX+ VEX.SX.66.0F ^6A ; : VPACKSSDWX+ VEX.SX.66.0F ^6B ; 951 | : VPUNPCKHDQY+ VEX.SY.66.0F ^6A ; : VPACKSSDWY+ VEX.SY.66.0F ^6B ; 952 | : VPUNPCKHDQZ+ EVEX.SZ.66.0F ^6A ; : VPACKSSDWZ+ EVEX.SZ.66.0F ^6B ; 953 | : PUNPCKLQDQX< ^66 OPL ^0F ^6C ; : PUNPCKHQDQX< ^66 OPL ^0F ^6D ; 954 | : VPUNPCKLQDQX+ VEX.DX.66.0F ^6C ; : VPUNPCKHQDQX< VEX.DX.66.0F ^6D ; 955 | : VPUNPCKLQDQY+ VEX.DY.66.0F ^6C ; : VPUNPCKHQDQY< VEX.DY.66.0F ^6D ; 956 | : VPUNPCKLQDQZ+ EVEX.DZ.66.0F ^6C ; : VPUNPCKHQDQZ< EVEX.DZ.66.0F ^6D ; 957 | 958 | : MOVXL< ^66 OPL ^0F ^6E ; : MOVDQAX< ^66 OPL ^0F ^6F ; 959 | : VMOVXL< VEX.SX.66.0F ^6E ; : VMOVDQA32X< VEX.SX.66.0F ^6F ; 960 | : VMOVDQA32Y< VEX.SY.66.0F ^6F ; 961 | : VMOVDQA32Z< EVEX.SZ.66.0F ^6F ; 962 | : MOVXQ< ^66 OPQ ^0F ^6E ; 963 | : VMOVXQ< VEX.DX.66.0F ^6E ; : VMOVDQA64X< VEX.DX.66.0F ^6F ; 964 | : VMOVDQA64Y< VEX.DY.66.0F ^6F ; 965 | : VMOVDQA64Z< EVEX.DZ.66.0F ^6F ; 966 | : MOVDQUX< ^F3 OPL ^0F ^6F ; 967 | : VMOVDQU32X< VEX.SX.F3.0F ^6F ; 968 | : VMOVDQU32Y< VEX.SY.F3.0F ^6F ; 969 | : VMOVDQU32Z< EVEX.SZ.F3.0F ^6F ; 970 | : VMOVDQU64X< VEX.DX.F3.0F ^6F ; 971 | : VMOVDQU64Y< VEX.DY.F3.0F ^6F ; 972 | : VMOVDQU64Z< EVEX.DZ.F3.0F ^6F ; 973 | : VMOVDQU8X< EVEX.SX.F2.0F ^6F ; 974 | : VMOVDQU8Y< EVEX.SY.F2.0F ^6F ; 975 | : VMOVDQU8Z< EVEX.SZ.F2.0F ^6F ; 976 | : VMOVDQU16X< EVEX.DX.F2.0F ^6F ; 977 | : VMOVDQU16Y< EVEX.DY.F2.0F ^6F ; 978 | : VMOVDQU16Z< EVEX.DZ.F2.0F ^6F ; 979 | 980 | : PSHUFDX<. ^66 OPL ^0F ^70 ; : PSRLWX#. ^66 OPL ^0F ^71 /2 ; 981 | : VPSHUFDX<. VEX.SX.66.0F ^70 ; : VPSRLWX+#. VEX.SX.66.0F ^71 /2 ; 982 | : VPSHUFDY<. VEX.SY.66.0F ^70 ; : VPSRLWY+#. VEX.SY.66.0F ^71 /2 ; 983 | : VPSHUFDZ<. EVEX.SZ.66.0F ^70 ; : VPSRLWZ+#. EVEX.SZ.66.0F ^71 /2 ; 984 | : PSRAWX#. ^66 OPL ^0F ^71 /4 ; 985 | : VPSRAWX+#. VEX.SX.66.0F ^71 /4 ; 986 | : VPSRAWY+#. VEX.SY.66.0F ^71 /4 ; 987 | : VPSRAWZ+#. EVEX.SZ.66.0F ^71 /4 ; 988 | : PSLLWX#. ^66 OPL ^0F ^71 /6 ; 989 | : VPSLLWX+#. VEX.SX.66.0F ^71 /6 ; 990 | : VPSLLWY+#. VEX.SY.66.0F ^71 /6 ; 991 | : VPSLLWZ+#. EVEX.SZ.66.0F ^71 /6 ; 992 | : PSHUFHWX<. ^F3 OPL ^0F ^70 ; 993 | : VPSHUFHWX<. VEX.SX.F3.0F ^70 ; 994 | : VPSHUFHWY<. VEX.SY.F3.0F ^70 ; 995 | : VPSHUFHWZ<. EVEX.SZ.F3.0F ^70 ; 996 | : PSHUFLWX<. ^F2 OPL ^0F ^70 ; 997 | : VPSHUFLWX<. VEX.SX.F2.0F ^70 ; 998 | : VPSHUFLWY<. VEX.SY.F2.0F ^70 ; 999 | : VPSHUFLWZ<. EVEX.SZ.F2.0F ^70 ; 1000 | : PSRLDX#. ^66 OPL ^0F ^72 /2 ; : PSRLQX#. ^66 OPL ^0F ^73 /2 ; 1001 | : VPSRLDX+#. VEX.SX.66.0F ^72 /2 ; : VPSRLQX+#. VEX.DX.66.0F ^73 /2 ; 1002 | : VPSRLDY+#. VEX.SY.66.0F ^72 /2 ; : VPSRLQY+#. VEX.DY.66.0F ^73 /2 ; 1003 | : VPSRLDZ+#. EVEX.SZ.66.0F ^72 /2 ; : VPSRLQZ+#. EVEX.DZ.66.0F ^73 /2 ; 1004 | : PSRLDQX#. ^66 OPL ^0F ^73 /3 ; 1005 | : VPSRLDQX+#. VEX.DX.66.0F ^73 /3 ; 1006 | : VPSRLDQY+#. VEX.DY.66.0F ^73 /3 ; 1007 | : VPSRLDQZ+#. EVEX.DZ.66.0F ^73 /3 ; 1008 | : PSRADX#. ^66 OPL ^0F ^72 /4 ; 1009 | : VPSRADX+#. VEX.SX.66.0F ^72 /4 ; : VPSRAQX+#. EVEX.DX.66.0F ^73 /4 ; 1010 | : VPSRADY+#. VEX.SY.66.0F ^72 /4 ; : VPSRAQY+#. EVEX.DY.66.0F ^73 /4 ; 1011 | : VPSRADZ+#. EVEX.SZ.66.0F ^72 /4 ; : VPSRAQZ+#. EVEX.DZ.66.0F ^73 /4 ; 1012 | : PSLLDX#. ^66 OPL ^0F ^72 /6 ; : PSLLQX#. ^66 OPL ^0F ^73 /6 ; 1013 | : VPSLLDX+#. VEX.SX.66.0F ^72 /6 ; : VPSLLQX+#. VEX.DX.66.0F ^73 /6 ; 1014 | : VPSLLDY+#. VEX.SY.66.0F ^72 /6 ; : VPSLLQY+#. VEX.DY.66.0F ^73 /6 ; 1015 | : VPSLLDZ+#. EVEX.SZ.66.0F ^72 /6 ; : VPSLLQZ+#. EVEX.DZ.66.0F ^73 /6 ; 1016 | : PSLLDQX#. ^66 OPL ^0F ^73 /7 ; 1017 | : VPSLLDQX+#. VEX.DX.66.0F ^73 /7 ; 1018 | : VPSLLDQY+#. VEX.DY.66.0F ^73 /7 ; 1019 | : VPSLLDQZ+#. EVEX.DZ.66.0F ^73 /7 ; 1020 | : PCMPEQBX< ^66 OPL ^0F ^74 ; : PCMPEQWX< ^66 OPL ^0F ^75 ; 1021 | : VPCMPEQBX+ VEX.SX.66.0F ^74 ; : VPCMPEQWX+ VEX.SX.66.0F ^75 ; 1022 | : VPCMPEQBY+ VEX.SY.66.0F ^74 ; : VPCMPEQWY+ VEX.SY.66.0F ^75 ; 1023 | : PCMPEQDX< ^66 OPL ^0F ^76 ; 1024 | : VPCMPEQDX+ VEX.SX.66.0F ^76 ; : VZEROUPPER VEX.SX.NP.0F ^77 ; 1025 | : VPCMPEQDY+ VEX.SY.66.0F ^76 ; : VZEROALL VEX.SY.NP.0F ^77 ; 1026 | 1027 | : HADDPDX< ^66 OPL ^0F ^7C ; : HSUBPDX< ^66 OPL ^0F ^7D ; 1028 | : VHADDPDX+ VEX.SX.66.0F ^7C ; : VHSUBPDX+ VEX.SX.66.0F ^7D ; 1029 | : VHADDPDY+ VEX.SY.66.0F ^7C ; : VHSUBPDY+ VEX.SY.66.0F ^7D ; 1030 | : HADDPSX< ^F2 OPL ^0F ^7C ; : HSUBPSX< ^F2 OPL ^0F ^7D ; 1031 | : VHADDPSX+ VEX.SX.F2.0F ^7C ; : VHSUBPSX+ VEX.SX.F2.0F ^7D ; 1032 | : VHADDPSY+ VEX.SY.F2.0F ^7C ; : VHSUBPSY+ VEX.SY.F2.0F ^7D ; 1033 | 1034 | : MOVXL> ^66 OPL ^0F ^7E ; : MOVDQAX> ^66 OPL ^0F ^7F ; 1035 | : MOVXQ> ^66 OPQ ^0F ^7E ; : VMOVDQAX> VEX.SX.66.0F ^7F ; 1036 | : VMOVXL> VEX.SX.66.0F ^7E ; : VMOVDQAY> VEX.SY.66.0F ^7F ; 1037 | : VMOVYL> VEX.SY.66.0F ^7E ; : MOVDQUX> ^F3 OPL ^0F ^7F ; 1038 | : VMOVXQ> VEX.DX.66.0F ^7E ; : VMOVDQUX> VEX.SX.F3.0F ^7F ; 1039 | : VMOVYQ> VEX.DX.66.0F ^7E ; : VMOVDQUY> VEX.SY.F3.0F ^7F ; 1040 | : MOVQXX< ^F3 OPL ^0F ^7E ; 1041 | : VMOVQXX< VEX.SX.F3.0F ^7E ; 1042 | 1043 | : CMPPSX<. OPL ^0F ^C2 ; 1044 | : VCMPPSX+. VEX.SX.NP.0F ^C2 ; 1045 | : VCMPPSY+. VEX.SY.NP.0F ^C2 ; 1046 | : CMPPDX<. ^66 OPL ^0F ^C2 ; 1047 | : VCMPPDX+. VEX.SX.66.0F ^C2 ; 1048 | : VCMPPDY+. VEX.SY.66.0F ^C2 ; 1049 | : CMPSSX<. ^F3 OPL ^0F ^C2 ; 1050 | : VCMPSSX+. VEX.SX.F3.0F ^C2 ; 1051 | : CMPSDX<. ^F2 OPL ^0F ^C2 ; 1052 | : VCMPSDX+. VEX.SX.F2.0F ^C2 ; 1053 | 1054 | : PINSRXW<. ^66 OPL ^0F ^C4 ; : PEXTRWX<. ^66 OPL ^0F ^C5 ; 1055 | : VPINSRXW+. VEX.SX.66.0F ^C4 ; : VPEXTRWX<. VEX.SX.66.0F ^C5 ; 1056 | 1057 | : SHUFPSX<. OPL ^0F ^C6 ; 1058 | : VSHUFPSX+. VEX.SX.NP.0F ^C6 ; 1059 | : VSHUFPSY+. VEX.SY.NP.0F ^C6 ; 1060 | : SHUFPDX<. ^66 OPL ^0F ^C6 ; 1061 | : VSHUFPDX+. VEX.SX.66.0F ^C6 ; 1062 | : VSHUFPDY+. VEX.SY.66.0F ^C6 ; 1063 | 1064 | : ADDSUBPDX< ^66 OPL ^0F ^D0 ; : PSRLWX< ^66 OPL ^0F ^D1 ; 1065 | : VADDSUBPDX+ VEX.SX.66.0F ^D0 ; : VPSRLWX+ VEX.SX.66.0F ^D1 ; 1066 | : VADDSUBPDY+ VEX.SY.66.0F ^D0 ; : VPSRLWY+ VEX.SY.66.0F ^D1 ; 1067 | : ADDSUBPSX< ^F2 OPL ^0F ^D0 ; 1068 | : VADDSUBPSX+ VEX.SX.F2.0F ^D0 ; 1069 | : VADDSUBPSY+ VEX.SY.F2.0F ^D0 ; 1070 | 1071 | : PSRLDX< ^66 OPL ^0F ^D2 ; : PSRLQX< ^66 OPL ^0F ^D3 ; 1072 | : VPSRLDX+ VEX.SX.66.0F ^D2 ; : VPSRLQX+ VEX.SX.66.0F ^D3 ; 1073 | : VPSRLDY+ VEX.SY.66.0F ^D2 ; : VPSRLQY+ VEX.SY.66.0F ^D3 ; 1074 | 1075 | : PADDQX< ^66 OPL ^0F ^D4 ; : PMULLWX< ^66 OPL ^0F ^D5 ; 1076 | : VPADDQX+ VEX.SX.66.0F ^D4 ; : VPMULLWX+ VEX.SX.66.0F ^D5 ; 1077 | : VPADDQY+ VEX.SY.66.0F ^D4 ; : VPMULLWY+ VEX.SY.66.0F ^D5 ; 1078 | 1079 | : MOVQXX> ^66 OPL ^0F ^D6 ; : PMOVMSKBX< ^66 OPL ^0F ^D7 ; 1080 | : VMOVQXX> VEX.SX.66.0F ^D6 ; : VPMOVMSKBX< VEX.SX.66.0F ^D7 ; 1081 | : VPMOVMSKBY< VEX.SY.66.0F ^D7 ; 1082 | 1083 | : PSUBUSBX< ^66 OPL ^0F ^D8 ; : PSUBUSWX< ^66 OPL ^0F ^D9 ; 1084 | : VPSUBUSBX+ VEX.SX.66.0F ^D8 ; : VPSUBUSWX+ VEX.SX.66.0F ^D9 ; 1085 | : VPSUBUSBY+ VEX.SY.66.0F ^D8 ; : VPSUBUSWY+ VEX.SY.66.0F ^D9 ; 1086 | 1087 | : PMINUBX< ^66 OPL ^0F ^DA ; : PANDX< ^66 OPL ^0F ^DB ; 1088 | : VPMINUBX+ VEX.SX.66.0F ^DA ; : VPANDX+ VEX.SX.66.0F ^DB ; 1089 | : VPMINUBY+ VEX.SY.66.0F ^DA ; : VPANDY+ VEX.SY.66.0F ^DB ; 1090 | 1091 | : PADDUSBX< ^66 OPL ^0F ^DC ; : PADDUSWX< ^66 OPL ^0F ^DD ; 1092 | : VPADDUSBX+ VEX.SX.66.0F ^DC ; : VPADDUSWX+ VEX.SX.66.0F ^DD ; 1093 | : VPADDUSBY+ VEX.SY.66.0F ^DC ; : VPADDUSWY+ VEX.SY.66.0F ^DD ; 1094 | 1095 | : PMAXUBX< ^66 OPL ^0F ^DE ; : PANDNX< ^66 OPL ^0F ^DF ; 1096 | : VPMAXUBX+ VEX.SX.66.0F ^DE ; : VPANDNX+ VEX.SX.66.0F ^DF ; 1097 | : VPMAXUBY+ VEX.SY.66.0F ^DE ; : VPANDNY+ VEX.SY.66.0F ^DF ; 1098 | 1099 | : PAVGBX< ^66 OPL ^0F ^E0 ; : PSRAWX< ^66 OPL ^0F ^E1 ; 1100 | : VPAVGBX+ VEX.SX.66.0F ^E0 ; : VPSRAWX+ VEX.SX.66.0F ^E1 ; 1101 | : VPAVGBY+ VEX.SY.66.0F ^E0 ; : VPSRAWY+ VEX.SY.66.0F ^E1 ; 1102 | 1103 | : PSRADX< ^66 OPL ^0F ^E2 ; : PAVGWX< ^66 OPL ^0F ^E3 ; 1104 | : VPSRADX+ VEX.SX.66.0F ^E2 ; : VPAVGWX+ VEX.SX.66.0F ^E3 ; 1105 | : VPSRADY+ VEX.SY.66.0F ^E2 ; : VPAVGWY+ VEX.SY.66.0F ^E3 ; 1106 | 1107 | : PMULHUWX< ^66 OPL ^0F ^E4 ; : PMULHWX< ^66 OPL ^0F ^E5 ; 1108 | : VPMULHUWX+ VEX.SX.66.0F ^E4 ; : VPMULHWX+ VEX.SX.66.0F ^E5 ; 1109 | : VPMULHUWY+ VEX.SY.66.0F ^E4 ; : VPMULHWY+ VEX.SY.66.0F ^E5 ; 1110 | 1111 | : PCVTTPD2DQX< ^66 OPL ^0F ^E6 ; : MOVNTDQXM> ^66 OPL ^0F ^E7 ; 1112 | : VPCVTTPD2DQX< VEX.SX.66.0F ^E6 ; : VMOVNTDQXM> VEX.SX.66.0F ^E7 ; 1113 | : VPCVTTPD2DQY< VEX.SY.66.0F ^E6 ; : VMOVNTDQYM> VEX.SY.66.0F ^E7 ; 1114 | : PCVTDQ2PDX< ^F3 OPL ^0F ^E6 ; 1115 | : VPCVTDQ2PDX< VEX.SX.F3.0F ^E6 ; 1116 | : VPCVTDQ2PDY< VEX.SY.F3.0F ^E6 ; 1117 | : PCVTPD2DQX< ^F2 OPL ^0F ^E6 ; 1118 | : VPCVTPD2DQX< VEX.SX.F2.0F ^E6 ; 1119 | : VPCVTPD2DQY< VEX.SY.F2.0F ^E6 ; 1120 | 1121 | : PSUBSBX< ^66 OPL ^0F ^E8 ; : PSUBSWX< ^66 OPL ^0F ^E9 ; 1122 | : VPSUBSBX+ VEX.SX.66.0F ^E8 ; : VPSUBSWX+ VEX.SX.66.0F ^E9 ; 1123 | : VPSUBSBY+ VEX.SY.66.0F ^E8 ; : VPSUBSWY+ VEX.SY.66.0F ^E9 ; 1124 | 1125 | : PMINSWX< ^66 OPL ^0F ^EA ; : PORX< ^66 OPL ^0F ^EB ; 1126 | : VPMINSWX+ VEX.SX.66.0F ^EA ; : VPORX+ VEX.SX.66.0F ^EB ; 1127 | : VPMINSWY+ VEX.SY.66.0F ^EA ; : VPORY+ VEX.SY.66.0F ^EB ; 1128 | 1129 | : PADDSBX< ^66 OPL ^0F ^EC ; : PADDSWX< ^66 OPL ^0F ^ED ; 1130 | : VPADDSBX+ VEX.SX.66.0F ^EC ; : VPADDSWX+ VEX.SX.66.0F ^ED ; 1131 | : VPADDSBY+ VEX.SY.66.0F ^EC ; : VPADDSWY+ VEX.SY.66.0F ^ED ; 1132 | 1133 | : PMAXSWX< ^66 OPL ^0F ^EE ; : PXORX< ^66 OPL ^0F ^EF ; 1134 | : VPMAXSWX+ VEX.SX.66.0F ^EE ; : VPXORX+ VEX.SX.66.0F ^EF ; 1135 | : VPMAXSWY+ VEX.SY.66.0F ^EE ; : VPXORY+ VEX.SY.66.0F ^EF ; 1136 | 1137 | : LDDQUXM< ^F2 OPL ^0F ^F0 ; : PSLLWX< ^66 OPL ^0F ^F1 ; 1138 | : VLDDQUXM< VEX.SX.F2.0F ^F0 ; : VPSLLWX+ VEX.SX.66.0F ^F1 ; 1139 | : VLDDQUYM< VEX.SY.F2.0F ^F0 ; : VPSLLWY+ VEX.SY.66.0F ^F1 ; 1140 | 1141 | : PSLLDX< ^66 OPL ^0F ^F2 ; : PSLLQX< ^66 OPL ^0F ^F3 ; 1142 | : VPSLLDX+ VEX.SX.66.0F ^F2 ; : VPSLLQX+ VEX.SX.66.0F ^F3 ; 1143 | : VPSLLDY+ VEX.SY.66.0F ^F2 ; : VPSLLQY+ VEX.SY.66.0F ^F3 ; 1144 | 1145 | : PMULUDQX< ^66 OPL ^0F ^F4 ; : PMADDWDX< ^66 OPL ^0F ^F5 ; 1146 | : VPMULUDQX+ VEX.SX.66.0F ^F4 ; : VPMADDWDX+ VEX.SX.66.0F ^F5 ; 1147 | : VPMULUDQY+ VEX.SY.66.0F ^F4 ; : VPMADDWDY+ VEX.SY.66.0F ^F5 ; 1148 | 1149 | : PSADBWX< ^66 OPL ^0F ^F6 ; : MASKMOVDQU< ^66 OPL ^0F ^F7 ; 1150 | : VPSADBWX+ VEX.SX.66.0F ^F6 ; : VMASKMOVDQU< VEX.SX.66.0F ^F7 ; 1151 | : VPSADBWY+ VEX.SY.66.0F ^F6 ; 1152 | 1153 | : PSUBBX< ^66 OPL ^0F ^F8 ; : PSUBWX< ^66 OPL ^0F ^F9 ; 1154 | : VPSUBBX+ VEX.SX.66.0F ^F8 ; : VPSUBWX+ VEX.SX.66.0F ^F9 ; 1155 | : VPSUBBY+ VEX.SY.66.0F ^F8 ; : VPSUBWY+ VEX.SY.66.0F ^F9 ; 1156 | 1157 | : PSUBDX< ^66 OPL ^0F ^FA ; : PSUBQX< ^66 OPL ^0F ^FB ; 1158 | : VPSUBDX+ VEX.SX.66.0F ^FA ; : VPSUBQX+ VEX.SX.66.0F ^FB ; 1159 | : VPSUBDY+ VEX.SY.66.0F ^FA ; : VPSUBQY+ VEX.SY.66.0F ^FB ; 1160 | 1161 | : PADDBX< ^66 OPL ^0F ^FC ; : PADDWX< ^66 OPL ^0F ^FD ; 1162 | : VPADDBX+ VEX.SX.66.0F ^FC ; : VPADDWX+ VEX.SX.66.0F ^FD ; 1163 | : VPADDBY+ VEX.SY.66.0F ^FC ; : VPADDWY+ VEX.SY.66.0F ^FD ; 1164 | 1165 | : PADDDX< ^66 OPL ^0F ^FE ; 1166 | : VPADDDX+ VEX.SX.66.0F ^FE ; 1167 | : VPADDDY+ VEX.SY.66.0F ^FE ; 1168 | 1169 | : PSHUFBX< ^66 OPL ^0F ^38 ^00 ; : PHADDWX< ^66 OPL ^0F ^38 ^01 ; 1170 | : VPSHUFBX+ VEX.SX.66.0F38 ^00 ; : VPHADDWX+ VEX.SX.66.0F38 ^01 ; 1171 | : VPSHUFBY+ VEX.SY.66.0F38 ^00 ; : VPHADDWY+ VEX.SY.66.0F38 ^01 ; 1172 | 1173 | : PHADDDX< ^66 OPL ^0F ^38 ^02 ; : PHADDSWX< ^66 OPL ^0F ^38 ^03 ; 1174 | : VPHADDDX+ VEX.SX.66.0F38 ^02 ; : VPHADDSWX+ VEX.SX.66.0F38 ^03 ; 1175 | : VPHADDDY+ VEX.SY.66.0F38 ^02 ; : VPHADDSWY+ VEX.SY.66.0F38 ^03 ; 1176 | 1177 | : PMADDUBSX< ^66 OPL ^0F ^38 ^04 ; : PHSUBWX< ^66 OPL ^0F ^38 ^05 ; 1178 | : VPMADDUBSX+ VEX.SX.66.0F38 ^04 ; : VPHSUBWX+ VEX.SX.66.0F38 ^05 ; 1179 | : VPMADDUBSY+ VEX.SY.66.0F38 ^04 ; : VPHSUBWY+ VEX.SY.66.0F38 ^05 ; 1180 | 1181 | : PHSUBDX< ^66 OPL ^0F ^38 ^06 ; : PHSUBSWX< ^66 OPL ^0F ^38 ^07 ; 1182 | : VPHSUBDX+ VEX.SX.66.0F38 ^06 ; : VPHSUBSWX+ VEX.SX.66.0F38 ^07 ; 1183 | : VPHSUBDY+ VEX.SY.66.0F38 ^06 ; : VPHSUBSWY+ VEX.SY.66.0F38 ^07 ; 1184 | 1185 | : PSIGNBX< ^66 OPL ^0F ^38 ^08 ; : PSIGNWX< ^66 OPL ^0F ^38 ^09 ; 1186 | : VPSIGNBX+ VEX.SX.66.0F38 ^08 ; : VPSIGNWX+ VEX.SX.66.0F38 ^09 ; 1187 | : VPSIGNBY+ VEX.SY.66.0F38 ^08 ; : VPSIGNWY+ VEX.SY.66.0F38 ^09 ; 1188 | 1189 | : PSIGNDX< ^66 OPL ^0F ^38 ^0A ; : PMULHRSWX< ^66 OPL ^0F ^38 ^0B ; 1190 | : VPSIGNDX+ VEX.SX.66.0F38 ^0A ; : VPMULHRSWX+ VEX.SX.66.0F38 ^0B ; 1191 | : VPSIGNDY+ VEX.SY.66.0F38 ^0A ; : VPMULHRSWY+ VEX.SY.66.0F38 ^0B ; 1192 | 1193 | : VPERMILPSX+ VEX.SX.66.0F38 ^0C ; : VPERMILPDX+ VEX.SX.66.0F38 ^0D ; 1194 | : VPERMILPSY+ VEX.SY.66.0F38 ^0C ; : VPERMILPDY+ VEX.SY.66.0F38 ^0D ; 1195 | 1196 | : VTESTPSX< VEX.SX.66.0F38 ^0E ; : VTESTPDX< VEX.SX.66.0F38 ^0F ; 1197 | : VTESTPSY< VEX.SY.66.0F38 ^0E ; : VTESTPDY< VEX.SY.66.0F38 ^0F ; 1198 | 1199 | : PBLENDVBX< ^66 OPL ^0F ^38 ^10 ; : VCVTPH2PSX< VEX.SX.66.0F38 ^13 ; 1200 | : VCVTPH2PSY< VEX.SY.66.0F38 ^13 ; 1201 | 1202 | : BLENDVPSX< ^66 OPL ^0F ^38 ^14 ; : BLENDVPDX< ^66 OPL ^0F ^38 ^15 ; 1203 | 1204 | : PTESTX< ^66 OPL ^0F ^38 ^17 ; 1205 | : VPTESTX< VEX.SX.66.0F38 ^17 ; 1206 | : VPERMPSY+ VEX.SY.66.0F38 ^16 ; : VPTESTY< VEX.SY.66.0F38 ^17 ; 1207 | 1208 | : VBROADCASTSSX< VEX.SX.66.0F38 ^18 ; 1209 | : VBROADCASTSSY< VEX.SY.66.0F38 ^18 ; : VBROADCASTSDY< VEX.SY.66.0F38 ^19 ; 1210 | 1211 | : VBROADCASTF128YM< VEX.SY.66.0F38 ^1A ; 1212 | 1213 | : PABSBX< ^66 OPL ^0F ^38 ^1C ; : PABSWX< ^66 OPL ^0F ^38 ^1D ; 1214 | : VPABSBX< VEX.SX.66.0F38 ^1C ; : VPABSWX< VEX.SX.66.0F38 ^1D ; 1215 | : VPABSBY< VEX.SY.66.0F38 ^1C ; : VPABSWY< VEX.SY.66.0F38 ^1D ; 1216 | 1217 | : PABSDX< ^66 OPL ^0F ^38 ^1E ; 1218 | : VPABSDX< VEX.SX.66.0F38 ^1E ; 1219 | : VPABSDY< VEX.SY.66.0F38 ^1E ; 1220 | 1221 | : PMOVSXBWX< ^66 OPL ^0F ^38 ^20 ; : PMOVSXBDX< ^66 OPL ^0F ^38 ^21 ; 1222 | : VPMOVSXBWX< VEX.SX.66.0F38 ^20 ; : VPMOVSXBDX< VEX.SX.66.0F38 ^21 ; 1223 | : VPMOVSXBWY< VEX.SY.66.0F38 ^20 ; : VPMOVSXBDY< VEX.SY.66.0F38 ^21 ; 1224 | : PMOVSXBQX< ^66 OPL ^0F ^38 ^22 ; : PMOVSXWDX< ^66 OPL ^0F ^38 ^23 ; 1225 | : VPMOVSXBQX< VEX.SX.66.0F38 ^22 ; : VPMOVSXWDX< VEX.SX.66.0F38 ^23 ; 1226 | : VPMOVSXBQY< VEX.SY.66.0F38 ^22 ; : VPMOVSXWDY< VEX.SY.66.0F38 ^23 ; 1227 | : PMOVSXWQX< ^66 OPL ^0F ^38 ^24 ; : PMOVSXDQX< ^66 OPL ^0F ^38 ^25 ; 1228 | : VPMOVSXWQX< VEX.SX.66.0F38 ^24 ; : VPMOVSXDQX< VEX.SX.66.0F38 ^25 ; 1229 | : VPMOVSXWQY< VEX.SY.66.0F38 ^24 ; : VPMOVSXDQY< VEX.SY.66.0F38 ^25 ; 1230 | : PMULDQX< ^66 OPL ^0F ^38 ^28 ; : PCMPEQQX< ^66 OPL ^0F ^38 ^29 ; 1231 | : VPMULDQX+ VEX.SX.66.0F38 ^28 ; : VPCMPEQQX+ VEX.SX.66.0F38 ^29 ; 1232 | : VPMULDQY+ VEX.SY.66.0F38 ^28 ; : VPCMPEQQY+ VEX.SY.66.0F38 ^29 ; 1233 | : MOVNTDQAX< ^66 OPL ^0F ^38 ^2A ; : PACKUSDWX< ^66 OPL ^0F ^39 ^2B ; 1234 | : VMOVNTDQAX< VEX.SX.66.0F38 ^2A ; : VPACKUSDWX+ VEX.SX.66.0F38 ^2B ; 1235 | : VMOVNTDQAY< VEX.SY.66.0F38 ^2A ; : VPACKUSDWY+ VEX.SY.66.0F38 ^2B ; 1236 | : VMASKMOVPSX+ VEX.SX.66.0F38 ^2C ; : VMASKMOVPDX+ VEX.SX.66.0F38 ^2D ; 1237 | : VMASKMOVPSY+ VEX.SY.66.0F38 ^2C ; : VMASKMOVPDY+ VEX.SY.66.0F38 ^2D ; 1238 | : VMASKMOVPSX+> VEX.SX.66.0F38 ^2E ; : VMASKMOVPDX+> VEX.SX.66.0F38 ^2F ; 1239 | : VMASKMOVPSY+> VEX.SY.66.0F38 ^2E ; : VMASKMOVPDY+> VEX.SY.66.0F38 ^2F ; 1240 | : PMOVZXBWX< ^66 OPL ^0F ^38 ^30 ; : PMOVZXBDX< ^66 OPL ^0F ^38 ^31 ; 1241 | : VPMOVZXBWX< VEX.SX.66.0F38 ^30 ; : VPMOVZXBDX< VEX.SX.66.0F38 ^31 ; 1242 | : VPMOVZXBWY< VEX.SY.66.0F38 ^30 ; : VPMOVZXBDY< VEX.SY.66.0F38 ^31 ; 1243 | : PMOVZXBQX< ^66 OPL ^0F ^38 ^32 ; : PMOVZXWDX< ^66 OPL ^0F ^38 ^33 ; 1244 | : VPMOVZXBQX< VEX.SX.66.0F38 ^32 ; : VPMOVZXWDX< VEX.SX.66.0F38 ^33 ; 1245 | : VPMOVZXBQY< VEX.SY.66.0F38 ^32 ; : VPMOVZXWDY< VEX.SY.66.0F38 ^33 ; 1246 | : PMOVZXWQX< ^66 OPL ^0F ^38 ^34 ; : PMOVZXDQX< ^66 OPL ^0F ^38 ^35 ; 1247 | : VPMOVZXWQX< VEX.SX.66.0F38 ^34 ; : VPMOVZXDQX< VEX.SX.66.0F38 ^35 ; 1248 | : VPMOVZXWQY< VEX.SY.66.0F38 ^34 ; : VPMOVZXDQY< VEX.SY.66.0F38 ^35 ; 1249 | : PCMPGTQX< ^66 OPL ^0F ^38 ^37 ; 1250 | : VPCMPGTQX+ VEX.SX.66.0F38 ^37 ; 1251 | : VPERMDY+ VEX.SY.66.0F38 ^36 ; : VPCMPGTQY+ VEX.SY.66.0F38 ^37 ; 1252 | : PMINSBX< ^66 OPL ^0F ^38 ^38 ; : PMINSDX< ^66 OPL ^0F ^38 ^39 ; 1253 | : VPMINSBX+ VEX.SX.66.0F38 ^38 ; : VPMINSDX+ VEX.SX.66.0F38 ^39 ; 1254 | : VPMINSBY+ VEX.SY.66.0F38 ^38 ; : VPMINSBY+ VEX.SY.66.0F38 ^39 ; 1255 | : PMINUWX< ^66 OPL ^0F ^38 ^3A ; : PMINUDX< ^66 OPL ^0F ^38 ^3B ; 1256 | : VPMINUWX+ VEX.SX.66.0F38 ^3A ; : VPMINUDX+ VEX.SX.66.0F38 ^3B ; 1257 | : VPMINUWY+ VEX.SY.66.0F38 ^3A ; : VPMINUDY+ VEX.SY.66.0F38 ^3B ; 1258 | : PMAXSBX< ^66 OPL ^0F ^38 ^3C ; : PMAXSDX< ^66 OPL ^0F ^38 ^3D ; 1259 | : VPMAXSBX+ VEX.SX.66.0F38 ^3C ; : VPMAXSDX+ VEX.SX.66.0F38 ^3D ; 1260 | : VPMAXSBY+ VEX.SY.66.0F38 ^3C ; : VPMAXSBY+ VEX.SY.66.0F38 ^3D ; 1261 | : PMAXUWX< ^66 OPL ^0F ^38 ^3E ; : PMAXUDX< ^66 OPL ^0F ^38 ^3F ; 1262 | : VPMAXUWX+ VEX.SX.66.0F38 ^3E ; : VPMAXUDX+ VEX.SX.66.0F38 ^3F ; 1263 | : VPMAXUWY+ VEX.SY.66.0F38 ^3E ; : VPMAXUDY+ VEX.SY.66.0F38 ^3F ; 1264 | : PMULLDX< ^66 OPL ^0F ^38 ^40 ; : PHMINPOSUWX< ^66 OPL ^0F ^38 ^41 ; 1265 | : VPMULLDX+ VEX.SX.66.0F38 ^40 ; : VPHMINPOSUWX< VEX.SX.66.0F38 ^41 ; 1266 | : VPMULLDY+ VEX.SY.66.0F38 ^40 ; 1267 | : VPSRLVDX+ VEX.SX.66.0F38 ^45 ; 1268 | : VPSRLVDY+ VEX.SY.66.0F38 ^45 ; 1269 | : VPSRLVQX+ VEX.DX.66.0F38 ^45 ; 1270 | : VPSRLVQY+ VEX.DY.66.0F38 ^45 ; 1271 | : VPSRAVDX+ VEX.SX.66.0F38 ^46 ; : VPSLLVDX+ VEX.SX.66.0F38 ^47 ; 1272 | : VPSRAVDY+ VEX.SY.66.0F38 ^46 ; : VPSLLVDY+ VEX.SY.66.0F38 ^47 ; 1273 | : VPSLLVQX+ VEX.DX.66.0F38 ^47 ; 1274 | : VPSLLVQY+ VEX.DY.66.0F38 ^47 ; 1275 | 1276 | : VPMASKMOVDX+ VEX.SX.66.0F38 ^8C ; 1277 | : VPMASKMOVDY+ VEX.SY.66.0F38 ^8C ; 1278 | : VPMASKMOVQX+ VEX.DX.66.0F38 ^8C ; 1279 | : VPMASKMOVQY+ VEX.DY.66.0F38 ^8C ; 1280 | : VPMASKMOVDX+> VEX.SX.66.0F38 ^8E ; 1281 | : VPMASKMOVDY+> VEX.SY.66.0F38 ^8E ; 1282 | : VPMASKMOVQX+> VEX.DX.66.0F38 ^8E ; 1283 | : VPMASKMOVQY+> VEX.DY.66.0F38 ^8E ; 1284 | 1285 | : VPGATHERDDX+ VEX.SX.66.0F38 ^90 ; : VPGATHERQDX+ VEX.SX.66.0F38 ^91 ; 1286 | : VPGATHERDDY+ VEX.SY.66.0F38 ^90 ; : VPGATHERQDY+ VEX.SY.66.0F38 ^91 ; 1287 | : VPGATHERDQX+ VEX.DX.66.0F38 ^90 ; : VPGATHERQQX+ VEX.DX.66.0F38 ^91 ; 1288 | : VPGATHERDQY+ VEX.DY.66.0F38 ^90 ; : VPGATHERQQY+ VEX.DY.66.0F38 ^91 ; 1289 | : VGATHERDPSX+ VEX.SX.66.0F38 ^92 ; : VGATHERQPSX+ VEX.SX.66.0F38 ^93 ; 1290 | : VGATHERDPSY+ VEX.SY.66.0F38 ^92 ; : VGATHERQPSY+ VEX.SY.66.0F38 ^93 ; 1291 | : VGATHERDPDX+ VEX.DX.66.0F38 ^92 ; : VGATHERQPDX+ VEX.DX.66.0F38 ^93 ; 1292 | : VGATHERDPDY+ VEX.DY.66.0F38 ^92 ; : VGATHERQPDY+ VEX.DY.66.0F38 ^93 ; 1293 | 1294 | : VFMADDSUB132PSX+ VEX.SX.66.0F38 ^96 ; 1295 | : VFMADDSUB132PSY+ VEX.SY.66.0F38 ^96 ; 1296 | : VFMADDSUB132PDX+ VEX.DX.66.0F38 ^96 ; 1297 | : VFMADDSUB132PDY+ VEX.DY.66.0F38 ^96 ; 1298 | : VFMSUBADD132PSX+ VEX.SX.66.0F38 ^97 ; 1299 | : VFMSUBADD132PSY+ VEX.SY.66.0F38 ^97 ; 1300 | : VFMSUBADD132PDX+ VEX.DX.66.0F38 ^97 ; 1301 | : VFMSUBADD132PDY+ VEX.DY.66.0F38 ^97 ; 1302 | : VFMADD132PSX+ VEX.SX.66.0F38 ^98 ; 1303 | : VFMADD132PSY+ VEX.SY.66.0F38 ^98 ; 1304 | : VFMADD132PDX+ VEX.DX.66.0F38 ^98 ; 1305 | : VFMADD132PDY+ VEX.DY.66.0F38 ^98 ; 1306 | : VFMADD132SSX+ VEX.SX.66.0F38 ^99 ; 1307 | : VFMADD132SSY+ VEX.SY.66.0F38 ^99 ; 1308 | : VFMADD132SDX+ VEX.DX.66.0F38 ^99 ; 1309 | : VFMADD132SDY+ VEX.DY.66.0F38 ^99 ; 1310 | : VFMSUB132PSX+ VEX.SX.66.0F38 ^9A ; 1311 | : VFMSUB132PSY+ VEX.SY.66.0F38 ^9A ; 1312 | : VFMSUB132PDX+ VEX.DX.66.0F38 ^9A ; 1313 | : VFMSUB132PDY+ VEX.DY.66.0F38 ^9A ; 1314 | : VFMSUB132SSX+ VEX.SX.66.0F38 ^9B ; 1315 | : VFMSUB132SSY+ VEX.SY.66.0F38 ^9B ; 1316 | : VFMSUB132SDX+ VEX.DX.66.0F38 ^9B ; 1317 | : VFMSUB132SDY+ VEX.DY.66.0F38 ^9B ; 1318 | : VFNMADD132PSX+ VEX.SX.66.0F38 ^9C ; 1319 | : VFNMADD132PSY+ VEX.SY.66.0F38 ^9C ; 1320 | : VFNMADD132PDX+ VEX.DX.66.0F38 ^9C ; 1321 | : VFNMADD132PDY+ VEX.DY.66.0F38 ^9C ; 1322 | : VFNMADD132SSX+ VEX.SX.66.0F38 ^9D ; 1323 | : VFNMADD132SSY+ VEX.SY.66.0F38 ^9D ; 1324 | : VFNMADD132SDX+ VEX.DX.66.0F38 ^9D ; 1325 | : VFNMADD132SDY+ VEX.DY.66.0F38 ^9D ; 1326 | : VFNMSUB132PSX+ VEX.SX.66.0F38 ^9E ; 1327 | : VFNMSUB132PSY+ VEX.SY.66.0F38 ^9E ; 1328 | : VFNMSUB132PDX+ VEX.DX.66.0F38 ^9E ; 1329 | : VFNMSUB132PDY+ VEX.DY.66.0F38 ^9E ; 1330 | : VFNMSUB132SSX+ VEX.SX.66.0F38 ^9F ; 1331 | : VFNMSUB132SSY+ VEX.SY.66.0F38 ^9F ; 1332 | : VFNMSUB132SDX+ VEX.DX.66.0F38 ^9F ; 1333 | : VFNMSUB132SDY+ VEX.DY.66.0F38 ^9F ; 1334 | : VFMADDSUB213PSX+ VEX.SX.66.0F38 ^A6 ; 1335 | : VFMADDSUB213PSY+ VEX.SY.66.0F38 ^A6 ; 1336 | : VFMADDSUB213PDX+ VEX.DX.66.0F38 ^A6 ; 1337 | : VFMADDSUB213PDY+ VEX.DY.66.0F38 ^A6 ; 1338 | : VFMSUBADD213PSX+ VEX.SX.66.0F38 ^A7 ; 1339 | : VFMSUBADD213PSY+ VEX.SY.66.0F38 ^A7 ; 1340 | : VFMSUBADD213PDX+ VEX.DX.66.0F38 ^A7 ; 1341 | : VFMSUBADD213PDY+ VEX.DY.66.0F38 ^A7 ; 1342 | : VFMADD213PSX+ VEX.SX.66.0F38 ^A8 ; 1343 | : VFMADD213PSY+ VEX.SY.66.0F38 ^A8 ; 1344 | : VFMADD213PDX+ VEX.DX.66.0F38 ^A8 ; 1345 | : VFMADD213PDY+ VEX.DY.66.0F38 ^A8 ; 1346 | : VFMADD213SSX+ VEX.SX.66.0F38 ^A9 ; 1347 | : VFMADD213SSY+ VEX.SY.66.0F38 ^A9 ; 1348 | : VFMADD213SDX+ VEX.DX.66.0F38 ^A9 ; 1349 | : VFMADD213SDY+ VEX.DY.66.0F38 ^A9 ; 1350 | : VFMSUB213PSX+ VEX.SX.66.0F38 ^AA ; 1351 | : VFMSUB213PSY+ VEX.SY.66.0F38 ^AA ; 1352 | : VFMSUB213PDX+ VEX.DX.66.0F38 ^AA ; 1353 | : VFMSUB213PDY+ VEX.DY.66.0F38 ^AA ; 1354 | : VFMSUB213SSX+ VEX.SX.66.0F38 ^AB ; 1355 | : VFMSUB213SSY+ VEX.SY.66.0F38 ^AB ; 1356 | : VFMSUB213SDX+ VEX.DX.66.0F38 ^AB ; 1357 | : VFMSUB213SDY+ VEX.DY.66.0F38 ^AB ; 1358 | : VFNMADD213PSX+ VEX.SX.66.0F38 ^AC ; 1359 | : VFNMADD213PSY+ VEX.SY.66.0F38 ^AC ; 1360 | : VFNMADD213PDX+ VEX.DX.66.0F38 ^AC ; 1361 | : VFNMADD213PDY+ VEX.DY.66.0F38 ^AC ; 1362 | : VFNMADD213SSX+ VEX.SX.66.0F38 ^AD ; 1363 | : VFNMADD213SSY+ VEX.SY.66.0F38 ^AD ; 1364 | : VFNMADD213SDX+ VEX.DX.66.0F38 ^AD ; 1365 | : VFNMADD213SDY+ VEX.DY.66.0F38 ^AD ; 1366 | : VFNMSUB213PSX+ VEX.SX.66.0F38 ^AE ; 1367 | : VFNMSUB213PSY+ VEX.SY.66.0F38 ^AE ; 1368 | : VFNMSUB213PDX+ VEX.DX.66.0F38 ^AE ; 1369 | : VFNMSUB213PDY+ VEX.DY.66.0F38 ^AE ; 1370 | : VFNMSUB213SSX+ VEX.SX.66.0F38 ^AF ; 1371 | : VFNMSUB213SSY+ VEX.SY.66.0F38 ^AF ; 1372 | : VFNMSUB213SDX+ VEX.DX.66.0F38 ^AF ; 1373 | : VFNMSUB213SDY+ VEX.DY.66.0F38 ^AF ; 1374 | : VFMADDSUB231PSX+ VEX.SX.66.0F38 ^B6 ; 1375 | : VFMADDSUB231PSY+ VEX.SY.66.0F38 ^B6 ; 1376 | : VFMADDSUB231PDX+ VEX.DX.66.0F38 ^B6 ; 1377 | : VFMADDSUB231PDY+ VEX.DY.66.0F38 ^B6 ; 1378 | : VFMSUBADD231PSX+ VEX.SX.66.0F38 ^B7 ; 1379 | : VFMSUBADD231PSY+ VEX.SY.66.0F38 ^B7 ; 1380 | : VFMSUBADD231PDX+ VEX.DX.66.0F38 ^B7 ; 1381 | : VFMSUBADD231PDY+ VEX.DY.66.0F38 ^B7 ; 1382 | : VFMADD231PSX+ VEX.SX.66.0F38 ^B8 ; 1383 | : VFMADD231PSY+ VEX.SY.66.0F38 ^B8 ; 1384 | : VFMADD231PDX+ VEX.DX.66.0F38 ^B8 ; 1385 | : VFMADD231PDY+ VEX.DY.66.0F38 ^B8 ; 1386 | : VFMADD231SSX+ VEX.SX.66.0F38 ^B9 ; 1387 | : VFMADD231SSY+ VEX.SY.66.0F38 ^B9 ; 1388 | : VFMADD231SDX+ VEX.DX.66.0F38 ^B9 ; 1389 | : VFMADD231SDY+ VEX.DY.66.0F38 ^B9 ; 1390 | : VFMSUB231PSX+ VEX.SX.66.0F38 ^BA ; 1391 | : VFMSUB231PSY+ VEX.SY.66.0F38 ^BA ; 1392 | : VFMSUB231PDX+ VEX.DX.66.0F38 ^BA ; 1393 | : VFMSUB231PDY+ VEX.DY.66.0F38 ^BA ; 1394 | : VFMSUB231SSX+ VEX.SX.66.0F38 ^BB ; 1395 | : VFMSUB231SSY+ VEX.SY.66.0F38 ^BB ; 1396 | : VFMSUB231SDX+ VEX.DX.66.0F38 ^BB ; 1397 | : VFMSUB231SDY+ VEX.DY.66.0F38 ^BB ; 1398 | : VFNMADD231PSX+ VEX.SX.66.0F38 ^BC ; 1399 | : VFNMADD231PSY+ VEX.SY.66.0F38 ^BC ; 1400 | : VFNMADD231PDX+ VEX.DX.66.0F38 ^BC ; 1401 | : VFNMADD231PDY+ VEX.DY.66.0F38 ^BC ; 1402 | : VFNMADD231SSX+ VEX.SX.66.0F38 ^BD ; 1403 | : VFNMADD231SSY+ VEX.SY.66.0F38 ^BD ; 1404 | : VFNMADD231SDX+ VEX.DX.66.0F38 ^BD ; 1405 | : VFNMADD231SDY+ VEX.DY.66.0F38 ^BD ; 1406 | : VFNMSUB231PSX+ VEX.SX.66.0F38 ^BE ; 1407 | : VFNMSUB231PSY+ VEX.SY.66.0F38 ^BE ; 1408 | : VFNMSUB231PDX+ VEX.DX.66.0F38 ^BE ; 1409 | : VFNMSUB231PDY+ VEX.DY.66.0F38 ^BE ; 1410 | : VFNMSUB231SSX+ VEX.SX.66.0F38 ^BF ; 1411 | : VFNMSUB231SSY+ VEX.SY.66.0F38 ^BF ; 1412 | : VFNMSUB231SDX+ VEX.DX.66.0F38 ^BF ; 1413 | : VFNMSUB231SDY+ VEX.DY.66.0F38 ^BF ; 1414 | 1415 | : SHA1NEXTEX< OPL ^0F ^38 ^C8 ; : SHA1MSG1X< OPL ^0F ^38 ^C9 ; 1416 | : SHA1MSG2X< OPL ^0F ^38 ^CA ; : SHA256RNDS2X< OPL ^0F ^38 ^CB ; 1417 | : SHA256MSG1X< OPL ^0F ^38 ^CC ; : SHA256MSG2X< OPL ^0F ^38 ^CD ; 1418 | 1419 | : AESIMCX< ^66 OPL ^0F ^38 ^DB ; 1420 | : VAESIMCX< VEX.SX.66.0F38 ^DB ; 1421 | : AESENCX< ^66 OPL ^0F ^38 ^DC ; : AESENCLASTX< ^66 OPL ^0F ^38 ^DD ; 1422 | : VAESENCX+ VEX.SX.66.0F38 ^DC ; : VAESENCLASTX+ VEX.SX.66.0F38 ^DD ; 1423 | : AESDECX< ^66 OPL ^0F ^38 ^DE ; : AESDECLASTX< ^66 OPL ^0F ^38 ^DF ; 1424 | : VAESDECX+ VEX.SX.66.0F38 ^DE ; : VAESDECLASTX+ VEX.SX.66.0F38 ^DF ; 1425 | 1426 | : ANDNL+ VEX.SX.NP.0F38 ^F2 ; 1427 | : ANDNQ+ VEX.DX.NP.0F38 ^F2 ; 1428 | 1429 | : BLSRL+_ VEX.SX.NP.0F38 ^F3 /1 ; 1430 | : BLSRQ+_ VEX.DX.NP.0F38 ^F3 /1 ; 1431 | : BLSMSKL+_ VEX.SX.NP.0F38 ^F3 /2 ; 1432 | : BLSMSKQ+_ VEX.DX.NP.0F38 ^F3 /2 ; 1433 | : BLSIL+_ VEX.SX.NP.0F38 ^F3 /3 ; 1434 | : BLSIQ+_ VEX.DX.NP.0F38 ^F3 /3 ; 1435 | 1436 | : BZHIL+ VEX.SX.NP.0F38 ^F5 ; : BEXTRL+ VEX.SX.NP.0F38 ^F7 ; 1437 | : BZHIQ+ VEX.DX.NP.0F38 ^F5 ; : BEXTRQ+ VEX.DX.NP.0F38 ^F7 ; 1438 | : PEXTL+ VEX.SX.F3.0F38 ^F5 ; : SHLXL+ VEX.SX.66.0F38 ^F7 ; 1439 | : PEXTQ+ VEX.DX.F3.0F38 ^F5 ; : SHLXQ+ VEX.DX.66.0F38 ^F7 ; 1440 | : PDEPL+ VEX.SX.F2.0F38 ^F5 ; : SARXL+ VEX.SX.F3.0F38 ^F7 ; 1441 | : PDEPQ+ VEX.DX.F2.0F38 ^F5 ; : SARXQ+ VEX.DX.F3.0F38 ^F7 ; 1442 | : MULXL+ VEX.SX.F2.0F38 ^F6 ; : SHRXL+ VEX.SX.F2.0F38 ^F7 ; 1443 | : MULXQ+ VEX.DX.F2.0F38 ^F6 ; : SHRXQ+ VEX.DX.F2.0F38 ^F7 ; 1444 | 1445 | : VPERMQY<. VEX.DY.66.0F3A ^00 ; : VPERMPDY<. VEX.DY.66.0F3A ^01 ; 1446 | : VPBLENDDX+. VEX.SX.66.0F3A ^02 ; 1447 | : VPBLENDDY+. VEX.SY.66.0F3A ^02 ; 1448 | : VPERMILPSX<. VEX.SX.66.0F3A ^04 ; : VPERMILPDX<. VEX.SX.66.0F3A ^05 ; 1449 | : VPERMILPSY<. VEX.SY.66.0F3A ^04 ; : VPERMILPDY<. VEX.SY.66.0F3A ^05 ; 1450 | : VPERM2F128Y+. VEX.SY.66.0F3A ^06 ; 1451 | : ROUNDPSX<. ^66 OPL ^0F ^3A ^08 ; : ROUNDPDX<. ^66 OPL ^0F ^3A ^09 ; 1452 | : VROUNDPSX<. VEX.SX.66.0F3A ^08 ; : VROUNDPDX<. VEX.SX.66.0F3A ^09 ; 1453 | : VROUNDPSY<. VEX.SY.66.0F3A ^08 ; : VROUNDPDY<. VEX.SY.66.0F3A ^09 ; 1454 | : ROUNDSSX<. ^66 OPL ^0F ^3A ^0A ; : ROUNDSDX<. ^66 OPL ^0F ^3A ^0B ; 1455 | : VROUNDSSX+. VEX.SX.66.0F3A ^0A ; : VROUNDSDX+. VEX.SX.66.0F3A ^0B ; 1456 | : VROUNDSSY+. VEX.SY.66.0F3A ^0A ; : VROUNDSDY+. VEX.SY.66.0F3A ^0B ; 1457 | : BLENDPSX<. ^66 OPL ^0F ^3A ^0C ; : BLENDPDX<. ^66 OPL ^0F ^3A ^0C ; 1458 | : VBLENDPSX+. VEX.SX.66.0F3A ^0C ; : VBLENDPDX+. VEX.SX.66.0F3A ^0C ; 1459 | : VBLENDPSY+. VEX.SY.66.0F3A ^0C ; : VBLENDPDY+. VEX.SY.66.0F3A ^0C ; 1460 | : PBLENDWX<. ^66 OPL ^0F ^3A ^0E ; : PALIGNRX<. ^66 OPL ^0F ^3A ^0F ; 1461 | : VPBLENDWX+. VEX.SX.66.0F3A ^0E ; : VPALIGNRX+. VEX.SX.66.0F3A ^0F ; 1462 | : VPBLENDWY+. VEX.SY.66.0F3A ^0E ; : VPALIGNRY+. VEX.SY.66.0F3A ^0F ; 1463 | : PEXTRBX>. ^66 OPL ^0F ^3A ^14 ; : PEXTRWX>. ^66 OPL ^0F ^3A ^15 ; 1464 | : VPEXTRBX>. VEX.SX.66.0F3A ^14 ; : VPEXTRWX>. VEX.SX.66.0F3A ^15 ; 1465 | : PEXTRDX>. ^66 OPL ^0F ^3A ^16 ; : EXTRACTPSX>. ^66 OPL ^0F ^3A ^17 ; 1466 | : VPEXTRDX>. VEX.SX.66.0F3A ^16 ; : VEXTRACTPSX>. VEX.SX.66.0F3A ^17 ; 1467 | : PEXTRQX>. ^66 OPQ ^0F ^3A ^16 ; 1468 | : VPEXTRQX>. VEX.DX.66.0F3A ^16 ; 1469 | : VINSERTF128Y+. VEX.SY.66.0F3A ^18 ; : VEXTRACTF128Y>. VEX.SY.66.0F3A ^19 ; 1470 | : VCVTPS2PHX>. VEX.SX.66.0F3A ^1D ; 1471 | : VCVTPS2PHY>. VEX.SY.66.0F3A ^1D ; 1472 | : PINSRBX<. ^66 OPL ^0F ^3A ^20 ; : INSERTPSX<. ^66 OPL ^0F ^3A ^21 ; 1473 | : VPINSRBX+. VEX.SX.66.0F3A ^20 ; : VINSERTPSX+. VEX.SX.66.0F3A ^21 ; 1474 | : PINSRDX<. ^66 OPL ^0F ^3A ^22 ; 1475 | : VPINSRDX+. VEX.SX.66.0F3A ^22 ; 1476 | : PINSRQX<. ^66 OPQ ^0F ^3A ^22 ; 1477 | : VPINSRQX+. VEX.DX.66.0F3A ^22 ; 1478 | : VINSERTI128Y+. VEX.SY.66.0F3A ^38 ; : VEXTRACTI128Y>. VEX.SY.66.0F3A ^39 ; 1479 | : DPPSX<. ^66 OPL ^0F ^3A ^40 ; : DPPDX<. ^66 OPL ^0F ^3A ^41 ; 1480 | : VDPPSX+. VEX.SX.66.0F3A ^40 ; : VDPPDX+. VEX.SX.66.0F3A ^41 ; 1481 | : VDPPSY+. VEX.SY.66.0F3A ^40 ; 1482 | : MPSADBWX<. ^66 OPL ^0F ^3A ^42 ; 1483 | : VMPSADBWX+. VEX.SX.66.0F3A ^42 ; 1484 | : VMPSADBWY+. VEX.SY.66.0F3A ^42 ; 1485 | : PCLMULQDQX<. ^66 OPL ^0F ^3A ^44 ; 1486 | : VPCLMULQDQX<. VEX.SX.66.0F3A ^44 ; 1487 | : VPERM2I128Y+. VEX.SY.66.0F3A ^46 ; 1488 | : VBLENDVPSX+. VEX.SX.66.0F3A ^4A ; : VBLENDVPDX+. VEX.SX.66.0F3A ^4D ; 1489 | : VBLENDVPSY+. VEX.SY.66.0F3A ^4A ; : VBLENDVPDY+. VEX.SY.66.0F3A ^4D ; 1490 | : VPBLENDVBX+. VEX.SX.66.0F3A ^4C ; 1491 | : VPBLENDVBY+. VEX.SY.66.0F3A ^4C ; 1492 | : PCMPESTRMX<. ^66 OPL ^0F ^3A ^60 ; : PCMPESTRIX<. ^66 OPL ^0F ^3A ^61 ; 1493 | : VPCMPESTRMX<. VEX.SX.66.0F3A ^60 ; : VPCMPESTRIX<. VEX.SX.66.0F3A ^61 ; 1494 | : PCMPISTRMX<. ^66 OPL ^0F ^3A ^62 ; : PCMPISTRIX<. ^66 OPL ^0F ^3A ^63 ; 1495 | : VPCMPISTRMX<. VEX.SX.66.0F3A ^62 ; : VPCMPISTRIX<. VEX.SX.66.0F3A ^63 ; 1496 | : SHA1RNDS4X<. OPL ^0F ^3A ^CC ; 1497 | : AESKEYGENASX<. ^66 OPL ^0F ^3A ^DF ; 1498 | : VAESKEYGENASX<. VEX.SX.66.0F3A ^DF ; 1499 | : RORXL<. VEX.SX.F2.0F3A ^F0 ; 1500 | : RORXQ<. VEX.DX.F2.0F3A ^F0 ; 1501 | 1502 | [ASSEMBLER-DEFINITIONS] 1503 | 1504 | \ Encoding the ModR/M byte starting with the REG field. 1505 | \ We set MOD=3 by default, so we can reuse plain register names 1506 | \ for some operands (see above). 1507 | : RAX, ^C0 ; : RCX, ^C8 ; : RDX, ^D0 ; : RBX, ^D8 ; 1508 | : RSP, ^E0 ; : RBP, ^E8 ; : RSI, ^F0 ; : RDI, ^F8 ; 1509 | : R8, ^C0 R=1 ; : R9, ^C8 R=1 ; : R10, ^D0 R=1 ; : R11, ^D8 R=1 ; 1510 | : R12, ^E0 R=1 ; : R13, ^E8 R=1 ; : R14, ^F0 R=1 ; : R15, ^F8 R=1 ; 1511 | 1512 | \ Vector registers. Whether it is XMM, YMM, ZMM depends on the op. 1513 | : V0, ^C0 ; : V1, ^C8 ; : V2, ^D0 ; : V3, ^D8 ; 1514 | : V4, ^E0 ; : V5, ^E8 ; : V6, ^F0 ; : V7, ^F8 ; 1515 | : V8, ^C0 R=1 ; : V9, ^C8 R=1 ; : V10, ^D0 R=1 ; : V11, ^D8 R=1 ; 1516 | : V12, ^E0 R=1 ; : V13, ^E8 R=1 ; : V14, ^F0 R=1 ; : V15, ^F8 R=1 ; 1517 | : V16, ^C0 R=2 ; : V17, ^C8 R=2 ; : V18, ^D0 R=2 ; : V19, ^D8 R=2 ; 1518 | : V20, ^E0 R=2 ; : V21, ^E8 R=2 ; : V22, ^F0 R=2 ; : V23, ^F8 R=2 ; 1519 | : V24, ^C0 R=3 ; : V25, ^C8 R=3 ; : V26, ^D0 R=3 ; : V27, ^D8 R=3 ; 1520 | : V28, ^E0 R=3 ; : V29, ^E8 R=3 ; : V30, ^F0 R=3 ; : V31, ^F8 R=3 ; 1521 | 1522 | : K0, ^C0 ; : K1, ^C8 ; : K2, ^D0 ; : K3, ^D8 ; 1523 | : K4, ^E0 ; : K5, ^E8 ; : K6, ^F0 ; : K7, ^F8 ; 1524 | 1525 | \ "2nd source register" in AVX instructions 1526 | 1527 | : V0+ V=0 ; : V1+ V=1 ; : V2+ V=2 ; : V3+ V=3 ; 1528 | : V4+ V=4 ; : V5+ V=5 ; : V6+ V=6 ; : V7+ V=7 ; 1529 | : V8+ V=8 ; : V9+ V=9 ; : V10+ V=10 ; : V11+ V=11 ; 1530 | : V12+ V=12 ; : V13+ V=13 ; : V14+ V=14 ; : V15+ V=15 ; 1531 | : V16+ V=16 ; : V17+ V=17 ; : V18+ V=18 ; : V19+ V=19 ; 1532 | : V20+ V=20 ; : V21+ V=21 ; : V22+ V=22 ; : V23+ V=23 ; 1533 | : V24+ V=24 ; : V25+ V=25 ; : V26+ V=26 ; : V27+ V=27 ; 1534 | : V28+ V=28 ; : V29+ V=29 ; : V30+ V=30 ; : V31+ V=31 ; 1535 | 1536 | : K0+ V=0 ; : K1+ V=1 ; : K2+ V=2 ; : K3+ V=3 ; 1537 | : K4+ V=4 ; : K5+ V=5 ; : K6+ V=6 ; : K7+ V=7 ; 1538 | 1539 | [KERNEL-DEFINITIONS] 1540 | 1541 | \ Modify ModR/M byte to set MOD field. 1542 | : MOD=0 ^80 ^77 ^FF ^C0 ; \ XOR [RDI-1], 0xC0 1543 | : MOD=1 ^80 ^77 ^FF ^80 ; \ XOR [RDI-1], 0x80 1544 | : MOD=2 ^80 ^77 ^FF ^40 ; \ XOR [RDI-1], 0x40 1545 | : MOD=3 ; \ default MOD is 3 1546 | 1547 | \ Modify ModR/M byte to set RM field. 1548 | \ (This is also used by SIB encoding to modify the BASE field.) 1549 | : RM=0 ; \ default RM is 0 1550 | : RM=1 ^80 ^77 ^FF ^01 ; \ XOR [RDI-1], 0x01 1551 | : RM=2 ^80 ^77 ^FF ^02 ; \ XOR [RDI-1], 0x02 1552 | : RM=3 ^80 ^77 ^FF ^03 ; \ XOR [RDI-1], 0x03 1553 | : RM=4 ^80 ^77 ^FF ^04 ; \ XOR [RDI-1], 0x04 1554 | : RM=5 ^80 ^77 ^FF ^05 ; \ XOR [RDI-1], 0x05 1555 | : RM=6 ^80 ^77 ^FF ^06 ; \ XOR [RDI-1], 0x06 1556 | : RM=7 ^80 ^77 ^FF ^07 ; \ XOR [RDI-1], 0x07 1557 | 1558 | \ Modify the previous byte (ModR/M) to encode the appropriate SIB mode. 1559 | : SIB=0 ^80 ^77 ^FE ^C4 ; \ set prev MOD=0 RM=4 1560 | : SIB=1 ^80 ^77 ^FE ^84 ; \ set prev MOD=1 RM=4 1561 | : SIB=2 ^80 ^77 ^FE ^44 ; \ set prev MOD=2 RM=4 1562 | 1563 | [ASSEMBLER-DEFINITIONS] 1564 | 1565 | \ Direct register addressing. 1566 | : RAX MOD=3 RM=0 ; : R8 MOD=3 RM=0 +B ; 1567 | : RCX MOD=3 RM=1 ; : R9 MOD=3 RM=1 +B ; 1568 | : RDX MOD=3 RM=2 ; : R10 MOD=3 RM=2 +B ; 1569 | : RBX MOD=3 RM=3 ; : R11 MOD=3 RM=3 +B ; 1570 | : RSP MOD=3 RM=4 ; : R12 MOD=3 RM=4 +B ; 1571 | : RBP MOD=3 RM=5 ; : R13 MOD=3 RM=5 +B ; 1572 | : RSI MOD=3 RM=6 ; : R14 MOD=3 RM=6 +B ; 1573 | : RDI MOD=3 RM=7 ; : R15 MOD=3 RM=7 +B ; 1574 | 1575 | : V0 MOD=3 RM=0 ; : V16 MOD=3 RM=0 B=2 ; 1576 | : V1 MOD=3 RM=1 ; : V17 MOD=3 RM=1 B=2 ; 1577 | : V2 MOD=3 RM=2 ; : V18 MOD=3 RM=2 B=2 ; 1578 | : V3 MOD=3 RM=3 ; : V19 MOD=3 RM=3 B=2 ; 1579 | : V4 MOD=3 RM=4 ; : V20 MOD=3 RM=4 B=2 ; 1580 | : V5 MOD=3 RM=5 ; : V21 MOD=3 RM=5 B=2 ; 1581 | : V6 MOD=3 RM=6 ; : V22 MOD=3 RM=6 B=2 ; 1582 | : V7 MOD=3 RM=7 ; : V23 MOD=3 RM=7 B=2 ; 1583 | : V8 MOD=3 RM=0 +B ; : V24 MOD=3 RM=0 B=3 ; 1584 | : V9 MOD=3 RM=1 +B ; : V25 MOD=3 RM=1 B=3 ; 1585 | : V10 MOD=3 RM=2 +B ; : V26 MOD=3 RM=2 B=3 ; 1586 | : V11 MOD=3 RM=3 +B ; : V27 MOD=3 RM=3 B=3 ; 1587 | : V12 MOD=3 RM=4 +B ; : V28 MOD=3 RM=4 B=3 ; 1588 | : V13 MOD=3 RM=5 +B ; : V29 MOD=3 RM=5 B=3 ; 1589 | : V14 MOD=3 RM=6 +B ; : V30 MOD=3 RM=6 B=3 ; 1590 | : V15 MOD=3 RM=7 +B ; : V31 MOD=3 RM=7 B=3 ; 1591 | 1592 | : K0 MOD=3 RM=0 ; : K1 MOD=3 RM=1 ; 1593 | : K2 MOD=3 RM=2 ; : K3 MOD=3 RM=3 ; 1594 | : K4 MOD=3 RM=4 ; : K5 MOD=3 RM=5 ; 1595 | : K6 MOD=3 RM=6 ; : K7 MOD=3 RM=7 ; 1596 | 1597 | \ Indirect addressing, with or without offsets. 1598 | : [RAX] MOD=0 RM=0 ; : [RAX]. MOD=1 RM=0 ; : [RAX]: MOD=2 RM=0 ; 1599 | : [RCX] MOD=0 RM=1 ; : [RCX]. MOD=1 RM=1 ; : [RCX]: MOD=2 RM=1 ; 1600 | : [RDX] MOD=0 RM=2 ; : [RDX]. MOD=1 RM=2 ; : [RDX]: MOD=2 RM=2 ; 1601 | : [RBX] MOD=0 RM=3 ; : [RBX]. MOD=1 RM=3 ; : [RBX]: MOD=2 RM=3 ; 1602 | ( --------------------------------- SIB -------------------------------- ) 1603 | : [RIP]: MOD=0 RM=5 ; : [RBP]. MOD=1 RM=5 ; : [RBP]: MOD=2 RM=5 ; 1604 | : [RSI] MOD=0 RM=6 ; : [RSI]. MOD=1 RM=6 ; : [RSI]: MOD=2 RM=6 ; 1605 | : [RDI] MOD=0 RM=7 ; : [RDI]. MOD=1 RM=7 ; : [RDI]: MOD=2 RM=7 ; 1606 | : [R8] MOD=0 RM=0 +B ; : [R8]. MOD=1 RM=0 +B ; : [R8]: MOD=2 RM=0 +B ; 1607 | : [R9] MOD=0 RM=1 +B ; : [R9]. MOD=1 RM=1 +B ; : [R9]: MOD=2 RM=1 +B ; 1608 | : [R10] MOD=0 RM=2 +B ; : [R10]. MOD=1 RM=2 +B ; : [R10]: MOD=2 RM=2 +B ; 1609 | : [R11] MOD=0 RM=3 +B ; : [R11]. MOD=1 RM=3 +B ; : [R11]: MOD=2 RM=3 +B ; 1610 | ( --------------------------------- SIB -------------------------------- ) 1611 | ( -------- RIP ------- ) : [R13]. MOD=1 RM=5 +B ; : [R13]: MOD=2 RM=5 +B ; 1612 | : [R14] MOD=0 RM=6 +B ; : [R14]. MOD=1 RM=6 +B ; : [R14]: MOD=2 RM=6 +B ; 1613 | : [R15] MOD=0 RM=7 +B ; : [R15]. MOD=1 RM=7 +B ; : [R15]: MOD=2 RM=7 +B ; 1614 | 1615 | \ Start encoding a SIB byte, starting with the SCALE and INDEX fields. 1616 | : [1*RAX+ ^00 ; : [2*RAX+ ^40 ; : [4*RAX+ ^80 ; : [8*RAX+ ^C0 ; 1617 | : [1*RCX+ ^08 ; : [2*RCX+ ^48 ; : [4*RCX+ ^88 ; : [8*RCX+ ^C8 ; 1618 | : [1*RDX+ ^10 ; : [2*RDX+ ^50 ; : [4*RDX+ ^90 ; : [8*RDX+ ^D0 ; 1619 | : [1*RBX+ ^18 ; : [2*RBX+ ^58 ; : [4*RBX+ ^98 ; : [8*RBX+ ^D8 ; 1620 | : [0+ ^20 ; : [2*0+ ^60 ; : [4*0+ ^A0 ; : [8*0+ ^E0 ; 1621 | : [1*RBP+ ^28 ; : [2*RBP+ ^68 ; : [4*RBP+ ^A8 ; : [8*RBP+ ^E8 ; 1622 | : [1*RSI+ ^30 ; : [2*RSI+ ^70 ; : [4*RSI+ ^B0 ; : [8*RSI+ ^F0 ; 1623 | : [1*RDI+ ^38 ; : [2*RDI+ ^78 ; : [4*RDI+ ^B8 ; : [8*RDI+ ^F8 ; 1624 | : [1*R8+ ^00 +X ; : [2*R8+ ^40 +X ; : [4*R8+ ^80 +X ; : [8*R8+ ^C0 +X ; 1625 | : [1*R9+ ^08 +X ; : [2*R9+ ^48 +X ; : [4*R9+ ^88 +X ; : [8*R9+ ^C8 +X ; 1626 | : [1*R10+ ^10 +X ; : [2*R10+ ^50 +X ; : [4*R10+ ^90 +X ; : [8*R10+ ^D0 +X ; 1627 | : [1*R11+ ^18 +X ; : [2*R10+ ^58 +X ; : [4*R11+ ^98 +X ; : [8*R11+ ^D8 +X ; 1628 | : [1*R12+ ^20 +X ; : [2*R12+ ^60 +X ; : [4*R12+ ^A0 +X ; : [8*R12+ ^E0 +X ; 1629 | : [1*R13+ ^28 +X ; : [2*R13+ ^68 +X ; : [4*R13+ ^A8 +X ; : [8*R13+ ^E8 +X ; 1630 | : [1*R14+ ^30 +X ; : [2*R14+ ^70 +X ; : [4*R14+ ^B0 +X ; : [8*R14+ ^F0 +X ; 1631 | : [1*R15+ ^38 +X ; : [2*R15+ ^78 +X ; : [4*R15+ ^B8 +X ; : [8*R15+ ^F8 +X ; 1632 | 1633 | \ Start encoding a VSIB byte, used in a few AVX instructions. 1634 | : [1*V0+ ^00 ; : [2*V0+ ^40 ; : [4*V0+ ^80 ; : [8*V0+ ^C0 ; 1635 | : [1*V1+ ^08 ; : [2*V1+ ^48 ; : [4*V1+ ^88 ; : [8*V1+ ^C8 ; 1636 | : [1*V2+ ^10 ; : [2*V2+ ^50 ; : [4*V2+ ^90 ; : [8*V2+ ^D0 ; 1637 | : [1*V3+ ^18 ; : [2*V3+ ^58 ; : [4*V3+ ^98 ; : [8*V3+ ^D8 ; 1638 | : [1*V4+ ^20 ; : [2*V4+ ^60 ; : [4*V4+ ^A0 ; : [8*V4+ ^E0 ; 1639 | : [1*V5+ ^28 ; : [2*V5+ ^68 ; : [4*V5+ ^A8 ; : [8*V5+ ^E8 ; 1640 | : [1*V6+ ^30 ; : [2*V6+ ^70 ; : [4*V6+ ^B0 ; : [8*V6+ ^F0 ; 1641 | : [1*V7+ ^38 ; : [2*V7+ ^78 ; : [4*V7+ ^B8 ; : [8*V7+ ^F8 ; 1642 | : [1*V8+ ^00 +X ; : [2*V8+ ^40 +X ; : [4*V8+ ^80 +X ; : [8*V8+ ^C0 +X ; 1643 | : [1*V9+ ^08 +X ; : [2*V9+ ^48 +X ; : [4*V9+ ^88 +X ; : [8*V9+ ^C8 +X ; 1644 | : [1*V10+ ^10 +X ; : [2*V10+ ^50 +X ; : [4*V10+ ^90 +X ; : [8*V10+ ^D0 +X ; 1645 | : [1*V11+ ^18 +X ; : [2*V10+ ^58 +X ; : [4*V11+ ^98 +X ; : [8*V11+ ^D8 +X ; 1646 | : [1*V12+ ^20 +X ; : [2*V12+ ^60 +X ; : [4*V12+ ^A0 +X ; : [8*V12+ ^E0 +X ; 1647 | : [1*V13+ ^28 +X ; : [2*V13+ ^68 +X ; : [4*V13+ ^A8 +X ; : [8*V13+ ^E8 +X ; 1648 | : [1*V14+ ^30 +X ; : [2*V14+ ^70 +X ; : [4*V14+ ^B0 +X ; : [8*V14+ ^F0 +X ; 1649 | : [1*V15+ ^38 +X ; : [2*V15+ ^78 +X ; : [4*V15+ ^B8 +X ; : [8*V15+ ^F8 +X ; 1650 | : [1*V16+ ^00 X2 ; : [2*V16+ ^40 X2 ; : [4*V16+ ^80 X2 ; : [8*V16+ ^C0 X2 ; 1651 | : [1*V17+ ^08 X2 ; : [2*V17+ ^48 X2 ; : [4*V17+ ^88 X2 ; : [8*V17+ ^C8 X2 ; 1652 | : [1*V18+ ^10 X2 ; : [2*V18+ ^50 X2 ; : [4*V18+ ^90 X2 ; : [8*V18+ ^D0 X2 ; 1653 | : [1*V19+ ^18 X2 ; : [2*V19+ ^58 X2 ; : [4*V19+ ^98 X2 ; : [8*V19+ ^D8 X2 ; 1654 | : [1*V20+ ^20 X2 ; : [2*V20+ ^60 X2 ; : [4*V20+ ^A0 X2 ; : [8*V20+ ^E0 X2 ; 1655 | : [1*V21+ ^28 X2 ; : [2*V21+ ^68 X2 ; : [4*V21+ ^A8 X2 ; : [8*V21+ ^E8 X2 ; 1656 | : [1*V22+ ^30 X2 ; : [2*V22+ ^70 X2 ; : [4*V22+ ^B0 X2 ; : [8*V22+ ^F0 X2 ; 1657 | : [1*V23+ ^38 X2 ; : [2*V23+ ^78 X2 ; : [4*V23+ ^B8 X2 ; : [8*V23+ ^F8 X2 ; 1658 | : [1*V24+ ^00 X3 ; : [2*V24+ ^40 X3 ; : [4*V24+ ^80 X3 ; : [8*V24+ ^C0 X3 ; 1659 | : [1*V25+ ^08 X3 ; : [2*V25+ ^48 X3 ; : [4*V25+ ^88 X3 ; : [8*V25+ ^C8 X3 ; 1660 | : [1*V26+ ^10 X3 ; : [2*V26+ ^50 X3 ; : [4*V26+ ^90 X3 ; : [8*V26+ ^D0 X3 ; 1661 | : [1*V27+ ^18 X3 ; : [2*V27+ ^58 X3 ; : [4*V27+ ^98 X3 ; : [8*V27+ ^D8 X3 ; 1662 | : [1*V28+ ^20 X3 ; : [2*V28+ ^60 X3 ; : [4*V28+ ^A0 X3 ; : [8*V28+ ^E0 X3 ; 1663 | : [1*V29+ ^28 X3 ; : [2*V29+ ^68 X3 ; : [4*V29+ ^A8 X3 ; : [8*V29+ ^E8 X3 ; 1664 | : [1*V30+ ^30 X3 ; : [2*V30+ ^70 X3 ; : [4*V30+ ^B0 X3 ; : [8*V30+ ^F0 X3 ; 1665 | : [1*V31+ ^38 X3 ; : [2*V31+ ^78 X3 ; : [4*V31+ ^B8 X3 ; : [8*V31+ ^F8 X3 ; 1666 | 1667 | \ Finish encoding SIB byte. This sets the BASE field and MOD from ModR/M. 1668 | : RAX] SIB=0 RM=0 ; : RAX]. SIB=1 RM=0 ; : RAX]: SIB=2 RM=0 ; 1669 | : RCX] SIB=0 RM=1 ; : RCX]. SIB=1 RM=1 ; : RCX]: SIB=2 RM=1 ; 1670 | : RDX] SIB=0 RM=2 ; : RDX]. SIB=1 RM=2 ; : RDX]: SIB=2 RM=2 ; 1671 | : RBX] SIB=0 RM=3 ; : RBX]. SIB=1 RM=3 ; : RBX]: SIB=2 RM=3 ; 1672 | : RSP] SIB=0 RM=4 ; : RSP]. SIB=1 RM=4 ; : RSP]: SIB=2 RM=4 ; 1673 | : 0]: SIB=0 RM=5 ; : RBP]. SIB=1 RM=5 ; : RBP]: SIB=2 RM=5 ; 1674 | : RSI] SIB=0 RM=6 ; : RSI]. SIB=1 RM=6 ; : RSI]: SIB=2 RM=6 ; 1675 | : RDI] SIB=0 RM=7 ; : RDI]. SIB=1 RM=7 ; : RDI]: SIB=2 RM=7 ; 1676 | : R8] SIB=0 RM=0 +B ; : R8]. SIB=1 RM=0 +B ; : R8]: SIB=2 RM=0 +B ; 1677 | : R9] SIB=0 RM=1 +B ; : R9]. SIB=1 RM=1 +B ; : R9]: SIB=2 RM=1 +B ; 1678 | : R10] SIB=0 RM=2 +B ; : R10]. SIB=1 RM=2 +B ; : R10]: SIB=2 RM=2 +B ; 1679 | : R11] SIB=0 RM=3 +B ; : R11]. SIB=1 RM=3 +B ; : R11]: SIB=2 RM=3 +B ; 1680 | : R12] SIB=0 RM=4 +B ; : R12]. SIB=1 RM=4 +B ; : R12]: SIB=2 RM=4 +B ; 1681 | ( ------------------ ) : R13]. SIB=1 RM=5 +B ; : R13]: SIB=2 RM=5 +B ; 1682 | : R14] SIB=0 RM=6 +B ; : R14]. SIB=1 RM=6 +B ; : R14]: SIB=2 RM=6 +B ; 1683 | : R15] SIB=0 RM=7 +B ; : R15]. SIB=1 RM=7 +B ; : R15]: SIB=2 RM=7 +B ; 1684 | 1685 | \ Fourth operand for VBLENDV/VPBLENDV ops (occupies the immediate slot). 1686 | \ : $V0 ^00 ; : $V1 ^10 ; : $V2 ^20 ; : $V3 ^30 ; 1687 | \ : $V4 ^40 ; : $V5 ^50 ; : $V6 ^60 ; : $V7 ^70 ; 1688 | \ : $V8 ^80 ; : $V9 ^90 ; : $V10 ^A0 ; : $V11 ^B0 ; 1689 | \ : $V12 ^C0 ; : $V13 ^D0 ; : $V14 ^E0 ; : $V15 ^F0 ; 1690 | -------------------------------------------------------------------------------- /src/2-forth.fs: -------------------------------------------------------------------------------- 1 | [KERNEL-DEFINITIONS] 2 | 3 | : ; 4 | \ Store the end address of the word in 5 | \ its dictionary entry, and emit RET. 6 | \ Trashes RAX. 7 | MOVQ< RAX, [RBP]: $USER.DICT 8 | MOVQ< RAX, [RAX] 9 | MOVQ> RDI, [RAX]. $DICT.DATA 10 | ^C3 \ RET 11 | ; 12 | 13 | : INLINE> ( -- ) CALL> 14 | \ Changes the action of a word to be the inlining of 15 | \ its contents. Only do this if the word contains 16 | \ no referneces (e.g. CALLs) because otherwise the 17 | \ reference will be wrong. 18 | MOVQ< RDX, RSI 19 | POPQ# RSI 20 | MOVQ< RCX, [R13]. $DICT.DATA 21 | SUBQ< RCX, RSI 22 | REP MOVSB 23 | MOVQ< RSI, RDX 24 | ; 25 | 26 | : INLINE/CALL> ( -- ) CALL> 27 | \ Same as INLINE> but indicates that it would 28 | \ be ok to call this word directly too. 29 | MOVQ< RDX, RSI 30 | POPQ# RSI 31 | MOVQ< RCX, [R13]. $DICT.DATA 32 | SUBQ< RCX, RSI 33 | REP MOVSB 34 | MOVQ< RSI, RDX 35 | ; 36 | 37 | : KWORD ( "name" -- ) CALL> 38 | \ Parse word and fill name buffer. 39 | \ Relies on the engine's WORD primitive. 40 | CALLQ_ [RBP]: $USER.WORD ; 41 | 42 | : KFIND ( -- RAX=dict|0 ) CALL> 43 | \ Search for word in name buffer, among 44 | \ all the wordlists in the search order. 45 | \ Returns the first matching dictionary entry in RAX, 46 | \ if found, else returns 0 in RAX. 47 | \ Also sets ZF based on result. 48 | CALLQ_ [RBP]: $USER.FIND ; 49 | 50 | : [SETUP] 51 | \ Set up data stack (R15). 52 | LEAQ< R15, [RBP]: $10000000 53 | ; 54 | [SETUP] 55 | 56 | [FORTH-DEFINITIONS] 57 | 58 | \ Simpler stack words. These preserve non-stack registers (RBX, R15). 59 | : DUP ( a -- a a ) INLINE/CALL> 60 | LEAQ< R15, [R15]. $F8 61 | MOVQ> RBX, [R15] ; 62 | : NIP ( a b -- b ) INLINE/CALL> 63 | LEAQ< R15, [R15]. $08 ; 64 | : DROP ( a -- ) INLINE/CALL> 65 | MOVQ< RBX, [R15] 66 | LEAQ< R15, [R15]. $08 ; 67 | : OVER ( a b -- a b a ) INLINE/CALL> 68 | DUP 69 | MOVQ< RBX, [R15]. $08 ; 70 | : 2DUP ( a b -- a b a b ) INLINE/CALL> 71 | OVER OVER ; 72 | : 2DROP ( a b -- ) INLINE/CALL> 73 | MOVQ< RBX, [R15]. $08 74 | LEAQ< R15, [R15]. $10 ; 75 | 76 | \ Deeper stack words. These can trash RAX and RDX. 77 | : SWAP ( a b -- b a ) INLINE/CALL> 78 | MOVQ< RAX, [R15] 79 | MOVQ> RBX, [R15] 80 | MOVQ< RBX, RAX ; 81 | : ROTL ( a b c -- b c a ) INLINE/CALL> 82 | MOVQ< RAX, [R15]. $08 83 | MOVQ< RDX, [R15] 84 | MOVQ> RBX, [R15] 85 | MOVQ> RDX, [R15]. $08 86 | MOVQ< RBX, RAX ; 87 | : ROTR ( a b c -- c a b ) INLINE/CALL> 88 | MOVQ< RDX, [R15]. $08 89 | MOVQ< RAX, [R15] 90 | MOVQ> RBX, [R15]. $08 91 | MOVQ> RDX, [R15] 92 | MOVQ< RBX, RAX ; 93 | : TUCK ( a b -- b a b ) INLINE/CALL> 94 | MOVQ< RAX, [R15] 95 | MOVQ> RBX, [R15] 96 | LEAQ< R15, [R15]. $F8 97 | MOVQ> RAX, [R15] ; 98 | 99 | : >R ( x -- ) ( R: -- x ) INLINE> 100 | PUSHQ# RBX 101 | DROP ; 102 | : 2>R ( x1 x2 -- ) ( R: -- x1 x2 ) INLINE> 103 | PUSHQ_ [R15] 104 | PUSHQ# RBX 105 | MOVQ< RBX, [R15]. $08 106 | LEAQ< R15, [R15]. $10 ; 107 | : R> ( R: x -- ) ( -- x ) INLINE> 108 | DUP 109 | POPQ# RBX ; 110 | : 2R> ( R: x1 x2 -- ) ( -- x1 x2 ) INLINE> 111 | MOVQ> RBX, [R15]. $F8 112 | LEAQ< R15, [R15]. $F0 113 | POPQ# RBX 114 | POPQ_ [R15] 115 | ; 116 | : RDROP ( R: x -- ) INLINE> 117 | \ Drop top of return stack. 118 | LEAQ< RSP, [0+ RSP]. $08 ; 119 | 120 | : 0* ( x -- 0 ) INLINE/CALL> 121 | XORL< RBX, RBX ; 122 | : 0 ( -- 0 ) INLINE/CALL> 123 | \ Push zero on data stack. 124 | DUP 0* ; 125 | 126 | [ASSEMBLER-DEFINITIONS] 127 | 128 | : U. ( -- u ) INLINE> 129 | \ Push zero-extended byte literal on data stack. 130 | DUP 131 | XORL< RBX, RBX 132 | MOVB#. RBX ; 133 | : U: ( -- u ) INLINE> 134 | \ Push zero-extended 32-bit literal on data stack. 135 | DUP MOVL#: RBX ; 136 | : I: ( -- n ) INLINE> 137 | \ Push sign-extended 32-bit literal on data stack. 138 | DUP MOVQ_: RBX ; 139 | : X:: ( -- x ) INLINE> 140 | \ Push 64-bit literal on data stack. 141 | DUP MOVQ#:: RBX ; 142 | 143 | [FORTH-DEFINITIONS] 144 | 145 | : BYE ( -- ) CALL> 146 | \ End the program. 147 | MOVL#: RAX $SYS_EXIT 148 | XORL< RDI, RDI 149 | SYSCALL ; 150 | 151 | : EMIT ( c -- ) CALL> 152 | \ Emit byte to stdout. 153 | PUSHQ# RDI 154 | PUSHQ# RSI 155 | PUSHQ# RBX 156 | MOVL#: RAX $SYS_WRITE 157 | MOVL#: RDI $00000001 \ stdout 158 | MOVL#: RDX $00000001 \ length 159 | MOVQ< RSI, RSP \ source 160 | SYSCALL 161 | RDROP 162 | POPQ# RSI 163 | POPQ# RDI 164 | DROP ; 165 | 166 | ( : 'NUL' INLINE/CALL> 0 ; ) : 'BL' INLINE/CALL> U. $20 ; 167 | \ : 'SOH' INLINE/CALL> U. $01 ; \ : '!' INLINE/CALL> U. $21 ; 168 | \ : 'STX' INLINE/CALL> U. $02 ; \ : '"' INLINE/CALL> U. $22 ; 169 | \ : 'ETX' INLINE/CALL> U. $03 ; \ : '#' INLINE/CALL> U. $23 ; 170 | \ : 'SOT' INLINE/CALL> U. $04 ; \ : '$' INLINE/CALL> U. $24 ; 171 | \ : 'ENQ' INLINE/CALL> U. $05 ; \ : '%' INLINE/CALL> U. $25 ; 172 | \ : 'ACK' INLINE/CALL> U. $06 ; \ : '&' INLINE/CALL> U. $26 ; 173 | \ : 'BEL' INLINE/CALL> U. $07 ; \ : ''' INLINE/CALL> U. $27 ; 174 | \ : 'BS' INLINE/CALL> U. $08 ; \ : '(' INLINE/CALL> U. $28 ; 175 | \ : 'HT' INLINE/CALL> U. $09 ; \ : ')' INLINE/CALL> U. $29 ; 176 | : 'LF' INLINE/CALL> U. $0A ; \ : '*' INLINE/CALL> U. $2A ; 177 | \ : 'VT' INLINE/CALL> U. $0B ; \ : '+' INLINE/CALL> U. $2B ; 178 | \ : 'FF' INLINE/CALL> U. $0C ; \ : ',' INLINE/CALL> U. $2C ; 179 | ( : 'CR' INLINE/CALL> U. $0D ; ) : '-' INLINE/CALL> U. $2D ; 180 | \ : 'SO' INLINE/CALL> U. $0E ; \ : '.' INLINE/CALL> U. $2E ; 181 | \ : 'SI' INLINE/CALL> U. $0F ; \ : '/' INLINE/CALL> U. $2F ; 182 | ( : 'DLE' INLINE/CALL> U. $10 ; ) : '0' INLINE/CALL> U. $30 ; 183 | \ : 'DC1' INLINE/CALL> U. $11 ; \ : '1' INLINE/CALL> U. $31 ; 184 | \ : 'DC2' INLINE/CALL> U. $12 ; \ : '2' INLINE/CALL> U. $32 ; 185 | \ : 'DC3' INLINE/CALL> U. $13 ; \ : '3' INLINE/CALL> U. $33 ; 186 | \ : 'DC4' INLINE/CALL> U. $14 ; \ : '4' INLINE/CALL> U. $34 ; 187 | \ : 'NAK' INLINE/CALL> U. $15 ; \ : '5' INLINE/CALL> U. $35 ; 188 | \ : 'SYN' INLINE/CALL> U. $16 ; \ : '6' INLINE/CALL> U. $36 ; 189 | \ : 'ETB' INLINE/CALL> U. $17 ; \ : '7' INLINE/CALL> U. $37 ; 190 | \ : 'CAN' INLINE/CALL> U. $18 ; \ : '8' INLINE/CALL> U. $38 ; 191 | \ : 'EM' INLINE/CALL> U. $19 ; \ : '9' INLINE/CALL> U. $39 ; 192 | \ : 'SUB' INLINE/CALL> U. $1A ; \ : ':' INLINE/CALL> U. $3A ; 193 | \ : 'ESC' INLINE/CALL> U. $1B ; \ : ';' INLINE/CALL> U. $3B ; 194 | \ : 'FS' INLINE/CALL> U. $1C ; \ : '<' INLINE/CALL> U. $3C ; 195 | \ : 'GS' INLINE/CALL> U. $1D ; \ : '=' INLINE/CALL> U. $3D ; 196 | \ : 'RS' INLINE/CALL> U. $1E ; \ : '>' INLINE/CALL> U. $3E ; 197 | \ : 'US' INLINE/CALL> U. $1F ; \ : '?' INLINE/CALL> U. $3F ; 198 | 199 | \ : '@' INLINE/CALL> U. $40 ; \ : '`' INLINE/CALL> U. $60 ; 200 | \ : 'A' INLINE/CALL> U. $41 ; \ : 'a' INLINE/CALL> U. $61 ; 201 | \ : 'B' INLINE/CALL> U. $42 ; \ : 'b' INLINE/CALL> U. $62 ; 202 | \ : 'C' INLINE/CALL> U. $43 ; \ : 'c' INLINE/CALL> U. $63 ; 203 | \ : 'D' INLINE/CALL> U. $44 ; \ : 'd' INLINE/CALL> U. $64 ; 204 | \ : 'E' INLINE/CALL> U. $45 ; \ : 'e' INLINE/CALL> U. $65 ; 205 | \ : 'F' INLINE/CALL> U. $46 ; \ : 'f' INLINE/CALL> U. $66 ; 206 | \ : 'G' INLINE/CALL> U. $47 ; \ : 'g' INLINE/CALL> U. $67 ; 207 | \ : 'H' INLINE/CALL> U. $48 ; \ : 'h' INLINE/CALL> U. $68 ; 208 | \ : 'I' INLINE/CALL> U. $49 ; \ : 'i' INLINE/CALL> U. $69 ; 209 | \ : 'J' INLINE/CALL> U. $4A ; \ : 'j' INLINE/CALL> U. $6A ; 210 | \ : 'K' INLINE/CALL> U. $4B ; \ : 'k' INLINE/CALL> U. $6B ; 211 | \ : 'L' INLINE/CALL> U. $4C ; \ : 'l' INLINE/CALL> U. $6C ; 212 | \ : 'M' INLINE/CALL> U. $4D ; \ : 'm' INLINE/CALL> U. $6D ; 213 | \ : 'N' INLINE/CALL> U. $4E ; \ : 'n' INLINE/CALL> U. $6E ; 214 | \ : 'O' INLINE/CALL> U. $4F ; \ : 'o' INLINE/CALL> U. $6F ; 215 | \ : 'P' INLINE/CALL> U. $50 ; \ : 'p' INLINE/CALL> U. $70 ; 216 | \ : 'Q' INLINE/CALL> U. $51 ; \ : 'q' INLINE/CALL> U. $71 ; 217 | \ : 'R' INLINE/CALL> U. $52 ; \ : 'r' INLINE/CALL> U. $72 ; 218 | \ : 'S' INLINE/CALL> U. $53 ; \ : 's' INLINE/CALL> U. $73 ; 219 | \ : 'T' INLINE/CALL> U. $54 ; \ : 't' INLINE/CALL> U. $74 ; 220 | \ : 'U' INLINE/CALL> U. $55 ; \ : 'u' INLINE/CALL> U. $75 ; 221 | \ : 'V' INLINE/CALL> U. $56 ; \ : 'v' INLINE/CALL> U. $76 ; 222 | \ : 'W' INLINE/CALL> U. $57 ; \ : 'w' INLINE/CALL> U. $77 ; 223 | \ : 'X' INLINE/CALL> U. $58 ; \ : 'x' INLINE/CALL> U. $78 ; 224 | \ : 'Y' INLINE/CALL> U. $59 ; \ : 'y' INLINE/CALL> U. $79 ; 225 | \ : 'Z' INLINE/CALL> U. $5A ; \ : 'z' INLINE/CALL> U. $7A ; 226 | \ : '[' INLINE/CALL> U. $5B ; \ : '{' INLINE/CALL> U. $7B ; 227 | \ : '\' INLINE/CALL> U. $5C ; \ : '|' INLINE/CALL> U. $7C ; 228 | \ : ']' INLINE/CALL> U. $5D ; \ : '}' INLINE/CALL> U. $7D ; 229 | \ : '^' INLINE/CALL> U. $5E ; \ : '~' INLINE/CALL> U. $7E ; 230 | \ : '_' INLINE/CALL> U. $5F ; \ : 'DEL' INLINE/CALL> U. $7F ; 231 | 232 | : CR ( -- ) CALL> 233 | \ Emit a newline to stdout. 234 | 'LF' EMIT ; 235 | : SPACE ( -- ) CALL> 236 | \ Emit a single space character to stdout. 237 | 'BL' EMIT ; 238 | 239 | : NAME-NOT-FOUND CALL> 240 | \ TODO display message. 241 | MOVL#: RAX $SYS_EXIT 242 | MOVL#: RDI $0000000D \ exit code = 13 243 | SYSCALL ; 244 | 245 | : NT' ( -- nt ) CALL> 246 | DUP 247 | KWORD KFIND 248 | MOVQ< RBX, RAX 249 | TESTQ> RAX, RAX 250 | JNZ. $05 251 | NAME-NOT-FOUND 252 | ; 253 | 254 | : POSTPONE 255 | NT' 256 | ^49 ^55 \ PUSH R13 257 | ^49 ^BD \ MOV R13, ___ 258 | MOVQ< RAX, RBX 259 | STOSQ 260 | ^41 ^FF ^65 \ CALL [R13 + $DICT.CODE] 261 | MOVB#. RAX $DICT.CODE 262 | STOSB 263 | ^49 ^5D \ POP R13 264 | DROP ; 265 | 266 | : LITERAL 267 | POSTPONE DUP 268 | \ TODO emit nicer code for smaller literals 269 | ^48 ^BB 270 | MOVQ< RAX, RBX 271 | STOSQ 272 | DROP 273 | ; 274 | 275 | : ^VARIABLE 276 | ^B8 277 | MOVQ< RAX, [RBP]: $USER.HERE 278 | SUBQ< RAX, RBP 279 | STOSL 280 | ^AB 281 | ADDQ_. [RBP]: $USER.HERE $08 282 | ; 283 | 284 | : $FOO ^VARIABLE ; 285 | 286 | : [NT'] NT' POSTPONE LITERAL ; 287 | 288 | [KERNEL-DEFINITIONS] 289 | 290 | : $TEMPOFFSET ^0FFFC000 ; 291 | : RDI:TEMP ( -- RDI=TEMP ) CALL> 292 | \ Load temporary program memory address into RDI. 293 | MOVQ< RDI, [RBP]: $USER.PROG 294 | LEAQ< RDI, [RDI]: $TEMPOFFSET ; 295 | 296 | [FORTH-DEFINITIONS] 297 | 298 | : [ 299 | \ Start compiling a temporary program. The program should 300 | \ be finished up by ], which will then execute the program. 301 | \ Use this to execute stuff immediately, instead of compiling. 302 | \ Usage example: [ LF ] 303 | \ Will output a newline while compiling the program, because 304 | \ it compiles the LF call in a temporary location, and then 305 | \ runs the code that was compiled in that location. 306 | 307 | \ Running this while you are already compiling a temporary 308 | \ program will result in very strange behavior. Don't do it! 309 | DUP 310 | MOVQ< RBX, RDI 311 | RDI:TEMP ; 312 | 313 | : ] 314 | \ Finish the temporary program, restore RDI to its original 315 | \ location, then run the temporary program. 316 | ^C3 317 | RDI:TEMP 318 | PUSHQ# RDI 319 | MOVQ< RDI, RBX 320 | DROP 321 | ; 322 | 323 | [KERNEL-DEFINITIONS] 324 | 325 | : BRANCH-TOO-BIG CALL> 326 | \ TODO display message. 327 | MOVL#: RAX $SYS_EXIT 328 | MOVL#: RDI $00000011 329 | SYSCALL ; 330 | : VERIFY-BRANCH-OFFSET ( -- ) CALL> 331 | \ Verify that branch offset in RAX fits in a signed byte. 332 | \ Otherwise panics with a BRANCH-TOO-BIG error. 333 | CMP-RAX: $0000007F 334 | JLE. $05 335 | BRANCH-TOO-BIG 336 | CMP-RAX: $FFFFFF80 337 | JGE. $05 338 | BRANCH-TOO-BIG ; 339 | 340 | [ASSEMBLER-DEFINITIONS] 341 | 342 | : BRANCH> ( -- orig ) CALL> 343 | \ Create blank offset for forward branch. 344 | \ Must be resolved by >TARGET. 345 | DUP 346 | MOVQ< RBX, RDI 347 | XORQ< RAX, RAX 348 | STOSB ; 349 | : >TARGET ( orig -- ) CALL> 350 | \ Resolve forward branch. 351 | LEAQ< RAX, [RDI]. $FF 352 | SUBQ< RAX, RBX 353 | VERIFY-BRANCH-OFFSET 354 | MOVB> RAX, [RBX] 355 | DROP ; 356 | 357 | : TARGET< ( -- dest ) CALL> 358 | \ Push current location as backward branch target. 359 | \ May be used by 363 | \ Push offset to backward branch target. 364 | SUBQ< RBX, RDI 365 | LEAQ< RAX, [RBX]. $FF 366 | VERIFY-BRANCH-OFFSET 367 | STOSB 368 | DROP ; 369 | 370 | [FORTH-DEFINITIONS] 371 | 372 | : AHEAD ( CT: -- orig ) ( RT: *a -- *a / *b ) 373 | \ Always branches forward. 374 | ^EB BRANCH> ; 375 | : ?IF ( CT: -- orig ) ( RT: *a x -- *a x / *a x ) 376 | \ Non-destructive IF. Takes the first branch 377 | \ if top of stack is nonzero, otherwise skips 378 | \ to THEN or ELSE. 379 | ^48 ^85 ^DB \ TEST RBX, RBX 380 | ^74 BRANCH> ; \ JZ branch 381 | : ; \ JNS branch 387 | 388 | : THEN ( CT: orig -- ) ( RT: *a / *a -- *a ) 389 | \ Resolve a forward branch. 390 | >TARGET ; 391 | : ELSE ( CT: orig1 -- orig2 ) ( RT: *a / *b -- *b / *a ) 392 | \ Swap between branches. 393 | ^EB BRANCH> SWAP >TARGET ; 394 | 395 | : BEGIN ( CT: -- dest ) ( RT: *a -- ~*a / *a ) 396 | \ Begin a loop. 397 | TARGET< ; 398 | : AGAIN ( CT: dest -- ) ( RT: *~a / *a -- *b ) 399 | \ Loop forever. 400 | \ Used at end of loop, e.g. BEGIN ... AGAIN 401 | ^EB ; \ JNZ branch 413 | SWAP ; 414 | 415 | : REPEAT ( CT: orig dest -- ) ( RT: *b / *~a / *a -- *b ) 416 | \ End a "begin ... while ..." loop. 417 | \ This is equivalent to "again then". 418 | ^EB TARGET ; 419 | 420 | [ASSEMBLER-DEFINITIONS] 421 | 422 | \ Like ?IF but use CPU flags instead of testing stack top. 423 | : IFNO ^70 BRANCH> ; \ if no overflow (OF=0) 424 | : IFO ^71 BRANCH> ; \ if overflow (OF=1) 425 | : IFAE ^72 BRANCH> ; \ if above or equal (CF=0) 426 | : IFB ^73 BRANCH> ; \ if below (CF=1) 427 | : IFNZ ^74 BRANCH> ; \ if non-equal (ZF=1) 428 | : IFZ ^75 BRANCH> ; \ if zero (ZF=0) 429 | : IFA ^76 BRANCH> ; \ if above (CF=0 and ZF=0) 430 | : IFBE ^77 BRANCH> ; \ if below or equal (CF=1 or ZF=1) 431 | : IFNS ^78 BRANCH> ; \ if positive (SF=0) 432 | : IFS ^79 BRANCH> ; \ if negative (SF=1) 433 | : IFPO ^7A BRANCH> ; \ if parity odd (PF=0) 434 | : IFPE ^7B BRANCH> ; \ if parity even (PF=1) 435 | : IFGE ^7C BRANCH> ; \ if greater or equal (SF=OF) 436 | : IFL ^7D BRANCH> ; \ if less (SF<>OF) 437 | : IFG ^7E BRANCH> ; \ if greater (SF=OF) 438 | : IFLE ^7F BRANCH> ; \ if less or equal (SF<>OF) 439 | 440 | \ Like ?UNTIL but using CPU flags instead of testing stack top. 441 | : UNTILNO ^70 OF) 455 | : UNTILG ^7E OF) 457 | 458 | \ Like ?WHILE but uses CPU flags instead of testing stack top. 459 | : WHILENO ^70 BRANCH> SWAP ; \ while no overflow (OF=0) 460 | : WHILEO ^71 BRANCH> SWAP ; \ while overflow (OF=1) 461 | : WHILEAE ^72 BRANCH> SWAP ; \ while above or equal (CF=0) 462 | : WHILEB ^73 BRANCH> SWAP ; \ while below (CF=1) 463 | : WHILENZ ^74 BRANCH> SWAP ; \ while non-equal (ZF=1) 464 | : WHILEZ ^75 BRANCH> SWAP ; \ while zero (ZF=0) 465 | : WHILEA ^76 BRANCH> SWAP ; \ while above (CF=0 and ZF=0) 466 | : WHILEBE ^77 BRANCH> SWAP ; \ while below or equal (CF=1 or ZF=1) 467 | : WHILENS ^78 BRANCH> SWAP ; \ while positive (SF=0) 468 | : WHILES ^79 BRANCH> SWAP ; \ while negative (SF=1) 469 | : WHILEPO ^7A BRANCH> SWAP ; \ while parity odd (PF=0) 470 | : WHILEPE ^7B BRANCH> SWAP ; \ while parity even (PF=1) 471 | : WHILEGE ^7C BRANCH> SWAP ; \ while greater or equal (SF=OF) 472 | : WHILEL ^7D BRANCH> SWAP ; \ while less (SF<>OF) 473 | : WHILEG ^7E BRANCH> SWAP ; \ while greater (SF=OF) 474 | : WHILELE ^7F BRANCH> SWAP ; \ while less or equal (SF<>OF) 475 | 476 | [FORTH-DEFINITIONS] 477 | 478 | : + ( n1 n2 -- n3 ) CALL> 479 | \ Addition. 480 | ADDQ< RBX, [R15] 481 | NIP ; 482 | : - ( n1 n2 -- n3 ) CALL> 483 | \ Subtraction. 484 | MOVQ< RAX, [R15] 485 | NIP 486 | SUBQ< RAX, RBX 487 | MOVQ< RBX, RAX ; 488 | : * ( n1 n2 -- n3 ) CALL> 489 | \ Multiplication. 490 | IMULQ< RBX, [R15] 491 | NIP ; 492 | : < ( n1 n2 -- flag ) CALL> 493 | SUBQ< RBX, [R15] 494 | SARQ_. RBX $3F 495 | NIP ; 496 | : > ( n1 n2 -- flag ) CALL> 497 | SUBQ< RBX, [R15] 498 | SARQ_. RBX $3F 499 | NOTQ_ RBX 500 | NIP ; 501 | : = ( n1 n2 -- flag ) CALL> 502 | CMPQ< RBX, [R15] 503 | SETNZ_ RBX 504 | DECB_ RBX 505 | MOVSXQB< RBX, RBX 506 | NIP ; 507 | 508 | : /MOD ( i1 +i2 -- i3 i4 ) CALL> 509 | \ Signed integer division. 510 | MOVQ< RAX, [R15] 511 | CQO 512 | IDIVQ_ RBX 513 | MOVQ> RAX, [R15] 514 | MOVQ< RBX, RDX ; 515 | : U/MOD ( u1 +u2 -- u3 u4 ) CALL> 516 | \ Unsigned integer division. 517 | MOVQ< RAX, [R15] 518 | XORL< RDX, RDX 519 | DIVQ_ RBX 520 | MOVQ> RAX, [R15] 521 | MOVQ< RBX, RDX ; 522 | 523 | : 1+ ( n1 -- n2 ) INLINE/CALL> 524 | INCQ_ RBX ; 525 | : 1- ( n1 -- n2 ) INLINE/CALL> 526 | DECQ_ RBX ; 527 | 528 | : NEGATE ( i1 -- i2 ) INLINE/CALL> 529 | NEGQ_ RBX ; 530 | : INVERT ( i1 -- i2 ) INLINE/CALL> 531 | NOTQ_ RBX ; 532 | 533 | : .DIGITS ( u -- ) CALL> 534 | \ Print decimal digits of unsigned number. 535 | U. $0A U/MOD SWAP 536 | ?IF .DIGITS ELSE DROP THEN 537 | '0' + EMIT ; 538 | 539 | : . ( i -- ) CALL> 540 | \ Print decimal number, followed by space. 541 | name" -- c-addr u ) CALL> 549 | \ Parse a name from source stream. 550 | \ TODO Proper bounds checking. 551 | BEGIN 552 | LODSB 553 | CMP-AL. $20 554 | UNTILA 555 | LEAQ< R15, [R15]. $F0 556 | MOVQ> RBX, [R15]. $08 557 | LEAQ< RBX, [RSI]. $FF 558 | MOVQ> RBX, [R15] 559 | XORL< RBX, RBX 560 | BEGIN 561 | INCQ_ RBX 562 | LODSB 563 | CMP-AL. $20 564 | UNTILBE ; 565 | 566 | : FIND-NAME-IN ( c-addr u wid -- nt|0 ) CALL> 567 | DROP DROP DROP 0 ; \ TODO 568 | 569 | : EXIT ^C3 ; 570 | 571 | : I8_MAX INLINE/CALL> U. $7F ; 572 | : I8_MIN INLINE/CALL> I: $FFFFFF80 ; 573 | : U8_MAX INLINE/CALL> U. $FF ; 574 | : U8_MIN INLINE/CALL> 0 ; 575 | : I16_MAX INLINE/CALL> U: $00007FFF ; 576 | : I16_MIN INLINE/CALL> I: $FFFF8000 ; 577 | : U16_MAX INLINE/CALL> U: $0000FFFF ; 578 | : U16_MIN INLINE/CALL> 0 ; 579 | : I32_MAX INLINE/CALL> U: $7FFFFFFF ; 580 | : I32_MIN INLINE/CALL> I: $80000000 ; 581 | : U32_MAX INLINE/CALL> U: $FFFFFFFF ; 582 | : U32_MIN INLINE/CALL> 0 ; 583 | : I64_MAX INLINE/CALL> X:: $7FFFFFFFFFFFFFFF ; 584 | : I64_MIN INLINE/CALL> X:: $8000000000000000 ; 585 | : U64_MAX INLINE/CALL> I: $FFFFFFFF ; 586 | : U64_MIN INLINE/CALL> 0 ; 587 | -------------------------------------------------------------------------------- /src/3-main.fs: -------------------------------------------------------------------------------- 1 | [PROGRAM-DEFINITIONS] 2 | 3 | : MAIN CALL> 4 | \ 'H' EMIT 'e' EMIT 'l' EMIT 'l' EMIT 'o' EMIT '!' EMIT CR 5 | U. $0A . CR 6 | I8_MAX . 7 | I8_MIN . CR 8 | I16_MAX . 9 | I16_MIN . CR 10 | I32_MAX . 11 | I32_MIN . CR 12 | I64_MAX . 13 | I64_MIN . CR 14 | I8_MAX I8_MAX = . CR 15 | DUP 16 | MOVQ< RBX, RDI 17 | SUBQ< RBX, [RBP]: $USER.PROG 18 | . CR 19 | ; 20 | 21 | [ MAIN BYE ] 22 | -------------------------------------------------------------------------------- /src/constants.c: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | 4 | #define MK(n) printf("-D%s=%lld ", #n, (long long)n) 5 | int main(void) { 6 | MK(PROT_EXEC); 7 | MK(PROT_READ); 8 | MK(PROT_WRITE); 9 | MK(MAP_ANON); 10 | #ifdef MAP_JIT 11 | MK(MAP_JIT); 12 | #endif 13 | MK(MAP_PRIVATE); 14 | MK(MAP_FAILED); 15 | } 16 | -------------------------------------------------------------------------------- /src/yotta.s: -------------------------------------------------------------------------------- 1 | bits 64 2 | global _main 3 | global main 4 | extern _write 5 | extern _read 6 | extern _exit 7 | extern _mmap 8 | 9 | section .text 10 | 11 | %ifdef OS_LINUX 12 | OS_ID equ 1 13 | SYS_EXIT equ 60 14 | SYS_WRITE equ 1 15 | SYS_MMAP equ 9 16 | PROT_READ equ 1 17 | PROT_WRITE equ 2 18 | PROT_EXEC equ 4 19 | MAP_ANON equ 32 20 | MAP_JIT equ 0 21 | MAP_PRIVATE equ 2 22 | MAP_FAILED equ -1 23 | %elifdef OS_MACOS 24 | OS_ID equ 2 25 | SYS_EXIT equ 0x2000001 26 | SYS_WRITE equ 0x2000004 27 | SYS_MMAP equ 0x20000C5 28 | PROT_READ equ 0x1 29 | PROT_WRITE equ 0x2 30 | PROT_EXEC equ 0x4 31 | MAP_ANON equ 0x1000 32 | MAP_JIT equ 0x800 33 | MAP_PRIVATE equ 0x2 34 | MAP_FAILED equ -1 35 | %endif 36 | 37 | NAME_SIZE equ 32 38 | SORD_SIZE equ 128 39 | 40 | struc DICT 41 | .LINK resq 1 42 | .NAME resq NAME_SIZE/8 43 | .CODE resq 1 44 | .DATA resq 2 45 | endstruc 46 | 47 | struc USER 48 | .HERE resq 1 ; pointer into DATA region 49 | .PROG resq 1 ; base of program memory 50 | .KERS resq 1 ; kernel source 51 | .EVAL resq 1 ; literal evaluator, i.e. code to fall back on if FIND failed 52 | .NAME resq NAME_SIZE/8 ; name buffer, holds last name parsed 53 | .KERW resq 1 ; kernel word list 54 | .MINW resq 1 ; minimal word list 55 | .ASMW resq 1 ; assembler word list 56 | .FORW resq 1 ; forth word list 57 | .PRGW resq 1 ; program word list 58 | .DICT resq 1 ; dictionary for new definitions 59 | .WORD resq 1 ; word primitive 60 | .FIND resq 1 ; find primitive 61 | .OSID resq 1 ; operating system id (1 = linux, 2 = macos) 62 | resq 1 ; padding to align SORD by 16 bytes 63 | .SORD resq SORD_SIZE/8 ; search order 64 | endstruc 65 | 66 | main: 67 | _main: ; align stack 68 | and rsp, -16 69 | 70 | ; initialize user data & dictionary 71 | lea rbp, [rel DATA] 72 | mov rdi, rbp 73 | xor eax, eax 74 | mov rcx, USER_size / 8 75 | rep stosq 76 | 77 | mov rax, OS_ID 78 | mov [rbp + USER.OSID], rax 79 | lea rax, [rel CARET] 80 | mov [rbp + USER.EVAL], rax 81 | lea rax, [rel FIND] 82 | mov [rbp + USER.FIND], rax 83 | lea rax, [rel _WORD] 84 | mov [rbp + USER.WORD], rax 85 | lea rax, [rel KERNEL] 86 | mov [rbp + USER.KERS], rax 87 | lea rcx, [rbp + USER.KERW] 88 | mov [rcx], rdi 89 | mov [rbp + USER.DICT], rcx 90 | mov [rbp + USER.SORD], rcx 91 | lea rcx, [rbp + USER.PRGW] 92 | mov [rbp + USER.SORD + 8], rcx 93 | lea rcx, [rbp + USER.FORW] 94 | mov [rbp + USER.SORD + 16], rcx 95 | lea rcx, [rbp + USER.ASMW] 96 | mov [rbp + USER.SORD + 24], rcx 97 | lea rcx, [rbp + USER.MINW] 98 | mov [rbp + USER.SORD + 32], rcx 99 | 100 | xor eax, eax 101 | stosq ; LINK 102 | mov rax, 0x2020202020203A01 ; ":" 103 | stosq ; NAME[0:8] 104 | mov rax, 0x2020202020202020 105 | mov rcx, NAME_SIZE/8 - 1 106 | rep stosq 107 | lea rax, [rel COLON] 108 | stosq ; CODE 109 | xor eax, eax 110 | stosq ; DATA 111 | stosq 112 | 113 | mov [rbp + USER.HERE], rdi 114 | 115 | ; call _mmap to get a nice chunk of RWX memory 116 | mov rax, SYS_MMAP 117 | lea rdi, [rel _main - 0x40000000] ; get somewhere "close" 118 | ; xor edi, edi 119 | mov rsi, 0x10000000 ; size of JIT region 120 | mov rdx, PROT_READ | PROT_WRITE | PROT_EXEC ; RWX permission 121 | mov r10, MAP_ANON | MAP_PRIVATE | MAP_JIT ; JIT mapping 122 | mov r8, -1 123 | xor r9d, r9d 124 | syscall 125 | jc .syserr 126 | cmp rax, MAP_FAILED 127 | je .bad 128 | 129 | mov [rbp + USER.PROG], rax 130 | 131 | lea rdx, [rel _main] 132 | lea r8, [rdx + 0x7FFF0000] 133 | cmp rax, r8 134 | jae .bad 135 | 136 | lea r8, [rdx - 0x7FFF0000] 137 | cmp rax, r8 138 | jae .ok 139 | 140 | .syserr mov rdi, rax ; failed to allocate map 141 | mov rax, SYS_EXIT 142 | syscall 143 | jmp .bad 144 | 145 | .bad mov rax, SYS_EXIT 146 | mov rdi, -1 ; failed to allocate map 147 | syscall 148 | jmp .bad 149 | 150 | ; set up registers 151 | .ok mov rdi, [rbp + USER.PROG] 152 | lea rsi, [rel KERNEL] 153 | 154 | EVAL: call _WORD 155 | call FIND 156 | jz .fail 157 | mov r13, rax 158 | call [r13 + DICT.CODE] 159 | jmp EVAL 160 | .fail: call qword [rbp + USER.EVAL] 161 | jmp EVAL 162 | 163 | BYE: and rsp, -16 164 | mov rax, SYS_EXIT 165 | mov rdi, 43 166 | syscall 167 | 168 | ; read word from RSI, store it in NAME buffer 169 | ; doesn't affect registers other than RSI 170 | _WORD: push rax 171 | push rcx 172 | push rdi 173 | lea rdi, [rbp + USER.NAME] 174 | mov rax, 0x2020202020202020 175 | mov rcx, NAME_SIZE/8 176 | rep stosq 177 | xor eax, eax 178 | xor ecx, ecx 179 | lea rdi, [rbp + USER.NAME + 1] ; leading byte is for length 180 | .skip lodsb 181 | cmp al, ' ' ; skip whitespace / control chars 182 | jbe .skip 183 | .upper cmp al, 'a' 184 | jb .store 185 | cmp al, 'z' 186 | ja .store 187 | ; sub al, 32 ; convert to uppercase 188 | .store stosb 189 | inc cl 190 | cmp cl, NAME_SIZE-1 191 | jae .done 192 | lodsb 193 | cmp al, ' ' ; stop storing at whitespace / control chars 194 | ja .upper 195 | dec rsi ; restore whitespace character 196 | .done mov [rbp + USER.NAME], cl ; store length in name buffer 197 | pop rdi 198 | pop rcx 199 | pop rax 200 | ret 201 | 202 | ; search for NAME in wordlists 203 | ; return resulting DICT in RAX, sets ZF if not found 204 | FIND: push rsi 205 | push rdi 206 | push rcx 207 | push rbx 208 | xor ebx, ebx 209 | .list mov rax, [rbp + USER.SORD + rbx*8] ; continue with list # rcx 210 | test rax, rax 211 | jz .fail 212 | jmp .link 213 | 214 | .item lea rsi, [rbp + USER.NAME] 215 | lea rdi, [rax + DICT.NAME] 216 | mov rcx, NAME_SIZE/8 217 | repe cmpsq 218 | jz .found 219 | 220 | .link mov rax, [rax] 221 | test rax, rax 222 | jnz .item 223 | 224 | inc rbx 225 | cmp rbx, SORD_SIZE/8 226 | jb .list 227 | 228 | .found test rax, rax 229 | .fail pop rbx 230 | pop rcx 231 | pop rdi 232 | pop rsi 233 | ret 234 | 235 | ; define a new word in current wordlist, pointing at RDI 236 | ; changes register RSI, preserves all other registers 237 | ; changes variables NAME, HERE, DICT, and maybe FIND[0] 238 | COLON: call _WORD 239 | push rsi 240 | push rcx 241 | push rax 242 | push rdi 243 | mov rdi, [rbp + USER.HERE] 244 | add rdi, 7 245 | and rdi, -8 ; align HERE up 246 | mov rcx, [rbp + USER.DICT] 247 | mov rax, [rcx] 248 | mov [rcx], rdi 249 | stosq ; LINK 250 | lea rsi, [rbp + USER.NAME] 251 | mov rcx, 4 252 | rep movsq ; NAME 253 | mov rax, [rsp] 254 | stosq ; CODE 255 | xor eax, eax 256 | stosq ; DATA 257 | stosq 258 | mov [rbp + USER.HERE], rdi 259 | pop rdi 260 | pop rax 261 | pop rcx 262 | pop rsi 263 | ret 264 | 265 | CARET: push rax 266 | push rdx 267 | push rsi 268 | lea rsi, [rbp + USER.NAME + 1] 269 | 270 | lodsb 271 | mov dl, al 272 | cmp dl, '^' 273 | je .ok 274 | cmp dl, '$' 275 | je .ok 276 | jne .error 277 | 278 | .ok: push rcx 279 | push rbx 280 | 281 | mov al, [rsi] 282 | mov dh, al 283 | cmp dh, '-' 284 | jne .nosign 285 | inc rsi 286 | .nosign mov ecx, 1 287 | xor ebx, ebx 288 | .loop lodsb 289 | cmp al, '0' 290 | jb .done 291 | cmp al, '9' 292 | jbe .dec 293 | cmp al, 'A' 294 | jb .done 295 | cmp al, 'F' 296 | jbe .hex 297 | jmp .done 298 | 299 | .dec sub al, '0' 300 | jmp .next 301 | .hex sub al, 'A' - 10 302 | .next shl rbx, 4 303 | or bl, al 304 | 305 | inc rcx 306 | jmp .loop 307 | 308 | .done shr rcx, 1 ; rcx is number of bytes to emit 309 | test rcx, rcx 310 | jz .error ; need at least one byte 311 | 312 | cmp dh, '-' 313 | jne .nosgn2 314 | neg rbx 315 | 316 | .nosgn2 cmp dl, '^' 317 | jne .imm 318 | 319 | .caret mov al, 0xB0 ; MOV AL, imm8 320 | stosb 321 | mov al, bl 322 | stosb 323 | mov al, 0xAA ; STOSB 324 | stosb 325 | shr rbx, 8 326 | loop .caret 327 | jmp .done2 328 | 329 | .imm mov al, bl 330 | stosb 331 | shr rbx, 8 332 | loop .imm 333 | 334 | .done2 pop rbx 335 | pop rcx 336 | pop rsi 337 | pop rdx 338 | pop rax 339 | ret 340 | 341 | .error and rsp, -16 342 | 343 | mov rax, SYS_WRITE 344 | mov rdi, 2 345 | lea rsi, [rel .emsg1] 346 | mov rdx, .emsg1n 347 | syscall 348 | 349 | mov rax, SYS_WRITE 350 | mov rdi, 2 351 | lea rsi, [rbp + USER.NAME + 1] 352 | movzx rdx, byte [rbp + USER.NAME] 353 | syscall 354 | 355 | mov rax, SYS_WRITE 356 | mov rdi, 2 357 | lea rsi, [rel .emsg2] 358 | mov rdx, .emsg2n 359 | syscall 360 | 361 | mov rax, SYS_EXIT 362 | mov rdi, -13 363 | syscall 364 | jmp .error 365 | 366 | .emsg1 db "unknown word: " 367 | .emsg1n equ $ - .emsg1 368 | .emsg2 db 10 369 | .emsg2n equ $ - .emsg2 370 | 371 | KERNEL: incbin "src/0-preamble.fs" 372 | incbin "src/1-assembler.fs" 373 | incbin "src/2-forth.fs" 374 | incbin "src/3-main.fs" 375 | db 0, -1, 0, -1, 0, -1, 0, -1 376 | 377 | section .bss 378 | 379 | DATA: resb 0x10000000 380 | --------------------------------------------------------------------------------