mirror of
https://github.com/lifting-bits/remill
synced 2026-06-21 13:56:07 +00:00
Added (V)PMOVSXx instructions
This commit is contained in:
committed by
Kyle Elliott
parent
a0450170ad
commit
dcf93e624f
@@ -2078,3 +2078,84 @@ DEF_ISEL(LDMXCSR_MEMd) = LDMXCSR;
|
||||
DEF_ISEL(STMXCSR_MEMd) = STMXCSR;
|
||||
IF_AVX(DEF_ISEL(VLDMXCSR_MEMd) = LDMXCSR;)
|
||||
IF_AVX(DEF_ISEL(VSTMXCSR_MEMd) = STMXCSR;)
|
||||
|
||||
namespace {
|
||||
|
||||
#define MAKE_PMOVSXx(prefix, suffix, src_width, dst_width, dst_base_type, \
|
||||
no_elements) \
|
||||
template <typename D, typename S> \
|
||||
DEF_SEM(prefix##PMOVSX##suffix, D dst, S src) { \
|
||||
auto src_vec = SReadV##src_width(src); \
|
||||
auto dst_vec = SClearV##dst_width(SReadV##dst_width(dst)); \
|
||||
_Pragma("unroll") for (auto i = 0u; i < no_elements; i++) { \
|
||||
auto v = SExtTo<dst_base_type>(SExtractV##src_width(src_vec, i)); \
|
||||
dst_vec = SInsertV##dst_width(dst_vec, i, v); \
|
||||
} \
|
||||
SWriteV##dst_width(dst, dst_vec); \
|
||||
return memory; \
|
||||
}
|
||||
|
||||
MAKE_PMOVSXx(, BW, 8, 16, int16_t, 8);
|
||||
MAKE_PMOVSXx(, BD, 8, 32, int32_t, 4);
|
||||
MAKE_PMOVSXx(, BQ, 8, 64, int64_t, 2);
|
||||
MAKE_PMOVSXx(, WD, 16, 32, int32_t, 4);
|
||||
MAKE_PMOVSXx(, WQ, 16, 64, int64_t, 2);
|
||||
MAKE_PMOVSXx(, DQ, 32, 64, int64_t, 2);
|
||||
#if HAS_FEATURE_AVX
|
||||
MAKE_PMOVSXx(V, BW, 8, 16, int16_t, 16);
|
||||
MAKE_PMOVSXx(V, BD, 8, 32, int32_t, 8);
|
||||
MAKE_PMOVSXx(V, BQ, 8, 64, int64_t, 4);
|
||||
MAKE_PMOVSXx(V, WD, 16, 32, int32_t, 8);
|
||||
MAKE_PMOVSXx(V, WQ, 16, 64, int64_t, 4);
|
||||
MAKE_PMOVSXx(V, DQ, 32, 64, int64_t, 4);
|
||||
|
||||
#endif // HAS_FEATURE_AVX
|
||||
|
||||
#undef MAKE_PMOVSXx
|
||||
|
||||
} // namespace
|
||||
|
||||
|
||||
DEF_ISEL(PMOVSXBW_XMMdq_MEMq) = PMOVSXBW<V128W, MV64>;
|
||||
DEF_ISEL(PMOVSXBW_XMMdq_XMMq) = PMOVSXBW<V128W, V128>;
|
||||
IF_AVX(DEF_ISEL(VPMOVSXBW_XMMdq_XMMq) = PMOVSXBW<VV128W, V128>;)
|
||||
IF_AVX(DEF_ISEL(VPMOVSXBW_XMMdq_MEMq) = PMOVSXBW<VV128W, MV64>;)
|
||||
IF_AVX(DEF_ISEL(VPMOVSXBW_YMMqq_XMMdq) = VPMOVSXBW<VV256W, V256>;)
|
||||
IF_AVX(DEF_ISEL(VPMOVSXBW_YMMqq_MEMdq) = VPMOVSXBW<VV256W, MV128>;)
|
||||
|
||||
|
||||
DEF_ISEL(PMOVSXBD_XMMdq_MEMd) = PMOVSXBD<V128W, MV32>;
|
||||
DEF_ISEL(PMOVSXBD_XMMdq_XMMd) = PMOVSXBD<V128W, V128>;
|
||||
IF_AVX(DEF_ISEL(VPMOVSXBD_XMMdq_XMMd) = PMOVSXBD<VV128W, V128>;)
|
||||
IF_AVX(DEF_ISEL(VPMOVSXBD_XMMdq_MEMd) = PMOVSXBD<VV128W, MV32>;)
|
||||
IF_AVX(DEF_ISEL(VPMOVSXBD_YMMqq_XMMq) = VPMOVSXBD<VV256W, V256>;)
|
||||
IF_AVX(DEF_ISEL(VPMOVSXBD_YMMqq_MEMq) = VPMOVSXBD<VV256W, MV64>;)
|
||||
|
||||
DEF_ISEL(PMOVSXBQ_XMMdq_MEMw) = PMOVSXBQ<V128W, MV16>;
|
||||
DEF_ISEL(PMOVSXBQ_XMMdq_XMMw) = PMOVSXBQ<V128W, V128>;
|
||||
IF_AVX(DEF_ISEL(VPMOVSXBQ_XMMdq_XMMw) = PMOVSXBQ<VV128W, V128>;)
|
||||
IF_AVX(DEF_ISEL(VPMOVSXBQ_XMMdq_MEMw) = PMOVSXBQ<VV128W, MV16>;)
|
||||
IF_AVX(DEF_ISEL(VPMOVSXBQ_YMMqq_XMMd) = VPMOVSXBQ<VV256W, V256>;)
|
||||
IF_AVX(DEF_ISEL(VPMOVSXBQ_YMMqq_MEMd) = VPMOVSXBQ<VV256W, MV32>;)
|
||||
|
||||
DEF_ISEL(PMOVSXWD_XMMdq_MEMq) = PMOVSXWD<V128W, MV64>;
|
||||
DEF_ISEL(PMOVSXWD_XMMdq_XMMq) = PMOVSXWD<V128W, V128>;
|
||||
IF_AVX(DEF_ISEL(VPMOVSXWD_XMMdq_XMMq) = PMOVSXWD<VV128W, V128>;)
|
||||
IF_AVX(DEF_ISEL(VPMOVSXWD_XMMdq_MEMq) = PMOVSXWD<VV128W, MV64>;)
|
||||
IF_AVX(DEF_ISEL(VPMOVSXWD_YMMqq_XMMdq) = VPMOVSXWD<VV256W, V256>;)
|
||||
IF_AVX(DEF_ISEL(VPMOVSXWD_YMMqq_MEMdq) = VPMOVSXWD<VV256W, MV128>;)
|
||||
|
||||
|
||||
DEF_ISEL(PMOVSXWQ_XMMdq_MEMd) = PMOVSXWQ<V128W, MV32>;
|
||||
DEF_ISEL(PMOVSXWQ_XMMdq_XMMd) = PMOVSXWQ<V128W, V128>;
|
||||
IF_AVX(DEF_ISEL(VPMOVSXWQ_XMMdq_XMMd) = PMOVSXWQ<VV128W, V128>;)
|
||||
IF_AVX(DEF_ISEL(VPMOVSXWQ_XMMdq_MEMd) = PMOVSXWQ<VV128W, MV32>;)
|
||||
IF_AVX(DEF_ISEL(VPMOVSXWQ_YMMqq_XMMq) = VPMOVSXWQ<VV256W, V256>;)
|
||||
IF_AVX(DEF_ISEL(VPMOVSXWQ_YMMqq_MEMq) = VPMOVSXWQ<VV256W, MV64>;)
|
||||
|
||||
DEF_ISEL(PMOVSXDQ_XMMdq_MEMq) = PMOVSXDQ<V128W, MV64>;
|
||||
DEF_ISEL(PMOVSXDQ_XMMdq_XMMq) = PMOVSXDQ<V128W, V128>;
|
||||
IF_AVX(DEF_ISEL(VPMOVSXDQ_XMMdq_XMMq) = PMOVSXDQ<VV128W, V128>;)
|
||||
IF_AVX(DEF_ISEL(VPMOVSXDQ_XMMdq_MEMq) = PMOVSXDQ<VV128W, MV64>;)
|
||||
IF_AVX(DEF_ISEL(VPMOVSXDQ_YMMqq_XMMdq) = VPMOVSXDQ<VV256W, V256>;)
|
||||
IF_AVX(DEF_ISEL(VPMOVSXDQ_YMMqq_MEMdq) = VPMOVSXDQ<VV256W, MV128>;)
|
||||
@@ -0,0 +1,234 @@
|
||||
/*
|
||||
* Copyright (c) 2017 Trail of Bits, Inc.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
TEST_BEGIN_64(PMOVSXBWv128v128, 1)
|
||||
TEST_INPUTS(0)
|
||||
pmovsxbw xmm0, xmm1
|
||||
TEST_END_64
|
||||
|
||||
TEST_BEGIN_64(PMOVSXBWv128m64, 1)
|
||||
TEST_INPUTS(0xaabbccddeeff11)
|
||||
push ARG1_64
|
||||
pmovsxbw xmm0, [rsp]
|
||||
TEST_END_64
|
||||
|
||||
#if HAS_FEATURE_AVX
|
||||
TEST_BEGIN_64(VPMOVSXBWv128v128, 1)
|
||||
TEST_INPUTS(0)
|
||||
vpmovsxbw xmm0, xmm1
|
||||
TEST_END_64
|
||||
|
||||
TEST_BEGIN_64(VPMOVSXBWv128m64, 1)
|
||||
TEST_INPUTS(0xaabbccddeeff11)
|
||||
push ARG1_64
|
||||
vpmovsxbw xmm0, [rsp]
|
||||
TEST_END_64
|
||||
|
||||
TEST_BEGIN_64(VPMOVSXBWv256v256, 1)
|
||||
TEST_INPUTS(0)
|
||||
vpmovsxbw ymm0, xmm4
|
||||
TEST_END_64
|
||||
|
||||
TEST_BEGIN_64(VPMOVSXBWv256m128, 1)
|
||||
TEST_INPUTS(0xaabbccddeeff11)
|
||||
push ARG1_64
|
||||
push ARG1_64
|
||||
vpmovsxbw ymm0, [rsp]
|
||||
TEST_END_64
|
||||
|
||||
#endif // HAS_FEATURE_AVX
|
||||
|
||||
TEST_BEGIN_64(PMOVSXBDv128v128, 1)
|
||||
TEST_INPUTS(0)
|
||||
pmovsxbd xmm0, xmm1
|
||||
TEST_END_64
|
||||
|
||||
TEST_BEGIN_64(PMOVSXBDv128m32, 1)
|
||||
TEST_INPUTS(0xaabbccddeeff11)
|
||||
push ARG1_64
|
||||
pmovsxbd xmm0, [rsp]
|
||||
TEST_END_64
|
||||
|
||||
#if HAS_FEATURE_AVX
|
||||
TEST_BEGIN_64(VPMOVSXBDv128v128, 1)
|
||||
TEST_INPUTS(0)
|
||||
vpmovsxbd xmm0, xmm1
|
||||
TEST_END_64
|
||||
|
||||
TEST_BEGIN_64(VPMOVSXBDv128m32, 1)
|
||||
TEST_INPUTS(0xaabbccddeeff11)
|
||||
push ARG1_64
|
||||
vpmovsxbd xmm0, [rsp]
|
||||
TEST_END_64
|
||||
|
||||
TEST_BEGIN_64(VPMOVSXBDv256v256, 1)
|
||||
TEST_INPUTS(0)
|
||||
vpmovsxbd ymm0, xmm4
|
||||
TEST_END_64
|
||||
|
||||
TEST_BEGIN_64(VPMOVSXBDv256m64, 1)
|
||||
TEST_INPUTS(0xaabbccddeeff11)
|
||||
push ARG1_64
|
||||
vpmovsxbd ymm0, [rsp]
|
||||
TEST_END_64
|
||||
|
||||
#endif // HAS_FEATURE_AVX
|
||||
|
||||
TEST_BEGIN_64(PMOVSXBQv128v128, 1)
|
||||
TEST_INPUTS(0)
|
||||
pmovsxbq xmm0, xmm1
|
||||
TEST_END_64
|
||||
|
||||
TEST_BEGIN_64(PMOVSXBQv128m16, 1)
|
||||
TEST_INPUTS(0xaabbccddeeff11)
|
||||
push ARG1_64
|
||||
pmovsxbq xmm0, [rsp]
|
||||
TEST_END_64
|
||||
|
||||
#if HAS_FEATURE_AVX
|
||||
TEST_BEGIN_64(VPMOVSXBQv128v128, 1)
|
||||
TEST_INPUTS(0)
|
||||
vpmovsxbq xmm0, xmm1
|
||||
TEST_END_64
|
||||
|
||||
TEST_BEGIN_64(VPMOVSXBQv128m16, 1)
|
||||
TEST_INPUTS(0xaabbccddeeff11)
|
||||
push ARG1_64
|
||||
vpmovsxbq xmm0, [rsp]
|
||||
TEST_END_64
|
||||
|
||||
TEST_BEGIN_64(VPMOVSXBQv256v256, 1)
|
||||
TEST_INPUTS(0)
|
||||
vpmovsxbq ymm0, xmm4
|
||||
TEST_END_64
|
||||
|
||||
TEST_BEGIN_64(VPMOVSXBQv256m32, 1)
|
||||
TEST_INPUTS(0xaabbccddeeff11)
|
||||
push ARG1_64
|
||||
vpmovsxbq ymm0, [rsp]
|
||||
TEST_END_64
|
||||
|
||||
#endif // HAS_FEATURE_AVX
|
||||
|
||||
TEST_BEGIN_64(PMOVSXWDv128v128, 1)
|
||||
TEST_INPUTS(0)
|
||||
pmovsxwd xmm0, xmm1
|
||||
TEST_END_64
|
||||
|
||||
TEST_BEGIN_64(PMOVSXWDv128m64, 1)
|
||||
TEST_INPUTS(0xaabbccddeeff11)
|
||||
push ARG1_64
|
||||
pmovsxwd xmm0, [rsp]
|
||||
TEST_END_64
|
||||
|
||||
#if HAS_FEATURE_AVX
|
||||
TEST_BEGIN_64(VPMOVSXWDv128v128, 1)
|
||||
TEST_INPUTS(0)
|
||||
vpmovsxwd xmm0, xmm1
|
||||
TEST_END_64
|
||||
|
||||
TEST_BEGIN_64(VPMOVSXWDv128m64, 1)
|
||||
TEST_INPUTS(0xaabbccddeeff11)
|
||||
push ARG1_64
|
||||
vpmovsxwd xmm0, [rsp]
|
||||
TEST_END_64
|
||||
|
||||
TEST_BEGIN_64(VPMOVSXWDv256v256, 1)
|
||||
TEST_INPUTS(0)
|
||||
vpmovsxwd ymm0, xmm4
|
||||
TEST_END_64
|
||||
|
||||
TEST_BEGIN_64(VPMOVSXWDv256m128, 1)
|
||||
TEST_INPUTS(0xaabbccddeeff11)
|
||||
push ARG1_64
|
||||
push ARG1_64
|
||||
vpmovsxwd ymm0, [rsp]
|
||||
TEST_END_64
|
||||
|
||||
#endif // HAS_FEATURE_AVX
|
||||
|
||||
TEST_BEGIN_64(PMOVSXWQv128v128, 1)
|
||||
TEST_INPUTS(0)
|
||||
pmovsxwq xmm0, xmm1
|
||||
TEST_END_64
|
||||
|
||||
TEST_BEGIN_64(PMOVSXWQv128m32, 1)
|
||||
TEST_INPUTS(0xaabbccddeeff11)
|
||||
push ARG1_64
|
||||
pmovsxwq xmm0, [rsp]
|
||||
TEST_END_64
|
||||
|
||||
#if HAS_FEATURE_AVX
|
||||
TEST_BEGIN_64(VPMOVSXWQv128v128, 1)
|
||||
TEST_INPUTS(0)
|
||||
vpmovsxwq xmm0, xmm1
|
||||
TEST_END_64
|
||||
|
||||
TEST_BEGIN_64(VPMOVSXWQv128m32, 1)
|
||||
TEST_INPUTS(0xaabbccddeeff11)
|
||||
push ARG1_64
|
||||
vpmovsxwq xmm0, [rsp]
|
||||
TEST_END_64
|
||||
|
||||
TEST_BEGIN_64(VPMOVSXWQv256v256, 1)
|
||||
TEST_INPUTS(0)
|
||||
vpmovsxwq ymm0, xmm4
|
||||
TEST_END_64
|
||||
|
||||
TEST_BEGIN_64(VPMOVSXWQv256m64, 1)
|
||||
TEST_INPUTS(0xaabbccddeeff11)
|
||||
push ARG1_64
|
||||
vpmovsxwq ymm0, [rsp]
|
||||
TEST_END_64
|
||||
|
||||
#endif // HAS_FEATURE_AVX
|
||||
|
||||
TEST_BEGIN_64(PMOVSXDQv128v128, 1)
|
||||
TEST_INPUTS(0)
|
||||
pmovsxdq xmm0, xmm1
|
||||
TEST_END_64
|
||||
|
||||
TEST_BEGIN_64(PMOVSXDQv128m64, 1)
|
||||
TEST_INPUTS(0xaabbccddeeff11)
|
||||
push ARG1_64
|
||||
pmovsxdq xmm0, [rsp]
|
||||
TEST_END_64
|
||||
|
||||
#if HAS_FEATURE_AVX
|
||||
TEST_BEGIN_64(VPMOVSXDQv128v128, 1)
|
||||
TEST_INPUTS(0)
|
||||
vpmovsxdq xmm0, xmm1
|
||||
TEST_END_64
|
||||
|
||||
TEST_BEGIN_64(VPMOVSXDQv128m64, 1)
|
||||
TEST_INPUTS(0xaabbccddeeff11)
|
||||
push ARG1_64
|
||||
vpmovsxdq xmm0, [rsp]
|
||||
TEST_END_64
|
||||
|
||||
TEST_BEGIN_64(VPMOVSXDQv256v256, 1)
|
||||
TEST_INPUTS(0)
|
||||
vpmovsxdq ymm0, xmm4
|
||||
TEST_END_64
|
||||
|
||||
TEST_BEGIN_64(VPMOVSXDQv256m128, 1)
|
||||
TEST_INPUTS(0xaabbccddeeff11)
|
||||
push ARG1_64
|
||||
push ARG1_64
|
||||
vpmovsxdq ymm0, [rsp]
|
||||
TEST_END_64
|
||||
|
||||
#endif // HAS_FEATURE_AVX
|
||||
+2
-2
@@ -327,11 +327,10 @@ SYMBOL(__x86_test_table_begin):
|
||||
|
||||
#include "tests/X86/ABI.S"
|
||||
#include "tests/X86/MMX/INPUTS.S"
|
||||
#include "tests/X86/AVX/VMASKMOV.S"
|
||||
|
||||
/* Change to `0` and put new `#include`s above when making new tests to speed
|
||||
* up compile and test times. */
|
||||
#if 0
|
||||
#if 1
|
||||
|
||||
/* Bring in the data transfer tests. These basically HAVE to pass before
|
||||
* anything else can ;-) */
|
||||
@@ -534,6 +533,7 @@ SYMBOL(__x86_test_table_begin):
|
||||
#include "tests/X86/SSE/MXCSR.S"
|
||||
#include "tests/X86/SSE/SHUFPS.S"
|
||||
#include "tests/X86/SSE/SHUFPD.S"
|
||||
#include "tests/X86/SSE/PMOVSX.S"
|
||||
|
||||
#include "tests/X86/STRINGOP/CMPS.S"
|
||||
#include "tests/X86/STRINGOP/LODS.S"
|
||||
|
||||
Reference in New Issue
Block a user