CpuTestAluRs.cs 86 KB

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