mirror of
https://github.com/lifting-bits/remill
synced 2026-06-21 13:56:07 +00:00
Fix bugs with PSHUFB and VPSHUFD. (#442)
This commit is contained in:
@@ -1763,10 +1763,11 @@ DEF_SEM(PSHUFB, D dst, S1 src1, S2 src2) {
|
||||
auto dst_vec = UClearV8(UReadV8(dst));
|
||||
|
||||
auto vec_count = NumVectorElems(src1_vec);
|
||||
uint8_t mask = vec_count - 1;
|
||||
_Pragma("unroll")
|
||||
for (size_t i = 0; i < vec_count; i++) {
|
||||
uint8_t v1 = UExtractV8(src2_vec, i);
|
||||
uint8_t index = UAnd(v1, 7_u8);
|
||||
uint8_t index = UAnd(v1, mask);
|
||||
uint8_t v2 = UExtractV8(src1_vec, index);
|
||||
uint8_t value = Select(SignFlag(v1), 0_u8, v2);
|
||||
dst_vec = UInsertV8(dst_vec, i, value);
|
||||
|
||||
@@ -325,8 +325,8 @@ DEF_SEM(PSHUFD, D dst, S1 src1, I8 src2) {
|
||||
|
||||
DEF_ISEL(PSHUFD_XMMdq_MEMdq_IMMb) = PSHUFD<V128W, MV128>;
|
||||
DEF_ISEL(PSHUFD_XMMdq_XMMdq_IMMb) = PSHUFD<V128W, V128>;
|
||||
IF_AVX(DEF_ISEL(VPSHUFD_XMMdq_MEMdq_IMMb) = PSHUFD<V128W, MV128>;)
|
||||
IF_AVX(DEF_ISEL(VPSHUFD_XMMdq_XMMdq_IMMb) = PSHUFD<V128W, V128>;)
|
||||
IF_AVX(DEF_ISEL(VPSHUFD_XMMdq_MEMdq_IMMb) = PSHUFD<VV128W, MV128>;)
|
||||
IF_AVX(DEF_ISEL(VPSHUFD_XMMdq_XMMdq_IMMb) = PSHUFD<VV128W, V128>;)
|
||||
IF_AVX(DEF_ISEL(VPSHUFD_YMMqq_MEMqq_IMMb) = PSHUFD<VV256W, MV256>;)
|
||||
IF_AVX(DEF_ISEL(VPSHUFD_YMMqq_YMMqq_IMMb) = PSHUFD<VV256W, V256>;)
|
||||
|
||||
|
||||
Reference in New Issue
Block a user