@@ -293,6 +293,18 @@ let decode_aux = new_definition `!pfxs rex l. decode_aux pfxs rex l =
293
293
let rm = simd_of_RM sz rm in
294
294
let dest,src = if d then rm,reg else reg,rm in
295
295
SOME (MOVUPS dest src, l)
296
+ | [0x1e :8 ] ->
297
+ read_byte l >> = \(b,l).
298
+ (bitmatch b with
299
+ | [0xfa :8 ] ->
300
+ (match pfxs with
301
+ | (F, RepZ) -> SOME (ENDBR64 ,l)
302
+ | _ -> NONE )
303
+ | _ -> NONE )
304
+ | [0x1f :8 ] -> if has_unhandled_pfxs pfxs then NONE else
305
+ let sz = op_size_W rex T pfxs in
306
+ read_ModRM_operand rex sz l >> = \((_,rm),l).
307
+ SOME (NOP_N rm,l)
296
308
| [0b0010100 :7 ; d] -> if has_pfxs pfxs then NONE else
297
309
let sz = Lower_128 in
298
310
read_ModRM rex l >> = \((reg,rm),l).
@@ -334,14 +346,18 @@ let decode_aux = new_definition `!pfxs rex l. decode_aux pfxs rex l =
334
346
read_imm Byte l >> = \(imm8,l).
335
347
SOME (AESKEYGENASSIST (mmreg reg sz) (simd_of_RM sz rm) imm8, l)
336
348
| _ -> NONE )
337
- | [0b11001 :5 ; r:3 ] -> if has_pfxs pfxs then NONE else
338
- let sz = op_size_W rex T pfxs in
339
- let reg = rex_reg (rex_B rex) r in
340
- SOME (BSWAP (% (gpr_adjust reg sz)),l)
341
349
| [0x4 :4 ; c:4 ] -> if has_pfxs pfxs then NONE else
342
350
let sz = op_size T (rex_W rex) T pfxs in
343
351
read_ModRM_operand rex sz l >> = \((reg,rm),l).
344
352
SOME (CMOV (decode_condition c) reg rm,l)
353
+ | [0x57 :8 ] -> if has_pfxs pfxs then NONE else
354
+ let sz = Lower_128 in
355
+ read_ModRM rex l >> = \((reg,rm),l).
356
+ SOME (XORPS (mmreg reg sz) (simd_of_RM sz rm), l)
357
+ | [0x66 :8 ] -> if has_unhandled_pfxs pfxs then NONE else
358
+ let sz = Lower_128 in
359
+ read_ModRM rex l >> = \((reg,rm),l).
360
+ SOME (PCMPGTD (mmreg reg sz) (simd_of_RM sz rm), l)
345
361
| [0b011 :3 ; d; 0b1111 :4 ] ->
346
362
let sz = Lower_128 in
347
363
read_ModRM rex l >> = \((reg,rm),l).
@@ -352,6 +368,20 @@ let decode_aux = new_definition `!pfxs rex l. decode_aux pfxs rex l =
352
368
| (T, Rep0) -> SOME (MOVDQA dest src, l)
353
369
| (F, RepZ) -> SOME (MOVDQU dest src, l)
354
370
| _ -> NONE )
371
+ | [0x70 :8 ] -> if has_unhandled_pfxs pfxs then NONE else
372
+ let sz = Lower_128 in
373
+ read_ModRM rex l >> = \((reg,rm),l).
374
+ read_imm Byte l >> = \(imm8,l).
375
+ SOME (PSHUFD (mmreg reg sz) (simd_of_RM sz rm) imm8, l)
376
+ | [0x72 :8 ] -> if has_unhandled_pfxs pfxs then NONE else
377
+ let sz = Lower_128 in
378
+ (read_ModRM rex l >> = \((reg,rm),l).
379
+ match rm with
380
+ | RM_reg _ -> if (word_zx reg):(3 word) = word 0b100 then
381
+ (read_imm Byte l >> = \(imm8,l).
382
+ SOME (PSRAD (simd_of_RM sz rm) imm8, l))
383
+ else NONE
384
+ | _ -> NONE )
355
385
| [0x8 :4 ; c:4 ] -> if has_pfxs pfxs then NONE else
356
386
read_int32 l >> = \(imm,l).
357
387
SOME (JUMP (decode_condition c) (Imm32 imm),l)
@@ -404,14 +434,26 @@ let decode_aux = new_definition `!pfxs rex l. decode_aux pfxs rex l =
404
434
read_ModRM rex l >> = \((reg,rm),l).
405
435
let op = if s then MOVSX else MOVZX in
406
436
SOME (op (% (gpr_adjust reg sz2)) (operand_of_RM sz rm),l)
407
- | [0x1e :8 ] ->
408
- read_byte l >> = \(b,l).
409
- (bitmatch b with
410
- | [0xfa :8 ] ->
411
- (match pfxs with
412
- | (F, RepZ) -> SOME (ENDBR64 ,l)
413
- | _ -> NONE )
414
- | _ -> NONE )
437
+ | [0b11001 :5 ; r:3 ] -> if has_pfxs pfxs then NONE else
438
+ let sz = op_size_W rex T pfxs in
439
+ let reg = rex_reg (rex_B rex) r in
440
+ SOME (BSWAP (% (gpr_adjust reg sz)),l)
441
+ | [0xd4 :8 ] -> if has_unhandled_pfxs pfxs then NONE else
442
+ let sz = Lower_128 in
443
+ read_ModRM rex l >> = \((reg,rm),l).
444
+ SOME (PADDQ (mmreg reg sz) (simd_of_RM sz rm), l)
445
+ | [0xdb :8 ] -> if has_unhandled_pfxs pfxs then NONE else
446
+ let sz = Lower_128 in
447
+ read_ModRM rex l >> = \((reg,rm),l).
448
+ SOME (PAND (mmreg reg sz) (simd_of_RM sz rm), l)
449
+ | [0xef :8 ] -> if has_unhandled_pfxs pfxs then NONE else
450
+ let sz = Lower_128 in
451
+ read_ModRM rex l >> = \((reg,rm),l).
452
+ SOME (PXOR (mmreg reg sz) (simd_of_RM sz rm), l)
453
+ | [0xfe :8 ] -> if has_unhandled_pfxs pfxs then NONE else
454
+ let sz = Lower_128 in
455
+ read_ModRM rex l >> = \((reg,rm),l).
456
+ SOME (PADDD (mmreg reg sz) (simd_of_RM sz rm), l)
415
457
| _ -> NONE )
416
458
| [0b01010 :5 ; r:3 ] -> if has_pfxs pfxs then NONE else
417
459
SOME (PUSH (% (Gpr (rex_reg (rex_B rex) r) Full_64 )),l)
@@ -467,7 +509,7 @@ let decode_aux = new_definition `!pfxs rex l. decode_aux pfxs rex l =
467
509
if opc = word 0 then
468
510
SOME (POP rm,l)
469
511
else NONE
470
- | [0x90 :8 ] -> if has_pfxs pfxs then NONE else
512
+ | [0x90 :8 ] -> if has_unhandled_pfxs pfxs then NONE else
471
513
SOME (NOP ,l)
472
514
| [0b1010100 :7 ; v] -> if has_pfxs pfxs then NONE else
473
515
let sz = op_size T (rex_W rex) v pfxs in
0 commit comments