@@ -979,6 +979,46 @@ let x86_OR = new_definition
979
979
OF := F ,,
980
980
UNDEFINED_VALUES[AF]) s`;;
981
981
982
+ let x86_PADDD = new_definition
983
+ `x86_PADDD dest src s =
984
+ let x = read dest s in
985
+ let y = read src s in
986
+ let r0 = word_add
987
+ ((word_subword:(128 word->num#num->32 word)) x (0 ,32 ))
988
+ ((word_subword:(128 word->num#num->32 word)) y (0 ,32 )) in
989
+ let r1 = word_add
990
+ ((word_subword:(128 word->num#num->32 word)) x (32 ,32 ))
991
+ ((word_subword:(128 word->num#num->32 word)) y (32 ,32 )) in
992
+ let r2 = word_add
993
+ ((word_subword:(128 word->num#num->32 word)) x (64 ,32 ))
994
+ ((word_subword:(128 word->num#num->32 word)) y (64 ,32 )) in
995
+ let r3 = word_add
996
+ ((word_subword:(128 word->num#num->32 word)) x (96 ,32 ))
997
+ ((word_subword:(128 word->num#num->32 word)) y (96 ,32 )) in
998
+ let res = (word_join:(32 word->96 word->128 word)) r3
999
+ ((word_join:(32 word->64 word->96 word)) r2
1000
+ ((word_join:(32 word->32 word->64 word)) r1 r0)) in
1001
+ (dest := res) s`;;
1002
+
1003
+ let x86_PADDQ = new_definition
1004
+ `x86_PADDQ dest src s =
1005
+ let x = read dest s in
1006
+ let y = read src s in
1007
+ let r0 = word_add
1008
+ ((word_subword:(128 word->num#num->64 word)) x (0 ,64 ))
1009
+ ((word_subword:(128 word->num#num->64 word)) y (0 ,64 )) in
1010
+ let r1 = word_add
1011
+ ((word_subword:(128 word->num#num->64 word)) x (64 ,64 ))
1012
+ ((word_subword:(128 word->num#num->64 word)) y (64 ,64 )) in
1013
+ let res = (word_join:(64 word->64 word->128 word)) r1 r0 in
1014
+ (dest := res) s`;;
1015
+
1016
+ let x86_PAND = new_definition
1017
+ `x86_PAND dest src s =
1018
+ let x = read dest s in
1019
+ let y = read src s in
1020
+ (dest := word_and x y) s`;;
1021
+
982
1022
(* ** Push and pop are a bit odd in several ways. First of all, there is ***)
983
1023
(* ** an implicit memory operand so this doesn't have quite the same ***)
984
1024
(* ** "shallowness": we refer to the memory component explicitly. And we ***)
@@ -1009,6 +1049,47 @@ let x86_PUSH = new_definition
1009
1049
(RSP := p' ,,
1010
1050
memory :> bytes(p',n) := x) s`;;
1011
1051
1052
+ let x86_PSHUFD = new_definition
1053
+ `x86_PSHUFD dest src imm8 s =
1054
+ let src = read src s in
1055
+ let od = read imm8 s in
1056
+ let d0 = (word_subword:(128 word->num#num->32 word)) src
1057
+ ((val ((word_subword:(byte->num#num->2 word)) od (0 ,2 )))*32 ,32 ) in
1058
+ let d1 = (word_subword:(128 word->num#num->32 word)) src
1059
+ ((val ((word_subword:(byte->num#num->2 word)) od (2 ,2 )))*32 ,32 ) in
1060
+ let d2 = (word_subword:(128 word->num#num->32 word)) src
1061
+ ((val ((word_subword:(byte->num#num->2 word)) od (4 ,2 )))*32 ,32 ) in
1062
+ let d3 = (word_subword:(128 word->num#num->32 word)) src
1063
+ ((val ((word_subword:(byte->num#num->2 word)) od (6 ,2 )))*32 ,32 ) in
1064
+ let res = (word_join:(32 word->96 word->128 word)) d3
1065
+ ((word_join:(32 word->64 word->96 word)) d2
1066
+ ((word_join:(32 word->32 word->64 word)) d1 d0)) in
1067
+ (dest := res) s`;;
1068
+
1069
+ let x86_PSRAD = new_definition
1070
+ `x86_PSRAD dest imm8 s =
1071
+ let d = read dest s in
1072
+ let count_src = val (read imm8 s) in
1073
+ let count = if count_src > 31 then 32 else count_src in
1074
+ let r0 = word_ishr
1075
+ ((word_subword:(128 word->num#num->32 word)) d (0 ,32 )) count in
1076
+ let r1 = word_ishr
1077
+ ((word_subword:(128 word->num#num->32 word)) d (32 ,32 )) count in
1078
+ let r2 = word_ishr
1079
+ ((word_subword:(128 word->num#num->32 word)) d (64 ,32 )) count in
1080
+ let r3 = word_ishr
1081
+ ((word_subword:(128 word->num#num->32 word)) d (96 ,32 )) count in
1082
+ let res = (word_join:(32 word->96 word->128 word)) r3
1083
+ ((word_join:(32 word->64 word->96 word)) r2
1084
+ ((word_join:(32 word->32 word->64 word)) r1 r0)) in
1085
+ (dest := res) s`;;
1086
+
1087
+ let x86_PXOR = new_definition
1088
+ `x86_PXOR dest src s =
1089
+ let x = read dest s in
1090
+ let y = read src s in
1091
+ (dest := word_xor x y) s`;;
1092
+
1012
1093
(* ** Out of alphabetical order as PUSH is a subroutine ***)
1013
1094
1014
1095
let x86_CALL = new_definition
@@ -1289,6 +1370,12 @@ let x86_XOR = new_definition
1289
1370
OF := F ,,
1290
1371
UNDEFINED_VALUES[AF]) s`;;
1291
1372
1373
+ let x86_XORPS = new_definition
1374
+ `x86_XORPS dest src s =
1375
+ let x = read src s in
1376
+ let y = read dest s in
1377
+ (dest := word_xor x y) s`;;
1378
+
1292
1379
(* ------------------------------------------------------------------------- *)
1293
1380
(* State components of various sizes corresponding to GPRs. *)
1294
1381
(* We also have a generic one "GPR" mapping to a number in all cases. *)
@@ -1765,14 +1852,26 @@ let x86_execute = define
1765
1852
| 32 -> x86_OR (OPERAND32 dest s) (OPERAND32 src s)
1766
1853
| 16 -> x86_OR (OPERAND16 dest s) (OPERAND16 src s)
1767
1854
| 8 -> x86_OR (OPERAND8 dest s) (OPERAND8 src s)) s
1855
+ | PADDD dest src ->
1856
+ x86_PADDD (OPERAND128_SSE dest s) (OPERAND128_SSE src s) s
1857
+ | PADDQ dest src ->
1858
+ x86_PADDQ (OPERAND128_SSE dest s) (OPERAND128_SSE src s) s
1859
+ | PAND dest src ->
1860
+ x86_PAND (OPERAND128_SSE dest s) (OPERAND128_SSE src s) s
1768
1861
| POP dest ->
1769
1862
(match operand_size dest with
1770
1863
64 -> x86_POP (OPERAND64 dest s)
1771
1864
| 16 -> x86_POP (OPERAND16 dest s)) s
1865
+ | PSHUFD dest src imm8 ->
1866
+ x86_PSHUFD (OPERAND128_SSE dest s) (OPERAND128_SSE src s) (OPERAND8 imm8 s) s
1867
+ | PSRAD dest imm8 ->
1868
+ x86_PSRAD (OPERAND128_SSE dest s) (OPERAND8 imm8 s) s
1772
1869
| PUSH src ->
1773
1870
(match operand_size src with
1774
1871
64 -> x86_PUSH (OPERAND64 src s)
1775
1872
| 16 -> x86_PUSH (OPERAND16 src s)) s
1873
+ | PXOR dest src ->
1874
+ x86_PXOR (OPERAND128_SSE dest s) (OPERAND128_SSE src s) s
1776
1875
| RCL dest src ->
1777
1876
(match operand_size dest with
1778
1877
64 -> x86_RCL (OPERAND64 dest s)
@@ -1910,6 +2009,8 @@ let x86_execute = define
1910
2009
| 32 -> x86_XOR (OPERAND32 dest s) (OPERAND32 src s)
1911
2010
| 16 -> x86_XOR (OPERAND16 dest s) (OPERAND16 src s)
1912
2011
| 8 -> x86_XOR (OPERAND8 dest s) (OPERAND8 src s)) s
2012
+ | XORPS dest src ->
2013
+ x86_XORPS (OPERAND128_SSE dest s) (OPERAND128_SSE src s) s
1913
2014
| _ -> (\s'. F)`;;
1914
2015
1915
2016
(* ------------------------------------------------------------------------- *)
@@ -2610,9 +2711,11 @@ let X86_OPERATION_CLAUSES =
2610
2711
x86_DIV2; x86_ENDBR64; x86_IMUL; x86_IMUL2; x86_IMUL3; x86_INC; x86_LEA; x86_LZCNT;
2611
2712
x86_MOV; x86_MOVAPS; x86_MOVDQA; x86_MOVDQU; x86_MOVSX; x86_MOVUPS; x86_MOVZX;
2612
2713
x86_MUL2; x86_MULX4; x86_NEG; x86_NOP; x86_NOT; x86_OR;
2613
- x86_POP_ALT; x86_PUSH_ALT; x86_RCL; x86_RCR; x86_RET; x86_ROL; x86_ROR;
2714
+ x86_PADDD; x86_PADDQ; x86_PAND; x86_POP_ALT; x86_PSHUFD; x86_PSRAD;
2715
+ x86_PUSH_ALT; x86_PXOR;
2716
+ x86_RCL; x86_RCR; x86_RET; x86_ROL; x86_ROR;
2614
2717
x86_SAR; x86_SBB_ALT; x86_SET; x86_SHL; x86_SHLD; x86_SHR; x86_SHRD;
2615
- x86_STC; x86_SUB_ALT; x86_TEST; x86_TZCNT; x86_XCHG; x86_XOR;
2718
+ x86_STC; x86_SUB_ALT; x86_TEST; x86_TZCNT; x86_XCHG; x86_XOR; x86_XORPS;
2616
2719
(* ** AVX2 instructions ***)
2617
2720
x86_VPXOR;
2618
2721
(* ** 32-bit backups since the ALT forms are 64-bit only ***)
0 commit comments