CpuTestAluRs.cs 57 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124
  1. #define AluRs
  2. using ChocolArm64.State;
  3. using NUnit.Framework;
  4. namespace Ryujinx.Tests.Cpu
  5. {
  6. [Category("AluRs")] // Tested: second half of 2018.
  7. public sealed class CpuTestAluRs : CpuTest
  8. {
  9. #if AluRs
  10. private const int RndCnt = 2;
  11. private const int RndCntAmount = 2;
  12. private const int RndCntLsb = 2;
  13. [Test, Pairwise, Description("ADC <Xd>, <Xn>, <Xm>")]
  14. public void Adc_64bit([Values(0u, 31u)] uint Rd,
  15. [Values(1u, 31u)] uint Rn,
  16. [Values(2u, 31u)] uint Rm,
  17. [Values(0x0000000000000000ul, 0x7FFFFFFFFFFFFFFFul,
  18. 0x8000000000000000ul, 0xFFFFFFFFFFFFFFFFul)] [Random(RndCnt)] ulong Xn,
  19. [Values(0x0000000000000000ul, 0x7FFFFFFFFFFFFFFFul,
  20. 0x8000000000000000ul, 0xFFFFFFFFFFFFFFFFul)] [Random(RndCnt)] ulong Xm,
  21. [Values] bool CarryIn)
  22. {
  23. uint Opcode = 0x9A000000; // ADC X0, X0, X0
  24. Opcode |= ((Rm & 31) << 16) | ((Rn & 31) << 5) | ((Rd & 31) << 0);
  25. ulong _X31 = TestContext.CurrentContext.Random.NextULong();
  26. AThreadState ThreadState = SingleOpcode(Opcode, X1: Xn, X2: Xm, X31: _X31, Carry: CarryIn);
  27. CompareAgainstUnicorn();
  28. }
  29. [Test, Pairwise, Description("ADC <Wd>, <Wn>, <Wm>")]
  30. public void Adc_32bit([Values(0u, 31u)] uint Rd,
  31. [Values(1u, 31u)] uint Rn,
  32. [Values(2u, 31u)] uint Rm,
  33. [Values(0x00000000u, 0x7FFFFFFFu,
  34. 0x80000000u, 0xFFFFFFFFu)] [Random(RndCnt)] uint Wn,
  35. [Values(0x00000000u, 0x7FFFFFFFu,
  36. 0x80000000u, 0xFFFFFFFFu)] [Random(RndCnt)] uint Wm,
  37. [Values] bool CarryIn)
  38. {
  39. uint Opcode = 0x1A000000; // ADC W0, W0, W0
  40. Opcode |= ((Rm & 31) << 16) | ((Rn & 31) << 5) | ((Rd & 31) << 0);
  41. uint _W31 = TestContext.CurrentContext.Random.NextUInt();
  42. AThreadState ThreadState = SingleOpcode(Opcode, X1: Wn, X2: Wm, X31: _W31, Carry: CarryIn);
  43. CompareAgainstUnicorn();
  44. }
  45. [Test, Pairwise, Description("ADCS <Xd>, <Xn>, <Xm>")]
  46. public void Adcs_64bit([Values(0u, 31u)] uint Rd,
  47. [Values(1u, 31u)] uint Rn,
  48. [Values(2u, 31u)] uint Rm,
  49. [Values(0x0000000000000000ul, 0x7FFFFFFFFFFFFFFFul,
  50. 0x8000000000000000ul, 0xFFFFFFFFFFFFFFFFul)] [Random(RndCnt)] ulong Xn,
  51. [Values(0x0000000000000000ul, 0x7FFFFFFFFFFFFFFFul,
  52. 0x8000000000000000ul, 0xFFFFFFFFFFFFFFFFul)] [Random(RndCnt)] ulong Xm,
  53. [Values] bool CarryIn)
  54. {
  55. uint Opcode = 0xBA000000; // ADCS X0, X0, X0
  56. Opcode |= ((Rm & 31) << 16) | ((Rn & 31) << 5) | ((Rd & 31) << 0);
  57. ulong _X31 = TestContext.CurrentContext.Random.NextULong();
  58. AThreadState ThreadState = SingleOpcode(Opcode, X1: Xn, X2: Xm, X31: _X31, Carry: CarryIn);
  59. CompareAgainstUnicorn();
  60. }
  61. [Test, Pairwise, Description("ADCS <Wd>, <Wn>, <Wm>")]
  62. public void Adcs_32bit([Values(0u, 31u)] uint Rd,
  63. [Values(1u, 31u)] uint Rn,
  64. [Values(2u, 31u)] uint Rm,
  65. [Values(0x00000000u, 0x7FFFFFFFu,
  66. 0x80000000u, 0xFFFFFFFFu)] [Random(RndCnt)] uint Wn,
  67. [Values(0x00000000u, 0x7FFFFFFFu,
  68. 0x80000000u, 0xFFFFFFFFu)] [Random(RndCnt)] uint Wm,
  69. [Values] bool CarryIn)
  70. {
  71. uint Opcode = 0x3A000000; // ADCS W0, W0, W0
  72. Opcode |= ((Rm & 31) << 16) | ((Rn & 31) << 5) | ((Rd & 31) << 0);
  73. uint _W31 = TestContext.CurrentContext.Random.NextUInt();
  74. AThreadState ThreadState = SingleOpcode(Opcode, X1: Wn, X2: Wm, X31: _W31, Carry: CarryIn);
  75. CompareAgainstUnicorn();
  76. }
  77. [Test, Pairwise, Description("ADD <Xd>, <Xn>, <Xm>{, <shift> #<amount>}")]
  78. public void Add_64bit([Values(0u, 31u)] uint Rd,
  79. [Values(1u, 31u)] uint Rn,
  80. [Values(2u, 31u)] uint Rm,
  81. [Values(0x0000000000000000ul, 0x7FFFFFFFFFFFFFFFul,
  82. 0x8000000000000000ul, 0xFFFFFFFFFFFFFFFFul)] [Random(RndCnt)] ulong Xn,
  83. [Values(0x0000000000000000ul, 0x7FFFFFFFFFFFFFFFul,
  84. 0x8000000000000000ul, 0xFFFFFFFFFFFFFFFFul)] [Random(RndCnt)] ulong Xm,
  85. [Values(0b00u, 0b01u, 0b10u)] uint shift, // <LSL, LSR, ASR>
  86. [Values(0u, 31u, 32u, 63u)] [Random(0u, 63u, RndCntAmount)] uint amount)
  87. {
  88. uint Opcode = 0x8B000000; // ADD X0, X0, X0, LSL #0
  89. Opcode |= ((Rm & 31) << 16) | ((Rn & 31) << 5) | ((Rd & 31) << 0);
  90. Opcode |= ((shift & 3) << 22) | ((amount & 63) << 10);
  91. ulong _X31 = TestContext.CurrentContext.Random.NextULong();
  92. AThreadState ThreadState = SingleOpcode(Opcode, X1: Xn, X2: Xm, X31: _X31);
  93. CompareAgainstUnicorn();
  94. }
  95. [Test, Pairwise, Description("ADD <Wd>, <Wn>, <Wm>{, <shift> #<amount>}")]
  96. public void Add_32bit([Values(0u, 31u)] uint Rd,
  97. [Values(1u, 31u)] uint Rn,
  98. [Values(2u, 31u)] uint Rm,
  99. [Values(0x00000000u, 0x7FFFFFFFu,
  100. 0x80000000u, 0xFFFFFFFFu)] [Random(RndCnt)] uint Wn,
  101. [Values(0x00000000u, 0x7FFFFFFFu,
  102. 0x80000000u, 0xFFFFFFFFu)] [Random(RndCnt)] uint Wm,
  103. [Values(0b00u, 0b01u, 0b10u)] uint shift, // <LSL, LSR, ASR>
  104. [Values(0u, 15u, 16u, 31u)] [Random(0u, 31u, RndCntAmount)] uint amount)
  105. {
  106. uint Opcode = 0x0B000000; // ADD W0, W0, W0, LSL #0
  107. Opcode |= ((Rm & 31) << 16) | ((Rn & 31) << 5) | ((Rd & 31) << 0);
  108. Opcode |= ((shift & 3) << 22) | ((amount & 63) << 10);
  109. uint _W31 = TestContext.CurrentContext.Random.NextUInt();
  110. AThreadState ThreadState = SingleOpcode(Opcode, X1: Wn, X2: Wm, X31: _W31);
  111. CompareAgainstUnicorn();
  112. }
  113. [Test, Pairwise, Description("ADDS <Xd>, <Xn>, <Xm>{, <shift> #<amount>}")]
  114. public void Adds_64bit([Values(0u, 31u)] uint Rd,
  115. [Values(1u, 31u)] uint Rn,
  116. [Values(2u, 31u)] uint Rm,
  117. [Values(0x0000000000000000ul, 0x7FFFFFFFFFFFFFFFul,
  118. 0x8000000000000000ul, 0xFFFFFFFFFFFFFFFFul)] [Random(RndCnt)] ulong Xn,
  119. [Values(0x0000000000000000ul, 0x7FFFFFFFFFFFFFFFul,
  120. 0x8000000000000000ul, 0xFFFFFFFFFFFFFFFFul)] [Random(RndCnt)] ulong Xm,
  121. [Values(0b00u, 0b01u, 0b10u)] uint shift, // <LSL, LSR, ASR>
  122. [Values(0u, 31u, 32u, 63u)] [Random(0u, 63u, RndCntAmount)] uint amount)
  123. {
  124. uint Opcode = 0xAB000000; // ADDS X0, X0, X0, LSL #0
  125. Opcode |= ((Rm & 31) << 16) | ((Rn & 31) << 5) | ((Rd & 31) << 0);
  126. Opcode |= ((shift & 3) << 22) | ((amount & 63) << 10);
  127. ulong _X31 = TestContext.CurrentContext.Random.NextULong();
  128. AThreadState ThreadState = SingleOpcode(Opcode, X1: Xn, X2: Xm, X31: _X31);
  129. CompareAgainstUnicorn();
  130. }
  131. [Test, Pairwise, Description("ADDS <Wd>, <Wn>, <Wm>{, <shift> #<amount>}")]
  132. public void Adds_32bit([Values(0u, 31u)] uint Rd,
  133. [Values(1u, 31u)] uint Rn,
  134. [Values(2u, 31u)] uint Rm,
  135. [Values(0x00000000u, 0x7FFFFFFFu,
  136. 0x80000000u, 0xFFFFFFFFu)] [Random(RndCnt)] uint Wn,
  137. [Values(0x00000000u, 0x7FFFFFFFu,
  138. 0x80000000u, 0xFFFFFFFFu)] [Random(RndCnt)] uint Wm,
  139. [Values(0b00u, 0b01u, 0b10u)] uint shift, // <LSL, LSR, ASR>
  140. [Values(0u, 15u, 16u, 31u)] [Random(0u, 31u, RndCntAmount)] uint amount)
  141. {
  142. uint Opcode = 0x2B000000; // ADDS W0, W0, W0, LSL #0
  143. Opcode |= ((Rm & 31) << 16) | ((Rn & 31) << 5) | ((Rd & 31) << 0);
  144. Opcode |= ((shift & 3) << 22) | ((amount & 63) << 10);
  145. uint _W31 = TestContext.CurrentContext.Random.NextUInt();
  146. AThreadState ThreadState = SingleOpcode(Opcode, X1: Wn, X2: Wm, X31: _W31);
  147. CompareAgainstUnicorn();
  148. }
  149. [Test, Pairwise, Description("AND <Xd>, <Xn>, <Xm>{, <shift> #<amount>}")]
  150. public void And_64bit([Values(0u, 31u)] uint Rd,
  151. [Values(1u, 31u)] uint Rn,
  152. [Values(2u, 31u)] uint Rm,
  153. [Values(0x0000000000000000ul, 0x7FFFFFFFFFFFFFFFul,
  154. 0x8000000000000000ul, 0xFFFFFFFFFFFFFFFFul)] [Random(RndCnt)] ulong Xn,
  155. [Values(0x0000000000000000ul, 0x7FFFFFFFFFFFFFFFul,
  156. 0x8000000000000000ul, 0xFFFFFFFFFFFFFFFFul)] [Random(RndCnt)] ulong Xm,
  157. [Values(0b00u, 0b01u, 0b10u, 0b11u)] uint shift, // <LSL, LSR, ASR, ROR>
  158. [Values(0u, 31u, 32u, 63u)] [Random(0u, 63u, RndCntAmount)] uint amount)
  159. {
  160. uint Opcode = 0x8A000000; // AND X0, X0, X0, LSL #0
  161. Opcode |= ((Rm & 31) << 16) | ((Rn & 31) << 5) | ((Rd & 31) << 0);
  162. Opcode |= ((shift & 3) << 22) | ((amount & 63) << 10);
  163. ulong _X31 = TestContext.CurrentContext.Random.NextULong();
  164. AThreadState ThreadState = SingleOpcode(Opcode, X1: Xn, X2: Xm, X31: _X31);
  165. CompareAgainstUnicorn();
  166. }
  167. [Test, Pairwise, Description("AND <Wd>, <Wn>, <Wm>{, <shift> #<amount>}")]
  168. public void And_32bit([Values(0u, 31u)] uint Rd,
  169. [Values(1u, 31u)] uint Rn,
  170. [Values(2u, 31u)] uint Rm,
  171. [Values(0x00000000u, 0x7FFFFFFFu,
  172. 0x80000000u, 0xFFFFFFFFu)] [Random(RndCnt)] uint Wn,
  173. [Values(0x00000000u, 0x7FFFFFFFu,
  174. 0x80000000u, 0xFFFFFFFFu)] [Random(RndCnt)] uint Wm,
  175. [Values(0b00u, 0b01u, 0b10u, 0b11u)] uint shift, // <LSL, LSR, ASR, ROR>
  176. [Values(0u, 15u, 16u, 31u)] [Random(0u, 31u, RndCntAmount)] uint amount)
  177. {
  178. uint Opcode = 0x0A000000; // AND W0, W0, W0, LSL #0
  179. Opcode |= ((Rm & 31) << 16) | ((Rn & 31) << 5) | ((Rd & 31) << 0);
  180. Opcode |= ((shift & 3) << 22) | ((amount & 63) << 10);
  181. uint _W31 = TestContext.CurrentContext.Random.NextUInt();
  182. AThreadState ThreadState = SingleOpcode(Opcode, X1: Wn, X2: Wm, X31: _W31);
  183. CompareAgainstUnicorn();
  184. }
  185. [Test, Pairwise, Description("ANDS <Xd>, <Xn>, <Xm>{, <shift> #<amount>}")]
  186. public void Ands_64bit([Values(0u, 31u)] uint Rd,
  187. [Values(1u, 31u)] uint Rn,
  188. [Values(2u, 31u)] uint Rm,
  189. [Values(0x0000000000000000ul, 0x7FFFFFFFFFFFFFFFul,
  190. 0x8000000000000000ul, 0xFFFFFFFFFFFFFFFFul)] [Random(RndCnt)] ulong Xn,
  191. [Values(0x0000000000000000ul, 0x7FFFFFFFFFFFFFFFul,
  192. 0x8000000000000000ul, 0xFFFFFFFFFFFFFFFFul)] [Random(RndCnt)] ulong Xm,
  193. [Values(0b00u, 0b01u, 0b10u, 0b11u)] uint shift, // <LSL, LSR, ASR, ROR>
  194. [Values(0u, 31u, 32u, 63u)] [Random(0u, 63u, RndCntAmount)] uint amount)
  195. {
  196. uint Opcode = 0xEA000000; // ANDS X0, X0, X0, LSL #0
  197. Opcode |= ((Rm & 31) << 16) | ((Rn & 31) << 5) | ((Rd & 31) << 0);
  198. Opcode |= ((shift & 3) << 22) | ((amount & 63) << 10);
  199. ulong _X31 = TestContext.CurrentContext.Random.NextULong();
  200. AThreadState ThreadState = SingleOpcode(Opcode, X1: Xn, X2: Xm, X31: _X31);
  201. CompareAgainstUnicorn();
  202. }
  203. [Test, Pairwise, Description("ANDS <Wd>, <Wn>, <Wm>{, <shift> #<amount>}")]
  204. public void Ands_32bit([Values(0u, 31u)] uint Rd,
  205. [Values(1u, 31u)] uint Rn,
  206. [Values(2u, 31u)] uint Rm,
  207. [Values(0x00000000u, 0x7FFFFFFFu,
  208. 0x80000000u, 0xFFFFFFFFu)] [Random(RndCnt)] uint Wn,
  209. [Values(0x00000000u, 0x7FFFFFFFu,
  210. 0x80000000u, 0xFFFFFFFFu)] [Random(RndCnt)] uint Wm,
  211. [Values(0b00u, 0b01u, 0b10u, 0b11u)] uint shift, // <LSL, LSR, ASR, ROR>
  212. [Values(0u, 15u, 16u, 31u)] [Random(0u, 31u, RndCntAmount)] uint amount)
  213. {
  214. uint Opcode = 0x6A000000; // ANDS W0, W0, W0, LSL #0
  215. Opcode |= ((Rm & 31) << 16) | ((Rn & 31) << 5) | ((Rd & 31) << 0);
  216. Opcode |= ((shift & 3) << 22) | ((amount & 63) << 10);
  217. uint _W31 = TestContext.CurrentContext.Random.NextUInt();
  218. AThreadState ThreadState = SingleOpcode(Opcode, X1: Wn, X2: Wm, X31: _W31);
  219. CompareAgainstUnicorn();
  220. }
  221. [Test, Pairwise, Description("ASRV <Xd>, <Xn>, <Xm>")]
  222. public void Asrv_64bit([Values(0u, 31u)] uint Rd,
  223. [Values(1u, 31u)] uint Rn,
  224. [Values(2u, 31u)] uint Rm,
  225. [Values(0x0000000000000000ul, 0x7FFFFFFFFFFFFFFFul,
  226. 0x8000000000000000ul, 0xFFFFFFFFFFFFFFFFul)] [Random(RndCnt)] ulong Xn,
  227. [Values(0ul, 31ul, 32ul, 63ul, 0x7FFFFFFFFFFFFFFFul,
  228. 0x8000000000000000ul, 0xFFFFFFFFFFFFFFFFul)] [Random(RndCnt)] ulong Xm)
  229. {
  230. uint Opcode = 0x9AC02800; // ASRV X0, X0, X0
  231. Opcode |= ((Rm & 31) << 16) | ((Rn & 31) << 5) | ((Rd & 31) << 0);
  232. ulong _X31 = TestContext.CurrentContext.Random.NextULong();
  233. AThreadState ThreadState = SingleOpcode(Opcode, X1: Xn, X2: Xm, X31: _X31);
  234. CompareAgainstUnicorn();
  235. }
  236. [Test, Pairwise, Description("ASRV <Wd>, <Wn>, <Wm>")]
  237. public void Asrv_32bit([Values(0u, 31u)] uint Rd,
  238. [Values(1u, 31u)] uint Rn,
  239. [Values(2u, 31u)] uint Rm,
  240. [Values(0x00000000u, 0x7FFFFFFFu,
  241. 0x80000000u, 0xFFFFFFFFu)] [Random(RndCnt)] uint Wn,
  242. [Values(0u, 15u, 16u, 31u, 0x7FFFFFFFu,
  243. 0x80000000u, 0xFFFFFFFFu)] [Random(RndCnt)] uint Wm)
  244. {
  245. uint Opcode = 0x1AC02800; // ASRV W0, W0, W0
  246. Opcode |= ((Rm & 31) << 16) | ((Rn & 31) << 5) | ((Rd & 31) << 0);
  247. uint _W31 = TestContext.CurrentContext.Random.NextUInt();
  248. AThreadState ThreadState = SingleOpcode(Opcode, X1: Wn, X2: Wm, X31: _W31);
  249. CompareAgainstUnicorn();
  250. }
  251. [Test, Pairwise, Description("BIC <Xd>, <Xn>, <Xm>{, <shift> #<amount>}")]
  252. public void Bic_64bit([Values(0u, 31u)] uint Rd,
  253. [Values(1u, 31u)] uint Rn,
  254. [Values(2u, 31u)] uint Rm,
  255. [Values(0x0000000000000000ul, 0x7FFFFFFFFFFFFFFFul,
  256. 0x8000000000000000ul, 0xFFFFFFFFFFFFFFFFul)] [Random(RndCnt)] ulong Xn,
  257. [Values(0x0000000000000000ul, 0x7FFFFFFFFFFFFFFFul,
  258. 0x8000000000000000ul, 0xFFFFFFFFFFFFFFFFul)] [Random(RndCnt)] ulong Xm,
  259. [Values(0b00u, 0b01u, 0b10u, 0b11u)] uint shift, // <LSL, LSR, ASR, ROR>
  260. [Values(0u, 31u, 32u, 63u)] [Random(0u, 63u, RndCntAmount)] uint amount)
  261. {
  262. uint Opcode = 0x8A200000; // BIC X0, X0, X0, LSL #0
  263. Opcode |= ((Rm & 31) << 16) | ((Rn & 31) << 5) | ((Rd & 31) << 0);
  264. Opcode |= ((shift & 3) << 22) | ((amount & 63) << 10);
  265. ulong _X31 = TestContext.CurrentContext.Random.NextULong();
  266. AThreadState ThreadState = SingleOpcode(Opcode, X1: Xn, X2: Xm, X31: _X31);
  267. CompareAgainstUnicorn();
  268. }
  269. [Test, Pairwise, Description("BIC <Wd>, <Wn>, <Wm>{, <shift> #<amount>}")]
  270. public void Bic_32bit([Values(0u, 31u)] uint Rd,
  271. [Values(1u, 31u)] uint Rn,
  272. [Values(2u, 31u)] uint Rm,
  273. [Values(0x00000000u, 0x7FFFFFFFu,
  274. 0x80000000u, 0xFFFFFFFFu)] [Random(RndCnt)] uint Wn,
  275. [Values(0x00000000u, 0x7FFFFFFFu,
  276. 0x80000000u, 0xFFFFFFFFu)] [Random(RndCnt)] uint Wm,
  277. [Values(0b00u, 0b01u, 0b10u, 0b11u)] uint shift, // <LSL, LSR, ASR, ROR>
  278. [Values(0u, 15u, 16u, 31u)] [Random(0u, 31u, RndCntAmount)] uint amount)
  279. {
  280. uint Opcode = 0x0A200000; // BIC W0, W0, W0, LSL #0
  281. Opcode |= ((Rm & 31) << 16) | ((Rn & 31) << 5) | ((Rd & 31) << 0);
  282. Opcode |= ((shift & 3) << 22) | ((amount & 63) << 10);
  283. uint _W31 = TestContext.CurrentContext.Random.NextUInt();
  284. AThreadState ThreadState = SingleOpcode(Opcode, X1: Wn, X2: Wm, X31: _W31);
  285. CompareAgainstUnicorn();
  286. }
  287. [Test, Pairwise, Description("BICS <Xd>, <Xn>, <Xm>{, <shift> #<amount>}")]
  288. public void Bics_64bit([Values(0u, 31u)] uint Rd,
  289. [Values(1u, 31u)] uint Rn,
  290. [Values(2u, 31u)] uint Rm,
  291. [Values(0x0000000000000000ul, 0x7FFFFFFFFFFFFFFFul,
  292. 0x8000000000000000ul, 0xFFFFFFFFFFFFFFFFul)] [Random(RndCnt)] ulong Xn,
  293. [Values(0x0000000000000000ul, 0x7FFFFFFFFFFFFFFFul,
  294. 0x8000000000000000ul, 0xFFFFFFFFFFFFFFFFul)] [Random(RndCnt)] ulong Xm,
  295. [Values(0b00u, 0b01u, 0b10u, 0b11u)] uint shift, // <LSL, LSR, ASR, ROR>
  296. [Values(0u, 31u, 32u, 63u)] [Random(0u, 63u, RndCntAmount)] uint amount)
  297. {
  298. uint Opcode = 0xEA200000; // BICS X0, X0, X0, LSL #0
  299. Opcode |= ((Rm & 31) << 16) | ((Rn & 31) << 5) | ((Rd & 31) << 0);
  300. Opcode |= ((shift & 3) << 22) | ((amount & 63) << 10);
  301. ulong _X31 = TestContext.CurrentContext.Random.NextULong();
  302. AThreadState ThreadState = SingleOpcode(Opcode, X1: Xn, X2: Xm, X31: _X31);
  303. CompareAgainstUnicorn();
  304. }
  305. [Test, Pairwise, Description("BICS <Wd>, <Wn>, <Wm>{, <shift> #<amount>}")]
  306. public void Bics_32bit([Values(0u, 31u)] uint Rd,
  307. [Values(1u, 31u)] uint Rn,
  308. [Values(2u, 31u)] uint Rm,
  309. [Values(0x00000000u, 0x7FFFFFFFu,
  310. 0x80000000u, 0xFFFFFFFFu)] [Random(RndCnt)] uint Wn,
  311. [Values(0x00000000u, 0x7FFFFFFFu,
  312. 0x80000000u, 0xFFFFFFFFu)] [Random(RndCnt)] uint Wm,
  313. [Values(0b00u, 0b01u, 0b10u, 0b11u)] uint shift, // <LSL, LSR, ASR, ROR>
  314. [Values(0u, 15u, 16u, 31u)] [Random(0u, 31u, RndCntAmount)] uint amount)
  315. {
  316. uint Opcode = 0x6A200000; // BICS W0, W0, W0, LSL #0
  317. Opcode |= ((Rm & 31) << 16) | ((Rn & 31) << 5) | ((Rd & 31) << 0);
  318. Opcode |= ((shift & 3) << 22) | ((amount & 63) << 10);
  319. uint _W31 = TestContext.CurrentContext.Random.NextUInt();
  320. AThreadState ThreadState = SingleOpcode(Opcode, X1: Wn, X2: Wm, X31: _W31);
  321. CompareAgainstUnicorn();
  322. }
  323. [Test, Pairwise, Description("CRC32X <Wd>, <Wn>, <Xm>"), Ignore("Unicorn fails.")]
  324. public void Crc32x([Values(0u, 31u)] uint Rd,
  325. [Values(1u, 31u)] uint Rn,
  326. [Values(2u, 31u)] uint Rm,
  327. [Values(0x00000000u, 0xFFFFFFFFu)] [Random(RndCnt)] uint Wn,
  328. [Values((ulong)0x00_00_00_00_00_00_00_00,
  329. (ulong)0x7F_FF_FF_FF_FF_FF_FF_FF,
  330. (ulong)0x80_00_00_00_00_00_00_00,
  331. (ulong)0xFF_FF_FF_FF_FF_FF_FF_FF)] [Random(RndCnt)] ulong Xm)
  332. {
  333. uint Opcode = 0x9AC04C00; // CRC32X W0, W0, X0
  334. Opcode |= ((Rm & 31) << 16) | ((Rn & 31) << 5) | ((Rd & 31) << 0);
  335. uint _W31 = TestContext.CurrentContext.Random.NextUInt();
  336. AThreadState ThreadState = SingleOpcode(Opcode, X1: Wn, X2: Xm, X31: _W31);
  337. CompareAgainstUnicorn();
  338. }
  339. [Test, Pairwise, Description("CRC32W <Wd>, <Wn>, <Wm>"), Ignore("Unicorn fails.")]
  340. public void Crc32w([Values(0u, 31u)] uint Rd,
  341. [Values(1u, 31u)] uint Rn,
  342. [Values(2u, 31u)] uint Rm,
  343. [Values(0x00000000u, 0xFFFFFFFFu)] [Random(RndCnt)] uint Wn,
  344. [Values((uint)0x00_00_00_00, (uint)0x7F_FF_FF_FF,
  345. (uint)0x80_00_00_00, (uint)0xFF_FF_FF_FF)] [Random(RndCnt)] uint Wm)
  346. {
  347. uint Opcode = 0x1AC04800; // CRC32W W0, W0, W0
  348. Opcode |= ((Rm & 31) << 16) | ((Rn & 31) << 5) | ((Rd & 31) << 0);
  349. uint _W31 = TestContext.CurrentContext.Random.NextUInt();
  350. AThreadState ThreadState = SingleOpcode(Opcode, X1: Wn, X2: Wm, X31: _W31);
  351. CompareAgainstUnicorn();
  352. }
  353. [Test, Pairwise, Description("CRC32H <Wd>, <Wn>, <Wm>"), Ignore("Unicorn fails.")]
  354. public void Crc32h([Values(0u, 31u)] uint Rd,
  355. [Values(1u, 31u)] uint Rn,
  356. [Values(2u, 31u)] uint Rm,
  357. [Values(0x00000000u, 0xFFFFFFFFu)] [Random(RndCnt)] uint Wn,
  358. [Values((ushort)0x00_00, (ushort)0x7F_FF,
  359. (ushort)0x80_00, (ushort)0xFF_FF)] [Random(RndCnt)] ushort Wm)
  360. {
  361. uint Opcode = 0x1AC04400; // CRC32H W0, W0, W0
  362. Opcode |= ((Rm & 31) << 16) | ((Rn & 31) << 5) | ((Rd & 31) << 0);
  363. uint _W31 = TestContext.CurrentContext.Random.NextUInt();
  364. AThreadState ThreadState = SingleOpcode(Opcode, X1: Wn, X2: Wm, X31: _W31);
  365. CompareAgainstUnicorn();
  366. }
  367. [Test, Pairwise, Description("CRC32B <Wd>, <Wn>, <Wm>"), Ignore("Unicorn fails.")]
  368. public void Crc32b([Values(0u, 31u)] uint Rd,
  369. [Values(1u, 31u)] uint Rn,
  370. [Values(2u, 31u)] uint Rm,
  371. [Values(0x00000000u, 0xFFFFFFFFu)] [Random(RndCnt)] uint Wn,
  372. [Values((byte)0x00, (byte)0x7F,
  373. (byte)0x80, (byte)0xFF)] [Random(RndCnt)] byte Wm)
  374. {
  375. uint Opcode = 0x1AC04000; // CRC32B W0, W0, W0
  376. Opcode |= ((Rm & 31) << 16) | ((Rn & 31) << 5) | ((Rd & 31) << 0);
  377. uint _W31 = TestContext.CurrentContext.Random.NextUInt();
  378. AThreadState ThreadState = SingleOpcode(Opcode, X1: Wn, X2: Wm, X31: _W31);
  379. CompareAgainstUnicorn();
  380. }
  381. [Test, Pairwise, Description("CRC32CX <Wd>, <Wn>, <Xm>")]
  382. public void Crc32cx([Values(0u, 31u)] uint Rd,
  383. [Values(1u, 31u)] uint Rn,
  384. [Values(2u, 31u)] uint Rm,
  385. [Values(0x00000000u, 0xFFFFFFFFu)] [Random(RndCnt)] uint Wn,
  386. [Values((ulong)0x00_00_00_00_00_00_00_00,
  387. (ulong)0x7F_FF_FF_FF_FF_FF_FF_FF,
  388. (ulong)0x80_00_00_00_00_00_00_00,
  389. (ulong)0xFF_FF_FF_FF_FF_FF_FF_FF)] [Random(RndCnt)] ulong Xm)
  390. {
  391. uint Opcode = 0x9AC05C00; // CRC32CX W0, W0, X0
  392. Opcode |= ((Rm & 31) << 16) | ((Rn & 31) << 5) | ((Rd & 31) << 0);
  393. uint _W31 = TestContext.CurrentContext.Random.NextUInt();
  394. AThreadState ThreadState = SingleOpcode(Opcode, X1: Wn, X2: Xm, X31: _W31);
  395. CompareAgainstUnicorn();
  396. }
  397. [Test, Pairwise, Description("CRC32CW <Wd>, <Wn>, <Wm>")]
  398. public void Crc32cw([Values(0u, 31u)] uint Rd,
  399. [Values(1u, 31u)] uint Rn,
  400. [Values(2u, 31u)] uint Rm,
  401. [Values(0x00000000u, 0xFFFFFFFFu)] [Random(RndCnt)] uint Wn,
  402. [Values((uint)0x00_00_00_00, (uint)0x7F_FF_FF_FF,
  403. (uint)0x80_00_00_00, (uint)0xFF_FF_FF_FF)] [Random(RndCnt)] uint Wm)
  404. {
  405. uint Opcode = 0x1AC05800; // CRC32CW W0, W0, W0
  406. Opcode |= ((Rm & 31) << 16) | ((Rn & 31) << 5) | ((Rd & 31) << 0);
  407. uint _W31 = TestContext.CurrentContext.Random.NextUInt();
  408. AThreadState ThreadState = SingleOpcode(Opcode, X1: Wn, X2: Wm, X31: _W31);
  409. CompareAgainstUnicorn();
  410. }
  411. [Test, Pairwise, Description("CRC32CH <Wd>, <Wn>, <Wm>")]
  412. public void Crc32ch([Values(0u, 31u)] uint Rd,
  413. [Values(1u, 31u)] uint Rn,
  414. [Values(2u, 31u)] uint Rm,
  415. [Values(0x00000000u, 0xFFFFFFFFu)] [Random(RndCnt)] uint Wn,
  416. [Values((ushort)0x00_00, (ushort)0x7F_FF,
  417. (ushort)0x80_00, (ushort)0xFF_FF)] [Random(RndCnt)] ushort Wm)
  418. {
  419. uint Opcode = 0x1AC05400; // CRC32CH W0, W0, W0
  420. Opcode |= ((Rm & 31) << 16) | ((Rn & 31) << 5) | ((Rd & 31) << 0);
  421. uint _W31 = TestContext.CurrentContext.Random.NextUInt();
  422. AThreadState ThreadState = SingleOpcode(Opcode, X1: Wn, X2: Wm, X31: _W31);
  423. CompareAgainstUnicorn();
  424. }
  425. [Test, Pairwise, Description("CRC32CB <Wd>, <Wn>, <Wm>")]
  426. public void Crc32cb([Values(0u, 31u)] uint Rd,
  427. [Values(1u, 31u)] uint Rn,
  428. [Values(2u, 31u)] uint Rm,
  429. [Values(0x00000000u, 0xFFFFFFFFu)] [Random(RndCnt)] uint Wn,
  430. [Values((byte)0x00, (byte)0x7F,
  431. (byte)0x80, (byte)0xFF)] [Random(RndCnt)] byte Wm)
  432. {
  433. uint Opcode = 0x1AC05000; // CRC32CB W0, W0, W0
  434. Opcode |= ((Rm & 31) << 16) | ((Rn & 31) << 5) | ((Rd & 31) << 0);
  435. uint _W31 = TestContext.CurrentContext.Random.NextUInt();
  436. AThreadState ThreadState = SingleOpcode(Opcode, X1: Wn, X2: Wm, X31: _W31);
  437. CompareAgainstUnicorn();
  438. }
  439. [Test, Pairwise, Description("EON <Xd>, <Xn>, <Xm>{, <shift> #<amount>}")]
  440. public void Eon_64bit([Values(0u, 31u)] uint Rd,
  441. [Values(1u, 31u)] uint Rn,
  442. [Values(2u, 31u)] uint Rm,
  443. [Values(0x0000000000000000ul, 0x7FFFFFFFFFFFFFFFul,
  444. 0x8000000000000000ul, 0xFFFFFFFFFFFFFFFFul)] [Random(RndCnt)] ulong Xn,
  445. [Values(0x0000000000000000ul, 0x7FFFFFFFFFFFFFFFul,
  446. 0x8000000000000000ul, 0xFFFFFFFFFFFFFFFFul)] [Random(RndCnt)] ulong Xm,
  447. [Values(0b00u, 0b01u, 0b10u, 0b11u)] uint shift, // <LSL, LSR, ASR, ROR>
  448. [Values(0u, 31u, 32u, 63u)] [Random(0u, 63u, RndCntAmount)] uint amount)
  449. {
  450. uint Opcode = 0xCA200000; // EON X0, X0, X0, LSL #0
  451. Opcode |= ((Rm & 31) << 16) | ((Rn & 31) << 5) | ((Rd & 31) << 0);
  452. Opcode |= ((shift & 3) << 22) | ((amount & 63) << 10);
  453. ulong _X31 = TestContext.CurrentContext.Random.NextULong();
  454. AThreadState ThreadState = SingleOpcode(Opcode, X1: Xn, X2: Xm, X31: _X31);
  455. CompareAgainstUnicorn();
  456. }
  457. [Test, Pairwise, Description("EON <Wd>, <Wn>, <Wm>{, <shift> #<amount>}")]
  458. public void Eon_32bit([Values(0u, 31u)] uint Rd,
  459. [Values(1u, 31u)] uint Rn,
  460. [Values(2u, 31u)] uint Rm,
  461. [Values(0x00000000u, 0x7FFFFFFFu,
  462. 0x80000000u, 0xFFFFFFFFu)] [Random(RndCnt)] uint Wn,
  463. [Values(0x00000000u, 0x7FFFFFFFu,
  464. 0x80000000u, 0xFFFFFFFFu)] [Random(RndCnt)] uint Wm,
  465. [Values(0b00u, 0b01u, 0b10u, 0b11u)] uint shift, // <LSL, LSR, ASR, ROR>
  466. [Values(0u, 15u, 16u, 31u)] [Random(0u, 31u, RndCntAmount)] uint amount)
  467. {
  468. uint Opcode = 0x4A200000; // EON W0, W0, W0, LSL #0
  469. Opcode |= ((Rm & 31) << 16) | ((Rn & 31) << 5) | ((Rd & 31) << 0);
  470. Opcode |= ((shift & 3) << 22) | ((amount & 63) << 10);
  471. uint _W31 = TestContext.CurrentContext.Random.NextUInt();
  472. AThreadState ThreadState = SingleOpcode(Opcode, X1: Wn, X2: Wm, X31: _W31);
  473. CompareAgainstUnicorn();
  474. }
  475. [Test, Pairwise, Description("EOR <Xd>, <Xn>, <Xm>{, <shift> #<amount>}")]
  476. public void Eor_64bit([Values(0u, 31u)] uint Rd,
  477. [Values(1u, 31u)] uint Rn,
  478. [Values(2u, 31u)] uint Rm,
  479. [Values(0x0000000000000000ul, 0x7FFFFFFFFFFFFFFFul,
  480. 0x8000000000000000ul, 0xFFFFFFFFFFFFFFFFul)] [Random(RndCnt)] ulong Xn,
  481. [Values(0x0000000000000000ul, 0x7FFFFFFFFFFFFFFFul,
  482. 0x8000000000000000ul, 0xFFFFFFFFFFFFFFFFul)] [Random(RndCnt)] ulong Xm,
  483. [Values(0b00u, 0b01u, 0b10u, 0b11u)] uint shift, // <LSL, LSR, ASR, ROR>
  484. [Values(0u, 31u, 32u, 63u)] [Random(0u, 63u, RndCntAmount)] uint amount)
  485. {
  486. uint Opcode = 0xCA000000; // EOR X0, X0, X0, LSL #0
  487. Opcode |= ((Rm & 31) << 16) | ((Rn & 31) << 5) | ((Rd & 31) << 0);
  488. Opcode |= ((shift & 3) << 22) | ((amount & 63) << 10);
  489. ulong _X31 = TestContext.CurrentContext.Random.NextULong();
  490. AThreadState ThreadState = SingleOpcode(Opcode, X1: Xn, X2: Xm, X31: _X31);
  491. CompareAgainstUnicorn();
  492. }
  493. [Test, Pairwise, Description("EOR <Wd>, <Wn>, <Wm>{, <shift> #<amount>}")]
  494. public void Eor_32bit([Values(0u, 31u)] uint Rd,
  495. [Values(1u, 31u)] uint Rn,
  496. [Values(2u, 31u)] uint Rm,
  497. [Values(0x00000000u, 0x7FFFFFFFu,
  498. 0x80000000u, 0xFFFFFFFFu)] [Random(RndCnt)] uint Wn,
  499. [Values(0x00000000u, 0x7FFFFFFFu,
  500. 0x80000000u, 0xFFFFFFFFu)] [Random(RndCnt)] uint Wm,
  501. [Values(0b00u, 0b01u, 0b10u, 0b11u)] uint shift, // <LSL, LSR, ASR, ROR>
  502. [Values(0u, 15u, 16u, 31u)] [Random(0u, 31u, RndCntAmount)] uint amount)
  503. {
  504. uint Opcode = 0x4A000000; // EOR W0, W0, W0, LSL #0
  505. Opcode |= ((Rm & 31) << 16) | ((Rn & 31) << 5) | ((Rd & 31) << 0);
  506. Opcode |= ((shift & 3) << 22) | ((amount & 63) << 10);
  507. uint _W31 = TestContext.CurrentContext.Random.NextUInt();
  508. AThreadState ThreadState = SingleOpcode(Opcode, X1: Wn, X2: Wm, X31: _W31);
  509. CompareAgainstUnicorn();
  510. }
  511. [Test, Pairwise, Description("EXTR <Xd>, <Xn>, <Xm>, #<lsb>")]
  512. public void Extr_64bit([Values(0u, 31u)] uint Rd,
  513. [Values(1u, 31u)] uint Rn,
  514. [Values(2u, 31u)] uint Rm,
  515. [Values(0x0000000000000000ul, 0x7FFFFFFFFFFFFFFFul,
  516. 0x8000000000000000ul, 0xFFFFFFFFFFFFFFFFul)] [Random(RndCnt)] ulong Xn,
  517. [Values(0x0000000000000000ul, 0x7FFFFFFFFFFFFFFFul,
  518. 0x8000000000000000ul, 0xFFFFFFFFFFFFFFFFul)] [Random(RndCnt)] ulong Xm,
  519. [Values(0u, 31u, 32u, 63u)] [Random(0u, 63u, RndCntLsb)] uint lsb)
  520. {
  521. uint Opcode = 0x93C00000; // EXTR X0, X0, X0, #0
  522. Opcode |= ((Rm & 31) << 16) | ((Rn & 31) << 5) | ((Rd & 31) << 0);
  523. Opcode |= ((lsb & 63) << 10);
  524. ulong _X31 = TestContext.CurrentContext.Random.NextULong();
  525. AThreadState ThreadState = SingleOpcode(Opcode, X1: Xn, X2: Xm, X31: _X31);
  526. CompareAgainstUnicorn();
  527. }
  528. [Test, Pairwise, Description("EXTR <Wd>, <Wn>, <Wm>, #<lsb>")]
  529. public void Extr_32bit([Values(0u, 31u)] uint Rd,
  530. [Values(1u, 31u)] uint Rn,
  531. [Values(2u, 31u)] uint Rm,
  532. [Values(0x00000000u, 0x7FFFFFFFu,
  533. 0x80000000u, 0xFFFFFFFFu)] [Random(RndCnt)] uint Wn,
  534. [Values(0x00000000u, 0x7FFFFFFFu,
  535. 0x80000000u, 0xFFFFFFFFu)] [Random(RndCnt)] uint Wm,
  536. [Values(0u, 15u, 16u, 31u)] [Random(0u, 31u, RndCntLsb)] uint lsb)
  537. {
  538. uint Opcode = 0x13800000; // EXTR W0, W0, W0, #0
  539. Opcode |= ((Rm & 31) << 16) | ((Rn & 31) << 5) | ((Rd & 31) << 0);
  540. Opcode |= ((lsb & 63) << 10);
  541. uint _W31 = TestContext.CurrentContext.Random.NextUInt();
  542. AThreadState ThreadState = SingleOpcode(Opcode, X1: Wn, X2: Wm, X31: _W31);
  543. CompareAgainstUnicorn();
  544. }
  545. [Test, Pairwise, Description("LSLV <Xd>, <Xn>, <Xm>")]
  546. public void Lslv_64bit([Values(0u, 31u)] uint Rd,
  547. [Values(1u, 31u)] uint Rn,
  548. [Values(2u, 31u)] uint Rm,
  549. [Values(0x0000000000000000ul, 0x7FFFFFFFFFFFFFFFul,
  550. 0x8000000000000000ul, 0xFFFFFFFFFFFFFFFFul)] [Random(RndCnt)] ulong Xn,
  551. [Values(0ul, 31ul, 32ul, 63ul, 0x7FFFFFFFFFFFFFFFul,
  552. 0x8000000000000000ul, 0xFFFFFFFFFFFFFFFFul)] [Random(RndCnt)] ulong Xm)
  553. {
  554. uint Opcode = 0x9AC02000; // LSLV X0, X0, X0
  555. Opcode |= ((Rm & 31) << 16) | ((Rn & 31) << 5) | ((Rd & 31) << 0);
  556. ulong _X31 = TestContext.CurrentContext.Random.NextULong();
  557. AThreadState ThreadState = SingleOpcode(Opcode, X1: Xn, X2: Xm, X31: _X31);
  558. CompareAgainstUnicorn();
  559. }
  560. [Test, Pairwise, Description("LSLV <Wd>, <Wn>, <Wm>")]
  561. public void Lslv_32bit([Values(0u, 31u)] uint Rd,
  562. [Values(1u, 31u)] uint Rn,
  563. [Values(2u, 31u)] uint Rm,
  564. [Values(0x00000000u, 0x7FFFFFFFu,
  565. 0x80000000u, 0xFFFFFFFFu)] [Random(RndCnt)] uint Wn,
  566. [Values(0u, 15u, 16u, 31u, 0x7FFFFFFFu,
  567. 0x80000000u, 0xFFFFFFFFu)] [Random(RndCnt)] uint Wm)
  568. {
  569. uint Opcode = 0x1AC02000; // LSLV W0, W0, W0
  570. Opcode |= ((Rm & 31) << 16) | ((Rn & 31) << 5) | ((Rd & 31) << 0);
  571. uint _W31 = TestContext.CurrentContext.Random.NextUInt();
  572. AThreadState ThreadState = SingleOpcode(Opcode, X1: Wn, X2: Wm, X31: _W31);
  573. CompareAgainstUnicorn();
  574. }
  575. [Test, Pairwise, Description("LSRV <Xd>, <Xn>, <Xm>")]
  576. public void Lsrv_64bit([Values(0u, 31u)] uint Rd,
  577. [Values(1u, 31u)] uint Rn,
  578. [Values(2u, 31u)] uint Rm,
  579. [Values(0x0000000000000000ul, 0x7FFFFFFFFFFFFFFFul,
  580. 0x8000000000000000ul, 0xFFFFFFFFFFFFFFFFul)] [Random(RndCnt)] ulong Xn,
  581. [Values(0ul, 31ul, 32ul, 63ul, 0x7FFFFFFFFFFFFFFFul,
  582. 0x8000000000000000ul, 0xFFFFFFFFFFFFFFFFul)] [Random(RndCnt)] ulong Xm)
  583. {
  584. uint Opcode = 0x9AC02400; // LSRV X0, X0, X0
  585. Opcode |= ((Rm & 31) << 16) | ((Rn & 31) << 5) | ((Rd & 31) << 0);
  586. ulong _X31 = TestContext.CurrentContext.Random.NextULong();
  587. AThreadState ThreadState = SingleOpcode(Opcode, X1: Xn, X2: Xm, X31: _X31);
  588. CompareAgainstUnicorn();
  589. }
  590. [Test, Pairwise, Description("LSRV <Wd>, <Wn>, <Wm>")]
  591. public void Lsrv_32bit([Values(0u, 31u)] uint Rd,
  592. [Values(1u, 31u)] uint Rn,
  593. [Values(2u, 31u)] uint Rm,
  594. [Values(0x00000000u, 0x7FFFFFFFu,
  595. 0x80000000u, 0xFFFFFFFFu)] [Random(RndCnt)] uint Wn,
  596. [Values(0u, 15u, 16u, 31u, 0x7FFFFFFFu,
  597. 0x80000000u, 0xFFFFFFFFu)] [Random(RndCnt)] uint Wm)
  598. {
  599. uint Opcode = 0x1AC02400; // LSRV W0, W0, W0
  600. Opcode |= ((Rm & 31) << 16) | ((Rn & 31) << 5) | ((Rd & 31) << 0);
  601. uint _W31 = TestContext.CurrentContext.Random.NextUInt();
  602. AThreadState ThreadState = SingleOpcode(Opcode, X1: Wn, X2: Wm, X31: _W31);
  603. CompareAgainstUnicorn();
  604. }
  605. [Test, Pairwise, Description("ORN <Xd>, <Xn>, <Xm>{, <shift> #<amount>}")]
  606. public void Orn_64bit([Values(0u, 31u)] uint Rd,
  607. [Values(1u, 31u)] uint Rn,
  608. [Values(2u, 31u)] uint Rm,
  609. [Values(0x0000000000000000ul, 0x7FFFFFFFFFFFFFFFul,
  610. 0x8000000000000000ul, 0xFFFFFFFFFFFFFFFFul)] [Random(RndCnt)] ulong Xn,
  611. [Values(0x0000000000000000ul, 0x7FFFFFFFFFFFFFFFul,
  612. 0x8000000000000000ul, 0xFFFFFFFFFFFFFFFFul)] [Random(RndCnt)] ulong Xm,
  613. [Values(0b00u, 0b01u, 0b10u, 0b11u)] uint shift, // <LSL, LSR, ASR, ROR>
  614. [Values(0u, 31u, 32u, 63u)] [Random(0u, 63u, RndCntAmount)] uint amount)
  615. {
  616. uint Opcode = 0xAA200000; // ORN X0, X0, X0, LSL #0
  617. Opcode |= ((Rm & 31) << 16) | ((Rn & 31) << 5) | ((Rd & 31) << 0);
  618. Opcode |= ((shift & 3) << 22) | ((amount & 63) << 10);
  619. ulong _X31 = TestContext.CurrentContext.Random.NextULong();
  620. AThreadState ThreadState = SingleOpcode(Opcode, X1: Xn, X2: Xm, X31: _X31);
  621. CompareAgainstUnicorn();
  622. }
  623. [Test, Pairwise, Description("ORN <Wd>, <Wn>, <Wm>{, <shift> #<amount>}")]
  624. public void Orn_32bit([Values(0u, 31u)] uint Rd,
  625. [Values(1u, 31u)] uint Rn,
  626. [Values(2u, 31u)] uint Rm,
  627. [Values(0x00000000u, 0x7FFFFFFFu,
  628. 0x80000000u, 0xFFFFFFFFu)] [Random(RndCnt)] uint Wn,
  629. [Values(0x00000000u, 0x7FFFFFFFu,
  630. 0x80000000u, 0xFFFFFFFFu)] [Random(RndCnt)] uint Wm,
  631. [Values(0b00u, 0b01u, 0b10u, 0b11u)] uint shift, // <LSL, LSR, ASR, ROR>
  632. [Values(0u, 15u, 16u, 31u)] [Random(0u, 31u, RndCntAmount)] uint amount)
  633. {
  634. uint Opcode = 0x2A200000; // ORN W0, W0, W0, LSL #0
  635. Opcode |= ((Rm & 31) << 16) | ((Rn & 31) << 5) | ((Rd & 31) << 0);
  636. Opcode |= ((shift & 3) << 22) | ((amount & 63) << 10);
  637. uint _W31 = TestContext.CurrentContext.Random.NextUInt();
  638. AThreadState ThreadState = SingleOpcode(Opcode, X1: Wn, X2: Wm, X31: _W31);
  639. CompareAgainstUnicorn();
  640. }
  641. [Test, Pairwise, Description("ORR <Xd>, <Xn>, <Xm>{, <shift> #<amount>}")]
  642. public void Orr_64bit([Values(0u, 31u)] uint Rd,
  643. [Values(1u, 31u)] uint Rn,
  644. [Values(2u, 31u)] uint Rm,
  645. [Values(0x0000000000000000ul, 0x7FFFFFFFFFFFFFFFul,
  646. 0x8000000000000000ul, 0xFFFFFFFFFFFFFFFFul)] [Random(RndCnt)] ulong Xn,
  647. [Values(0x0000000000000000ul, 0x7FFFFFFFFFFFFFFFul,
  648. 0x8000000000000000ul, 0xFFFFFFFFFFFFFFFFul)] [Random(RndCnt)] ulong Xm,
  649. [Values(0b00u, 0b01u, 0b10u, 0b11u)] uint shift, // <LSL, LSR, ASR, ROR>
  650. [Values(0u, 31u, 32u, 63u)] [Random(0u, 63u, RndCntAmount)] uint amount)
  651. {
  652. uint Opcode = 0xAA000000; // ORR X0, X0, X0, LSL #0
  653. Opcode |= ((Rm & 31) << 16) | ((Rn & 31) << 5) | ((Rd & 31) << 0);
  654. Opcode |= ((shift & 3) << 22) | ((amount & 63) << 10);
  655. ulong _X31 = TestContext.CurrentContext.Random.NextULong();
  656. AThreadState ThreadState = SingleOpcode(Opcode, X1: Xn, X2: Xm, X31: _X31);
  657. CompareAgainstUnicorn();
  658. }
  659. [Test, Pairwise, Description("ORR <Wd>, <Wn>, <Wm>{, <shift> #<amount>}")]
  660. public void Orr_32bit([Values(0u, 31u)] uint Rd,
  661. [Values(1u, 31u)] uint Rn,
  662. [Values(2u, 31u)] uint Rm,
  663. [Values(0x00000000u, 0x7FFFFFFFu,
  664. 0x80000000u, 0xFFFFFFFFu)] [Random(RndCnt)] uint Wn,
  665. [Values(0x00000000u, 0x7FFFFFFFu,
  666. 0x80000000u, 0xFFFFFFFFu)] [Random(RndCnt)] uint Wm,
  667. [Values(0b00u, 0b01u, 0b10u, 0b11u)] uint shift, // <LSL, LSR, ASR, ROR>
  668. [Values(0u, 15u, 16u, 31u)] [Random(0u, 31u, RndCntAmount)] uint amount)
  669. {
  670. uint Opcode = 0x2A000000; // ORR W0, W0, W0, LSL #0
  671. Opcode |= ((Rm & 31) << 16) | ((Rn & 31) << 5) | ((Rd & 31) << 0);
  672. Opcode |= ((shift & 3) << 22) | ((amount & 63) << 10);
  673. uint _W31 = TestContext.CurrentContext.Random.NextUInt();
  674. AThreadState ThreadState = SingleOpcode(Opcode, X1: Wn, X2: Wm, X31: _W31);
  675. CompareAgainstUnicorn();
  676. }
  677. [Test, Pairwise, Description("RORV <Xd>, <Xn>, <Xm>")]
  678. public void Rorv_64bit([Values(0u, 31u)] uint Rd,
  679. [Values(1u, 31u)] uint Rn,
  680. [Values(2u, 31u)] uint Rm,
  681. [Values(0x0000000000000000ul, 0x7FFFFFFFFFFFFFFFul,
  682. 0x8000000000000000ul, 0xFFFFFFFFFFFFFFFFul)] [Random(RndCnt)] ulong Xn,
  683. [Values(0ul, 31ul, 32ul, 63ul, 0x7FFFFFFFFFFFFFFFul,
  684. 0x8000000000000000ul, 0xFFFFFFFFFFFFFFFFul)] [Random(RndCnt)] ulong Xm)
  685. {
  686. uint Opcode = 0x9AC02C00; // RORV X0, X0, X0
  687. Opcode |= ((Rm & 31) << 16) | ((Rn & 31) << 5) | ((Rd & 31) << 0);
  688. ulong _X31 = TestContext.CurrentContext.Random.NextULong();
  689. AThreadState ThreadState = SingleOpcode(Opcode, X1: Xn, X2: Xm, X31: _X31);
  690. CompareAgainstUnicorn();
  691. }
  692. [Test, Pairwise, Description("RORV <Wd>, <Wn>, <Wm>")]
  693. public void Rorv_32bit([Values(0u, 31u)] uint Rd,
  694. [Values(1u, 31u)] uint Rn,
  695. [Values(2u, 31u)] uint Rm,
  696. [Values(0x00000000u, 0x7FFFFFFFu,
  697. 0x80000000u, 0xFFFFFFFFu)] [Random(RndCnt)] uint Wn,
  698. [Values(0u, 15u, 16u, 31u, 0x7FFFFFFFu,
  699. 0x80000000u, 0xFFFFFFFFu)] [Random(RndCnt)] uint Wm)
  700. {
  701. uint Opcode = 0x1AC02C00; // RORV W0, W0, W0
  702. Opcode |= ((Rm & 31) << 16) | ((Rn & 31) << 5) | ((Rd & 31) << 0);
  703. uint _W31 = TestContext.CurrentContext.Random.NextUInt();
  704. AThreadState ThreadState = SingleOpcode(Opcode, X1: Wn, X2: Wm, X31: _W31);
  705. CompareAgainstUnicorn();
  706. }
  707. [Test, Pairwise, Description("SBC <Xd>, <Xn>, <Xm>")]
  708. public void Sbc_64bit([Values(0u, 31u)] uint Rd,
  709. [Values(1u, 31u)] uint Rn,
  710. [Values(2u, 31u)] uint Rm,
  711. [Values(0x0000000000000000ul, 0x7FFFFFFFFFFFFFFFul,
  712. 0x8000000000000000ul, 0xFFFFFFFFFFFFFFFFul)] [Random(RndCnt)] ulong Xn,
  713. [Values(0x0000000000000000ul, 0x7FFFFFFFFFFFFFFFul,
  714. 0x8000000000000000ul, 0xFFFFFFFFFFFFFFFFul)] [Random(RndCnt)] ulong Xm,
  715. [Values] bool CarryIn)
  716. {
  717. uint Opcode = 0xDA000000; // SBC X0, X0, X0
  718. Opcode |= ((Rm & 31) << 16) | ((Rn & 31) << 5) | ((Rd & 31) << 0);
  719. ulong _X31 = TestContext.CurrentContext.Random.NextULong();
  720. AThreadState ThreadState = SingleOpcode(Opcode, X1: Xn, X2: Xm, X31: _X31, Carry: CarryIn);
  721. CompareAgainstUnicorn();
  722. }
  723. [Test, Pairwise, Description("SBC <Wd>, <Wn>, <Wm>")]
  724. public void Sbc_32bit([Values(0u, 31u)] uint Rd,
  725. [Values(1u, 31u)] uint Rn,
  726. [Values(2u, 31u)] uint Rm,
  727. [Values(0x00000000u, 0x7FFFFFFFu,
  728. 0x80000000u, 0xFFFFFFFFu)] [Random(RndCnt)] uint Wn,
  729. [Values(0x00000000u, 0x7FFFFFFFu,
  730. 0x80000000u, 0xFFFFFFFFu)] [Random(RndCnt)] uint Wm,
  731. [Values] bool CarryIn)
  732. {
  733. uint Opcode = 0x5A000000; // SBC W0, W0, W0
  734. Opcode |= ((Rm & 31) << 16) | ((Rn & 31) << 5) | ((Rd & 31) << 0);
  735. uint _W31 = TestContext.CurrentContext.Random.NextUInt();
  736. AThreadState ThreadState = SingleOpcode(Opcode, X1: Wn, X2: Wm, X31: _W31, Carry: CarryIn);
  737. CompareAgainstUnicorn();
  738. }
  739. [Test, Pairwise, Description("SBCS <Xd>, <Xn>, <Xm>")]
  740. public void Sbcs_64bit([Values(0u, 31u)] uint Rd,
  741. [Values(1u, 31u)] uint Rn,
  742. [Values(2u, 31u)] uint Rm,
  743. [Values(0x0000000000000000ul, 0x7FFFFFFFFFFFFFFFul,
  744. 0x8000000000000000ul, 0xFFFFFFFFFFFFFFFFul)] [Random(RndCnt)] ulong Xn,
  745. [Values(0x0000000000000000ul, 0x7FFFFFFFFFFFFFFFul,
  746. 0x8000000000000000ul, 0xFFFFFFFFFFFFFFFFul)] [Random(RndCnt)] ulong Xm,
  747. [Values] bool CarryIn)
  748. {
  749. uint Opcode = 0xFA000000; // SBCS X0, X0, X0
  750. Opcode |= ((Rm & 31) << 16) | ((Rn & 31) << 5) | ((Rd & 31) << 0);
  751. ulong _X31 = TestContext.CurrentContext.Random.NextULong();
  752. AThreadState ThreadState = SingleOpcode(Opcode, X1: Xn, X2: Xm, X31: _X31, Carry: CarryIn);
  753. CompareAgainstUnicorn();
  754. }
  755. [Test, Pairwise, Description("SBCS <Wd>, <Wn>, <Wm>")]
  756. public void Sbcs_32bit([Values(0u, 31u)] uint Rd,
  757. [Values(1u, 31u)] uint Rn,
  758. [Values(2u, 31u)] uint Rm,
  759. [Values(0x00000000u, 0x7FFFFFFFu,
  760. 0x80000000u, 0xFFFFFFFFu)] [Random(RndCnt)] uint Wn,
  761. [Values(0x00000000u, 0x7FFFFFFFu,
  762. 0x80000000u, 0xFFFFFFFFu)] [Random(RndCnt)] uint Wm,
  763. [Values] bool CarryIn)
  764. {
  765. uint Opcode = 0x7A000000; // SBCS W0, W0, W0
  766. Opcode |= ((Rm & 31) << 16) | ((Rn & 31) << 5) | ((Rd & 31) << 0);
  767. uint _W31 = TestContext.CurrentContext.Random.NextUInt();
  768. AThreadState ThreadState = SingleOpcode(Opcode, X1: Wn, X2: Wm, X31: _W31, Carry: CarryIn);
  769. CompareAgainstUnicorn();
  770. }
  771. [Test, Pairwise, Description("SDIV <Xd>, <Xn>, <Xm>")]
  772. public void Sdiv_64bit([Values(0u, 31u)] uint Rd,
  773. [Values(1u, 31u)] uint Rn,
  774. [Values(2u, 31u)] uint Rm,
  775. [Values(0x0000000000000000ul, 0x7FFFFFFFFFFFFFFFul,
  776. 0x8000000000000000ul, 0xFFFFFFFFFFFFFFFFul)] [Random(RndCnt)] ulong Xn,
  777. [Values(0x0000000000000000ul, 0x7FFFFFFFFFFFFFFFul,
  778. 0x8000000000000000ul, 0xFFFFFFFFFFFFFFFFul)] [Random(RndCnt)] ulong Xm)
  779. {
  780. uint Opcode = 0x9AC00C00; // SDIV X0, X0, X0
  781. Opcode |= ((Rm & 31) << 16) | ((Rn & 31) << 5) | ((Rd & 31) << 0);
  782. ulong _X31 = TestContext.CurrentContext.Random.NextULong();
  783. AThreadState ThreadState = SingleOpcode(Opcode, X1: Xn, X2: Xm, X31: _X31);
  784. CompareAgainstUnicorn();
  785. }
  786. [Test, Pairwise, Description("SDIV <Wd>, <Wn>, <Wm>")]
  787. public void Sdiv_32bit([Values(0u, 31u)] uint Rd,
  788. [Values(1u, 31u)] uint Rn,
  789. [Values(2u, 31u)] uint Rm,
  790. [Values(0x00000000u, 0x7FFFFFFFu,
  791. 0x80000000u, 0xFFFFFFFFu)] [Random(RndCnt)] uint Wn,
  792. [Values(0x00000000u, 0x7FFFFFFFu,
  793. 0x80000000u, 0xFFFFFFFFu)] [Random(RndCnt)] uint Wm)
  794. {
  795. uint Opcode = 0x1AC00C00; // SDIV W0, W0, W0
  796. Opcode |= ((Rm & 31) << 16) | ((Rn & 31) << 5) | ((Rd & 31) << 0);
  797. uint _W31 = TestContext.CurrentContext.Random.NextUInt();
  798. AThreadState ThreadState = SingleOpcode(Opcode, X1: Wn, X2: Wm, X31: _W31);
  799. CompareAgainstUnicorn();
  800. }
  801. [Test, Pairwise, Description("SUB <Xd>, <Xn>, <Xm>{, <shift> #<amount>}")]
  802. public void Sub_64bit([Values(0u, 31u)] uint Rd,
  803. [Values(1u, 31u)] uint Rn,
  804. [Values(2u, 31u)] uint Rm,
  805. [Values(0x0000000000000000ul, 0x7FFFFFFFFFFFFFFFul,
  806. 0x8000000000000000ul, 0xFFFFFFFFFFFFFFFFul)] [Random(RndCnt)] ulong Xn,
  807. [Values(0x0000000000000000ul, 0x7FFFFFFFFFFFFFFFul,
  808. 0x8000000000000000ul, 0xFFFFFFFFFFFFFFFFul)] [Random(RndCnt)] ulong Xm,
  809. [Values(0b00u, 0b01u, 0b10u)] uint shift, // <LSL, LSR, ASR>
  810. [Values(0u, 31u, 32u, 63u)] [Random(0u, 63u, RndCntAmount)] uint amount)
  811. {
  812. uint Opcode = 0xCB000000; // SUB X0, X0, X0, LSL #0
  813. Opcode |= ((Rm & 31) << 16) | ((Rn & 31) << 5) | ((Rd & 31) << 0);
  814. Opcode |= ((shift & 3) << 22) | ((amount & 63) << 10);
  815. ulong _X31 = TestContext.CurrentContext.Random.NextULong();
  816. AThreadState ThreadState = SingleOpcode(Opcode, X1: Xn, X2: Xm, X31: _X31);
  817. CompareAgainstUnicorn();
  818. }
  819. [Test, Pairwise, Description("SUB <Wd>, <Wn>, <Wm>{, <shift> #<amount>}")]
  820. public void Sub_32bit([Values(0u, 31u)] uint Rd,
  821. [Values(1u, 31u)] uint Rn,
  822. [Values(2u, 31u)] uint Rm,
  823. [Values(0x00000000u, 0x7FFFFFFFu,
  824. 0x80000000u, 0xFFFFFFFFu)] [Random(RndCnt)] uint Wn,
  825. [Values(0x00000000u, 0x7FFFFFFFu,
  826. 0x80000000u, 0xFFFFFFFFu)] [Random(RndCnt)] uint Wm,
  827. [Values(0b00u, 0b01u, 0b10u)] uint shift, // <LSL, LSR, ASR>
  828. [Values(0u, 15u, 16u, 31u)] [Random(0u, 31u, RndCntAmount)] uint amount)
  829. {
  830. uint Opcode = 0x4B000000; // SUB W0, W0, W0, LSL #0
  831. Opcode |= ((Rm & 31) << 16) | ((Rn & 31) << 5) | ((Rd & 31) << 0);
  832. Opcode |= ((shift & 3) << 22) | ((amount & 63) << 10);
  833. uint _W31 = TestContext.CurrentContext.Random.NextUInt();
  834. AThreadState ThreadState = SingleOpcode(Opcode, X1: Wn, X2: Wm, X31: _W31);
  835. CompareAgainstUnicorn();
  836. }
  837. [Test, Pairwise, Description("SUBS <Xd>, <Xn>, <Xm>{, <shift> #<amount>}")]
  838. public void Subs_64bit([Values(0u, 31u)] uint Rd,
  839. [Values(1u, 31u)] uint Rn,
  840. [Values(2u, 31u)] uint Rm,
  841. [Values(0x0000000000000000ul, 0x7FFFFFFFFFFFFFFFul,
  842. 0x8000000000000000ul, 0xFFFFFFFFFFFFFFFFul)] [Random(RndCnt)] ulong Xn,
  843. [Values(0x0000000000000000ul, 0x7FFFFFFFFFFFFFFFul,
  844. 0x8000000000000000ul, 0xFFFFFFFFFFFFFFFFul)] [Random(RndCnt)] ulong Xm,
  845. [Values(0b00u, 0b01u, 0b10u)] uint shift, // <LSL, LSR, ASR>
  846. [Values(0u, 31u, 32u, 63u)] [Random(0u, 63u, RndCntAmount)] uint amount)
  847. {
  848. uint Opcode = 0xEB000000; // SUBS X0, X0, X0, LSL #0
  849. Opcode |= ((Rm & 31) << 16) | ((Rn & 31) << 5) | ((Rd & 31) << 0);
  850. Opcode |= ((shift & 3) << 22) | ((amount & 63) << 10);
  851. ulong _X31 = TestContext.CurrentContext.Random.NextULong();
  852. AThreadState ThreadState = SingleOpcode(Opcode, X1: Xn, X2: Xm, X31: _X31);
  853. CompareAgainstUnicorn();
  854. }
  855. [Test, Pairwise, Description("SUBS <Wd>, <Wn>, <Wm>{, <shift> #<amount>}")]
  856. public void Subs_32bit([Values(0u, 31u)] uint Rd,
  857. [Values(1u, 31u)] uint Rn,
  858. [Values(2u, 31u)] uint Rm,
  859. [Values(0x00000000u, 0x7FFFFFFFu,
  860. 0x80000000u, 0xFFFFFFFFu)] [Random(RndCnt)] uint Wn,
  861. [Values(0x00000000u, 0x7FFFFFFFu,
  862. 0x80000000u, 0xFFFFFFFFu)] [Random(RndCnt)] uint Wm,
  863. [Values(0b00u, 0b01u, 0b10u)] uint shift, // <LSL, LSR, ASR>
  864. [Values(0u, 15u, 16u, 31u)] [Random(0u, 31u, RndCntAmount)] uint amount)
  865. {
  866. uint Opcode = 0x6B000000; // SUBS W0, W0, W0, LSL #0
  867. Opcode |= ((Rm & 31) << 16) | ((Rn & 31) << 5) | ((Rd & 31) << 0);
  868. Opcode |= ((shift & 3) << 22) | ((amount & 63) << 10);
  869. uint _W31 = TestContext.CurrentContext.Random.NextUInt();
  870. AThreadState ThreadState = SingleOpcode(Opcode, X1: Wn, X2: Wm, X31: _W31);
  871. CompareAgainstUnicorn();
  872. }
  873. [Test, Pairwise, Description("UDIV <Xd>, <Xn>, <Xm>")]
  874. public void Udiv_64bit([Values(0u, 31u)] uint Rd,
  875. [Values(1u, 31u)] uint Rn,
  876. [Values(2u, 31u)] uint Rm,
  877. [Values(0x0000000000000000ul, 0x7FFFFFFFFFFFFFFFul,
  878. 0x8000000000000000ul, 0xFFFFFFFFFFFFFFFFul)] [Random(RndCnt)] ulong Xn,
  879. [Values(0x0000000000000000ul, 0x7FFFFFFFFFFFFFFFul,
  880. 0x8000000000000000ul, 0xFFFFFFFFFFFFFFFFul)] [Random(RndCnt)] ulong Xm)
  881. {
  882. uint Opcode = 0x9AC00800; // UDIV X0, X0, X0
  883. Opcode |= ((Rm & 31) << 16) | ((Rn & 31) << 5) | ((Rd & 31) << 0);
  884. ulong _X31 = TestContext.CurrentContext.Random.NextULong();
  885. AThreadState ThreadState = SingleOpcode(Opcode, X1: Xn, X2: Xm, X31: _X31);
  886. CompareAgainstUnicorn();
  887. }
  888. [Test, Pairwise, Description("UDIV <Wd>, <Wn>, <Wm>")]
  889. public void Udiv_32bit([Values(0u, 31u)] uint Rd,
  890. [Values(1u, 31u)] uint Rn,
  891. [Values(2u, 31u)] uint Rm,
  892. [Values(0x00000000u, 0x7FFFFFFFu,
  893. 0x80000000u, 0xFFFFFFFFu)] [Random(RndCnt)] uint Wn,
  894. [Values(0x00000000u, 0x7FFFFFFFu,
  895. 0x80000000u, 0xFFFFFFFFu)] [Random(RndCnt)] uint Wm)
  896. {
  897. uint Opcode = 0x1AC00800; // UDIV W0, W0, W0
  898. Opcode |= ((Rm & 31) << 16) | ((Rn & 31) << 5) | ((Rd & 31) << 0);
  899. uint _W31 = TestContext.CurrentContext.Random.NextUInt();
  900. AThreadState ThreadState = SingleOpcode(Opcode, X1: Wn, X2: Wm, X31: _W31);
  901. CompareAgainstUnicorn();
  902. }
  903. #endif
  904. }
  905. }