run.c 22 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411
  1. #include <u.h>
  2. #include <libc.h>
  3. #include <bio.h>
  4. #include <mach.h>
  5. #define Extern extern
  6. #include "sparc.h"
  7. void add(ulong);
  8. void and(ulong);
  9. void or(ulong);
  10. void xor(ulong);
  11. void sub(ulong);
  12. void andn(ulong);
  13. void xnor(ulong);
  14. void subcc(ulong);
  15. void sll(ulong);
  16. void srl(ulong);
  17. void sra(ulong);
  18. void jmpl(ulong);
  19. void andcc(ulong);
  20. void xorcc(ulong);
  21. void andncc(ulong);
  22. void wry(ulong);
  23. void rdy(ulong);
  24. void mulscc(ulong);
  25. void fcmp(ulong);
  26. void farith(ulong);
  27. void addcc(ulong);
  28. void addx(ulong);
  29. void addxcc(ulong);
  30. void orcc(ulong);
  31. void orncc(ulong);
  32. void xnorcc(ulong);
  33. void orn(ulong);
  34. Inst op2[] = {
  35. { add, "add", Iarith },
  36. { and, "and", Iarith },
  37. { or, "or", Iarith },
  38. { xor, "xor", Iarith },
  39. { sub, "sub", Iarith },
  40. { andn, "andn", Iarith },
  41. { orn, "orn", Inop },
  42. { xnor, "xnor", Iarith },
  43. { addx, "addx", Iarith },
  44. { undef, "" },
  45. { undef, "" },
  46. { undef, "" },
  47. { undef, "" },
  48. { undef, "" },
  49. { undef, "" },
  50. { undef, "" },
  51. { addcc, "addcc", Iarith },
  52. { andcc, "andcc", Iarith },
  53. { orcc, "orcc", Iarith },
  54. { xorcc, "xorcc", Iarith },
  55. { subcc, "subcc", Iarith },
  56. { andncc, "andncc",Iarith },
  57. { orncc, "orncc", Iarith },
  58. { xnorcc, "xnorcc",Iarith },
  59. { addxcc, "addxcc",Iarith },
  60. { undef, "" },
  61. { undef, "" },
  62. { undef, "" },
  63. { undef, "" },
  64. { undef, "" },
  65. { undef, "" },
  66. { undef, "" },
  67. { undef, "" },
  68. { undef, "" },
  69. { undef, "" },
  70. { undef, "" },
  71. { mulscc, "mulscc", Iarith },
  72. { sll, "sll", Iarith },
  73. { srl, "srl", Iarith },
  74. { sra, "sra", Iarith },
  75. { rdy, "rdy", Ireg },
  76. { undef, "" },
  77. { undef, "" },
  78. { undef, "" },
  79. { undef, "" },
  80. { undef, "" },
  81. { undef, "" },
  82. { undef, "" },
  83. { wry, "wry", Ireg },
  84. { undef, "" },
  85. { undef, "" },
  86. { undef, "" },
  87. { farith, "farith", Ifloat },
  88. { fcmp, "fcmp", Ifloat },
  89. { undef, "" },
  90. { undef, "" },
  91. { jmpl, "jmpl", Ibranch },
  92. { undef, "" },
  93. { ta, "ta", Isyscall },
  94. { undef, "" },
  95. { undef, "" },
  96. { undef, "" },
  97. { undef, "" },
  98. { undef, "" },
  99. { 0 }
  100. };
  101. void st(ulong);
  102. void stb(ulong);
  103. void sth(ulong);
  104. void ld(ulong);
  105. void ldub(ulong);
  106. void ldsb(ulong);
  107. void lduh(ulong);
  108. void stf(ulong);
  109. void ldf(ulong);
  110. void ldsh(ulong);
  111. void std(ulong);
  112. void ldd(ulong);
  113. void ldstub(ulong);
  114. void swap(ulong);
  115. void lddf(ulong);
  116. void stdf(ulong);
  117. Inst op3[] = {
  118. { ld, "ld", Iload },
  119. { ldub, "ldub", Iload },
  120. { lduh, "lduh", Iload },
  121. { ldd, "ldd", Iload },
  122. { st, "st", Istore },
  123. { stb, "stb", Istore },
  124. { sth, "sth", Istore },
  125. { std, "std", Istore },
  126. { undef, "" },
  127. { ldsb, "ldsb", Iload },
  128. { ldsh, "ldsh", Iload },
  129. { undef, "" },
  130. { undef, "" },
  131. { ldstub, "ldstub", Iload },
  132. { undef, "" },
  133. { swap, "swap", Iload },
  134. { undef, "" },
  135. { undef, "" },
  136. { undef, "" },
  137. { undef, "" },
  138. { undef, "" },
  139. { undef, "" },
  140. { undef, "" },
  141. { undef, "" },
  142. { undef, "" },
  143. { undef, "" },
  144. { undef, "" },
  145. { undef, "" },
  146. { undef, "" },
  147. { undef, "" },
  148. { undef, "" },
  149. { undef, "" },
  150. { ldf, "ldf", Ifloat },
  151. { undef, "" },
  152. { undef, "" },
  153. { lddf, "lddf", Ifloat },
  154. { stf, "stf", Ifloat },
  155. { undef, "" },
  156. { undef, "" },
  157. { stdf, "stdf", Ifloat },
  158. { undef, "" },
  159. { undef, "" },
  160. { undef, "" },
  161. { undef, "" },
  162. { undef, "" },
  163. { undef, "" },
  164. { undef, "" },
  165. { undef, "" },
  166. { undef, "" },
  167. { undef, "" },
  168. { undef, "" },
  169. { undef, "" },
  170. { undef, "" },
  171. { undef, "" },
  172. { undef, "" },
  173. { undef, "" },
  174. { undef, "" },
  175. { undef, "" },
  176. { undef, "" },
  177. { undef, "" },
  178. { undef, "" },
  179. { undef, "" },
  180. { undef, "" },
  181. { undef, "" },
  182. { 0 }
  183. };
  184. void sethi(ulong);
  185. void bicc(ulong);
  186. void fbcc(ulong);
  187. void call(ulong);
  188. Inst op0[] = {
  189. { undef, "" },
  190. { undef, "" },
  191. { bicc, "bicc", Ibranch },
  192. { undef, "" },
  193. { sethi, "sethi",Iarith },
  194. { undef, "" },
  195. { fbcc, "fbcc", Ibranch },
  196. { undef, "" },
  197. /* This is a fake and connot be reached by op0 decode */
  198. { call, "call", Ibranch },
  199. { 0 }
  200. };
  201. void call(ulong);
  202. void
  203. run(void)
  204. {
  205. do {
  206. reg.r[0] = 0;
  207. reg.ir = ifetch(reg.pc);
  208. switch(reg.ir>>30) {
  209. case 0:
  210. ci = &op0[(reg.ir>>22)&0x07];
  211. ci->count++;
  212. (*ci->func)(reg.ir);
  213. break;
  214. case 1:
  215. ci = &op0[8];
  216. ci->count++;
  217. call(reg.ir);
  218. break;
  219. case 2:
  220. ci = &op2[(reg.ir>>19)&0x3f];
  221. ci->count++;
  222. (*ci->func)(reg.ir);
  223. break;
  224. case 3:
  225. ci = &op3[(reg.ir>>19)&0x3f];
  226. ci->count++;
  227. (*ci->func)(reg.ir);
  228. break;
  229. }
  230. reg.pc += 4;
  231. if(bplist)
  232. brkchk(reg.pc, Instruction);
  233. }while(--count);
  234. }
  235. void
  236. ilock(int rd)
  237. {
  238. ulong ir;
  239. ir = getmem_4(reg.pc+4);
  240. switch(ir>>30) {
  241. case 0:
  242. case 1:
  243. break;
  244. case 2:
  245. if(((ir>>20)&0x1f) == 0x1a) /* floating point */
  246. break;
  247. case 3:
  248. if(rd == ((ir>>14)&0x1f)) {
  249. loadlock++;
  250. break;
  251. }
  252. if(ir&IMMBIT)
  253. break;
  254. if(rd == (ir&0x1f))
  255. loadlock++;
  256. break;
  257. }
  258. }
  259. void
  260. delay(ulong npc)
  261. {
  262. ulong opc;
  263. reg.r[0] = 0;
  264. if(reg.ir != NOP)
  265. ci->useddelay++;
  266. switch(reg.ir>>30) {
  267. case 0:
  268. ci = &op0[(reg.ir>>22)&0x07];
  269. ci->count++;
  270. (*ci->func)(reg.ir);
  271. break;
  272. case 1:
  273. ci = &op0[8];
  274. ci->count++;
  275. call(reg.ir);
  276. break;
  277. case 2:
  278. ci = &op2[(reg.ir>>19)&0x3f];
  279. ci->count++;
  280. opc = reg.pc;
  281. reg.pc = npc-4;
  282. (*ci->func)(reg.ir);
  283. reg.pc = opc;
  284. break;
  285. case 3:
  286. ci = &op3[(reg.ir>>19)&0x3f];
  287. ci->count++;
  288. opc = reg.pc;
  289. reg.pc = npc-4;
  290. (*ci->func)(reg.ir);
  291. reg.pc = opc;
  292. break;
  293. }
  294. }
  295. void
  296. undef(ulong ir)
  297. {
  298. /* Bprint(bioout, "op=%d op2=%d op3=%d\n", ir>>30, (ir>>21)&0x7, (ir>>19)&0x3f); */
  299. Bprint(bioout, "illegal_instruction IR #%.8lux\n", ir);
  300. longjmp(errjmp, 0);
  301. }
  302. void
  303. sub(ulong ir)
  304. {
  305. long v;
  306. int rd, rs1, rs2;
  307. getrop23(ir);
  308. if(ir&IMMBIT) {
  309. ximm(v, ir);
  310. if(trace)
  311. itrace("sub\tr%d,#0x%x,r%d", rs1, v, rd);
  312. }
  313. else {
  314. v = reg.r[rs2];
  315. if(trace)
  316. itrace("sub\tr%d,r%d,r%d", rs1, rs2, rd);
  317. }
  318. reg.r[rd] = reg.r[rs1] - v;
  319. }
  320. void
  321. sll(ulong ir)
  322. {
  323. long v;
  324. int rd, rs1, rs2;
  325. getrop23(ir);
  326. if(ir&IMMBIT) {
  327. ximm(v, ir);
  328. if(trace)
  329. itrace("sll\tr%d,#0x%x,r%d", rs1, v, rd);
  330. }
  331. else {
  332. v = reg.r[rs2]&0x1F;
  333. if(trace)
  334. itrace("sll\tr%d,r%d,r%d", rs1, rs2, rd);
  335. }
  336. reg.r[rd] = reg.r[rs1] << v;
  337. }
  338. void
  339. srl(ulong ir)
  340. {
  341. long v;
  342. int rd, rs1, rs2;
  343. getrop23(ir);
  344. if(ir&IMMBIT) {
  345. ximm(v, ir);
  346. if(trace)
  347. itrace("srl\tr%d,#0x%x,r%d", rs1, v, rd);
  348. }
  349. else {
  350. v = reg.r[rs2];
  351. if(trace)
  352. itrace("srl\tr%d,r%d,r%d", rs1, rs2, rd);
  353. }
  354. reg.r[rd] = (ulong)reg.r[rs1] >> v;
  355. }
  356. void
  357. sra(ulong ir)
  358. {
  359. long v;
  360. int rd, rs1, rs2;
  361. getrop23(ir);
  362. if(ir&IMMBIT) {
  363. ximm(v, ir);
  364. if(trace)
  365. itrace("sra\tr%d,#0x%x,r%d", rs1, v, rd);
  366. }
  367. else {
  368. v = reg.r[rs2];
  369. if(trace)
  370. itrace("sra\tr%d,r%d,r%d", rs1, rs2, rd);
  371. }
  372. if(reg.r[rs1]&SIGNBIT)
  373. reg.r[rd] = reg.r[rs1]>>v | ~((1<<(32-v))-1);
  374. else
  375. reg.r[rd] = reg.r[rs1]>>v;
  376. }
  377. void
  378. subcc(ulong ir)
  379. {
  380. long v;
  381. int b31rs1, b31op2, b31res, r, rd, rs1, rs2;
  382. getrop23(ir);
  383. if(ir&IMMBIT) {
  384. ximm(v, ir);
  385. if(trace)
  386. itrace("subcc\tr%d,#0x%x,r%d", rs1, v, rd);
  387. }
  388. else {
  389. v = reg.r[rs2];
  390. if(trace)
  391. itrace("subcc\tr%d,r%d,r%d", rs1, rs2, rd);
  392. }
  393. r = reg.r[rs1] - v;
  394. reg.psr &= ~(PSR_z|PSR_n|PSR_c|PSR_v);
  395. if(r == 0)
  396. reg.psr |= PSR_z;
  397. if(r < 0)
  398. reg.psr |= PSR_n;
  399. b31rs1 = reg.r[rs1]>>31;
  400. b31op2 = v>>31;
  401. b31res = r>>31;
  402. if((b31rs1 & ~b31op2 & ~b31res)|(~b31rs1 & b31op2 & b31res))
  403. reg.psr |= PSR_v;
  404. if((~b31rs1 & b31op2)|(b31res & (~b31rs1|b31op2)))
  405. reg.psr |= PSR_c;
  406. reg.r[rd] = r;
  407. }
  408. void
  409. add(ulong ir)
  410. {
  411. long v;
  412. int rd, rs1, rs2;
  413. getrop23(ir);
  414. if(ir&IMMBIT) {
  415. ximm(v, ir);
  416. if(trace)
  417. itrace("add\tr%d,#0x%x,r%d", rs1, v, rd);
  418. }
  419. else {
  420. v = reg.r[rs2];
  421. if(trace)
  422. itrace("add\tr%d,r%d,r%d", rs1, rs2, rd);
  423. }
  424. reg.r[rd] = reg.r[rs1] + v;
  425. }
  426. void
  427. addcc(ulong ir)
  428. {
  429. long v, r;
  430. int rd, rs1, rs2, b31rs1, b31op2, b31r;
  431. getrop23(ir);
  432. if(ir&IMMBIT) {
  433. ximm(v, ir);
  434. if(trace)
  435. itrace("addcc\tr%d,#0x%x,r%d", rs1, v, rd);
  436. }
  437. else {
  438. v = reg.r[rs2];
  439. if(trace)
  440. itrace("addcc\tr%d,r%d,r%d", rs1, rs2, rd);
  441. }
  442. r = reg.r[rs1] + v;
  443. reg.psr &= ~(PSR_z|PSR_n|PSR_c|PSR_v);
  444. if(r == 0)
  445. reg.psr |= PSR_z;
  446. if(r < 0)
  447. reg.psr |= PSR_n;
  448. b31rs1 = reg.r[rs1]>>31;
  449. b31op2 = v>>31;
  450. b31r = r>>31;
  451. if((b31rs1 & b31op2 & ~b31r)|(~b31rs1 & ~b31op2 & b31r))
  452. reg.psr |= PSR_v;
  453. if((b31rs1 & b31op2) | (~b31r & (b31rs1 | b31op2)))
  454. reg.psr |= PSR_c;
  455. reg.r[rd] = r;
  456. }
  457. void
  458. addx(ulong ir)
  459. {
  460. long v;
  461. int rd, rs1, rs2;
  462. getrop23(ir);
  463. if(ir&IMMBIT) {
  464. ximm(v, ir);
  465. if(trace)
  466. itrace("addx\tr%d,#0x%x,r%d", rs1, v, rd);
  467. }
  468. else {
  469. v = reg.r[rs2];
  470. if(trace)
  471. itrace("addx\tr%d,r%d,r%d", rs1, rs2, rd);
  472. }
  473. if(reg.psr&PSR_c)
  474. v++;
  475. reg.r[rd] = reg.r[rs1] + v;
  476. }
  477. void
  478. addxcc(ulong ir)
  479. {
  480. long r, v;
  481. int rd, rs1, rs2, b31rs1, b31op2, b31r;
  482. getrop23(ir);
  483. if(ir&IMMBIT) {
  484. ximm(v, ir);
  485. if(trace)
  486. itrace("addxcc\tr%d,#0x%x,r%d", rs1, v, rd);
  487. }
  488. else {
  489. v = reg.r[rs2];
  490. if(trace)
  491. itrace("addxcc\tr%d,r%d,r%d", rs1, rs2, rd);
  492. }
  493. if(reg.psr&PSR_c)
  494. v++;
  495. r = reg.r[rs1] + v;
  496. reg.psr &= ~(PSR_z|PSR_n|PSR_c|PSR_v);
  497. if(r == 0)
  498. reg.psr |= PSR_z;
  499. if(r < 0)
  500. reg.psr |= PSR_n;
  501. b31rs1 = reg.r[rs1]>>31;
  502. b31op2 = v>>31;
  503. b31r = r>>31;
  504. if((b31rs1 & b31op2 & ~b31r)|(~b31rs1 & ~b31op2 & b31r))
  505. reg.psr |= PSR_v;
  506. if((b31rs1 & b31op2) | (~b31r & (b31rs1 | b31op2)))
  507. reg.psr |= PSR_c;
  508. reg.r[rd] = r;
  509. }
  510. void
  511. wry(ulong ir)
  512. {
  513. long v;
  514. int rd, rs1, rs2;
  515. getrop23(ir);
  516. if(rd != 0)
  517. undef(ir);
  518. if(ir&IMMBIT) {
  519. ximm(v, ir);
  520. if(trace)
  521. itrace("wry\tr%d,#0x%x,Y", rs1, v);
  522. }
  523. else {
  524. v = reg.r[rs2];
  525. if(trace)
  526. itrace("wry\tr%d,r%d,Y", rs1, rs2);
  527. }
  528. reg.Y = reg.r[rs1] + v;
  529. }
  530. void
  531. rdy(ulong ir)
  532. {
  533. int rd, rs1, rs2;
  534. getrop23(ir);
  535. USED(rs2);
  536. if(rs1 != 0)
  537. undef(ir);
  538. if(trace)
  539. itrace("rdy\tY,r%d", rd);
  540. reg.r[rd] = reg.Y;
  541. }
  542. void
  543. and(ulong ir)
  544. {
  545. long v;
  546. int rd, rs1, rs2;
  547. getrop23(ir);
  548. if(ir&IMMBIT) {
  549. ximm(v, ir);
  550. if(trace)
  551. itrace("and\tr%d,#0x%x,r%d", rs1, v, rd);
  552. }
  553. else {
  554. v = reg.r[rs2];
  555. if(trace)
  556. itrace("and\tr%d,r%d,r%d", rs1, rs2, rd);
  557. }
  558. reg.r[rd] = reg.r[rs1] & v;
  559. }
  560. void
  561. andcc(ulong ir)
  562. {
  563. long v, r;
  564. int rd, rs1, rs2;
  565. getrop23(ir);
  566. if(ir&IMMBIT) {
  567. ximm(v, ir);
  568. if(trace)
  569. itrace("andcc\tr%d,#0x%x,r%d", rs1, v, rd);
  570. }
  571. else {
  572. v = reg.r[rs2];
  573. if(trace)
  574. itrace("andcc\tr%d,r%d,r%d", rs1, rs2, rd);
  575. }
  576. r = reg.r[rs1] & v;
  577. reg.psr &= ~(PSR_z|PSR_n|PSR_c|PSR_v);
  578. if(r == 0)
  579. reg.psr |= PSR_z;
  580. if(r < 0)
  581. reg.psr |= PSR_n;
  582. reg.r[rd] = r;
  583. }
  584. void
  585. orcc(ulong ir)
  586. {
  587. long v, r;
  588. int rd, rs1, rs2;
  589. getrop23(ir);
  590. if(ir&IMMBIT) {
  591. ximm(v, ir);
  592. if(trace)
  593. itrace("orcc\tr%d,#0x%x,r%d", rs1, v, rd);
  594. }
  595. else {
  596. v = reg.r[rs2];
  597. if(trace)
  598. itrace("orcc\tr%d,r%d,r%d", rs1, rs2, rd);
  599. }
  600. r = reg.r[rs1] | v;
  601. reg.psr &= ~(PSR_z|PSR_n|PSR_c|PSR_v);
  602. if(r == 0)
  603. reg.psr |= PSR_z;
  604. if(r < 0)
  605. reg.psr |= PSR_n;
  606. reg.r[rd] = r;
  607. }
  608. void
  609. mulscc(ulong ir)
  610. {
  611. int b, n, v, rd, rs1, rs2;
  612. long o1, o2, r, b31o1, b31o2, b31r;
  613. getrop23(ir);
  614. if(ir&IMMBIT) {
  615. ximm(o2, ir);
  616. if(trace)
  617. itrace("mulscc\tr%d,#0x%x,r%d", rs1, o2, rd);
  618. }
  619. else {
  620. o2 = reg.r[rs2];
  621. if(trace)
  622. itrace("mulscc\tr%d,r%d,r%d", rs1, rs2, rd);
  623. }
  624. o1 = reg.r[rs1]>>1;
  625. n = reg.psr&PSR_n ? 1 : 0;
  626. v = reg.psr&PSR_v ? 1 : 0;
  627. o1 |= (n ^ v)<<31;
  628. if((reg.Y&1) == 0)
  629. o2 = 0;
  630. r = o1 + o2;
  631. reg.psr &= ~(PSR_z|PSR_n|PSR_c|PSR_v);
  632. if(r == 0)
  633. reg.psr |= PSR_z;
  634. if(r < 0)
  635. reg.psr |= PSR_n;
  636. b31o1 = o1>>31;
  637. b31o2 = o2>>31;
  638. b31r = r>>31;
  639. if((b31o1 & b31o2 & ~b31r) | (~b31o1 & ~b31o2 & b31r))
  640. reg.psr |= PSR_v;
  641. if((b31o1 & b31o2) | (~b31r & (b31o1 | b31o2)))
  642. reg.psr |= PSR_c;
  643. b = reg.r[rs1]&1;
  644. reg.Y = (reg.Y>>1)|(b<<31);
  645. reg.r[rd] = r;
  646. }
  647. void
  648. or(ulong ir)
  649. {
  650. long v;
  651. int rd, rs1, rs2;
  652. getrop23(ir);
  653. if(ir&IMMBIT) {
  654. ximm(v, ir);
  655. if(trace)
  656. itrace("or\tr%d,#0x%x,r%d", rs1, v, rd);
  657. }
  658. else {
  659. v = reg.r[rs2];
  660. if(trace)
  661. itrace("or\tr%d,r%d,r%d", rs1, rs2, rd);
  662. }
  663. reg.r[rd] = reg.r[rs1] | v;
  664. }
  665. void
  666. xor(ulong ir)
  667. {
  668. long v;
  669. int rd, rs1, rs2;
  670. getrop23(ir);
  671. if(ir&IMMBIT) {
  672. ximm(v, ir);
  673. if(trace)
  674. itrace("xor\tr%d,#0x%x,r%d", rs1, v, rd);
  675. }
  676. else {
  677. v = reg.r[rs2];
  678. if(trace)
  679. itrace("xor\tr%d,r%d,r%d", rs1, rs2, rd);
  680. }
  681. reg.r[rd] = reg.r[rs1] ^ v;
  682. }
  683. void
  684. xorcc(ulong ir)
  685. {
  686. long v, r;
  687. int rd, rs1, rs2;
  688. getrop23(ir);
  689. if(ir&IMMBIT) {
  690. ximm(v, ir);
  691. if(trace)
  692. itrace("xorcc\tr%d,#0x%x,r%d", rs1, v, rd);
  693. }
  694. else {
  695. v = reg.r[rs2];
  696. if(trace)
  697. itrace("xorcc\tr%d,r%d,r%d", rs1, rs2, rd);
  698. }
  699. r = reg.r[rs1] ^ v;
  700. reg.psr &= ~(PSR_z|PSR_n|PSR_c|PSR_v);
  701. if(r == 0)
  702. reg.psr |= PSR_z;
  703. if(r < 0)
  704. reg.psr |= PSR_n;
  705. reg.r[rd] = r;
  706. }
  707. void
  708. andn(ulong ir)
  709. {
  710. long v;
  711. int rd, rs1, rs2;
  712. getrop23(ir);
  713. if(ir&IMMBIT) {
  714. ximm(v, ir);
  715. if(trace)
  716. itrace("andn\tr%d,#0x%x,r%d", rs1, v, rd);
  717. }
  718. else {
  719. v = reg.r[rs2];
  720. if(trace)
  721. itrace("andn\tr%d,r%d,r%d", rs1, rs2, rd);
  722. }
  723. reg.r[rd] = reg.r[rs1] & ~v;
  724. }
  725. void
  726. andncc(ulong ir)
  727. {
  728. long v, r;
  729. int rd, rs1, rs2;
  730. getrop23(ir);
  731. if(ir&IMMBIT) {
  732. ximm(v, ir);
  733. if(trace)
  734. itrace("andncc\tr%d,#0x%x,r%d", rs1, v, rd);
  735. }
  736. else {
  737. v = reg.r[rs2];
  738. if(trace)
  739. itrace("andncc\tr%d,r%d,r%d", rs1, rs2, rd);
  740. }
  741. r = reg.r[rs1] & ~v;
  742. reg.psr &= ~(PSR_z|PSR_n|PSR_c|PSR_v);
  743. if(r == 0)
  744. reg.psr |= PSR_z;
  745. if(r < 0)
  746. reg.psr |= PSR_n;
  747. reg.r[rd] = r;
  748. }
  749. void
  750. orn(ulong ir)
  751. {
  752. long v;
  753. int rd, rs1, rs2;
  754. getrop23(ir);
  755. if(rd == 0 && rs1 == 0) /* ken used orn r0,r0,r0 as nop */
  756. nopcount++;
  757. if(ir&IMMBIT) {
  758. ximm(v, ir);
  759. if(trace)
  760. itrace("orn\tr%d,#0x%x,r%d", rs1, v, rd);
  761. }
  762. else {
  763. v = reg.r[rs2];
  764. if(trace)
  765. itrace("orn\tr%d,r%d,r%d", rs1, rs2, rd);
  766. }
  767. reg.r[rd] = reg.r[rs1] | ~v;
  768. }
  769. void
  770. orncc(ulong ir)
  771. {
  772. long r, v;
  773. int rd, rs1, rs2;
  774. getrop23(ir);
  775. if(ir&IMMBIT) {
  776. ximm(v, ir);
  777. if(trace)
  778. itrace("orncc\tr%d,#0x%x,r%d", rs1, v, rd);
  779. }
  780. else {
  781. v = reg.r[rs2];
  782. if(trace)
  783. itrace("orncc\tr%d,r%d,r%d", rs1, rs2, rd);
  784. }
  785. r = reg.r[rs1] | ~v;
  786. reg.psr &= ~(PSR_z|PSR_n|PSR_c|PSR_v);
  787. if(r == 0)
  788. reg.psr |= PSR_z;
  789. if(r < 0)
  790. reg.psr |= PSR_n;
  791. reg.r[rd] = r;
  792. }
  793. void
  794. xnor(ulong ir)
  795. {
  796. long v;
  797. int rd, rs1, rs2;
  798. getrop23(ir);
  799. if(ir&IMMBIT) {
  800. ximm(v, ir);
  801. if(trace)
  802. itrace("xnor\tr%d,#0x%x,r%d", rs1, v, rd);
  803. }
  804. else {
  805. v = reg.r[rs2];
  806. if(trace)
  807. itrace("xnor\tr%d,r%d,r%d", rs1, rs2, rd);
  808. }
  809. reg.r[rd] = reg.r[rs1] ^ ~v;
  810. }
  811. void
  812. xnorcc(ulong ir)
  813. {
  814. long v, r;
  815. int rd, rs1, rs2;
  816. getrop23(ir);
  817. if(ir&IMMBIT) {
  818. ximm(v, ir);
  819. if(trace)
  820. itrace("xnorcc\tr%d,#0x%x,r%d", rs1, v, rd);
  821. }
  822. else {
  823. v = reg.r[rs2];
  824. if(trace)
  825. itrace("xnorcc\tr%d,r%d,r%d", rs1, rs2, rd);
  826. }
  827. r = reg.r[rs1] ^ ~v;
  828. reg.psr &= ~(PSR_z|PSR_n|PSR_c|PSR_v);
  829. if(r == 0)
  830. reg.psr |= PSR_z;
  831. if(r < 0)
  832. reg.psr |= PSR_n;
  833. reg.r[rd] = r;
  834. }
  835. void
  836. st(ulong ir)
  837. {
  838. ulong ea;
  839. int rd, rs1, rs2;
  840. getrop23(ir);
  841. if(ir&IMMBIT) {
  842. ximm(ea, ir);
  843. if(trace)
  844. itrace("st\tr%d,0x%lux(r%d) %lux=%lux",
  845. rd, ea, rs1, ea+reg.r[rs1], reg.r[rd]);
  846. ea += reg.r[rs1];
  847. }
  848. else {
  849. ea = reg.r[rs1] + reg.r[rs2];
  850. if(trace)
  851. itrace("st\tr%d,[r%d+r%d] %lux=%lux",
  852. rd, rs1, rs2, ea, reg.r[rd]);
  853. }
  854. putmem_w(ea, reg.r[rd]);
  855. }
  856. void
  857. std(ulong ir)
  858. {
  859. ulong ea;
  860. int rd, rs1, rs2;
  861. getrop23(ir);
  862. if(ir&IMMBIT) {
  863. ximm(ea, ir);
  864. if(trace)
  865. itrace("std\tr%d,0x%lux(r%d) %lux=%lux",
  866. rd, ea, rs1, ea+reg.r[rs1], reg.r[rd]);
  867. ea += reg.r[rs1];
  868. }
  869. else {
  870. ea = reg.r[rs1] + reg.r[rs2];
  871. if(trace)
  872. itrace("std\tr%d,[r%d+r%d] %lux=%lux",
  873. rd, rs1, rs2, ea, reg.r[rd]);
  874. }
  875. putmem_w(ea, reg.r[rd]);
  876. putmem_w(ea+4, reg.r[rd+1]);
  877. }
  878. void
  879. stb(ulong ir)
  880. {
  881. ulong ea;
  882. int rd, rs1, rs2;
  883. getrop23(ir);
  884. if(ir&IMMBIT) {
  885. ximm(ea, ir);
  886. if(trace)
  887. itrace("stb\tr%d,0x%lux(r%d) %lux=%lux",
  888. rd, ea, rs1, ea+reg.r[rs1], reg.r[rd]&0xff);
  889. ea += reg.r[rs1];
  890. }
  891. else {
  892. ea = reg.r[rs1] + reg.r[rs2];
  893. if(trace)
  894. itrace("stb\tr%d,[r%d+r%d] %lux=%lux",
  895. rd, rs1, rs2, ea, reg.r[rd]&0xff);
  896. }
  897. putmem_b(ea, reg.r[rd]);
  898. }
  899. void
  900. sth(ulong ir)
  901. {
  902. ulong ea;
  903. int rd, rs1, rs2;
  904. getrop23(ir);
  905. if(ir&IMMBIT) {
  906. ximm(ea, ir);
  907. if(trace)
  908. itrace("sth\tr%d,0x%lux(r%d) %lux=%lux",
  909. rd, ea, rs1, ea+reg.r[rs1], reg.r[rd]&0xffff);
  910. ea += reg.r[rs1];
  911. }
  912. else {
  913. ea = reg.r[rs1] + reg.r[rs2];
  914. if(trace)
  915. itrace("sth\tr%d,[r%d+r%d] %lux=%lux",
  916. rd, rs1, rs2, ea, reg.r[rd]&0xffff);
  917. }
  918. putmem_h(ea, reg.r[rd]);
  919. }
  920. void
  921. ld(ulong ir)
  922. {
  923. ulong ea;
  924. int rd, rs1, rs2;
  925. getrop23(ir);
  926. if(ir&IMMBIT) {
  927. ximm(ea, ir);
  928. if(trace)
  929. itrace("ld\tr%d,0x%lux(r%d) ea=%lux",rd, ea, rs1, ea+reg.r[rs1]);
  930. ea += reg.r[rs1];
  931. }
  932. else {
  933. ea = reg.r[rs1] + reg.r[rs2];
  934. if(trace)
  935. itrace("ld\tr%d,[r%d+r%d] ea=%lux", rd, rs1, rs2, ea);
  936. }
  937. reg.r[rd] = getmem_w(ea);
  938. ilock(rd);
  939. }
  940. void
  941. swap(ulong ir)
  942. {
  943. ulong t, ea;
  944. int rd, rs1, rs2;
  945. getrop23(ir);
  946. if(ir&IMMBIT) {
  947. ximm(ea, ir);
  948. if(trace)
  949. itrace("swap\tr%d,0x%lux(r%d) ea=%lux",
  950. rd, ea, rs1, ea+reg.r[rs1]);
  951. ea += reg.r[rs1];
  952. }
  953. else {
  954. ea = reg.r[rs1] + reg.r[rs2];
  955. if(trace)
  956. itrace("swap\tr%d,[r%d+r%d] ea=%lux", rd, rs1, rs2, ea);
  957. }
  958. t = reg.r[rd];
  959. reg.r[rd] = getmem_w(ea);
  960. putmem_w(ea, t);
  961. }
  962. void
  963. ldd(ulong ir)
  964. {
  965. ulong ea;
  966. int rd, rs1, rs2;
  967. getrop23(ir);
  968. if(ir&IMMBIT) {
  969. ximm(ea, ir);
  970. if(trace)
  971. itrace("ldd\tr%d,0x%lux(r%d) ea=%lux",rd, ea, rs1, ea+reg.r[rs1]);
  972. ea += reg.r[rs1];
  973. }
  974. else {
  975. ea = reg.r[rs1] + reg.r[rs2];
  976. if(trace)
  977. itrace("ldd\tr%d,[r%d+r%d] ea=%lux", rd, rs1, rs2, ea);
  978. }
  979. reg.r[rd] = getmem_w(ea);
  980. reg.r[rd+1] = getmem_w(ea+4);
  981. }
  982. void
  983. ldub(ulong ir)
  984. {
  985. ulong ea;
  986. int rd, rs1, rs2;
  987. getrop23(ir);
  988. if(ir&IMMBIT) {
  989. ximm(ea, ir);
  990. if(trace)
  991. itrace("ldub\tr%d,0x%lux(r%d) ea=%lux",
  992. rd, ea, rs1, ea+reg.r[rs1]);
  993. ea += reg.r[rs1];
  994. }
  995. else {
  996. ea = reg.r[rs1] + reg.r[rs2];
  997. if(trace)
  998. itrace("ldub\tr%d,[r%d+r%d] ea=%lux", rd, rs1, rs2, ea);
  999. }
  1000. reg.r[rd] = getmem_b(ea) & 0xff;
  1001. ilock(rd);
  1002. }
  1003. void
  1004. ldstub(ulong ir)
  1005. {
  1006. ulong ea;
  1007. int rd, rs1, rs2;
  1008. getrop23(ir);
  1009. if(ir&IMMBIT) {
  1010. ximm(ea, ir);
  1011. if(trace)
  1012. itrace("ldstub\tr%d,0x%lux(r%d) ea=%lux",
  1013. rd, ea, rs1, ea+reg.r[rs1]);
  1014. ea += reg.r[rs1];
  1015. }
  1016. else {
  1017. ea = reg.r[rs1] + reg.r[rs2];
  1018. if(trace)
  1019. itrace("ldstub\tr%d,[r%d+r%d] ea=%lux", rd, rs1, rs2, ea);
  1020. }
  1021. reg.r[rd] = getmem_b(ea) & 0xff;
  1022. putmem_b(ea, 0xff);
  1023. }
  1024. void
  1025. ldsb(ulong ir)
  1026. {
  1027. ulong ea;
  1028. int rd, rs1, rs2;
  1029. getrop23(ir);
  1030. if(ir&IMMBIT) {
  1031. ximm(ea, ir);
  1032. if(trace)
  1033. itrace("ldsb\tr%d,0x%lux(r%d) ea=%lux",
  1034. rd, ea, rs1, ea+reg.r[rs1]);
  1035. ea += reg.r[rs1];
  1036. }
  1037. else {
  1038. ea = reg.r[rs1] + reg.r[rs2];
  1039. if(trace)
  1040. itrace("ldsb\tr%d,[r%d+r%d] ea=%lux", rd, rs1, rs2, ea);
  1041. }
  1042. reg.r[rd] = (schar)getmem_b(ea);
  1043. ilock(rd);
  1044. }
  1045. void
  1046. lduh(ulong ir)
  1047. {
  1048. ulong ea;
  1049. int rd, rs1, rs2;
  1050. getrop23(ir);
  1051. if(ir&IMMBIT) {
  1052. ximm(ea, ir);
  1053. if(trace)
  1054. itrace("lduh\tr%d,0x%lux(r%d) ea=%lux",
  1055. rd, ea, rs1, ea+reg.r[rs1]);
  1056. ea += reg.r[rs1];
  1057. }
  1058. else {
  1059. ea = reg.r[rs1] + reg.r[rs2];
  1060. if(trace)
  1061. itrace("lduh\tr%d,[r%d+r%d] ea=%lux", rd, rs1, rs2, ea);
  1062. }
  1063. reg.r[rd] = getmem_h(ea) & 0xffff;
  1064. ilock(rd);
  1065. }
  1066. void
  1067. ldsh(ulong ir)
  1068. {
  1069. ulong ea;
  1070. int rd, rs1, rs2;
  1071. getrop23(ir);
  1072. if(ir&IMMBIT) {
  1073. ximm(ea, ir);
  1074. if(trace)
  1075. itrace("ldsh\tr%d,0x%lux(r%d) ea=%lux",
  1076. rd, ea, rs1, ea+reg.r[rs1]);
  1077. ea += reg.r[rs1];
  1078. }
  1079. else {
  1080. ea = reg.r[rs1] + reg.r[rs2];
  1081. if(trace)
  1082. itrace("ldsh\tr%d,[r%d+r%d] ea=%lux", rd, rs1, rs2, ea);
  1083. }
  1084. reg.r[rd] = (short)getmem_h(ea);
  1085. ilock(rd);
  1086. }
  1087. void
  1088. sethi(ulong ir)
  1089. {
  1090. int rd;
  1091. ulong v;
  1092. rd = (ir>>25)&0x1f;
  1093. v = (ir&0x3FFFFF)<<10;
  1094. if(rd == 0)
  1095. nopcount++;
  1096. if(trace)
  1097. itrace("sethi\t0x%lux,r%d", v, rd);
  1098. reg.r[rd] = v;
  1099. }
  1100. void
  1101. call(ulong ir)
  1102. {
  1103. Symbol s;
  1104. ulong npc;
  1105. npc = (ir<<2) + reg.pc;
  1106. if(trace)
  1107. itrace("call\t%lux", npc);
  1108. ci->taken++;
  1109. reg.r[15] = reg.pc;
  1110. reg.ir = ifetch(reg.pc+4);
  1111. delay(npc);
  1112. if(calltree) {
  1113. findsym(npc, CTEXT, &s);
  1114. Bprint(bioout, "%8lux %s(", reg.pc, s.name);
  1115. printparams(&s, reg.r[1]);
  1116. Bprint(bioout, "from ");
  1117. printsource(reg.pc);
  1118. Bputc(bioout, '\n');
  1119. }
  1120. npc -= 4;
  1121. reg.pc = npc;
  1122. }
  1123. void
  1124. jmpl(ulong ir)
  1125. {
  1126. ulong ea, o;
  1127. Symbol s;
  1128. int rd, rs1, rs2;
  1129. getrop23(ir);
  1130. if(ir&IMMBIT) {
  1131. ximm(ea, ir);
  1132. o = ea;
  1133. if(trace)
  1134. itrace("jmpl\t0x%lux(r%d),r%d", ea, rs1, rd);
  1135. ea += reg.r[rs1];
  1136. if(calltree && rd == 0 && o == 8) {
  1137. findsym(ea-4, CTEXT, &s);
  1138. Bprint(bioout, "%8lux return to %lux %s r7=%lux\n",
  1139. reg.pc, ea-4, s.name, reg.r[7]);
  1140. }
  1141. }
  1142. else {
  1143. ea = reg.r[rs1] + reg.r[rs2];
  1144. if(trace)
  1145. itrace("jmpl\t[r%d+r%d],r%d", rs1, rs2, rd);
  1146. }
  1147. ci->taken++;
  1148. reg.r[rd] = reg.pc;
  1149. reg.ir = ifetch(reg.pc+4);
  1150. delay(ea);
  1151. reg.pc = ea-4;
  1152. }
  1153. void
  1154. bicc(ulong ir)
  1155. {
  1156. char *op;
  1157. ulong npc, anul, ba;
  1158. int takeit, z, v, n, c;
  1159. SET(op, takeit);
  1160. ba = 0;
  1161. switch((ir>>25)&0x0F) {
  1162. case 0:
  1163. op = "bn";
  1164. takeit = 0;
  1165. break;
  1166. case 1:
  1167. op = "be";
  1168. takeit = reg.psr&PSR_z;
  1169. break;
  1170. case 2:
  1171. op = "ble";
  1172. z = reg.psr&PSR_z ? 1 : 0;
  1173. v = reg.psr&PSR_v ? 1 : 0;
  1174. n = reg.psr&PSR_n ? 1 : 0;
  1175. takeit = z | (n ^ v);
  1176. break;
  1177. case 3:
  1178. op = "bl";
  1179. v = reg.psr&PSR_v ? 1 : 0;
  1180. n = reg.psr&PSR_n ? 1 : 0;
  1181. takeit = n ^ v;
  1182. break;
  1183. case 4:
  1184. op = "bleu";
  1185. z = reg.psr&PSR_z ? 1 : 0;
  1186. c = reg.psr&PSR_c ? 1 : 0;
  1187. takeit = c | z;
  1188. break;
  1189. case 5:
  1190. op = "bcs";
  1191. takeit = reg.psr&PSR_c;
  1192. break;
  1193. case 6:
  1194. op = "bneg";
  1195. takeit = reg.psr&PSR_n;
  1196. break;
  1197. case 7:
  1198. op = "bvs";
  1199. takeit = reg.psr&PSR_v;
  1200. break;
  1201. case 8:
  1202. op = "ba";
  1203. ba = 1;
  1204. takeit = 1;
  1205. break;
  1206. case 9:
  1207. op = "bne";
  1208. takeit = !(reg.psr&PSR_z);
  1209. break;
  1210. case 10:
  1211. op = "bg";
  1212. z = reg.psr&PSR_z ? 1 : 0;
  1213. v = reg.psr&PSR_v ? 1 : 0;
  1214. n = reg.psr&PSR_n ? 1 : 0;
  1215. takeit = !(z | (n ^ v));
  1216. break;
  1217. case 11:
  1218. op = "bge";
  1219. v = reg.psr&PSR_v ? 1 : 0;
  1220. n = reg.psr&PSR_n ? 1 : 0;
  1221. takeit = !(n ^ v);
  1222. break;
  1223. case 12:
  1224. op = "bgu";
  1225. z = reg.psr&PSR_z ? 1 : 0;
  1226. c = reg.psr&PSR_c ? 1 : 0;
  1227. takeit = !(c | z);
  1228. break;
  1229. case 13:
  1230. op = "bcc";
  1231. takeit = !(reg.psr&PSR_c);
  1232. break;
  1233. case 14:
  1234. op = "bpos";
  1235. takeit = !(reg.psr&PSR_n);
  1236. break;
  1237. case 15:
  1238. op = "bvc";
  1239. takeit = !(reg.psr&PSR_v);
  1240. break;
  1241. }
  1242. npc = ir & 0x3FFFFF;
  1243. if(npc & (1<<21))
  1244. npc |= ~((1<<22)-1);
  1245. npc = (npc<<2) + reg.pc;
  1246. anul = ir&ANUL;
  1247. if(trace) {
  1248. if(anul)
  1249. itrace("%s,a\t%lux", op, npc);
  1250. else
  1251. itrace("%s\t%lux", op, npc);
  1252. }
  1253. if(takeit == 0) {
  1254. reg.pc += 4;
  1255. if(anul == 0) {
  1256. reg.ir = ifetch(reg.pc);
  1257. delay(reg.pc+4);
  1258. }
  1259. else
  1260. anulled++;
  1261. return;
  1262. }
  1263. ci->taken++;
  1264. if(ba && anul) {
  1265. anulled++;
  1266. reg.pc = npc-4;
  1267. return;
  1268. }
  1269. reg.ir = ifetch(reg.pc+4);
  1270. delay(npc);
  1271. reg.pc = npc-4;
  1272. }