iu.c 34 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038
  1. /*
  2. * This file is part of the UCB release of Plan 9. It is subject to the license
  3. * terms in the LICENSE file found in the top-level directory of this
  4. * distribution and at http://akaros.cs.berkeley.edu/files/Plan9License. No
  5. * part of the UCB release of Plan 9, including this file, may be copied,
  6. * modified, propagated, or distributed except according to the terms contained
  7. * in the LICENSE file.
  8. */
  9. #include <u.h>
  10. #include <libc.h>
  11. #include <bio.h>
  12. #include <mach.h>
  13. #define Extern extern
  14. #include "power.h"
  15. void add(ulong);
  16. void addc(ulong);
  17. void adde(ulong);
  18. void addme(ulong);
  19. void addze(ulong);
  20. void and(ulong);
  21. void andc(ulong);
  22. void cmp(ulong);
  23. void cmpl(ulong);
  24. void cntlzw(ulong);
  25. void dcbf(ulong);
  26. void dcbi(ulong);
  27. void dcbst(ulong);
  28. void dcbt(ulong);
  29. void dcbtst(ulong);
  30. void dcbz(ulong);
  31. void divw(ulong);
  32. void divwu(ulong);
  33. void eciwx(ulong);
  34. void ecowx(ulong);
  35. void eieio(ulong);
  36. void eqv(ulong);
  37. void extsb(ulong);
  38. void extsh(ulong);
  39. void icbi(ulong);
  40. void lbzx(ulong);
  41. void lfdx(ulong);
  42. void lfsx(ulong);
  43. void lhax(ulong);
  44. void lhbrx(ulong);
  45. void lhzx(ulong);
  46. void lswi(ulong);
  47. void lswx(ulong);
  48. void lwarx(ulong);
  49. void lwbrx(ulong);
  50. void lwzx(ulong);
  51. void mcrxr(ulong);
  52. void mfcr(ulong);
  53. void mfmsr(ulong);
  54. void mfpmr(ulong);
  55. void mfspr(ulong);
  56. void mfsr(ulong);
  57. void mfsrin(ulong);
  58. void mftb(ulong);
  59. void mftbu(ulong);
  60. void mspr(ulong);
  61. void mtcrf(ulong);
  62. void mtmsr(ulong);
  63. void mtpmr(ulong);
  64. void mtspr(ulong);
  65. void mtsr(ulong);
  66. void mtsrin(ulong);
  67. void mttb(ulong);
  68. void mttbu(ulong);
  69. void mulhw(ulong);
  70. void mulhwu(ulong);
  71. void mullw(ulong);
  72. void nand(ulong);
  73. void neg(ulong);
  74. void nor(ulong);
  75. void or(ulong);
  76. void orc(ulong);
  77. void slbia(ulong);
  78. void slbia(ulong);
  79. void slw(ulong);
  80. void sraw(ulong);
  81. void srawi(ulong);
  82. void srw(ulong);
  83. void stbx(ulong);
  84. void stfdx(ulong);
  85. void stfiwx(ulong);
  86. void stfsx(ulong);
  87. void sthbrx(ulong);
  88. void sthx(ulong);
  89. void stswi(ulong);
  90. void stswx(ulong);
  91. void stwbrx(ulong);
  92. void stwcx(ulong);
  93. void stwx(ulong);
  94. void subf(ulong);
  95. void subfc(ulong);
  96. void subfe(ulong);
  97. void subfme(ulong);
  98. void subfze(ulong);
  99. void sync(ulong);
  100. void tlbie(ulong);
  101. void tw(ulong);
  102. void xor(ulong);
  103. Inst op31[] = {
  104. [0] {cmp, "cmp", Iarith},
  105. [4] {tw, "tw", Iarith},
  106. [8] {subfc, "subfc", Iarith},
  107. [10] {addc, "addc", Iarith},
  108. [11] {mulhwu, "mulhwu", Iarith},
  109. [19] {mfcr, "mfcr", Iarith},
  110. [20] {lwarx, "lwarx", Iload},
  111. [23] {lwzx, "lwzx", Iload},
  112. [24] {slw, "slw", Ilog},
  113. [26] {cntlzw, "cntlzw", Ilog},
  114. [28] {and, "and", Ilog},
  115. [32] {cmpl, "cmpl", Iarith},
  116. [40] {subf, "subf", Iarith},
  117. [54] {dcbst, "dcbst", Icontrol},
  118. [55] {lwzx, "lwzux", Iload},
  119. [60] {andc, "andc", Ilog},
  120. [75] {mulhw, "mulhw", Iarith},
  121. [83] {0, "mfmsr", Icontrol},
  122. [86] {dcbf, "dcbf", Icontrol},
  123. [87] {lbzx, "lbzx", Iload},
  124. [104] {neg, "neg", Iarith},
  125. [115] {0, "mfpmr", Iarith},
  126. [119] {lbzx, "lbzux", Iload},
  127. [124] {nor, "nor", Iarith},
  128. [136] {subfe, "subfe", Iarith},
  129. [138] {adde, "adde", Iarith},
  130. [144] {mtcrf, "mtcrf", Ireg},
  131. [146] {0, "mtmsr", Icontrol},
  132. [150] {stwcx, "stwcx.", Istore},
  133. [151] {stwx, "stwx", Istore},
  134. [178] {0, "mtpmr", Icontrol},
  135. [183] {stwx, "stwux", Istore},
  136. [200] {subfze, "subfze", Iarith},
  137. [202] {addze, "addze", Iarith},
  138. [210] {0, "mtsr", Ireg},
  139. [215] {stbx, "stbx", Istore},
  140. [232] {subfme, "subfme", Iarith},
  141. [234] {addme, "addme", Iarith},
  142. [235] {mullw, "mullw", Iarith},
  143. [242] {0, "mtsrin", Ireg},
  144. [246] {dcbtst, "dcbtst", Icontrol},
  145. [247] {stbx, "stbux", Istore},
  146. [266] {add, "add", Iarith},
  147. [275] {0, "mftb", Icontrol},
  148. [278] {dcbt, "dcbt", Icontrol},
  149. [279] {lhzx, "lhzx", Iload},
  150. [284] {eqv, "eqv", Ilog},
  151. [306] {0, "tlbie", Icontrol},
  152. [307] {0, "mftbu", Icontrol},
  153. [310] {0, "eciwx", Icontrol},
  154. [311] {lhzx, "lhzux", Iload},
  155. [316] {xor, "xor", Ilog},
  156. [339] {mspr, "mfspr", Ireg},
  157. [343] {lhax, "lhax", Iload},
  158. [375] {lhax, "lhaux", Iload},
  159. [403] {0, "mttb", Icontrol},
  160. [407] {sthx, "sthx", Istore},
  161. [412] {orc, "orc", Ilog},
  162. [434] {0, "slbia", Iarith},
  163. [435] {0, "mttbu", Icontrol},
  164. [438] {0, "ecowx", Icontrol},
  165. [439] {sthx, "sthux", Istore},
  166. [444] {or, "or", Ilog},
  167. [459] {divwu, "divwu", Iarith},
  168. [467] {mspr, "mtspr", Ireg},
  169. [470] {0, "dcbi", Icontrol},
  170. [476] {nand, "nand", Ilog},
  171. [491] {divw, "divw", Iarith},
  172. [498] {0, "slbia", Icontrol},
  173. [512] {mcrxr, "mcrxr", Ireg},
  174. [533] {lswx, "lswx", Iload},
  175. [534] {lwbrx, "lwbrx", Iload},
  176. [535] {lfsx, "lfsx", Ifloat},
  177. [536] {srw, "srw", Ilog},
  178. [567] {lfsx, "lfsux", Ifloat},
  179. [595] {0, "mfsr", Iarith},
  180. [597] {lswi, "lswi", Iarith},
  181. [598] {sync, "sync", Iarith},
  182. [599] {lfdx, "lfdx", Ifloat},
  183. [631] {lfdx, "lfdux", Ifloat},
  184. [659] {0, "mfsrin", Ireg},
  185. [661] {stswx, "stswx", Istore},
  186. [662] {stwbrx, "stwbrx", Istore},
  187. [663] {stfsx, "stfsx", Istore},
  188. [695] {stfsx, "stfsux", Istore},
  189. [725] {stswi, "stswi", Istore},
  190. [727] {stfdx, "stfdx", Istore},
  191. [759] {stfdx, "stfdux", Istore},
  192. [790] {lhbrx, "lhbrx", Iload},
  193. [792] {sraw, "sraw", Ilog},
  194. [824] {srawi, "srawi", Ilog},
  195. [854] {0, "eieio", Icontrol},
  196. [918] {sthbrx, "sthbrx", Istore},
  197. [922] {extsh, "extsh", Iarith},
  198. [954] {extsb, "extsb", Iarith},
  199. [982] {icbi, "icbi", Icontrol},
  200. [983] {unimp, "stfiwx", Istore},
  201. [1014] {dcbz, "dcbz", Icontrol},
  202. };
  203. Inset ops31 = {op31, nelem(op31)};
  204. void
  205. mspr(uint32_t ir)
  206. {
  207. int rd, ra, rb;
  208. uint32_t *d;
  209. char *n;
  210. char buf[20];
  211. getarrr(ir);
  212. switch((rb<<5) | ra) {
  213. case 0:
  214. undef(ir); /* was mq */
  215. return;
  216. case 1:
  217. d = &reg.xer; n = "xer";
  218. break;
  219. case 268:
  220. case 284:
  221. d = &reg.tbl; n = "tbl";
  222. break;
  223. case 269:
  224. case 285:
  225. d = &reg.tbu; n = "tbu";
  226. break;
  227. case 22:
  228. d = &reg.dec; n = "dec";
  229. break;
  230. case 8:
  231. d = &reg.lr; n = "lr";
  232. break;
  233. case 9:
  234. d = &reg.ctr; n = "ctr";
  235. break;
  236. default:
  237. d = 0; sprint(n = buf, "spr%d", rd);
  238. break;
  239. }
  240. if(getxo(ir) == 339) {
  241. if(trace)
  242. itrace("%s\tr%d,%s", ci->name, rd, n);
  243. if(d != nil)
  244. reg.r[rd] = *d;
  245. } else {
  246. if(trace)
  247. itrace("%s\t%s,r%d", ci->name, n, rd);
  248. if(d != nil)
  249. *d = reg.r[rd];
  250. }
  251. }
  252. static void
  253. setcr(int d, int32_t r)
  254. {
  255. int c;
  256. c = 0;
  257. if(reg.xer & XER_SO)
  258. c |= 1;
  259. if(r == 0)
  260. c |= 2;
  261. else if(r > 0)
  262. c |= 4;
  263. else
  264. c |= 8;
  265. reg.cr = (reg.cr & ~mkCR(d, 0xF)) | mkCR(d, c);
  266. }
  267. void
  268. addi(uint32_t ir)
  269. {
  270. int rd, ra;
  271. int32_t imm;
  272. getairr(ir);
  273. if(trace) {
  274. if(ra)
  275. itrace("%s\tr%d,r%d,$0x%lux", ci->name, rd, ra, imm);
  276. else
  277. itrace("li\tr%d,$0x%lux", rd, imm);
  278. }
  279. if(ra)
  280. imm += reg.r[ra];
  281. reg.r[rd] = imm;
  282. }
  283. void
  284. addis(uint32_t ir)
  285. {
  286. int rd, ra;
  287. int32_t imm;
  288. getairr(ir);
  289. if(trace) {
  290. if(ra)
  291. itrace("%s\tr%d,r%d,$0x%lux", ci->name, rd, ra, imm);
  292. else
  293. itrace("lis\tr%d,$0x%lux", rd, imm);
  294. }
  295. imm <<= 16;
  296. if(ra)
  297. imm += reg.r[ra];
  298. reg.r[rd] = imm;
  299. }
  300. void
  301. and(uint32_t ir)
  302. {
  303. int rs, ra, rb;
  304. getlrrr(ir);
  305. reg.r[ra] = reg.r[rs] & reg.r[rb];
  306. if(trace)
  307. itrace("%s%s\tr%d,r%d,r%d", ci->name, ir&1?".":"", ra, rs, rb);
  308. if(ir & 1)
  309. setcr(0, reg.r[ra]);
  310. }
  311. void
  312. andc(uint32_t ir)
  313. {
  314. int rs, ra, rb;
  315. getlrrr(ir);
  316. reg.r[ra] = reg.r[rs] & ~reg.r[rb];
  317. if(trace)
  318. itrace("%s%s\tr%d,r%d,r%d", ci->name, ir&1?".":"", ra, rs, rb);
  319. if(ir & 1)
  320. setcr(0, reg.r[ra]);
  321. }
  322. void
  323. andicc(uint32_t ir)
  324. {
  325. int rs, ra;
  326. uint32_t imm;
  327. getlirr(ir);
  328. reg.r[ra] = reg.r[rs] & imm;
  329. if(trace)
  330. itrace("%s\tr%d,r%d,$0x%lx", ci->name, ra, rs, imm);
  331. setcr(0, reg.r[ra]);
  332. }
  333. void
  334. andiscc(uint32_t ir)
  335. {
  336. int rs, ra;
  337. uint32_t imm;
  338. getlirr(ir);
  339. reg.r[ra] = reg.r[rs] & (imm<<16);
  340. if(trace)
  341. itrace("%s\tr%d,r%d,$0x%lx", ci->name, ra, rs, imm);
  342. setcr(0, reg.r[ra]);
  343. }
  344. void
  345. cmpli(uint32_t ir)
  346. {
  347. int rd, ra;
  348. uint32_t c;
  349. uint32_t imm, v;
  350. getairr(ir);
  351. imm &= 0xFFFF;
  352. if(rd & 3)
  353. undef(ir);
  354. rd >>= 2;
  355. v = reg.r[ra];
  356. c = 0;
  357. if(reg.xer & XER_SO)
  358. c |= CRSO;
  359. if(v < imm)
  360. c |= CRLT;
  361. else if(v == imm)
  362. c |= CREQ;
  363. else
  364. c |= CRGT;
  365. c >>= 28;
  366. reg.cr = (reg.cr & ~mkCR(rd, 0xF)) | mkCR(rd, c);
  367. if(trace)
  368. itrace("%s\tcrf%d,r%d,0x%lux [cr=#%x]", ci->name, rd, ra, imm, c);
  369. }
  370. void
  371. cmp(uint32_t ir)
  372. {
  373. int rd, ra, rb;
  374. uint32_t c;
  375. int32_t va, vb;
  376. getarrr(ir);
  377. if(rd & 3)
  378. undef(ir);
  379. rd >>= 2;
  380. c = 0;
  381. if(reg.xer & XER_SO)
  382. c |= CRSO;
  383. va = reg.r[ra];
  384. vb = reg.r[rb];
  385. if(va < vb)
  386. c |= CRLT;
  387. else if(va == vb)
  388. c |= CREQ;
  389. else
  390. c |= CRGT;
  391. c >>= 28;
  392. reg.cr = (reg.cr & ~mkCR(rd, 0xF)) | mkCR(rd, c);
  393. if(trace)
  394. itrace("%s\tcrf%d,r%d,r%d [cr=#%x]", ci->name, rd, ra, rb, c);
  395. }
  396. void
  397. cmpi(uint32_t ir)
  398. {
  399. int rd, ra;
  400. uint32_t c;
  401. int32_t imm, v;
  402. getairr(ir);
  403. if(rd & 3)
  404. undef(ir);
  405. rd >>= 2;
  406. v = reg.r[ra];
  407. c = 0;
  408. if(reg.xer & XER_SO)
  409. c |= CRSO;
  410. if(v < imm)
  411. c |= CRLT;
  412. else if(v == imm)
  413. c |= CREQ;
  414. else
  415. c |= CRGT;
  416. c >>= 28;
  417. reg.cr = (reg.cr & ~mkCR(rd, 0xF)) | mkCR(rd, c);
  418. if(trace)
  419. itrace("%s\tcrf%d,r%d,0x%lux [cr=#%x]", ci->name, rd, ra, imm, c);
  420. }
  421. void
  422. cmpl(uint32_t ir)
  423. {
  424. int rd, ra, rb;
  425. uint32_t c;
  426. uint32_t va, vb;
  427. getarrr(ir);
  428. if(rd & 3)
  429. undef(ir);
  430. rd >>= 2;
  431. c = 0;
  432. if(reg.xer & XER_SO)
  433. c |= CRSO;
  434. va = reg.r[ra];
  435. vb = reg.r[rb];
  436. if(va < vb)
  437. c |= CRLT;
  438. else if(va == vb)
  439. c |= CREQ;
  440. else
  441. c |= CRGT;
  442. c >>= 28;
  443. reg.cr = (reg.cr & ~mkCR(rd, 0xF)) | mkCR(rd, c);
  444. if(trace)
  445. itrace("%s\tcrf%d,r%d,r%d [cr=#%x]", ci->name, rd, ra, rb, c);
  446. }
  447. void
  448. cntlzw(uint32_t ir)
  449. {
  450. int rs, ra, rb, n;
  451. getlrrr(ir);
  452. if(rb)
  453. undef(ir);
  454. for(n=0; n<32 && (reg.r[rs] & (1L<<(31-n))) == 0; n++)
  455. ;
  456. reg.r[ra] = n;
  457. if(trace)
  458. itrace("%s%s\tr%d,r%d", ci->name, ir&1?".":"", ra, rs);
  459. if(ir & 1)
  460. setcr(0, reg.r[ra]);
  461. }
  462. void
  463. eqv(uint32_t ir)
  464. {
  465. int rs, ra, rb;
  466. getlrrr(ir);
  467. reg.r[ra] = ~(reg.r[rs] ^ reg.r[rb]);
  468. if(trace)
  469. itrace("%s%s\tr%d,r%d,r%d", ci->name, ir&1?".":"", ra, rs, rb);
  470. if(ir & 1)
  471. setcr(0, reg.r[ra]);
  472. }
  473. void
  474. extsb(uint32_t ir)
  475. {
  476. int rs, ra, rb;
  477. getlrrr(ir);
  478. if(rb)
  479. undef(ir);
  480. reg.r[ra] = (schar)reg.r[rs];
  481. if(trace)
  482. itrace("%s%s\tr%d,r%d", ci->name, ir&1?".":"", ra, rs);
  483. if(ir & 1)
  484. setcr(0, reg.r[ra]);
  485. }
  486. void
  487. extsh(uint32_t ir)
  488. {
  489. int rs, ra, rb;
  490. getlrrr(ir);
  491. if(rb)
  492. undef(ir);
  493. reg.r[ra] = (int16_t)reg.r[rs];
  494. if(trace)
  495. itrace("%s%s\tr%d,r%d", ci->name, ir&1?".":"", ra, rs);
  496. if(ir & 1)
  497. setcr(0, reg.r[ra]);
  498. }
  499. void
  500. add(uint32_t ir)
  501. {
  502. int rd, ra, rb;
  503. uint64_t r;
  504. getarrr(ir);
  505. r = (uint64_t)(uint32_t)reg.r[ra] + (uint64_t)(uint32_t)reg.r[rb];
  506. if(ir & OE) {
  507. reg.xer &= ~XER_OV;
  508. if(r >> 16)
  509. reg.xer |= XER_SO | XER_OV; /* TO DO: rubbish */
  510. }
  511. reg.r[rd] = (uint32_t)r;
  512. if(ir & Rc)
  513. setcr(0, reg.r[rd]);
  514. if(trace)
  515. itrace("%s%s%s\tr%d,r%d,r%d", ci->name, ir&OE?"o":"", ir&1?".":"", rd, ra, rb);
  516. }
  517. void
  518. addc(uint32_t ir)
  519. {
  520. int rd, ra, rb;
  521. uint32_t v;
  522. uint64_t r;
  523. getarrr(ir);
  524. r = (uint64_t)(uint32_t)reg.r[ra] + (uint64_t)(uint32_t)reg.r[rb];
  525. v = r>>32;
  526. reg.xer &= ~XER_CA;
  527. if(v)
  528. reg.xer |= XER_CA;
  529. if(ir & OE) {
  530. reg.xer &= ~XER_OV;
  531. if(v>>1)
  532. reg.xer |= XER_SO | XER_OV;
  533. }
  534. reg.r[rd] = (uint32_t)r;
  535. if(ir & Rc)
  536. setcr(0, reg.r[rd]);
  537. if(trace)
  538. itrace("%s%s%s\tr%d,r%d,r%d", ci->name, ir&OE?"o":"", ir&1?".":"", rd, ra, rb);
  539. }
  540. void
  541. adde(uint32_t ir)
  542. {
  543. int rd, ra, rb;
  544. uint32_t v;
  545. uint64_t r;
  546. getarrr(ir);
  547. r = (uint64_t)(uint32_t)reg.r[ra] + (uint64_t)(uint32_t)reg.r[rb] + ((reg.xer&XER_CA)!=0);
  548. v = r>>32;
  549. reg.xer &= ~XER_CA;
  550. if(v)
  551. reg.xer |= XER_CA;
  552. if(ir & OE) {
  553. reg.xer &= ~XER_OV;
  554. if(v>>1)
  555. reg.xer |= XER_SO | XER_OV;
  556. }
  557. reg.r[rd] = (uint32_t)r;
  558. if(ir & Rc)
  559. setcr(0, reg.r[rd]);
  560. if(trace)
  561. itrace("%s%s%s\tr%d,r%d,r%d", ci->name, ir&OE?"o":"", ir&1?".":"", rd, ra, rb);
  562. }
  563. void
  564. addic(uint32_t ir)
  565. {
  566. int rd, ra;
  567. int32_t imm;
  568. uint32_t v;
  569. uint64_t r;
  570. getairr(ir);
  571. r = (uint64_t)(uint32_t)reg.r[ra] + (uint64_t)(uint32_t)imm;
  572. v = r>>32;
  573. reg.xer &= ~XER_CA;
  574. if(v)
  575. reg.xer |= XER_CA;
  576. reg.r[rd] = (uint32_t)r;
  577. if(trace)
  578. itrace("%s\tr%d,r%d,$%ld", ci->name, rd, ra, imm);
  579. }
  580. void
  581. addiccc(uint32_t ir)
  582. {
  583. int rd, ra;
  584. int32_t imm;
  585. uint32_t v;
  586. uint64_t r;
  587. getairr(ir);
  588. r = (uint64_t)(uint32_t)reg.r[ra] + (uint64_t)(uint32_t)imm;
  589. v = r>>32;
  590. reg.xer &= ~XER_CA;
  591. if(v)
  592. reg.xer |= XER_CA;
  593. reg.r[rd] = (uint32_t)r;
  594. setcr(0, reg.r[rd]);
  595. if(trace)
  596. itrace("%s\tr%d,r%d,$%ld", ci->name, rd, ra, imm);
  597. }
  598. void
  599. addme(uint32_t ir)
  600. {
  601. int rd, ra, rb;
  602. uint32_t v;
  603. uint64_t r;
  604. getarrr(ir);
  605. if(rb)
  606. undef(ir);
  607. r = (uint64_t)(uint32_t)reg.r[ra] + (uint64_t)0xFFFFFFFFU + ((reg.xer&XER_CA)!=0);
  608. v = r>>32;
  609. reg.xer &= ~XER_CA;
  610. if(v)
  611. reg.xer |= XER_CA;
  612. if(ir & OE) {
  613. reg.xer &= ~XER_OV;
  614. if(v>>1)
  615. reg.xer |= XER_SO | XER_OV;
  616. }
  617. reg.r[rd] = (uint32_t)r;
  618. if(ir & Rc)
  619. setcr(0, reg.r[rd]);
  620. if(trace)
  621. itrace("%s%s%s\tr%d,r%d", ci->name, ir&OE?"o":"", ir&1?".":"", rd, ra);
  622. }
  623. void
  624. addze(uint32_t ir)
  625. {
  626. int rd, ra, rb;
  627. uint32_t v;
  628. uint64_t r;
  629. getarrr(ir);
  630. if(rb)
  631. undef(ir);
  632. r = (uint64_t)(uint32_t)reg.r[ra] + ((reg.xer&XER_CA)!=0);
  633. v = r>>32;
  634. reg.xer &= ~XER_CA;
  635. if(v)
  636. reg.xer |= XER_CA;
  637. if(ir & OE) {
  638. reg.xer &= ~XER_OV;
  639. if(v>>1)
  640. reg.xer |= XER_SO | XER_OV;
  641. }
  642. reg.r[rd] = (uint32_t)r;
  643. if(ir & Rc)
  644. setcr(0, reg.r[rd]);
  645. if(trace)
  646. itrace("%s%s%s\tr%d,r%d", ci->name, ir&OE?"o":"", ir&1?".":"", rd, ra);
  647. }
  648. void
  649. divw(uint32_t ir)
  650. {
  651. int rd, ra, rb;
  652. getarrr(ir);
  653. if(reg.r[rb] != 0 && ((uint32_t)reg.r[ra] != 0x80000000 || reg.r[rb] != -1))
  654. reg.r[rd] = reg.r[ra]/reg.r[rb];
  655. else if(ir & OE)
  656. reg.xer |= XER_SO | XER_OV;
  657. if(ir & Rc)
  658. setcr(0, reg.r[rd]);
  659. if(trace)
  660. itrace("%s%s%s\tr%d,r%d,r%d", ci->name, ir&OE?"o":"", ir&1?".":"", rd, ra, rb);
  661. }
  662. void
  663. divwu(uint32_t ir)
  664. {
  665. int rd, ra, rb;
  666. getarrr(ir);
  667. if(reg.r[rb] != 0)
  668. reg.r[rd] = (uint32_t)reg.r[ra]/(uint32_t)reg.r[rb];
  669. else if(ir & OE)
  670. reg.xer |= XER_SO | XER_OV;
  671. if(ir & Rc)
  672. setcr(0, reg.r[rd]);
  673. if(trace)
  674. itrace("%s%s%s\tr%d,r%d,r%d", ci->name, ir&OE?"o":"", ir&1?".":"", rd, ra, rb);
  675. }
  676. void
  677. mcrxr(uint32_t ir)
  678. {
  679. int rd, ra, rb;
  680. getarrr(ir);
  681. if(rd & 3 || ra != 0 || rb != 0 || ir & Rc)
  682. undef(ir);
  683. rd >>= 2;
  684. reg.cr = (reg.cr & ~mkCR(rd, 0xF)) | mkCR(rd, reg.xer>>28);
  685. reg.xer &= ~(0xF<<28);
  686. }
  687. void
  688. mtcrf(uint32_t ir)
  689. {
  690. int rs, crm, i;
  691. uint32_t m;
  692. if(ir & ((1<<20)|(1<<11)|Rc))
  693. undef(ir);
  694. rs = (ir>>21)&0x1F;
  695. crm = (ir>>12)&0xFF;
  696. m = 0;
  697. for(i = 0x80; i; i >>= 1) {
  698. m <<= 4;
  699. if(crm & i)
  700. m |= 0xF;
  701. }
  702. reg.cr = (reg.cr & ~m) | (reg.r[rs] & m);
  703. }
  704. void
  705. mfcr(uint32_t ir)
  706. {
  707. int rd, ra, rb;
  708. getarrr(ir);
  709. if(ra != 0 || rb != 0 || ir & Rc)
  710. undef(ir);
  711. reg.r[rd] = reg.cr;
  712. }
  713. void
  714. mulhw(ulong ir)
  715. {
  716. int rd, ra, rb;
  717. getarrr(ir);
  718. reg.r[rd] = ((vlong)(long)reg.r[ra]*(long)reg.r[rb])>>32;
  719. if(ir & Rc)
  720. setcr(0, reg.r[rd]);
  721. if(trace)
  722. itrace("%s%s%s\tr%d,r%d,r%d", ci->name, ir&OE?"o":"", ir&Rc?".":"", rd, ra, rb);
  723. /* BUG: doesn't set OV */
  724. }
  725. void
  726. mulhwu(uint32_t ir)
  727. {
  728. int rd, ra, rb;
  729. getarrr(ir);
  730. reg.r[rd] = ((uint64_t)(uint32_t)reg.r[ra]*(uint32_t)reg.r[rb])>>32;
  731. if(ir & Rc)
  732. setcr(0, reg.r[rd]); /* not sure whether CR setting is signed or unsigned */
  733. if(trace)
  734. itrace("%s%s%s\tr%d,r%d,r%d", ci->name, ir&OE?"o":"", ir&Rc?".":"", rd, ra, rb);
  735. /* BUG: doesn't set OV */
  736. }
  737. void
  738. mullw(uint32_t ir)
  739. {
  740. int rd, ra, rb;
  741. getarrr(ir);
  742. reg.r[rd] = (uint64_t)(uint32_t)reg.r[ra]*(uint32_t)reg.r[rb];
  743. if(ir & Rc)
  744. setcr(0, reg.r[rd]);
  745. if(trace)
  746. itrace("%s%s%s\tr%d,r%d,r%d", ci->name, ir&OE?"o":"", ir&Rc?".":"", rd, ra, rb);
  747. /* BUG: doesn't set OV */
  748. }
  749. void
  750. mulli(uint32_t ir)
  751. {
  752. int rd, ra;
  753. int32_t imm;
  754. getairr(ir);
  755. reg.r[rd] = (uint64_t)(uint32_t)reg.r[ra]*(uint32_t)imm;
  756. if(trace)
  757. itrace("%s\tr%d,r%d,$%ld", ci->name, rd, ra, imm);
  758. }
  759. void
  760. nand(uint32_t ir)
  761. {
  762. int rs, ra, rb;
  763. getlrrr(ir);
  764. reg.r[ra] = ~(reg.r[rs] & reg.r[rb]);
  765. if(ir & Rc)
  766. setcr(0, reg.r[ra]);
  767. if(trace)
  768. itrace("%s%s\tr%d,r%d,r%d", ci->name, ir&1?".":"", ra, rs, rb);
  769. }
  770. void
  771. neg(uint32_t ir)
  772. {
  773. int rd, ra, rb;
  774. getarrr(ir);
  775. if(rb)
  776. undef(ir);
  777. if(ir & OE)
  778. reg.xer &= ~XER_OV;
  779. if((uint32_t)reg.r[ra] == 0x80000000) {
  780. if(ir & OE)
  781. reg.xer |= XER_SO | XER_OV;
  782. reg.r[rd] = reg.r[ra];
  783. } else
  784. reg.r[rd] = -reg.r[ra];
  785. if(ir & Rc)
  786. setcr(0, reg.r[rd]);
  787. }
  788. void
  789. nor(uint32_t ir)
  790. {
  791. int rs, ra, rb;
  792. getlrrr(ir);
  793. reg.r[ra] = ~(reg.r[rs] | reg.r[rb]);
  794. if(ir & Rc)
  795. setcr(0, reg.r[ra]);
  796. if(trace)
  797. itrace("%s%s\tr%d,r%d,r%d", ci->name, ir&1?".":"", ra, rs, rb);
  798. }
  799. void
  800. or(uint32_t ir)
  801. {
  802. int rs, ra, rb;
  803. getlrrr(ir);
  804. reg.r[ra] = reg.r[rs] | reg.r[rb];
  805. if(ir & Rc)
  806. setcr(0, reg.r[ra]);
  807. if(trace) {
  808. if(rs == rb)
  809. itrace("mr%s\tr%d,r%d", ir&1?".":"", ra, rs);
  810. else
  811. itrace("%s%s\tr%d,r%d,r%d", ci->name, ir&1?".":"", ra, rs, rb);
  812. }
  813. }
  814. void
  815. orc(uint32_t ir)
  816. {
  817. int rs, ra, rb;
  818. getlrrr(ir);
  819. reg.r[ra] = reg.r[rs] | ~reg.r[rb];
  820. if(ir & Rc)
  821. setcr(0, reg.r[ra]);
  822. if(trace)
  823. itrace("%s%s\tr%d,r%d,r%d", ci->name, ir&1?".":"", ra, rs, rb);
  824. }
  825. void
  826. ori(uint32_t ir)
  827. {
  828. int rs, ra;
  829. uint32_t imm;
  830. getlirr(ir);
  831. reg.r[ra] = reg.r[rs] | imm;
  832. if(trace)
  833. itrace("%s\tr%d,r%d,$0x%lx", ci->name, ra, rs, imm);
  834. }
  835. void
  836. oris(uint32_t ir)
  837. {
  838. int rs, ra;
  839. uint32_t imm;
  840. getlirr(ir);
  841. reg.r[ra] = reg.r[rs] | (imm<<16);
  842. if(trace)
  843. itrace("%s\tr%d,r%d,$0x%lx", ci->name, ra, rs, imm);
  844. }
  845. static uint32_t
  846. mkmask(int mb, int me)
  847. {
  848. int i;
  849. uint32_t v;
  850. if(mb > me)
  851. return mkmask(0, me) | mkmask(mb, 31);
  852. v = 0;
  853. for(i=mb; i<=me; i++)
  854. v |= 1L << (31-i); /* don't need a loop, but i'm lazy */
  855. return v;
  856. }
  857. static uint32_t
  858. rotl(uint32_t v, int sh)
  859. {
  860. if(sh == 0)
  861. return v;
  862. return (v<<sh) | (v>>(32-sh));
  863. }
  864. void
  865. rlwimi(uint32_t ir)
  866. {
  867. int rs, ra, rb, sh;
  868. uint32_t m;
  869. getlrrr(ir);
  870. sh = rb;
  871. m = mkmask((ir>>6)&0x1F, (ir>>1)&0x1F);
  872. reg.r[ra] = (reg.r[ra] & ~m) | (rotl(reg.r[rs], sh) & m);
  873. if(trace)
  874. itrace("%s\tr%d,r%d,%d,#%lux", ci->name, ra, rs, sh, m);
  875. if(ir & 1)
  876. setcr(0, reg.r[ra]);
  877. }
  878. void
  879. rlwinm(uint32_t ir)
  880. {
  881. int rs, ra, rb, sh;
  882. uint32_t m;
  883. getlrrr(ir);
  884. sh = rb;
  885. m = mkmask((ir>>6)&0x1F, (ir>>1)&0x1F);
  886. reg.r[ra] = rotl(reg.r[rs], sh) & m;
  887. if(trace)
  888. itrace("%s%s\tr%d,r%d,%d,#%lux", ci->name, ir&Rc?".":"", ra, rs, sh, m);
  889. if(ir & Rc)
  890. setcr(0, reg.r[ra]);
  891. }
  892. void
  893. rlwnm(uint32_t ir)
  894. {
  895. int rs, ra, rb, sh;
  896. uint32_t m;
  897. getlrrr(ir);
  898. sh = reg.r[rb] & 0x1F;
  899. m = mkmask((ir>>6)&0x1F, (ir>>1)&0x1F);
  900. reg.r[ra] = rotl(reg.r[rs], sh) & m;
  901. if(trace)
  902. itrace("%s\tr%d,r%d,r%d,#%lux", ci->name, ra, rs, rb, m);
  903. if(ir & 1)
  904. setcr(0, reg.r[ra]);
  905. }
  906. void
  907. slw(uint32_t ir)
  908. {
  909. int rs, ra, rb;
  910. int32_t v;
  911. getlrrr(ir);
  912. v = reg.r[rb];
  913. if((v & 0x20) == 0) {
  914. v &= 0x1F;
  915. reg.r[ra] = (uint32_t)reg.r[rs] << v;
  916. } else
  917. reg.r[ra] = 0;
  918. if(ir & Rc)
  919. setcr(0, reg.r[ra]);
  920. if(trace)
  921. itrace("%s%s\tr%d,r%d,r%d", ci->name, ir&1?".":"", ra, rs, rb);
  922. }
  923. void
  924. sraw(uint32_t ir)
  925. {
  926. int rs, ra, rb;
  927. int32_t v;
  928. getlrrr(ir);
  929. v = reg.r[rb];
  930. if((v & 0x20) == 0) {
  931. v &= 0x1F;
  932. if(reg.r[rs]&SIGNBIT && v)
  933. reg.r[ra] = reg.r[rs]>>v | ~((1<<(32-v))-1);
  934. else
  935. reg.r[ra] = reg.r[rs]>>v;
  936. } else
  937. reg.r[ra] = reg.r[rs]&SIGNBIT? ~0: 0;
  938. if(ir & Rc)
  939. setcr(0, reg.r[ra]);
  940. if(trace)
  941. itrace("%s%s\tr%d,r%d,r%d", ci->name, ir&1?".":"", ra, rs, rb);
  942. }
  943. void
  944. srawi(uint32_t ir)
  945. {
  946. int rs, ra, rb;
  947. int32_t v;
  948. getlrrr(ir);
  949. v = rb;
  950. if((v & 0x20) == 0) {
  951. v &= 0x1F;
  952. if(reg.r[rs]&SIGNBIT && v)
  953. reg.r[ra] = reg.r[rs]>>v | ~((1<<(32-v))-1);
  954. else
  955. reg.r[ra] = reg.r[rs]>>v;
  956. } else
  957. reg.r[ra] = reg.r[rs]&SIGNBIT? ~0: 0;
  958. if(ir & Rc)
  959. setcr(0, reg.r[ra]);
  960. if(trace)
  961. itrace("%s%s\tr%d,r%d,$%d", ci->name, ir&1?".":"", ra, rs, v);
  962. }
  963. void
  964. srw(uint32_t ir)
  965. {
  966. int rs, ra, rb;
  967. int32_t v;
  968. getlrrr(ir);
  969. v = reg.r[rb];
  970. if((v & 0x20) == 0)
  971. reg.r[ra] = (uint32_t)reg.r[rs] >> (v&0x1F);
  972. else
  973. reg.r[ra] = 0;
  974. if(ir & Rc)
  975. setcr(0, reg.r[ra]);
  976. if(trace)
  977. itrace("%s%s\tr%d,r%d,r%d", ci->name, ir&1?".":"", ra, rs, rb);
  978. }
  979. void
  980. subf(uint32_t ir)
  981. {
  982. int rd, ra, rb;
  983. uint64_t r;
  984. getarrr(ir);
  985. r = (uint64_t)((uint32_t)~reg.r[ra]) + (uint64_t)(uint32_t)reg.r[rb] + 1;
  986. if(ir & OE) {
  987. reg.xer &= ~XER_OV;
  988. if(r >> 16)
  989. reg.xer |= XER_SO | XER_OV;
  990. }
  991. reg.r[rd] = (uint32_t)r;
  992. if(ir & Rc)
  993. setcr(0, reg.r[rd]);
  994. if(trace)
  995. itrace("%s%s%s\tr%d,r%d,r%d", ci->name, ir&OE?"o":"", ir&1?".":"", rd, ra, rb);
  996. }
  997. void
  998. subfc(uint32_t ir)
  999. {
  1000. int rd, ra, rb;
  1001. uint32_t v;
  1002. uint64_t r;
  1003. getarrr(ir);
  1004. r = (uint64_t)((uint32_t)~reg.r[ra]) + (uint64_t)(uint32_t)reg.r[rb] + 1;
  1005. v = r>>32;
  1006. reg.xer &= ~XER_CA;
  1007. if(v)
  1008. reg.xer |= XER_CA;
  1009. if(ir & OE) {
  1010. reg.xer &= ~XER_OV;
  1011. if(v>>1)
  1012. reg.xer |= XER_SO | XER_OV;
  1013. }
  1014. reg.r[rd] = (uint32_t)r;
  1015. if(ir & Rc)
  1016. setcr(0, reg.r[rd]);
  1017. if(trace)
  1018. itrace("%s%s%s\tr%d,r%d,r%d", ci->name, ir&OE?"o":"", ir&1?".":"", rd, ra, rb);
  1019. }
  1020. void
  1021. subfe(uint32_t ir)
  1022. {
  1023. int rd, ra, rb;
  1024. uint32_t v;
  1025. uint64_t r;
  1026. getarrr(ir);
  1027. r = (uint64_t)((uint32_t)~reg.r[ra]) + (uint64_t)(uint32_t)reg.r[rb] + ((reg.xer&XER_CA)!=0);
  1028. v = r>>32;
  1029. reg.xer &= ~XER_CA;
  1030. if(v)
  1031. reg.xer |= XER_CA;
  1032. if(ir & OE) {
  1033. reg.xer &= ~XER_OV;
  1034. if(v>>1)
  1035. reg.xer |= XER_SO | XER_OV;
  1036. }
  1037. reg.r[rd] = (uint32_t)r;
  1038. if(ir & Rc)
  1039. setcr(0, reg.r[rd]);
  1040. if(trace)
  1041. itrace("%s%s%s\tr%d,r%d,r%d", ci->name, ir&OE?"o":"", ir&1?".":"", rd, ra, rb);
  1042. }
  1043. void
  1044. subfic(uint32_t ir)
  1045. {
  1046. int rd, ra;
  1047. int32_t imm;
  1048. uint32_t v;
  1049. uint64_t r;
  1050. getairr(ir);
  1051. r = (uint64_t)((uint32_t)~reg.r[ra]) + (uint64_t)(uint32_t)imm + 1;
  1052. v = r>>32;
  1053. reg.xer &= ~XER_CA;
  1054. if(v)
  1055. reg.xer |= XER_CA;
  1056. reg.r[rd] = (uint32_t)r;
  1057. if(trace)
  1058. itrace("%s\tr%d,r%d,$%ld", ci->name, rd, ra, imm);
  1059. }
  1060. void
  1061. subfme(uint32_t ir)
  1062. {
  1063. int rd, ra, rb;
  1064. uint32_t v;
  1065. uint64_t r;
  1066. getarrr(ir);
  1067. if(rb)
  1068. undef(ir);
  1069. r = (uint64_t)((uint32_t)~reg.r[ra]) + (uint64_t)0xFFFFFFFFU + ((reg.xer&XER_CA)!=0);
  1070. v = r>>32;
  1071. reg.xer &= ~XER_CA;
  1072. if(v)
  1073. reg.xer |= XER_CA;
  1074. if(ir & OE) {
  1075. reg.xer &= ~XER_OV;
  1076. if(v>>1)
  1077. reg.xer |= XER_SO | XER_OV;
  1078. }
  1079. reg.r[rd] = (uint32_t)r;
  1080. if(ir & Rc)
  1081. setcr(0, reg.r[rd]);
  1082. if(trace)
  1083. itrace("%s%s%s\tr%d,r%d", ci->name, ir&OE?"o":"", ir&1?".":"", rd, ra);
  1084. }
  1085. void
  1086. subfze(uint32_t ir)
  1087. {
  1088. int rd, ra, rb;
  1089. uint32_t v;
  1090. uint64_t r;
  1091. getarrr(ir);
  1092. if(rb)
  1093. undef(ir);
  1094. r = (uint64_t)((uint32_t)~reg.r[ra]) + ((reg.xer&XER_CA)!=0);
  1095. v = r>>32;
  1096. reg.xer &= ~XER_CA;
  1097. if(v)
  1098. reg.xer |= XER_CA;
  1099. if(ir & OE) {
  1100. reg.xer &= ~XER_OV;
  1101. if(v>>1)
  1102. reg.xer |= XER_SO | XER_OV;
  1103. }
  1104. reg.r[rd] = (uint32_t)r;
  1105. if(ir & Rc)
  1106. setcr(0, reg.r[rd]);
  1107. if(trace)
  1108. itrace("%s%s%s\tr%d,r%d", ci->name, ir&OE?"o":"", ir&1?".":"", rd, ra);
  1109. }
  1110. void
  1111. xor(uint32_t ir)
  1112. {
  1113. int rs, ra, rb;
  1114. getlrrr(ir);
  1115. reg.r[ra] = reg.r[rs] ^ reg.r[rb];
  1116. if(trace)
  1117. itrace("%s\tr%d,r%d,r%d", ci->name, ra, rs, rb);
  1118. }
  1119. void
  1120. xori(uint32_t ir)
  1121. {
  1122. int rs, ra;
  1123. uint32_t imm;
  1124. getlirr(ir);
  1125. reg.r[ra] = reg.r[rs] ^ imm;
  1126. if(trace)
  1127. itrace("%s\tr%d,r%d,$0x%lx", ci->name, ra, rs, imm);
  1128. }
  1129. void
  1130. xoris(uint32_t ir)
  1131. {
  1132. int rs, ra;
  1133. uint32_t imm;
  1134. getlirr(ir);
  1135. reg.r[ra] = reg.r[rs] ^ (imm<<16);
  1136. if(trace)
  1137. itrace("%s\tr%d,r%d,$0x%lx", ci->name, ra, rs, imm);
  1138. }
  1139. void
  1140. lwz(uint32_t ir)
  1141. {
  1142. uint32_t ea;
  1143. int ra, rd, upd;
  1144. int32_t imm;
  1145. getairr(ir);
  1146. ea = imm;
  1147. upd = (ir&(1L<<26))!=0;
  1148. if(ra) {
  1149. ea += reg.r[ra];
  1150. if(upd)
  1151. reg.r[ra] = ea;
  1152. } else {
  1153. if(upd)
  1154. undef(ir);
  1155. }
  1156. if(trace)
  1157. itrace("%s\tr%d,%ld(r%d) ea=%lux", ci->name, rd, imm, ra, ea);
  1158. reg.r[rd] = getmem_w(ea);
  1159. }
  1160. void
  1161. lwzx(uint32_t ir)
  1162. {
  1163. uint32_t ea;
  1164. int rb, ra, rd, upd;
  1165. getarrr(ir);
  1166. ea = reg.r[rb];
  1167. upd = getxo(ir)==55;
  1168. if(ra) {
  1169. ea += reg.r[ra];
  1170. if(upd)
  1171. reg.r[ra] = ea;
  1172. if(trace)
  1173. itrace("%s\tr%d,(r%d+r%d) ea=%lux", ci->name, rd, ra, rb, ea);
  1174. } else {
  1175. if(upd)
  1176. undef(ir);
  1177. if(trace)
  1178. itrace("%s\tr%d,(r%d) ea=%lux", ci->name, rd, rb, ea);
  1179. }
  1180. reg.r[rd] = getmem_w(ea);
  1181. }
  1182. void
  1183. lwarx(uint32_t ir)
  1184. {
  1185. lwzx(ir);
  1186. }
  1187. void
  1188. lbz(uint32_t ir)
  1189. {
  1190. uint32_t ea;
  1191. int ra, rd, upd;
  1192. int32_t imm;
  1193. getairr(ir);
  1194. ea = imm;
  1195. upd = (ir&(1L<<26))!=0;
  1196. if(ra) {
  1197. ea += reg.r[ra];
  1198. if(upd)
  1199. reg.r[ra] = ea;
  1200. } else {
  1201. if(upd)
  1202. undef(ir);
  1203. }
  1204. if(trace)
  1205. itrace("%s\tr%d,%ld(r%d) ea=%lux", ci->name, rd, imm, ra, ea);
  1206. reg.r[rd] = getmem_b(ea);
  1207. }
  1208. void
  1209. lbzx(uint32_t ir)
  1210. {
  1211. uint32_t ea;
  1212. int rb, ra, rd, upd;
  1213. getarrr(ir);
  1214. ea = reg.r[rb];
  1215. upd = getxo(ir)==119;
  1216. if(ra) {
  1217. ea += reg.r[ra];
  1218. if(upd)
  1219. reg.r[ra] = ea;
  1220. if(trace)
  1221. itrace("%s\tr%d,(r%d+r%d) ea=%lux", ci->name, rd, ra, rb, ea);
  1222. } else {
  1223. if(upd)
  1224. undef(ir);
  1225. if(trace)
  1226. itrace("%s\tr%d,(r%d) ea=%lux", ci->name, rd, rb, ea);
  1227. }
  1228. reg.r[rd] = getmem_b(ea);
  1229. }
  1230. void
  1231. stw(uint32_t ir)
  1232. {
  1233. uint32_t ea;
  1234. int ra, rd, upd;
  1235. int32_t imm;
  1236. getairr(ir);
  1237. ea = imm;
  1238. upd = (ir&(1L<<26))!=0;
  1239. if(ra) {
  1240. ea += reg.r[ra];
  1241. if(upd)
  1242. reg.r[ra] = ea;
  1243. } else {
  1244. if(upd)
  1245. undef(ir);
  1246. }
  1247. if(trace)
  1248. itrace("%s\tr%d,%ld(r%d) #%lux=#%lux (%ld)",
  1249. ci->name, rd, imm, ra, ea, reg.r[rd], reg.r[rd]);
  1250. putmem_w(ea, reg.r[rd]);
  1251. }
  1252. void
  1253. stwx(uint32_t ir)
  1254. {
  1255. uint32_t ea;
  1256. int ra, rd, upd, rb;
  1257. getarrr(ir);
  1258. ea = reg.r[rb];
  1259. upd = getxo(ir)==183;
  1260. if(ra) {
  1261. ea += reg.r[ra];
  1262. if(upd)
  1263. reg.r[ra] = ea;
  1264. if(trace)
  1265. itrace("%s\tr%d,(r%d+r%d) #%lux=#%lux (%ld)",
  1266. ci->name, rd, ra, rb, ea, reg.r[rd], reg.r[rd]);
  1267. } else {
  1268. if(upd)
  1269. undef(ir);
  1270. if(trace)
  1271. itrace("%s\tr%d,(r%d) #%lux=#%lux (%ld)",
  1272. ci->name, rd, rb, ea, reg.r[rd], reg.r[rd]);
  1273. }
  1274. putmem_w(ea, reg.r[rd]);
  1275. }
  1276. void
  1277. stwcx(uint32_t ir)
  1278. {
  1279. uint32_t ea;
  1280. int ra, rd, rb;
  1281. if((ir & Rc) == 0)
  1282. undef(ir);
  1283. getarrr(ir);
  1284. ea = reg.r[rb];
  1285. if(ra) {
  1286. ea += reg.r[ra];
  1287. if(trace)
  1288. itrace("%s\tr%d,(r%d+r%d) #%lux=#%lux (%ld)",
  1289. ci->name, rd, ra, rb, ea, reg.r[rd], reg.r[rd]);
  1290. } else {
  1291. if(trace)
  1292. itrace("%s\tr%d,(r%d) #%lux=#%lux (%ld)",
  1293. ci->name, rd, rb, ea, reg.r[rd], reg.r[rd]);
  1294. }
  1295. putmem_w(ea, reg.r[rd]); /* assume a reservation exists; store succeeded */
  1296. setcr(0, 0);
  1297. }
  1298. void
  1299. stb(uint32_t ir)
  1300. {
  1301. uint32_t ea;
  1302. int ra, rd, upd, v;
  1303. int32_t imm;
  1304. getairr(ir);
  1305. ea = imm;
  1306. upd = (ir&(1L<<26))!=0;
  1307. if(ra) {
  1308. ea += reg.r[ra];
  1309. if(upd)
  1310. reg.r[ra] = ea;
  1311. } else {
  1312. if(upd)
  1313. undef(ir);
  1314. }
  1315. v = reg.r[rd] & 0xFF;
  1316. if(trace)
  1317. itrace("%s\tr%d,%ld(r%d) #%lux=#%lux (%ld)",
  1318. ci->name, rd, imm, ra, ea, v, v);
  1319. putmem_b(ea, v);
  1320. }
  1321. void
  1322. stbx(uint32_t ir)
  1323. {
  1324. uint32_t ea;
  1325. int ra, rd, upd, rb, v;
  1326. getarrr(ir);
  1327. ea = reg.r[rb];
  1328. upd = getxo(ir)==247;
  1329. v = reg.r[rd] & 0xFF;
  1330. if(ra) {
  1331. ea += reg.r[ra];
  1332. if(upd)
  1333. reg.r[ra] = ea;
  1334. if(trace)
  1335. itrace("%s\tr%d,(r%d+r%d) #%lux=#%lux (%ld)",
  1336. ci->name, rd, ra, rb, ea, v, v);
  1337. } else {
  1338. if(upd)
  1339. undef(ir);
  1340. if(trace)
  1341. itrace("%s\tr%d,(r%d) #%lux=#%lux (%ld)",
  1342. ci->name, rd, rb, ea, v, v);
  1343. }
  1344. putmem_b(ea, v);
  1345. }
  1346. void
  1347. lhz(uint32_t ir)
  1348. {
  1349. uint32_t ea;
  1350. int imm, ra, rd, upd;
  1351. getairr(ir);
  1352. ea = imm;
  1353. upd = (ir&(1L<<26))!=0;
  1354. if(ra) {
  1355. ea += reg.r[ra];
  1356. if(upd)
  1357. reg.r[ra] = ea;
  1358. } else {
  1359. if(upd)
  1360. undef(ir);
  1361. }
  1362. if(trace)
  1363. itrace("%s\tr%d,%ld(r%d) ea=%lux", ci->name, rd, imm, ra, ea);
  1364. reg.r[rd] = getmem_h(ea);
  1365. }
  1366. void
  1367. lhzx(uint32_t ir)
  1368. {
  1369. uint32_t ea;
  1370. int rb, ra, rd, upd;
  1371. getarrr(ir);
  1372. ea = reg.r[rb];
  1373. upd = getxo(ir)==311;
  1374. if(ra) {
  1375. ea += reg.r[ra];
  1376. if(upd)
  1377. reg.r[ra] = ea;
  1378. if(trace)
  1379. itrace("%s\tr%d,(r%d+r%d) ea=%lux", ci->name, rd, ra, rb, ea);
  1380. } else {
  1381. if(upd)
  1382. undef(ir);
  1383. if(trace)
  1384. itrace("%s\tr%d,(r%d) ea=%lux", ci->name, rd, rb, ea);
  1385. }
  1386. reg.r[rd] = getmem_h(ea);
  1387. }
  1388. void
  1389. lha(uint32_t ir)
  1390. {
  1391. uint32_t ea;
  1392. int imm, ra, rd, upd;
  1393. getairr(ir);
  1394. ea = imm;
  1395. upd = (ir&(1L<<26))!=0;
  1396. if(ra) {
  1397. ea += reg.r[ra];
  1398. if(upd)
  1399. reg.r[ra] = ea;
  1400. } else {
  1401. if(upd)
  1402. undef(ir);
  1403. }
  1404. if(trace)
  1405. itrace("%s\tr%d,%ld(r%d) ea=%lux", ci->name, rd, imm, ra, ea);
  1406. reg.r[rd] = (int16_t)getmem_h(ea);
  1407. }
  1408. void
  1409. lhax(uint32_t ir)
  1410. {
  1411. uint32_t ea;
  1412. int rb, ra, rd, upd;
  1413. getarrr(ir);
  1414. ea = reg.r[rb];
  1415. upd = getxo(ir)==311;
  1416. if(ra) {
  1417. ea += reg.r[ra];
  1418. if(upd)
  1419. reg.r[ra] = ea;
  1420. if(trace)
  1421. itrace("%s\tr%d,(r%d+r%d) ea=%lux", ci->name, rd, ra, rb, ea);
  1422. } else {
  1423. if(upd)
  1424. undef(ir);
  1425. if(trace)
  1426. itrace("%s\tr%d,(r%d) ea=%lux", ci->name, rd, rb, ea);
  1427. }
  1428. reg.r[rd] = (int16_t)getmem_h(ea);
  1429. }
  1430. void
  1431. lhbrx(uint32_t ir)
  1432. {
  1433. uint32_t ea;
  1434. int rb, ra, rd;
  1435. uint32_t v;
  1436. getarrr(ir);
  1437. ea = reg.r[rb];
  1438. if(ra) {
  1439. ea += reg.r[ra];
  1440. if(trace)
  1441. itrace("%s\tr%d,(r%d+r%d) ea=%lux", ci->name, rd, ra, rb, ea);
  1442. } else {
  1443. if(trace)
  1444. itrace("%s\tr%d,(r%d) ea=%lux", ci->name, rd, rb, ea);
  1445. }
  1446. v = getmem_h(ea);
  1447. reg.r[rd] = ((v&0xFF)<<8)|(v&0xFF);
  1448. }
  1449. void
  1450. sth(uint32_t ir)
  1451. {
  1452. uint32_t ea;
  1453. int imm, ra, rd, upd, v;
  1454. getairr(ir);
  1455. ea = imm;
  1456. upd = (ir&(1L<<26))!=0;
  1457. if(ra) {
  1458. ea += reg.r[ra];
  1459. if(upd)
  1460. reg.r[ra] = ea;
  1461. } else {
  1462. if(upd)
  1463. undef(ir);
  1464. }
  1465. v = reg.r[rd] & 0xFFFF;
  1466. if(trace)
  1467. itrace("%s\tr%d,%ld(r%d) #%lux=#%lux (%ld)",
  1468. ci->name, rd, imm, ra, ea, v, v);
  1469. putmem_h(ea, v);
  1470. }
  1471. void
  1472. sthx(uint32_t ir)
  1473. {
  1474. uint32_t ea;
  1475. int ra, rd, upd, rb, v;
  1476. getarrr(ir);
  1477. ea = reg.r[rb];
  1478. upd = getxo(ir)==247;
  1479. v = reg.r[rd] & 0xFFFF;
  1480. if(ra) {
  1481. ea += reg.r[ra];
  1482. if(upd)
  1483. reg.r[ra] = ea;
  1484. if(trace)
  1485. itrace("%s\tr%d,(r%d+r%d) #%lux=#%lux (%ld)",
  1486. ci->name, rd, ra, rb, ea, v, v);
  1487. } else {
  1488. if(upd)
  1489. undef(ir);
  1490. if(trace)
  1491. itrace("%s\tr%d,(r%d) #%lux=#%lux (%ld)",
  1492. ci->name, rd, rb, ea, v, v);
  1493. }
  1494. putmem_h(ea, v);
  1495. }
  1496. void
  1497. sthbrx(uint32_t ir)
  1498. {
  1499. uint32_t ea;
  1500. int ra, rd, rb;
  1501. uint32_t v;
  1502. getarrr(ir);
  1503. ea = reg.r[rb];
  1504. v = reg.r[rd];
  1505. v = ((v&0xFF)<<8)|(v&0xFF);
  1506. if(ra) {
  1507. ea += reg.r[ra];
  1508. if(trace)
  1509. itrace("%s\tr%d,(r%d+r%d) #%lux=#%lux (%ld)",
  1510. ci->name, rd, ra, rb, ea, v, v);
  1511. } else {
  1512. if(trace)
  1513. itrace("%s\tr%d,(r%d) #%lux=#%lux (%ld)",
  1514. ci->name, rd, rb, ea, v, v);
  1515. }
  1516. putmem_h(ea, v);
  1517. }
  1518. void
  1519. lwbrx(uint32_t ir)
  1520. {
  1521. uint32_t ea;
  1522. int rb, ra, rd, i;
  1523. uint32_t v;
  1524. getarrr(ir);
  1525. if(ir & Rc)
  1526. undef(ir);
  1527. ea = reg.r[rb];
  1528. if(ra) {
  1529. ea += reg.r[ra];
  1530. if(trace)
  1531. itrace("%s\tr%d,(r%d+r%d) ea=%lux", ci->name, rd, ra, rb, ea);
  1532. } else {
  1533. if(trace)
  1534. itrace("%s\tr%d,(r%d) ea=%lux", ci->name, rd, rb, ea);
  1535. }
  1536. v = 0;
  1537. for(i = 0; i < 4; i++)
  1538. v = v>>8 | getmem_b(ea++); /* assume unaligned load is allowed */
  1539. reg.r[rd] = v;
  1540. }
  1541. void
  1542. stwbrx(uint32_t ir)
  1543. {
  1544. uint32_t ea;
  1545. int rb, ra, rd, i;
  1546. uint32_t v;
  1547. getarrr(ir);
  1548. if(ir & Rc)
  1549. undef(ir);
  1550. ea = reg.r[rb];
  1551. if(ra) {
  1552. ea += reg.r[ra];
  1553. if(trace)
  1554. itrace("%s\tr%d,(r%d+r%d) ea=%lux", ci->name, rd, ra, rb, ea);
  1555. } else {
  1556. if(trace)
  1557. itrace("%s\tr%d,(r%d) ea=%lux", ci->name, rd, rb, ea);
  1558. }
  1559. v = 0;
  1560. for(i = 0; i < 4; i++) {
  1561. putmem_b(ea++, v & 0xFF); /* assume unaligned store is allowed */
  1562. v >>= 8;
  1563. }
  1564. }
  1565. void
  1566. lswi(uint32_t ir)
  1567. {
  1568. uint32_t ea;
  1569. int rb, ra, rd, n, i, r, b;
  1570. getarrr(ir);
  1571. if(ir & Rc)
  1572. undef(ir);
  1573. n = rb;
  1574. if(n == 0)
  1575. n = 32;
  1576. ea = 0;
  1577. if(ra) {
  1578. ea += reg.r[ra];
  1579. if(trace)
  1580. itrace("%s\tr%d,(r%d),%d ea=%lux", ci->name, rd, ra, n, ea);
  1581. } else {
  1582. if(trace)
  1583. itrace("%s\tr%d,(0),%d ea=0", ci->name, rd, n);
  1584. }
  1585. i = -1;
  1586. r = rd-1;
  1587. while(--n >= 0) {
  1588. if(i < 0) {
  1589. r = (r+1)&0x1F;
  1590. if(ra == 0 || r != ra)
  1591. reg.r[r] = 0;
  1592. i = 24;
  1593. }
  1594. b = getmem_b(ea++);
  1595. if(ra == 0 || r != ra)
  1596. reg.r[r] = (reg.r[r] & ~(0xFF<<i)) | (b << i);
  1597. i -= 8;
  1598. }
  1599. }
  1600. void
  1601. lswx(uint32_t ir)
  1602. {
  1603. uint32_t ea;
  1604. int rb, ra, rd, n, i, r, b;
  1605. getarrr(ir);
  1606. if(ir & Rc)
  1607. undef(ir);
  1608. n = reg.xer & 0x7F;
  1609. ea = reg.r[rb];
  1610. if(ra) {
  1611. ea += reg.r[ra];
  1612. if(trace)
  1613. itrace("%s\tr%d,(r%d+r%d) ea=%lux n=%d", ci->name, rd, ra, rb, ea, n);
  1614. } else {
  1615. if(trace)
  1616. itrace("%s\tr%d,(r%d) ea=%lux n=%d", ci->name, rd, rb, ea, n);
  1617. }
  1618. i = -1;
  1619. r = rd-1;
  1620. while(--n >= 0) {
  1621. if(i < 0) {
  1622. r = (r+1)&0x1F;
  1623. if((ra == 0 || r != ra) && r != rb)
  1624. reg.r[r] = 0;
  1625. i = 24;
  1626. }
  1627. b = getmem_b(ea++);
  1628. if((ra == 0 || r != ra) && r != rb)
  1629. reg.r[r] = (reg.r[r] & ~(0xFF<<i)) | (b << i);
  1630. i -= 8;
  1631. }
  1632. }
  1633. void
  1634. stswx(uint32_t ir)
  1635. {
  1636. uint32_t ea;
  1637. int rb, ra, rd, n, i, r;
  1638. getarrr(ir);
  1639. if(ir & Rc)
  1640. undef(ir);
  1641. n = reg.xer & 0x7F;
  1642. ea = reg.r[rb];
  1643. if(ra) {
  1644. ea += reg.r[ra];
  1645. if(trace)
  1646. itrace("%s\tr%d,(r%d+r%d) ea=%lux n=%d", ci->name, rd, ra, rb, ea, n);
  1647. } else {
  1648. if(trace)
  1649. itrace("%s\tr%d,(r%d) ea=%lux n=%d", ci->name, rd, rb, ea, n);
  1650. }
  1651. i = -1;
  1652. r = rd-1;
  1653. while(--n >= 0) {
  1654. if(i < 0) {
  1655. r = (r+1)&0x1F;
  1656. i = 24;
  1657. }
  1658. putmem_b(ea++, (reg.r[r]>>i)&0xFF);
  1659. i -= 8;
  1660. }
  1661. }
  1662. void
  1663. stswi(uint32_t ir)
  1664. {
  1665. uint32_t ea;
  1666. int rb, ra, rd, n, i, r;
  1667. getarrr(ir);
  1668. if(ir & Rc)
  1669. undef(ir);
  1670. n = rb;
  1671. if(n == 0)
  1672. n = 32;
  1673. ea = 0;
  1674. if(ra) {
  1675. ea += reg.r[ra];
  1676. if(trace)
  1677. itrace("%s\tr%d,(r%d),%d ea=%lux", ci->name, rd, ra, n, ea);
  1678. } else {
  1679. if(trace)
  1680. itrace("%s\tr%d,(0),%d ea=0", ci->name, rd, n);
  1681. }
  1682. i = -1;
  1683. r = rd-1;
  1684. while(--n >= 0) {
  1685. if(i < 0) {
  1686. r = (r+1)&0x1F;
  1687. i = 24;
  1688. }
  1689. putmem_b(ea++, (reg.r[r]>>i)&0xFF);
  1690. i -= 8;
  1691. }
  1692. }
  1693. void
  1694. lmw(uint32_t ir)
  1695. {
  1696. uint32_t ea;
  1697. int ra, rd, r;
  1698. int32_t imm;
  1699. getairr(ir);
  1700. ea = imm;
  1701. if(ra)
  1702. ea += reg.r[ra];
  1703. if(trace)
  1704. itrace("%s\tr%d,%ld(r%d) ea=%lux", ci->name, rd, imm, ra, ea);
  1705. for(r = rd; r <= 31; r++) {
  1706. if(r != 0 && r != rd)
  1707. reg.r[rd] = getmem_w(ea);
  1708. ea += 4;
  1709. }
  1710. }
  1711. void
  1712. stmw(uint32_t ir)
  1713. {
  1714. uint32_t ea;
  1715. int ra, rd, r;
  1716. int32_t imm;
  1717. getairr(ir);
  1718. ea = imm;
  1719. if(ra)
  1720. ea += reg.r[ra];
  1721. if(trace)
  1722. itrace("%s\tr%d,%ld(r%d) ea=%lux", ci->name, rd, imm, ra, ea);
  1723. for(r = rd; r <= 31; r++) {
  1724. putmem_w(ea, reg.r[rd]);
  1725. ea += 4;
  1726. }
  1727. }
  1728. void
  1729. twi(uint32_t ir)
  1730. {
  1731. int rd, ra;
  1732. int32_t a, imm;
  1733. getairr(ir);
  1734. a = reg.r[ra];
  1735. if(trace)
  1736. itrace("twi\t#%.2x,r%d,$0x%lux (%ld)", rd, ra, imm, imm);
  1737. if(a < imm && rd&0x10 ||
  1738. a > imm && rd&0x08 ||
  1739. a == imm && rd&0x04 ||
  1740. (uint32_t)a < imm && rd&0x02 ||
  1741. (uint32_t)a > imm && rd&0x01) {
  1742. Bprint(bioout, "program_exception (trap type)\n");
  1743. longjmp(errjmp, 0);
  1744. }
  1745. }
  1746. void
  1747. tw(uint32_t ir)
  1748. {
  1749. int rd, ra, rb;
  1750. int32_t a, b;
  1751. getarrr(ir);
  1752. a = reg.r[ra];
  1753. b = reg.r[rb];
  1754. if(trace)
  1755. itrace("tw\t#%.2x,r%d,r%d", rd, ra, rb);
  1756. if(a < b && rd&0x10 ||
  1757. a > b && rd&0x08 ||
  1758. a == b && rd&0x04 ||
  1759. (uint32_t)a < b && rd&0x02 ||
  1760. (uint32_t)a > b && rd&0x01) {
  1761. Bprint(bioout, "program_exception (trap type)\n");
  1762. longjmp(errjmp, 0);
  1763. }
  1764. }
  1765. void
  1766. sync(uint32_t ir)
  1767. {
  1768. USED(ir);
  1769. if(trace)
  1770. itrace("sync");
  1771. }
  1772. void
  1773. icbi(uint32_t ir)
  1774. {
  1775. int rd, ra, rb;
  1776. if(ir & Rc)
  1777. undef(ir);
  1778. getarrr(ir);
  1779. USED(rd);
  1780. if(trace)
  1781. itrace("%s\tr%d,r%d", ci->name, ra, rb);
  1782. }
  1783. void
  1784. dcbf(uint32_t ir)
  1785. {
  1786. int rd, ra, rb;
  1787. if(ir & Rc)
  1788. undef(ir);
  1789. getarrr(ir);
  1790. USED(rd);
  1791. if(trace)
  1792. itrace("%s\tr%d,r%d", ci->name, ra, rb);
  1793. }
  1794. void
  1795. dcbst(uint32_t ir)
  1796. {
  1797. int rd, ra, rb;
  1798. if(ir & Rc)
  1799. undef(ir);
  1800. getarrr(ir);
  1801. USED(rd);
  1802. if(trace)
  1803. itrace("%s\tr%d,r%d", ci->name, ra, rb);
  1804. }
  1805. void
  1806. dcbt(uint32_t ir)
  1807. {
  1808. int rd, ra, rb;
  1809. if(ir & Rc)
  1810. undef(ir);
  1811. getarrr(ir);
  1812. USED(rd);
  1813. if(trace)
  1814. itrace("%s\tr%d,r%d", ci->name, ra, rb);
  1815. }
  1816. void
  1817. dcbtst(uint32_t ir)
  1818. {
  1819. int rd, ra, rb;
  1820. if(ir & Rc)
  1821. undef(ir);
  1822. getarrr(ir);
  1823. USED(rd);
  1824. if(trace)
  1825. itrace("%s\tr%d,r%d", ci->name, ra, rb);
  1826. }
  1827. void
  1828. dcbz(uint32_t ir)
  1829. {
  1830. int rd, ra, rb;
  1831. if(ir & Rc)
  1832. undef(ir);
  1833. getarrr(ir);
  1834. USED(rd);
  1835. if(trace)
  1836. itrace("%s\tr%d,r%d", ci->name, ra, rb);
  1837. }