1 #include "Cmp64Test.h"
2 #include "MemStream.h"
3
CCmp64Test(bool useConstant0,bool useConstant1,uint64 value0,uint64 value1)4 CCmp64Test::CCmp64Test(bool useConstant0, bool useConstant1, uint64 value0, uint64 value1)
5 : m_useConstant0(useConstant0)
6 , m_useConstant1(useConstant1)
7 , m_value0(value0)
8 , m_value1(value1)
9 {
10
11 }
12
Run()13 void CCmp64Test::Run()
14 {
15 memset(&m_context, 0, sizeof(m_context));
16
17 m_context.value0 = m_value0;
18 m_context.value1 = m_value1;
19
20 m_function(&m_context);
21
22 uint32 resultEq = (m_value0 == m_value1) ? 1 : 0;
23 uint32 resultNe = (m_value0 != m_value1) ? 1 : 0;
24 uint32 resultBl = static_cast<uint64>(m_value0) < static_cast<uint64>(m_value1) ? 1 : 0;
25 uint32 resultLt = static_cast<int64>(m_value0) < static_cast<int64>(m_value1) ? 1 : 0;
26 uint32 resultLe = static_cast<int64>(m_value0) <= static_cast<int64>(m_value1) ? 1 : 0;
27 uint32 resultAb = static_cast<uint64>(m_value0) > static_cast<uint64>(m_value1) ? 1 : 0;
28 uint32 resultGt = static_cast<int64>(m_value0) > static_cast<int64>(m_value1) ? 1 : 0;
29
30 TEST_VERIFY(m_context.resultEq == resultEq);
31 TEST_VERIFY(m_context.resultNe == resultNe);
32 TEST_VERIFY(m_context.resultBl == resultBl);
33 TEST_VERIFY(m_context.resultLt == resultLt);
34 TEST_VERIFY(m_context.resultLe == resultLe);
35 TEST_VERIFY(m_context.resultAb == resultAb);
36 TEST_VERIFY(m_context.resultGt == resultGt);
37 }
38
Compile(Jitter::CJitter & jitter)39 void CCmp64Test::Compile(Jitter::CJitter& jitter)
40 {
41 Framework::CMemStream codeStream;
42 jitter.SetStream(&codeStream);
43
44 auto emitTest =
45 [&](Jitter::CONDITION condition, size_t output)
46 {
47 m_useConstant0 ? jitter.PushCst64(m_value0) : jitter.PushRel64(offsetof(CONTEXT, value0));
48 m_useConstant1 ? jitter.PushCst64(m_value1) : jitter.PushRel64(offsetof(CONTEXT, value1));
49 jitter.Cmp64(condition);
50 jitter.PullRel(output);
51 };
52
53 jitter.Begin();
54 {
55 emitTest(Jitter::CONDITION_EQ, offsetof(CONTEXT, resultEq));
56 emitTest(Jitter::CONDITION_NE, offsetof(CONTEXT, resultNe));
57 emitTest(Jitter::CONDITION_BL, offsetof(CONTEXT, resultBl));
58 emitTest(Jitter::CONDITION_LT, offsetof(CONTEXT, resultLt));
59 emitTest(Jitter::CONDITION_LE, offsetof(CONTEXT, resultLe));
60 emitTest(Jitter::CONDITION_AB, offsetof(CONTEXT, resultAb));
61 emitTest(Jitter::CONDITION_GT, offsetof(CONTEXT, resultGt));
62 }
63 jitter.End();
64
65 m_function = CMemoryFunction(codeStream.GetBuffer(), codeStream.GetSize());
66 }
67