summaryrefslogtreecommitdiffstatshomepage
path: root/3rdparty/asmjit/test/asmjit_test_compiler_x86.cpp
diff options
context:
space:
mode:
Diffstat (limited to '3rdparty/asmjit/test/asmjit_test_compiler_x86.cpp')
-rw-r--r--3rdparty/asmjit/test/asmjit_test_compiler_x86.cpp551
1 files changed, 378 insertions, 173 deletions
diff --git a/3rdparty/asmjit/test/asmjit_test_compiler_x86.cpp b/3rdparty/asmjit/test/asmjit_test_compiler_x86.cpp
index a3a067d2ea8..54442efb915 100644
--- a/3rdparty/asmjit/test/asmjit_test_compiler_x86.cpp
+++ b/3rdparty/asmjit/test/asmjit_test_compiler_x86.cpp
@@ -4,7 +4,7 @@
// SPDX-License-Identifier: Zlib
#include <asmjit/core.h>
-#if !defined(ASMJIT_NO_X86) && ASMJIT_ARCH_X86
+#if !defined(ASMJIT_NO_X86) && !defined(ASMJIT_NO_COMPILER)
#include <asmjit/x86.h>
#include <setjmp.h>
@@ -12,8 +12,10 @@
#include <stdlib.h>
#include <string.h>
-// Required for function tests that pass / return XMM registers.
-#include <emmintrin.h>
+#if ASMJIT_ARCH_X86
+ // Required for function tests that pass / return XMM registers.
+ #include <emmintrin.h>
+#endif
#include "asmjit_test_misc.h"
#include "asmjit_test_compiler.h"
@@ -31,7 +33,7 @@ using namespace asmjit;
class X86TestCase : public TestCase {
public:
X86TestCase(const char* name = nullptr)
- : TestCase(name) {}
+ : TestCase(name, Arch::kHost == Arch::kX86 ? Arch::kX86 : Arch::kX64) {}
virtual void compile(BaseCompiler& cc) override {
compile(static_cast<x86::Compiler&>(cc));
@@ -65,7 +67,7 @@ public:
uint32_t i;
uint32_t argCount = _argCount;
- FuncSignatureBuilder signature(CallConvId::kHost);
+ FuncSignature signature(CallConvId::kCDecl);
signature.setRetT<int>();
for (i = 0; i < argCount; i++)
signature.addArgT<int>();
@@ -201,7 +203,7 @@ public:
result.assignFormat("ret={%u, %u}", resultRet >> 28, resultRet & 0x0FFFFFFFu);
expect.assignFormat("ret={%u, %u}", expectRet >> 28, expectRet & 0x0FFFFFFFu);
- return resultRet == expectRet;
+ return result == expect;
}
uint32_t _argCount;
@@ -221,7 +223,7 @@ public:
}
virtual void compile(x86::Compiler& cc) {
- cc.addFunc(FuncSignatureT<void>(CallConvId::kHost));
+ cc.addFunc(FuncSignature::build<void>());
cc.endFunc();
}
@@ -236,8 +238,8 @@ public:
}
};
-// x86::Compiler - X86Test_AlignNone
-// =================================
+// x86::Compiler - X86Test_NoAlign
+// ===============================
class X86Test_NoAlign : public X86TestCase {
public:
@@ -248,7 +250,7 @@ public:
}
virtual void compile(x86::Compiler& cc) {
- cc.addFunc(FuncSignatureT<void>(CallConvId::kHost));
+ cc.addFunc(FuncSignature::build<void>());
cc.align(AlignMode::kCode, 0);
cc.align(AlignMode::kCode, 1);
cc.endFunc();
@@ -265,6 +267,35 @@ public:
}
};
+// x86::Compiler - X86Test_IndirectBranchProtection
+// ================================================
+
+class X86Test_IndirectBranchProtection : public X86TestCase {
+public:
+ X86Test_IndirectBranchProtection() : X86TestCase("IndirectBranchProtection") {}
+
+ static void add(TestApp& app) {
+ app.add(new X86Test_IndirectBranchProtection());
+ }
+
+ virtual void compile(x86::Compiler& cc) {
+ FuncNode* func = cc.addFunc(FuncSignature::build<void>());
+ func->addAttributes(FuncAttributes::kIndirectBranchProtection);
+ cc.endFunc();
+ }
+
+ virtual bool run(void* _func, String& result, String& expect) {
+ DebugUtils::unused(result, expect);
+
+ typedef void (*Func)(void);
+ Func func = ptr_as_func<Func>(_func);
+
+ func();
+ return true;
+ }
+};
+
+
// x86::Compiler - X86Test_JumpMerge
// =================================
@@ -277,7 +308,7 @@ public:
}
virtual void compile(x86::Compiler& cc) {
- Label L0 = cc.newLabel();
+ Label L0 = cc.newLabel();
Label L1 = cc.newLabel();
Label L2 = cc.newLabel();
Label LEnd = cc.newLabel();
@@ -285,7 +316,7 @@ public:
x86::Gp dst = cc.newIntPtr("dst");
x86::Gp val = cc.newInt32("val");
- FuncNode* funcNode = cc.addFunc(FuncSignatureT<void, int*, int>(CallConvId::kHost));
+ FuncNode* funcNode = cc.addFunc(FuncSignature::build<void, int*, int>());
funcNode->setArg(0, dst);
funcNode->setArg(1, val);
@@ -341,7 +372,7 @@ public:
}
virtual void compile(x86::Compiler& cc) {
- cc.addFunc(FuncSignatureT<void>(CallConvId::kHost));
+ cc.addFunc(FuncSignature::build<void>());
Label L1 = cc.newLabel();
Label L2 = cc.newLabel();
@@ -382,7 +413,7 @@ public:
}
virtual void compile(x86::Compiler& cc) {
- cc.addFunc(FuncSignatureT<int>(CallConvId::kHost));
+ cc.addFunc(FuncSignature::build<int>());
for (uint32_t i = 0; i < 1000; i++) {
Label L = cc.newLabel();
cc.jmp(L);
@@ -406,7 +437,7 @@ public:
result.assignFormat("ret={%d}", resultRet);
expect.assignFormat("ret={%d}", expectRet);
- return resultRet == expectRet;
+ return result == expect;
}
};
@@ -422,7 +453,7 @@ public:
}
virtual void compile(x86::Compiler& cc) {
- cc.addFunc(FuncSignatureT<void>(CallConvId::kHost));
+ cc.addFunc(FuncSignature::build<void>());
Label L_1 = cc.newLabel();
Label L_2 = cc.newLabel();
@@ -484,7 +515,7 @@ public:
}
virtual void compile(x86::Compiler& cc) {
- cc.addFunc(FuncSignatureT<void>(CallConvId::kHost));
+ cc.addFunc(FuncSignature::build<void>());
Label L_1 = cc.newLabel();
Label L_2 = cc.newLabel();
@@ -557,7 +588,7 @@ public:
Label L_Div = cc.newLabel();
Label L_End = cc.newLabel();
- FuncNode* funcNode = cc.addFunc(FuncSignatureT<float, float, float, uint32_t>(CallConvId::kHost));
+ FuncNode* funcNode = cc.addFunc(FuncSignature::build<float, float, float, uint32_t>());
funcNode->setArg(0, a);
funcNode->setArg(1, b);
funcNode->setArg(2, op);
@@ -658,7 +689,7 @@ public:
Label L_Case1 = cc.newLabel();
Label L_End = cc.newLabel();
- FuncNode* funcNode = cc.addFunc(FuncSignatureT<int, int>(CallConvId::kHost));
+ FuncNode* funcNode = cc.addFunc(FuncSignature::build<int, int>());
funcNode->setArg(0, value);
cc.bind(L_Begin);
@@ -715,6 +746,126 @@ public:
}
};
+// x86::Compiler - X86Test_JumpTable3
+// ==================================
+
+class X86Test_JumpTable3 : public X86TestCase {
+public:
+ X86Test_JumpTable3()
+ : X86TestCase("JumpTable {Jumping to a single label}") {}
+
+ static void add(TestApp& app) {
+ app.add(new X86Test_JumpTable3());
+ }
+
+ virtual void compile(x86::Compiler& cc) {
+ cc.addFunc(FuncSignature::build<int>());
+
+ Label L_Target = cc.newLabel();
+ x86::Gp target = cc.newUIntPtr("target");
+ x86::Gp result = cc.newUInt32("result");
+
+ JumpAnnotation* annotation = cc.newJumpAnnotation();
+ annotation->addLabel(L_Target);
+
+ cc.lea(target, x86::ptr(L_Target));
+ cc.jmp(target, annotation);
+
+ cc.bind(L_Target);
+ cc.mov(result, 1234);
+ cc.ret(result);
+ cc.endFunc();
+ }
+
+ virtual bool run(void* _func, String& result, String& expect) {
+ typedef int (*Func)(void);
+ Func func = ptr_as_func<Func>(_func);
+
+ int out = func();
+ int expected = 1234;
+
+ result.assignFormat("ret=%d", out);
+ expect.assignFormat("ret=%d", expected);
+
+ return result == expect;
+ }
+};
+
+// x86::Compiler - X86Test_JumpTable4
+// ==================================
+
+class X86Test_JumpTable4 : public X86TestCase {
+public:
+ X86Test_JumpTable4()
+ : X86TestCase("JumpTable {Jumping to a single label and multiple labels}") {}
+
+ static void add(TestApp& app) {
+ app.add(new X86Test_JumpTable4());
+ }
+
+ virtual void compile(x86::Compiler& cc) {
+ x86::Gp result = cc.newUInt32("result");
+ x86::Gp condition = cc.newUInt32("condition");
+
+ FuncNode* func = cc.addFunc(FuncSignature::build<int, int>());
+ func->setArg(0, condition);
+
+ Label L_NonZero = cc.newLabel();
+ cc.test(condition, condition);
+ cc.jnz(L_NonZero);
+
+ {
+ JumpAnnotation* annotation = cc.newJumpAnnotation();
+ Label L_Target = cc.newLabel();
+ annotation->addLabel(L_Target);
+
+ x86::Gp target = cc.newUIntPtr("target");
+ cc.lea(target, x86::ptr(L_Target));
+ cc.jmp(target, annotation);
+ cc.bind(L_Target);
+ cc.mov(result, 1234);
+ cc.ret(result);
+ }
+
+ {
+ JumpAnnotation* annotation = cc.newJumpAnnotation();
+ Label L_Target1 = cc.newLabel();
+ Label L_Target2 = cc.newLabel();
+ annotation->addLabel(L_Target1);
+ annotation->addLabel(L_Target2);
+
+ cc.bind(L_NonZero);
+ x86::Gp target = cc.newUIntPtr("target");
+ cc.lea(target, x86::ptr(L_Target1));
+ cc.jmp(target, annotation);
+
+ cc.bind(L_Target1);
+ cc.mov(result, 4321);
+ cc.ret(result);
+
+ // Never executed.
+ cc.bind(L_Target2);
+ cc.mov(result, 0);
+ cc.ret(result);
+ }
+
+ cc.endFunc();
+ }
+
+ virtual bool run(void* _func, String& result, String& expect) {
+ typedef int (*Func)(int);
+ Func func = ptr_as_func<Func>(_func);
+
+ int results[2] = { func(0), func(1) };
+ int expected[2] = { 1234, 4321 };
+
+ result.assignFormat("ret={%d, %d}", results[0], results[1]);
+ expect.assignFormat("ret={%d, %d}", expected[0], expected[1]);
+
+ return result == expect;
+ }
+};
+
// x86::Compiler - X86Test_AllocBase
// =================================
@@ -727,7 +878,7 @@ public:
}
virtual void compile(x86::Compiler& cc) {
- cc.addFunc(FuncSignatureT<int>(CallConvId::kHost));
+ cc.addFunc(FuncSignature::build<int>());
x86::Gp v0 = cc.newInt32("v0");
x86::Gp v1 = cc.newInt32("v1");
@@ -761,7 +912,7 @@ public:
result.assignFormat("ret=%d", resultRet);
expect.assignFormat("ret=%d", expectRet);
- return resultRet == expectRet;
+ return result == expect;
}
};
@@ -782,7 +933,7 @@ public:
x86::Gp a0 = cc.newIntPtr("a0");
x86::Gp a1 = cc.newIntPtr("a1");
- FuncNode* funcNode = cc.addFunc(FuncSignatureT<void, int*, int*>(CallConvId::kHost));
+ FuncNode* funcNode = cc.addFunc(FuncSignature::build<void, int*, int*>());
funcNode->setArg(0, a0);
funcNode->setArg(1, a1);
@@ -820,8 +971,8 @@ public:
typedef void (*Func)(int*, int*);
Func func = ptr_as_func<Func>(_func);
- int resultX;
- int resultY;
+ int resultX = 0;
+ int resultY = 0;
int expectX = 36;
int expectY = -36;
@@ -850,7 +1001,7 @@ public:
x86::Gp a = cc.newIntPtr("a");
x86::Gp v[32];
- FuncNode* funcNode = cc.addFunc(FuncSignatureT<void, uint32_t*>(CallConvId::kHost));
+ FuncNode* funcNode = cc.addFunc(FuncSignature::build<void, uint32_t*>());
funcNode->setArg(0, a);
for (uint32_t i = 0; i < ASMJIT_ARRAY_SIZE(v); i++) v[i] = cc.newInt32("v%d", i);
@@ -875,8 +1026,8 @@ public:
Func func = ptr_as_func<Func>(_func);
uint32_t i;
- uint32_t resultBuf[32];
- uint32_t expectBuf[32];
+ uint32_t resultBuf[32] {};
+ uint32_t expectBuf[32] {};
for (i = 0; i < ASMJIT_ARRAY_SIZE(resultBuf); i++)
expectBuf[i] = i * 32;
@@ -915,7 +1066,7 @@ public:
x86::Gp vLo = cc.newInt32("vLo");
x86::Gp src = cc.newInt32("src");
- FuncNode* funcNode = cc.addFunc(FuncSignatureT<void, int*, int*, int, int>(CallConvId::kHost));
+ FuncNode* funcNode = cc.addFunc(FuncSignature::build<void, int*, int*, int, int>());
funcNode->setArg(0, dstHi);
funcNode->setArg(1, dstLo);
funcNode->setArg(2, vLo);
@@ -934,8 +1085,8 @@ public:
int v0 = 4;
int v1 = 4;
- int resultHi;
- int resultLo;
+ int resultHi = 0;
+ int resultLo = 0;
int expectHi = 0;
int expectLo = v0 * v1;
@@ -964,7 +1115,7 @@ public:
x86::Gp dst = cc.newIntPtr("dst");
x86::Gp src = cc.newIntPtr("src");
- FuncNode* funcNode = cc.addFunc(FuncSignatureT<void, int*, const int*>(CallConvId::kHost));
+ FuncNode* funcNode = cc.addFunc(FuncSignature::build<void, int*, const int*>());
funcNode->setArg(0, dst);
funcNode->setArg(1, src);
@@ -1017,7 +1168,7 @@ public:
x86::Gp b = cc.newInt32("b");
x86::Gp dummy = cc.newInt32("dummy");
- FuncNode* funcNode = cc.addFunc(FuncSignatureT<int, int, int>(CallConvId::kHost));
+ FuncNode* funcNode = cc.addFunc(FuncSignature::build<int, int, int>());
funcNode->setArg(0, a);
funcNode->setArg(1, b);
@@ -1041,7 +1192,7 @@ public:
result.assignFormat("result=%d", resultRet);
expect.assignFormat("result=%d", expectRet);
- return resultRet == expectRet;
+ return result == expect;
}
};
@@ -1061,7 +1212,7 @@ public:
x86::Gp src1 = cc.newInt32("src1");
x86::Gp dst0 = cc.newIntPtr("dst0");
- FuncNode* funcNode = cc.addFunc(FuncSignatureT<void, int, int, char*>(CallConvId::kHost));
+ FuncNode* funcNode = cc.addFunc(FuncSignature::build<void, int, int, char*>());
funcNode->setArg(0, src0);
funcNode->setArg(1, src1);
funcNode->setArg(2, dst0);
@@ -1076,7 +1227,7 @@ public:
typedef void (*Func)(int, int, char*);
Func func = ptr_as_func<Func>(_func);
- char resultBuf[4];
+ char resultBuf[4] {};
char expectBuf[4] = { 1, 0, 0, 1 };
func(0, 0, &resultBuf[0]); // We are expecting 1 (0 == 0).
@@ -1111,7 +1262,7 @@ public:
x86::Gp vShlParam = cc.newInt32("vShlParam");
x86::Gp vRorParam = cc.newInt32("vRorParam");
- FuncNode* funcNode = cc.addFunc(FuncSignatureT<void, int*, int, int, int>(CallConvId::kHost));
+ FuncNode* funcNode = cc.addFunc(FuncSignature::build<void, int*, int, int, int>());
funcNode->setArg(0, dst);
funcNode->setArg(1, var);
funcNode->setArg(2, vShlParam);
@@ -1129,7 +1280,7 @@ public:
int v0 = 0x000000FF;
- int resultRet;
+ int resultRet = 0;
int expectRet = 0x0000FF00;
func(&resultRet, v0, 16, 8);
@@ -1137,7 +1288,7 @@ public:
result.assignFormat("ret=%d", resultRet);
expect.assignFormat("ret=%d", expectRet);
- return resultRet == expectRet;
+ return result == expect;
}
};
@@ -1159,7 +1310,7 @@ public:
x86::Gp rSum = cc.newUInt32("rSum");
x86::Gp x[kCount];
- FuncNode* funcNode = cc.addFunc(FuncSignatureT<uint32_t, uint32_t*>(CallConvId::kHost));
+ FuncNode* funcNode = cc.addFunc(FuncSignature::build<uint32_t, uint32_t*>());
funcNode->setArg(0, rPtr);
for (uint32_t i = 0; i < kCount; i++) {
@@ -1196,10 +1347,9 @@ public:
uint32_t i;
uint32_t buf[kCount];
- uint32_t resultRet;
- uint32_t expectRet;
+ uint32_t resultRet = 0;
+ uint32_t expectRet = 0;
- expectRet = 0;
for (i = 0; i < kCount; i++) {
buf[i] = 1;
}
@@ -1223,7 +1373,7 @@ public:
result.assignFormat("ret=%d", resultRet);
expect.assignFormat("ret=%d", expectRet);
- return resultRet == expectRet;
+ return result == expect;
}
};
@@ -1241,7 +1391,7 @@ public:
virtual void compile(x86::Compiler& cc) {
x86::Gp v = cc.newUInt32("v");
- FuncNode* funcNode = cc.addFunc(FuncSignatureT<uint32_t, uint32_t>(CallConvId::kHost));
+ FuncNode* funcNode = cc.addFunc(FuncSignature::build<uint32_t, uint32_t>());
funcNode->setArg(0, v);
cc.mov(v.r8(), 0xFF);
@@ -1259,7 +1409,7 @@ public:
result.assignFormat("ret=%d", resultRet);
expect.assignFormat("ret=%d", expectRet);
- return resultRet == expectRet;
+ return result == expect;
}
};
@@ -1279,7 +1429,7 @@ public:
x86::Gp src = cc.newIntPtr("src");
x86::Gp cnt = cc.newIntPtr("cnt");
- FuncNode* funcNode = cc.addFunc(FuncSignatureT<void, void*, void*, size_t>(CallConvId::kHost));
+ FuncNode* funcNode = cc.addFunc(FuncSignature::build<void, void*, void*, size_t>());
funcNode->setArg(0, dst);
funcNode->setArg(1, src);
funcNode->setArg(2, cnt);
@@ -1321,7 +1471,7 @@ public:
Label L_1 = cc.newLabel();
Label L_2 = cc.newLabel();
- FuncNode* funcNode = cc.addFunc(FuncSignatureT<int, int, int>(CallConvId::kHost));
+ FuncNode* funcNode = cc.addFunc(FuncSignature::build<int, int, int>());
funcNode->setArg(0, v1);
funcNode->setArg(1, v2);
@@ -1373,7 +1523,7 @@ public:
Label L_3 = cc.newLabel();
Label L_4 = cc.newLabel();
- FuncNode* funcNode = cc.addFunc(FuncSignatureT<int, int, int>(CallConvId::kHost));
+ FuncNode* funcNode = cc.addFunc(FuncSignature::build<int, int, int>());
funcNode->setArg(0, v1);
funcNode->setArg(1, v2);
@@ -1432,7 +1582,7 @@ public:
Label L_Loop = cc.newLabel();
Label L_Exit = cc.newLabel();
- FuncNode* funcNode = cc.addFunc(FuncSignatureT<int, int, int>(CallConvId::kHost));
+ FuncNode* funcNode = cc.addFunc(FuncSignature::build<int, int, int>());
funcNode->setArg(0, v1);
funcNode->setArg(1, v2);
@@ -1492,7 +1642,7 @@ public:
Label L_Loop2 = cc.newLabel();
Label L_Exit = cc.newLabel();
- FuncNode* funcNode = cc.addFunc(FuncSignatureT<int, int, int>(CallConvId::kHost));
+ FuncNode* funcNode = cc.addFunc(FuncSignature::build<int, int, int>());
funcNode->setArg(0, v1);
funcNode->setArg(1, v2);
@@ -1549,7 +1699,7 @@ public:
x86::Gp x = cc.newInt8("x");
x86::Gp y = cc.newInt32("y");
- FuncNode* funcNode = cc.addFunc(FuncSignatureT<int, char>(CallConvId::kHost));
+ FuncNode* funcNode = cc.addFunc(FuncSignature::build<int, int8_t>());
funcNode->setArg(0, x);
cc.movsx(y, x);
@@ -1559,10 +1709,10 @@ public:
}
virtual bool run(void* _func, String& result, String& expect) {
- typedef int (*Func)(char);
+ typedef int (*Func)(int8_t);
Func func = ptr_as_func<Func>(_func);
- int resultRet = func(-13);
+ int resultRet = func(int8_t(-13));
int expectRet = -13;
result.assignFormat("ret=%d", resultRet);
@@ -1586,7 +1736,7 @@ public:
virtual void compile(x86::Compiler& cc) {
x86::Gp x = cc.newInt32("x");
- FuncNode* funcNode = cc.addFunc(FuncSignatureT<int, int, int, int>(CallConvId::kHost));
+ FuncNode* funcNode = cc.addFunc(FuncSignature::build<int, int, int, int>());
funcNode->setArg(2, x);
cc.ret(x);
@@ -1619,7 +1769,7 @@ public:
}
virtual void compile(x86::Compiler& cc) {
- FuncNode* funcNode = cc.addFunc(FuncSignatureT<void, void*, void*, void*, void*, void*, void*, void*, void*>(CallConvId::kHost));
+ FuncNode* funcNode = cc.addFunc(FuncSignature::build<void, void*, void*, void*, void*, void*, void*, void*, void*>());
x86::Gp var[8];
for (uint32_t i = 0; i < 8; i++) {
@@ -1675,7 +1825,7 @@ public:
}
virtual void compile(x86::Compiler& cc) {
- FuncNode* funcNode = cc.addFunc(FuncSignatureT<void, float, float, float, float, float, float, float, void*>(CallConvId::kHost));
+ FuncNode* funcNode = cc.addFunc(FuncSignature::build<void, float, float, float, float, float, float, float, void*>());
x86::Gp p = cc.newIntPtr("p");
x86::Xmm xv[7];
@@ -1702,7 +1852,7 @@ public:
typedef void (*Func)(float, float, float, float, float, float, float, float*);
Func func = ptr_as_func<Func>(_func);
- float resultRet;
+ float resultRet = 0;
float expectRet = 1.0f + 2.0f + 3.0f + 4.0f + 5.0f + 6.0f + 7.0f;
func(1.0f, 2.0f, 3.0f, 4.0f, 5.0f, 6.0f, 7.0f, &resultRet);
@@ -1710,7 +1860,7 @@ public:
result.assignFormat("ret={%g}", resultRet);
expect.assignFormat("ret={%g}", expectRet);
- return resultRet == expectRet;
+ return result == expect;
}
};
@@ -1726,7 +1876,7 @@ public:
}
virtual void compile(x86::Compiler& cc) {
- FuncNode* funcNode = cc.addFunc(FuncSignatureT<void, double, double, double, double, double, double, double, void*>(CallConvId::kHost));
+ FuncNode* funcNode = cc.addFunc(FuncSignature::build<void, double, double, double, double, double, double, double, void*>());
x86::Gp p = cc.newIntPtr("p");
x86::Xmm xv[7];
@@ -1753,7 +1903,7 @@ public:
typedef void (*Func)(double, double, double, double, double, double, double, double*);
Func func = ptr_as_func<Func>(_func);
- double resultRet;
+ double resultRet = 0;
double expectRet = 1.0 + 2.0 + 3.0 + 4.0 + 5.0 + 6.0 + 7.0;
func(1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, &resultRet);
@@ -1761,13 +1911,14 @@ public:
result.assignFormat("ret={%g}", resultRet);
expect.assignFormat("ret={%g}", expectRet);
- return resultRet == expectRet;
+ return result == expect;
}
};
// x86::Compiler - X86Test_AllocArgsVec
// ====================================
+#if ASMJIT_ARCH_X86
class X86Test_AllocArgsVec : public X86TestCase {
public:
X86Test_AllocArgsVec() : X86TestCase("AllocArgsVec") {}
@@ -1785,7 +1936,7 @@ public:
x86::Xmm a = cc.newXmm("aXmm");
x86::Xmm b = cc.newXmm("bXmm");
- FuncNode* funcNode = cc.addFunc(FuncSignatureT<x86::Xmm, x86::Xmm, x86::Xmm>(CallConvId::kHost));
+ FuncNode* funcNode = cc.addFunc(FuncSignature::build<x86::Xmm, x86::Xmm, x86::Xmm>());
funcNode->setArg(0, a);
funcNode->setArg(1, b);
@@ -1802,7 +1953,7 @@ public:
uint8_t aData[16] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 };
uint8_t bData[16] = { 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0 };
- uint8_t rData[16];
+ uint8_t rData[16] {};
uint8_t eData[16] = { 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15 };
__m128i aVec = _mm_loadu_si128(reinterpret_cast<const __m128i*>(aData));
@@ -1817,6 +1968,7 @@ public:
return result == expect;
}
};
+#endif // ASMJIT_ARCH_X86
// x86::Compiler - X86Test_AllocRetFloat1
// ======================================
@@ -1832,7 +1984,7 @@ public:
virtual void compile(x86::Compiler& cc) {
x86::Xmm x = cc.newXmmSs("x");
- FuncNode* funcNode = cc.addFunc(FuncSignatureT<float, float>(CallConvId::kHost));
+ FuncNode* funcNode = cc.addFunc(FuncSignature::build<float, float>());
funcNode->setArg(0, x);
cc.ret(x);
@@ -1849,7 +2001,7 @@ public:
result.assignFormat("ret={%g}", resultRet);
expect.assignFormat("ret={%g}", expectRet);
- return resultRet == expectRet;
+ return result == expect;
}
};
@@ -1868,7 +2020,7 @@ public:
x86::Xmm x = cc.newXmmSs("x");
x86::Xmm y = cc.newXmmSs("y");
- FuncNode* funcNode = cc.addFunc(FuncSignatureT<float, float, float>(CallConvId::kHost));
+ FuncNode* funcNode = cc.addFunc(FuncSignature::build<float, float, float>());
funcNode->setArg(0, x);
funcNode->setArg(1, y);
@@ -1888,7 +2040,7 @@ public:
result.assignFormat("ret={%g}", resultRet);
expect.assignFormat("ret={%g}", expectRet);
- return resultRet == expectRet;
+ return result == expect;
}
};
@@ -1906,7 +2058,7 @@ public:
virtual void compile(x86::Compiler& cc) {
x86::Xmm x = cc.newXmmSd("x");
- FuncNode* funcNode = cc.addFunc(FuncSignatureT<double, double>(CallConvId::kHost));
+ FuncNode* funcNode = cc.addFunc(FuncSignature::build<double, double>());
funcNode->setArg(0, x);
cc.ret(x);
@@ -1923,7 +2075,7 @@ public:
result.assignFormat("ret={%g}", resultRet);
expect.assignFormat("ret={%g}", expectRet);
- return resultRet == expectRet;
+ return result == expect;
}
};
@@ -1942,7 +2094,7 @@ public:
x86::Xmm x = cc.newXmmSd("x");
x86::Xmm y = cc.newXmmSd("y");
- FuncNode* funcNode = cc.addFunc(FuncSignatureT<double, double, double>(CallConvId::kHost));
+ FuncNode* funcNode = cc.addFunc(FuncSignature::build<double, double, double>());
funcNode->setArg(0, x);
funcNode->setArg(1, y);
@@ -1962,7 +2114,7 @@ public:
result.assignFormat("ret={%g}", resultRet);
expect.assignFormat("ret={%g}", expectRet);
- return resultRet == expectRet;
+ return result == expect;
}
};
@@ -1980,7 +2132,7 @@ public:
}
virtual void compile(x86::Compiler& cc) {
- cc.addFunc(FuncSignatureT<int>(CallConvId::kHost));
+ cc.addFunc(FuncSignature::build<int>());
x86::Mem stack = cc.newStack(kSize, 1);
stack.setSize(1);
@@ -2029,7 +2181,7 @@ public:
result.assignInt(resultRet);
expect.assignInt(expectRet);
- return resultRet == expectRet;
+ return result == expect;
}
};
@@ -2054,7 +2206,7 @@ public:
Label L_Loop = cc.newLabel(); // Create base labels we use
Label L_Exit = cc.newLabel(); // in our function.
- FuncNode* funcNode = cc.addFunc(FuncSignatureT<void, uint32_t*, const uint32_t*, size_t>(CallConvId::kHost));
+ FuncNode* funcNode = cc.addFunc(FuncSignature::build<void, uint32_t*, const uint32_t*, size_t>());
funcNode->setArg(0, dst);
funcNode->setArg(1, src);
funcNode->setArg(2, cnt);
@@ -2131,7 +2283,7 @@ public:
x86::Gp a = cc.newInt32("a");
x86::Gp b = cc.newInt32("b");
- FuncNode* funcNode = cc.addFunc(FuncSignatureT<int, int, int, int>(CallConvId::kHost));
+ FuncNode* funcNode = cc.addFunc(FuncSignature::build<int, int, int, int>());
funcNode->setArg(0, cond);
funcNode->setArg(1, a);
funcNode->setArg(2, b);
@@ -2254,6 +2406,47 @@ public:
}
};
+// x86::Compiler - X86Test_FuncArgInt8
+// ===================================
+
+class X86Test_FuncArgInt8 : public X86TestCase {
+public:
+ X86Test_FuncArgInt8() : X86TestCase("FuncArgInt8") {}
+
+ static void add(TestApp& app) {
+ app.add(new X86Test_FuncArgInt8());
+ }
+
+ virtual void compile(x86::Compiler& cc) {
+ x86::Gp v0 = cc.newUInt32("v0");
+ x86::Gp v1 = cc.newUInt32("v1");
+
+ FuncNode* funcNode = cc.addFunc(FuncSignature::build<unsigned, uint8_t, uint8_t, uint32_t>());
+ funcNode->setArg(0, v0);
+ funcNode->setArg(1, v1);
+
+ cc.add(v0, v1);
+
+ cc.ret(v0);
+ cc.endFunc();
+ }
+
+ virtual bool run(void* _func, String& result, String& expect) {
+ typedef uint32_t (*Func)(uint8_t, uint8_t, uint32_t);
+ Func func = ptr_as_func<Func>(_func);
+
+ uint32_t arg = uint32_t(uintptr_t(_func) & 0xFFFFFFFF);
+
+ unsigned resultRet = func(uint8_t(arg & 0xFF), uint8_t(arg & 0xFF), arg);
+ unsigned expectRet = (arg & 0xFF) * 2;
+
+ result.assignFormat("ret=%u", resultRet);
+ expect.assignFormat("ret=%u", expectRet);
+
+ return result == expect;
+ }
+};
+
// x86::Compiler - X86Test_FuncCallBase1
// =====================================
@@ -2270,7 +2463,7 @@ public:
x86::Gp v1 = cc.newInt32("v1");
x86::Gp v2 = cc.newInt32("v2");
- FuncNode* funcNode = cc.addFunc(FuncSignatureT<int, int, int, int>(CallConvId::kHost));
+ FuncNode* funcNode = cc.addFunc(FuncSignature::build<int, int, int, int>());
funcNode->setArg(0, v0);
funcNode->setArg(1, v1);
funcNode->setArg(2, v2);
@@ -2282,7 +2475,7 @@ public:
// Call a function.
InvokeNode* invokeNode;
- cc.invoke(&invokeNode, imm((void*)calledFunc), FuncSignatureT<int, int, int, int>(CallConvId::kHost));
+ cc.invoke(&invokeNode, imm((void*)calledFunc), FuncSignature::build<int, int, int, int>());
invokeNode->setArg(0, v2);
invokeNode->setArg(1, v1);
invokeNode->setArg(2, v0);
@@ -2302,7 +2495,7 @@ public:
result.assignFormat("ret=%d", resultRet);
expect.assignFormat("ret=%d", expectRet);
- return resultRet == expectRet;
+ return result == expect;
}
static int calledFunc(int a, int b, int c) { return (a + b) * c; }
@@ -2322,7 +2515,7 @@ public:
}
virtual void compile(x86::Compiler& cc) {
- cc.addFunc(FuncSignatureT<int>(CallConvId::kHost));
+ cc.addFunc(FuncSignature::build<int>());
const int kTokenSize = 32;
@@ -2342,19 +2535,19 @@ public:
cc.lea(p2, s2);
// Try to corrupt the stack if wrongly allocated.
- cc.invoke(&invokeNode, imm((void*)memcpy), FuncSignatureT<void*, void*, void*, size_t>(CallConvId::kCDecl));
+ cc.invoke(&invokeNode, imm((void*)memcpy), FuncSignature::build<void*, void*, void*, size_t>());
invokeNode->setArg(0, p1);
invokeNode->setArg(1, imm(token));
invokeNode->setArg(2, imm(kTokenSize));
invokeNode->setRet(0, p1);
- cc.invoke(&invokeNode, imm((void*)memcpy), FuncSignatureT<void*, void*, void*, size_t>(CallConvId::kCDecl));
+ cc.invoke(&invokeNode, imm((void*)memcpy), FuncSignature::build<void*, void*, void*, size_t>());
invokeNode->setArg(0, p2);
invokeNode->setArg(1, imm(token));
invokeNode->setArg(2, imm(kTokenSize));
invokeNode->setRet(0, p2);
- cc.invoke(&invokeNode, imm((void*)memcmp), FuncSignatureT<int, void*, void*, size_t>(CallConvId::kCDecl));
+ cc.invoke(&invokeNode, imm((void*)memcmp), FuncSignature::build<int, void*, void*, size_t>());
invokeNode->setArg(0, p1);
invokeNode->setArg(1, p2);
invokeNode->setArg(2, imm(kTokenSize));
@@ -2385,7 +2578,7 @@ public:
result.assignInt(resultRet);
expect.assignInt(expectRet);
- return resultRet == expectRet;
+ return result == expect;
}
};
@@ -2405,7 +2598,7 @@ public:
x86::Gp y = cc.newInt32("y");
x86::Gp z = cc.newInt32("z");
- FuncNode* funcNode = cc.addFunc(FuncSignatureT<int, int, int, int>(CallConvId::kHost));
+ FuncNode* funcNode = cc.addFunc(FuncSignature::build<int, int, int, int>());
funcNode->setArg(0, x);
funcNode->setArg(1, y);
funcNode->setArg(2, z);
@@ -2413,7 +2606,7 @@ public:
InvokeNode* invokeNode;
cc.invoke(&invokeNode,
imm((void*)calledFunc),
- FuncSignatureT<int, int, int, int>(CallConvId::kStdCall));
+ FuncSignature::build<int, int, int, int>(CallConvId::kStdCall));
invokeNode->setArg(0, x);
invokeNode->setArg(1, y);
invokeNode->setArg(2, z);
@@ -2433,7 +2626,7 @@ public:
result.assignFormat("ret=%d", resultRet);
expect.assignFormat("ret=%d", expectRet);
- return resultRet == expectRet;
+ return result == expect;
}
// STDCALL function that is called inside the generated one.
@@ -2456,16 +2649,16 @@ public:
virtual void compile(x86::Compiler& cc) {
x86::Gp var = cc.newInt32("var");
- FuncNode* funcNode = cc.addFunc(FuncSignatureT<int, int>(CallConvId::kHost));
+ FuncNode* funcNode = cc.addFunc(FuncSignature::build<int, int>());
funcNode->setArg(0, var);
InvokeNode* invokeNode;
- cc.invoke(&invokeNode, imm((void*)calledFunc), FuncSignatureT<int, int>(CallConvId::kFastCall));
+ cc.invoke(&invokeNode, imm((void*)calledFunc), FuncSignature::build<int, int>(CallConvId::kFastCall));
invokeNode->setArg(0, var);
invokeNode->setRet(0, var);
- cc.invoke(&invokeNode, imm((void*)calledFunc), FuncSignatureT<int, int>(CallConvId::kFastCall));
+ cc.invoke(&invokeNode, imm((void*)calledFunc), FuncSignature::build<int, int>(CallConvId::kFastCall));
invokeNode->setArg(0, var);
invokeNode->setRet(0, var);
@@ -2483,7 +2676,7 @@ public:
result.assignFormat("ret=%d", resultRet);
expect.assignFormat("ret=%d", expectRet);
- return resultRet == expectRet;
+ return result == expect;
}
// FASTCALL function that is called inside the generated one.
@@ -2495,6 +2688,7 @@ public:
// x86::Compiler - X86Test_FuncCallSIMD
// ====================================
+#if ASMJIT_ARCH_X86
class X86Test_FuncCallSIMD : public X86TestCase {
public:
bool _useVectorCall;
@@ -2513,7 +2707,7 @@ public:
}
virtual void compile(x86::Compiler& cc) {
- FuncNode* funcNode = cc.addFunc(FuncSignatureT<void, void*, const void*, const void*>(CallConvId::kHost));
+ FuncNode* funcNode = cc.addFunc(FuncSignature::build<void, void*, const void*, const void*>());
x86::Gp resultPtr = cc.newIntPtr("resultPtr");
x86::Gp aPtr = cc.newIntPtr("aPtr");
@@ -2542,7 +2736,7 @@ public:
cc.movdqu(bXmm, x86::ptr(bPtr));
InvokeNode* invokeNode;
- cc.invoke(&invokeNode, pFn, FuncSignatureT<x86::Xmm, x86::Xmm, x86::Xmm>(ccId));
+ cc.invoke(&invokeNode, pFn, FuncSignature::build<x86::Xmm, x86::Xmm, x86::Xmm>(ccId));
invokeNode->setArg(0, aXmm);
invokeNode->setArg(1, bXmm);
@@ -2560,7 +2754,7 @@ public:
uint8_t aData[16] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 };
uint8_t bData[16] = { 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0 };
- uint8_t rData[16];
+ uint8_t rData[16] {};
uint8_t eData[16] = { 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15 };
func(rData, aData, bData);
@@ -2581,6 +2775,7 @@ public:
}
#endif
};
+#endif // ASMJIT_ARCH_X86
// x86::Compiler - X86Test_FuncCallLight
// =====================================
@@ -2594,8 +2789,8 @@ public:
}
virtual void compile(x86::Compiler& cc) {
- FuncSignatureT<void, const void*, const void*, const void*, const void*, void*> f1Sig(CallConvId::kCDecl);
- FuncSignatureT<x86::Xmm, x86::Xmm, x86::Xmm> f2Sig(CallConvId::kLightCall2);
+ FuncSignature f1Sig = FuncSignature::build<void, const void*, const void*, const void*, const void*, void*>();
+ FuncSignature f2Sig = FuncSignature::build<x86::Xmm, x86::Xmm, x86::Xmm>(CallConvId::kLightCall2);
FuncNode* f1Node = cc.newFunc(f1Sig);
FuncNode* f2Node = cc.newFunc(f2Sig);
@@ -2668,7 +2863,7 @@ public:
int16_t c[8] = { 1, 3, 9, 7, 5, 4, 2, 1 };
int16_t d[8] = { 2, 0,-6,-4,-2,-1, 1, 2 };
- int16_t o[8];
+ int16_t o[8] {};
int oExp = 7 * 3;
func(a, b, c, d, o);
@@ -2696,7 +2891,7 @@ public:
}
virtual void compile(x86::Compiler& cc) {
- cc.addFunc(FuncSignatureT<int>(CallConvId::kHost));
+ cc.addFunc(FuncSignature::build<int>());
// Prepare.
x86::Gp va = cc.newInt32("va");
@@ -2725,7 +2920,7 @@ public:
InvokeNode* invokeNode;
cc.invoke(&invokeNode,
imm((void*)calledFunc),
- FuncSignatureT<int, int, int, int, int, int, int, int, int, int, int>(CallConvId::kHost));
+ FuncSignature::build<int, int, int, int, int, int, int, int, int, int, int>());
invokeNode->setArg(0, va);
invokeNode->setArg(1, vb);
invokeNode->setArg(2, vc);
@@ -2752,7 +2947,7 @@ public:
result.assignFormat("ret=%d", resultRet);
expect.assignFormat("ret=%d", expectRet);
- return resultRet == expectRet;
+ return result == expect;
}
};
@@ -2772,7 +2967,7 @@ public:
}
virtual void compile(x86::Compiler& cc) {
- cc.addFunc(FuncSignatureT<int>(CallConvId::kHost));
+ cc.addFunc(FuncSignature::build<int>());
// Prepare.
x86::Gp a = cc.newInt32("a");
@@ -2782,7 +2977,7 @@ public:
InvokeNode* invokeNode;
cc.invoke(&invokeNode,
imm((void*)calledFunc),
- FuncSignatureT<int, int, int, int, int, int, int, int, int, int, int>(CallConvId::kHost));
+ FuncSignature::build<int, int, int, int, int, int, int, int, int, int, int>());
invokeNode->setArg(0, a);
invokeNode->setArg(1, a);
invokeNode->setArg(2, a);
@@ -2809,7 +3004,7 @@ public:
result.assignFormat("ret=%d", resultRet);
expect.assignFormat("ret=%d", expectRet);
- return resultRet == expectRet;
+ return result == expect;
}
};
@@ -2825,7 +3020,7 @@ public:
}
virtual void compile(x86::Compiler& cc) {
- cc.addFunc(FuncSignatureT<int>(CallConvId::kHost));
+ cc.addFunc(FuncSignature::build<int>());
// Prepare.
x86::Gp rv = cc.newInt32("rv");
@@ -2834,7 +3029,7 @@ public:
InvokeNode* invokeNode;
cc.invoke(&invokeNode,
imm((void*)X86Test_FuncCallManyArgs::calledFunc),
- FuncSignatureT<int, int, int, int, int, int, int, int, int, int, int>(CallConvId::kHost));
+ FuncSignature::build<int, int, int, int, int, int, int, int, int, int, int>());
invokeNode->setArg(0, imm(0x03));
invokeNode->setArg(1, imm(0x12));
@@ -2862,7 +3057,7 @@ public:
result.assignFormat("ret=%d", resultRet);
expect.assignFormat("ret=%d", expectRet);
- return resultRet == expectRet;
+ return result == expect;
}
};
@@ -2891,7 +3086,7 @@ public:
}
virtual void compile(x86::Compiler& cc) {
- cc.addFunc(FuncSignatureT<int>(CallConvId::kHost));
+ cc.addFunc(FuncSignature::build<int>());
// Prepare.
x86::Gp rv = cc.newInt32("rv");
@@ -2900,7 +3095,7 @@ public:
InvokeNode* invokeNode;
cc.invoke(&invokeNode,
imm((void*)calledFunc),
- FuncSignatureT<int, void*, void*, void*, void*, void*, void*, void*, void*, void*, void*>(CallConvId::kHost));
+ FuncSignature::build<int, void*, void*, void*, void*, void*, void*, void*, void*, void*, void*>());
invokeNode->setArg(0, imm(0x01));
invokeNode->setArg(1, imm(0x02));
@@ -2928,7 +3123,7 @@ public:
result.assignFormat("ret=%d", resultRet);
expect.assignFormat("ret=%d", expectRet);
- return resultRet == expectRet;
+ return result == expect;
}
};
@@ -2952,7 +3147,7 @@ public:
}
virtual void compile(x86::Compiler& cc) {
- FuncNode* funcNode = cc.addFunc(FuncSignatureT<int, int&, int&, int&, int&>(CallConvId::kHost));
+ FuncNode* funcNode = cc.addFunc(FuncSignature::build<int, int&, int&, int&, int&>());
// Prepare.
x86::Gp arg1 = cc.newInt32();
@@ -2970,7 +3165,7 @@ public:
InvokeNode* invokeNode;
cc.invoke(&invokeNode,
imm((void*)calledFunc),
- FuncSignatureT<int, int&, int&, int&, int&>(CallConvId::kHost));
+ FuncSignature::build<int, int&, int&, int&, int&>());
invokeNode->setArg(0, arg1);
invokeNode->setArg(1, arg2);
@@ -2994,7 +3189,7 @@ public:
result.assignFormat("ret={%08X %08X %08X %08X %08X}", resultRet, inputs[0], inputs[1], inputs[2], inputs[3]);
expect.assignFormat("ret={%08X %08X %08X %08X %08X}", expectRet, outputs[0], outputs[1], outputs[2], outputs[3]);
- return resultRet == expectRet;
+ return result == expect;
}
};
@@ -3014,7 +3209,7 @@ public:
}
virtual void compile(x86::Compiler& cc) {
- FuncNode* funcNode = cc.addFunc(FuncSignatureT<float, float, float>(CallConvId::kHost));
+ FuncNode* funcNode = cc.addFunc(FuncSignature::build<float, float, float>());
x86::Xmm a = cc.newXmmSs("a");
x86::Xmm b = cc.newXmmSs("b");
@@ -3025,7 +3220,7 @@ public:
// Call function.
InvokeNode* invokeNode;
- cc.invoke(&invokeNode, imm((void*)calledFunc), FuncSignatureT<float, float, float>(CallConvId::kHost));
+ cc.invoke(&invokeNode, imm((void*)calledFunc), FuncSignature::build<float, float, float>());
invokeNode->setArg(0, a);
invokeNode->setArg(1, b);
invokeNode->setRet(0, ret);
@@ -3044,7 +3239,7 @@ public:
result.assignFormat("ret=%g", resultRet);
expect.assignFormat("ret=%g", expectRet);
- return resultRet == expectRet;
+ return result == expect;
}
};
@@ -3064,7 +3259,7 @@ public:
}
virtual void compile(x86::Compiler& cc) {
- FuncNode* funcNode = cc.addFunc(FuncSignatureT<double, double, double>(CallConvId::kHost));
+ FuncNode* funcNode = cc.addFunc(FuncSignature::build<double, double, double>());
x86::Xmm a = cc.newXmmSd("a");
x86::Xmm b = cc.newXmmSd("b");
@@ -3074,7 +3269,7 @@ public:
funcNode->setArg(1, b);
InvokeNode* invokeNode;
- cc.invoke(&invokeNode, imm((void*)calledFunc), FuncSignatureT<double, double, double>(CallConvId::kHost));
+ cc.invoke(&invokeNode, imm((void*)calledFunc), FuncSignature::build<double, double, double>());
invokeNode->setArg(0, a);
invokeNode->setArg(1, b);
invokeNode->setRet(0, ret);
@@ -3093,7 +3288,7 @@ public:
result.assignFormat("ret=%g", resultRet);
expect.assignFormat("ret=%g", expectRet);
- return resultRet == expectRet;
+ return result == expect;
}
};
@@ -3116,7 +3311,7 @@ public:
InvokeNode* invokeNode;
x86::Gp result;
- FuncNode* funcNode = cc.addFunc(FuncSignatureT<int, int, int, int>(CallConvId::kHost));
+ FuncNode* funcNode = cc.addFunc(FuncSignature::build<int, int, int, int>());
funcNode->setArg(0, x);
funcNode->setArg(1, y);
funcNode->setArg(2, op);
@@ -3136,7 +3331,7 @@ public:
cc.bind(opAdd);
result = cc.newInt32("result_1");
- cc.invoke(&invokeNode, (uint64_t)calledFuncAdd, FuncSignatureT<int, int, int>(CallConvId::kHost));
+ cc.invoke(&invokeNode, (uint64_t)calledFuncAdd, FuncSignature::build<int, int, int>());
invokeNode->setArg(0, x);
invokeNode->setArg(1, y);
invokeNode->setRet(0, result);
@@ -3145,7 +3340,7 @@ public:
cc.bind(opMul);
result = cc.newInt32("result_2");
- cc.invoke(&invokeNode, (uint64_t)calledFuncMul, FuncSignatureT<int, int, int>(CallConvId::kHost));
+ cc.invoke(&invokeNode, (uint64_t)calledFuncMul, FuncSignature::build<int, int, int>());
invokeNode->setArg(0, x);
invokeNode->setArg(1, y);
invokeNode->setRet(0, result);
@@ -3199,7 +3394,7 @@ public:
x86::Gp acc0 = cc.newInt32("acc0");
x86::Gp acc1 = cc.newInt32("acc1");
- FuncNode* funcNode = cc.addFunc(FuncSignatureT<int, int*>(CallConvId::kHost));
+ FuncNode* funcNode = cc.addFunc(FuncSignature::build<int, int*>());
funcNode->setArg(0, buf);
cc.mov(acc0, 0);
@@ -3214,7 +3409,7 @@ public:
cc.mov(ptr, buf);
cc.mov(idx, int(i));
- cc.invoke(&invokeNode, (uint64_t)calledFunc, FuncSignatureT<int, int*, int>(CallConvId::kFastCall));
+ cc.invoke(&invokeNode, (uint64_t)calledFunc, FuncSignature::build<int, int*, int>(CallConvId::kFastCall));
invokeNode->setArg(0, ptr);
invokeNode->setArg(1, idx);
invokeNode->setRet(0, ret);
@@ -3224,7 +3419,7 @@ public:
cc.mov(ptr, buf);
cc.mov(idx, int(i));
- cc.invoke(&invokeNode, (uint64_t)calledFunc, FuncSignatureT<int, int*, int>(CallConvId::kFastCall));
+ cc.invoke(&invokeNode, (uint64_t)calledFunc, FuncSignature::build<int, int*, int>(CallConvId::kFastCall));
invokeNode->setArg(0, ptr);
invokeNode->setArg(1, idx);
invokeNode->setRet(0, ret);
@@ -3249,7 +3444,7 @@ public:
result.assignFormat("ret=%d", resultRet);
expect.assignFormat("ret=%d", expectRet);
- return resultRet == expectRet;
+ return result == expect;
}
};
@@ -3268,7 +3463,7 @@ public:
x86::Gp val = cc.newInt32("val");
Label skip = cc.newLabel();
- FuncNode* funcNode = cc.addFunc(FuncSignatureT<int, int>(CallConvId::kHost));
+ FuncNode* funcNode = cc.addFunc(FuncSignature::build<int, int>());
funcNode->setArg(0, val);
cc.cmp(val, 1);
@@ -3280,7 +3475,7 @@ public:
InvokeNode* invokeNode;
- cc.invoke(&invokeNode, funcNode->label(), FuncSignatureT<int, int>(CallConvId::kHost));
+ cc.invoke(&invokeNode, funcNode->label(), FuncSignature::build<int, int>());
invokeNode->setArg(0, tmp);
invokeNode->setRet(0, tmp);
cc.mul(cc.newInt32(), val, tmp);
@@ -3300,7 +3495,7 @@ public:
result.assignFormat("ret=%d", resultRet);
expect.assignFormat("ret=%d", expectRet);
- return resultRet == expectRet;
+ return result == expect;
}
};
@@ -3316,7 +3511,7 @@ public:
}
virtual void compile(x86::Compiler& cc) {
- FuncNode* funcNode = cc.addFunc(FuncSignatureT<int, int, int, int, int>(CallConvId::kHost));
+ FuncNode* funcNode = cc.addFunc(FuncSignature::build<int, int, int, int, int>());
x86::Gp a0 = cc.newInt32("a0");
x86::Gp a1 = cc.newInt32("a1");
@@ -3334,7 +3529,7 @@ public:
InvokeNode* invokeNode;
cc.invoke(&invokeNode,
imm((void*)calledFunc),
- FuncSignatureT<int, size_t, int, int, int, int>(CallConvId::kHost, 1));
+ FuncSignature::build<int, size_t, int, int, int, int>(CallConvId::kCDecl, 1));
invokeNode->setArg(0, imm(4));
invokeNode->setArg(1, a0);
invokeNode->setArg(2, a1);
@@ -3356,7 +3551,7 @@ public:
result.assignFormat("ret=%d", resultRet);
expect.assignFormat("ret=%d", expectRet);
- return resultRet == expectRet;
+ return result == expect;
}
static int calledFunc(size_t n, ...) {
@@ -3384,7 +3579,7 @@ public:
}
virtual void compile(x86::Compiler& cc) {
- FuncNode* funcNode = cc.addFunc(FuncSignatureT<double, double, double, double, double>(CallConvId::kHost));
+ FuncNode* funcNode = cc.addFunc(FuncSignature::build<double, double, double, double, double>());
x86::Xmm a0 = cc.newXmmSd("a0");
x86::Xmm a1 = cc.newXmmSd("a1");
@@ -3402,7 +3597,7 @@ public:
InvokeNode* invokeNode;
cc.invoke(&invokeNode,
imm((void*)calledFunc),
- FuncSignatureT<double, size_t, double, double, double, double>(CallConvId::kHost, 1));
+ FuncSignature::build<double, size_t, double, double, double, double>(CallConvId::kCDecl, 1));
invokeNode->setArg(0, imm(4));
invokeNode->setArg(1, a0);
invokeNode->setArg(2, a1);
@@ -3424,7 +3619,7 @@ public:
result.assignFormat("ret=%f", resultRet);
expect.assignFormat("ret=%f", expectRet);
- return resultRet == expectRet;
+ return result == expect;
}
static double calledFunc(size_t n, ...) {
@@ -3452,7 +3647,7 @@ public:
}
virtual void compile(x86::Compiler& cc) {
- FuncNode* funcNode = cc.addFunc(FuncSignatureT<uint64_t, uint64_t>(CallConvId::kHost));
+ FuncNode* funcNode = cc.addFunc(FuncSignature::build<uint64_t, uint64_t>());
if (cc.is64Bit()) {
x86::Gp reg = cc.newUInt64();
@@ -3485,7 +3680,7 @@ public:
result.assignFormat("ret=%llu", (unsigned long long)resultRet);
expect.assignFormat("ret=%llu", (unsigned long long)expectRet);
- return resultRet == expectRet;
+ return result == expect;
}
static double calledFunc(size_t n, ...) {
@@ -3515,7 +3710,7 @@ public:
static void dummy(int, int) {}
virtual void compile(x86::Compiler& cc) {
- FuncNode* funcNode = cc.addFunc(FuncSignatureT<int, int, int>(CallConvId::kHost));
+ FuncNode* funcNode = cc.addFunc(FuncSignature::build<int, int, int>());
x86::Gp a = cc.newInt32("a");
x86::Gp b = cc.newInt32("b");
@@ -3527,7 +3722,7 @@ public:
InvokeNode* invokeNode;
cc.invoke(&invokeNode,
imm((void*)dummy),
- FuncSignatureT<void, int, int>(CallConvId::kHost));
+ FuncSignature::build<void, int, int>());
invokeNode->setArg(0, a);
invokeNode->setArg(1, b);
@@ -3547,7 +3742,7 @@ public:
result.assignFormat("ret=%d", resultRet);
expect.assignFormat("ret=%d", expectRet);
- return resultRet == expectRet;
+ return result == expect;
}
};
@@ -3563,7 +3758,7 @@ public:
}
virtual void compile(x86::Compiler& cc) {
- FuncNode* funcNode = cc.addFunc(FuncSignatureT<double, const double*>(CallConvId::kHost));
+ FuncNode* funcNode = cc.addFunc(FuncSignature::build<double, const double*>());
x86::Gp p = cc.newIntPtr("p");
x86::Xmm arg = cc.newXmmSd("arg");
@@ -3575,7 +3770,7 @@ public:
InvokeNode* invokeNode;
cc.invoke(&invokeNode,
imm((void*)op),
- FuncSignatureT<double, double>(CallConvId::kHost));
+ FuncSignature::build<double, double>());
invokeNode->setArg(0, arg);
invokeNode->setRet(0, ret);
@@ -3595,7 +3790,7 @@ public:
result.assignFormat("ret=%g", resultRet);
expect.assignFormat("ret=%g", expectRet);
- return resultRet == expectRet;
+ return result == expect;
}
static double op(double a) { return a * a; }
@@ -3613,7 +3808,7 @@ public:
}
virtual void compile(x86::Compiler& cc) {
- FuncNode* funcNode = cc.addFunc(FuncSignatureT<double, const double*>(CallConvId::kHost));
+ FuncNode* funcNode = cc.addFunc(FuncSignature::build<double, const double*>());
x86::Gp p = cc.newIntPtr("p");
x86::Xmm arg = cc.newXmmSd("arg");
@@ -3625,7 +3820,7 @@ public:
InvokeNode* invokeNode;
cc.invoke(&invokeNode,
imm((void*)op),
- FuncSignatureT<double, double>(CallConvId::kHost));
+ FuncSignature::build<double, double>());
invokeNode->setArg(0, arg);
invokeNode->setRet(0, ret);
@@ -3648,7 +3843,7 @@ public:
result.assignFormat("ret=%g", resultRet);
expect.assignFormat("ret=%g", expectRet);
- return resultRet == expectRet;
+ return result == expect;
}
static double op(double a) { return a * a; }
@@ -3668,13 +3863,13 @@ public:
virtual void compile(x86::Compiler& cc) {
InvokeNode* invokeNode;
- FuncSignatureBuilder funcSignature;
- funcSignature.setCallConvId(CallConvId::kHost);
+ FuncSignature funcSignature;
+ funcSignature.setCallConvId(CallConvId::kCDecl);
funcSignature.setRet(TypeId::kFloat64);
cc.addFunc(funcSignature);
- FuncSignatureBuilder invokeSignature;
- invokeSignature.setCallConvId(CallConvId::kHost);
+ FuncSignature invokeSignature;
+ invokeSignature.setCallConvId(CallConvId::kCDecl);
invokeSignature.setRet(TypeId::kFloat64);
cc.invoke(&invokeNode, imm((void*)calledFunc), invokeSignature);
@@ -3695,7 +3890,7 @@ public:
result.assignFormat("ret=%g", resultRet);
expect.assignFormat("ret=%g", expectRet);
- return resultRet == expectRet;
+ return result == expect;
}
static double calledFunc() { return 3.14; }
@@ -3714,7 +3909,7 @@ public:
}
virtual void compile(x86::Compiler& cc) {
- cc.addFunc(FuncSignatureT<int>(CallConvId::kHost));
+ cc.addFunc(FuncSignature::build<int>());
x86::Gp pFn = cc.newIntPtr("pFn");
x86::Gp vars[16];
@@ -3733,7 +3928,7 @@ public:
}
InvokeNode* invokeNode;
- cc.invoke(&invokeNode, pFn, FuncSignatureT<void>(CallConvId::kHost));
+ cc.invoke(&invokeNode, pFn, FuncSignature::build<void>());
for (i = 1; i < regCount; i++)
if (vars[i].isValid())
@@ -3753,7 +3948,7 @@ public:
result.assignFormat("ret=%d", resultRet);
expect.assignFormat("ret=%d", expectRet);
- return resultRet == expectRet;
+ return result == expect;
}
static void calledFunc() {}
@@ -3771,7 +3966,7 @@ public:
}
virtual void compile(x86::Compiler& cc) {
- FuncNode* funcNode = cc.addFunc(FuncSignatureT<uint32_t, uint32_t>(CallConvId::kHost));
+ FuncNode* funcNode = cc.addFunc(FuncSignature::build<uint32_t, uint32_t>());
constexpr uint32_t kCount = 16;
@@ -3787,7 +3982,7 @@ public:
v[i] = cc.newUInt32("v%u", i);
InvokeNode* invokeNode;
- cc.invoke(&invokeNode, imm((void*)calledFunc), FuncSignatureT<uint32_t, uint32_t>(CallConvId::kHost));
+ cc.invoke(&invokeNode, imm((void*)calledFunc), FuncSignature::build<uint32_t, uint32_t>());
invokeNode->setArg(0, argVal);
invokeNode->setRet(0, retVal);
@@ -3813,7 +4008,7 @@ public:
result.assignFormat("ret=%u", resultRet);
expect.assignFormat("ret=%u", expectRet);
- return resultRet == expectRet;
+ return result == expect;
}
static uint32_t calledFunc(uint32_t x) { return x + 1; }
@@ -3834,12 +4029,12 @@ public:
}
virtual void compile(x86::Compiler& cc) {
- FuncNode* mainFunc = cc.addFunc(FuncSignatureT<void, void*, const void*, const void*>(CallConvId::kHost));
+ FuncNode* mainFunc = cc.addFunc(FuncSignature::build<void, void*, const void*, const void*>());
mainFunc->frame().setAvxEnabled();
mainFunc->frame().setAvxCleanup();
// We need a Windows calling convention to test this properly also on a non-Windows machine.
- FuncNode* helperFunc = cc.newFunc(FuncSignatureT<void, void*, const void*>(CallConvId::kX64Windows));
+ FuncNode* helperFunc = cc.newFunc(FuncSignature::build<void, void*, const void*>(CallConvId::kX64Windows));
helperFunc->frame().setAvxEnabled();
helperFunc->frame().setAvxCleanup();
@@ -3866,7 +4061,7 @@ public:
InvokeNode* invokeNode;
cc.invoke(&invokeNode,
helperFunc->label(),
- FuncSignatureT<void, void*, const void*>(CallConvId::kX64Windows));
+ FuncSignature::build<void, void*, const void*>(CallConvId::kX64Windows));
invokeNode->setArg(0, tPtr);
invokeNode->setArg(1, bPtr);
@@ -3911,8 +4106,8 @@ public:
static const uint32_t aData[8] = { 1, 2, 3, 4, 5, 6, 7, 8 };
static const uint32_t bData[8] = { 6, 3, 5, 9, 1, 8, 7, 2 };
- uint32_t resultData[8];
- uint32_t expectData[8];
+ uint32_t resultData[8] {};
+ uint32_t expectData[8] {};
for (i = 0; i < 8; i++)
expectData[i] = aData[i] * 8 + bData[i] + 1;
@@ -3949,7 +4144,7 @@ public:
}
virtual void compile(x86::Compiler& cc) {
- cc.addFunc(FuncSignatureT<int>(CallConvId::kHost));
+ cc.addFunc(FuncSignature::build<int>());
x86::Gp v0 = cc.newInt32("v0");
x86::Gp v1 = cc.newInt32("v1");
@@ -3975,7 +4170,7 @@ public:
result.assignFormat("ret=%d", resultRet);
expect.assignFormat("ret=%d", expectRet);
- return resultRet == expectRet;
+ return result == expect;
}
};
@@ -3991,7 +4186,7 @@ public:
}
virtual void compile(x86::Compiler& cc) {
- cc.addFunc(FuncSignatureT<int>(CallConvId::kHost));
+ cc.addFunc(FuncSignature::build<int>());
x86::Gp v0 = cc.newInt32("v0");
x86::Gp v1 = cc.newInt32("v1");
@@ -4017,7 +4212,7 @@ public:
result.assignFormat("ret=%d", resultRet);
expect.assignFormat("ret=%d", expectRet);
- return resultRet == expectRet;
+ return result == expect;
}
};
@@ -4032,7 +4227,7 @@ struct X86Test_MiscMultiRet : public X86TestCase {
}
virtual void compile(x86::Compiler& cc) {
- FuncNode* funcNode = cc.addFunc(FuncSignatureT<int, int, int, int>(CallConvId::kHost));
+ FuncNode* funcNode = cc.addFunc(FuncSignature::build<int, int, int, int>());
x86::Gp op = cc.newInt32("op");
x86::Gp a = cc.newInt32("a");
@@ -4108,7 +4303,7 @@ struct X86Test_MiscMultiRet : public X86TestCase {
result.assignFormat("ret={%d %d %d %d}", r0, r1, r2, r3);
expect.assignFormat("ret={%d %d %d %d}", e0, e1, e2, e3);
- return result.eq(expect);
+ return result == expect;
}
};
@@ -4124,8 +4319,8 @@ public:
}
virtual void compile(x86::Compiler& cc) {
- FuncNode* f1Node = cc.newFunc(FuncSignatureT<int, int, int>(CallConvId::kHost));
- FuncNode* f2Node = cc.newFunc(FuncSignatureT<int, int, int>(CallConvId::kHost));
+ FuncNode* f1Node = cc.newFunc(FuncSignature::build<int, int, int>());
+ FuncNode* f2Node = cc.newFunc(FuncSignature::build<int, int, int>());
{
x86::Gp a = cc.newInt32("a");
@@ -4136,7 +4331,7 @@ public:
f1Node->setArg(1, b);
InvokeNode* invokeNode;
- cc.invoke(&invokeNode, f2Node->label(), FuncSignatureT<int, int, int>(CallConvId::kHost));
+ cc.invoke(&invokeNode, f2Node->label(), FuncSignature::build<int, int, int>());
invokeNode->setArg(0, a);
invokeNode->setArg(1, b);
invokeNode->setRet(0, a);
@@ -4170,7 +4365,7 @@ public:
result.assignFormat("ret=%d", resultRet);
expect.assignFormat("ret=%d", expectRet);
- return result.eq(expect);
+ return result == expect;
}
};
@@ -4195,7 +4390,7 @@ public:
x86::Gp b = cc.newIntPtr("b");
Label tramp = cc.newLabel();
- FuncNode* funcNode = cc.addFunc(FuncSignatureT<int, int, void*>(CallConvId::kFastCall));
+ FuncNode* funcNode = cc.addFunc(FuncSignature::build<int, int, void*>(CallConvId::kFastCall));
funcNode->setArg(0, a);
funcNode->setArg(1, b);
@@ -4223,7 +4418,7 @@ public:
result.assignFormat("ret={%d}", resultRet);
expect.assignFormat("ret={%d}", expectRet);
- return resultRet == expectRet;
+ return result == expect;
}
static void ASMJIT_FASTCALL handler() { longjmp(globalJmpBuf, 1); }
@@ -4236,6 +4431,7 @@ void compiler_add_x86_tests(TestApp& app) {
// Base tests.
app.addT<X86Test_NoCode>();
app.addT<X86Test_NoAlign>();
+ app.addT<X86Test_IndirectBranchProtection>();
app.addT<X86Test_AlignBase>();
// Jump tests.
@@ -4246,6 +4442,8 @@ void compiler_add_x86_tests(TestApp& app) {
app.addT<X86Test_JumpUnreachable2>();
app.addT<X86Test_JumpTable1>();
app.addT<X86Test_JumpTable2>();
+ app.addT<X86Test_JumpTable3>();
+ app.addT<X86Test_JumpTable4>();
// Alloc tests.
app.addT<X86Test_AllocBase>();
@@ -4268,7 +4466,9 @@ void compiler_add_x86_tests(TestApp& app) {
app.addT<X86Test_AllocArgsIntPtr>();
app.addT<X86Test_AllocArgsFloat>();
app.addT<X86Test_AllocArgsDouble>();
+#if ASMJIT_ARCH_X86
app.addT<X86Test_AllocArgsVec>();
+#endif
app.addT<X86Test_AllocRetFloat1>();
app.addT<X86Test_AllocRetFloat2>();
app.addT<X86Test_AllocRetDouble1>();
@@ -4278,12 +4478,17 @@ void compiler_add_x86_tests(TestApp& app) {
app.addT<X86Test_AllocExtraBlock>();
app.addT<X86Test_AllocAlphaBlend>();
+ // Function arguments handling tests.
+ app.addT<X86Test_FuncArgInt8>();
+
// Function call tests.
app.addT<X86Test_FuncCallBase1>();
app.addT<X86Test_FuncCallBase2>();
app.addT<X86Test_FuncCallStd>();
app.addT<X86Test_FuncCallFast>();
+#if ASMJIT_ARCH_X86
app.addT<X86Test_FuncCallSIMD>();
+#endif
app.addT<X86Test_FuncCallLight>();
app.addT<X86Test_FuncCallManyArgs>();
app.addT<X86Test_FuncCallDuplicateArgs>();
@@ -4314,4 +4519,4 @@ void compiler_add_x86_tests(TestApp& app) {
app.addT<X86Test_MiscUnfollow>();
}
-#endif // !ASMJIT_NO_X86 && ASMJIT_ARCH_X86
+#endif // !ASMJIT_NO_X86 && !ASMJIT_NO_COMPILER