aboutsummaryrefslogtreecommitdiff
path: root/client/asmjit/x86/x86operand.cpp
diff options
context:
space:
mode:
authorauth12 <[email protected]>2020-07-19 11:45:43 -0700
committerauth12 <[email protected]>2020-07-19 11:45:43 -0700
commit4e6a09d486ed462ee4cf38c3735a12d530dc09d4 (patch)
treea67ccac41fef7a412b4357fbe54582cc4b692863 /client/asmjit/x86/x86operand.cpp
parentDeleted asmjit submodule (diff)
downloadloader-4e6a09d486ed462ee4cf38c3735a12d530dc09d4.tar.xz
loader-4e6a09d486ed462ee4cf38c3735a12d530dc09d4.zip
Added asmjit.
Fixed solution file.
Diffstat (limited to 'client/asmjit/x86/x86operand.cpp')
-rw-r--r--client/asmjit/x86/x86operand.cpp271
1 files changed, 271 insertions, 0 deletions
diff --git a/client/asmjit/x86/x86operand.cpp b/client/asmjit/x86/x86operand.cpp
new file mode 100644
index 0000000..ca7ce5a
--- /dev/null
+++ b/client/asmjit/x86/x86operand.cpp
@@ -0,0 +1,271 @@
+// AsmJit - Machine code generation for C++
+//
+// * Official AsmJit Home Page: https://asmjit.com
+// * Official Github Repository: https://github.com/asmjit/asmjit
+//
+// Copyright (c) 2008-2020 The AsmJit Authors
+//
+// This software is provided 'as-is', without any express or implied
+// warranty. In no event will the authors be held liable for any damages
+// arising from the use of this software.
+//
+// Permission is granted to anyone to use this software for any purpose,
+// including commercial applications, and to alter it and redistribute it
+// freely, subject to the following restrictions:
+//
+// 1. The origin of this software must not be misrepresented; you must not
+// claim that you wrote the original software. If you use this software
+// in a product, an acknowledgment in the product documentation would be
+// appreciated but is not required.
+// 2. Altered source versions must be plainly marked as such, and must not be
+// misrepresented as being the original software.
+// 3. This notice may not be removed or altered from any source distribution.
+
+#include "../core/api-build_p.h"
+#ifdef ASMJIT_BUILD_X86
+
+#include "../core/misc_p.h"
+#include "../x86/x86operand.h"
+
+ASMJIT_BEGIN_SUB_NAMESPACE(x86)
+
+// ============================================================================
+// [asmjit::x86::OpData]
+// ============================================================================
+
+const OpData opData = {
+ {
+ // RegInfo[]
+ #define VALUE(X) { RegTraits<X>::kSignature }
+ { ASMJIT_LOOKUP_TABLE_32(VALUE, 0) },
+ #undef VALUE
+
+ // RegCount[]
+ #define VALUE(X) RegTraits<X>::kCount
+ { ASMJIT_LOOKUP_TABLE_32(VALUE, 0) },
+ #undef VALUE
+
+ // RegTypeToTypeId[]
+ #define VALUE(X) RegTraits<X>::kTypeId
+ { ASMJIT_LOOKUP_TABLE_32(VALUE, 0) }
+ #undef VALUE
+ }
+};
+
+// ============================================================================
+// [asmjit::x86::Operand - Unit]
+// ============================================================================
+
+#if defined(ASMJIT_TEST)
+UNIT(x86_operand) {
+ Label L(1000); // Label with some ID.
+
+ INFO("Checking basic properties of built-in X86 registers");
+ EXPECT(gpb(Gp::kIdAx) == al);
+ EXPECT(gpb(Gp::kIdBx) == bl);
+ EXPECT(gpb(Gp::kIdCx) == cl);
+ EXPECT(gpb(Gp::kIdDx) == dl);
+
+ EXPECT(gpb_lo(Gp::kIdAx) == al);
+ EXPECT(gpb_lo(Gp::kIdBx) == bl);
+ EXPECT(gpb_lo(Gp::kIdCx) == cl);
+ EXPECT(gpb_lo(Gp::kIdDx) == dl);
+
+ EXPECT(gpb_hi(Gp::kIdAx) == ah);
+ EXPECT(gpb_hi(Gp::kIdBx) == bh);
+ EXPECT(gpb_hi(Gp::kIdCx) == ch);
+ EXPECT(gpb_hi(Gp::kIdDx) == dh);
+
+ EXPECT(gpw(Gp::kIdAx) == ax);
+ EXPECT(gpw(Gp::kIdBx) == bx);
+ EXPECT(gpw(Gp::kIdCx) == cx);
+ EXPECT(gpw(Gp::kIdDx) == dx);
+
+ EXPECT(gpd(Gp::kIdAx) == eax);
+ EXPECT(gpd(Gp::kIdBx) == ebx);
+ EXPECT(gpd(Gp::kIdCx) == ecx);
+ EXPECT(gpd(Gp::kIdDx) == edx);
+
+ EXPECT(gpq(Gp::kIdAx) == rax);
+ EXPECT(gpq(Gp::kIdBx) == rbx);
+ EXPECT(gpq(Gp::kIdCx) == rcx);
+ EXPECT(gpq(Gp::kIdDx) == rdx);
+
+ EXPECT(gpb(Gp::kIdAx) != dl);
+ EXPECT(gpw(Gp::kIdBx) != cx);
+ EXPECT(gpd(Gp::kIdCx) != ebx);
+ EXPECT(gpq(Gp::kIdDx) != rax);
+
+ INFO("Checking if x86::reg(...) matches built-in IDs");
+ EXPECT(gpb(5) == bpl);
+ EXPECT(gpw(5) == bp);
+ EXPECT(gpd(5) == ebp);
+ EXPECT(gpq(5) == rbp);
+ EXPECT(st(5) == st5);
+ EXPECT(mm(5) == mm5);
+ EXPECT(k(5) == k5);
+ EXPECT(cr(5) == cr5);
+ EXPECT(dr(5) == dr5);
+ EXPECT(xmm(5) == xmm5);
+ EXPECT(ymm(5) == ymm5);
+ EXPECT(zmm(5) == zmm5);
+
+ INFO("Checking x86::Gp register properties");
+ EXPECT(Gp().isReg() == true);
+ EXPECT(eax.isReg() == true);
+ EXPECT(eax.id() == 0);
+ EXPECT(eax.size() == 4);
+ EXPECT(eax.type() == Reg::kTypeGpd);
+ EXPECT(eax.group() == Reg::kGroupGp);
+
+ INFO("Checking x86::Xmm register properties");
+ EXPECT(Xmm().isReg() == true);
+ EXPECT(xmm4.isReg() == true);
+ EXPECT(xmm4.id() == 4);
+ EXPECT(xmm4.size() == 16);
+ EXPECT(xmm4.type() == Reg::kTypeXmm);
+ EXPECT(xmm4.group() == Reg::kGroupVec);
+ EXPECT(xmm4.isVec());
+
+ INFO("Checking x86::Ymm register properties");
+ EXPECT(Ymm().isReg() == true);
+ EXPECT(ymm5.isReg() == true);
+ EXPECT(ymm5.id() == 5);
+ EXPECT(ymm5.size() == 32);
+ EXPECT(ymm5.type() == Reg::kTypeYmm);
+ EXPECT(ymm5.group() == Reg::kGroupVec);
+ EXPECT(ymm5.isVec());
+
+ INFO("Checking x86::Zmm register properties");
+ EXPECT(Zmm().isReg() == true);
+ EXPECT(zmm6.isReg() == true);
+ EXPECT(zmm6.id() == 6);
+ EXPECT(zmm6.size() == 64);
+ EXPECT(zmm6.type() == Reg::kTypeZmm);
+ EXPECT(zmm6.group() == Reg::kGroupVec);
+ EXPECT(zmm6.isVec());
+
+ INFO("Checking x86::Vec register properties");
+ EXPECT(Vec().isReg() == true);
+ // Converts a VEC register to a type of the passed register, but keeps the ID.
+ EXPECT(xmm4.cloneAs(ymm10) == ymm4);
+ EXPECT(xmm4.cloneAs(zmm11) == zmm4);
+ EXPECT(ymm5.cloneAs(xmm12) == xmm5);
+ EXPECT(ymm5.cloneAs(zmm13) == zmm5);
+ EXPECT(zmm6.cloneAs(xmm14) == xmm6);
+ EXPECT(zmm6.cloneAs(ymm15) == ymm6);
+
+ EXPECT(xmm7.xmm() == xmm7);
+ EXPECT(xmm7.ymm() == ymm7);
+ EXPECT(xmm7.zmm() == zmm7);
+
+ EXPECT(ymm7.xmm() == xmm7);
+ EXPECT(ymm7.ymm() == ymm7);
+ EXPECT(ymm7.zmm() == zmm7);
+
+ EXPECT(zmm7.xmm() == xmm7);
+ EXPECT(zmm7.ymm() == ymm7);
+ EXPECT(zmm7.zmm() == zmm7);
+
+ INFO("Checking x86::FpMm register properties");
+ EXPECT(Mm().isReg() == true);
+ EXPECT(mm2.isReg() == true);
+ EXPECT(mm2.id() == 2);
+ EXPECT(mm2.size() == 8);
+ EXPECT(mm2.type() == Reg::kTypeMm);
+ EXPECT(mm2.group() == Reg::kGroupMm);
+
+ INFO("Checking x86::KReg register properties");
+ EXPECT(KReg().isReg() == true);
+ EXPECT(k3.isReg() == true);
+ EXPECT(k3.id() == 3);
+ EXPECT(k3.size() == 0);
+ EXPECT(k3.type() == Reg::kTypeKReg);
+ EXPECT(k3.group() == Reg::kGroupKReg);
+
+ INFO("Checking x86::St register properties");
+ EXPECT(St().isReg() == true);
+ EXPECT(st1.isReg() == true);
+ EXPECT(st1.id() == 1);
+ EXPECT(st1.size() == 10);
+ EXPECT(st1.type() == Reg::kTypeSt);
+ EXPECT(st1.group() == Reg::kGroupSt);
+
+ INFO("Checking if default constructed regs behave as expected");
+ EXPECT(Reg().isValid() == false);
+ EXPECT(Gp().isValid() == false);
+ EXPECT(Xmm().isValid() == false);
+ EXPECT(Ymm().isValid() == false);
+ EXPECT(Zmm().isValid() == false);
+ EXPECT(Mm().isValid() == false);
+ EXPECT(KReg().isValid() == false);
+ EXPECT(SReg().isValid() == false);
+ EXPECT(CReg().isValid() == false);
+ EXPECT(DReg().isValid() == false);
+ EXPECT(St().isValid() == false);
+ EXPECT(Bnd().isValid() == false);
+
+ INFO("Checking x86::Mem operand");
+ Mem m;
+ EXPECT(m == Mem(), "Two default constructed x86::Mem operands must be equal");
+
+ m = ptr(L);
+ EXPECT(m.hasBase() == true);
+ EXPECT(m.hasBaseReg() == false);
+ EXPECT(m.hasBaseLabel() == true);
+ EXPECT(m.hasOffset() == false);
+ EXPECT(m.isOffset64Bit() == false);
+ EXPECT(m.offset() == 0);
+ EXPECT(m.offsetLo32() == 0);
+
+ m = ptr(0x0123456789ABCDEFu);
+ EXPECT(m.hasBase() == false);
+ EXPECT(m.hasBaseReg() == false);
+ EXPECT(m.hasIndex() == false);
+ EXPECT(m.hasIndexReg() == false);
+ EXPECT(m.hasOffset() == true);
+ EXPECT(m.isOffset64Bit() == true);
+ EXPECT(m.offset() == int64_t(0x0123456789ABCDEFu));
+ EXPECT(m.offsetLo32() == int32_t(0x89ABCDEFu));
+ m.addOffset(1);
+ EXPECT(m.offset() == int64_t(0x0123456789ABCDF0u));
+
+ m = ptr(0x0123456789ABCDEFu, rdi, 4);
+ EXPECT(m.hasBase() == false);
+ EXPECT(m.hasBaseReg() == false);
+ EXPECT(m.hasIndex() == true);
+ EXPECT(m.hasIndexReg() == true);
+ EXPECT(m.indexType() == rdi.type());
+ EXPECT(m.indexId() == rdi.id());
+ EXPECT(m.hasOffset() == true);
+ EXPECT(m.isOffset64Bit() == true);
+ EXPECT(m.offset() == int64_t(0x0123456789ABCDEFu));
+ EXPECT(m.offsetLo32() == int32_t(0x89ABCDEFu));
+ m.resetIndex();
+ EXPECT(m.hasIndex() == false);
+ EXPECT(m.hasIndexReg() == false);
+
+ m = ptr(rax);
+ EXPECT(m.hasBase() == true);
+ EXPECT(m.hasBaseReg() == true);
+ EXPECT(m.baseType() == rax.type());
+ EXPECT(m.baseId() == rax.id());
+ EXPECT(m.hasIndex() == false);
+ EXPECT(m.hasIndexReg() == false);
+ EXPECT(m.indexType() == 0);
+ EXPECT(m.indexId() == 0);
+ EXPECT(m.hasOffset() == false);
+ EXPECT(m.isOffset64Bit() == false);
+ EXPECT(m.offset() == 0);
+ EXPECT(m.offsetLo32() == 0);
+ m.setIndex(rsi);
+ EXPECT(m.hasIndex() == true);
+ EXPECT(m.hasIndexReg() == true);
+ EXPECT(m.indexType() == rsi.type());
+ EXPECT(m.indexId() == rsi.id());
+}
+#endif
+
+ASMJIT_END_SUB_NAMESPACE
+
+#endif // ASMJIT_BUILD_X86