Merge tag 'qemu-macppc-20230206' of https://github.com/mcayland/qemu into staging
[qemu.git] / tests / tcg / i386 / test-i386-bmi2.c
blob5fadf47510f21fb00d1373ceb6022d2fff61cdce
1 /* See if various BMI2 instructions give expected results */
2 #include <assert.h>
3 #include <stdint.h>
4 #include <stdio.h>
6 #define insn1q(name, arg0) \
7 static inline uint64_t name##q(uint64_t arg0) \
8 { \
9 uint64_t result64; \
10 asm volatile (#name "q %1, %0" : "=r"(result64) : "rm"(arg0)); \
11 return result64; \
14 #define insn1l(name, arg0) \
15 static inline uint32_t name##l(uint32_t arg0) \
16 { \
17 uint32_t result32; \
18 asm volatile (#name "l %k1, %k0" : "=r"(result32) : "rm"(arg0)); \
19 return result32; \
22 #define insn2q(name, arg0, c0, arg1, c1) \
23 static inline uint64_t name##q(uint64_t arg0, uint64_t arg1) \
24 { \
25 uint64_t result64; \
26 asm volatile (#name "q %2, %1, %0" : "=r"(result64) : c0(arg0), c1(arg1)); \
27 return result64; \
30 #define insn2l(name, arg0, c0, arg1, c1) \
31 static inline uint32_t name##l(uint32_t arg0, uint32_t arg1) \
32 { \
33 uint32_t result32; \
34 asm volatile (#name "l %k2, %k1, %k0" : "=r"(result32) : c0(arg0), c1(arg1)); \
35 return result32; \
38 #ifdef __x86_64
39 insn2q(pext, src, "r", mask, "rm")
40 insn2q(pdep, src, "r", mask, "rm")
41 insn2q(andn, clear, "rm", val, "r")
42 insn2q(bextr, range, "rm", val, "r")
43 insn2q(bzhi, pos, "rm", val, "r")
44 insn2q(rorx, val, "r", n, "i")
45 insn2q(sarx, val, "rm", n, "r")
46 insn2q(shlx, val, "rm", n, "r")
47 insn2q(shrx, val, "rm", n, "r")
48 insn1q(blsi, src)
49 insn1q(blsmsk, src)
50 insn1q(blsr, src)
51 #endif
52 insn2l(pext, src, "r", mask, "rm")
53 insn2l(pdep, src, "r", mask, "rm")
54 insn2l(andn, clear, "rm", val, "r")
55 insn2l(bextr, range, "rm", val, "r")
56 insn2l(bzhi, pos, "rm", val, "r")
57 insn2l(rorx, val, "r", n, "i")
58 insn2l(sarx, val, "rm", n, "r")
59 insn2l(shlx, val, "rm", n, "r")
60 insn2l(shrx, val, "rm", n, "r")
61 insn1l(blsi, src)
62 insn1l(blsmsk, src)
63 insn1l(blsr, src)
65 int main(int argc, char *argv[]) {
66 uint64_t ehlo = 0x202020204f4c4845ull;
67 uint64_t mask = 0xa080800302020001ull;
68 uint32_t result32;
70 #ifdef __x86_64
71 uint64_t result64;
73 /* 64 bits */
74 result64 = andnq(mask, ehlo);
75 assert(result64 == 0x002020204d4c4844);
77 result64 = pextq(ehlo, mask);
78 assert(result64 == 133);
80 result64 = pdepq(result64, mask);
81 assert(result64 == (ehlo & mask));
83 result64 = pextq(-1ull, mask);
84 assert(result64 == 511); /* mask has 9 bits set */
86 result64 = pdepq(-1ull, mask);
87 assert(result64 == mask);
89 result64 = bextrq(mask, 0x3f00);
90 assert(result64 == (mask & ~INT64_MIN));
92 result64 = bextrq(mask, 0x1038);
93 assert(result64 == 0xa0);
95 result64 = bextrq(mask, 0x10f8);
96 assert(result64 == 0);
98 result64 = blsiq(0x30);
99 assert(result64 == 0x10);
101 result64 = blsiq(0x30ull << 32);
102 assert(result64 == 0x10ull << 32);
104 result64 = blsmskq(0x30);
105 assert(result64 == 0x1f);
107 result64 = blsrq(0x30);
108 assert(result64 == 0x20);
110 result64 = blsrq(0x30ull << 32);
111 assert(result64 == 0x20ull << 32);
113 result64 = bzhiq(mask, 0x3f);
114 assert(result64 == (mask & ~INT64_MIN));
116 result64 = bzhiq(mask, 0x1f);
117 assert(result64 == (mask & ~(-1 << 30)));
119 result64 = rorxq(0x2132435465768798, 8);
120 assert(result64 == 0x9821324354657687);
122 result64 = sarxq(0xffeeddccbbaa9988, 8);
123 assert(result64 == 0xffffeeddccbbaa99);
125 result64 = sarxq(0x77eeddccbbaa9988, 8 | 64);
126 assert(result64 == 0x0077eeddccbbaa99);
128 result64 = shrxq(0xffeeddccbbaa9988, 8);
129 assert(result64 == 0x00ffeeddccbbaa99);
131 result64 = shrxq(0x77eeddccbbaa9988, 8 | 192);
132 assert(result64 == 0x0077eeddccbbaa99);
134 result64 = shlxq(0xffeeddccbbaa9988, 8);
135 assert(result64 == 0xeeddccbbaa998800);
136 #endif
138 /* 32 bits */
139 result32 = andnl(mask, ehlo);
140 assert(result32 == 0x04d4c4844);
142 result32 = pextl((uint32_t) ehlo, mask);
143 assert(result32 == 5);
145 result32 = pdepl(result32, mask);
146 assert(result32 == (uint32_t)(ehlo & mask));
148 result32 = pextl(-1u, mask);
149 assert(result32 == 7); /* mask has 3 bits set */
151 result32 = pdepl(-1u, mask);
152 assert(result32 == (uint32_t)mask);
154 result32 = bextrl(mask, 0x1f00);
155 assert(result32 == (mask & ~INT32_MIN));
157 result32 = bextrl(ehlo, 0x1018);
158 assert(result32 == 0x4f);
160 result32 = bextrl(mask, 0x1038);
161 assert(result32 == 0);
163 result32 = blsil(0xffff);
164 assert(result32 == 1);
166 result32 = blsmskl(0x300);
167 assert(result32 == 0x1ff);
169 result32 = blsrl(0xffc);
170 assert(result32 == 0xff8);
172 result32 = bzhil(mask, 0xf);
173 assert(result32 == 1);
175 result32 = rorxl(0x65768798, 8);
176 assert(result32 == 0x98657687);
178 result32 = sarxl(0xffeeddcc, 8);
179 assert(result32 == 0xffffeedd);
181 result32 = sarxl(0x77eeddcc, 8 | 32);
182 assert(result32 == 0x0077eedd);
184 result32 = shrxl(0xffeeddcc, 8);
185 assert(result32 == 0x00ffeedd);
187 result32 = shrxl(0x77eeddcc, 8 | 128);
188 assert(result32 == 0x0077eedd);
190 result32 = shlxl(0xffeeddcc, 8);
191 assert(result32 == 0xeeddcc00);
193 return 0;