mips3264r6.igen 26 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226
  1. 110010,26.OFFSET:POOL32X:32::BC
  2. "bc <OFFSET>"
  3. *mips32r6:
  4. *mips64r6:
  5. {
  6. NIA = CIA + (EXTEND26 (OFFSET) << 2) + 4;
  7. }
  8. 111010,26.OFFSET:POOL32X:32::BALC
  9. "balc <OFFSET>"
  10. *mips32r6:
  11. *mips64r6:
  12. {
  13. RA = CIA + 4;
  14. NIA = CIA + (EXTEND26 (OFFSET) << 2) + 4;
  15. }
  16. 110110,5.RS!0,21.OFFSET:POOL32X:32::BEQZC
  17. "beqzc r<RS>, <OFFSET>"
  18. *mips32r6:
  19. *mips64r6:
  20. {
  21. if (GPR[RS] == 0)
  22. NIA = CIA + (EXTEND21 (OFFSET) << 2) + 4;
  23. else
  24. FORBIDDEN_SLOT ();
  25. }
  26. 110110,00000,5.RT,16.OFFSET:POOL32X:32::JIC
  27. "jic r<RT>, <OFFSET>"
  28. *mips32r6:
  29. *mips64r6:
  30. {
  31. NIA = GPR[RT] + (EXTEND16(OFFSET) << 2);
  32. }
  33. 111110,5.RS!0,21.OFFSET:POOL32X:32::BNEZC
  34. "bnezc r<RS>, <OFFSET>"
  35. *mips32r6:
  36. *mips64r6:
  37. {
  38. if (GPR[RS] != 0)
  39. NIA = CIA + (EXTEND21 (OFFSET) << 2) + 4;
  40. else
  41. FORBIDDEN_SLOT ();
  42. }
  43. 111110,00000,5.RT,16.OFFSET:POOL32X:32::JIALC
  44. "jialc r<RT>, <OFFSET>"
  45. *mips32r6:
  46. *mips64r6:
  47. {
  48. RA = CIA + 4;
  49. NIA = GPR[RT] + EXTEND16(OFFSET);
  50. }
  51. 010110,5.RS,5.RT,16.OFFSET:POOL32X:32::B1xxC
  52. "blezc r<RT>, <OFFSET>": RS==0&&RT!=0
  53. "bgezc r<RT>, <OFFSET>":RS!=0&&RS==RT
  54. "bgec r<RS>, r<RT>, <OFFSET>"
  55. *mips32r6:
  56. *mips64r6:
  57. {
  58. if (RS == 0 && RT != 0)
  59. {
  60. //BLEZC
  61. if ((signed_word)GPR[RT] <= 0)
  62. NIA = CIA + (EXTEND16 (OFFSET) << 2) + 4;
  63. else
  64. FORBIDDEN_SLOT ();
  65. }
  66. else if (RS != 0 && RS == RT)
  67. {
  68. //BGEZC
  69. if ((signed_word)GPR[RT] >= 0)
  70. NIA = CIA + (EXTEND16 (OFFSET) << 2) + 4;
  71. else
  72. FORBIDDEN_SLOT ();
  73. }
  74. else
  75. {
  76. //BGEC
  77. if ((signed_word) GPR[RS] >= (signed_word) GPR[RT])
  78. NIA = CIA + (EXTEND16 (OFFSET) << 2) + 4;
  79. else
  80. FORBIDDEN_SLOT ();
  81. }
  82. }
  83. 010111,5.RS,5.RT,16.OFFSET:POOL32X:32::B2xxC
  84. "bgtzc r<RT>, <OFFSET>":RS==0&&RT!=0
  85. "bltzc r<RT>, <OFFSET>":RS!=0&&RS==RT
  86. "bltc r<RS>, r<RT>, <OFFSET>"
  87. *mips32r6:
  88. *mips64r6:
  89. {
  90. if (RS == 0 && RT != 0)
  91. {
  92. //BGTZC
  93. if ((signed_word)GPR[RT] > 0)
  94. NIA = CIA + (EXTEND16 (OFFSET) << 2) + 4;
  95. else
  96. FORBIDDEN_SLOT ();
  97. }
  98. else if (RS != 0 && RS == RT)
  99. {
  100. //BLTZC
  101. if ((signed_word)GPR[RT] < 0)
  102. NIA = CIA + (EXTEND16 (OFFSET) << 2) + 4;
  103. else
  104. FORBIDDEN_SLOT ();
  105. }
  106. else
  107. {
  108. //BLTC
  109. if ((signed_word) GPR[RS] < (signed_word) GPR[RT])
  110. NIA = CIA + (EXTEND16 (OFFSET) << 2) + 4;
  111. else
  112. FORBIDDEN_SLOT ();
  113. }
  114. }
  115. 000110,5.RS,5.RT!0,16.OFFSET:POOL32X:32::B3xxC
  116. "blezalc r<RT>, <OFFSET>":RS==0
  117. "bgezalc r<RT>, <OFFSET>":RS!=0&&RS==RT
  118. "bgeuc r<RS>, r<RT>, <OFFSET>"
  119. *mips32r6:
  120. *mips64r6:
  121. {
  122. if (RS == 0 && RT != 0)
  123. {
  124. //BLEZALC
  125. RA = CIA + 4;
  126. if ((signed_word)GPR[RT] <= 0)
  127. NIA = CIA + (EXTEND16 (OFFSET) << 2) + 4;
  128. else
  129. FORBIDDEN_SLOT ();
  130. }
  131. else if (RS != 0 && RS == RT)
  132. {
  133. //BGEZALC
  134. RA = CIA + 4;
  135. if ((signed_word)GPR[RT] >= 0)
  136. NIA = CIA + (EXTEND16 (OFFSET) << 2) + 4;
  137. else
  138. FORBIDDEN_SLOT ();
  139. }
  140. else
  141. {
  142. //BGEUC
  143. if (GPR[RS] >= GPR[RT])
  144. NIA = CIA + (EXTEND16 (OFFSET) << 2) + 4;
  145. else
  146. FORBIDDEN_SLOT ();
  147. }
  148. }
  149. 000111,5.RS,5.RT!0,16.OFFSET:POOL32X:32::B4xxC
  150. "bgtzalc r<RT>, <OFFSET>":RS==0
  151. "bltzalc r<RT>, <OFFSET>":RS!=0&&RS==RT
  152. "bltuc r<RS>, r<RT>, <OFFSET>"
  153. *mips32r6:
  154. *mips64r6:
  155. {
  156. if (RS == 0 && RT != 0)
  157. {
  158. //BGTZALC
  159. RA = CIA + 4;
  160. if ((signed_word)GPR[RT] > 0)
  161. NIA = CIA + (EXTEND16 (OFFSET) << 2) + 4;
  162. else
  163. FORBIDDEN_SLOT ();
  164. }
  165. else if (RS != 0 && RS == RT)
  166. {
  167. //BLTZALC
  168. RA = CIA + 4;
  169. if ((signed_word)GPR[RT] < 0)
  170. NIA = CIA + (EXTEND16 (OFFSET) << 2) + 4;
  171. else
  172. FORBIDDEN_SLOT ();
  173. }
  174. else
  175. {
  176. //BLTUC
  177. if (GPR[RS] < GPR[RT])
  178. NIA = CIA + (EXTEND16 (OFFSET) << 2) + 4;
  179. else
  180. FORBIDDEN_SLOT ();
  181. }
  182. }
  183. 001000,5.RS,5.RT,16.OFFSET:POOL32X:32::BxxxC
  184. "bovc r<RS>, r<RT>, <OFFSET>":RS>=RT
  185. "beqzalc r<RT>, <OFFSET>":RS==0&&RT>RS
  186. "beqc r<RS>, r<RT>, <OFFSET>"
  187. *mips32r6:
  188. *mips64r6:
  189. {
  190. if (RS >= RT)
  191. {
  192. //BOVC
  193. ALU32_BEGIN (GPR[RS] & 0x0ffffffff);
  194. ALU32_ADD (GPR[RT] & 0x0ffffffff);
  195. if (ALU32_HAD_OVERFLOW)
  196. NIA = CIA + (EXTEND16 (OFFSET) << 2) + 4;
  197. else
  198. FORBIDDEN_SLOT ();
  199. }
  200. else if (RS == 0)
  201. {
  202. RA = CIA + 4;
  203. //BEQZALC
  204. if (GPR[RT] == 0)
  205. NIA = CIA + (EXTEND16 (OFFSET) << 2) + 4;
  206. else
  207. FORBIDDEN_SLOT ();
  208. }
  209. else
  210. {
  211. //BEQC
  212. if (GPR[RS] == GPR[RT])
  213. NIA = CIA + (EXTEND16 (OFFSET) << 2) + 4;
  214. else
  215. FORBIDDEN_SLOT ();
  216. }
  217. }
  218. 011000,5.RS,5.RT,16.OFFSET:POOL32X:32::BNxxxC
  219. "bnvc r<RS>, r<RT>, <OFFSET>":RS>=RT
  220. "bnezalc r<RT>, <OFFSET>":RS==0&&RT>RS
  221. "bnec r<RS>, r<RT>, <OFFSET>"
  222. *mips32r6:
  223. *mips64r6:
  224. {
  225. if (RS >= RT)
  226. {
  227. //BNVC
  228. ALU32_BEGIN (GPR[RS] & 0x0ffffffff);
  229. ALU32_ADD (GPR[RT] & 0x0ffffffff);
  230. if (!ALU32_HAD_OVERFLOW)
  231. NIA = CIA + (EXTEND16 (OFFSET) << 2) + 4;
  232. else
  233. FORBIDDEN_SLOT ();
  234. }
  235. else if (RS == 0 && RT > RS)
  236. {
  237. //BNEZALC
  238. RA = CIA + 4;
  239. if (GPR[RT] != 0)
  240. NIA = CIA + (EXTEND16 (OFFSET) << 2) + 4;
  241. else
  242. FORBIDDEN_SLOT ();
  243. }
  244. else
  245. {
  246. //BNEC
  247. if (GPR[RT] != GPR[RS])
  248. NIA = CIA + (EXTEND16 (OFFSET) << 2) + 4;
  249. else
  250. FORBIDDEN_SLOT ();
  251. }
  252. }
  253. :%s::::R6COND:int r6cond
  254. {
  255. switch (r6cond)
  256. {
  257. case FP_R6CMP_SAF:
  258. return "SAF";
  259. case FP_R6CMP_SUN:
  260. return "SUN";
  261. case FP_R6CMP_SOR:
  262. return "SOR";
  263. case FP_R6CMP_SEQ:
  264. return "SEQ";
  265. case FP_R6CMP_SUNE:
  266. return "SUNE";
  267. case FP_R6CMP_SUEQ:
  268. return "SUEQ";
  269. case FP_R6CMP_SNE:
  270. return "SNE";
  271. case FP_R6CMP_SLT:
  272. return "SLT";
  273. case FP_R6CMP_SULT:
  274. return "SULT";
  275. case FP_R6CMP_SLE:
  276. return "SLE";
  277. case FP_R6CMP_SULE:
  278. return "SULE";
  279. case FP_R6CMP_AF:
  280. return "AF";
  281. case FP_R6CMP_UN:
  282. return "UN";
  283. case FP_R6CMP_OR:
  284. return "OR";
  285. case FP_R6CMP_EQ:
  286. return "EQ";
  287. case FP_R6CMP_UNE:
  288. return "UNE";
  289. case FP_R6CMP_UEQ:
  290. return "UEQ";
  291. case FP_R6CMP_NE:
  292. return "NE";
  293. case FP_R6CMP_LT:
  294. return "LT";
  295. case FP_R6CMP_ULT:
  296. return "ULT";
  297. case FP_R6CMP_LE:
  298. return "LE";
  299. case FP_R6CMP_ULE:
  300. return "ULE";
  301. default:
  302. abort ();
  303. }
  304. }
  305. 010001,1010,1.FMT,5.FT,5.FS,5.FD,0,5.R6COND:POOL32X:32,f::CMP.cond.fmt
  306. "cmp.%s<R6COND>.%s<FMT> f<FD>, f<FS>, f<FT>"
  307. *mips32r6:
  308. *mips64r6:
  309. {
  310. uint64_t result;
  311. check_fpu (SD_);
  312. TRACE_ALU_INPUT2 (ValueFPR (FS, FMT), ValueFPR (FT, FMT));
  313. result = R6Compare (ValueFPR (FS, FMT), ValueFPR (FT, FMT), FMT, R6COND);
  314. StoreFPR (FD, FMT, result);
  315. TRACE_ALU_RESULT (result);
  316. }
  317. 010001,01001,5.FT,16.OFFSET:POOL32X:32,f::BC1EQZ
  318. "bc1eqz f<FT>, <OFFSET>"
  319. *mips32r6:
  320. *mips64r6:
  321. {
  322. address_word offset = EXTEND16 (OFFSET) << 2;
  323. check_fpu (SD_);
  324. TRACE_ALU_INPUT1 (FGR[FT]);
  325. if ((FGR[FT] & 0x01) == 0)
  326. DELAY_SLOT (NIA + offset);
  327. }
  328. 010001,01101,5.FT,16.OFFSET:POOL32X:32,f::BC1NEZ
  329. "bc1nez f<FT>, <OFFSET>"
  330. *mips32r6:
  331. *mips64r6:
  332. {
  333. address_word offset = EXTEND16 (OFFSET) << 2;
  334. check_fpu (SD_);
  335. TRACE_ALU_INPUT1 (FGR[FT]);
  336. if ((FGR[FT] & 0x01) != 0)
  337. DELAY_SLOT (NIA + offset);
  338. }
  339. 010001,1000,1.FMT,5.FT,5.FS,5.FD,011000:POOLX:32,f::MADDF.fmt
  340. "maddf.%s<FMT> f<FD>, f<FS>, f<FT>"
  341. *mips32r6:
  342. *mips64r6:
  343. {
  344. int fmt = FMT;
  345. check_fpu (SD_);
  346. check_u64 (SD_, instruction_0);
  347. check_fmt_p (SD_, fmt, instruction_0);
  348. TRACE_ALU_INPUT3 (FGR[FD], FGR[FS], FGR[FT]);
  349. StoreFPR (FD, fmt, FusedMultiplyAdd (ValueFPR (FS, fmt),
  350. ValueFPR (FT, fmt),
  351. ValueFPR (FD, fmt), fmt));
  352. TRACE_ALU_RESULT (FGR[FD]);
  353. }
  354. 010001,1000,1.FMT,5.FT,5.FS,5.FD,011001:POOLX:32,f::MSUBF.fmt
  355. "msubf.%s<FMT> f<FD>, f<FS>, f<FT>"
  356. *mips32r6:
  357. *mips64r6:
  358. {
  359. int fmt = FMT;
  360. check_fpu (SD_);
  361. check_u64 (SD_, instruction_0);
  362. check_fmt_p (SD_, fmt, instruction_0);
  363. TRACE_ALU_INPUT3 (FGR[FD], FGR[FS], FGR[FT]);
  364. StoreFPR (FD, fmt, FusedMultiplySub (ValueFPR (FS, fmt),
  365. ValueFPR (FT, fmt),
  366. ValueFPR (FD, fmt), fmt));
  367. TRACE_ALU_RESULT (FGR[FD]);
  368. }
  369. 000000,5.RS,5.RT,5.RD,000,2.IMM,000101:SPECIAL:32::LSA
  370. "lsa r<RD>, r<RS>, r<RT>, <IMM + 1>"
  371. *mips32r6:
  372. *mips64r6:
  373. {
  374. uint32_t t = GPR[RS] << (IMM + 1);
  375. GPR[RD] = EXTEND32(GPR[RT] + t);
  376. TRACE_ALU_RESULT (GPR[RD]);
  377. }
  378. 000000,5.RS,5.RT,5.RD,000,2.IMM,010101:SPECIAL:64::DLSA
  379. "dlsa r<RD>, r<RS>, r<RT>, <IMM + 1>"
  380. *mips64r6:
  381. {
  382. uint64_t t = GPR[RS] << (IMM + 1);
  383. GPR[RD] = GPR[RT] + t;
  384. TRACE_ALU_RESULT (GPR[RD]);
  385. }
  386. 001111,5.RS!0,5.RT,16.IMMEDIATE:POOL32X:32::AUI
  387. "aui r<RS>, r<RT>, <IMMEDIATE>"
  388. *mips32r6:
  389. *mips64r6:
  390. {
  391. TRACE_ALU_INPUT2 (GPR[RS], IMMEDIATE);
  392. GPR[RT] = EXTEND32 (GPR[RS] + (EXTEND16 (IMMEDIATE) << 16));
  393. TRACE_ALU_RESULT (GPR[RT]);
  394. }
  395. 011101,5.RS!0,5.RT,16.IMMEDIATE:POOL32X:64::DAUI
  396. "daui r<RS>, r<RT>, <IMMEDIATE>"
  397. *mips64r6:
  398. {
  399. TRACE_ALU_INPUT2 (GPR[RS], IMMEDIATE);
  400. GPR[RT] = GPR[RS] + (EXTEND16 (IMMEDIATE) << 16);
  401. TRACE_ALU_RESULT (GPR[RT]);
  402. }
  403. 000001,5.RS,00110,16.IMMEDIATE:POOL32X:64::DAHI
  404. "dahi r<RS>, <IMMEDIATE>"
  405. *mips64r6:
  406. {
  407. TRACE_ALU_INPUT2 (GPR[RS], IMMEDIATE);
  408. GPR[RS] = GPR[RS] + (EXTEND16 (IMMEDIATE) << 32);
  409. TRACE_ALU_RESULT (GPR[RS]);
  410. }
  411. 000001,5.RS,11110,16.IMMEDIATE:POOL32X:64::DATI
  412. "dati r<RS>, <IMMEDIATE>"
  413. *mips64r6:
  414. {
  415. TRACE_ALU_INPUT2 (GPR[RS], IMMEDIATE);
  416. GPR[RS] = GPR[RS] + (EXTEND16 (IMMEDIATE) << 48);
  417. TRACE_ALU_RESULT (GPR[RS]);
  418. }
  419. 011111,5.RS,5.RT,5.RD,010,2.IMMEDIATE,100000:POOL32X:32::ALIGN
  420. "align r<RD>, r<RS>, r<RT>, <IMMEDIATE>"
  421. *mips32r6:
  422. *mips64r6:
  423. {
  424. uint32_t rs = GPR[RS];
  425. uint32_t rt = GPR[RT];
  426. TRACE_ALU_INPUT2 (GPR[RS], GPR[RT]);
  427. GPR[RD] = EXTEND32 (rs >> 8 * (4 - IMMEDIATE) | rt << 8 * IMMEDIATE);
  428. TRACE_ALU_RESULT (GPR[RD]);
  429. }
  430. 011111,5.RS,5.RT,5.RD,01,3.IMMEDIATE,100100:POOL32X:64::DALIGN
  431. "dalign r<RD>, r<RS>, r<RT>, <IMMEDIATE>"
  432. *mips64r6:
  433. {
  434. uint64_t rs = GPR[RS];
  435. uint64_t rt = GPR[RT];
  436. TRACE_ALU_INPUT2 (GPR[RS], GPR[RT]);
  437. GPR[RD] = rs >> 8 * (8 - IMMEDIATE) | rt << 8 * IMMEDIATE;
  438. TRACE_ALU_RESULT (GPR[RD]);
  439. }
  440. 011111,00000,5.RT,5.RD,00000,100000:POOL32X:32::BITSWAP
  441. "bitswap r<RD>, r<RT>"
  442. *mips32r6:
  443. *mips64r6:
  444. {
  445. /* Taken from: http://graphics.stanford.edu/~seander/bithacks.html */
  446. uint32_t v = GPR[RT];
  447. TRACE_ALU_INPUT1 (v);
  448. v = ((v >> 1) & 0x55555555) | ((v & 0x55555555) << 1);
  449. v = ((v >> 2) & 0x33333333) | ((v & 0x33333333) << 2);
  450. v = ((v >> 4) & 0x0F0F0F0F) | ((v & 0x0F0F0F0F) << 4);
  451. GPR[RD] = EXTEND32 (v);
  452. TRACE_ALU_RESULT(GPR[RD]);
  453. }
  454. 011111,00000,5.RT,5.RD,00000,100100:POOL32X:64::DBITSWAP
  455. "dbitswap r<RD>, r<RT>"
  456. *mips64r6:
  457. {
  458. /* Taken from: http://graphics.stanford.edu/~seander/bithacks.html */
  459. uint64_t v = GPR[RT];
  460. TRACE_ALU_INPUT1 (v);
  461. v = ((v >> 1) & 0x5555555555555555) | ((v & 0x5555555555555555) << 1);
  462. v = ((v >> 2) & 0x3333333333333333) | ((v & 0x3333333333333333) << 2);
  463. v = ((v >> 4) & 0x0F0F0F0F0F0F0F0F) | ((v & 0x0F0F0F0F0F0F0F0F) << 4);
  464. TRACE_ALU_RESULT(v);
  465. GPR[RD] = v;
  466. }
  467. 111011,5.RS,00,19.IMMEDIATE:POOL32X:32::ADDIUPC
  468. "addiupc r<RS>, <IMMEDIATE>"
  469. *mips32r6:
  470. *mips64r6:
  471. {
  472. TRACE_ALU_INPUT1 (IMMEDIATE);
  473. GPR[RS] = loadstore_ea (SD_, CIA, EXTEND19 (IMMEDIATE) << 2);
  474. TRACE_ALU_RESULT (GPR[RS]);
  475. }
  476. 111011,5.RS,11110,16.IMMEDIATE:POOL32X:32::AUIPC
  477. "auipc r<RS>, <IMMEDIATE>"
  478. *mips32r6:
  479. *mips64r6:
  480. {
  481. TRACE_ALU_INPUT1 (IMMEDIATE);
  482. GPR[RS] = loadstore_ea (SD_, CIA, EXTEND32 (IMMEDIATE << 16));
  483. TRACE_ALU_RESULT (GPR[RS]);
  484. }
  485. 111011,5.RS,11111,16.IMMEDIATE:POOL32X:32::ALUIPC
  486. "aluipc r<RS>, <IMMEDIATE>"
  487. *mips32r6:
  488. *mips64r6:
  489. {
  490. TRACE_ALU_INPUT1 (IMMEDIATE);
  491. GPR[RS] = ~0x0FFFF & loadstore_ea (SD_, CIA, EXTEND32 (IMMEDIATE << 16));
  492. TRACE_ALU_RESULT (GPR[RS]);
  493. }
  494. 111011,5.RS,01,19.IMMEDIATE:POOL32X:32::LWPC
  495. "lwpc r<RS>, <IMMEDIATE>"
  496. *mips32r6:
  497. *mips64r6:
  498. {
  499. uint32_t offset = EXTEND19 (IMMEDIATE) << 2;
  500. TRACE_ALU_INPUT1 (IMMEDIATE);
  501. GPR[RS] = EXTEND32 (do_load (SD_, AccessLength_WORD, CIA, offset));
  502. TRACE_ALU_RESULT (GPR[RS]);
  503. }
  504. 111011,5.RS,10,19.IMMEDIATE:POOL32X:64::LWUPC
  505. "lwupc r<RS>, <IMMEDIATE>"
  506. *mips64r6:
  507. {
  508. uint32_t offset = EXTEND19 (IMMEDIATE) << 2;
  509. TRACE_ALU_INPUT1 (CIA + offset);
  510. GPR[RS] = do_load (SD_, AccessLength_WORD, CIA, offset);
  511. TRACE_ALU_RESULT (GPR[RS]);
  512. }
  513. 111011,5.RS,110,18.IMMEDIATE:POOL32X:64::LDPC
  514. "ldpc r<RS>, <IMMEDIATE>"
  515. *mips64r6:
  516. {
  517. uint32_t offset = EXTEND18 (IMMEDIATE) << 3;
  518. TRACE_ALU_INPUT1 (IMMEDIATE);
  519. GPR[RS] = do_load (SD_, AccessLength_DOUBLEWORD, CIA, offset);
  520. TRACE_ALU_RESULT (GPR[RS]);
  521. }
  522. 010001,1000,1.FMT,00000,5.FS,5.FD,011010::32,64,f::RINT.fmt
  523. "rint.%s<FMT> f<FD>, f<FS>"
  524. *mips32r6:
  525. *mips64r6:
  526. {
  527. uint64_t result;
  528. int fmt = FMT;
  529. check_fpu (SD_);
  530. check_u64 (SD_, instruction_0);
  531. check_fmt_p (SD_, fmt, instruction_0);
  532. TRACE_ALU_INPUT1 (FGR[FS]);
  533. RoundToIntegralExact (ValueFPR (FS, fmt), &result, fmt);
  534. StoreFPR (FD, fmt, result);
  535. TRACE_ALU_RESULT (FGR[FD]);
  536. }
  537. 010001,1000,1.FMT,00000,5.FS,5.FD,011011::32,64,f::CLASS.fmt
  538. "class.%s<FMT> f<FD>, f<FS>"
  539. *mips32r6:
  540. *mips64r6:
  541. {
  542. int fmt = FMT;
  543. check_fpu (SD_);
  544. check_u64 (SD_, instruction_0);
  545. check_fmt_p (SD_, fmt, instruction_0);
  546. StoreFPR (FD, fmt, Classify (ValueFPR (FS, fmt), fmt));
  547. }
  548. 010001,1000,1.FMT,5.FT,5.FS,5.FD,011100::32,64,f::MIN.fmt
  549. "min.%s<FMT> f<FD>, f<FS>, f<FT>"
  550. *mips32r6:
  551. *mips64r6:
  552. {
  553. int fmt = FMT;
  554. check_fpu (SD_);
  555. check_u64 (SD_, instruction_0);
  556. check_fmt_p (SD_, fmt, instruction_0);
  557. TRACE_ALU_INPUT2 (FGR[FS], FGR[FT]);
  558. StoreFPR (FD, fmt, Min (ValueFPR (FS, fmt), ValueFPR (FT, fmt), fmt));
  559. TRACE_ALU_RESULT (FGR[FD]);
  560. }
  561. 010001,1000,1.FMT,5.FT,5.FS,5.FD,011110::32,64,f::MAX.fmt
  562. "max.%s<FMT> f<FD>, f<FS>, f<FT>"
  563. *mips32r6:
  564. *mips64r6:
  565. {
  566. int fmt = FMT;
  567. check_fpu (SD_);
  568. check_u64 (SD_, instruction_0);
  569. check_fmt_p (SD_, fmt, instruction_0);
  570. TRACE_ALU_INPUT2 (FGR[FS], FGR[FT]);
  571. StoreFPR (FD, fmt, Max (ValueFPR (FS, fmt), ValueFPR (FT, fmt), fmt));
  572. TRACE_ALU_RESULT (FGR[FD]);
  573. }
  574. 010001,1000,1.FMT,5.FT,5.FS,5.FD,011101::32,64,f::MINA.fmt
  575. "mina.%s<FMT> f<FD>, f<FS>, f<FT>"
  576. *mips32r6:
  577. *mips64r6:
  578. {
  579. int fmt = FMT;
  580. check_fpu (SD_);
  581. check_u64 (SD_, instruction_0);
  582. check_fmt_p (SD_, fmt, instruction_0);
  583. TRACE_ALU_INPUT2 (FGR[FS], FGR[FT]);
  584. StoreFPR (FD, fmt, MinA (ValueFPR (FS, fmt), ValueFPR (FT, fmt), fmt));
  585. TRACE_ALU_RESULT (FGR[FD]);
  586. }
  587. 010001,1000,1.FMT,5.FT,5.FS,5.FD,011111::32,64,f::MAXA.fmt
  588. "maxa.%s<FMT> f<FD>, f<FS>, f<FT>"
  589. *mips32r6:
  590. *mips64r6:
  591. {
  592. int fmt = FMT;
  593. check_fpu (SD_);
  594. check_u64 (SD_, instruction_0);
  595. check_fmt_p (SD_, fmt, instruction_0);
  596. TRACE_ALU_INPUT2 (FGR[FS], FGR[FT]);
  597. StoreFPR (FD, fmt, MaxA (ValueFPR (FS, fmt), ValueFPR (FT, fmt), fmt));
  598. TRACE_ALU_RESULT (FGR[FD]);
  599. }
  600. 000000,5.RS,5.RT,5.RD,00010,011000:POOL32X:32::MUL
  601. "mul r<RD>, r<RS>, r<RT>"
  602. *mips32r6:
  603. *mips64r6:
  604. {
  605. int64_t prod;
  606. if (NotWordValue (GPR[RS]) || NotWordValue (GPR[RT]))
  607. Unpredictable ();
  608. TRACE_ALU_INPUT2 (GPR[RS], GPR[RT]);
  609. prod = ((int64_t)(int32_t) GPR[RS])
  610. * ((int64_t)(int32_t) GPR[RT]);
  611. GPR[RD] = EXTEND32 (VL4_8 (prod));
  612. TRACE_ALU_RESULT (GPR[RD]);
  613. }
  614. 000000,5.RS,5.RT,5.RD,00011,011000:POOL32X:32::MUH
  615. "muh r<RD>, r<RS>, r<RT>"
  616. *mips32r6:
  617. *mips64r6:
  618. {
  619. int64_t prod;
  620. if (NotWordValue (GPR[RS]) || NotWordValue (GPR[RT]))
  621. Unpredictable ();
  622. TRACE_ALU_INPUT2 (GPR[RS], GPR[RT]);
  623. prod = ((int64_t)(int32_t) GPR[RS])
  624. * ((int64_t)(int32_t) GPR[RT]);
  625. GPR[RD] = EXTEND32 (VH4_8 (prod));
  626. TRACE_ALU_RESULT (GPR[RD]);
  627. }
  628. 000000,5.RS,5.RT,5.RD,00010,011001:POOL32X:32::MULU
  629. "mulu r<RD>, r<RS>, r<RT>"
  630. *mips32r6:
  631. *mips64r6:
  632. {
  633. uint64_t prod;
  634. if (NotWordValue (GPR[RS]) || NotWordValue (GPR[RT]))
  635. Unpredictable ();
  636. TRACE_ALU_INPUT2 (GPR[RS], GPR[RT]);
  637. prod = ((uint64_t)(uint32_t) GPR[RS])
  638. * ((uint64_t)(uint32_t) GPR[RT]);
  639. GPR[RD] = EXTEND32 (VL4_8 (prod));
  640. TRACE_ALU_RESULT (GPR[RD]);
  641. }
  642. 000000,5.RS,5.RT,5.RD,00011,011001:POOL32X:32::MUHU
  643. "muhu r<RD>, r<RS>, r<RT>"
  644. *mips32r6:
  645. *mips64r6:
  646. {
  647. uint64_t prod;
  648. if (NotWordValue (GPR[RS]) || NotWordValue (GPR[RT]))
  649. Unpredictable ();
  650. TRACE_ALU_INPUT2 (GPR[RS], GPR[RT]);
  651. prod = ((uint64_t)(uint32_t) GPR[RS])
  652. * ((uint64_t)(uint32_t) GPR[RT]);
  653. GPR[RD] = EXTEND32 (VH4_8 (prod));
  654. TRACE_ALU_RESULT (GPR[RD]);
  655. }
  656. 000000,5.RS,5.RT,5.RD,00010,011010:POOL32X:32::DIV
  657. "div r<RD>, r<RS>, r<RT>"
  658. *mips32r6:
  659. *mips64r6:
  660. {
  661. int32_t n = GPR[RS];
  662. int32_t d = GPR[RT];
  663. TRACE_ALU_INPUT2 (n,d);
  664. if (d == 0)
  665. GPR[RD] = EXTEND32 (0x80000000);
  666. else if (n == SIGNED32 (0x80000000) && d == -1)
  667. GPR[RD] = EXTEND32 (0x80000000);
  668. else
  669. GPR[RD] = EXTEND32 (n / d);
  670. TRACE_ALU_RESULT (GPR[RD]);
  671. }
  672. 000000,5.RS,5.RT,5.RD,00011,011010:POOL32X:32::MOD
  673. "mod r<RD>, r<RS>, r<RT>"
  674. *mips32r6:
  675. *mips64r6:
  676. {
  677. int32_t n = GPR[RS];
  678. int32_t d = GPR[RT];
  679. TRACE_ALU_INPUT2 (n,d);
  680. if (d == 0 || (n == SIGNED32 (0x80000000) && d == -1))
  681. GPR[RD] = EXTEND32 (0);
  682. else
  683. GPR[RD] = EXTEND32 (n % d);
  684. TRACE_ALU_RESULT (GPR[RD]);
  685. }
  686. 000000,5.RS,5.RT,5.RD,00010,011011:POOL32X:32::DIVU
  687. "divu r<RD>, r<RS>, r<RT>"
  688. *mips32r6:
  689. *mips64r6:
  690. {
  691. uint32_t n = GPR[RS];
  692. uint32_t d = GPR[RT];
  693. TRACE_ALU_INPUT2 (n,d);
  694. if (d == 0)
  695. GPR[RD] = EXTEND32 (0x80000000);
  696. else
  697. GPR[RD] = EXTEND32 (n / d);
  698. TRACE_ALU_RESULT (GPR[RD]);
  699. }
  700. 000000,5.RS,5.RT,5.RD,00011,011011:POOL32X:32::MODU
  701. "modu r<RD>, r<RS>, r<RT>"
  702. *mips32r6:
  703. *mips64r6:
  704. {
  705. uint32_t n = GPR[RS];
  706. uint32_t d = GPR[RT];
  707. TRACE_ALU_INPUT2 (n,d);
  708. if (d == 0)
  709. GPR[RD] = EXTEND32 (0);
  710. else
  711. GPR[RD] = EXTEND32 (n % d);
  712. TRACE_ALU_RESULT (GPR[RD]);
  713. }
  714. 000000,5.RS,5.RT,5.RD,00010,011100:POOL32X:64::DMUL
  715. "dmul r<RD>, r<RS>, r<RT>"
  716. *mips64r6:
  717. {
  718. uint64_t lo;
  719. uint64_t m00;
  720. uint64_t m01;
  721. uint64_t m10;
  722. uint64_t mid;
  723. int sign;
  724. uint64_t op1 = GPR[RS];
  725. uint64_t op2 = GPR[RT];
  726. check_u64 (SD_, instruction_0);
  727. TRACE_ALU_INPUT2 (op1, op2);
  728. /* make signed multiply unsigned */
  729. sign = 0;
  730. if ((int64_t) op1 < 0)
  731. {
  732. op1 = - op1;
  733. ++sign;
  734. }
  735. if ((int64_t) op2 < 0)
  736. {
  737. op2 = - op2;
  738. ++sign;
  739. }
  740. /* multiply out the sub products */
  741. m00 = ((uint64_t) VL4_8 (op1) * (uint64_t) VL4_8 (op2));
  742. m10 = ((uint64_t) VH4_8 (op1) * (uint64_t) VL4_8 (op2));
  743. m01 = ((uint64_t) VL4_8 (op1) * (uint64_t) VH4_8 (op2));
  744. /* add the products */
  745. mid = ((uint64_t) VH4_8 (m00)
  746. + (uint64_t) VL4_8 (m10)
  747. + (uint64_t) VL4_8 (m01));
  748. lo = U8_4 (mid, m00);
  749. /* fix the sign */
  750. if (sign & 1)
  751. lo = -lo;
  752. GPR[RD] = lo;
  753. TRACE_ALU_RESULT (GPR[RD]);
  754. }
  755. 000000,5.RS,5.RT,5.RD,00011,011100:POOL32X:64::DMUH
  756. "dmuh r<RD>, r<RS>, r<RT>"
  757. *mips64r6:
  758. {
  759. uint64_t lo;
  760. uint64_t hi;
  761. uint64_t m00;
  762. uint64_t m01;
  763. uint64_t m10;
  764. uint64_t m11;
  765. uint64_t mid;
  766. int sign;
  767. uint64_t op1 = GPR[RS];
  768. uint64_t op2 = GPR[RT];
  769. check_u64 (SD_, instruction_0);
  770. TRACE_ALU_INPUT2 (op1, op2);
  771. /* make signed multiply unsigned */
  772. sign = 0;
  773. if ((int64_t) op1 < 0)
  774. {
  775. op1 = - op1;
  776. ++sign;
  777. }
  778. if ((int64_t) op2 < 0)
  779. {
  780. op2 = - op2;
  781. ++sign;
  782. }
  783. /* multiply out the 4 sub products */
  784. m00 = ((uint64_t) VL4_8 (op1) * (uint64_t) VL4_8 (op2));
  785. m10 = ((uint64_t) VH4_8 (op1) * (uint64_t) VL4_8 (op2));
  786. m01 = ((uint64_t) VL4_8 (op1) * (uint64_t) VH4_8 (op2));
  787. m11 = ((uint64_t) VH4_8 (op1) * (uint64_t) VH4_8 (op2));
  788. /* add the products */
  789. mid = ((uint64_t) VH4_8 (m00)
  790. + (uint64_t) VL4_8 (m10)
  791. + (uint64_t) VL4_8 (m01));
  792. lo = U8_4 (mid, m00);
  793. hi = (m11
  794. + (uint64_t) VH4_8 (mid)
  795. + (uint64_t) VH4_8 (m01)
  796. + (uint64_t) VH4_8 (m10));
  797. /* fix the sign */
  798. if (sign & 1)
  799. {
  800. lo = -lo;
  801. if (lo == 0)
  802. hi = -hi;
  803. else
  804. hi = -hi - 1;
  805. }
  806. GPR[RD] = hi;
  807. TRACE_ALU_RESULT (GPR[RD]);
  808. }
  809. 000000,5.RS,5.RT,5.RD,00010,011101:POOL32X:64::DMULU
  810. "dmulu r<RD>, r<RS>, r<RT>"
  811. *mips64r6:
  812. {
  813. uint64_t lo;
  814. uint64_t m00;
  815. uint64_t m01;
  816. uint64_t m10;
  817. uint64_t mid;
  818. uint64_t op1 = GPR[RS];
  819. uint64_t op2 = GPR[RT];
  820. check_u64 (SD_, instruction_0);
  821. TRACE_ALU_INPUT2 (op1, op2);
  822. /* multiply out the sub products */
  823. m00 = ((uint64_t) VL4_8 (op1) * (uint64_t) VL4_8 (op2));
  824. m10 = ((uint64_t) VH4_8 (op1) * (uint64_t) VL4_8 (op2));
  825. m01 = ((uint64_t) VL4_8 (op1) * (uint64_t) VH4_8 (op2));
  826. /* add the products */
  827. mid = ((uint64_t) VH4_8 (m00)
  828. + (uint64_t) VL4_8 (m10)
  829. + (uint64_t) VL4_8 (m01));
  830. lo = U8_4 (mid, m00);
  831. GPR[RD] = lo;
  832. TRACE_ALU_RESULT (GPR[RD]);
  833. }
  834. 000000,5.RS,5.RT,5.RD,00011,011101:POOL32X:64::DMUHU
  835. "dmuhu r<RD>, r<RS>, r<RT>"
  836. *mips64r6:
  837. {
  838. uint64_t lo;
  839. uint64_t hi;
  840. uint64_t m00;
  841. uint64_t m01;
  842. uint64_t m10;
  843. uint64_t m11;
  844. uint64_t mid;
  845. uint64_t op1 = GPR[RS];
  846. uint64_t op2 = GPR[RT];
  847. check_u64 (SD_, instruction_0);
  848. TRACE_ALU_INPUT2 (op1, op2);
  849. /* multiply out the 4 sub products */
  850. m00 = ((uint64_t) VL4_8 (op1) * (uint64_t) VL4_8 (op2));
  851. m10 = ((uint64_t) VH4_8 (op1) * (uint64_t) VL4_8 (op2));
  852. m01 = ((uint64_t) VL4_8 (op1) * (uint64_t) VH4_8 (op2));
  853. m11 = ((uint64_t) VH4_8 (op1) * (uint64_t) VH4_8 (op2));
  854. /* add the products */
  855. mid = ((uint64_t) VH4_8 (m00)
  856. + (uint64_t) VL4_8 (m10)
  857. + (uint64_t) VL4_8 (m01));
  858. lo = U8_4 (mid, m00);
  859. hi = (m11
  860. + (uint64_t) VH4_8 (mid)
  861. + (uint64_t) VH4_8 (m01)
  862. + (uint64_t) VH4_8 (m10));
  863. GPR[RD] = hi;
  864. TRACE_ALU_RESULT (GPR[RD]);
  865. }
  866. 000000,5.RS,5.RT,5.RD,00010,011110:POOL32X:64::DDIV
  867. "ddiv r<RD>, r<RS>, r<RT>"
  868. *mips64r6:
  869. {
  870. int64_t n = GPR[RS];
  871. int64_t d = GPR[RT];
  872. check_u64 (SD_, instruction_0);
  873. TRACE_ALU_INPUT2 (n, d);
  874. if (d == 0)
  875. GPR[RD] = SIGNED64 (0x8000000000000000);
  876. else if (d == -1 && n == SIGNED64 (0x8000000000000000))
  877. GPR[RD] = SIGNED64 (0x8000000000000000);
  878. else
  879. GPR[RD] = (n / d);
  880. TRACE_ALU_RESULT (GPR[RD]);
  881. }
  882. 000000,5.RS,5.RT,5.RD,00011,011110:POOL32X:64::DMOD
  883. "dmod r<RD>, r<RS>, r<RT>"
  884. *mips64r6:
  885. {
  886. int64_t n = GPR[RS];
  887. int64_t d = GPR[RT];
  888. check_u64 (SD_, instruction_0);
  889. TRACE_ALU_INPUT2 (n, d);
  890. if (d == 0 || (d == -1 && n == SIGNED64 (0x8000000000000000)))
  891. GPR[RD] = SIGNED64 (0);
  892. else
  893. GPR[RD] = (n % d);
  894. TRACE_ALU_RESULT (GPR[RD]);
  895. }
  896. 000000,5.RS,5.RT,5.RD,00010,011111:POOL32X:64::DDIVU
  897. "ddivu r<RD>, r<RS>, r<RT>"
  898. *mips64r6:
  899. {
  900. uint64_t n = GPR[RS];
  901. uint64_t d = GPR[RT];
  902. check_u64 (SD_, instruction_0);
  903. TRACE_ALU_INPUT2 (n, d);
  904. if (d == 0)
  905. GPR[RD] = UNSIGNED64 (0x8000000000000000);
  906. else
  907. GPR[RD] = (n / d);
  908. TRACE_ALU_RESULT (GPR[RD]);
  909. }
  910. 000000,5.RS,5.RT,5.RD,00011,011111:POOL32X:64::DMODU
  911. "dmodu r<RD>, r<RS>, r<RT>"
  912. *mips64r6:
  913. {
  914. uint64_t n = GPR[RS];
  915. uint64_t d = GPR[RT];
  916. check_u64 (SD_, instruction_0);
  917. TRACE_ALU_INPUT2 (n, d);
  918. if (d == 0)
  919. GPR[RD] = UNSIGNED64 (0);
  920. else
  921. GPR[RD] = (n % d);
  922. TRACE_ALU_RESULT (GPR[RD]);
  923. }
  924. 011111,5.BASE,5.RT,9.OFFSET,0,110110:SPECIAL3:32::LL
  925. "ll r<RT>, <OFFSET>(r<BASE>)"
  926. *mips32r6:
  927. *mips64r6:
  928. {
  929. do_ll (SD_, RT, EXTEND9 (OFFSET), BASE);
  930. }
  931. 011111,5.BASE,5.RT,5.RD,0000,1,110110:SPECIAL3:32::LLWP
  932. "llwp r<RT>, r<RD>, (r<BASE>)"
  933. *mips32r6:
  934. *mips64r6:
  935. {
  936. int first, second;
  937. int offset;
  938. if (RT == BASE)
  939. {
  940. first = RD;
  941. second = RT;
  942. offset = BigEndianCPU ? 0 : 4;
  943. }
  944. else
  945. {
  946. first = RT;
  947. second = RD;
  948. offset = BigEndianCPU ? 4 : 0;
  949. }
  950. do_ll (SD_, first, offset, BASE);
  951. do_ll (SD_, second, offset ^ 4, BASE);
  952. }
  953. 011111,5.BASE,5.RT,9.OFFSET,0,100110:SPECIAL3:32::SC
  954. "sc r<RT>, <OFFSET>(r<BASE>)"
  955. *mips32r6:
  956. *mips64r6:
  957. {
  958. do_sc (SD_, RT, EXTEND9 (OFFSET), BASE, instruction_0, 1);
  959. }
  960. 011111,5.BASE,5.RT,9.OFFSET,0,110111:SPECIAL3:64::LLD
  961. "lld r<RT>, <OFFSET>(r<BASE>)"
  962. *mips64r6:
  963. {
  964. check_u64 (SD_, instruction_0);
  965. do_lld (SD_, RT, EXTEND9 (OFFSET), BASE);
  966. }
  967. 011111,5.BASE,5.RT,5.RD,0000,1,100110:SPECIAL3:32::SCWP
  968. "scwp r<RT>, r<RD>, (r<BASE>)"
  969. *mips32r6:
  970. *mips64r6:
  971. {
  972. int offset = BigEndianCPU ? 0 : 4;
  973. do_sc (SD_, RD, offset, BASE, instruction_0, 0);
  974. do_sc (SD_, RT, offset ^ 4, BASE, instruction_0, 1);
  975. }
  976. 011111,5.BASE,5.RT,5.RD,0000,1,110111:SPECIAL3:64::LLDP
  977. "lldp r<RT>, r<RD>, (r<BASE>)"
  978. *mips64r6:
  979. {
  980. int first, second;
  981. int offset;
  982. check_u64 (SD_, instruction_0);
  983. if (RT == BASE)
  984. {
  985. first = RD;
  986. second = RT;
  987. offset = BigEndianCPU ? 0 : 8;
  988. }
  989. else
  990. {
  991. first = RT;
  992. second = RD;
  993. offset = BigEndianCPU ? 8 : 0;
  994. }
  995. do_lld (SD_, first, offset, BASE);
  996. do_lld (SD_, second, offset ^ 8, BASE);
  997. }
  998. 011111,5.BASE,5.RT,9.OFFSET,0,100111:SPECIAL3:64::SCD
  999. "scd r<RT>, <OFFSET>(r<BASE>)"
  1000. *mips64r6:
  1001. {
  1002. check_u64 (SD_, instruction_0);
  1003. do_scd (SD_, RT, EXTEND9 (OFFSET), BASE, 1);
  1004. }
  1005. 011111,5.BASE,5.RT,5.RD,0000,1,100111:SPECIAL3:64::SCDP
  1006. "scdp r<RT>, r<RD>, (r<BASE>)"
  1007. *mips64r6:
  1008. {
  1009. int offset = BigEndianCPU ? 0 : 8;
  1010. check_u64 (SD_, instruction_0);
  1011. do_scd (SD_, RD, offset, BASE, 0);
  1012. do_scd (SD_, RT, offset ^ 8, BASE, 1);
  1013. }
  1014. 011111,5.BASE,5.HINT,9.OFFSET,0,110101:SPECIAL3:32::PREF
  1015. "pref <HINT>, <OFFSET>(r<BASE>)"
  1016. *mips32r6:
  1017. *mips64r6:
  1018. {
  1019. do_pref (SD_, HINT, EXTEND9 (OFFSET), BASE);
  1020. }
  1021. 011111,5.BASE,5.HINT,9.OFFSET,0,100101:SPECIAL3:32::CACHE
  1022. "cache <HINT>, <OFFSET>(r<BASE>)"
  1023. *mips32r6:
  1024. *mips64r6:
  1025. {
  1026. do_cache (SD_, HINT, BASE, EXTEND9 (OFFSET), instruction_0);
  1027. }
  1028. 000000,5.RS,00000,5.RD,00001,010000:POOL32X:32::CLZ
  1029. "clz r<RD>, r<RS>"
  1030. *mips32r6:
  1031. *mips64r6:
  1032. {
  1033. do_clz (SD_, RD, RS);
  1034. }
  1035. 000000,5.RS,00000,5.RD,00001,010001:POOL32X:32::CLO
  1036. "clo r<RD>, r<RS>"
  1037. *mips32r6:
  1038. *mips64r6:
  1039. {
  1040. do_clo (SD_, RD, RS);
  1041. }
  1042. 000000,5.RS,00000,5.RD,00001,010010:POOL32X:64::DCLZ
  1043. "dclz r<RD>, r<RS>"
  1044. *mips64r6:
  1045. {
  1046. check_u64 (SD_, instruction_0);
  1047. do_dclz (SD_, RD, RS);
  1048. }
  1049. 000000,5.RS,00000,5.RD,00001,010011:POOL32X:64::DCLO
  1050. "dclo r<RD>, r<RS>"
  1051. *mips64r6:
  1052. {
  1053. check_u64 (SD_, instruction_0);
  1054. do_dclo (SD_, RD, RS);
  1055. }
  1056. 010001,1000,1.FMT,5.FT,5.FS,5.FD,010000:POOL32X:32,f::SEL.fmt
  1057. "sel.%s<FMT> f<FD>, f<FS>, f<FT>"
  1058. *mips32r6:
  1059. *mips64r6:
  1060. {
  1061. check_fpu (SD_);
  1062. check_fmt_p (SD_, FMT, instruction_0);
  1063. TRACE_ALU_INPUT3 (FGR[FD], ValueFPR(FS, FMT), ValueFPR(FT, FMT));
  1064. if ((FGR[FD] & 0x01) != 0)
  1065. StoreFPR (FD, FMT, ValueFPR (FT, FMT));
  1066. else
  1067. StoreFPR (FD, FMT, ValueFPR (FS, FMT));
  1068. TRACE_ALU_RESULT (ValueFPR(FD, FMT));
  1069. }
  1070. 010001,1000,1.FMT,5.FT,5.FS,5.FD,010100:POOL32X:32,f::SELEQZ.fmt
  1071. "seleqz.%s<FMT> f<FD>, f<FS>, f<FT>"
  1072. *mips32r6:
  1073. *mips64r6:
  1074. {
  1075. check_fpu (SD_);
  1076. check_fmt_p (SD_, FMT, instruction_0);
  1077. TRACE_ALU_INPUT2 (ValueFPR(FS, FMT), FGR[FT]);
  1078. if ((FGR[FT] & 0x01) == 0)
  1079. StoreFPR (FD, FMT, ValueFPR (FS, FMT));
  1080. else
  1081. StoreFPR (FD, FMT, 0);
  1082. TRACE_ALU_RESULT (ValueFPR(FD, FMT));
  1083. }
  1084. 010001,1000,1.FMT,5.FT,5.FS,5.FD,010111:POOL32X:32,f::SELNEZ.fmt
  1085. "selnez.%s<FMT> f<FD>, f<FS>, f<FT>"
  1086. *mips32r6:
  1087. *mips64r6:
  1088. {
  1089. check_fpu (SD_);
  1090. check_fmt_p (SD_, FMT, instruction_0);
  1091. TRACE_ALU_INPUT2 (ValueFPR(FS, FMT), FGR[FT]);
  1092. if ((FGR[FT] & 0x01) == 0)
  1093. StoreFPR (FD, FMT, 0);
  1094. else
  1095. StoreFPR (FD, FMT, ValueFPR (FS, FMT));
  1096. TRACE_ALU_RESULT (ValueFPR(FD, FMT));
  1097. }
  1098. 000000,5.RS,5.RT,5.RD,00000,110101:POOL32X:32::SELEQZ
  1099. "seleqz r<RD>, r<RS>, r<RT>"
  1100. *mips32r6:
  1101. *mips64r6:
  1102. {
  1103. TRACE_ALU_INPUT2 (GPR[RS], GPR[RT]);
  1104. if (GPR[RT] != 0)
  1105. GPR[RD] = 0;
  1106. else
  1107. GPR[RD] = GPR[RS];
  1108. TRACE_ALU_RESULT (GPR[RD]);
  1109. }
  1110. 000000,5.RS,5.RT,5.RD,00000,110111:POOL32X:32::SELNEZ
  1111. "selnez r<RD>, r<RS>, r<RT>"
  1112. *mips32r6:
  1113. *mips64r6:
  1114. {
  1115. TRACE_ALU_INPUT2 (GPR[RS], GPR[RT]);
  1116. if (GPR[RT] != 0)
  1117. GPR[RD] = GPR[RS];
  1118. else
  1119. GPR[RD] = 0;
  1120. TRACE_ALU_RESULT (GPR[RD]);
  1121. }