CpuTestAluRs.cs 86 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911
  1. //#define AluRs
  2. using ChocolArm64.State;
  3. using NUnit.Framework;
  4. namespace Ryujinx.Tests.Cpu
  5. {
  6. using Tester;
  7. using Tester.Types;
  8. [Category("AluRs"), Ignore("Tested: first half of 2018.")]
  9. public sealed class CpuTestAluRs : CpuTest
  10. {
  11. #if AluRs
  12. [SetUp]
  13. public void SetupTester()
  14. {
  15. AArch64.TakeReset(false);
  16. }
  17. [Test, Description("ADC <Xd>, <Xn>, <Xm>")]
  18. public void Adc_64bit([Values(0u, 31u)] uint Rd,
  19. [Values(1u, 31u)] uint Rn,
  20. [Values(2u, 31u)] uint Rm,
  21. [Values(0x0000000000000000ul, 0x7FFFFFFFFFFFFFFFul,
  22. 0x8000000000000000ul, 0xFFFFFFFFFFFFFFFFul)] [Random(4)] ulong Xn,
  23. [Values(0x0000000000000000ul, 0x7FFFFFFFFFFFFFFFul,
  24. 0x8000000000000000ul, 0xFFFFFFFFFFFFFFFFul)] [Random(4)] ulong Xm,
  25. [Values] bool CarryIn)
  26. {
  27. uint Opcode = 0x9A000000; // ADC X0, X0, X0
  28. Opcode |= ((Rm & 31) << 16) | ((Rn & 31) << 5) | ((Rd & 31) << 0);
  29. ulong _X31 = TestContext.CurrentContext.Random.NextULong();
  30. AThreadState ThreadState = SingleOpcode(Opcode, X1: Xn, X2: Xm, X31: _X31, Carry: CarryIn);
  31. if (Rd != 31)
  32. {
  33. Bits Op = new Bits(Opcode);
  34. AArch64.X((int)Rn, new Bits(Xn));
  35. AArch64.X((int)Rm, new Bits(Xm));
  36. Shared.PSTATE.C = CarryIn;
  37. Base.Adc(Op[31], Op[20, 16], Op[9, 5], Op[4, 0]);
  38. ulong Xd = AArch64.X(64, (int)Rd).ToUInt64();
  39. Assert.That((ulong)ThreadState.X0, Is.EqualTo(Xd));
  40. }
  41. else
  42. {
  43. Assert.That((ulong)ThreadState.X31, Is.EqualTo(_X31));
  44. }
  45. }
  46. [Test, Description("ADC <Wd>, <Wn>, <Wm>")]
  47. public void Adc_32bit([Values(0u, 31u)] uint Rd,
  48. [Values(1u, 31u)] uint Rn,
  49. [Values(2u, 31u)] uint Rm,
  50. [Values(0x00000000u, 0x7FFFFFFFu,
  51. 0x80000000u, 0xFFFFFFFFu)] [Random(4)] uint Wn,
  52. [Values(0x00000000u, 0x7FFFFFFFu,
  53. 0x80000000u, 0xFFFFFFFFu)] [Random(4)] uint Wm,
  54. [Values] bool CarryIn)
  55. {
  56. uint Opcode = 0x1A000000; // ADC W0, W0, W0
  57. Opcode |= ((Rm & 31) << 16) | ((Rn & 31) << 5) | ((Rd & 31) << 0);
  58. uint _W31 = TestContext.CurrentContext.Random.NextUInt();
  59. AThreadState ThreadState = SingleOpcode(Opcode, X1: Wn, X2: Wm, X31: _W31, Carry: CarryIn);
  60. if (Rd != 31)
  61. {
  62. Bits Op = new Bits(Opcode);
  63. AArch64.X((int)Rn, new Bits(Wn));
  64. AArch64.X((int)Rm, new Bits(Wm));
  65. Shared.PSTATE.C = CarryIn;
  66. Base.Adc(Op[31], Op[20, 16], Op[9, 5], Op[4, 0]);
  67. uint Wd = AArch64.X(32, (int)Rd).ToUInt32();
  68. Assert.That((uint)ThreadState.X0, Is.EqualTo(Wd));
  69. }
  70. else
  71. {
  72. Assert.That((uint)ThreadState.X31, Is.EqualTo(_W31));
  73. }
  74. }
  75. [Test, Description("ADCS <Xd>, <Xn>, <Xm>")]
  76. public void Adcs_64bit([Values(0u, 31u)] uint Rd,
  77. [Values(1u, 31u)] uint Rn,
  78. [Values(2u, 31u)] uint Rm,
  79. [Values(0x0000000000000000ul, 0x7FFFFFFFFFFFFFFFul,
  80. 0x8000000000000000ul, 0xFFFFFFFFFFFFFFFFul)] [Random(4)] ulong Xn,
  81. [Values(0x0000000000000000ul, 0x7FFFFFFFFFFFFFFFul,
  82. 0x8000000000000000ul, 0xFFFFFFFFFFFFFFFFul)] [Random(4)] ulong Xm,
  83. [Values] bool CarryIn)
  84. {
  85. uint Opcode = 0xBA000000; // ADCS X0, X0, X0
  86. Opcode |= ((Rm & 31) << 16) | ((Rn & 31) << 5) | ((Rd & 31) << 0);
  87. Bits Op = new Bits(Opcode);
  88. ulong _X31 = TestContext.CurrentContext.Random.NextULong();
  89. AThreadState ThreadState = SingleOpcode(Opcode, X1: Xn, X2: Xm, X31: _X31, Carry: CarryIn);
  90. AArch64.X((int)Rn, new Bits(Xn));
  91. AArch64.X((int)Rm, new Bits(Xm));
  92. Shared.PSTATE.C = CarryIn;
  93. Base.Adcs(Op[31], Op[20, 16], Op[9, 5], Op[4, 0]);
  94. ulong Xd = AArch64.X(64, (int)Rd).ToUInt64();
  95. if (Rd != 31)
  96. {
  97. Assert.That((ulong)ThreadState.X0, Is.EqualTo(Xd));
  98. }
  99. else
  100. {
  101. Assert.That((ulong)ThreadState.X31, Is.EqualTo(_X31));
  102. }
  103. Assert.Multiple(() =>
  104. {
  105. Assert.That(ThreadState.Negative, Is.EqualTo(Shared.PSTATE.N));
  106. Assert.That(ThreadState.Zero, Is.EqualTo(Shared.PSTATE.Z));
  107. Assert.That(ThreadState.Carry, Is.EqualTo(Shared.PSTATE.C));
  108. Assert.That(ThreadState.Overflow, Is.EqualTo(Shared.PSTATE.V));
  109. });
  110. }
  111. [Test, Description("ADCS <Wd>, <Wn>, <Wm>")]
  112. public void Adcs_32bit([Values(0u, 31u)] uint Rd,
  113. [Values(1u, 31u)] uint Rn,
  114. [Values(2u, 31u)] uint Rm,
  115. [Values(0x00000000u, 0x7FFFFFFFu,
  116. 0x80000000u, 0xFFFFFFFFu)] [Random(4)] uint Wn,
  117. [Values(0x00000000u, 0x7FFFFFFFu,
  118. 0x80000000u, 0xFFFFFFFFu)] [Random(4)] uint Wm,
  119. [Values] bool CarryIn)
  120. {
  121. uint Opcode = 0x3A000000; // ADCS W0, W0, W0
  122. Opcode |= ((Rm & 31) << 16) | ((Rn & 31) << 5) | ((Rd & 31) << 0);
  123. Bits Op = new Bits(Opcode);
  124. uint _W31 = TestContext.CurrentContext.Random.NextUInt();
  125. AThreadState ThreadState = SingleOpcode(Opcode, X1: Wn, X2: Wm, X31: _W31, Carry: CarryIn);
  126. AArch64.X((int)Rn, new Bits(Wn));
  127. AArch64.X((int)Rm, new Bits(Wm));
  128. Shared.PSTATE.C = CarryIn;
  129. Base.Adcs(Op[31], Op[20, 16], Op[9, 5], Op[4, 0]);
  130. uint Wd = AArch64.X(32, (int)Rd).ToUInt32();
  131. if (Rd != 31)
  132. {
  133. Assert.That((uint)ThreadState.X0, Is.EqualTo(Wd));
  134. }
  135. else
  136. {
  137. Assert.That((uint)ThreadState.X31, Is.EqualTo(_W31));
  138. }
  139. Assert.Multiple(() =>
  140. {
  141. Assert.That(ThreadState.Negative, Is.EqualTo(Shared.PSTATE.N));
  142. Assert.That(ThreadState.Zero, Is.EqualTo(Shared.PSTATE.Z));
  143. Assert.That(ThreadState.Carry, Is.EqualTo(Shared.PSTATE.C));
  144. Assert.That(ThreadState.Overflow, Is.EqualTo(Shared.PSTATE.V));
  145. });
  146. }
  147. [Test, Description("ADD <Xd>, <Xn>, <Xm>{, <shift> #<amount>}")]
  148. public void Add_64bit([Values(0u, 31u)] uint Rd,
  149. [Values(1u, 31u)] uint Rn,
  150. [Values(2u, 31u)] uint Rm,
  151. [Values(0x0000000000000000ul, 0x7FFFFFFFFFFFFFFFul,
  152. 0x8000000000000000ul, 0xFFFFFFFFFFFFFFFFul)] [Random(1)] ulong Xn,
  153. [Values(0x0000000000000000ul, 0x7FFFFFFFFFFFFFFFul,
  154. 0x8000000000000000ul, 0xFFFFFFFFFFFFFFFFul)] [Random(1)] ulong Xm,
  155. [Values(0b00u, 0b01u, 0b10u)] uint shift, // <LSL, LSR, ASR>
  156. [Values(0u, 31u, 32u, 63u)] [Random(0u, 63u, 1)] uint amount)
  157. {
  158. uint Opcode = 0x8B000000; // ADD X0, X0, X0, LSL #0
  159. Opcode |= ((Rm & 31) << 16) | ((Rn & 31) << 5) | ((Rd & 31) << 0);
  160. Opcode |= ((shift & 3) << 22) | ((amount & 63) << 10);
  161. ulong _X31 = TestContext.CurrentContext.Random.NextULong();
  162. AThreadState ThreadState = SingleOpcode(Opcode, X1: Xn, X2: Xm, X31: _X31);
  163. if (Rd != 31)
  164. {
  165. Bits Op = new Bits(Opcode);
  166. AArch64.X((int)Rn, new Bits(Xn));
  167. AArch64.X((int)Rm, new Bits(Xm));
  168. Base.Add_Rs(Op[31], Op[23, 22], Op[20, 16], Op[15, 10], Op[9, 5], Op[4, 0]);
  169. ulong Xd = AArch64.X(64, (int)Rd).ToUInt64();
  170. Assert.That((ulong)ThreadState.X0, Is.EqualTo(Xd));
  171. }
  172. else
  173. {
  174. Assert.That((ulong)ThreadState.X31, Is.EqualTo(_X31));
  175. }
  176. }
  177. [Test, Description("ADD <Wd>, <Wn>, <Wm>{, <shift> #<amount>}")]
  178. public void Add_32bit([Values(0u, 31u)] uint Rd,
  179. [Values(1u, 31u)] uint Rn,
  180. [Values(2u, 31u)] uint Rm,
  181. [Values(0x00000000u, 0x7FFFFFFFu,
  182. 0x80000000u, 0xFFFFFFFFu)] [Random(1)] uint Wn,
  183. [Values(0x00000000u, 0x7FFFFFFFu,
  184. 0x80000000u, 0xFFFFFFFFu)] [Random(1)] uint Wm,
  185. [Values(0b00u, 0b01u, 0b10u)] uint shift, // <LSL, LSR, ASR>
  186. [Values(0u, 15u, 16u, 31u)] [Random(0u, 31u, 1)] uint amount)
  187. {
  188. uint Opcode = 0x0B000000; // ADD W0, W0, W0, LSL #0
  189. Opcode |= ((Rm & 31) << 16) | ((Rn & 31) << 5) | ((Rd & 31) << 0);
  190. Opcode |= ((shift & 3) << 22) | ((amount & 63) << 10);
  191. uint _W31 = TestContext.CurrentContext.Random.NextUInt();
  192. AThreadState ThreadState = SingleOpcode(Opcode, X1: Wn, X2: Wm, X31: _W31);
  193. if (Rd != 31)
  194. {
  195. Bits Op = new Bits(Opcode);
  196. AArch64.X((int)Rn, new Bits(Wn));
  197. AArch64.X((int)Rm, new Bits(Wm));
  198. Base.Add_Rs(Op[31], Op[23, 22], Op[20, 16], Op[15, 10], Op[9, 5], Op[4, 0]);
  199. uint Wd = AArch64.X(32, (int)Rd).ToUInt32();
  200. Assert.That((uint)ThreadState.X0, Is.EqualTo(Wd));
  201. }
  202. else
  203. {
  204. Assert.That((uint)ThreadState.X31, Is.EqualTo(_W31));
  205. }
  206. }
  207. [Test, Description("ADDS <Xd>, <Xn>, <Xm>{, <shift> #<amount>}")]
  208. public void Adds_64bit([Values(0u, 31u)] uint Rd,
  209. [Values(1u, 31u)] uint Rn,
  210. [Values(2u, 31u)] uint Rm,
  211. [Values(0x0000000000000000ul, 0x7FFFFFFFFFFFFFFFul,
  212. 0x8000000000000000ul, 0xFFFFFFFFFFFFFFFFul)] [Random(1)] ulong Xn,
  213. [Values(0x0000000000000000ul, 0x7FFFFFFFFFFFFFFFul,
  214. 0x8000000000000000ul, 0xFFFFFFFFFFFFFFFFul)] [Random(1)] ulong Xm,
  215. [Values(0b00u, 0b01u, 0b10u)] uint shift, // <LSL, LSR, ASR>
  216. [Values(0u, 31u, 32u, 63u)] [Random(0u, 63u, 1)] uint amount)
  217. {
  218. uint Opcode = 0xAB000000; // ADDS X0, X0, X0, LSL #0
  219. Opcode |= ((Rm & 31) << 16) | ((Rn & 31) << 5) | ((Rd & 31) << 0);
  220. Opcode |= ((shift & 3) << 22) | ((amount & 63) << 10);
  221. Bits Op = new Bits(Opcode);
  222. ulong _X31 = TestContext.CurrentContext.Random.NextULong();
  223. AThreadState ThreadState = SingleOpcode(Opcode, X1: Xn, X2: Xm, X31: _X31);
  224. AArch64.X((int)Rn, new Bits(Xn));
  225. AArch64.X((int)Rm, new Bits(Xm));
  226. Base.Adds_Rs(Op[31], Op[23, 22], Op[20, 16], Op[15, 10], Op[9, 5], Op[4, 0]);
  227. ulong Xd = AArch64.X(64, (int)Rd).ToUInt64();
  228. if (Rd != 31)
  229. {
  230. Assert.That((ulong)ThreadState.X0, Is.EqualTo(Xd));
  231. }
  232. else
  233. {
  234. Assert.That((ulong)ThreadState.X31, Is.EqualTo(_X31));
  235. }
  236. Assert.Multiple(() =>
  237. {
  238. Assert.That(ThreadState.Negative, Is.EqualTo(Shared.PSTATE.N));
  239. Assert.That(ThreadState.Zero, Is.EqualTo(Shared.PSTATE.Z));
  240. Assert.That(ThreadState.Carry, Is.EqualTo(Shared.PSTATE.C));
  241. Assert.That(ThreadState.Overflow, Is.EqualTo(Shared.PSTATE.V));
  242. });
  243. }
  244. [Test, Description("ADDS <Wd>, <Wn>, <Wm>{, <shift> #<amount>}")]
  245. public void Adds_32bit([Values(0u, 31u)] uint Rd,
  246. [Values(1u, 31u)] uint Rn,
  247. [Values(2u, 31u)] uint Rm,
  248. [Values(0x00000000u, 0x7FFFFFFFu,
  249. 0x80000000u, 0xFFFFFFFFu)] [Random(1)] uint Wn,
  250. [Values(0x00000000u, 0x7FFFFFFFu,
  251. 0x80000000u, 0xFFFFFFFFu)] [Random(1)] uint Wm,
  252. [Values(0b00u, 0b01u, 0b10u)] uint shift, // <LSL, LSR, ASR>
  253. [Values(0u, 15u, 16u, 31u)] [Random(0u, 31u, 1)] uint amount)
  254. {
  255. uint Opcode = 0x2B000000; // ADDS W0, W0, W0, LSL #0
  256. Opcode |= ((Rm & 31) << 16) | ((Rn & 31) << 5) | ((Rd & 31) << 0);
  257. Opcode |= ((shift & 3) << 22) | ((amount & 63) << 10);
  258. Bits Op = new Bits(Opcode);
  259. uint _W31 = TestContext.CurrentContext.Random.NextUInt();
  260. AThreadState ThreadState = SingleOpcode(Opcode, X1: Wn, X2: Wm, X31: _W31);
  261. AArch64.X((int)Rn, new Bits(Wn));
  262. AArch64.X((int)Rm, new Bits(Wm));
  263. Base.Adds_Rs(Op[31], Op[23, 22], Op[20, 16], Op[15, 10], Op[9, 5], Op[4, 0]);
  264. uint Wd = AArch64.X(32, (int)Rd).ToUInt32();
  265. if (Rd != 31)
  266. {
  267. Assert.That((uint)ThreadState.X0, Is.EqualTo(Wd));
  268. }
  269. else
  270. {
  271. Assert.That((uint)ThreadState.X31, Is.EqualTo(_W31));
  272. }
  273. Assert.Multiple(() =>
  274. {
  275. Assert.That(ThreadState.Negative, Is.EqualTo(Shared.PSTATE.N));
  276. Assert.That(ThreadState.Zero, Is.EqualTo(Shared.PSTATE.Z));
  277. Assert.That(ThreadState.Carry, Is.EqualTo(Shared.PSTATE.C));
  278. Assert.That(ThreadState.Overflow, Is.EqualTo(Shared.PSTATE.V));
  279. });
  280. }
  281. [Test, Description("AND <Xd>, <Xn>, <Xm>{, <shift> #<amount>}")]
  282. public void And_64bit([Values(0u, 31u)] uint Rd,
  283. [Values(1u, 31u)] uint Rn,
  284. [Values(2u, 31u)] uint Rm,
  285. [Values(0x0000000000000000ul, 0x7FFFFFFFFFFFFFFFul,
  286. 0x8000000000000000ul, 0xFFFFFFFFFFFFFFFFul)] [Random(1)] ulong Xn,
  287. [Values(0x0000000000000000ul, 0x7FFFFFFFFFFFFFFFul,
  288. 0x8000000000000000ul, 0xFFFFFFFFFFFFFFFFul)] [Random(1)] ulong Xm,
  289. [Values(0b00u, 0b01u, 0b10u, 0b11u)] uint shift, // <LSL, LSR, ASR, ROR>
  290. [Values(0u, 31u, 32u, 63u)] [Random(0u, 63u, 1)] uint amount)
  291. {
  292. uint Opcode = 0x8A000000; // AND X0, X0, X0, LSL #0
  293. Opcode |= ((Rm & 31) << 16) | ((Rn & 31) << 5) | ((Rd & 31) << 0);
  294. Opcode |= ((shift & 3) << 22) | ((amount & 63) << 10);
  295. ulong _X31 = TestContext.CurrentContext.Random.NextULong();
  296. AThreadState ThreadState = SingleOpcode(Opcode, X1: Xn, X2: Xm, X31: _X31);
  297. if (Rd != 31)
  298. {
  299. Bits Op = new Bits(Opcode);
  300. AArch64.X((int)Rn, new Bits(Xn));
  301. AArch64.X((int)Rm, new Bits(Xm));
  302. Base.And_Rs(Op[31], Op[23, 22], Op[20, 16], Op[15, 10], Op[9, 5], Op[4, 0]);
  303. ulong Xd = AArch64.X(64, (int)Rd).ToUInt64();
  304. Assert.That((ulong)ThreadState.X0, Is.EqualTo(Xd));
  305. }
  306. else
  307. {
  308. Assert.That((ulong)ThreadState.X31, Is.EqualTo(_X31));
  309. }
  310. }
  311. [Test, Description("AND <Wd>, <Wn>, <Wm>{, <shift> #<amount>}")]
  312. public void And_32bit([Values(0u, 31u)] uint Rd,
  313. [Values(1u, 31u)] uint Rn,
  314. [Values(2u, 31u)] uint Rm,
  315. [Values(0x00000000u, 0x7FFFFFFFu,
  316. 0x80000000u, 0xFFFFFFFFu)] [Random(1)] uint Wn,
  317. [Values(0x00000000u, 0x7FFFFFFFu,
  318. 0x80000000u, 0xFFFFFFFFu)] [Random(1)] uint Wm,
  319. [Values(0b00u, 0b01u, 0b10u, 0b11u)] uint shift, // <LSL, LSR, ASR, ROR>
  320. [Values(0u, 15u, 16u, 31u)] [Random(0u, 31u, 1)] uint amount)
  321. {
  322. uint Opcode = 0x0A000000; // AND W0, W0, W0, LSL #0
  323. Opcode |= ((Rm & 31) << 16) | ((Rn & 31) << 5) | ((Rd & 31) << 0);
  324. Opcode |= ((shift & 3) << 22) | ((amount & 63) << 10);
  325. uint _W31 = TestContext.CurrentContext.Random.NextUInt();
  326. AThreadState ThreadState = SingleOpcode(Opcode, X1: Wn, X2: Wm, X31: _W31);
  327. if (Rd != 31)
  328. {
  329. Bits Op = new Bits(Opcode);
  330. AArch64.X((int)Rn, new Bits(Wn));
  331. AArch64.X((int)Rm, new Bits(Wm));
  332. Base.And_Rs(Op[31], Op[23, 22], Op[20, 16], Op[15, 10], Op[9, 5], Op[4, 0]);
  333. uint Wd = AArch64.X(32, (int)Rd).ToUInt32();
  334. Assert.That((uint)ThreadState.X0, Is.EqualTo(Wd));
  335. }
  336. else
  337. {
  338. Assert.That((uint)ThreadState.X31, Is.EqualTo(_W31));
  339. }
  340. }
  341. [Test, Description("ANDS <Xd>, <Xn>, <Xm>{, <shift> #<amount>}")]
  342. public void Ands_64bit([Values(0u, 31u)] uint Rd,
  343. [Values(1u, 31u)] uint Rn,
  344. [Values(2u, 31u)] uint Rm,
  345. [Values(0x0000000000000000ul, 0x7FFFFFFFFFFFFFFFul,
  346. 0x8000000000000000ul, 0xFFFFFFFFFFFFFFFFul)] [Random(1)] ulong Xn,
  347. [Values(0x0000000000000000ul, 0x7FFFFFFFFFFFFFFFul,
  348. 0x8000000000000000ul, 0xFFFFFFFFFFFFFFFFul)] [Random(1)] ulong Xm,
  349. [Values(0b00u, 0b01u, 0b10u, 0b11u)] uint shift, // <LSL, LSR, ASR, ROR>
  350. [Values(0u, 31u, 32u, 63u)] [Random(0u, 63u, 1)] uint amount)
  351. {
  352. uint Opcode = 0xEA000000; // ANDS X0, X0, X0, LSL #0
  353. Opcode |= ((Rm & 31) << 16) | ((Rn & 31) << 5) | ((Rd & 31) << 0);
  354. Opcode |= ((shift & 3) << 22) | ((amount & 63) << 10);
  355. Bits Op = new Bits(Opcode);
  356. ulong _X31 = TestContext.CurrentContext.Random.NextULong();
  357. AThreadState ThreadState = SingleOpcode(Opcode, X1: Xn, X2: Xm, X31: _X31);
  358. AArch64.X((int)Rn, new Bits(Xn));
  359. AArch64.X((int)Rm, new Bits(Xm));
  360. Base.Ands_Rs(Op[31], Op[23, 22], Op[20, 16], Op[15, 10], Op[9, 5], Op[4, 0]);
  361. ulong Xd = AArch64.X(64, (int)Rd).ToUInt64();
  362. if (Rd != 31)
  363. {
  364. Assert.That((ulong)ThreadState.X0, Is.EqualTo(Xd));
  365. }
  366. else
  367. {
  368. Assert.That((ulong)ThreadState.X31, Is.EqualTo(_X31));
  369. }
  370. Assert.Multiple(() =>
  371. {
  372. Assert.That(ThreadState.Negative, Is.EqualTo(Shared.PSTATE.N));
  373. Assert.That(ThreadState.Zero, Is.EqualTo(Shared.PSTATE.Z));
  374. Assert.That(ThreadState.Carry, Is.EqualTo(Shared.PSTATE.C));
  375. Assert.That(ThreadState.Overflow, Is.EqualTo(Shared.PSTATE.V));
  376. });
  377. }
  378. [Test, Description("ANDS <Wd>, <Wn>, <Wm>{, <shift> #<amount>}")]
  379. public void Ands_32bit([Values(0u, 31u)] uint Rd,
  380. [Values(1u, 31u)] uint Rn,
  381. [Values(2u, 31u)] uint Rm,
  382. [Values(0x00000000u, 0x7FFFFFFFu,
  383. 0x80000000u, 0xFFFFFFFFu)] [Random(1)] uint Wn,
  384. [Values(0x00000000u, 0x7FFFFFFFu,
  385. 0x80000000u, 0xFFFFFFFFu)] [Random(1)] uint Wm,
  386. [Values(0b00u, 0b01u, 0b10u, 0b11u)] uint shift, // <LSL, LSR, ASR, ROR>
  387. [Values(0u, 15u, 16u, 31u)] [Random(0u, 31u, 1)] uint amount)
  388. {
  389. uint Opcode = 0x6A000000; // ANDS W0, W0, W0, LSL #0
  390. Opcode |= ((Rm & 31) << 16) | ((Rn & 31) << 5) | ((Rd & 31) << 0);
  391. Opcode |= ((shift & 3) << 22) | ((amount & 63) << 10);
  392. Bits Op = new Bits(Opcode);
  393. uint _W31 = TestContext.CurrentContext.Random.NextUInt();
  394. AThreadState ThreadState = SingleOpcode(Opcode, X1: Wn, X2: Wm, X31: _W31);
  395. AArch64.X((int)Rn, new Bits(Wn));
  396. AArch64.X((int)Rm, new Bits(Wm));
  397. Base.Ands_Rs(Op[31], Op[23, 22], Op[20, 16], Op[15, 10], Op[9, 5], Op[4, 0]);
  398. uint Wd = AArch64.X(32, (int)Rd).ToUInt32();
  399. if (Rd != 31)
  400. {
  401. Assert.That((uint)ThreadState.X0, Is.EqualTo(Wd));
  402. }
  403. else
  404. {
  405. Assert.That((uint)ThreadState.X31, Is.EqualTo(_W31));
  406. }
  407. Assert.Multiple(() =>
  408. {
  409. Assert.That(ThreadState.Negative, Is.EqualTo(Shared.PSTATE.N));
  410. Assert.That(ThreadState.Zero, Is.EqualTo(Shared.PSTATE.Z));
  411. Assert.That(ThreadState.Carry, Is.EqualTo(Shared.PSTATE.C));
  412. Assert.That(ThreadState.Overflow, Is.EqualTo(Shared.PSTATE.V));
  413. });
  414. }
  415. [Test, Description("ASRV <Xd>, <Xn>, <Xm>")]
  416. public void Asrv_64bit([Values(0u, 31u)] uint Rd,
  417. [Values(1u, 31u)] uint Rn,
  418. [Values(2u, 31u)] uint Rm,
  419. [Values(0x0000000000000000ul, 0x7FFFFFFFFFFFFFFFul,
  420. 0x8000000000000000ul, 0xFFFFFFFFFFFFFFFFul)] [Random(8)] ulong Xn,
  421. [Values(0ul, 31ul, 32ul, 63ul, 0x7FFFFFFFFFFFFFFFul,
  422. 0x8000000000000000ul, 0xFFFFFFFFFFFFFFFFul)] [Random(5)] ulong Xm)
  423. {
  424. uint Opcode = 0x9AC02800; // ASRV X0, X0, X0
  425. Opcode |= ((Rm & 31) << 16) | ((Rn & 31) << 5) | ((Rd & 31) << 0);
  426. ulong _X31 = TestContext.CurrentContext.Random.NextULong();
  427. AThreadState ThreadState = SingleOpcode(Opcode, X1: Xn, X2: Xm, X31: _X31);
  428. if (Rd != 31)
  429. {
  430. Bits Op = new Bits(Opcode);
  431. AArch64.X((int)Rn, new Bits(Xn));
  432. AArch64.X((int)Rm, new Bits(Xm));
  433. Base.Asrv(Op[31], Op[20, 16], Op[9, 5], Op[4, 0]);
  434. ulong Xd = AArch64.X(64, (int)Rd).ToUInt64();
  435. Assert.That((ulong)ThreadState.X0, Is.EqualTo(Xd));
  436. }
  437. else
  438. {
  439. Assert.That((ulong)ThreadState.X31, Is.EqualTo(_X31));
  440. }
  441. }
  442. [Test, Description("ASRV <Wd>, <Wn>, <Wm>")]
  443. public void Asrv_32bit([Values(0u, 31u)] uint Rd,
  444. [Values(1u, 31u)] uint Rn,
  445. [Values(2u, 31u)] uint Rm,
  446. [Values(0x00000000u, 0x7FFFFFFFu,
  447. 0x80000000u, 0xFFFFFFFFu)] [Random(8)] uint Wn,
  448. [Values(0u, 15u, 16u, 31u, 0x7FFFFFFFu,
  449. 0x80000000u, 0xFFFFFFFFu)] [Random(5)] uint Wm)
  450. {
  451. uint Opcode = 0x1AC02800; // ASRV W0, W0, W0
  452. Opcode |= ((Rm & 31) << 16) | ((Rn & 31) << 5) | ((Rd & 31) << 0);
  453. uint _W31 = TestContext.CurrentContext.Random.NextUInt();
  454. AThreadState ThreadState = SingleOpcode(Opcode, X1: Wn, X2: Wm, X31: _W31);
  455. if (Rd != 31)
  456. {
  457. Bits Op = new Bits(Opcode);
  458. AArch64.X((int)Rn, new Bits(Wn));
  459. AArch64.X((int)Rm, new Bits(Wm));
  460. Base.Asrv(Op[31], Op[20, 16], Op[9, 5], Op[4, 0]);
  461. uint Wd = AArch64.X(32, (int)Rd).ToUInt32();
  462. Assert.That((uint)ThreadState.X0, Is.EqualTo(Wd));
  463. }
  464. else
  465. {
  466. Assert.That((uint)ThreadState.X31, Is.EqualTo(_W31));
  467. }
  468. }
  469. [Test, Description("BIC <Xd>, <Xn>, <Xm>{, <shift> #<amount>}")]
  470. public void Bic_64bit([Values(0u, 31u)] uint Rd,
  471. [Values(1u, 31u)] uint Rn,
  472. [Values(2u, 31u)] uint Rm,
  473. [Values(0x0000000000000000ul, 0x7FFFFFFFFFFFFFFFul,
  474. 0x8000000000000000ul, 0xFFFFFFFFFFFFFFFFul)] [Random(1)] ulong Xn,
  475. [Values(0x0000000000000000ul, 0x7FFFFFFFFFFFFFFFul,
  476. 0x8000000000000000ul, 0xFFFFFFFFFFFFFFFFul)] [Random(1)] ulong Xm,
  477. [Values(0b00u, 0b01u, 0b10u, 0b11u)] uint shift, // <LSL, LSR, ASR, ROR>
  478. [Values(0u, 31u, 32u, 63u)] [Random(0u, 63u, 1)] uint amount)
  479. {
  480. uint Opcode = 0x8A200000; // BIC X0, X0, X0, LSL #0
  481. Opcode |= ((Rm & 31) << 16) | ((Rn & 31) << 5) | ((Rd & 31) << 0);
  482. Opcode |= ((shift & 3) << 22) | ((amount & 63) << 10);
  483. ulong _X31 = TestContext.CurrentContext.Random.NextULong();
  484. AThreadState ThreadState = SingleOpcode(Opcode, X1: Xn, X2: Xm, X31: _X31);
  485. if (Rd != 31)
  486. {
  487. Bits Op = new Bits(Opcode);
  488. AArch64.X((int)Rn, new Bits(Xn));
  489. AArch64.X((int)Rm, new Bits(Xm));
  490. Base.Bic(Op[31], Op[23, 22], Op[20, 16], Op[15, 10], Op[9, 5], Op[4, 0]);
  491. ulong Xd = AArch64.X(64, (int)Rd).ToUInt64();
  492. Assert.That((ulong)ThreadState.X0, Is.EqualTo(Xd));
  493. }
  494. else
  495. {
  496. Assert.That((ulong)ThreadState.X31, Is.EqualTo(_X31));
  497. }
  498. }
  499. [Test, Description("BIC <Wd>, <Wn>, <Wm>{, <shift> #<amount>}")]
  500. public void Bic_32bit([Values(0u, 31u)] uint Rd,
  501. [Values(1u, 31u)] uint Rn,
  502. [Values(2u, 31u)] uint Rm,
  503. [Values(0x00000000u, 0x7FFFFFFFu,
  504. 0x80000000u, 0xFFFFFFFFu)] [Random(1)] uint Wn,
  505. [Values(0x00000000u, 0x7FFFFFFFu,
  506. 0x80000000u, 0xFFFFFFFFu)] [Random(1)] uint Wm,
  507. [Values(0b00u, 0b01u, 0b10u, 0b11u)] uint shift, // <LSL, LSR, ASR, ROR>
  508. [Values(0u, 15u, 16u, 31u)] [Random(0u, 31u, 1)] uint amount)
  509. {
  510. uint Opcode = 0x0A200000; // BIC W0, W0, W0, LSL #0
  511. Opcode |= ((Rm & 31) << 16) | ((Rn & 31) << 5) | ((Rd & 31) << 0);
  512. Opcode |= ((shift & 3) << 22) | ((amount & 63) << 10);
  513. uint _W31 = TestContext.CurrentContext.Random.NextUInt();
  514. AThreadState ThreadState = SingleOpcode(Opcode, X1: Wn, X2: Wm, X31: _W31);
  515. if (Rd != 31)
  516. {
  517. Bits Op = new Bits(Opcode);
  518. AArch64.X((int)Rn, new Bits(Wn));
  519. AArch64.X((int)Rm, new Bits(Wm));
  520. Base.Bic(Op[31], Op[23, 22], Op[20, 16], Op[15, 10], Op[9, 5], Op[4, 0]);
  521. uint Wd = AArch64.X(32, (int)Rd).ToUInt32();
  522. Assert.That((uint)ThreadState.X0, Is.EqualTo(Wd));
  523. }
  524. else
  525. {
  526. Assert.That((uint)ThreadState.X31, Is.EqualTo(_W31));
  527. }
  528. }
  529. [Test, Description("BICS <Xd>, <Xn>, <Xm>{, <shift> #<amount>}")]
  530. public void Bics_64bit([Values(0u, 31u)] uint Rd,
  531. [Values(1u, 31u)] uint Rn,
  532. [Values(2u, 31u)] uint Rm,
  533. [Values(0x0000000000000000ul, 0x7FFFFFFFFFFFFFFFul,
  534. 0x8000000000000000ul, 0xFFFFFFFFFFFFFFFFul)] [Random(1)] ulong Xn,
  535. [Values(0x0000000000000000ul, 0x7FFFFFFFFFFFFFFFul,
  536. 0x8000000000000000ul, 0xFFFFFFFFFFFFFFFFul)] [Random(1)] ulong Xm,
  537. [Values(0b00u, 0b01u, 0b10u, 0b11u)] uint shift, // <LSL, LSR, ASR, ROR>
  538. [Values(0u, 31u, 32u, 63u)] [Random(0u, 63u, 1)] uint amount)
  539. {
  540. uint Opcode = 0xEA200000; // BICS X0, X0, X0, LSL #0
  541. Opcode |= ((Rm & 31) << 16) | ((Rn & 31) << 5) | ((Rd & 31) << 0);
  542. Opcode |= ((shift & 3) << 22) | ((amount & 63) << 10);
  543. Bits Op = new Bits(Opcode);
  544. ulong _X31 = TestContext.CurrentContext.Random.NextULong();
  545. AThreadState ThreadState = SingleOpcode(Opcode, X1: Xn, X2: Xm, X31: _X31);
  546. AArch64.X((int)Rn, new Bits(Xn));
  547. AArch64.X((int)Rm, new Bits(Xm));
  548. Base.Bics(Op[31], Op[23, 22], Op[20, 16], Op[15, 10], Op[9, 5], Op[4, 0]);
  549. ulong Xd = AArch64.X(64, (int)Rd).ToUInt64();
  550. if (Rd != 31)
  551. {
  552. Assert.That((ulong)ThreadState.X0, Is.EqualTo(Xd));
  553. }
  554. else
  555. {
  556. Assert.That((ulong)ThreadState.X31, Is.EqualTo(_X31));
  557. }
  558. Assert.Multiple(() =>
  559. {
  560. Assert.That(ThreadState.Negative, Is.EqualTo(Shared.PSTATE.N));
  561. Assert.That(ThreadState.Zero, Is.EqualTo(Shared.PSTATE.Z));
  562. Assert.That(ThreadState.Carry, Is.EqualTo(Shared.PSTATE.C));
  563. Assert.That(ThreadState.Overflow, Is.EqualTo(Shared.PSTATE.V));
  564. });
  565. }
  566. [Test, Description("BICS <Wd>, <Wn>, <Wm>{, <shift> #<amount>}")]
  567. public void Bics_32bit([Values(0u, 31u)] uint Rd,
  568. [Values(1u, 31u)] uint Rn,
  569. [Values(2u, 31u)] uint Rm,
  570. [Values(0x00000000u, 0x7FFFFFFFu,
  571. 0x80000000u, 0xFFFFFFFFu)] [Random(1)] uint Wn,
  572. [Values(0x00000000u, 0x7FFFFFFFu,
  573. 0x80000000u, 0xFFFFFFFFu)] [Random(1)] uint Wm,
  574. [Values(0b00u, 0b01u, 0b10u, 0b11u)] uint shift, // <LSL, LSR, ASR, ROR>
  575. [Values(0u, 15u, 16u, 31u)] [Random(0u, 31u, 1)] uint amount)
  576. {
  577. uint Opcode = 0x6A200000; // BICS W0, W0, W0, LSL #0
  578. Opcode |= ((Rm & 31) << 16) | ((Rn & 31) << 5) | ((Rd & 31) << 0);
  579. Opcode |= ((shift & 3) << 22) | ((amount & 63) << 10);
  580. Bits Op = new Bits(Opcode);
  581. uint _W31 = TestContext.CurrentContext.Random.NextUInt();
  582. AThreadState ThreadState = SingleOpcode(Opcode, X1: Wn, X2: Wm, X31: _W31);
  583. AArch64.X((int)Rn, new Bits(Wn));
  584. AArch64.X((int)Rm, new Bits(Wm));
  585. Base.Bics(Op[31], Op[23, 22], Op[20, 16], Op[15, 10], Op[9, 5], Op[4, 0]);
  586. uint Wd = AArch64.X(32, (int)Rd).ToUInt32();
  587. if (Rd != 31)
  588. {
  589. Assert.That((uint)ThreadState.X0, Is.EqualTo(Wd));
  590. }
  591. else
  592. {
  593. Assert.That((uint)ThreadState.X31, Is.EqualTo(_W31));
  594. }
  595. Assert.Multiple(() =>
  596. {
  597. Assert.That(ThreadState.Negative, Is.EqualTo(Shared.PSTATE.N));
  598. Assert.That(ThreadState.Zero, Is.EqualTo(Shared.PSTATE.Z));
  599. Assert.That(ThreadState.Carry, Is.EqualTo(Shared.PSTATE.C));
  600. Assert.That(ThreadState.Overflow, Is.EqualTo(Shared.PSTATE.V));
  601. });
  602. }
  603. [Test, Description("CRC32X <Wd>, <Wn>, <Xm>")]
  604. public void Crc32x([Values(0u, 31u)] uint Rd,
  605. [Values(1u, 31u)] uint Rn,
  606. [Values(2u, 31u)] uint Rm,
  607. [Values(0x00000000u, 0xFFFFFFFFu)] [Random(2)] uint Wn,
  608. [Values((ulong)0x00_00_00_00_00_00_00_00,
  609. (ulong)0x7F_FF_FF_FF_FF_FF_FF_FF,
  610. (ulong)0x80_00_00_00_00_00_00_00,
  611. (ulong)0xFF_FF_FF_FF_FF_FF_FF_FF)] [Random(64)] ulong Xm)
  612. {
  613. uint Opcode = 0x9AC04C00; // CRC32X W0, W0, X0
  614. Opcode |= ((Rm & 31) << 16) | ((Rn & 31) << 5) | ((Rd & 31) << 0);
  615. uint _W31 = TestContext.CurrentContext.Random.NextUInt();
  616. AThreadState ThreadState = SingleOpcode(Opcode, X1: Wn, X2: Xm, X31: _W31);
  617. if (Rd != 31)
  618. {
  619. Bits Op = new Bits(Opcode);
  620. AArch64.X((int)Rn, new Bits(Wn));
  621. AArch64.X((int)Rm, new Bits(Xm));
  622. Base.Crc32(Op[31], Op[20, 16], Op[11, 10], Op[9, 5], Op[4, 0]);
  623. uint Wd = AArch64.X(32, (int)Rd).ToUInt32();
  624. Assert.That((uint)ThreadState.X0, Is.EqualTo(Wd));
  625. }
  626. else
  627. {
  628. Assert.That((uint)ThreadState.X31, Is.EqualTo(_W31));
  629. }
  630. }
  631. [Test, Description("CRC32W <Wd>, <Wn>, <Wm>")]
  632. public void Crc32w([Values(0u, 31u)] uint Rd,
  633. [Values(1u, 31u)] uint Rn,
  634. [Values(2u, 31u)] uint Rm,
  635. [Values(0x00000000u, 0xFFFFFFFFu)] [Random(2)] uint Wn,
  636. [Values((uint)0x00_00_00_00, (uint)0x7F_FF_FF_FF,
  637. (uint)0x80_00_00_00, (uint)0xFF_FF_FF_FF)] [Random(64)] uint Wm)
  638. {
  639. uint Opcode = 0x1AC04800; // CRC32W W0, W0, W0
  640. Opcode |= ((Rm & 31) << 16) | ((Rn & 31) << 5) | ((Rd & 31) << 0);
  641. uint _W31 = TestContext.CurrentContext.Random.NextUInt();
  642. AThreadState ThreadState = SingleOpcode(Opcode, X1: Wn, X2: Wm, X31: _W31);
  643. if (Rd != 31)
  644. {
  645. Bits Op = new Bits(Opcode);
  646. AArch64.X((int)Rn, new Bits(Wn));
  647. AArch64.X((int)Rm, new Bits(Wm));
  648. Base.Crc32(Op[31], Op[20, 16], Op[11, 10], Op[9, 5], Op[4, 0]);
  649. uint Wd = AArch64.X(32, (int)Rd).ToUInt32();
  650. Assert.That((uint)ThreadState.X0, Is.EqualTo(Wd));
  651. }
  652. else
  653. {
  654. Assert.That((uint)ThreadState.X31, Is.EqualTo(_W31));
  655. }
  656. }
  657. [Test, Description("CRC32H <Wd>, <Wn>, <Wm>")]
  658. public void Crc32h([Values(0u, 31u)] uint Rd,
  659. [Values(1u, 31u)] uint Rn,
  660. [Values(2u, 31u)] uint Rm,
  661. [Values(0x00000000u, 0xFFFFFFFFu)] [Random(2)] uint Wn,
  662. [Values((ushort)0x00_00, (ushort)0x7F_FF,
  663. (ushort)0x80_00, (ushort)0xFF_FF)] [Random(64)] ushort Wm)
  664. {
  665. uint Opcode = 0x1AC04400; // CRC32H W0, W0, W0
  666. Opcode |= ((Rm & 31) << 16) | ((Rn & 31) << 5) | ((Rd & 31) << 0);
  667. uint _W31 = TestContext.CurrentContext.Random.NextUInt();
  668. AThreadState ThreadState = SingleOpcode(Opcode, X1: Wn, X2: Wm, X31: _W31);
  669. if (Rd != 31)
  670. {
  671. Bits Op = new Bits(Opcode);
  672. AArch64.X((int)Rn, new Bits(Wn));
  673. AArch64.X((int)Rm, new Bits(Wm));
  674. Base.Crc32(Op[31], Op[20, 16], Op[11, 10], Op[9, 5], Op[4, 0]);
  675. uint Wd = AArch64.X(32, (int)Rd).ToUInt32();
  676. Assert.That((uint)ThreadState.X0, Is.EqualTo(Wd));
  677. }
  678. else
  679. {
  680. Assert.That((uint)ThreadState.X31, Is.EqualTo(_W31));
  681. }
  682. }
  683. [Test, Description("CRC32B <Wd>, <Wn>, <Wm>")]
  684. public void Crc32b([Values(0u, 31u)] uint Rd,
  685. [Values(1u, 31u)] uint Rn,
  686. [Values(2u, 31u)] uint Rm,
  687. [Values(0x00000000u, 0xFFFFFFFFu)] [Random(2)] uint Wn,
  688. [Values((byte)0x00, (byte)0x7F,
  689. (byte)0x80, (byte)0xFF)] [Random(64)] byte Wm)
  690. {
  691. uint Opcode = 0x1AC04000; // CRC32B W0, W0, W0
  692. Opcode |= ((Rm & 31) << 16) | ((Rn & 31) << 5) | ((Rd & 31) << 0);
  693. uint _W31 = TestContext.CurrentContext.Random.NextUInt();
  694. AThreadState ThreadState = SingleOpcode(Opcode, X1: Wn, X2: Wm, X31: _W31);
  695. if (Rd != 31)
  696. {
  697. Bits Op = new Bits(Opcode);
  698. AArch64.X((int)Rn, new Bits(Wn));
  699. AArch64.X((int)Rm, new Bits(Wm));
  700. Base.Crc32(Op[31], Op[20, 16], Op[11, 10], Op[9, 5], Op[4, 0]);
  701. uint Wd = AArch64.X(32, (int)Rd).ToUInt32();
  702. Assert.That((uint)ThreadState.X0, Is.EqualTo(Wd));
  703. }
  704. else
  705. {
  706. Assert.That((uint)ThreadState.X31, Is.EqualTo(_W31));
  707. }
  708. }
  709. [Test, Description("CRC32CX <Wd>, <Wn>, <Xm>")]
  710. public void Crc32cx([Values(0u, 31u)] uint Rd,
  711. [Values(1u, 31u)] uint Rn,
  712. [Values(2u, 31u)] uint Rm,
  713. [Values(0x00000000u, 0xFFFFFFFFu)] [Random(2)] uint Wn,
  714. [Values((ulong)0x00_00_00_00_00_00_00_00,
  715. (ulong)0x7F_FF_FF_FF_FF_FF_FF_FF,
  716. (ulong)0x80_00_00_00_00_00_00_00,
  717. (ulong)0xFF_FF_FF_FF_FF_FF_FF_FF)] [Random(64)] ulong Xm)
  718. {
  719. uint Opcode = 0x9AC05C00; // CRC32CX W0, W0, X0
  720. Opcode |= ((Rm & 31) << 16) | ((Rn & 31) << 5) | ((Rd & 31) << 0);
  721. uint _W31 = TestContext.CurrentContext.Random.NextUInt();
  722. AThreadState ThreadState = SingleOpcode(Opcode, X1: Wn, X2: Xm, X31: _W31);
  723. if (Rd != 31)
  724. {
  725. Bits Op = new Bits(Opcode);
  726. AArch64.X((int)Rn, new Bits(Wn));
  727. AArch64.X((int)Rm, new Bits(Xm));
  728. Base.Crc32c(Op[31], Op[20, 16], Op[11, 10], Op[9, 5], Op[4, 0]);
  729. uint Wd = AArch64.X(32, (int)Rd).ToUInt32();
  730. Assert.That((uint)ThreadState.X0, Is.EqualTo(Wd));
  731. }
  732. else
  733. {
  734. Assert.That((uint)ThreadState.X31, Is.EqualTo(_W31));
  735. }
  736. }
  737. [Test, Description("CRC32CW <Wd>, <Wn>, <Wm>")]
  738. public void Crc32cw([Values(0u, 31u)] uint Rd,
  739. [Values(1u, 31u)] uint Rn,
  740. [Values(2u, 31u)] uint Rm,
  741. [Values(0x00000000u, 0xFFFFFFFFu)] [Random(2)] uint Wn,
  742. [Values((uint)0x00_00_00_00, (uint)0x7F_FF_FF_FF,
  743. (uint)0x80_00_00_00, (uint)0xFF_FF_FF_FF)] [Random(64)] uint Wm)
  744. {
  745. uint Opcode = 0x1AC05800; // CRC32CW W0, W0, W0
  746. Opcode |= ((Rm & 31) << 16) | ((Rn & 31) << 5) | ((Rd & 31) << 0);
  747. uint _W31 = TestContext.CurrentContext.Random.NextUInt();
  748. AThreadState ThreadState = SingleOpcode(Opcode, X1: Wn, X2: Wm, X31: _W31);
  749. if (Rd != 31)
  750. {
  751. Bits Op = new Bits(Opcode);
  752. AArch64.X((int)Rn, new Bits(Wn));
  753. AArch64.X((int)Rm, new Bits(Wm));
  754. Base.Crc32c(Op[31], Op[20, 16], Op[11, 10], Op[9, 5], Op[4, 0]);
  755. uint Wd = AArch64.X(32, (int)Rd).ToUInt32();
  756. Assert.That((uint)ThreadState.X0, Is.EqualTo(Wd));
  757. }
  758. else
  759. {
  760. Assert.That((uint)ThreadState.X31, Is.EqualTo(_W31));
  761. }
  762. }
  763. [Test, Description("CRC32CH <Wd>, <Wn>, <Wm>")]
  764. public void Crc32ch([Values(0u, 31u)] uint Rd,
  765. [Values(1u, 31u)] uint Rn,
  766. [Values(2u, 31u)] uint Rm,
  767. [Values(0x00000000u, 0xFFFFFFFFu)] [Random(2)] uint Wn,
  768. [Values((ushort)0x00_00, (ushort)0x7F_FF,
  769. (ushort)0x80_00, (ushort)0xFF_FF)] [Random(64)] ushort Wm)
  770. {
  771. uint Opcode = 0x1AC05400; // CRC32CH W0, W0, W0
  772. Opcode |= ((Rm & 31) << 16) | ((Rn & 31) << 5) | ((Rd & 31) << 0);
  773. uint _W31 = TestContext.CurrentContext.Random.NextUInt();
  774. AThreadState ThreadState = SingleOpcode(Opcode, X1: Wn, X2: Wm, X31: _W31);
  775. if (Rd != 31)
  776. {
  777. Bits Op = new Bits(Opcode);
  778. AArch64.X((int)Rn, new Bits(Wn));
  779. AArch64.X((int)Rm, new Bits(Wm));
  780. Base.Crc32c(Op[31], Op[20, 16], Op[11, 10], Op[9, 5], Op[4, 0]);
  781. uint Wd = AArch64.X(32, (int)Rd).ToUInt32();
  782. Assert.That((uint)ThreadState.X0, Is.EqualTo(Wd));
  783. }
  784. else
  785. {
  786. Assert.That((uint)ThreadState.X31, Is.EqualTo(_W31));
  787. }
  788. }
  789. [Test, Description("CRC32CB <Wd>, <Wn>, <Wm>")]
  790. public void Crc32cb([Values(0u, 31u)] uint Rd,
  791. [Values(1u, 31u)] uint Rn,
  792. [Values(2u, 31u)] uint Rm,
  793. [Values(0x00000000u, 0xFFFFFFFFu)] [Random(2)] uint Wn,
  794. [Values((byte)0x00, (byte)0x7F,
  795. (byte)0x80, (byte)0xFF)] [Random(64)] byte Wm)
  796. {
  797. uint Opcode = 0x1AC05000; // CRC32CB W0, W0, W0
  798. Opcode |= ((Rm & 31) << 16) | ((Rn & 31) << 5) | ((Rd & 31) << 0);
  799. uint _W31 = TestContext.CurrentContext.Random.NextUInt();
  800. AThreadState ThreadState = SingleOpcode(Opcode, X1: Wn, X2: Wm, X31: _W31);
  801. if (Rd != 31)
  802. {
  803. Bits Op = new Bits(Opcode);
  804. AArch64.X((int)Rn, new Bits(Wn));
  805. AArch64.X((int)Rm, new Bits(Wm));
  806. Base.Crc32c(Op[31], Op[20, 16], Op[11, 10], Op[9, 5], Op[4, 0]);
  807. uint Wd = AArch64.X(32, (int)Rd).ToUInt32();
  808. Assert.That((uint)ThreadState.X0, Is.EqualTo(Wd));
  809. }
  810. else
  811. {
  812. Assert.That((uint)ThreadState.X31, Is.EqualTo(_W31));
  813. }
  814. }
  815. [Test, Description("EON <Xd>, <Xn>, <Xm>{, <shift> #<amount>}")]
  816. public void Eon_64bit([Values(0u, 31u)] uint Rd,
  817. [Values(1u, 31u)] uint Rn,
  818. [Values(2u, 31u)] uint Rm,
  819. [Values(0x0000000000000000ul, 0x7FFFFFFFFFFFFFFFul,
  820. 0x8000000000000000ul, 0xFFFFFFFFFFFFFFFFul)] [Random(1)] ulong Xn,
  821. [Values(0x0000000000000000ul, 0x7FFFFFFFFFFFFFFFul,
  822. 0x8000000000000000ul, 0xFFFFFFFFFFFFFFFFul)] [Random(1)] ulong Xm,
  823. [Values(0b00u, 0b01u, 0b10u, 0b11u)] uint shift, // <LSL, LSR, ASR, ROR>
  824. [Values(0u, 31u, 32u, 63u)] [Random(0u, 63u, 1)] uint amount)
  825. {
  826. uint Opcode = 0xCA200000; // EON X0, X0, X0, LSL #0
  827. Opcode |= ((Rm & 31) << 16) | ((Rn & 31) << 5) | ((Rd & 31) << 0);
  828. Opcode |= ((shift & 3) << 22) | ((amount & 63) << 10);
  829. ulong _X31 = TestContext.CurrentContext.Random.NextULong();
  830. AThreadState ThreadState = SingleOpcode(Opcode, X1: Xn, X2: Xm, X31: _X31);
  831. if (Rd != 31)
  832. {
  833. Bits Op = new Bits(Opcode);
  834. AArch64.X((int)Rn, new Bits(Xn));
  835. AArch64.X((int)Rm, new Bits(Xm));
  836. Base.Eon(Op[31], Op[23, 22], Op[20, 16], Op[15, 10], Op[9, 5], Op[4, 0]);
  837. ulong Xd = AArch64.X(64, (int)Rd).ToUInt64();
  838. Assert.That((ulong)ThreadState.X0, Is.EqualTo(Xd));
  839. }
  840. else
  841. {
  842. Assert.That((ulong)ThreadState.X31, Is.EqualTo(_X31));
  843. }
  844. }
  845. [Test, Description("EON <Wd>, <Wn>, <Wm>{, <shift> #<amount>}")]
  846. public void Eon_32bit([Values(0u, 31u)] uint Rd,
  847. [Values(1u, 31u)] uint Rn,
  848. [Values(2u, 31u)] uint Rm,
  849. [Values(0x00000000u, 0x7FFFFFFFu,
  850. 0x80000000u, 0xFFFFFFFFu)] [Random(1)] uint Wn,
  851. [Values(0x00000000u, 0x7FFFFFFFu,
  852. 0x80000000u, 0xFFFFFFFFu)] [Random(1)] uint Wm,
  853. [Values(0b00u, 0b01u, 0b10u, 0b11u)] uint shift, // <LSL, LSR, ASR, ROR>
  854. [Values(0u, 15u, 16u, 31u)] [Random(0u, 31u, 1)] uint amount)
  855. {
  856. uint Opcode = 0x4A200000; // EON W0, W0, W0, LSL #0
  857. Opcode |= ((Rm & 31) << 16) | ((Rn & 31) << 5) | ((Rd & 31) << 0);
  858. Opcode |= ((shift & 3) << 22) | ((amount & 63) << 10);
  859. uint _W31 = TestContext.CurrentContext.Random.NextUInt();
  860. AThreadState ThreadState = SingleOpcode(Opcode, X1: Wn, X2: Wm, X31: _W31);
  861. if (Rd != 31)
  862. {
  863. Bits Op = new Bits(Opcode);
  864. AArch64.X((int)Rn, new Bits(Wn));
  865. AArch64.X((int)Rm, new Bits(Wm));
  866. Base.Eon(Op[31], Op[23, 22], Op[20, 16], Op[15, 10], Op[9, 5], Op[4, 0]);
  867. uint Wd = AArch64.X(32, (int)Rd).ToUInt32();
  868. Assert.That((uint)ThreadState.X0, Is.EqualTo(Wd));
  869. }
  870. else
  871. {
  872. Assert.That((uint)ThreadState.X31, Is.EqualTo(_W31));
  873. }
  874. }
  875. [Test, Description("EOR <Xd>, <Xn>, <Xm>{, <shift> #<amount>}")]
  876. public void Eor_64bit([Values(0u, 31u)] uint Rd,
  877. [Values(1u, 31u)] uint Rn,
  878. [Values(2u, 31u)] uint Rm,
  879. [Values(0x0000000000000000ul, 0x7FFFFFFFFFFFFFFFul,
  880. 0x8000000000000000ul, 0xFFFFFFFFFFFFFFFFul)] [Random(1)] ulong Xn,
  881. [Values(0x0000000000000000ul, 0x7FFFFFFFFFFFFFFFul,
  882. 0x8000000000000000ul, 0xFFFFFFFFFFFFFFFFul)] [Random(1)] ulong Xm,
  883. [Values(0b00u, 0b01u, 0b10u, 0b11u)] uint shift, // <LSL, LSR, ASR, ROR>
  884. [Values(0u, 31u, 32u, 63u)] [Random(0u, 63u, 1)] uint amount)
  885. {
  886. uint Opcode = 0xCA000000; // EOR X0, X0, X0, LSL #0
  887. Opcode |= ((Rm & 31) << 16) | ((Rn & 31) << 5) | ((Rd & 31) << 0);
  888. Opcode |= ((shift & 3) << 22) | ((amount & 63) << 10);
  889. ulong _X31 = TestContext.CurrentContext.Random.NextULong();
  890. AThreadState ThreadState = SingleOpcode(Opcode, X1: Xn, X2: Xm, X31: _X31);
  891. if (Rd != 31)
  892. {
  893. Bits Op = new Bits(Opcode);
  894. AArch64.X((int)Rn, new Bits(Xn));
  895. AArch64.X((int)Rm, new Bits(Xm));
  896. Base.Eor_Rs(Op[31], Op[23, 22], Op[20, 16], Op[15, 10], Op[9, 5], Op[4, 0]);
  897. ulong Xd = AArch64.X(64, (int)Rd).ToUInt64();
  898. Assert.That((ulong)ThreadState.X0, Is.EqualTo(Xd));
  899. }
  900. else
  901. {
  902. Assert.That((ulong)ThreadState.X31, Is.EqualTo(_X31));
  903. }
  904. }
  905. [Test, Description("EOR <Wd>, <Wn>, <Wm>{, <shift> #<amount>}")]
  906. public void Eor_32bit([Values(0u, 31u)] uint Rd,
  907. [Values(1u, 31u)] uint Rn,
  908. [Values(2u, 31u)] uint Rm,
  909. [Values(0x00000000u, 0x7FFFFFFFu,
  910. 0x80000000u, 0xFFFFFFFFu)] [Random(1)] uint Wn,
  911. [Values(0x00000000u, 0x7FFFFFFFu,
  912. 0x80000000u, 0xFFFFFFFFu)] [Random(1)] uint Wm,
  913. [Values(0b00u, 0b01u, 0b10u, 0b11u)] uint shift, // <LSL, LSR, ASR, ROR>
  914. [Values(0u, 15u, 16u, 31u)] [Random(0u, 31u, 1)] uint amount)
  915. {
  916. uint Opcode = 0x4A000000; // EOR W0, W0, W0, LSL #0
  917. Opcode |= ((Rm & 31) << 16) | ((Rn & 31) << 5) | ((Rd & 31) << 0);
  918. Opcode |= ((shift & 3) << 22) | ((amount & 63) << 10);
  919. uint _W31 = TestContext.CurrentContext.Random.NextUInt();
  920. AThreadState ThreadState = SingleOpcode(Opcode, X1: Wn, X2: Wm, X31: _W31);
  921. if (Rd != 31)
  922. {
  923. Bits Op = new Bits(Opcode);
  924. AArch64.X((int)Rn, new Bits(Wn));
  925. AArch64.X((int)Rm, new Bits(Wm));
  926. Base.Eor_Rs(Op[31], Op[23, 22], Op[20, 16], Op[15, 10], Op[9, 5], Op[4, 0]);
  927. uint Wd = AArch64.X(32, (int)Rd).ToUInt32();
  928. Assert.That((uint)ThreadState.X0, Is.EqualTo(Wd));
  929. }
  930. else
  931. {
  932. Assert.That((uint)ThreadState.X31, Is.EqualTo(_W31));
  933. }
  934. }
  935. [Test, Description("EXTR <Xd>, <Xn>, <Xm>, #<lsb>")]
  936. public void Extr_64bit([Values(0u, 31u)] uint Rd,
  937. [Values(1u, 31u)] uint Rn,
  938. [Values(2u, 31u)] uint Rm,
  939. [Values(0x0000000000000000ul, 0x7FFFFFFFFFFFFFFFul,
  940. 0x8000000000000000ul, 0xFFFFFFFFFFFFFFFFul)] [Random(2)] ulong Xn,
  941. [Values(0x0000000000000000ul, 0x7FFFFFFFFFFFFFFFul,
  942. 0x8000000000000000ul, 0xFFFFFFFFFFFFFFFFul)] [Random(2)] ulong Xm,
  943. [Values(0u, 31u, 32u, 63u)] [Random(0u, 63u, 2)] uint lsb)
  944. {
  945. uint Opcode = 0x93C00000; // EXTR X0, X0, X0, #0
  946. Opcode |= ((Rm & 31) << 16) | ((Rn & 31) << 5) | ((Rd & 31) << 0);
  947. Opcode |= ((lsb & 63) << 10);
  948. ulong _X31 = TestContext.CurrentContext.Random.NextULong();
  949. AThreadState ThreadState = SingleOpcode(Opcode, X1: Xn, X2: Xm, X31: _X31);
  950. if (Rd != 31)
  951. {
  952. Bits Op = new Bits(Opcode);
  953. AArch64.X((int)Rn, new Bits(Xn));
  954. AArch64.X((int)Rm, new Bits(Xm));
  955. Base.Extr(Op[31], Op[22], Op[20, 16], Op[15, 10], Op[9, 5], Op[4, 0]);
  956. ulong Xd = AArch64.X(64, (int)Rd).ToUInt64();
  957. Assert.That((ulong)ThreadState.X0, Is.EqualTo(Xd));
  958. }
  959. else
  960. {
  961. Assert.That((ulong)ThreadState.X31, Is.EqualTo(_X31));
  962. }
  963. }
  964. [Test, Description("EXTR <Wd>, <Wn>, <Wm>, #<lsb>")]
  965. public void Extr_32bit([Values(0u, 31u)] uint Rd,
  966. [Values(1u, 31u)] uint Rn,
  967. [Values(2u, 31u)] uint Rm,
  968. [Values(0x00000000u, 0x7FFFFFFFu,
  969. 0x80000000u, 0xFFFFFFFFu)] [Random(2)] uint Wn,
  970. [Values(0x00000000u, 0x7FFFFFFFu,
  971. 0x80000000u, 0xFFFFFFFFu)] [Random(2)] uint Wm,
  972. [Values(0u, 15u, 16u, 31u)] [Random(0u, 31u, 2)] uint lsb)
  973. {
  974. uint Opcode = 0x13800000; // EXTR W0, W0, W0, #0
  975. Opcode |= ((Rm & 31) << 16) | ((Rn & 31) << 5) | ((Rd & 31) << 0);
  976. Opcode |= ((lsb & 63) << 10);
  977. uint _W31 = TestContext.CurrentContext.Random.NextUInt();
  978. AThreadState ThreadState = SingleOpcode(Opcode, X1: Wn, X2: Wm, X31: _W31);
  979. if (Rd != 31)
  980. {
  981. Bits Op = new Bits(Opcode);
  982. AArch64.X((int)Rn, new Bits(Wn));
  983. AArch64.X((int)Rm, new Bits(Wm));
  984. Base.Extr(Op[31], Op[22], Op[20, 16], Op[15, 10], Op[9, 5], Op[4, 0]);
  985. uint Wd = AArch64.X(32, (int)Rd).ToUInt32();
  986. Assert.That((uint)ThreadState.X0, Is.EqualTo(Wd));
  987. }
  988. else
  989. {
  990. Assert.That((uint)ThreadState.X31, Is.EqualTo(_W31));
  991. }
  992. }
  993. [Test, Description("LSLV <Xd>, <Xn>, <Xm>")]
  994. public void Lslv_64bit([Values(0u, 31u)] uint Rd,
  995. [Values(1u, 31u)] uint Rn,
  996. [Values(2u, 31u)] uint Rm,
  997. [Values(0x0000000000000000ul, 0x7FFFFFFFFFFFFFFFul,
  998. 0x8000000000000000ul, 0xFFFFFFFFFFFFFFFFul)] [Random(8)] ulong Xn,
  999. [Values(0ul, 31ul, 32ul, 63ul, 0x7FFFFFFFFFFFFFFFul,
  1000. 0x8000000000000000ul, 0xFFFFFFFFFFFFFFFFul)] [Random(5)] ulong Xm)
  1001. {
  1002. uint Opcode = 0x9AC02000; // LSLV X0, X0, X0
  1003. Opcode |= ((Rm & 31) << 16) | ((Rn & 31) << 5) | ((Rd & 31) << 0);
  1004. ulong _X31 = TestContext.CurrentContext.Random.NextULong();
  1005. AThreadState ThreadState = SingleOpcode(Opcode, X1: Xn, X2: Xm, X31: _X31);
  1006. if (Rd != 31)
  1007. {
  1008. Bits Op = new Bits(Opcode);
  1009. AArch64.X((int)Rn, new Bits(Xn));
  1010. AArch64.X((int)Rm, new Bits(Xm));
  1011. Base.Lslv(Op[31], Op[20, 16], Op[9, 5], Op[4, 0]);
  1012. ulong Xd = AArch64.X(64, (int)Rd).ToUInt64();
  1013. Assert.That((ulong)ThreadState.X0, Is.EqualTo(Xd));
  1014. }
  1015. else
  1016. {
  1017. Assert.That((ulong)ThreadState.X31, Is.EqualTo(_X31));
  1018. }
  1019. }
  1020. [Test, Description("LSLV <Wd>, <Wn>, <Wm>")]
  1021. public void Lslv_32bit([Values(0u, 31u)] uint Rd,
  1022. [Values(1u, 31u)] uint Rn,
  1023. [Values(2u, 31u)] uint Rm,
  1024. [Values(0x00000000u, 0x7FFFFFFFu,
  1025. 0x80000000u, 0xFFFFFFFFu)] [Random(8)] uint Wn,
  1026. [Values(0u, 15u, 16u, 31u, 0x7FFFFFFFu,
  1027. 0x80000000u, 0xFFFFFFFFu)] [Random(5)] uint Wm)
  1028. {
  1029. uint Opcode = 0x1AC02000; // LSLV W0, W0, W0
  1030. Opcode |= ((Rm & 31) << 16) | ((Rn & 31) << 5) | ((Rd & 31) << 0);
  1031. uint _W31 = TestContext.CurrentContext.Random.NextUInt();
  1032. AThreadState ThreadState = SingleOpcode(Opcode, X1: Wn, X2: Wm, X31: _W31);
  1033. if (Rd != 31)
  1034. {
  1035. Bits Op = new Bits(Opcode);
  1036. AArch64.X((int)Rn, new Bits(Wn));
  1037. AArch64.X((int)Rm, new Bits(Wm));
  1038. Base.Lslv(Op[31], Op[20, 16], Op[9, 5], Op[4, 0]);
  1039. uint Wd = AArch64.X(32, (int)Rd).ToUInt32();
  1040. Assert.That((uint)ThreadState.X0, Is.EqualTo(Wd));
  1041. }
  1042. else
  1043. {
  1044. Assert.That((uint)ThreadState.X31, Is.EqualTo(_W31));
  1045. }
  1046. }
  1047. [Test, Description("LSRV <Xd>, <Xn>, <Xm>")]
  1048. public void Lsrv_64bit([Values(0u, 31u)] uint Rd,
  1049. [Values(1u, 31u)] uint Rn,
  1050. [Values(2u, 31u)] uint Rm,
  1051. [Values(0x0000000000000000ul, 0x7FFFFFFFFFFFFFFFul,
  1052. 0x8000000000000000ul, 0xFFFFFFFFFFFFFFFFul)] [Random(8)] ulong Xn,
  1053. [Values(0ul, 31ul, 32ul, 63ul, 0x7FFFFFFFFFFFFFFFul,
  1054. 0x8000000000000000ul, 0xFFFFFFFFFFFFFFFFul)] [Random(5)] ulong Xm)
  1055. {
  1056. uint Opcode = 0x9AC02400; // LSRV X0, X0, X0
  1057. Opcode |= ((Rm & 31) << 16) | ((Rn & 31) << 5) | ((Rd & 31) << 0);
  1058. ulong _X31 = TestContext.CurrentContext.Random.NextULong();
  1059. AThreadState ThreadState = SingleOpcode(Opcode, X1: Xn, X2: Xm, X31: _X31);
  1060. if (Rd != 31)
  1061. {
  1062. Bits Op = new Bits(Opcode);
  1063. AArch64.X((int)Rn, new Bits(Xn));
  1064. AArch64.X((int)Rm, new Bits(Xm));
  1065. Base.Lsrv(Op[31], Op[20, 16], Op[9, 5], Op[4, 0]);
  1066. ulong Xd = AArch64.X(64, (int)Rd).ToUInt64();
  1067. Assert.That((ulong)ThreadState.X0, Is.EqualTo(Xd));
  1068. }
  1069. else
  1070. {
  1071. Assert.That((ulong)ThreadState.X31, Is.EqualTo(_X31));
  1072. }
  1073. }
  1074. [Test, Description("LSRV <Wd>, <Wn>, <Wm>")]
  1075. public void Lsrv_32bit([Values(0u, 31u)] uint Rd,
  1076. [Values(1u, 31u)] uint Rn,
  1077. [Values(2u, 31u)] uint Rm,
  1078. [Values(0x00000000u, 0x7FFFFFFFu,
  1079. 0x80000000u, 0xFFFFFFFFu)] [Random(8)] uint Wn,
  1080. [Values(0u, 15u, 16u, 31u, 0x7FFFFFFFu,
  1081. 0x80000000u, 0xFFFFFFFFu)] [Random(5)] uint Wm)
  1082. {
  1083. uint Opcode = 0x1AC02400; // LSRV W0, W0, W0
  1084. Opcode |= ((Rm & 31) << 16) | ((Rn & 31) << 5) | ((Rd & 31) << 0);
  1085. uint _W31 = TestContext.CurrentContext.Random.NextUInt();
  1086. AThreadState ThreadState = SingleOpcode(Opcode, X1: Wn, X2: Wm, X31: _W31);
  1087. if (Rd != 31)
  1088. {
  1089. Bits Op = new Bits(Opcode);
  1090. AArch64.X((int)Rn, new Bits(Wn));
  1091. AArch64.X((int)Rm, new Bits(Wm));
  1092. Base.Lsrv(Op[31], Op[20, 16], Op[9, 5], Op[4, 0]);
  1093. uint Wd = AArch64.X(32, (int)Rd).ToUInt32();
  1094. Assert.That((uint)ThreadState.X0, Is.EqualTo(Wd));
  1095. }
  1096. else
  1097. {
  1098. Assert.That((uint)ThreadState.X31, Is.EqualTo(_W31));
  1099. }
  1100. }
  1101. [Test, Description("ORN <Xd>, <Xn>, <Xm>{, <shift> #<amount>}")]
  1102. public void Orn_64bit([Values(0u, 31u)] uint Rd,
  1103. [Values(1u, 31u)] uint Rn,
  1104. [Values(2u, 31u)] uint Rm,
  1105. [Values(0x0000000000000000ul, 0x7FFFFFFFFFFFFFFFul,
  1106. 0x8000000000000000ul, 0xFFFFFFFFFFFFFFFFul)] [Random(1)] ulong Xn,
  1107. [Values(0x0000000000000000ul, 0x7FFFFFFFFFFFFFFFul,
  1108. 0x8000000000000000ul, 0xFFFFFFFFFFFFFFFFul)] [Random(1)] ulong Xm,
  1109. [Values(0b00u, 0b01u, 0b10u, 0b11u)] uint shift, // <LSL, LSR, ASR, ROR>
  1110. [Values(0u, 31u, 32u, 63u)] [Random(0u, 63u, 1)] uint amount)
  1111. {
  1112. uint Opcode = 0xAA200000; // ORN X0, X0, X0, LSL #0
  1113. Opcode |= ((Rm & 31) << 16) | ((Rn & 31) << 5) | ((Rd & 31) << 0);
  1114. Opcode |= ((shift & 3) << 22) | ((amount & 63) << 10);
  1115. ulong _X31 = TestContext.CurrentContext.Random.NextULong();
  1116. AThreadState ThreadState = SingleOpcode(Opcode, X1: Xn, X2: Xm, X31: _X31);
  1117. if (Rd != 31)
  1118. {
  1119. Bits Op = new Bits(Opcode);
  1120. AArch64.X((int)Rn, new Bits(Xn));
  1121. AArch64.X((int)Rm, new Bits(Xm));
  1122. Base.Orn(Op[31], Op[23, 22], Op[20, 16], Op[15, 10], Op[9, 5], Op[4, 0]);
  1123. ulong Xd = AArch64.X(64, (int)Rd).ToUInt64();
  1124. Assert.That((ulong)ThreadState.X0, Is.EqualTo(Xd));
  1125. }
  1126. else
  1127. {
  1128. Assert.That((ulong)ThreadState.X31, Is.EqualTo(_X31));
  1129. }
  1130. }
  1131. [Test, Description("ORN <Wd>, <Wn>, <Wm>{, <shift> #<amount>}")]
  1132. public void Orn_32bit([Values(0u, 31u)] uint Rd,
  1133. [Values(1u, 31u)] uint Rn,
  1134. [Values(2u, 31u)] uint Rm,
  1135. [Values(0x00000000u, 0x7FFFFFFFu,
  1136. 0x80000000u, 0xFFFFFFFFu)] [Random(1)] uint Wn,
  1137. [Values(0x00000000u, 0x7FFFFFFFu,
  1138. 0x80000000u, 0xFFFFFFFFu)] [Random(1)] uint Wm,
  1139. [Values(0b00u, 0b01u, 0b10u, 0b11u)] uint shift, // <LSL, LSR, ASR, ROR>
  1140. [Values(0u, 15u, 16u, 31u)] [Random(0u, 31u, 1)] uint amount)
  1141. {
  1142. uint Opcode = 0x2A200000; // ORN W0, W0, W0, LSL #0
  1143. Opcode |= ((Rm & 31) << 16) | ((Rn & 31) << 5) | ((Rd & 31) << 0);
  1144. Opcode |= ((shift & 3) << 22) | ((amount & 63) << 10);
  1145. uint _W31 = TestContext.CurrentContext.Random.NextUInt();
  1146. AThreadState ThreadState = SingleOpcode(Opcode, X1: Wn, X2: Wm, X31: _W31);
  1147. if (Rd != 31)
  1148. {
  1149. Bits Op = new Bits(Opcode);
  1150. AArch64.X((int)Rn, new Bits(Wn));
  1151. AArch64.X((int)Rm, new Bits(Wm));
  1152. Base.Orn(Op[31], Op[23, 22], Op[20, 16], Op[15, 10], Op[9, 5], Op[4, 0]);
  1153. uint Wd = AArch64.X(32, (int)Rd).ToUInt32();
  1154. Assert.That((uint)ThreadState.X0, Is.EqualTo(Wd));
  1155. }
  1156. else
  1157. {
  1158. Assert.That((uint)ThreadState.X31, Is.EqualTo(_W31));
  1159. }
  1160. }
  1161. [Test, Description("ORR <Xd>, <Xn>, <Xm>{, <shift> #<amount>}")]
  1162. public void Orr_64bit([Values(0u, 31u)] uint Rd,
  1163. [Values(1u, 31u)] uint Rn,
  1164. [Values(2u, 31u)] uint Rm,
  1165. [Values(0x0000000000000000ul, 0x7FFFFFFFFFFFFFFFul,
  1166. 0x8000000000000000ul, 0xFFFFFFFFFFFFFFFFul)] [Random(1)] ulong Xn,
  1167. [Values(0x0000000000000000ul, 0x7FFFFFFFFFFFFFFFul,
  1168. 0x8000000000000000ul, 0xFFFFFFFFFFFFFFFFul)] [Random(1)] ulong Xm,
  1169. [Values(0b00u, 0b01u, 0b10u, 0b11u)] uint shift, // <LSL, LSR, ASR, ROR>
  1170. [Values(0u, 31u, 32u, 63u)] [Random(0u, 63u, 1)] uint amount)
  1171. {
  1172. uint Opcode = 0xAA000000; // ORR X0, X0, X0, LSL #0
  1173. Opcode |= ((Rm & 31) << 16) | ((Rn & 31) << 5) | ((Rd & 31) << 0);
  1174. Opcode |= ((shift & 3) << 22) | ((amount & 63) << 10);
  1175. ulong _X31 = TestContext.CurrentContext.Random.NextULong();
  1176. AThreadState ThreadState = SingleOpcode(Opcode, X1: Xn, X2: Xm, X31: _X31);
  1177. if (Rd != 31)
  1178. {
  1179. Bits Op = new Bits(Opcode);
  1180. AArch64.X((int)Rn, new Bits(Xn));
  1181. AArch64.X((int)Rm, new Bits(Xm));
  1182. Base.Orr_Rs(Op[31], Op[23, 22], Op[20, 16], Op[15, 10], Op[9, 5], Op[4, 0]);
  1183. ulong Xd = AArch64.X(64, (int)Rd).ToUInt64();
  1184. Assert.That((ulong)ThreadState.X0, Is.EqualTo(Xd));
  1185. }
  1186. else
  1187. {
  1188. Assert.That((ulong)ThreadState.X31, Is.EqualTo(_X31));
  1189. }
  1190. }
  1191. [Test, Description("ORR <Wd>, <Wn>, <Wm>{, <shift> #<amount>}")]
  1192. public void Orr_32bit([Values(0u, 31u)] uint Rd,
  1193. [Values(1u, 31u)] uint Rn,
  1194. [Values(2u, 31u)] uint Rm,
  1195. [Values(0x00000000u, 0x7FFFFFFFu,
  1196. 0x80000000u, 0xFFFFFFFFu)] [Random(1)] uint Wn,
  1197. [Values(0x00000000u, 0x7FFFFFFFu,
  1198. 0x80000000u, 0xFFFFFFFFu)] [Random(1)] uint Wm,
  1199. [Values(0b00u, 0b01u, 0b10u, 0b11u)] uint shift, // <LSL, LSR, ASR, ROR>
  1200. [Values(0u, 15u, 16u, 31u)] [Random(0u, 31u, 1)] uint amount)
  1201. {
  1202. uint Opcode = 0x2A000000; // ORR W0, W0, W0, LSL #0
  1203. Opcode |= ((Rm & 31) << 16) | ((Rn & 31) << 5) | ((Rd & 31) << 0);
  1204. Opcode |= ((shift & 3) << 22) | ((amount & 63) << 10);
  1205. uint _W31 = TestContext.CurrentContext.Random.NextUInt();
  1206. AThreadState ThreadState = SingleOpcode(Opcode, X1: Wn, X2: Wm, X31: _W31);
  1207. if (Rd != 31)
  1208. {
  1209. Bits Op = new Bits(Opcode);
  1210. AArch64.X((int)Rn, new Bits(Wn));
  1211. AArch64.X((int)Rm, new Bits(Wm));
  1212. Base.Orr_Rs(Op[31], Op[23, 22], Op[20, 16], Op[15, 10], Op[9, 5], Op[4, 0]);
  1213. uint Wd = AArch64.X(32, (int)Rd).ToUInt32();
  1214. Assert.That((uint)ThreadState.X0, Is.EqualTo(Wd));
  1215. }
  1216. else
  1217. {
  1218. Assert.That((uint)ThreadState.X31, Is.EqualTo(_W31));
  1219. }
  1220. }
  1221. [Test, Description("RORV <Xd>, <Xn>, <Xm>")]
  1222. public void Rorv_64bit([Values(0u, 31u)] uint Rd,
  1223. [Values(1u, 31u)] uint Rn,
  1224. [Values(2u, 31u)] uint Rm,
  1225. [Values(0x0000000000000000ul, 0x7FFFFFFFFFFFFFFFul,
  1226. 0x8000000000000000ul, 0xFFFFFFFFFFFFFFFFul)] [Random(8)] ulong Xn,
  1227. [Values(0ul, 31ul, 32ul, 63ul, 0x7FFFFFFFFFFFFFFFul,
  1228. 0x8000000000000000ul, 0xFFFFFFFFFFFFFFFFul)] [Random(5)] ulong Xm)
  1229. {
  1230. uint Opcode = 0x9AC02C00; // RORV X0, X0, X0
  1231. Opcode |= ((Rm & 31) << 16) | ((Rn & 31) << 5) | ((Rd & 31) << 0);
  1232. ulong _X31 = TestContext.CurrentContext.Random.NextULong();
  1233. AThreadState ThreadState = SingleOpcode(Opcode, X1: Xn, X2: Xm, X31: _X31);
  1234. if (Rd != 31)
  1235. {
  1236. Bits Op = new Bits(Opcode);
  1237. AArch64.X((int)Rn, new Bits(Xn));
  1238. AArch64.X((int)Rm, new Bits(Xm));
  1239. Base.Rorv(Op[31], Op[20, 16], Op[9, 5], Op[4, 0]);
  1240. ulong Xd = AArch64.X(64, (int)Rd).ToUInt64();
  1241. Assert.That((ulong)ThreadState.X0, Is.EqualTo(Xd));
  1242. }
  1243. else
  1244. {
  1245. Assert.That((ulong)ThreadState.X31, Is.EqualTo(_X31));
  1246. }
  1247. }
  1248. [Test, Description("RORV <Wd>, <Wn>, <Wm>")]
  1249. public void Rorv_32bit([Values(0u, 31u)] uint Rd,
  1250. [Values(1u, 31u)] uint Rn,
  1251. [Values(2u, 31u)] uint Rm,
  1252. [Values(0x00000000u, 0x7FFFFFFFu,
  1253. 0x80000000u, 0xFFFFFFFFu)] [Random(8)] uint Wn,
  1254. [Values(0u, 15u, 16u, 31u, 0x7FFFFFFFu,
  1255. 0x80000000u, 0xFFFFFFFFu)] [Random(5)] uint Wm)
  1256. {
  1257. uint Opcode = 0x1AC02C00; // RORV W0, W0, W0
  1258. Opcode |= ((Rm & 31) << 16) | ((Rn & 31) << 5) | ((Rd & 31) << 0);
  1259. uint _W31 = TestContext.CurrentContext.Random.NextUInt();
  1260. AThreadState ThreadState = SingleOpcode(Opcode, X1: Wn, X2: Wm, X31: _W31);
  1261. if (Rd != 31)
  1262. {
  1263. Bits Op = new Bits(Opcode);
  1264. AArch64.X((int)Rn, new Bits(Wn));
  1265. AArch64.X((int)Rm, new Bits(Wm));
  1266. Base.Rorv(Op[31], Op[20, 16], Op[9, 5], Op[4, 0]);
  1267. uint Wd = AArch64.X(32, (int)Rd).ToUInt32();
  1268. Assert.That((uint)ThreadState.X0, Is.EqualTo(Wd));
  1269. }
  1270. else
  1271. {
  1272. Assert.That((uint)ThreadState.X31, Is.EqualTo(_W31));
  1273. }
  1274. }
  1275. [Test, Description("SBC <Xd>, <Xn>, <Xm>")]
  1276. public void Sbc_64bit([Values(0u, 31u)] uint Rd,
  1277. [Values(1u, 31u)] uint Rn,
  1278. [Values(2u, 31u)] uint Rm,
  1279. [Values(0x0000000000000000ul, 0x7FFFFFFFFFFFFFFFul,
  1280. 0x8000000000000000ul, 0xFFFFFFFFFFFFFFFFul)] [Random(4)] ulong Xn,
  1281. [Values(0x0000000000000000ul, 0x7FFFFFFFFFFFFFFFul,
  1282. 0x8000000000000000ul, 0xFFFFFFFFFFFFFFFFul)] [Random(4)] ulong Xm,
  1283. [Values] bool CarryIn)
  1284. {
  1285. uint Opcode = 0xDA000000; // SBC X0, X0, X0
  1286. Opcode |= ((Rm & 31) << 16) | ((Rn & 31) << 5) | ((Rd & 31) << 0);
  1287. ulong _X31 = TestContext.CurrentContext.Random.NextULong();
  1288. AThreadState ThreadState = SingleOpcode(Opcode, X1: Xn, X2: Xm, X31: _X31, Carry: CarryIn);
  1289. if (Rd != 31)
  1290. {
  1291. Bits Op = new Bits(Opcode);
  1292. AArch64.X((int)Rn, new Bits(Xn));
  1293. AArch64.X((int)Rm, new Bits(Xm));
  1294. Shared.PSTATE.C = CarryIn;
  1295. Base.Sbc(Op[31], Op[20, 16], Op[9, 5], Op[4, 0]);
  1296. ulong Xd = AArch64.X(64, (int)Rd).ToUInt64();
  1297. Assert.That((ulong)ThreadState.X0, Is.EqualTo(Xd));
  1298. }
  1299. else
  1300. {
  1301. Assert.That((ulong)ThreadState.X31, Is.EqualTo(_X31));
  1302. }
  1303. }
  1304. [Test, Description("SBC <Wd>, <Wn>, <Wm>")]
  1305. public void Sbc_32bit([Values(0u, 31u)] uint Rd,
  1306. [Values(1u, 31u)] uint Rn,
  1307. [Values(2u, 31u)] uint Rm,
  1308. [Values(0x00000000u, 0x7FFFFFFFu,
  1309. 0x80000000u, 0xFFFFFFFFu)] [Random(4)] uint Wn,
  1310. [Values(0x00000000u, 0x7FFFFFFFu,
  1311. 0x80000000u, 0xFFFFFFFFu)] [Random(4)] uint Wm,
  1312. [Values] bool CarryIn)
  1313. {
  1314. uint Opcode = 0x5A000000; // SBC W0, W0, W0
  1315. Opcode |= ((Rm & 31) << 16) | ((Rn & 31) << 5) | ((Rd & 31) << 0);
  1316. uint _W31 = TestContext.CurrentContext.Random.NextUInt();
  1317. AThreadState ThreadState = SingleOpcode(Opcode, X1: Wn, X2: Wm, X31: _W31, Carry: CarryIn);
  1318. if (Rd != 31)
  1319. {
  1320. Bits Op = new Bits(Opcode);
  1321. AArch64.X((int)Rn, new Bits(Wn));
  1322. AArch64.X((int)Rm, new Bits(Wm));
  1323. Shared.PSTATE.C = CarryIn;
  1324. Base.Sbc(Op[31], Op[20, 16], Op[9, 5], Op[4, 0]);
  1325. uint Wd = AArch64.X(32, (int)Rd).ToUInt32();
  1326. Assert.That((uint)ThreadState.X0, Is.EqualTo(Wd));
  1327. }
  1328. else
  1329. {
  1330. Assert.That((uint)ThreadState.X31, Is.EqualTo(_W31));
  1331. }
  1332. }
  1333. [Test, Description("SBCS <Xd>, <Xn>, <Xm>")]
  1334. public void Sbcs_64bit([Values(0u, 31u)] uint Rd,
  1335. [Values(1u, 31u)] uint Rn,
  1336. [Values(2u, 31u)] uint Rm,
  1337. [Values(0x0000000000000000ul, 0x7FFFFFFFFFFFFFFFul,
  1338. 0x8000000000000000ul, 0xFFFFFFFFFFFFFFFFul)] [Random(4)] ulong Xn,
  1339. [Values(0x0000000000000000ul, 0x7FFFFFFFFFFFFFFFul,
  1340. 0x8000000000000000ul, 0xFFFFFFFFFFFFFFFFul)] [Random(4)] ulong Xm,
  1341. [Values] bool CarryIn)
  1342. {
  1343. uint Opcode = 0xFA000000; // SBCS X0, X0, X0
  1344. Opcode |= ((Rm & 31) << 16) | ((Rn & 31) << 5) | ((Rd & 31) << 0);
  1345. Bits Op = new Bits(Opcode);
  1346. ulong _X31 = TestContext.CurrentContext.Random.NextULong();
  1347. AThreadState ThreadState = SingleOpcode(Opcode, X1: Xn, X2: Xm, X31: _X31, Carry: CarryIn);
  1348. AArch64.X((int)Rn, new Bits(Xn));
  1349. AArch64.X((int)Rm, new Bits(Xm));
  1350. Shared.PSTATE.C = CarryIn;
  1351. Base.Sbcs(Op[31], Op[20, 16], Op[9, 5], Op[4, 0]);
  1352. ulong Xd = AArch64.X(64, (int)Rd).ToUInt64();
  1353. if (Rd != 31)
  1354. {
  1355. Assert.That((ulong)ThreadState.X0, Is.EqualTo(Xd));
  1356. }
  1357. else
  1358. {
  1359. Assert.That((ulong)ThreadState.X31, Is.EqualTo(_X31));
  1360. }
  1361. Assert.Multiple(() =>
  1362. {
  1363. Assert.That(ThreadState.Negative, Is.EqualTo(Shared.PSTATE.N));
  1364. Assert.That(ThreadState.Zero, Is.EqualTo(Shared.PSTATE.Z));
  1365. Assert.That(ThreadState.Carry, Is.EqualTo(Shared.PSTATE.C));
  1366. Assert.That(ThreadState.Overflow, Is.EqualTo(Shared.PSTATE.V));
  1367. });
  1368. }
  1369. [Test, Description("SBCS <Wd>, <Wn>, <Wm>")]
  1370. public void Sbcs_32bit([Values(0u, 31u)] uint Rd,
  1371. [Values(1u, 31u)] uint Rn,
  1372. [Values(2u, 31u)] uint Rm,
  1373. [Values(0x00000000u, 0x7FFFFFFFu,
  1374. 0x80000000u, 0xFFFFFFFFu)] [Random(4)] uint Wn,
  1375. [Values(0x00000000u, 0x7FFFFFFFu,
  1376. 0x80000000u, 0xFFFFFFFFu)] [Random(4)] uint Wm,
  1377. [Values] bool CarryIn)
  1378. {
  1379. uint Opcode = 0x7A000000; // SBCS W0, W0, W0
  1380. Opcode |= ((Rm & 31) << 16) | ((Rn & 31) << 5) | ((Rd & 31) << 0);
  1381. Bits Op = new Bits(Opcode);
  1382. uint _W31 = TestContext.CurrentContext.Random.NextUInt();
  1383. AThreadState ThreadState = SingleOpcode(Opcode, X1: Wn, X2: Wm, X31: _W31, Carry: CarryIn);
  1384. AArch64.X((int)Rn, new Bits(Wn));
  1385. AArch64.X((int)Rm, new Bits(Wm));
  1386. Shared.PSTATE.C = CarryIn;
  1387. Base.Sbcs(Op[31], Op[20, 16], Op[9, 5], Op[4, 0]);
  1388. uint Wd = AArch64.X(32, (int)Rd).ToUInt32();
  1389. if (Rd != 31)
  1390. {
  1391. Assert.That((uint)ThreadState.X0, Is.EqualTo(Wd));
  1392. }
  1393. else
  1394. {
  1395. Assert.That((uint)ThreadState.X31, Is.EqualTo(_W31));
  1396. }
  1397. Assert.Multiple(() =>
  1398. {
  1399. Assert.That(ThreadState.Negative, Is.EqualTo(Shared.PSTATE.N));
  1400. Assert.That(ThreadState.Zero, Is.EqualTo(Shared.PSTATE.Z));
  1401. Assert.That(ThreadState.Carry, Is.EqualTo(Shared.PSTATE.C));
  1402. Assert.That(ThreadState.Overflow, Is.EqualTo(Shared.PSTATE.V));
  1403. });
  1404. }
  1405. [Test, Description("SDIV <Xd>, <Xn>, <Xm>")]
  1406. public void Sdiv_64bit([Values(0u, 31u)] uint Rd,
  1407. [Values(1u, 31u)] uint Rn,
  1408. [Values(2u, 31u)] uint Rm,
  1409. [Values(0x0000000000000000ul, 0x7FFFFFFFFFFFFFFFul,
  1410. 0x8000000000000000ul, 0xFFFFFFFFFFFFFFFFul)] [Random(8)] ulong Xn,
  1411. [Values(0x0000000000000000ul, 0x7FFFFFFFFFFFFFFFul,
  1412. 0x8000000000000000ul, 0xFFFFFFFFFFFFFFFFul)] [Random(8)] ulong Xm)
  1413. {
  1414. uint Opcode = 0x9AC00C00; // SDIV X0, X0, X0
  1415. Opcode |= ((Rm & 31) << 16) | ((Rn & 31) << 5) | ((Rd & 31) << 0);
  1416. ulong _X31 = TestContext.CurrentContext.Random.NextULong();
  1417. AThreadState ThreadState = SingleOpcode(Opcode, X1: Xn, X2: Xm, X31: _X31);
  1418. if (Rd != 31)
  1419. {
  1420. Bits Op = new Bits(Opcode);
  1421. AArch64.X((int)Rn, new Bits(Xn));
  1422. AArch64.X((int)Rm, new Bits(Xm));
  1423. Base.Sdiv(Op[31], Op[20, 16], Op[9, 5], Op[4, 0]);
  1424. ulong Xd = AArch64.X(64, (int)Rd).ToUInt64();
  1425. Assert.That((ulong)ThreadState.X0, Is.EqualTo(Xd));
  1426. }
  1427. else
  1428. {
  1429. Assert.That((ulong)ThreadState.X31, Is.EqualTo(_X31));
  1430. }
  1431. }
  1432. [Test, Description("SDIV <Wd>, <Wn>, <Wm>")]
  1433. public void Sdiv_32bit([Values(0u, 31u)] uint Rd,
  1434. [Values(1u, 31u)] uint Rn,
  1435. [Values(2u, 31u)] uint Rm,
  1436. [Values(0x00000000u, 0x7FFFFFFFu,
  1437. 0x80000000u, 0xFFFFFFFFu)] [Random(8)] uint Wn,
  1438. [Values(0x00000000u, 0x7FFFFFFFu,
  1439. 0x80000000u, 0xFFFFFFFFu)] [Random(8)] uint Wm)
  1440. {
  1441. uint Opcode = 0x1AC00C00; // SDIV W0, W0, W0
  1442. Opcode |= ((Rm & 31) << 16) | ((Rn & 31) << 5) | ((Rd & 31) << 0);
  1443. uint _W31 = TestContext.CurrentContext.Random.NextUInt();
  1444. AThreadState ThreadState = SingleOpcode(Opcode, X1: Wn, X2: Wm, X31: _W31);
  1445. if (Rd != 31)
  1446. {
  1447. Bits Op = new Bits(Opcode);
  1448. AArch64.X((int)Rn, new Bits(Wn));
  1449. AArch64.X((int)Rm, new Bits(Wm));
  1450. Base.Sdiv(Op[31], Op[20, 16], Op[9, 5], Op[4, 0]);
  1451. uint Wd = AArch64.X(32, (int)Rd).ToUInt32();
  1452. Assert.That((uint)ThreadState.X0, Is.EqualTo(Wd));
  1453. }
  1454. else
  1455. {
  1456. Assert.That((uint)ThreadState.X31, Is.EqualTo(_W31));
  1457. }
  1458. }
  1459. [Test, Description("SUB <Xd>, <Xn>, <Xm>{, <shift> #<amount>}")]
  1460. public void Sub_64bit([Values(0u, 31u)] uint Rd,
  1461. [Values(1u, 31u)] uint Rn,
  1462. [Values(2u, 31u)] uint Rm,
  1463. [Values(0x0000000000000000ul, 0x7FFFFFFFFFFFFFFFul,
  1464. 0x8000000000000000ul, 0xFFFFFFFFFFFFFFFFul)] [Random(1)] ulong Xn,
  1465. [Values(0x0000000000000000ul, 0x7FFFFFFFFFFFFFFFul,
  1466. 0x8000000000000000ul, 0xFFFFFFFFFFFFFFFFul)] [Random(1)] ulong Xm,
  1467. [Values(0b00u, 0b01u, 0b10u)] uint shift, // <LSL, LSR, ASR>
  1468. [Values(0u, 31u, 32u, 63u)] [Random(0u, 63u, 1)] uint amount)
  1469. {
  1470. uint Opcode = 0xCB000000; // SUB X0, X0, X0, LSL #0
  1471. Opcode |= ((Rm & 31) << 16) | ((Rn & 31) << 5) | ((Rd & 31) << 0);
  1472. Opcode |= ((shift & 3) << 22) | ((amount & 63) << 10);
  1473. ulong _X31 = TestContext.CurrentContext.Random.NextULong();
  1474. AThreadState ThreadState = SingleOpcode(Opcode, X1: Xn, X2: Xm, X31: _X31);
  1475. if (Rd != 31)
  1476. {
  1477. Bits Op = new Bits(Opcode);
  1478. AArch64.X((int)Rn, new Bits(Xn));
  1479. AArch64.X((int)Rm, new Bits(Xm));
  1480. Base.Sub_Rs(Op[31], Op[23, 22], Op[20, 16], Op[15, 10], Op[9, 5], Op[4, 0]);
  1481. ulong Xd = AArch64.X(64, (int)Rd).ToUInt64();
  1482. Assert.That((ulong)ThreadState.X0, Is.EqualTo(Xd));
  1483. }
  1484. else
  1485. {
  1486. Assert.That((ulong)ThreadState.X31, Is.EqualTo(_X31));
  1487. }
  1488. }
  1489. [Test, Description("SUB <Wd>, <Wn>, <Wm>{, <shift> #<amount>}")]
  1490. public void Sub_32bit([Values(0u, 31u)] uint Rd,
  1491. [Values(1u, 31u)] uint Rn,
  1492. [Values(2u, 31u)] uint Rm,
  1493. [Values(0x00000000u, 0x7FFFFFFFu,
  1494. 0x80000000u, 0xFFFFFFFFu)] [Random(1)] uint Wn,
  1495. [Values(0x00000000u, 0x7FFFFFFFu,
  1496. 0x80000000u, 0xFFFFFFFFu)] [Random(1)] uint Wm,
  1497. [Values(0b00u, 0b01u, 0b10u)] uint shift, // <LSL, LSR, ASR>
  1498. [Values(0u, 15u, 16u, 31u)] [Random(0u, 31u, 1)] uint amount)
  1499. {
  1500. uint Opcode = 0x4B000000; // SUB W0, W0, W0, LSL #0
  1501. Opcode |= ((Rm & 31) << 16) | ((Rn & 31) << 5) | ((Rd & 31) << 0);
  1502. Opcode |= ((shift & 3) << 22) | ((amount & 63) << 10);
  1503. uint _W31 = TestContext.CurrentContext.Random.NextUInt();
  1504. AThreadState ThreadState = SingleOpcode(Opcode, X1: Wn, X2: Wm, X31: _W31);
  1505. if (Rd != 31)
  1506. {
  1507. Bits Op = new Bits(Opcode);
  1508. AArch64.X((int)Rn, new Bits(Wn));
  1509. AArch64.X((int)Rm, new Bits(Wm));
  1510. Base.Sub_Rs(Op[31], Op[23, 22], Op[20, 16], Op[15, 10], Op[9, 5], Op[4, 0]);
  1511. uint Wd = AArch64.X(32, (int)Rd).ToUInt32();
  1512. Assert.That((uint)ThreadState.X0, Is.EqualTo(Wd));
  1513. }
  1514. else
  1515. {
  1516. Assert.That((uint)ThreadState.X31, Is.EqualTo(_W31));
  1517. }
  1518. }
  1519. [Test, Description("SUBS <Xd>, <Xn>, <Xm>{, <shift> #<amount>}")]
  1520. public void Subs_64bit([Values(0u, 31u)] uint Rd,
  1521. [Values(1u, 31u)] uint Rn,
  1522. [Values(2u, 31u)] uint Rm,
  1523. [Values(0x0000000000000000ul, 0x7FFFFFFFFFFFFFFFul,
  1524. 0x8000000000000000ul, 0xFFFFFFFFFFFFFFFFul)] [Random(1)] ulong Xn,
  1525. [Values(0x0000000000000000ul, 0x7FFFFFFFFFFFFFFFul,
  1526. 0x8000000000000000ul, 0xFFFFFFFFFFFFFFFFul)] [Random(1)] ulong Xm,
  1527. [Values(0b00u, 0b01u, 0b10u)] uint shift, // <LSL, LSR, ASR>
  1528. [Values(0u, 31u, 32u, 63u)] [Random(0u, 63u, 1)] uint amount)
  1529. {
  1530. uint Opcode = 0xEB000000; // SUBS X0, X0, X0, LSL #0
  1531. Opcode |= ((Rm & 31) << 16) | ((Rn & 31) << 5) | ((Rd & 31) << 0);
  1532. Opcode |= ((shift & 3) << 22) | ((amount & 63) << 10);
  1533. Bits Op = new Bits(Opcode);
  1534. ulong _X31 = TestContext.CurrentContext.Random.NextULong();
  1535. AThreadState ThreadState = SingleOpcode(Opcode, X1: Xn, X2: Xm, X31: _X31);
  1536. AArch64.X((int)Rn, new Bits(Xn));
  1537. AArch64.X((int)Rm, new Bits(Xm));
  1538. Base.Subs_Rs(Op[31], Op[23, 22], Op[20, 16], Op[15, 10], Op[9, 5], Op[4, 0]);
  1539. ulong Xd = AArch64.X(64, (int)Rd).ToUInt64();
  1540. if (Rd != 31)
  1541. {
  1542. Assert.That((ulong)ThreadState.X0, Is.EqualTo(Xd));
  1543. }
  1544. else
  1545. {
  1546. Assert.That((ulong)ThreadState.X31, Is.EqualTo(_X31));
  1547. }
  1548. Assert.Multiple(() =>
  1549. {
  1550. Assert.That(ThreadState.Negative, Is.EqualTo(Shared.PSTATE.N));
  1551. Assert.That(ThreadState.Zero, Is.EqualTo(Shared.PSTATE.Z));
  1552. Assert.That(ThreadState.Carry, Is.EqualTo(Shared.PSTATE.C));
  1553. Assert.That(ThreadState.Overflow, Is.EqualTo(Shared.PSTATE.V));
  1554. });
  1555. }
  1556. [Test, Description("SUBS <Wd>, <Wn>, <Wm>{, <shift> #<amount>}")]
  1557. public void Subs_32bit([Values(0u, 31u)] uint Rd,
  1558. [Values(1u, 31u)] uint Rn,
  1559. [Values(2u, 31u)] uint Rm,
  1560. [Values(0x00000000u, 0x7FFFFFFFu,
  1561. 0x80000000u, 0xFFFFFFFFu)] [Random(1)] uint Wn,
  1562. [Values(0x00000000u, 0x7FFFFFFFu,
  1563. 0x80000000u, 0xFFFFFFFFu)] [Random(1)] uint Wm,
  1564. [Values(0b00u, 0b01u, 0b10u)] uint shift, // <LSL, LSR, ASR>
  1565. [Values(0u, 15u, 16u, 31u)] [Random(0u, 31u, 1)] uint amount)
  1566. {
  1567. uint Opcode = 0x6B000000; // SUBS W0, W0, W0, LSL #0
  1568. Opcode |= ((Rm & 31) << 16) | ((Rn & 31) << 5) | ((Rd & 31) << 0);
  1569. Opcode |= ((shift & 3) << 22) | ((amount & 63) << 10);
  1570. Bits Op = new Bits(Opcode);
  1571. uint _W31 = TestContext.CurrentContext.Random.NextUInt();
  1572. AThreadState ThreadState = SingleOpcode(Opcode, X1: Wn, X2: Wm, X31: _W31);
  1573. AArch64.X((int)Rn, new Bits(Wn));
  1574. AArch64.X((int)Rm, new Bits(Wm));
  1575. Base.Subs_Rs(Op[31], Op[23, 22], Op[20, 16], Op[15, 10], Op[9, 5], Op[4, 0]);
  1576. uint Wd = AArch64.X(32, (int)Rd).ToUInt32();
  1577. if (Rd != 31)
  1578. {
  1579. Assert.That((uint)ThreadState.X0, Is.EqualTo(Wd));
  1580. }
  1581. else
  1582. {
  1583. Assert.That((uint)ThreadState.X31, Is.EqualTo(_W31));
  1584. }
  1585. Assert.Multiple(() =>
  1586. {
  1587. Assert.That(ThreadState.Negative, Is.EqualTo(Shared.PSTATE.N));
  1588. Assert.That(ThreadState.Zero, Is.EqualTo(Shared.PSTATE.Z));
  1589. Assert.That(ThreadState.Carry, Is.EqualTo(Shared.PSTATE.C));
  1590. Assert.That(ThreadState.Overflow, Is.EqualTo(Shared.PSTATE.V));
  1591. });
  1592. }
  1593. [Test, Description("UDIV <Xd>, <Xn>, <Xm>")]
  1594. public void Udiv_64bit([Values(0u, 31u)] uint Rd,
  1595. [Values(1u, 31u)] uint Rn,
  1596. [Values(2u, 31u)] uint Rm,
  1597. [Values(0x0000000000000000ul, 0x7FFFFFFFFFFFFFFFul,
  1598. 0x8000000000000000ul, 0xFFFFFFFFFFFFFFFFul)] [Random(8)] ulong Xn,
  1599. [Values(0x0000000000000000ul, 0x7FFFFFFFFFFFFFFFul,
  1600. 0x8000000000000000ul, 0xFFFFFFFFFFFFFFFFul)] [Random(8)] ulong Xm)
  1601. {
  1602. uint Opcode = 0x9AC00800; // UDIV X0, X0, X0
  1603. Opcode |= ((Rm & 31) << 16) | ((Rn & 31) << 5) | ((Rd & 31) << 0);
  1604. ulong _X31 = TestContext.CurrentContext.Random.NextULong();
  1605. AThreadState ThreadState = SingleOpcode(Opcode, X1: Xn, X2: Xm, X31: _X31);
  1606. if (Rd != 31)
  1607. {
  1608. Bits Op = new Bits(Opcode);
  1609. AArch64.X((int)Rn, new Bits(Xn));
  1610. AArch64.X((int)Rm, new Bits(Xm));
  1611. Base.Udiv(Op[31], Op[20, 16], Op[9, 5], Op[4, 0]);
  1612. ulong Xd = AArch64.X(64, (int)Rd).ToUInt64();
  1613. Assert.That((ulong)ThreadState.X0, Is.EqualTo(Xd));
  1614. }
  1615. else
  1616. {
  1617. Assert.That((ulong)ThreadState.X31, Is.EqualTo(_X31));
  1618. }
  1619. }
  1620. [Test, Description("UDIV <Wd>, <Wn>, <Wm>")]
  1621. public void Udiv_32bit([Values(0u, 31u)] uint Rd,
  1622. [Values(1u, 31u)] uint Rn,
  1623. [Values(2u, 31u)] uint Rm,
  1624. [Values(0x00000000u, 0x7FFFFFFFu,
  1625. 0x80000000u, 0xFFFFFFFFu)] [Random(8)] uint Wn,
  1626. [Values(0x00000000u, 0x7FFFFFFFu,
  1627. 0x80000000u, 0xFFFFFFFFu)] [Random(8)] uint Wm)
  1628. {
  1629. uint Opcode = 0x1AC00800; // UDIV W0, W0, W0
  1630. Opcode |= ((Rm & 31) << 16) | ((Rn & 31) << 5) | ((Rd & 31) << 0);
  1631. uint _W31 = TestContext.CurrentContext.Random.NextUInt();
  1632. AThreadState ThreadState = SingleOpcode(Opcode, X1: Wn, X2: Wm, X31: _W31);
  1633. if (Rd != 31)
  1634. {
  1635. Bits Op = new Bits(Opcode);
  1636. AArch64.X((int)Rn, new Bits(Wn));
  1637. AArch64.X((int)Rm, new Bits(Wm));
  1638. Base.Udiv(Op[31], Op[20, 16], Op[9, 5], Op[4, 0]);
  1639. uint Wd = AArch64.X(32, (int)Rd).ToUInt32();
  1640. Assert.That((uint)ThreadState.X0, Is.EqualTo(Wd));
  1641. }
  1642. else
  1643. {
  1644. Assert.That((uint)ThreadState.X31, Is.EqualTo(_W31));
  1645. }
  1646. }
  1647. #endif
  1648. }
  1649. }