1 #ifndef WASM_ASM_H 2 #define WASM_ASM_H 3 #include <r_util.h> 4 5 /*** 6 * Core 7 **/ 8 typedef enum { 9 10 // Control flow operators 11 WASM_OP_TRAP = 0x00, 12 WASM_OP_NOP, 13 WASM_OP_BLOCK, 14 WASM_OP_LOOP, 15 WASM_OP_IF, 16 WASM_OP_ELSE, 17 WASM_OP_END = 0x0b, 18 WASM_OP_BR, 19 WASM_OP_BRIF, 20 WASM_OP_BRTABLE, 21 WASM_OP_RETURN, 22 23 // Call operators 24 WASM_OP_CALL = 0x10, 25 WASM_OP_CALLINDIRECT, 26 27 // Parametric operators 28 WASM_OP_DROP = 0x1a, 29 WASM_OP_SELECT, 30 31 // Variable access 32 WASM_OP_GETLOCAL = 0x20, 33 WASM_OP_SETLOCAL, 34 WASM_OP_TEELOCAL, 35 WASM_OP_GETGLOBAL, 36 WASM_OP_SETGLOBAL, 37 38 // Memory-related operators 39 WASM_OP_I32LOAD = 0x28, 40 WASM_OP_I64LOAD, 41 WASM_OP_F32LOAD, 42 WASM_OP_F64LOAD, 43 WASM_OP_I32LOAD8S, 44 WASM_OP_I32LOAD8U, 45 WASM_OP_I32LOAD16S, 46 WASM_OP_I32LOAD16U, 47 WASM_OP_I64LOAD8S, 48 WASM_OP_I64LOAD8U, 49 WASM_OP_I64LOAD16S, 50 WASM_OP_I64LOAD16U, 51 WASM_OP_I64LOAD32S, 52 WASM_OP_I64LOAD32U, 53 WASM_OP_I32STORE, 54 WASM_OP_I64STORE, 55 WASM_OP_F32STORE, 56 WASM_OP_F64STORE, 57 WASM_OP_I32STORE8, 58 WASM_OP_I32STORE16, 59 WASM_OP_I64STORE8, 60 WASM_OP_I64STORE16, 61 WASM_OP_I64STORE32, 62 WASM_OP_CURRENTMEMORY, 63 WASM_OP_GROWMEMORY, 64 65 // Constants 66 WASM_OP_I32CONST, 67 WASM_OP_I64CONST, 68 WASM_OP_F32CONST, 69 WASM_OP_F64CONST, 70 71 // Comparison operators 72 WASM_OP_I32EQZ, 73 WASM_OP_I32EQ, 74 WASM_OP_I32NE, 75 WASM_OP_I32LTS, 76 WASM_OP_I32LTU, 77 WASM_OP_I32GTS, 78 WASM_OP_I32GTU, 79 WASM_OP_I32LES, 80 WASM_OP_I32LEU, 81 WASM_OP_I32GES, 82 WASM_OP_I32GEU, 83 WASM_OP_I64EQZ, 84 WASM_OP_I64EQ, 85 WASM_OP_I64NE, 86 WASM_OP_I64LTS, 87 WASM_OP_I64LTU, 88 WASM_OP_I64GTS, 89 WASM_OP_I64GTU, 90 WASM_OP_I64LES, 91 WASM_OP_I64LEU, 92 WASM_OP_I64GES, 93 WASM_OP_I64GEU, 94 WASM_OP_F32EQ, 95 WASM_OP_F32NE, 96 WASM_OP_F32LT, 97 WASM_OP_F32GT, 98 WASM_OP_F32LE, 99 WASM_OP_F32GE, 100 WASM_OP_F64EQ, 101 WASM_OP_F64NE, 102 WASM_OP_F64LT, 103 WASM_OP_F64GT, 104 WASM_OP_F64LE, 105 WASM_OP_F64GE, 106 107 // Numeric operators 108 WASM_OP_I32CLZ, 109 WASM_OP_I32CTZ, 110 WASM_OP_I32POPCNT, 111 WASM_OP_I32ADD, 112 WASM_OP_I32SUB, 113 WASM_OP_I32MUL, 114 WASM_OP_I32DIVS, 115 WASM_OP_I32DIVU, 116 WASM_OP_I32REMS, 117 WASM_OP_I32REMU, 118 WASM_OP_I32AND, 119 WASM_OP_I32OR, 120 WASM_OP_I32XOR, 121 WASM_OP_I32SHL, 122 WASM_OP_I32SHRS, 123 WASM_OP_I32SHRU, 124 WASM_OP_I32ROTL, 125 WASM_OP_I32ROTR, 126 WASM_OP_I64CLZ, 127 WASM_OP_I64CTZ, 128 WASM_OP_I64POPCNT, 129 WASM_OP_I64ADD, 130 WASM_OP_I64SUB, 131 WASM_OP_I64MUL, 132 WASM_OP_I64DIVS, 133 WASM_OP_I64DIVU, 134 WASM_OP_I64REMS, 135 WASM_OP_I64REMU, 136 WASM_OP_I64AND, 137 WASM_OP_I64OR, 138 WASM_OP_I64XOR, 139 WASM_OP_I64SHL, 140 WASM_OP_I64SHRS, 141 WASM_OP_I64SHRU, 142 WASM_OP_I64ROTL, 143 WASM_OP_I64ROTR, 144 WASM_OP_F32ABS, 145 WASM_OP_F32NEG, 146 WASM_OP_F32CEIL, 147 WASM_OP_F32FLOOR, 148 WASM_OP_F32TRUNC, 149 WASM_OP_F32NEAREST, 150 WASM_OP_F32SQRT, 151 WASM_OP_F32ADD, 152 WASM_OP_F32SUB, 153 WASM_OP_F32MUL, 154 WASM_OP_F32DIV, 155 WASM_OP_F32MIN, 156 WASM_OP_F32MAX, 157 WASM_OP_F32COPYSIGN, 158 WASM_OP_F64ABS, 159 WASM_OP_F64NEG, 160 WASM_OP_F64CEIL, 161 WASM_OP_F64FLOOR, 162 WASM_OP_F64TRUNC, 163 WASM_OP_F64NEAREST, 164 WASM_OP_F64SQRT, 165 WASM_OP_F64ADD, 166 WASM_OP_F64SUB, 167 WASM_OP_F64MUL, 168 WASM_OP_F64DIV, 169 WASM_OP_F64MIN, 170 WASM_OP_F64MAX, 171 WASM_OP_F64COPYSIGN, 172 173 // Conversions 174 WASM_OP_I32WRAPI64, 175 WASM_OP_I32TRUNCSF32, 176 WASM_OP_I32TRUNCUF32, 177 WASM_OP_I32TRUNCSF64, 178 WASM_OP_I32TRUNCUF64, 179 WASM_OP_I64EXTENDSI32, 180 WASM_OP_I64EXTENDUI32, 181 WASM_OP_I64TRUNCSF32, 182 WASM_OP_I64TRUNCUF32, 183 WASM_OP_I64TRUNCSF64, 184 WASM_OP_I64TRUNCUF64, 185 WASM_OP_F32CONVERTSI32, 186 WASM_OP_F32CONVERTUI32, 187 WASM_OP_F32CONVERTSI64, 188 WASM_OP_F32CONVERTUI64, 189 WASM_OP_F32DEMOTEF64, 190 WASM_OP_F64CONVERTSI32, 191 WASM_OP_F64CONVERTUI32, 192 WASM_OP_F64CONVERTSI64, 193 WASM_OP_F64CONVERTUI64, 194 WASM_OP_F64PROMOTEF32, 195 196 // Reinterpretations 197 WASM_OP_I32REINTERPRETF32, 198 WASM_OP_I64REINTERPRETF64, 199 WASM_OP_F32REINTERPRETI32, 200 WASM_OP_F64REINTERPRETI64, 201 202 } WasmOpCodes; 203 204 /*** 205 * Thread extension (0xFE ...) 206 **/ 207 typedef enum { 208 209 // Wait and notify 210 WASM_OP_ATOMICNOTIFY = 0x00, 211 WASM_OP_I32ATOMICWAIT, 212 WASM_OP_I64ATOMICWAIT, 213 214 // Load/Store 215 WASM_OP_I32ATOMICLOAD = 0x10, 216 WASM_OP_I64ATOMICLOAD, 217 WASM_OP_I32ATOMICLOAD8U, 218 WASM_OP_I32ATOMICLOAD16U, 219 WASM_OP_I64ATOMICLOAD8U, 220 WASM_OP_I64ATOMICLOAD16U, 221 WASM_OP_I64ATOMICLOAD32U, 222 WASM_OP_I32ATOMICSTORE = 0x17, 223 WASM_OP_I64ATOMICSTORE, 224 WASM_OP_I32ATOMICSTORE8, 225 WASM_OP_I32ATOMICSTORE16, 226 WASM_OP_I64ATOMICSTORE8, 227 WASM_OP_I64ATOMICSTORE16, 228 WASM_OP_I64ATOMICSTORE32, 229 230 // Read-Modify-Write 231 WASM_OP_I32ATOMICRMWADD = 0x1e, 232 WASM_OP_I64ATOMICRMWADD, 233 WASM_OP_I32ATOMICRMW8UADD, 234 WASM_OP_I32ATOMICRMW16UADD, 235 WASM_OP_I64ATOMICRMW8UADD, 236 WASM_OP_I64ATOMICRMW16UADD, 237 WASM_OP_I64ATOMICRMW32UADD, 238 WASM_OP_I32ATOMICRMW8USUB = 0x25, 239 WASM_OP_I32ATOMICRMW16USUB, 240 WASM_OP_I32ATOMICRMWSUB, 241 WASM_OP_I64ATOMICRMW8USUB, 242 WASM_OP_I64ATOMICRMW16USUB, 243 WASM_OP_I64ATOMICRMW32USUB, 244 WASM_OP_I64ATOMICRMWSUB, 245 WASM_OP_I32ATOMICRMWAND = 0x2c, 246 WASM_OP_I64ATOMICRMWAND, 247 WASM_OP_I32ATOMICRMW8UAND, 248 WASM_OP_I32ATOMICRMW16UAND, 249 WASM_OP_I64ATOMICRMW8UAND, 250 WASM_OP_I64ATOMICRMW16UAND, 251 WASM_OP_I64ATOMICRMW32UAND, 252 WASM_OP_I32ATOMICRMWOR = 0x33, 253 WASM_OP_I64ATOMICRMWOR, 254 WASM_OP_I32ATOMICRMW8UOR, 255 WASM_OP_I32ATOMICRMW16UOR, 256 WASM_OP_I64ATOMICRMW8UOR, 257 WASM_OP_I64ATOMICRMW16UOR, 258 WASM_OP_I64ATOMICRMW32UOR, 259 WASM_OP_I32ATOMICRMWXOR = 0x3a, 260 WASM_OP_I64ATOMICRMWXOR, 261 WASM_OP_I32ATOMICRMW8UXOR, 262 WASM_OP_I32ATOMICRMW16UXOR, 263 WASM_OP_I64ATOMICRMW8UXOR, 264 WASM_OP_I64ATOMICRMW16UXOR, 265 WASM_OP_I64ATOMICRMW32UXOR, 266 WASM_OP_I32ATOMICRMWXCHG = 0x41, 267 WASM_OP_I64ATOMICRMWXCHG, 268 WASM_OP_I32ATOMICRMW8UXCHG, 269 WASM_OP_I32ATOMICRMW16UXCHG, 270 WASM_OP_I64ATOMICRMW8UXCHG, 271 WASM_OP_I64ATOMICRMW16UXCHG, 272 WASM_OP_I64ATOMICRMW32UXCHG, 273 274 // Compare exchange 275 WASM_OP_I32ATOMICRMWCMPXCHG = 0x48, 276 WASM_OP_I64ATOMICRMWCMPXCHG, 277 WASM_OP_I32ATOMICRMW8UCMPXCHG, 278 WASM_OP_I32ATOMICRMW16UCMPXCHG, 279 WASM_OP_I64ATOMICRMW8UCMPXCHG, 280 WASM_OP_I64ATOMICRMW16UCMPXCHG, 281 WASM_OP_I64ATOMICRMW32UCMPXCHG, 282 283 } WasmOpAtomicCodes; 284 285 /*** 286 * SIMD extension (0xFD ...) 287 **/ 288 typedef enum { 289 // load ops 290 WASM_OP_V128LOAD = 0x00, 291 WASM_OP_I16X8LOAD8X8S = 0x01, 292 WASM_OP_I16X8LOAD8X8U = 0x02, 293 WASM_OP_I32X4LOAD16X4S = 0x03, 294 WASM_OP_I32X4LOAD16X4U = 0x04, 295 WASM_OP_I64X2LOAD32X2S = 0x05, 296 WASM_OP_I64X2LOAD32X2U = 0x06, 297 WASM_OP_V8X16LOADSPLAT = 0x07, 298 WASM_OP_V16X8LOADSPLAT = 0x08, 299 WASM_OP_V32X4LOADSPLAT = 0x09, 300 WASM_OP_V64X2LOADSPLAT = 0x0a, 301 WASM_OP_V128STORE = 0x0b, 302 WASM_OP_V128CONST = 0x0c, 303 304 // lane ops 305 WASM_OP_V8X16SHUFFLE = 0x0d, 306 WASM_OP_V8X16SWIZZLE = 0x0e, 307 WASM_OP_I8X16SPLAT = 0x0f, 308 WASM_OP_I16X8SPLAT = 0x10, 309 WASM_OP_I32X4SPLAT = 0x11, 310 WASM_OP_I64X2SPLAT = 0x12, 311 WASM_OP_F32X4SPLAT = 0x13, 312 WASM_OP_F64X2SPLAT = 0x14, 313 WASM_OP_I8X16EXTRACTLANES = 0x15, 314 WASM_OP_I8X16EXTRACTLANEU = 0x16, 315 WASM_OP_I8X16REPLACELANE = 0x17, 316 WASM_OP_I16X8EXTRACTLANES = 0x18, 317 WASM_OP_I16X8EXTRACTLANEU = 0x19, 318 WASM_OP_I16X8REPLACELANE = 0x1a, 319 WASM_OP_I32X4EXTRACTLANE = 0x1b, 320 WASM_OP_I32X4REPLACELANE = 0x1c, 321 WASM_OP_I64X2EXTRACTLANE = 0x1d, 322 WASM_OP_I64X2REPLACELANE = 0x1e, 323 WASM_OP_F32X4EXTRACTLANE = 0x1f, 324 WASM_OP_F32X4REPLACELANE = 0x20, 325 WASM_OP_F64X2EXTRACTLANE = 0x21, 326 WASM_OP_F64X2REPLACELANE = 0x22, 327 328 // cmp ops 329 WASM_OP_I8X16EQ = 0x23, 330 WASM_OP_I8X16NE = 0x24, 331 WASM_OP_I8X16LTS = 0x25, 332 WASM_OP_I8X16LTU = 0x26, 333 WASM_OP_I8X16GTS = 0x27, 334 WASM_OP_I8X16GTU = 0x28, 335 WASM_OP_I8X16LES = 0x29, 336 WASM_OP_I8X16LEU = 0x2a, 337 WASM_OP_I8X16GES = 0x2b, 338 WASM_OP_I8X16GEU = 0x2c, 339 WASM_OP_I16X8EQ = 0x2d, 340 WASM_OP_I16X8NE = 0x2e, 341 WASM_OP_I16X8LTS = 0x2f, 342 WASM_OP_I16X8LTU = 0x30, 343 WASM_OP_I16X8GTS = 0x31, 344 WASM_OP_I16X8GTU = 0x32, 345 WASM_OP_I16X8LES = 0x33, 346 WASM_OP_I16X8LEU = 0x34, 347 WASM_OP_I16X8GES = 0x35, 348 WASM_OP_I16X8GEU = 0x36, 349 WASM_OP_I32X4EQ = 0x37, 350 WASM_OP_I32X4NE = 0x38, 351 WASM_OP_I32X4LTS = 0x39, 352 WASM_OP_I32X4LTU = 0x3a, 353 WASM_OP_I32X4GTS = 0x3b, 354 WASM_OP_I32X4GTU = 0x3c, 355 WASM_OP_I32X4LES = 0x3d, 356 WASM_OP_I32X4LEU = 0x3e, 357 WASM_OP_I32X4GES = 0x3f, 358 WASM_OP_I32X4GEU = 0x40, 359 WASM_OP_F32X4EQ = 0x41, 360 WASM_OP_F32X4NE = 0x42, 361 WASM_OP_F32X4LT = 0x43, 362 WASM_OP_F32X4GT = 0x44, 363 WASM_OP_F32X4LE = 0x45, 364 WASM_OP_F32X4GE = 0x46, 365 WASM_OP_F64X2EQ = 0x47, 366 WASM_OP_F64X2NE = 0x48, 367 WASM_OP_F64X2LT = 0x49, 368 WASM_OP_F64X2GT = 0x4a, 369 WASM_OP_F64X2LE = 0x4b, 370 WASM_OP_F64X2GE = 0x4c, 371 372 // bitwise 373 WASM_OP_V128NOT = 0x4d, 374 WASM_OP_V128AND = 0x4e, 375 WASM_OP_V128ANDNOT = 0x4f, 376 WASM_OP_V128OR = 0x50, 377 WASM_OP_V128XOR = 0x51, 378 WASM_OP_V128BITSELECT = 0x52, 379 380 // arithmetic 381 WASM_OP_I8X16ABS = 0x60, 382 WASM_OP_I8X16NEG = 0x61, 383 WASM_OP_I8X16ANYTRUE = 0x62, 384 WASM_OP_I8X16ALLTRUE = 0x63, 385 WASM_OP_I8X16NARROWI16X8S = 0x65, 386 WASM_OP_I8X16NARROWI16X8U = 0x66, 387 WASM_OP_I8X16SHL = 0x6b, 388 WASM_OP_I8X16SHRS = 0x6c, 389 WASM_OP_I8X16SHRU = 0x6d, 390 WASM_OP_I8X16ADD = 0x6e, 391 WASM_OP_I8X16ADDSATURATES = 0x6f, 392 WASM_OP_I8X16ADDSATURATEU = 0x70, 393 WASM_OP_I8X16SUB = 0x71, 394 WASM_OP_I8X16SUBSATURATES = 0x72, 395 WASM_OP_I8X16SUBSATURATEU = 0x73, 396 WASM_OP_I8X16MINS = 0x76, 397 WASM_OP_I8X16MINU = 0x77, 398 WASM_OP_I8X16MAXS = 0x78, 399 WASM_OP_I8X16MAXU = 0x79, 400 WASM_OP_I8X16AVGRU = 0x7b, 401 WASM_OP_I16X8ABS = 0x80, 402 WASM_OP_I16X8NEG = 0x81, 403 WASM_OP_I16X8ANYTRUE = 0x82, 404 WASM_OP_I16X8ALLTRUE = 0x83, 405 WASM_OP_I16X8NARROWI32X4S = 0x85, 406 WASM_OP_I16X8NARROWI32X4U = 0x86, 407 WASM_OP_I16X8WIDENLOWI8X16S = 0x87, 408 WASM_OP_I16X8WIDENHIGHI8X16S = 0x88, 409 WASM_OP_I16X8WIDENLOWI8X16U = 0x89, 410 WASM_OP_I16X8WIDENHIGHI8X16U = 0x8a, 411 WASM_OP_I16X8SHL = 0x8b, 412 WASM_OP_I16X8SHRS = 0x8c, 413 WASM_OP_I16X8SHRU = 0x8d, 414 WASM_OP_I16X8ADD = 0x8e, 415 WASM_OP_I16X8ADDSATURATES = 0x8f, 416 WASM_OP_I16X8ADDSATURATEU = 0x90, 417 WASM_OP_I16X8SUB = 0x91, 418 WASM_OP_I16X8SUBSATURATES = 0x92, 419 WASM_OP_I16X8SUBSATURATEU = 0x93, 420 WASM_OP_I16X8MUL = 0x95, 421 WASM_OP_I16X8MINS = 0x96, 422 WASM_OP_I16X8MINU = 0x97, 423 WASM_OP_I16X8MAXS = 0x98, 424 WASM_OP_I16X8MAXU = 0x99, 425 WASM_OP_I16X8AVGRU = 0x9b, 426 WASM_OP_I32X4ABS = 0xa0, 427 WASM_OP_I32X4NEG = 0xa1, 428 WASM_OP_I32X4ANYTRUE = 0xa2, 429 WASM_OP_I32X4ALLTRUE = 0xa3, 430 WASM_OP_I32X4WIDENLOWI16X8S = 0xa7, 431 WASM_OP_I32X4WIDENHIGHI16X8S = 0xa8, 432 WASM_OP_I32X4WIDENLOWI16X8U = 0xa9, 433 WASM_OP_I32X4WIDENHIGHI16X8U = 0xaa, 434 WASM_OP_I32X4SHL = 0xab, 435 WASM_OP_I32X4SHRS = 0xac, 436 WASM_OP_I32X4SHRU = 0xad, 437 WASM_OP_I32X4ADD = 0xae, 438 WASM_OP_I32X4SUB = 0xb1, 439 WASM_OP_I32X4MUL = 0xb5, 440 WASM_OP_I32X4MINS = 0xb6, 441 WASM_OP_I32X4MINU = 0xb7, 442 WASM_OP_I32X4MAXS = 0xb8, 443 WASM_OP_I32X4MAXU = 0xb9, 444 WASM_OP_I64X2NEG = 0xc1, 445 WASM_OP_I64X2SHL = 0xcb, 446 WASM_OP_I64X2SHRS = 0xcc, 447 WASM_OP_I64X2SHRU = 0xcd, 448 WASM_OP_I64X2ADD = 0xce, 449 WASM_OP_I64X2SUB = 0xd1, 450 WASM_OP_I64X2MUL = 0xd5, 451 WASM_OP_F32X4ABS = 0xe0, 452 WASM_OP_F32X4NEG = 0xe1, 453 WASM_OP_F32X4SQRT = 0xe3, 454 WASM_OP_F32X4ADD = 0xe4, 455 WASM_OP_F32X4SUB = 0xe5, 456 WASM_OP_F32X4MUL = 0xe6, 457 WASM_OP_F32X4DIV = 0xe7, 458 WASM_OP_F32X4MIN = 0xe8, 459 WASM_OP_F32X4MAX = 0xe9, 460 WASM_OP_F64X2ABS = 0xec, 461 WASM_OP_F64X2NEG = 0xed, 462 WASM_OP_F64X2SQRT = 0xef, 463 WASM_OP_F64X2ADD = 0xf0, 464 WASM_OP_F64X2SUB = 0xf1, 465 WASM_OP_F64X2MUL = 0xf2, 466 WASM_OP_F64X2DIV = 0xf3, 467 WASM_OP_F64X2MIN = 0xf4, 468 WASM_OP_F64X2MAX = 0xf5, 469 470 // conversion 471 WASM_OP_I32X4TRUNCSATF32X4S = 0xf8, 472 WASM_OP_I32X4TRUNCSATF32X4U = 0xf9, 473 WASM_OP_F32X4CONVERTI32X4S = 0xfa, 474 WASM_OP_F32X4CONVERTI32X4U = 0xfb, 475 } WasmOpSimdCodes; 476 477 typedef enum { 478 WASM_TYPE_OP_CORE, 479 WASM_TYPE_OP_ATOMIC, 480 WASM_TYPE_OP_SIMD, 481 } WasmTypeOp; 482 483 typedef struct { 484 union { 485 WasmOpCodes core; 486 WasmOpAtomicCodes atomic; 487 WasmOpSimdCodes simd; 488 } op; 489 WasmTypeOp type; 490 int len; 491 char *txt; 492 } WasmOp; 493 494 typedef struct { 495 const char *txt; 496 size_t min, max; 497 } WasmOpDef; 498 499 #ifndef WASM_NO_ASM 500 R_IPI int wasm_asm(const char *str, unsigned char *buf, int buf_len); 501 #endif 502 R_IPI int wasm_dis(WasmOp *op, const unsigned char *buf, int buf_len); 503 504 #endif 505