28 #include <gtest/gtest.h> 30 #include <type_traits> 52 0, 1, 2, 3, 4, 5, 6, 7
55 10.0, 11.0, 12.0, 13.0, 14.0, 15.0, 16.0, 17.0
103 return tc->
ints[state++];
107 template <
typename Arg>
109 typename
std::enable_if<std::is_floating_point<Arg>::value>
::type>
114 return tc->
floats[state++];
128 template <
typename Ret>
130 typename
std::enable_if<std::is_floating_point<Ret>::value>
::type>
148 return tc->
ints[--state];
158 template <
typename Ret>
178 return tc->
ints[state.first++];
182 template <
typename Arg>
184 typename
std::enable_if<std::is_floating_point<Arg>::value>
::type>
189 return tc->
floats[state.second++];
203 template <
typename Ret>
205 typename
std::enable_if<std::is_floating_point<Ret>::value>
::type>
221 return tc->
ints[state.pos++];
298 EXPECT_EQ(tc.intResult, tc.DefaultIntResult);
299 EXPECT_EQ(tc.floatResult, tc.DefaultFloatResult);
313 EXPECT_EQ(tc.intResult, tc.DefaultIntResult);
314 EXPECT_EQ(tc.floatResult, tc.DefaultFloatResult);
321 invokeSimcall<TestABI_TcInit>(&tc,
testTcInit);
329 int ret = invokeSimcall<TestABI_1D>(&tc,
testIntRet);
332 EXPECT_EQ(tc.floatResult, tc.DefaultFloatResult);
336 float ret = invokeSimcall<TestABI_1D>(&tc,
testFloatRet);
338 EXPECT_EQ(tc.intResult, tc.DefaultIntResult);
345 EXPECT_EQ(tc.intResult, tc.DefaultIntResult);
351 int ret = invokeSimcall<TestABI_1D, false>(&tc,
testIntRet);
353 EXPECT_EQ(tc.intResult, tc.DefaultIntResult);
354 EXPECT_EQ(tc.floatResult, tc.DefaultFloatResult);
361 int ret = invokeSimcall<TestABI_2D>(&tc,
testIntRet);
364 EXPECT_EQ(tc.floatResult, tc.DefaultFloatResult);
368 float ret = invokeSimcall<TestABI_2D>(&tc,
testFloatRet);
370 EXPECT_EQ(tc.intResult, tc.DefaultIntResult);
377 EXPECT_EQ(tc.intResult, tc.DefaultIntResult);
386 EXPECT_EQ(dump,
"test(0, 11, 2, 13, ...)");
std::string dumpSimcall(std::string name, ThreadContext *tc, std::function< Ret(ThreadContext *, Args...)> target=std::function< Ret(ThreadContext *, Args...)>())
void testTcInit(ThreadContext *tc, int a)
static void store(ThreadContext *tc, const Ret &ret)
const float FloatRetValue
static const double floats[]
void test2DVoid(ThreadContext *tc, int a, float b, int c, double d, GuestABI::VarArgs< int, float, double > varargs)
static void store(ThreadContext *tc, const Ret &ret)
static const double DefaultFloatResult
Overload hash function for BasicBlockRange type.
ThreadContext is the external interface to all thread state for anything outside of the CPU...
static const int DefaultIntResult
static void store(ThreadContext *tc, const int &ret)
TEST(GuestABI, ABI_1D_args)
static void prepare(ThreadContext *tc, TestABI_Prepare::State &state)
#define EXPECT_TRUE(expr)
A macro which verifies that expr evaluates to true.
int testPrepareInt(ThreadContext *tc, int a, int b)
static void prepare(ThreadContext *tc, TestABI_Prepare::State &state)
State(const ThreadContext *tc)
void testIntVoid(ThreadContext *tc, int a, float b, int c, double d, GuestABI::VarArgs< int, float, double > varargs)
static void store(ThreadContext *tc, const Ret &ret)
#define EXPECT_FALSE(expr)
A macro which verifies that expr evaluates to false.
void testPrepareVoid(ThreadContext *tc, int a, int b)
const double DoubleRetValue
float testFloatRet(ThreadContext *tc)
void dump()
Dump all statistics data to the registered outputs.
static void store(ThreadContext *tc, const int &ret)
double testDoubleRet(ThreadContext *tc)
int testIntRet(ThreadContext *tc)
#define EXPECT_EQ(lhs, rhs)
A macro which verifies that lhs and rhs are equal to each other.