Assembly.cpp 9.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206
  1. #include "pch.h"
  2. #include "Assembly.h"
  3. #include "CppUnitTest.h"
  4. using namespace Microsoft::VisualStudio::CppUnitTestFramework;
  5. namespace FrameworkTests
  6. {
  7. TEST_CLASS (AssemblyTests)
  8. {
  9. public:
  10. TEST_METHOD (Add8Test)
  11. {
  12. Framework::Assembly::AssemblyBlock codeBlock;
  13. codeBlock.addInstruction(
  14. new Framework::Assembly::Instruction(Framework::Assembly::MOV,
  15. {new Framework::Assembly::GPRegisterArgument(
  16. Framework::Assembly::RAX, Framework::Assembly::LOWER8),
  17. new Framework::Assembly::GPRegisterArgument(
  18. Framework::Assembly::RDX,
  19. Framework::Assembly::LOWER8)}));
  20. codeBlock.addInstruction(
  21. new Framework::Assembly::Instruction(Framework::Assembly::ADD,
  22. {new Framework::Assembly::GPRegisterArgument(
  23. Framework::Assembly::RAX, Framework::Assembly::LOWER8),
  24. new Framework::Assembly::GPRegisterArgument(
  25. Framework::Assembly::RCX,
  26. Framework::Assembly::LOWER8)}));
  27. char (*add)(char a, char b)
  28. = (char (*)(char, char))codeBlock.compile();
  29. char result = add(22, 15);
  30. char result2 = add(5, 6);
  31. Assert::AreEqual((char)37, result);
  32. Assert::AreEqual((char)11, result2);
  33. }
  34. TEST_METHOD (Add16Test)
  35. {
  36. Framework::Assembly::AssemblyBlock codeBlock;
  37. codeBlock.addInstruction(new Framework::Assembly::Instruction(
  38. Framework::Assembly::MOV,
  39. {new Framework::Assembly::GPRegisterArgument(
  40. Framework::Assembly::RAX, Framework::Assembly::LOWER16),
  41. new Framework::Assembly::GPRegisterArgument(
  42. Framework::Assembly::RDX,
  43. Framework::Assembly::LOWER16)}));
  44. codeBlock.addInstruction(new Framework::Assembly::Instruction(
  45. Framework::Assembly::ADD,
  46. {new Framework::Assembly::GPRegisterArgument(
  47. Framework::Assembly::RAX, Framework::Assembly::LOWER16),
  48. new Framework::Assembly::GPRegisterArgument(
  49. Framework::Assembly::RCX,
  50. Framework::Assembly::LOWER16)}));
  51. short (*add)(short a, short b)
  52. = (short (*)(short, short))codeBlock.compile();
  53. short result = add(22, 15);
  54. short result2 = add(5, 6);
  55. Assert::AreEqual((short)37, result);
  56. Assert::AreEqual((short)11, result2);
  57. }
  58. TEST_METHOD (Add32Test)
  59. {
  60. Framework::Assembly::AssemblyBlock codeBlock;
  61. codeBlock.addInstruction(new Framework::Assembly::Instruction(
  62. Framework::Assembly::MOV,
  63. {new Framework::Assembly::GPRegisterArgument(
  64. Framework::Assembly::RAX, Framework::Assembly::LOWER32),
  65. new Framework::Assembly::GPRegisterArgument(
  66. Framework::Assembly::RDX,
  67. Framework::Assembly::LOWER32)}));
  68. codeBlock.addInstruction(new Framework::Assembly::Instruction(
  69. Framework::Assembly::ADD,
  70. {new Framework::Assembly::GPRegisterArgument(
  71. Framework::Assembly::RAX, Framework::Assembly::LOWER32),
  72. new Framework::Assembly::GPRegisterArgument(
  73. Framework::Assembly::RCX,
  74. Framework::Assembly::LOWER32)}));
  75. int (*add)(int a, int b) = (int (*)(int, int))codeBlock.compile();
  76. int result = add(22, 15);
  77. int result2 = add(5, 6);
  78. Assert::AreEqual((int)37, result);
  79. Assert::AreEqual((int)11, result2);
  80. }
  81. TEST_METHOD (Add64Test)
  82. {
  83. Framework::Assembly::AssemblyBlock codeBlock;
  84. codeBlock.addInstruction(
  85. new Framework::Assembly::Instruction(Framework::Assembly::MOV,
  86. {new Framework::Assembly::GPRegisterArgument(
  87. Framework::Assembly::RAX),
  88. new Framework::Assembly::GPRegisterArgument(
  89. Framework::Assembly::RDX)}));
  90. codeBlock.addInstruction(
  91. new Framework::Assembly::Instruction(Framework::Assembly::ADD,
  92. {new Framework::Assembly::GPRegisterArgument(
  93. Framework::Assembly::RAX),
  94. new Framework::Assembly::GPRegisterArgument(
  95. Framework::Assembly::RCX)}));
  96. __int64 (*add)(__int64 a, __int64 b)
  97. = (__int64 (*)(__int64, __int64))codeBlock.compile();
  98. __int64 result = add(22, 15);
  99. __int64 result2 = add(5, 6);
  100. Assert::AreEqual((__int64)37, result);
  101. Assert::AreEqual((__int64)11, result2);
  102. }
  103. TEST_METHOD (AddFloatTest)
  104. {
  105. Framework::Assembly::AssemblyBlock codeBlock;
  106. codeBlock.addInstruction(
  107. new Framework::Assembly::Instruction(Framework::Assembly::ADDSS,
  108. {new Framework::Assembly::FPRegisterArgument(
  109. Framework::Assembly::MM0,
  110. Framework::Assembly::FPRegisterPart::X),
  111. new Framework::Assembly::FPRegisterArgument(
  112. Framework::Assembly::MM1,
  113. Framework::Assembly::FPRegisterPart::X)}));
  114. float (*add)(float a, float b)
  115. = (float (*)(float, float))codeBlock.compile();
  116. float result = add(4.24f, 8.54f);
  117. float result2 = add(0.3f, 7.6f);
  118. Assert::AreEqual((float)(4.24f + 8.54f), result);
  119. Assert::AreEqual((float)(0.3f + 7.6f), result2);
  120. }
  121. TEST_METHOD (AddDoubleTest)
  122. {
  123. Framework::Assembly::AssemblyBlock codeBlock;
  124. codeBlock.addInstruction(
  125. new Framework::Assembly::Instruction(Framework::Assembly::ADDSD,
  126. {new Framework::Assembly::FPRegisterArgument(
  127. Framework::Assembly::MM0,
  128. Framework::Assembly::FPRegisterPart::X),
  129. new Framework::Assembly::FPRegisterArgument(
  130. Framework::Assembly::MM1,
  131. Framework::Assembly::FPRegisterPart::X)}));
  132. double (*add)(double a, double b)
  133. = (double (*)(double, double))codeBlock.compile();
  134. double result = add(4.24, 8.54);
  135. double result2 = add(0.3, 7.6);
  136. Assert::AreEqual(4.24 + 8.54, result);
  137. Assert::AreEqual(0.3 + 7.6, result2);
  138. }
  139. TEST_METHOD (returnRefTest)
  140. {
  141. char cRef = 1;
  142. short sRef = 2;
  143. int iRef = 3;
  144. __int64 lRef = 4;
  145. float fRef = 5.0f;
  146. double dRef = 6.0;
  147. Framework::Assembly::AssemblyBlock ccodeBlock;
  148. ccodeBlock.addLoadValue(&cRef, Framework::Assembly::RAX);
  149. char (*getc)() = (char (*)())ccodeBlock.compile();
  150. char cresult = getc();
  151. Assert::AreEqual((char)1, cresult);
  152. cRef = 11;
  153. cresult = getc();
  154. Assert::AreEqual((char)11, cresult);
  155. Framework::Assembly::AssemblyBlock scodeBlock;
  156. scodeBlock.addLoadValue(&sRef, Framework::Assembly::RAX);
  157. short (*gets)() = (short (*)())scodeBlock.compile();
  158. short sresult = gets();
  159. Assert::AreEqual((short)2, sresult);
  160. sRef = 22;
  161. sresult = gets();
  162. Assert::AreEqual((short)22, sresult);
  163. Framework::Assembly::AssemblyBlock icodeBlock;
  164. icodeBlock.addLoadValue(&iRef, Framework::Assembly::RAX);
  165. int (*geti)() = (int (*)())icodeBlock.compile();
  166. int iresult = geti();
  167. Assert::AreEqual((int)3, iresult);
  168. iRef = 33;
  169. iresult = geti();
  170. Assert::AreEqual((int)33, iresult);
  171. Framework::Assembly::AssemblyBlock lcodeBlock;
  172. lcodeBlock.addLoadValue(&lRef, Framework::Assembly::RAX);
  173. __int64 (*getl)() = (__int64 (*)())lcodeBlock.compile();
  174. __int64 lresult = getl();
  175. Assert::AreEqual((__int64)4, lresult);
  176. lRef = 44;
  177. lresult = getl();
  178. Assert::AreEqual((__int64)44, lresult);
  179. Framework::Assembly::AssemblyBlock fcodeBlock;
  180. fcodeBlock.addLoadValue(&fRef, Framework::Assembly::MM0);
  181. float (*getf)() = (float (*)())fcodeBlock.compile();
  182. float fresult = getf();
  183. Assert::AreEqual((float)5.0f, fresult);
  184. fRef = 55.0f;
  185. fresult = getf();
  186. Assert::AreEqual((float)55.0f, fresult);
  187. Framework::Assembly::AssemblyBlock dcodeBlock;
  188. dcodeBlock.addLoadValue(&dRef, Framework::Assembly::MM0);
  189. double (*getd)() = (double (*)())dcodeBlock.compile();
  190. double dresult = getd();
  191. Assert::AreEqual((double)6.0, dresult);
  192. dRef = 66.0;
  193. dresult = getd();
  194. Assert::AreEqual((double)66.0, dresult);
  195. }
  196. };
  197. } // namespace FrameworkTests