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