microblaze.isa 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822
  1. /* Copyright 2009-2015 Free Software Foundation, Inc.
  2. This file is part of the Xilinx MicroBlaze simulator.
  3. This library is free software; you can redistribute it and/or modify
  4. it under the terms of the GNU General Public License as published by
  5. the Free Software Foundation; either version 3 of the License, or
  6. (at your option) any later version.
  7. This program is distributed in the hope that it will be useful,
  8. but WITHOUT ANY WARRANTY; without even the implied warranty of
  9. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  10. GNU General Public License for more details.
  11. You should have received a copy of the GNU General Public License
  12. along with this program; if not, see <http://www.gnu.org/licenses/>. */
  13. /*
  14. * MICROBLAZE Instruction Set Architecture
  15. *
  16. * INSTRUCTION(NAME,
  17. * OPCODE,
  18. * TYPE,
  19. * SEMANTICS)
  20. *
  21. */
  22. INSTRUCTION(add,
  23. 0x00,
  24. INST_TYPE_RD_RA_RB,
  25. CARRY = C_calc(RA, RB, 0);
  26. RD = RA + RB;
  27. C_wr(CARRY);
  28. PC += INST_SIZE)
  29. INSTRUCTION(rsub,
  30. 0x01,
  31. INST_TYPE_RD_RA_RB,
  32. CARRY = C_calc(RB, ~RA, 1);
  33. RD = RB + ~RA + 1;
  34. C_wr(CARRY);
  35. PC += INST_SIZE)
  36. INSTRUCTION(addc,
  37. 0x02,
  38. INST_TYPE_RD_RA_RB,
  39. CARRY = C_calc(RA, RB, C_rd);
  40. RD = RA + RB + C_rd;
  41. C_wr(CARRY);
  42. PC += INST_SIZE)
  43. INSTRUCTION(rsubc,
  44. 0x03,
  45. INST_TYPE_RD_RA_RB,
  46. CARRY = C_calc(RB, ~RA, C_rd);
  47. RD = RB + ~RA + C_rd;
  48. C_wr(CARRY);
  49. PC += INST_SIZE)
  50. INSTRUCTION(addk,
  51. 0x04,
  52. INST_TYPE_RD_RA_RB,
  53. RD = RA + RB;
  54. PC += INST_SIZE)
  55. INSTRUCTION(rsubk,
  56. 0x05,
  57. INST_TYPE_RD_RA_RB,
  58. RD = RB + ~RA + 1;
  59. PC += INST_SIZE)
  60. INSTRUCTION(cmp,
  61. 0x05,
  62. INST_TYPE_RD_RA_RB,
  63. {
  64. int tmp_reg = RB + ~RA + 1;
  65. if ((RB & 0x80000000) ^ (RA & 0x80000000)) {
  66. tmp_reg = ((tmp_reg & 0x7fffffff) | (RB & 0x80000000));
  67. }
  68. RD = tmp_reg;
  69. PC += INST_SIZE;
  70. })
  71. INSTRUCTION(cmpu,
  72. 0x05,
  73. INST_TYPE_RD_RA_RB,
  74. {
  75. int tmp_reg = RB + ~RA + 1;
  76. if ((RB & 0x80000000) ^ (RA & 0x80000000)) {
  77. tmp_reg = ((tmp_reg & 0x7fffffff) | (RA & 0x80000000));
  78. }
  79. RD = tmp_reg;
  80. PC += INST_SIZE;
  81. })
  82. INSTRUCTION(addkc,
  83. 0x06,
  84. INST_TYPE_RD_RA_RB,
  85. RD = RA + RB + C_rd;
  86. PC += INST_SIZE)
  87. INSTRUCTION(rsubkc,
  88. 0x07,
  89. INST_TYPE_RD_RA_RB,
  90. RD = RB + ~RA + C_rd;
  91. PC += INST_SIZE)
  92. INSTRUCTION(addi,
  93. 0x08,
  94. INST_TYPE_RD_RA_IMM,
  95. CARRY = C_calc(RA, IMM, 0);
  96. RD = RA + IMM;
  97. C_wr(CARRY);
  98. PC += INST_SIZE)
  99. INSTRUCTION(rsubi,
  100. 0x09,
  101. INST_TYPE_RD_RA_IMM,
  102. CARRY = C_calc(IMM, ~RA, 1);
  103. RD = IMM + ~RA + 1;
  104. C_wr(CARRY);
  105. PC += INST_SIZE)
  106. INSTRUCTION(addic,
  107. 0x0A,
  108. INST_TYPE_RD_RA_IMM,
  109. CARRY = C_calc(RA, IMM, C_rd);
  110. RD = RA + IMM + C_rd;
  111. C_wr(CARRY);
  112. PC += INST_SIZE)
  113. INSTRUCTION(rsubic,
  114. 0x0B,
  115. INST_TYPE_RD_RA_IMM,
  116. CARRY = C_calc(IMM, ~RA, C_rd);
  117. RD = IMM + ~RA + C_rd;
  118. C_wr(CARRY);
  119. PC += INST_SIZE)
  120. INSTRUCTION(addik,
  121. 0x0C,
  122. INST_TYPE_RD_RA_IMM,
  123. RD = RA + IMM;
  124. PC += INST_SIZE)
  125. INSTRUCTION(rsubik,
  126. 0x0D,
  127. INST_TYPE_RD_RA_IMM,
  128. RD = IMM + ~RA + 1;
  129. PC += INST_SIZE)
  130. INSTRUCTION(addikc,
  131. 0x0E,
  132. INST_TYPE_RD_RA_IMM,
  133. RD = RA + IMM + C_rd;
  134. PC += INST_SIZE)
  135. INSTRUCTION(rsubikc,
  136. 0x0F,
  137. INST_TYPE_RD_RA_IMM,
  138. RD = IMM + ~RA + C_rd;
  139. PC += INST_SIZE)
  140. INSTRUCTION(mul,
  141. 0x10,
  142. INST_TYPE_RD_RA_RB,
  143. RD = RA * RB;
  144. PC += INST_SIZE)
  145. INSTRUCTION(bsrl,
  146. 0x11,
  147. INST_TYPE_RD_RA_RB,
  148. RD = (uword)RA >> RB;
  149. PC += INST_SIZE)
  150. INSTRUCTION(bsra,
  151. 0x11,
  152. INST_TYPE_RD_RA_RB,
  153. RD = (word)RA >> RB;
  154. PC += INST_SIZE)
  155. INSTRUCTION(bsll,
  156. 0x11,
  157. INST_TYPE_RD_RA_RB,
  158. RD = (uword)RA << RB;
  159. PC += INST_SIZE)
  160. INSTRUCTION(idiv,
  161. 0x12,
  162. INST_TYPE_RD_RA_RB,
  163. RD = (word) RB / (word) RA;
  164. PC += INST_SIZE)
  165. INSTRUCTION(idivu,
  166. 0x12,
  167. INST_TYPE_RD_RA_RB,
  168. RD = (uword) RB / (uword) RA;
  169. PC += INST_SIZE)
  170. INSTRUCTION(muli,
  171. 0x18,
  172. INST_TYPE_RD_RA_IMM,
  173. RD = RA * IMM;
  174. PC += INST_SIZE)
  175. INSTRUCTION(bsrli,
  176. 0x19,
  177. INST_TYPE_RD_RA_IMM5,
  178. RD = (uword)RA >> (IMM & 0x1F);
  179. PC += INST_SIZE)
  180. INSTRUCTION(bsrai,
  181. 0x19,
  182. INST_TYPE_RD_RA_IMM5,
  183. RD = (word)RA >> (IMM & 0x1F);
  184. PC += INST_SIZE)
  185. INSTRUCTION(bslli,
  186. 0x19,
  187. INST_TYPE_RD_RA_IMM5,
  188. RD = (uword)RA << (IMM & 0x1F);
  189. PC += INST_SIZE)
  190. INSTRUCTION(get,
  191. 0x1b,
  192. INST_TYPE_RD_IMM12,
  193. PC += INST_SIZE)
  194. INSTRUCTION(put,
  195. 0x1b,
  196. INST_TYPE_R1_IMM12,
  197. PC += INST_SIZE)
  198. INSTRUCTION(nget,
  199. 0x1b,
  200. INST_TYPE_RD_IMM12,
  201. PC += INST_SIZE)
  202. INSTRUCTION(nput,
  203. 0x1b,
  204. INST_TYPE_R1_IMM12,
  205. PC += INST_SIZE)
  206. INSTRUCTION(cget,
  207. 0x1b,
  208. INST_TYPE_RD_IMM12,
  209. PC += INST_SIZE)
  210. INSTRUCTION(cput,
  211. 0x1b,
  212. INST_TYPE_R1_IMM12,
  213. PC += INST_SIZE)
  214. INSTRUCTION(ncget,
  215. 0x1b,
  216. INST_TYPE_RD_IMM12,
  217. PC += INST_SIZE)
  218. INSTRUCTION(ncput,
  219. 0x1b,
  220. INST_TYPE_R1_IMM12,
  221. PC += INST_SIZE)
  222. INSTRUCTION(microblaze_or,
  223. 0x20,
  224. INST_TYPE_RD_RA_RB,
  225. RD = RA | RB;
  226. PC += INST_SIZE)
  227. INSTRUCTION(microblaze_and,
  228. 0x21,
  229. INST_TYPE_RD_RA_RB,
  230. RD = RA & RB;
  231. PC += INST_SIZE)
  232. INSTRUCTION(microblaze_xor,
  233. 0x22,
  234. INST_TYPE_RD_RA_RB,
  235. RD = RA ^ RB;
  236. PC += INST_SIZE)
  237. INSTRUCTION(andn,
  238. 0x23,
  239. INST_TYPE_RD_RA_RB,
  240. RD = RA & ~RB;
  241. PC += INST_SIZE)
  242. INSTRUCTION(sra,
  243. 0x24,
  244. INST_TYPE_RD_RA,
  245. CARRY = (RA & 0x1);
  246. RD = (int) (RA >> 1);
  247. C_wr(CARRY);
  248. PC += INST_SIZE)
  249. INSTRUCTION(src,
  250. 0x24,
  251. INST_TYPE_RD_RA,
  252. CARRY = (RA & 0x1);
  253. RD = ((((int) (RA >> 1)) & 0x7FFFFFFF) | (uword)(C_rd << 31));
  254. C_wr(CARRY);
  255. PC += INST_SIZE)
  256. INSTRUCTION(srl,
  257. 0x24,
  258. INST_TYPE_RD_RA,
  259. CARRY = (RA & 0x1);
  260. RD = (uword) ((RA >> 1) & 0x7FFFFFFF);
  261. C_wr(CARRY);
  262. PC += INST_SIZE)
  263. INSTRUCTION(sext8,
  264. 0x24,
  265. INST_TYPE_RD_RA,
  266. RD = MICROBLAZE_SEXT8(RA);
  267. PC += INST_SIZE)
  268. INSTRUCTION(sext16,
  269. 0x24,
  270. INST_TYPE_RD_RA,
  271. RD = MICROBLAZE_SEXT16(RA);
  272. PC += INST_SIZE)
  273. INSTRUCTION(wdc,
  274. 0x24,
  275. INST_TYPE_RA_RB,
  276. PC += INST_SIZE)
  277. INSTRUCTION(wic,
  278. 0x24,
  279. INST_TYPE_RA_RB,
  280. PC += INST_SIZE)
  281. INSTRUCTION(mts,
  282. 0x25,
  283. INST_TYPE_SA_RA,
  284. SA = RA;
  285. PC += INST_SIZE)
  286. INSTRUCTION(mfs,
  287. 0x25,
  288. INST_TYPE_RD_SA,
  289. RD = SA;
  290. PC += INST_SIZE)
  291. INSTRUCTION(br,
  292. 0x26,
  293. INST_TYPE_RB,
  294. PC += RB;
  295. BRANCH)
  296. INSTRUCTION(brd,
  297. 0x26,
  298. INST_TYPE_RB,
  299. PC += RB;
  300. BRANCH;
  301. DELAY_SLOT)
  302. INSTRUCTION(brld,
  303. 0x26,
  304. INST_TYPE_RD_RB,
  305. RD = PC;
  306. PC += RB;
  307. BRANCH;
  308. DELAY_SLOT)
  309. INSTRUCTION(bra,
  310. 0x26,
  311. INST_TYPE_RB,
  312. PC = RB;
  313. BRANCH)
  314. INSTRUCTION(brad,
  315. 0x26,
  316. INST_TYPE_RB,
  317. PC = RB;
  318. BRANCH;
  319. DELAY_SLOT)
  320. INSTRUCTION(brald,
  321. 0x26,
  322. INST_TYPE_RD_RB,
  323. RD = PC;
  324. PC = RB;
  325. BRANCH;
  326. DELAY_SLOT)
  327. INSTRUCTION(microblaze_brk,
  328. 0x26,
  329. INST_TYPE_RD_RB,
  330. RD = PC;
  331. PC = RB;
  332. MSR = MSR | BIP_MASK;
  333. BRANCH)
  334. INSTRUCTION(beq,
  335. 0x27,
  336. INST_TYPE_RA_RB,
  337. if (RA == 0) {
  338. PC += RB;
  339. BRANCH;
  340. } else {
  341. PC += INST_SIZE;
  342. })
  343. INSTRUCTION(beqd,
  344. 0x27,
  345. INST_TYPE_RA_RB,
  346. if (RA == 0) {
  347. PC += RB;
  348. BRANCH;
  349. } else {
  350. PC += INST_SIZE;
  351. }
  352. DELAY_SLOT)
  353. INSTRUCTION(bne,
  354. 0x27,
  355. INST_TYPE_RA_RB,
  356. if (RA != 0) {
  357. PC += RB;
  358. BRANCH;
  359. } else {
  360. PC += INST_SIZE;
  361. })
  362. INSTRUCTION(bned,
  363. 0x27,
  364. INST_TYPE_RA_RB,
  365. if (RA != 0) {
  366. PC += RB;
  367. BRANCH;
  368. } else {
  369. PC += INST_SIZE;
  370. }
  371. DELAY_SLOT)
  372. INSTRUCTION(blt,
  373. 0x27,
  374. INST_TYPE_RA_RB,
  375. if (RA < 0) {
  376. PC += RB;
  377. BRANCH;
  378. } else {
  379. PC += INST_SIZE;
  380. })
  381. INSTRUCTION(bltd,
  382. 0x27,
  383. INST_TYPE_RA_RB,
  384. if (RA < 0) {
  385. PC += RB;
  386. BRANCH;
  387. } else {
  388. PC += INST_SIZE;
  389. }
  390. DELAY_SLOT)
  391. INSTRUCTION(ble,
  392. 0x27,
  393. INST_TYPE_RA_RB,
  394. if (RA <= 0) {
  395. PC += RB;
  396. BRANCH;
  397. } else {
  398. PC += INST_SIZE;
  399. })
  400. INSTRUCTION(bled,
  401. 0x27,
  402. INST_TYPE_RA_RB,
  403. if (RA <= 0) {
  404. PC += RB;
  405. BRANCH;
  406. } else {
  407. PC += INST_SIZE;
  408. }
  409. DELAY_SLOT)
  410. INSTRUCTION(bgt,
  411. 0x27,
  412. INST_TYPE_RA_RB,
  413. if (RA > 0) {
  414. PC += RB;
  415. BRANCH;
  416. } else {
  417. PC += INST_SIZE;
  418. })
  419. INSTRUCTION(bgtd,
  420. 0x27,
  421. INST_TYPE_RA_RB,
  422. if (RA > 0) {
  423. PC += RB;
  424. BRANCH;
  425. } else {
  426. PC += INST_SIZE;
  427. }
  428. DELAY_SLOT)
  429. INSTRUCTION(bge,
  430. 0x27,
  431. INST_TYPE_RA_RB,
  432. if (RA >= 0) {
  433. PC += RB;
  434. BRANCH;
  435. } else {
  436. PC += INST_SIZE;
  437. })
  438. INSTRUCTION(bged,
  439. 0x27,
  440. INST_TYPE_RA_RB,
  441. if (RA >= 0) {
  442. PC += RB;
  443. BRANCH;
  444. } else {
  445. PC += INST_SIZE;
  446. }
  447. DELAY_SLOT)
  448. INSTRUCTION(ori,
  449. 0x28,
  450. INST_TYPE_RD_RA_IMM,
  451. RD = RA | IMM;
  452. PC += INST_SIZE)
  453. INSTRUCTION(andi,
  454. 0x29,
  455. INST_TYPE_RD_RA_IMM,
  456. RD = RA & IMM;
  457. PC += INST_SIZE)
  458. INSTRUCTION(xori,
  459. 0x2A,
  460. INST_TYPE_RD_RA_IMM,
  461. RD = RA ^ IMM;
  462. PC += INST_SIZE)
  463. INSTRUCTION(andni,
  464. 0x2B,
  465. INST_TYPE_RD_RA_IMM,
  466. RD = RA & ~IMM;
  467. PC += INST_SIZE)
  468. INSTRUCTION(imm,
  469. 0x2C,
  470. INST_TYPE_IMM,
  471. IMM_H = IMM_L;
  472. PC += INST_SIZE)
  473. INSTRUCTION(rtsd,
  474. 0x2D,
  475. INST_TYPE_RA_IMM,
  476. PC = RA + IMM;
  477. BRANCH;
  478. DELAY_SLOT)
  479. INSTRUCTION(rtid,
  480. 0x2D,
  481. INST_TYPE_RA_IMM,
  482. PC = RA + IMM;
  483. MSR = MSR | INTR_EN_MASK;
  484. BRANCH;
  485. DELAY_SLOT)
  486. INSTRUCTION(rtbd,
  487. 0x2D,
  488. INST_TYPE_RA_IMM,
  489. PC = RA + IMM;
  490. MSR = MSR & ~BIP_MASK;
  491. BRANCH;
  492. DELAY_SLOT;)
  493. INSTRUCTION(bri,
  494. 0x2E,
  495. INST_TYPE_IMM,
  496. PC += IMM;
  497. BRANCH)
  498. INSTRUCTION(brid,
  499. 0x2E,
  500. INST_TYPE_IMM,
  501. PC += IMM;
  502. BRANCH;
  503. DELAY_SLOT)
  504. INSTRUCTION(brlid,
  505. 0x2E,
  506. INST_TYPE_RD_IMM,
  507. RD = PC;
  508. PC += IMM;
  509. BRANCH;
  510. DELAY_SLOT)
  511. INSTRUCTION(brai,
  512. 0x2E,
  513. INST_TYPE_IMM,
  514. PC = IMM;
  515. BRANCH)
  516. INSTRUCTION(braid,
  517. 0x2E,
  518. INST_TYPE_IMM,
  519. PC = IMM;
  520. BRANCH;
  521. DELAY_SLOT)
  522. INSTRUCTION(bralid,
  523. 0x2E,
  524. INST_TYPE_RD_IMM,
  525. RD = PC;
  526. PC = IMM;
  527. BRANCH;
  528. DELAY_SLOT)
  529. INSTRUCTION(brki,
  530. 0x2E,
  531. INST_TYPE_RD_IMM,
  532. RD = PC;
  533. PC = IMM;
  534. MSR = MSR | BIP_MASK;
  535. BRANCH)
  536. INSTRUCTION(beqi,
  537. 0x2F,
  538. INST_TYPE_RA_IMM,
  539. if (RA == 0) {
  540. PC += IMM;
  541. BRANCH;
  542. } else {
  543. PC += INST_SIZE;
  544. })
  545. INSTRUCTION(beqid,
  546. 0x2F,
  547. INST_TYPE_RA_IMM,
  548. if (RA == 0) {
  549. PC += IMM;
  550. BRANCH;
  551. } else {
  552. PC += INST_SIZE;
  553. }
  554. DELAY_SLOT)
  555. INSTRUCTION(bnei,
  556. 0x2F,
  557. INST_TYPE_RA_IMM,
  558. if (RA != 0) {
  559. PC += IMM;
  560. BRANCH;
  561. } else {
  562. PC += INST_SIZE;
  563. })
  564. INSTRUCTION(bneid,
  565. 0x2F,
  566. INST_TYPE_RA_IMM,
  567. if (RA != 0) {
  568. PC += IMM;
  569. BRANCH;
  570. } else {
  571. PC += INST_SIZE;
  572. }
  573. DELAY_SLOT)
  574. INSTRUCTION(blti,
  575. 0x2F,
  576. INST_TYPE_RA_IMM,
  577. if (RA < 0) {
  578. PC += IMM;
  579. BRANCH;
  580. } else {
  581. PC += INST_SIZE;
  582. })
  583. INSTRUCTION(bltid,
  584. 0x2F,
  585. INST_TYPE_RA_IMM,
  586. if (RA < 0) {
  587. PC += IMM;
  588. BRANCH;
  589. } else {
  590. PC += INST_SIZE;
  591. }
  592. DELAY_SLOT)
  593. INSTRUCTION(blei,
  594. 0x2F,
  595. INST_TYPE_RA_IMM,
  596. if (RA <= 0) {
  597. PC += IMM;
  598. BRANCH;
  599. } else {
  600. PC += INST_SIZE;
  601. })
  602. INSTRUCTION(bleid,
  603. 0x2F,
  604. INST_TYPE_RA_IMM,
  605. if (RA <= 0) {
  606. PC += IMM;
  607. BRANCH;
  608. } else {
  609. PC += INST_SIZE;
  610. }
  611. DELAY_SLOT)
  612. INSTRUCTION(bgti,
  613. 0x2F,
  614. INST_TYPE_RA_IMM,
  615. if (RA > 0) {
  616. PC += IMM;
  617. BRANCH;
  618. } else {
  619. PC += INST_SIZE;
  620. })
  621. INSTRUCTION(bgtid,
  622. 0x2F,
  623. INST_TYPE_RA_IMM,
  624. if (RA > 0) {
  625. PC += IMM;
  626. BRANCH;
  627. } else {
  628. PC += INST_SIZE;
  629. }
  630. DELAY_SLOT)
  631. INSTRUCTION(bgei,
  632. 0x2F,
  633. INST_TYPE_RA_IMM,
  634. if (RA >= 0) {
  635. PC += IMM;
  636. BRANCH;
  637. } else {
  638. PC += INST_SIZE;
  639. })
  640. INSTRUCTION(bgeid,
  641. 0x2F,
  642. INST_TYPE_RA_IMM,
  643. if (RA >= 0) {
  644. PC += IMM;
  645. BRANCH;
  646. } else {
  647. PC += INST_SIZE;
  648. }
  649. DELAY_SLOT)
  650. INSTRUCTION(lbu,
  651. 0x30,
  652. INST_TYPE_RD_RA_RB,
  653. RD = (MEM_RD_UBYTE(RA + RB));
  654. PC += INST_SIZE)
  655. INSTRUCTION(lhu,
  656. 0x31,
  657. INST_TYPE_RD_RA_RB,
  658. RD = (MEM_RD_UHALF((RA + RB) & ~0x1));
  659. PC += INST_SIZE)
  660. INSTRUCTION(lw,
  661. 0x32,
  662. INST_TYPE_RD_RA_RB,
  663. RD = (MEM_RD_WORD((RA + RB) & ~0x3));
  664. PC += INST_SIZE)
  665. INSTRUCTION(sb,
  666. 0x34,
  667. INST_TYPE_RD_RA_RB,
  668. MEM_WR_BYTE(RA + RB, RD);
  669. PC += INST_SIZE)
  670. INSTRUCTION(sh,
  671. 0x35,
  672. INST_TYPE_RD_RA_RB,
  673. MEM_WR_HALF((RA + RB) & ~0x1, RD);
  674. PC += INST_SIZE)
  675. INSTRUCTION(sw,
  676. 0x36,
  677. INST_TYPE_RD_RA_RB,
  678. MEM_WR_WORD((RA + RB) & ~0x3, RD);
  679. PC += INST_SIZE)
  680. INSTRUCTION(lbui,
  681. 0x38,
  682. INST_TYPE_RD_RA_IMM,
  683. RD = (MEM_RD_UBYTE(RA + IMM));
  684. PC += INST_SIZE)
  685. INSTRUCTION(lhui,
  686. 0x39,
  687. INST_TYPE_RD_RA_IMM,
  688. RD = (MEM_RD_UHALF((RA+IMM) & ~0x1));
  689. PC += INST_SIZE)
  690. INSTRUCTION(lwi,
  691. 0x3A,
  692. INST_TYPE_RD_RA_IMM,
  693. RD = (MEM_RD_WORD((RA+IMM) & ~0x3));
  694. PC += INST_SIZE)
  695. INSTRUCTION(sbi,
  696. 0x3C,
  697. INST_TYPE_RD_RA_IMM,
  698. MEM_WR_BYTE(RA + IMM, RD);
  699. PC += INST_SIZE)
  700. INSTRUCTION(shi,
  701. 0x3D,
  702. INST_TYPE_RD_RA_IMM,
  703. MEM_WR_HALF((RA + IMM) & ~0x1, RD);
  704. PC += INST_SIZE)
  705. INSTRUCTION(swi,
  706. 0x3E,
  707. INST_TYPE_RD_RA_IMM,
  708. MEM_WR_WORD((RA + IMM) & ~0x3, RD);
  709. PC += INST_SIZE)