mirror of
https://github.com/ZDoom/raze-gles.git
synced 2025-02-06 05:40:56 +00:00
176 lines
5.7 KiB
C++
176 lines
5.7 KiB
C++
// [AsmJit]
|
|
// Complete x86/x64 JIT and Remote Assembler for C++.
|
|
//
|
|
// [License]
|
|
// Zlib - See LICENSE.md file in the package.
|
|
|
|
// [Export]
|
|
#define ASMJIT_EXPORTS
|
|
|
|
// [Guard]
|
|
#include "../asmjit_build.h"
|
|
#if defined(ASMJIT_BUILD_X86)
|
|
|
|
// [Dependencies]
|
|
#include "../x86/x86operand.h"
|
|
|
|
// [Api-Begin]
|
|
#include "../asmjit_apibegin.h"
|
|
|
|
namespace asmjit {
|
|
|
|
// ============================================================================
|
|
// [asmjit::X86Operand - Test]
|
|
// ============================================================================
|
|
|
|
#if defined(ASMJIT_TEST)
|
|
UNIT(x86_operand) {
|
|
Label L;
|
|
|
|
INFO("Checking basic properties of built-in X86 registers");
|
|
EXPECT(x86::gpb(X86Gp::kIdAx) == x86::al);
|
|
EXPECT(x86::gpb(X86Gp::kIdBx) == x86::bl);
|
|
EXPECT(x86::gpb(X86Gp::kIdCx) == x86::cl);
|
|
EXPECT(x86::gpb(X86Gp::kIdDx) == x86::dl);
|
|
|
|
EXPECT(x86::gpb_lo(X86Gp::kIdAx) == x86::al);
|
|
EXPECT(x86::gpb_lo(X86Gp::kIdBx) == x86::bl);
|
|
EXPECT(x86::gpb_lo(X86Gp::kIdCx) == x86::cl);
|
|
EXPECT(x86::gpb_lo(X86Gp::kIdDx) == x86::dl);
|
|
|
|
EXPECT(x86::gpb_hi(X86Gp::kIdAx) == x86::ah);
|
|
EXPECT(x86::gpb_hi(X86Gp::kIdBx) == x86::bh);
|
|
EXPECT(x86::gpb_hi(X86Gp::kIdCx) == x86::ch);
|
|
EXPECT(x86::gpb_hi(X86Gp::kIdDx) == x86::dh);
|
|
|
|
EXPECT(x86::gpw(X86Gp::kIdAx) == x86::ax);
|
|
EXPECT(x86::gpw(X86Gp::kIdBx) == x86::bx);
|
|
EXPECT(x86::gpw(X86Gp::kIdCx) == x86::cx);
|
|
EXPECT(x86::gpw(X86Gp::kIdDx) == x86::dx);
|
|
|
|
EXPECT(x86::gpd(X86Gp::kIdAx) == x86::eax);
|
|
EXPECT(x86::gpd(X86Gp::kIdBx) == x86::ebx);
|
|
EXPECT(x86::gpd(X86Gp::kIdCx) == x86::ecx);
|
|
EXPECT(x86::gpd(X86Gp::kIdDx) == x86::edx);
|
|
|
|
EXPECT(x86::gpq(X86Gp::kIdAx) == x86::rax);
|
|
EXPECT(x86::gpq(X86Gp::kIdBx) == x86::rbx);
|
|
EXPECT(x86::gpq(X86Gp::kIdCx) == x86::rcx);
|
|
EXPECT(x86::gpq(X86Gp::kIdDx) == x86::rdx);
|
|
|
|
EXPECT(x86::gpb(X86Gp::kIdAx) != x86::dl);
|
|
EXPECT(x86::gpw(X86Gp::kIdBx) != x86::cx);
|
|
EXPECT(x86::gpd(X86Gp::kIdCx) != x86::ebx);
|
|
EXPECT(x86::gpq(X86Gp::kIdDx) != x86::rax);
|
|
|
|
INFO("Checking if x86::reg(...) matches built-in IDs");
|
|
EXPECT(x86::fp(5) == x86::fp5);
|
|
EXPECT(x86::mm(5) == x86::mm5);
|
|
EXPECT(x86::k(5) == x86::k5);
|
|
EXPECT(x86::cr(5) == x86::cr5);
|
|
EXPECT(x86::dr(5) == x86::dr5);
|
|
EXPECT(x86::xmm(5) == x86::xmm5);
|
|
EXPECT(x86::ymm(5) == x86::ymm5);
|
|
EXPECT(x86::zmm(5) == x86::zmm5);
|
|
|
|
INFO("Checking GP register properties");
|
|
EXPECT(X86Gp().isReg() == false);
|
|
EXPECT(x86::eax.isReg() == true);
|
|
EXPECT(x86::eax.getId() == 0);
|
|
EXPECT(x86::eax.getSize() == 4);
|
|
EXPECT(x86::eax.getType() == X86Reg::kRegGpd);
|
|
EXPECT(x86::eax.getKind() == X86Reg::kKindGp);
|
|
|
|
INFO("Checking FP register properties");
|
|
EXPECT(X86Fp().isReg() == false);
|
|
EXPECT(x86::fp1.isReg() == true);
|
|
EXPECT(x86::fp1.getId() == 1);
|
|
EXPECT(x86::fp1.getSize() == 10);
|
|
EXPECT(x86::fp1.getType() == X86Reg::kRegFp);
|
|
EXPECT(x86::fp1.getKind() == X86Reg::kKindFp);
|
|
|
|
INFO("Checking MM register properties");
|
|
EXPECT(X86Mm().isReg() == false);
|
|
EXPECT(x86::mm2.isReg() == true);
|
|
EXPECT(x86::mm2.getId() == 2);
|
|
EXPECT(x86::mm2.getSize() == 8);
|
|
EXPECT(x86::mm2.getType() == X86Reg::kRegMm);
|
|
EXPECT(x86::mm2.getKind() == X86Reg::kKindMm);
|
|
|
|
INFO("Checking K register properties");
|
|
EXPECT(X86KReg().isReg() == false);
|
|
EXPECT(x86::k3.isReg() == true);
|
|
EXPECT(x86::k3.getId() == 3);
|
|
EXPECT(x86::k3.getSize() == 0);
|
|
EXPECT(x86::k3.getType() == X86Reg::kRegK);
|
|
EXPECT(x86::k3.getKind() == X86Reg::kKindK);
|
|
|
|
INFO("Checking XMM register properties");
|
|
EXPECT(X86Xmm().isReg() == false);
|
|
EXPECT(x86::xmm4.isReg() == true);
|
|
EXPECT(x86::xmm4.getId() == 4);
|
|
EXPECT(x86::xmm4.getSize() == 16);
|
|
EXPECT(x86::xmm4.getType() == X86Reg::kRegXmm);
|
|
EXPECT(x86::xmm4.getKind() == X86Reg::kKindVec);
|
|
EXPECT(x86::xmm4.isVec());
|
|
|
|
INFO("Checking YMM register properties");
|
|
EXPECT(X86Ymm().isReg() == false);
|
|
EXPECT(x86::ymm5.isReg() == true);
|
|
EXPECT(x86::ymm5.getId() == 5);
|
|
EXPECT(x86::ymm5.getSize() == 32);
|
|
EXPECT(x86::ymm5.getType() == X86Reg::kRegYmm);
|
|
EXPECT(x86::ymm5.getKind() == X86Reg::kKindVec);
|
|
EXPECT(x86::ymm5.isVec());
|
|
|
|
INFO("Checking ZMM register properties");
|
|
EXPECT(X86Zmm().isReg() == false);
|
|
EXPECT(x86::zmm6.isReg() == true);
|
|
EXPECT(x86::zmm6.getId() == 6);
|
|
EXPECT(x86::zmm6.getSize() == 64);
|
|
EXPECT(x86::zmm6.getType() == X86Reg::kRegZmm);
|
|
EXPECT(x86::zmm6.getKind() == X86Reg::kKindVec);
|
|
EXPECT(x86::zmm6.isVec());
|
|
|
|
INFO("Checking VEC register properties");
|
|
EXPECT(X86Vec().isReg() == false);
|
|
// Converts a VEC register to a type of the passed register, but keeps the ID.
|
|
EXPECT(x86::xmm4.cloneAs(x86::ymm10) == x86::ymm4);
|
|
EXPECT(x86::xmm4.cloneAs(x86::zmm11) == x86::zmm4);
|
|
EXPECT(x86::ymm5.cloneAs(x86::xmm12) == x86::xmm5);
|
|
EXPECT(x86::ymm5.cloneAs(x86::zmm13) == x86::zmm5);
|
|
EXPECT(x86::zmm6.cloneAs(x86::xmm14) == x86::xmm6);
|
|
EXPECT(x86::zmm6.cloneAs(x86::ymm15) == x86::ymm6);
|
|
|
|
INFO("Checking if default constructed regs behave as expected");
|
|
EXPECT(X86Reg().isValid() == false);
|
|
EXPECT(X86Gp().isValid() == false);
|
|
EXPECT(X86Fp().isValid() == false);
|
|
EXPECT(X86Mm().isValid() == false);
|
|
EXPECT(X86Xmm().isValid() == false);
|
|
EXPECT(X86Ymm().isValid() == false);
|
|
EXPECT(X86Zmm().isValid() == false);
|
|
EXPECT(X86KReg().isValid() == false);
|
|
|
|
INFO("Checking X86Mem operand");
|
|
X86Mem m;
|
|
EXPECT(m == X86Mem(),
|
|
"Two default constructed X86Mem operands must be equal");
|
|
|
|
X86Mem mL = x86::ptr(L);
|
|
EXPECT(mL.hasBase() == true,
|
|
"Memory constructed from Label must hasBase()");
|
|
EXPECT(mL.hasBaseReg() == false,
|
|
"Memory constructed from Label must not report hasBaseReg()");
|
|
EXPECT(mL.hasBaseLabel() == true,
|
|
"Memory constructed from Label must report hasBaseLabel()");
|
|
}
|
|
#endif // ASMJIT_TEST
|
|
|
|
} // asmjit namespace
|
|
|
|
// [Api-End]
|
|
#include "../asmjit_apiend.h"
|
|
|
|
// [Guard]
|
|
#endif // ASMJIT_BUILD_X86
|