diff options
author | kobalicek <kobalicek.petr@gmail.com> | 2021-03-19 11:31:12 +0300 |
---|---|---|
committer | kobalicek <kobalicek.petr@gmail.com> | 2021-03-19 11:31:12 +0300 |
commit | e7a728018e5d88ffa477430fa63bdebbf480fb02 (patch) | |
tree | e55a1e634b0fe1ceddf0b6056ed12b9309f163e0 | |
parent | e822fba53e00a2a601f253387029fee6cc6c2029 (diff) |
[Bug] Fixed X86 instruction info query asserting on MMX variation of pextrw (Fixes #330)
-rw-r--r-- | src/asmjit/x86/x86instapi.cpp | 4 | ||||
-rw-r--r-- | test/asmjit_test_instinfo.cpp | 61 |
2 files changed, 17 insertions, 48 deletions
diff --git a/src/asmjit/x86/x86instapi.cpp b/src/asmjit/x86/x86instapi.cpp index 79f95f5..610d580 100644 --- a/src/asmjit/x86/x86instapi.cpp +++ b/src/asmjit/x86/x86instapi.cpp @@ -1519,6 +1519,7 @@ Error InstInternal::queryFeatures(uint32_t arch, const BaseInst& inst, const Ope // The instruction doesn't use XMM register(s), thus it's MMX/MMX2 only. out->remove(Features::kSSE); out->remove(Features::kSSE2); + out->remove(Features::kSSE4_1); } else { out->remove(Features::kMMX); @@ -1532,9 +1533,6 @@ Error InstInternal::queryFeatures(uint32_t arch, const BaseInst& inst, const Ope // can extract directly to memory. This instruction is, of course, not // compatible with MMX/SSE2 and would #UD if SSE4.1 is not supported. if (instId == Inst::kIdPextrw) { - ASMJIT_ASSERT(out->has(Features::kSSE2)); - ASMJIT_ASSERT(out->has(Features::kSSE4_1)); - if (opCount >= 1 && operands[0].isMem()) out->remove(Features::kSSE2); else diff --git a/test/asmjit_test_instinfo.cpp b/test/asmjit_test_instinfo.cpp index dc53fd7..06b86ea 100644 --- a/test/asmjit_test_instinfo.cpp +++ b/test/asmjit_test_instinfo.cpp @@ -158,57 +158,28 @@ static void printInfoExtra(uint32_t arch, uint32_t instId, uint32_t options, con static void testX86Arch() { #if defined(ASMJIT_BUILD_X86) + using namespace x86; uint32_t arch = Environment::kArchX64; - printInfoSimple(arch, - x86::Inst::kIdAdd, 0, - x86::eax, x86::ebx); + printInfoSimple(arch, Inst::kIdAdd, 0, eax, ebx); + printInfoSimple(arch, Inst::kIdLods, 0, eax, dword_ptr(rsi)); - printInfoSimple(arch, - x86::Inst::kIdLods, 0, - x86::eax , dword_ptr(x86::rsi)); + printInfoSimple(arch, Inst::kIdPshufd, 0, xmm0, xmm1, imm(0)); + printInfoSimple(arch, Inst::kIdPabsb, 0, mm1, mm2); + printInfoSimple(arch, Inst::kIdPabsb, 0, xmm1, xmm2); + printInfoSimple(arch, Inst::kIdPextrw, 0, eax, mm1, imm(0)); + printInfoSimple(arch, Inst::kIdPextrw, 0, eax, xmm1, imm(0)); + printInfoSimple(arch, Inst::kIdPextrw, 0, ptr(rax), xmm1, imm(0)); - printInfoSimple(arch, - x86::Inst::kIdPshufd, 0, - x86::xmm0, x86::xmm1, imm(0)); + printInfoSimple(arch, Inst::kIdVpdpbusd, 0, xmm0, xmm1, xmm2); + printInfoSimple(arch, Inst::kIdVpdpbusd, Inst::kOptionVex, xmm0, xmm1, xmm2); - printInfoSimple(arch, - x86::Inst::kIdPextrw, 0, - x86::eax, x86::xmm1, imm(0)); + printInfoSimple(arch, Inst::kIdVaddpd, 0, ymm0, ymm1, ymm2); + printInfoSimple(arch, Inst::kIdVaddpd, 0, ymm0, ymm30, ymm31); + printInfoSimple(arch, Inst::kIdVaddpd, 0, zmm0, zmm1, zmm2); - printInfoSimple(arch, - x86::Inst::kIdPextrw, 0, - x86::ptr(x86::rax), x86::xmm1, imm(0)); - - printInfoSimple(arch, - x86::Inst::kIdVpdpbusd, 0, - x86::xmm0, x86::xmm1, x86::xmm2); - - printInfoSimple(arch, - x86::Inst::kIdVpdpbusd, x86::Inst::kOptionVex, - x86::xmm0, x86::xmm1, x86::xmm2); - - printInfoSimple(arch, - x86::Inst::kIdVaddpd, 0, - x86::ymm0, x86::ymm1, x86::ymm2); - - printInfoSimple(arch, - x86::Inst::kIdVaddpd, 0, - x86::ymm0, x86::ymm30, x86::ymm31); - - printInfoSimple(arch, - x86::Inst::kIdVaddpd, 0, - x86::zmm0, x86::zmm1, x86::zmm2); - - printInfoExtra(arch, - x86::Inst::kIdVaddpd, 0, - x86::k1, - x86::zmm0, x86::zmm1, x86::zmm2); - - printInfoExtra(arch, - x86::Inst::kIdVaddpd, x86::Inst::kOptionZMask, - x86::k1, - x86::zmm0, x86::zmm1, x86::zmm2); + printInfoExtra(arch, Inst::kIdVaddpd, 0, k1, zmm0, zmm1, zmm2); + printInfoExtra(arch, Inst::kIdVaddpd, Inst::kOptionZMask, k1, zmm0, zmm1, zmm2); #endif } |