m32c.opc 46 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142
  1. /* m32c.opc --- semantics for m32c opcodes. -*- mode: c -*-
  2. Copyright (C) 2005-2015 Free Software Foundation, Inc.
  3. Contributed by Red Hat, Inc.
  4. This file is part of the GNU simulators.
  5. This program is free software; you can redistribute it and/or modify
  6. it under the terms of the GNU General Public License as published by
  7. the Free Software Foundation; either version 3 of the License, or
  8. (at your option) any later version.
  9. This program is distributed in the hope that it will be useful,
  10. but WITHOUT ANY WARRANTY; without even the implied warranty of
  11. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  12. GNU General Public License for more details.
  13. You should have received a copy of the GNU General Public License
  14. along with this program. If not, see <http://www.gnu.org/licenses/>. */
  15. #include <stdio.h>
  16. #include <stdlib.h>
  17. #include "cpu.h"
  18. #include "mem.h"
  19. #include "misc.h"
  20. #include "int.h"
  21. #define AU __attribute__((unused))
  22. #define tprintf if (trace) printf
  23. static unsigned char
  24. getbyte (void)
  25. {
  26. int tsave = trace;
  27. unsigned char b;
  28. if (trace == 1)
  29. trace = 0;
  30. b = mem_get_pc ();
  31. regs.r_pc ++;
  32. trace = tsave;
  33. return b;
  34. }
  35. #define M32C_ONLY() /* FIXME: add something here */
  36. #define GETBYTE() (op[opi++] = getbyte())
  37. #define UNSUPPORTED() unsupported("unsupported", m32c_opcode_pc)
  38. #define NOTYET() unsupported("unimplemented", m32c_opcode_pc)
  39. static void
  40. unsupported (char *tag, int orig_pc)
  41. {
  42. int i;
  43. printf("%s opcode at %08x\n", tag, orig_pc);
  44. regs.r_pc = orig_pc;
  45. for (i=0; i<2; i++)
  46. {
  47. int b = mem_get_pc();
  48. printf(" %s", bits(b>>4, 4));
  49. printf(" %s", bits(b, 4));
  50. regs.r_pc ++;
  51. }
  52. printf("\n");
  53. regs.r_pc = orig_pc;
  54. for (i=0; i<6; i++)
  55. {
  56. printf(" %02x", mem_get_pc ());
  57. regs.r_pc ++;
  58. }
  59. printf("\n");
  60. exit(1);
  61. }
  62. static int
  63. IMM(int bytes)
  64. {
  65. int rv = 0;
  66. switch (bytes)
  67. {
  68. case 1:
  69. rv = mem_get_qi (get_reg(pc));
  70. break;
  71. case 2:
  72. rv = mem_get_hi (get_reg(pc));
  73. break;
  74. case 3:
  75. rv = mem_get_psi (get_reg(pc));
  76. break;
  77. case 4:
  78. rv = mem_get_si (get_reg(pc));
  79. break;
  80. }
  81. regs.r_pc += bytes;
  82. return rv;
  83. }
  84. #define IMM4() (immm >= 8 ? 7 - immm : immm + 1)
  85. #define NO_PREFIX() PREFIX(0,0,0)
  86. /* Indicate which sorts of prefixes are allowed for the current
  87. opcode. */
  88. static void
  89. prefix (int src_allowed, int dest_allowed, int index_bytewidth)
  90. {
  91. /* At the moment, we don't do anything with this information. We
  92. just wanted to get the information entered in some
  93. machine-readable form while we were going through all the
  94. opcodes. */
  95. }
  96. #define MATH_OP(dc,s,c,op) \
  97. { \
  98. int ma, mb; \
  99. ma = get_src(dc); \
  100. mb = s & b2mask[dc.bytes]; \
  101. ll = (long long)ma op (long long)mb op c; \
  102. tprintf("0x%x " #op " 0x%x " #op " 0x%x = 0x%llx\n", ma, mb, c, ll); \
  103. ma = sign_ext (ma, dc.bytes * 8); \
  104. mb = sign_ext (s, dc.bytes * 8); \
  105. v = ma op mb op c; \
  106. tprintf("%d " #op " %d " #op " %d = %d\n", ma, mb, c, v); \
  107. set_oszc (v, dc.bytes, (1 op 1) ? (ll > b2mask[dc.bytes]) : (ll >= 0)); \
  108. put_dest (dc, v); \
  109. }
  110. #define LOGIC_OP(dc,s,op) \
  111. { \
  112. int ma, mb; \
  113. ma = get_src(dc); \
  114. mb = s & b2mask[dc.bytes]; \
  115. v = ma op mb; \
  116. tprintf("0x%x " #op " 0x%x = 0x%x\n", ma, mb, v); \
  117. set_sz (v, dc.bytes); \
  118. put_dest (dc, v); \
  119. }
  120. #define BIT_OP(dc,bit,expr) \
  121. b = get_bit2 (dc, bitindex == -1 ? bit : bitindex); \
  122. v = expr; \
  123. tprintf ("b=%d, bit=%d, carry=%d, %s = %d\n", \
  124. b, bitindex == -1 ? bit : bitindex, carry, #expr, v); \
  125. put_bit2 (dc, bitindex == -1 ? bit : bitindex, v);
  126. #define BIT_OPC(dc,bit,expr) \
  127. b = get_bit2 (dc, bitindex == -1 ? bit : bitindex); \
  128. v = expr; \
  129. tprintf ("b=%d, bit=%d, carry=%d, %s = %d\n", \
  130. b, bitindex == -1 ? bit : bitindex, carry, #expr, v); \
  131. set_c (v);
  132. #define carry (FLAG_C ? 1 : 0)
  133. static void
  134. cmp (int d, int s, int bytes)
  135. {
  136. int a, b, f=0;
  137. a = d - s;
  138. b = sign_ext (d, bytes*8) - sign_ext (s, bytes*8);
  139. tprintf ("cmp: %x - %x = %08x, %x - %x = %d\n",
  140. d, s, a,
  141. sign_ext(d,bytes*8), sign_ext(s,bytes*8), b);
  142. if (b == 0)
  143. f |= FLAGBIT_Z;
  144. if (b & b2signbit[bytes])
  145. f |= FLAGBIT_S;
  146. if ((d & b2mask[bytes]) >= (s & b2mask[bytes]))
  147. f |= FLAGBIT_C;
  148. if (b < b2minsigned[bytes] || b > b2maxsigned[bytes])
  149. f |= FLAGBIT_O;
  150. set_flags (FLAGBIT_Z | FLAGBIT_S | FLAGBIT_O | FLAGBIT_C, f);
  151. }
  152. static void
  153. dadd_op (int ddd, int dd, int sss, int ss, int imm, int add, int cy, int w)
  154. {
  155. srcdest sc, dc;
  156. int a, b=0, res;
  157. prefix (0, 0, 0);
  158. if (!imm)
  159. {
  160. sc = decode_src23 (sss, ss, w+1);
  161. b = get_src (sc);
  162. }
  163. dc = decode_dest23 (ddd, dd, w+1);
  164. a = get_src (dc);
  165. if (imm)
  166. b = IMM(w+1);
  167. a = bcd2int(a, w);
  168. b = bcd2int(b, w);
  169. tprintf("decimal: %d %s %d", a, add?"+":"-", b);
  170. if (cy)
  171. tprintf(" c=%d", carry);
  172. if (add)
  173. {
  174. res = a + b;
  175. if (cy)
  176. res += carry;
  177. cy = res > (w ? 9999 : 99);
  178. }
  179. else
  180. {
  181. res = a - b;
  182. if (cy)
  183. res -= (1-carry);
  184. cy = res >= 0;
  185. if (res < 0)
  186. res += w ? 10000 : 100;
  187. }
  188. res = int2bcd (res, w);
  189. tprintf(" = %x\n", res);
  190. set_szc (res, w+1, cy);
  191. put_dest (dc, res);
  192. }
  193. #define DADDV(A,C) dadd_op(ddd, dd, sss, ss, 0, A, C, w)
  194. #define DADDI(A,C) dadd_op(ddd, dd, 0, 0, 1, A, C, w)
  195. static void
  196. div_op (int sss, int ss, int u, int x, int bytes)
  197. {
  198. srcdest sc;
  199. int s, v, a, b;
  200. if (sss == -1)
  201. s = IMM(bytes);
  202. else
  203. {
  204. sc = decode_dest23 (sss, ss, bytes);
  205. s = get_src (sc);
  206. }
  207. v = get_reg (bytes > 1 ? r2r0 : r0);
  208. if (!u)
  209. {
  210. /* FIXME? do we sign extend a0/a1 to .L? Docs say zero extend. */
  211. s = sign_ext (s, bytes*8);
  212. v = sign_ext (v, bytes*8);
  213. }
  214. if (s == 0)
  215. {
  216. set_flags (FLAGBIT_O, FLAGBIT_O);
  217. return;
  218. }
  219. if (u)
  220. {
  221. a = (unsigned int)v / (unsigned int)s;
  222. b = (unsigned int)v % (unsigned int)s;
  223. }
  224. else
  225. {
  226. a = v / s;
  227. b = v % s;
  228. }
  229. if (x)
  230. {
  231. if ((s > 0 && b < 0)
  232. || (s < 0 && b > 0))
  233. {
  234. a --;
  235. b += s;
  236. }
  237. }
  238. tprintf ("%d / %d = %d rem %d\n", v, s, a, b);
  239. if ((!u && (a > b2maxsigned[bytes]
  240. || a < b2minsigned[bytes]))
  241. || (u && (a > b2mask[bytes])))
  242. set_flags (FLAGBIT_O, FLAGBIT_O);
  243. else
  244. set_flags (FLAGBIT_O, 0);
  245. switch (bytes)
  246. {
  247. case 1:
  248. put_reg (r0l, a);
  249. put_reg (r0h, b);
  250. break;
  251. case 2:
  252. put_reg (r0, a);
  253. put_reg (r2, b);
  254. break;
  255. case 4:
  256. put_reg (r2r0, a);
  257. break;
  258. }
  259. }
  260. static void
  261. index_op (int sss, int ss, int do_s, int do_d, int scale, int w)
  262. {
  263. srcdest sc = decode_src23 (sss, ss, w+1);
  264. int v = get_src (sc) * scale;
  265. tprintf("%d = %d * %d, %d %d\n", v, get_src(sc), scale, do_s, do_d);
  266. decode_index (do_s * v, do_d * v);
  267. }
  268. #define INDEXOP(scale,do_s,do_d) \
  269. index_op (sss, ss, do_s, do_d, scale, w); goto next_opcode
  270. static void
  271. rot_op (srcdest sd, int rotc, int count)
  272. {
  273. int mask = (sd.bytes == 2) ? 0xffff : 0xff;
  274. int msb = (sd.bytes == 2) ? 0x8000 : 0x80;
  275. int v = get_src (sd);
  276. int c = carry, ct;
  277. tprintf("%s %x by %d\n", rotc ? "rotc" : "rot", v, count);
  278. tprintf (": %s %d\n", bits(v, 8*sd.bytes), c);
  279. while (count > 0)
  280. {
  281. ct = (v & msb) ? 1 : 0;
  282. v <<= 1;
  283. v |= rotc ? c : ct;
  284. v &= mask;
  285. c = ct;
  286. tprintf (": %s %d\n", bits(v, 8*sd.bytes), c);
  287. count --;
  288. }
  289. while (count < 0)
  290. {
  291. ct = v & 1;
  292. v >>= 1;
  293. v |= (rotc ? c : ct) * msb;
  294. c = ct;
  295. tprintf (": %s %d\n", bits(v, 8*sd.bytes), c);
  296. count ++;
  297. }
  298. put_dest (sd, v);
  299. set_szc (v, sd.bytes, c);
  300. }
  301. static void
  302. shift_op (srcdest sd, int arith, int count, int setc)
  303. {
  304. int mask = (sd.bytes == 2) ? 0xffff : 0xff;
  305. int msb = (sd.bytes == 2) ? 0x8000 : 0x80;
  306. int v = get_src (sd);
  307. int c = 0;
  308. int o = 0;
  309. if (sd.bytes == 4)
  310. {
  311. mask = 0xffffffffU;
  312. msb = 0x80000000U;
  313. }
  314. tprintf("%s %x by %d\n", arith ? "sha" : "shl", v, count);
  315. tprintf (": %s %d %d\n", bits(v, 8*sd.bytes), c, o);
  316. while (count > 0)
  317. {
  318. c = (v & msb) ? 1 : 0;
  319. v <<= 1;
  320. v &= mask;
  321. if (c != ((v & msb) ? 1 : 0))
  322. o = 1;
  323. tprintf (": %s %d %d\n", bits(v, 8*sd.bytes), c, o);
  324. count --;
  325. }
  326. while (count < 0)
  327. {
  328. c = v & 1;
  329. if (arith)
  330. v = (v & msb) | (v >> 1);
  331. else
  332. v = (v >> 1) & (msb - 1);
  333. tprintf (": %s %d %d\n", bits(v, 8*sd.bytes), c, o);
  334. count ++;
  335. }
  336. put_dest (sd, v);
  337. set_sz (v, sd.bytes);
  338. if (setc)
  339. set_c (c);
  340. set_flags (FLAGBIT_O, o ? FLAGBIT_O : 0);
  341. }
  342. static int pcs[16];
  343. static int ipcs = 0;
  344. int
  345. decode_m32c (void)
  346. {
  347. unsigned char op[40];
  348. int opi;
  349. int v, a, b;
  350. long long ll;
  351. srcdest sc, dc;
  352. int imm;
  353. int bitindex = -1;
  354. int t0, t1=0, t2, t3=0;
  355. int ta0, ta1, dif;
  356. step_result = M32C_MAKE_STEPPED ();
  357. decode_indirect (0, 0);
  358. decode_index (0, 0);
  359. next_opcode:
  360. opi = 0;
  361. m32c_opcode_pc = get_reg (pc);
  362. tprintf("trace: decode pc = %06x\n", m32c_opcode_pc);
  363. if (m32c_opcode_pc == 0)
  364. {
  365. int i;
  366. printf("Abort: PC is zero, here from:\n");
  367. for (i=0; i<4; i++)
  368. printf(" 0x%06x\n", pcs[(ipcs+15-i)%16]);
  369. return M32C_MAKE_HIT_BREAK ();
  370. }
  371. pcs[ipcs++] = m32c_opcode_pc;
  372. ipcs %= 16;
  373. /** VARY sss 000 001 010 011 100 */
  374. /** VARY ddd 000 001 010 011 100 */
  375. /** 0000 1001 indirect dest */
  376. decode_indirect (0, 1);
  377. goto next_opcode;
  378. /** 0100 0001 indirect src */
  379. decode_indirect (1, 0);
  380. goto next_opcode;
  381. /** 0100 1001 indirect src and dest */
  382. decode_indirect (1, 1);
  383. goto next_opcode;
  384. /** 1010 ddd w dd01 1111 ABS.size dest */
  385. prefix (0, 1, 0);
  386. dc = decode_dest23 (ddd, dd, w+1);
  387. v = sign_ext (get_src (dc), w?16:8);
  388. a = v<0 ? -v : v;
  389. tprintf("abs(%d) = %d\n", v, a);
  390. set_osz(a, w+1);
  391. put_dest (dc, a);
  392. /** 0000 0001 1000 ddd w dd10 1110 ADC.size #IMM,dest */
  393. prefix (0, 0, 0);
  394. dc = decode_dest23 (ddd, dd, w+1);
  395. imm = IMM (w+1);
  396. MATH_OP (dc, imm, carry, +);
  397. /** 0000 0001 1sss ddd w dd ss 0100 ADC.size src,dest */
  398. prefix (0, 0, 0);
  399. sc = decode_src23 (sss, ss, w+1);
  400. dc = decode_dest23 (ddd, dd, w+1);
  401. b = get_src (sc);
  402. MATH_OP (dc, b, carry, +);
  403. /** 1011 ddd w dd01 1110 ADCF.size dest */
  404. prefix (0, 1, 0);
  405. dc = decode_dest23 (ddd, dd, w+1);
  406. MATH_OP (dc, 0, carry, +);
  407. /** 1000 ddd w dd10 1110 ADD.size:G #IMM,dest */
  408. prefix (0, 1, 0);
  409. dc = decode_dest23(ddd, dd, w+1);
  410. imm = IMM(w+1);
  411. MATH_OP (dc, imm, 0, +);
  412. /** 1000 ddd0 dd11 0001 ADD.L:G #IMM,dest */
  413. prefix (0, 1, 0);
  414. dc = decode_dest23(ddd, dd, 4);
  415. imm = IMM(4);
  416. MATH_OP (dc, imm, 0, +);
  417. /** 111L ddd w dd11 immm ADD.size:Q #IMM,dest */
  418. prefix (0, 1, 0);
  419. dc = decode_dest23(ddd, dd, L ? 4 : (w+1));
  420. imm = sign_ext (immm, 4);
  421. MATH_OP (dc, imm, 0, +);
  422. /** 00dd 011w ADD.size:S #IMM,dest */
  423. prefix (0, 1, 0);
  424. dc = decode_dest2(dd, w+1);
  425. imm = IMM (w+1);
  426. MATH_OP (dc, imm, 0, +);
  427. /** 10i0 110d ADD.L:S #IMM,A0/A1 */
  428. prefix (0, 0, 0);
  429. dc = reg_sd (d ? a1 : a0);
  430. imm = i ? 2 : 1;
  431. MATH_OP (dc, imm, 0, +);
  432. /** 1sss ddd w dd ss 1000 ADD.size:G src,dest */
  433. prefix (1, 1, 0);
  434. sc = decode_src23(sss, ss, w+1);
  435. dc = decode_dest23(ddd, dd, w+1);
  436. b = get_src (sc);
  437. MATH_OP (dc, b, 0, +);
  438. /** 1sss ddd1 dd ss 0010 ADD.L:G src,dest */
  439. prefix (1, 1, 0);
  440. sc = decode_src23(sss, ss, 4);
  441. dc = decode_dest23(ddd, dd, 4);
  442. b = get_src (sc);
  443. MATH_OP (dc, b, 0, +);
  444. /** 1011 0110 0001 0011 ADD.L:G #IMM16,SP */
  445. prefix (0, 0, 0);
  446. dc = reg_sd (sp);
  447. b = sign_ext (IMM(2), 16);
  448. MATH_OP (dc, b, 0, +);
  449. /** 01ii 001i ADD.L:Q #IMM3,SP */
  450. prefix (0, 0, 0);
  451. dc = reg_sd (sp);
  452. b = ii * 2 + i + 1;
  453. MATH_OP (dc, b, 0, +);
  454. /** 1011 0110 0000 0011 ADD.L:S #IMM8,SP */
  455. prefix (0, 0, 0);
  456. dc = reg_sd (sp);
  457. b = sign_ext (IMM(1), 8);
  458. MATH_OP (dc, b, 0, +);
  459. /** 1000 ddd0 dd01 0001 ADDX #IMM,dest */
  460. prefix (0, 1, 0);
  461. dc = decode_dest23(ddd, dd, 4);
  462. imm = sign_ext (IMM(1), 8);
  463. MATH_OP (dc, imm, 0, +);
  464. /** 1sss ddd0 dd ss 0010 ADDX src,dest */
  465. prefix (1, 1, 0);
  466. sc = decode_src23(sss, ss, 1);
  467. dc = decode_dest23(ddd, dd, 4);
  468. b = sign_ext (get_src (sc), 8);
  469. MATH_OP (dc, b, 0, +);
  470. /** 1111 ddd w dd01 immm ADJNZ.size #IMM,dest,label */
  471. prefix (0, 0, 0);
  472. dc = decode_dest23 (ddd, dd, w+1);
  473. v = get_src (dc);
  474. imm = sign_ext(immm, 4);
  475. tprintf("%d + %d = %d\n", v, imm, v+imm);
  476. v += imm;
  477. put_dest (dc, v);
  478. a = sign_ext (IMM(1), 8);
  479. if ((v & (w ? 0xffff : 0xff)) != 0)
  480. {
  481. tprintf("jmp: %x + 2 + %d = ", get_reg (pc), a);
  482. put_reg (pc, m32c_opcode_pc + 2 + a);
  483. tprintf("%x\n", get_reg (pc));
  484. }
  485. /** 1000 ddd w dd11 1111 AND.size:G #IMM,dest */
  486. prefix (0, 1, 0);
  487. dc = decode_dest23(ddd, dd, w+1);
  488. imm = IMM(w+1);
  489. LOGIC_OP (dc, imm, &);
  490. /** 01dd 110w AND.size:S #IMM,dest */
  491. prefix (0, 1, 0);
  492. dc = decode_dest2(dd, w+1);
  493. imm = IMM (w+1);
  494. LOGIC_OP (dc, imm, &);
  495. /** 1sss ddd w dd ss 1101 AND.size:G src,dest */
  496. prefix (1, 1, 0);
  497. sc = decode_src23(sss, ss, w+1);
  498. dc = decode_dest23(ddd, dd, w+1);
  499. b = get_src (sc);
  500. LOGIC_OP (dc, b, &);
  501. /** 0000 0001 1101 sss0 ss00 1bit BAND src */
  502. sc = decode_src23 (sss, ss, 1);
  503. BIT_OPC (sc, bit, b & carry);
  504. /** 1101 ddd0 dd11 0bit BCLR dest */
  505. dc = decode_dest23 (ddd, dd, 1);
  506. BIT_OP (dc, bit, 0);
  507. /** 1100 ddd w dd10 1110 BITINDEX.size src */
  508. prefix (0, 0, 0);
  509. dc = decode_dest23 (ddd, dd, w+1);
  510. bitindex = get_src (dc);
  511. tprintf ("bitindex set to %d\n", bitindex);
  512. goto next_opcode;
  513. /** 1101 ddd0 dd01 0bit BMcnd dest */
  514. prefix (0, 0, 0);
  515. dc = decode_dest23 (ddd, dd, 1);
  516. if (condition_true (IMM (1)))
  517. put_bit2 (dc, bit, 1);
  518. else
  519. put_bit2 (dc, bit, 0);
  520. /** 1101 1001 0c10 1cnd BMcnd C */
  521. prefix (0, 0, 0);
  522. if (condition_true (c * 8 + cnd))
  523. set_c (1);
  524. else
  525. set_c (0);
  526. /** 0000 0001 1101 sss0 ss01 1bit BNAND src */
  527. prefix (0, 0, 0);
  528. sc = decode_src23 (sss, ss, 1);
  529. BIT_OPC (sc, bit, (!b) & carry);
  530. /** 0000 0001 1101 sss0 ss11 0bit BNOR src */
  531. prefix (0, 0, 0);
  532. sc = decode_src23 (sss, ss, 1);
  533. BIT_OPC (sc, bit, (!b) | carry);
  534. /** 1101 ddd0 dd01 1bit BNOT dest */
  535. prefix (0, 0, 0);
  536. dc = decode_dest23 (ddd, dd, 1);
  537. BIT_OP (dc, bit, !b);
  538. /** 0000 0001 1101 sss0 ss00 0bit BNTST src */
  539. prefix (0, 0, 0);
  540. sc = decode_dest23 (sss, ss, 1);
  541. b = get_bit2 (sc, bit);
  542. set_zc (!b, !b);
  543. /** 0000 0001 1101 sss0 ss11 1bit BNXOR src */
  544. prefix (0, 0, 0);
  545. sc = decode_src23 (sss, ss, 1);
  546. BIT_OPC (sc, bit, !b ^ carry);
  547. /** 0000 0001 1101 sss0 ss10 0bit BOR src */
  548. prefix (0, 0, 0);
  549. sc = decode_src23 (sss, ss, 1);
  550. BIT_OPC (sc, bit, b | carry);
  551. /** 0000 0000 BRK */
  552. /* We report the break to our caller with the PC still pointing at the
  553. breakpoint instruction. */
  554. put_reg (pc, m32c_opcode_pc);
  555. if (verbose)
  556. printf("[break]\n");
  557. if (in_gdb || (regs.r_intbl == 0 && regs.r_intbh == 0))
  558. return M32C_MAKE_HIT_BREAK ();
  559. if (mem_get_qi (0xFFFFE7) == 0xff)
  560. trigger_based_interrupt (0);
  561. else
  562. trigger_fixed_interrupt (0xFFFFE4);
  563. /** 1111 1110 GBRK */
  564. /* This alternate break, which is not part of the chip's opcode set,
  565. is here in case you need to debug a program that itself uses the
  566. chip's BRK opcode. You'll need to modify your copy of GDB to use
  567. this opcode instead of the real BRK. */
  568. /* GDB Break. */
  569. /* We report the break to our caller with the PC still pointing at the
  570. breakpoint instruction. */
  571. put_reg (pc, m32c_opcode_pc);
  572. if (verbose)
  573. printf("[gdb break]\n");
  574. return M32C_MAKE_HIT_BREAK ();
  575. /** 0000 1000 BRK2 */
  576. if (verbose)
  577. printf("[break2]\n");
  578. if (in_gdb)
  579. return M32C_MAKE_HIT_BREAK ();
  580. if (mem_get_qi (0xFFFFE7) == 0xff)
  581. trigger_based_interrupt (0);
  582. else
  583. trigger_fixed_interrupt (0xFFFFE4);
  584. /** 1101 ddd0 dd11 1bit BSET dest */
  585. dc = decode_dest23 (ddd, dd, 1);
  586. BIT_OP (dc, bit, 1);
  587. /** 1101 sss0 ss00 0bit BTST:G src */
  588. prefix (0, 0, 0);
  589. sc = decode_src23 (sss, ss, 1);
  590. b = get_bit2 (sc, bit);
  591. set_zc (!b, b);
  592. /** 00bb 101b BTST:S src */
  593. sc = decode_src23 (3, 3, 1); /* bit,base:19 */
  594. b = get_bit2 (sc, bb*2 + b);
  595. set_zc (!b, b);
  596. /** 1101 ddd0 dd10 0bit BTSTC dest */
  597. prefix (0, 0, 0);
  598. sc = decode_dest23 (ddd, dd, 1);
  599. b = get_bit2 (sc, bit);
  600. set_zc (!b, b);
  601. put_bit2 (sc, bit, 0);
  602. /** 1101 ddd0 dd10 1bit BTSTS dest */
  603. prefix (0, 0, 0);
  604. sc = decode_dest23 (ddd, dd, 1);
  605. b = get_bit2 (sc, bit);
  606. set_zc (!b, b);
  607. put_bit2 (sc, bit, 1);
  608. /** 0000 0001 1101 sss0 ss10 1bit BXOR src */
  609. prefix (0, 0, 0);
  610. sc = decode_src23 (sss, ss, 1);
  611. BIT_OPC (sc, bit, b ^ carry);
  612. /** 0000 0001 1000 ddd w dd11 1110 CLIP.size #IMM1,#IMM2,dest */
  613. prefix (0, 0, 0);
  614. dc = decode_dest23 (ddd, dd, w+1);
  615. a = sign_ext (IMM(w+1), w*8+8);
  616. b = sign_ext (IMM(w+1), w*8+8);
  617. v = sign_ext (get_src (dc), w*8+8);
  618. tprintf("clip %d <= %d <= %d : ", a, v, b);
  619. if (a > v)
  620. v = a;
  621. if (v > b)
  622. v = b;
  623. tprintf("%d\n", v);
  624. put_dest (dc, v);
  625. /** 1001 ddd w dd10 1110 CMP.size:G #IMM,dest */
  626. prefix (0, 1, 0);
  627. dc = decode_dest23 (ddd, dd, w+1);
  628. v = get_src (dc);
  629. imm = IMM(w+1);
  630. cmp (v, imm, w+1);
  631. /** 1010 ddd0 dd11 0001 CMP.L:G #IMM32,dest */
  632. prefix (0, 1, 0);
  633. dc = decode_dest23 (ddd, dd, 4);
  634. v = get_src (dc);
  635. imm = IMM(4);
  636. cmp (v, imm, 4);
  637. /** 1110 ddd w dd01 immm CMP.size:Q #IMM,dest */
  638. prefix (0, 1, 0);
  639. dc = decode_dest23 (ddd, dd, w+1);
  640. v = get_src (dc);
  641. immm = sign_ext (immm, 4);
  642. cmp (v, immm, w+1);
  643. /** 01dd 011w CMP.size:S #IMM,dest */
  644. prefix (0, 1, 0);
  645. dc = decode_dest2 (dd, w+1);
  646. v = get_src (dc);
  647. imm = sign_ext (IMM(w+1),w*8+8);
  648. cmp (v, imm, w+1);
  649. /** 1sss ddd w dd ss 0110 CMP.size:G src,dest */
  650. prefix (1, 1, 0);
  651. sc = decode_src23 (sss, ss, w+1);
  652. dc = decode_dest23 (ddd, dd, w+1);
  653. a = get_src (dc);
  654. b = get_src (sc);
  655. cmp (a, b, w+1);
  656. /** 1sss ddd1 dd ss 0001 CMP.L:G src,dest */
  657. prefix (1, 1, 0);
  658. sc = decode_src23 (sss, ss, 4);
  659. dc = decode_dest23 (ddd, dd, 4);
  660. a = get_src (dc);
  661. b = get_src (sc);
  662. cmp (a, b, 4);
  663. /** 01dd 000w CMP.size:S src,R0/R0L */
  664. prefix (0, 1, 0);
  665. dc = decode_dest2 (dd, w+1);
  666. a = get_reg (w ? r0 : r0l);
  667. b = get_src (dc);
  668. cmp (a, b, w+1);
  669. /** 1010 ddd0 dd01 0001 CMPX #IMM,dest */
  670. prefix (0, 1, 0);
  671. dc = decode_dest23 (ddd, dd, 4);
  672. v = get_src (dc);
  673. imm = sign_ext (IMM(1), 8);
  674. cmp (v, imm, 4);
  675. /** 0000 0001 1000 ddd w dd00 1110 DADC.size #IMM,dest */
  676. DADDI(1,1);
  677. /** 0000 0001 1sss ddd w dd ss 1000 DADC.size src,dest */
  678. DADDV(1,1);
  679. /** 0000 0001 1000 ddd w dd01 1110 DADD.size #IMM,dest */
  680. DADDI(1,0);
  681. /** 0000 0001 1sss ddd w dd ss 0000 DADD.size src,dest */
  682. DADDV(1,0);
  683. /** 1011 ddd w dd00 1110 DEC.size dest */
  684. prefix (0, 1, 0);
  685. dc = decode_dest23 (ddd, dd, w+1);
  686. a = get_src (dc);
  687. v = a-1;
  688. tprintf ("%x -- = %x\n", a, v);
  689. set_sz (v, w+1);
  690. put_dest (dc, v);
  691. /** 1011 0000 010w 0011 DIV.size #IMM */
  692. prefix (0, 0, 0);
  693. div_op (-1, 0, 0, 0, w+1);
  694. /** 1000 sss w ss01 1110 DIV.size src */
  695. prefix (0, 1, 0);
  696. div_op (sss, ss, 0, 0, w+1);
  697. /** 0000 0001 1010 sss1 ss01 1111 DIV.L src */
  698. M32C_ONLY();
  699. prefix (0, 0, 0);
  700. div_op (sss, ss, 0, 0, 4);
  701. /** 1011 0000 000w 0011 DIVU.size #IMM */
  702. prefix (0, 0, 0);
  703. div_op (-1, 0, 1, 0, w+1);
  704. /** 1000 sss w ss00 1110 DIVU.size src */
  705. prefix (0, 1, 0);
  706. div_op (sss, ss, 1, 0, w+1);
  707. /** 0000 0001 1010 sss1 ss00 1111 DIVU.L src */
  708. M32C_ONLY();
  709. prefix (0, 0, 0);
  710. div_op (sss, ss, 1, 0, 4);
  711. /** 1011 0010 010w 0011 DIVX.size #IMM */
  712. prefix (0, 0, 0);
  713. div_op (-1, 0, 0, 1, w+1);
  714. /** 1001 sss w ss01 1110 DIVX.size src */
  715. prefix (0, 1, 0);
  716. div_op (sss, ss, 0, 1, w+1);
  717. /** 0000 0001 1010 sss1 ss10 1111 DIVX.L src */
  718. M32C_ONLY();
  719. prefix (0, 0, 0);
  720. div_op (sss, ss, 0, 1, 4);
  721. /** 0000 0001 1001 ddd w dd00 1110 DSBB.size #IMM,dest */
  722. DADDI(0,1);
  723. /** 0000 0001 1sss ddd w dd ss 1010 DSBB.size src,dest */
  724. DADDV(0,1);
  725. /** 0000 0001 1001 ddd w dd01 1110 DSUB.size #IMM,dest */
  726. DADDI(0,0);
  727. /** 0000 0001 1sss ddd w dd ss 0010 DSUB.size src,dest */
  728. DADDV(0,0);
  729. /** 1110 1100 ENTER #IMM */
  730. imm = IMM(1);
  731. put_reg (sp, get_reg (sp) - 4);
  732. mem_put_si (get_reg (sp), get_reg (fb));
  733. put_reg (fb, get_reg (sp));
  734. put_reg (sp, get_reg (sp) - imm);
  735. /** 1111 1100 EXITD */
  736. put_reg (sp, get_reg (fb));
  737. put_reg (fb, mem_get_si (get_reg (sp)));
  738. put_reg (sp, get_reg (sp) + 4);
  739. put_reg (pc, mem_get_si (get_reg (sp)));
  740. put_reg (sp, get_reg (sp) + 4);
  741. /** 1100 ddd w dd01 1110 EXTS.size dest */
  742. prefix (0, 0, 0);
  743. dc = decode_dest23 (ddd, dd, w+1);
  744. v = sign_ext (get_src (dc), (w+1)*8);
  745. dc = widen_sd (dc);
  746. put_dest (dc, v);
  747. set_sz (v, (w+1)*2);
  748. /** 0000 0001 1sss ddd0 dd ss 0111 EXTS.B src,dest */
  749. prefix (0, 0, 0);
  750. sc = decode_src23 (sss, ss, 1);
  751. dc = decode_dest23 (ddd, dd, 2);
  752. v = sign_ext (get_src (sc), 8);
  753. put_dest (dc, v);
  754. set_sz (v, 16);
  755. /** 0000 0001 1sss ddd0 dd ss 1011 EXTZ src,dest */
  756. prefix (0, 0, 0);
  757. sc = decode_src23 (sss, ss, 1);
  758. dc = decode_dest23 (ddd, dd, 2);
  759. v = get_src (sc);
  760. put_dest (dc, v);
  761. set_sz (v, 16);
  762. /** 1101 0011 1110 1dst FCLR dest */
  763. set_flags (1 << dst, 0);
  764. /** 1001 1111 FREIT */
  765. NOTYET();
  766. /** 1101 0001 1110 1dst FSET dest */
  767. set_flags (1 << dst, 1 << dst);
  768. /** 1010 ddd w dd00 1110 INC.size dest */
  769. prefix (0, 1, 0);
  770. dc = decode_dest23 (ddd, dd, w+1);
  771. a = get_src (dc);
  772. v = a+1;
  773. tprintf ("%x ++ = %x\n", a, v);
  774. set_sz (v, w+1);
  775. put_dest (dc, v);
  776. /** 1000 sss0 ss0w 0011 INDEXB.size src */
  777. INDEXOP(1, 1, 1);
  778. /** 1010 sss0 ss0w 0011 INDEXBD.size src */
  779. INDEXOP(1, 0, 1);
  780. /** 1100 sss0 ss0w 0011 INDEXBS.size src */
  781. INDEXOP(1, 1, 0);
  782. /** 1001 sss0 ss1w 0011 INDEXL.size src */
  783. INDEXOP(4, 1, 1);
  784. /** 1011 sss0 ss1w 0011 INDEXLD.size src */
  785. INDEXOP(4, 0, 1);
  786. /** 1001 sss0 ss0w 0011 INDEXLS.size src */
  787. INDEXOP(4, 1, 0);
  788. /** 1000 sss0 ss1w 0011 INDEXW.size src */
  789. INDEXOP(2, 1, 1);
  790. /** 1010 sss0 ss1w 0011 INDEXWD.size src */
  791. INDEXOP(2, 0, 1);
  792. /** 1100 sss0 ss1w 0011 INDEXWS.size src */
  793. INDEXOP(2, 1, 0);
  794. /** 1011 1110 vector00 INT #IMM */
  795. prefix (0, 0, 0);
  796. trigger_based_interrupt (vector);
  797. /** 1011 1111 INTO */
  798. prefix (0, 0, 0);
  799. if (FLAG_O)
  800. trigger_fixed_interrupt (0xffffe0);
  801. /** 1ccc 101c Jcnd label */
  802. prefix (0, 0, 0);
  803. v = sign_ext (IMM(1), 8);
  804. if (condition_true (ccc*2+c))
  805. put_reg (pc, m32c_opcode_pc + 1 + v);
  806. /** 01dd 101d JMP.S label */
  807. prefix (0, 0, 0);
  808. put_reg (pc, m32c_opcode_pc + (dd*2+d) + 2);
  809. /** 1011 1011 JMP.B label */
  810. prefix (0, 0, 0);
  811. imm = sign_ext (IMM(1), 8);
  812. if (imm == -1)
  813. {
  814. if (verbose)
  815. printf("[jmp-to-self detected as exit]\n");
  816. return M32C_MAKE_HIT_BREAK ();
  817. }
  818. put_reg (pc, m32c_opcode_pc + 1 + imm);
  819. /** 1100 1110 JMP.W label */
  820. prefix (0, 0, 0);
  821. imm = sign_ext (IMM(2), 16);
  822. put_reg (pc, m32c_opcode_pc + 1 + imm);
  823. /** 1100 1100 JMP.A label */
  824. prefix (0, 0, 0);
  825. imm = IMM(3);
  826. put_reg (pc, imm);
  827. /** 1100 sss1 ss00 1111 JMPI.W src */
  828. prefix (0, 0, 0);
  829. sc = decode_src23 (sss, ss, 2);
  830. a = get_src (sc);
  831. a = sign_ext (a, 16);
  832. put_reg (pc, m32c_opcode_pc + a);
  833. /** 1000 sss0 ss00 0001 JMPI.A src */
  834. prefix (0, 0, 0);
  835. sc = decode_src23 (sss, ss, 3);
  836. a = get_src (sc);
  837. put_reg (pc, a);
  838. /** 1101 1100 JMPS #IMM8 */
  839. prefix (0, 0, 0);
  840. imm = IMM(1);
  841. a = 0xff0000 + mem_get_hi (0xfffe00 - imm * 2);
  842. put_reg (pc, a);
  843. /** 1100 1111 JSR.W label */
  844. prefix (0, 0, 0);
  845. imm = sign_ext (IMM(2), 16);
  846. put_reg (sp, get_reg (sp) - 4);
  847. mem_put_si (get_reg (sp), get_reg (pc));
  848. put_reg (pc, m32c_opcode_pc + imm + 1);
  849. /** 1100 1101 JSR.A label */
  850. prefix (0, 0, 0);
  851. imm = IMM(3);
  852. put_reg (sp, get_reg (sp) - 4);
  853. mem_put_si (get_reg (sp), get_reg (pc));
  854. put_reg (pc, imm);
  855. /** 1100 sss1 ss01 1111 JSRI.W src */
  856. prefix (0, 0, 0);
  857. sc = decode_src23 (sss, ss, 2);
  858. a = get_src (sc);
  859. a = sign_ext (a, 16);
  860. put_reg (sp, get_reg (sp) - 4);
  861. mem_put_si (get_reg (sp), get_reg (pc));
  862. put_reg (pc, m32c_opcode_pc + a);
  863. /** 1001 sss0 ss00 0001 JSRI.A src */
  864. prefix (0, 0, 0);
  865. sc = decode_src23 (sss, ss, 3);
  866. a = get_src (sc);
  867. put_reg (sp, get_reg (sp) - 4);
  868. mem_put_si (get_reg (sp), get_reg (pc));
  869. put_reg (pc, a);
  870. /** 1101 1101 JSRS #IMM8 */
  871. prefix (0, 0, 0);
  872. imm = IMM(1);
  873. a = 0xff0000 + mem_get_hi (0xfffe00 - imm * 2);
  874. put_reg (sp, get_reg (sp) - 4);
  875. mem_put_si (get_reg (sp), get_reg (pc));
  876. put_reg (pc, a);
  877. /** 1101 0101 1010 1dst LDC #IMM16,dest */
  878. imm = IMM(2);
  879. dc = decode_cr_b (dst, CR_B_DCT0);
  880. put_dest (dc, imm);
  881. /** 1101 0101 0010 1dst LDC #IMM24,dest */
  882. imm = IMM(3);
  883. dc = decode_cr_b (dst, CR_B_INTB);
  884. put_dest (dc, imm);
  885. /** 1101 0101 0110 1dst LDC #IMM24,dest */
  886. imm = IMM(3);
  887. dc = decode_cr_b (dst, CR_B_DMA0);
  888. put_dest (dc, imm);
  889. /** 0000 0001 1101 sss1 ss00 1dst LDC src,dest */
  890. prefix (0, 0, 0);
  891. sc = decode_src23 (sss, ss, 2);
  892. dc = decode_cr_b (dst, CR_B_DCT0);
  893. a = get_src (sc);
  894. put_dest (dc, a);
  895. /** 1101 sss1 ss00 0dst LDC src,dest */
  896. prefix (0, 0, 0);
  897. sc = decode_src23 (sss, ss, 3);
  898. dc = decode_cr_b (dst, CR_B_INTB);
  899. a = get_src (sc);
  900. put_dest (dc, a);
  901. /** 0000 0001 1101 sss1 ss00 0dst LDC src,dest */
  902. prefix (0, 0, 0);
  903. sc = decode_src23 (sss, ss, 3);
  904. dc = decode_cr_b (dst, CR_B_DMA0);
  905. a = get_src (sc);
  906. put_dest (dc, a);
  907. /** 1011 0110 1100 0011 LDCTX */
  908. NOTYET();
  909. /** 1101 0101 1110 1imm LDIPL #IMM */
  910. set_flags (0x7000, imm*0x1000);
  911. /** 0000 0001 1000 ddd w dd11 1111 MAX.size #IMM,dest */
  912. prefix (0, 0, 0);
  913. w++;
  914. dc = decode_dest23 (ddd, dd, w);
  915. imm = sign_ext (IMM(w), w*8);
  916. a = sign_ext (get_src (dc), w*8);
  917. tprintf ("max %d %d\n", imm, a);
  918. if (imm > a)
  919. put_dest (dc, imm);
  920. /** 0000 0001 1sss ddd w dd ss 1101 MAX.size src,dest */
  921. prefix (0, 0, 0);
  922. w++;
  923. sc = decode_src23 (sss, ss, w);
  924. dc = decode_dest23 (ddd, dd, w);
  925. b = sign_ext (get_src (sc), w*8);
  926. a = sign_ext (get_src (dc), w*8);
  927. tprintf ("max %d %d\n", b, a);
  928. if (b > a)
  929. put_dest (dc, b);
  930. /** 0000 0001 1000 ddd w dd10 1111 MIN.size #IMM,dest */
  931. prefix (0, 0, 0);
  932. w++;
  933. dc = decode_dest23 (ddd, dd, w);
  934. imm = sign_ext (IMM(w), w*8);
  935. a = sign_ext (get_src (dc), w*8);
  936. tprintf ("min %d %d\n", imm, a);
  937. if (imm < a)
  938. put_dest (dc, imm);
  939. /** 0000 0001 1sss ddd w dd ss 1100 MIN.size src,dest */
  940. prefix (0, 0, 0);
  941. w++;
  942. sc = decode_src23 (sss, ss, w);
  943. dc = decode_dest23 (ddd, dd, w);
  944. b = sign_ext (get_src (sc), w*8);
  945. a = sign_ext (get_src (dc), w*8);
  946. tprintf ("min %d %d\n", b, a);
  947. if (b < a)
  948. put_dest (dc, b);
  949. /** 1001 ddd w dd10 1111 MOV.size:G #IMM,dest */
  950. dc = decode_dest23 (ddd, dd, w+1);
  951. imm = IMM(w+1);
  952. v = imm;
  953. tprintf("%x = %x\n", v, v);
  954. set_sz(v, w+1);
  955. put_dest (dc, v);
  956. /** 1011 ddd0 dd11 0001 MOV.L:G #IMM,dest */
  957. dc = decode_dest23 (ddd, dd, 4);
  958. imm = IMM(4);
  959. v = imm;
  960. tprintf("%x = %x\n", v, v);
  961. set_sz(v, 4);
  962. put_dest (dc, v);
  963. /** 1111 ddd w dd10 immm MOV.size:Q #IMM4,dest */
  964. dc = decode_dest23 (ddd, dd, w+1);
  965. imm = sign_ext (immm, 4);
  966. v = imm;
  967. tprintf("%x = %d\n", v, v);
  968. set_sz(v, w+1);
  969. put_dest (dc, v);
  970. /** 00dd 010w MOV.size:S #IMM,dest */
  971. prefix (0, 1, 0);
  972. dc = decode_dest2 (dd, w+1);
  973. imm = IMM(w+1);
  974. put_dest (dc, imm);
  975. set_sz (imm, w+1);
  976. /** 10w1 110d MOV.size:S #IMM,a0/a1 */
  977. imm = IMM(w ? 3 : 2);
  978. put_reg (d ? a1 : a0, imm);
  979. set_sz (imm & addr_mask, w+1);
  980. /** 00dd 001w MOV.size:Z #0,dest */
  981. prefix (0, 1, 0);
  982. dc = decode_dest2 (dd, w+1);
  983. put_dest (dc, 0);
  984. set_sz (0, w+1);
  985. /** 1sss ddd w dd ss 1011 MOV.size:G src,dest */
  986. prefix (1, 1, 0);
  987. sc = decode_src23 (sss, ss, w+1);
  988. dc = decode_dest23 (ddd, dd, w+1);
  989. v = get_src (sc);
  990. put_dest (dc, v);
  991. set_sz (v, w+1);
  992. /** 1sss ddd1 dd ss 0011 MOV.L:G src,dest */
  993. prefix (1, 1, 0);
  994. sc = decode_src23 (sss, ss, 4);
  995. dc = decode_dest23 (ddd, dd, 4);
  996. v = get_src (sc);
  997. put_dest (dc, v);
  998. set_sz (v, 4);
  999. /** VARY SS 01 10 11 */
  1000. /** 00SS 100w MOV.size:S src,R0L/R0 */
  1001. prefix (0, 1, 0);
  1002. sc = decode_dest2 (SS, w+1);
  1003. v = get_src (sc);
  1004. put_reg (w ? r0 : r0l, v);
  1005. set_sz (v, w+1);
  1006. /** 01ss 111w MOV.size:S src,R1L/R1 */
  1007. prefix (0, 1, 0);
  1008. sc = decode_dest2 (ss, w+1);
  1009. v = get_src (sc);
  1010. put_reg (w ? r1 : r1l, v);
  1011. set_sz (v, w+1);
  1012. /** VARY DD 01 10 11 */
  1013. /** 00DD 000w MOV.size:S R0L/R0,dest */
  1014. prefix (0, 1, 0);
  1015. dc = decode_dest2 (DD, w+1);
  1016. v = get_reg (w ? r0 : r0l);
  1017. put_dest (dc, v);
  1018. set_sz (v, w+1);
  1019. /** 01ss 100d MOV.L:S src,A0/A1 */
  1020. prefix (0, 1, 0);
  1021. sc = decode_dest2 (ss, 4);
  1022. v = get_src (sc);
  1023. put_reg (d ? a1 : a0, v);
  1024. set_sz (v, 4);
  1025. /** 1011 ddd w dd00 1111 MOV.size:G dsp:8[SP], dest */
  1026. prefix (0, 0, 0);
  1027. imm = IMM(1);
  1028. dc = decode_dest23 (ddd, dd, w+1);
  1029. a = get_reg (sp) + sign_ext (imm, 8);
  1030. a &= addr_mask;
  1031. if (w)
  1032. v = mem_get_hi (a);
  1033. else
  1034. v = mem_get_qi (a);
  1035. put_dest (dc, v);
  1036. set_sz (v, w+1);
  1037. /** 1010 sss w ss00 1111 MOV.size:G src,dsp:8[SP] */
  1038. prefix (0, 0, 0);
  1039. sc = decode_dest23 (sss, ss, w+1);
  1040. imm = IMM(1);
  1041. a = get_reg (sp) + sign_ext (imm, 8);
  1042. a &= addr_mask;
  1043. v = get_src (sc);
  1044. if (w)
  1045. mem_put_hi (a, v);
  1046. else
  1047. mem_put_qi (a, v);
  1048. set_sz (v, w+1);
  1049. /** 1101 sss1 ss01 1dst MOVA src,dest */
  1050. static reg_id map[8] = { r2r0, r3r1, a0, a1 };
  1051. prefix (0, 0, 0);
  1052. sc = decode_src23 (sss, ss, 1);
  1053. if (!sc.mem || !map[dst])
  1054. UNSUPPORTED();
  1055. put_reg (map[dst], sc.u.addr);
  1056. /** 0000 0001 1011 ddd0 dd hl 1110 MOVdir R0L,dest */
  1057. prefix (0, 0, 0);
  1058. dc = decode_dest23 (ddd, dd, 1);
  1059. a = get_src (dc);
  1060. b = get_reg (r0l);
  1061. switch (hl)
  1062. {
  1063. case 0: a = (a & 0xf0) | (b & 0x0f); break;
  1064. case 1: a = (a & 0xf0) | ((b>>4) & 0x0f); break;
  1065. case 2: a = (a & 0x0f) | ((b & 0x0f)<<4); break;
  1066. case 3: a = (a & 0x0f) | (b & 0xf0); break;
  1067. }
  1068. put_dest (dc, a);
  1069. /** 0000 0001 1010 sss0 ss hl 1110 MOVdir src,R0L */
  1070. prefix (0, 0, 0);
  1071. sc = decode_dest23 (sss, ss, 1);
  1072. a = get_reg (r0l);
  1073. b = get_src (dc);
  1074. switch (hl)
  1075. {
  1076. case 0: a = (a & 0xf0) | (b & 0x0f); break;
  1077. case 1: a = (a & 0xf0) | ((b>>4) & 0x0f); break;
  1078. case 2: a = (a & 0x0f) | ((b & 0x0f)<<4); break;
  1079. case 3: a = (a & 0x0f) | (b & 0xf0); break;
  1080. }
  1081. put_reg (r0l, a);
  1082. /** 1011 ddd0 dd01 0001 MOVX #IMM,dest */
  1083. prefix (0, 1, 0);
  1084. dc = decode_dest23 (ddd, dd, 4);
  1085. imm = sign_ext (IMM(1), 8);
  1086. put_dest (dc, imm);
  1087. set_sz (imm, 1);
  1088. /** 1000 ddd w dd01 1111 MUL.size #IMM,dest */
  1089. prefix (0, 1, 0);
  1090. w ++;
  1091. dc = decode_dest23 (ddd, dd, w);
  1092. v = sign_ext (get_src (dc), w*8);
  1093. imm = sign_ext (IMM(w), w*8);
  1094. tprintf("%d * %d = %d\n", v, imm, v*imm);
  1095. v *= imm;
  1096. dc = widen_sd (dc);
  1097. put_dest (dc, v);
  1098. /** 1sss ddd w dd ss 1100 MUL.size src,dest */
  1099. prefix (1, 1, 0);
  1100. w ++;
  1101. sc = decode_src23 (sss, ss, w);
  1102. dc = decode_dest23 (ddd, dd, w);
  1103. a = sign_ext (get_src (sc), w*8);
  1104. b = sign_ext (get_src (dc), w*8);
  1105. tprintf("%d * %d = %d\n", a, b, a*b);
  1106. v = a * b;
  1107. dc = widen_sd (dc);
  1108. put_dest (dc, v);
  1109. /** 0000 0001 1000 sss1 ss01 1111 MUL.L src,R2R0 */
  1110. M32C_ONLY();
  1111. prefix (0, 0, 0);
  1112. sc = decode_src23 (sss, ss, 4);
  1113. a = sign_ext (get_src (sc), 32);
  1114. b = sign_ext (get_reg (r2r0), 32);
  1115. ll = (long long)a * (long long)b;
  1116. tprintf("%d * %d = %lld (%llx)\n", a, b, ll, ll);
  1117. if (ll < b2minsigned[4] || ll > b2maxsigned[4])
  1118. set_flags (FLAGBIT_O, FLAGBIT_O);
  1119. else
  1120. set_flags (FLAGBIT_O, 0);
  1121. put_reg (r2r0, (int)ll);
  1122. /** 1100 sss1 ss11 1110 MULEX src */
  1123. prefix (0, 1, 0);
  1124. sc = decode_dest23 (sss, ss, 2);
  1125. a = sign_ext (get_src (sc), 16);
  1126. b = sign_ext (get_reg (r2r0), 32);
  1127. ll = (long long)a * (long long)b;
  1128. tprintf("%d * %d = %lld (%llx)\n", a, b, ll, ll);
  1129. put_reg (r2r0, (int)ll);
  1130. put_reg (r1, (int)(ll >> 32));
  1131. /** 1000 ddd w dd00 1111 MULU.size #IMM,dest */
  1132. prefix (0, 1, 0);
  1133. w ++;
  1134. dc = decode_dest23 (ddd, dd, w);
  1135. v = get_src (dc);
  1136. imm = IMM(w);
  1137. tprintf("%d * %d = %d\n", v, imm, v*imm);
  1138. v *= imm;
  1139. dc = widen_sd (dc);
  1140. put_dest (dc, v);
  1141. /** 1sss ddd w dd ss 0100 MULU.size src,dest */
  1142. prefix (1, 1, 0);
  1143. w ++;
  1144. sc = decode_src23 (sss, ss, w);
  1145. dc = decode_dest23 (ddd, dd, w);
  1146. a = get_src (sc);
  1147. b = get_src (dc);
  1148. tprintf("%d * %d = %d\n", a, b, a*b);
  1149. v = a * b;
  1150. dc = widen_sd (dc);
  1151. put_dest (dc, v);
  1152. /** 0000 0001 1000 sss1 ss00 1111 MULU.L src,R2R0 */
  1153. M32C_ONLY();
  1154. prefix (0, 0, 0);
  1155. sc = decode_src23 (sss, ss, 4);
  1156. a = get_src (sc);
  1157. b = get_reg (r2r0);
  1158. ll = (long long)a * (long long)b;
  1159. tprintf("%d * %d = %lld (%llx)\n", a, b, ll, ll);
  1160. if (ll < b2minsigned[4] || ll > b2maxsigned[4])
  1161. set_flags (FLAGBIT_O, FLAGBIT_O);
  1162. else
  1163. set_flags (FLAGBIT_O, 0);
  1164. put_reg (r2r0, (int)ll);
  1165. /** 1010 ddd w dd10 1111 NEG.size dest */
  1166. prefix (0, 1, 0);
  1167. dc = decode_dest23 (ddd, dd, w+1);
  1168. a = sign_ext (get_src (dc), (w+1)*8);
  1169. v = -a;
  1170. tprintf("%d * -1 = %d\n", a, v);
  1171. set_oszc(v, w+1, v==0);
  1172. put_dest (dc, v);
  1173. /** 1101 1110 NOP */
  1174. tprintf("nop\n");
  1175. /** 1010 ddd w dd01 1110 NOT.size dest */
  1176. prefix (0, 1, 0);
  1177. dc = decode_dest23 (ddd, dd, w+1);
  1178. a = get_src (dc);
  1179. v = ~a;
  1180. tprintf("~ %x = %x\n", a, v);
  1181. set_sz(v, w+1);
  1182. put_dest (dc, v);
  1183. /** 1000 ddd w dd10 1111 OR.size:G #IMM,dest */
  1184. prefix (0, 1, 0);
  1185. dc = decode_dest23(ddd, dd, w+1);
  1186. imm = IMM(w+1);
  1187. LOGIC_OP (dc, imm, |);
  1188. /** 01dd 010w OR.size:S #IMM,dest */
  1189. prefix (0, 1, 0);
  1190. dc = decode_dest2(dd, w+1);
  1191. imm = IMM (w+1);
  1192. LOGIC_OP (dc, imm, |);
  1193. /** 1sss ddd w dd ss 0101 OR.size:G src,dest */
  1194. prefix (1, 1, 0);
  1195. sc = decode_src23(sss, ss, w+1);
  1196. dc = decode_dest23(ddd, dd, w+1);
  1197. b = get_src (sc);
  1198. LOGIC_OP (dc, b, |);
  1199. /** 1011 ddd w dd10 1111 POP.size dest */
  1200. prefix (0, 1, 0);
  1201. dc = decode_dest23 (ddd, dd, w+1);
  1202. if (w)
  1203. a = mem_get_hi (get_reg (sp));
  1204. else
  1205. a = mem_get_qi (get_reg (sp));
  1206. put_reg (sp, get_reg (sp) + 2);
  1207. tprintf("pop%s: %x\n", w ? "hi" : "qi", a);
  1208. put_dest (dc, a);
  1209. /** 1101 0011 1010 1dst POPC dest */
  1210. prefix (0, 0, 0);
  1211. dc = decode_cr_b (dst, CR_B_DCT0);
  1212. a = mem_get_hi (get_reg (sp));
  1213. put_reg (sp, get_reg (sp) + 2);
  1214. tprintf("pophi: %x\n", a);
  1215. put_dest (dc, a);
  1216. /** 1101 0011 0010 1dst POPC dest */
  1217. prefix (0, 0, 0);
  1218. dc = decode_cr_b (dst, CR_B_INTB);
  1219. a = mem_get_si (get_reg (sp));
  1220. put_reg (sp, get_reg (sp) + 4);
  1221. tprintf("popsi: %x\n", a);
  1222. put_dest (dc, a);
  1223. /** 1000 1110 POPM dest */
  1224. static int map[] = { r0, r1, r2, r3, a0, a1, sb, fb };
  1225. prefix (0, 0, 0);
  1226. imm = IMM(1);
  1227. tprintf("popm: %x\n", imm);
  1228. for (a=0; a<4; a++)
  1229. if (imm & (1<<a))
  1230. {
  1231. v = mem_get_hi (get_reg (sp));
  1232. put_reg (map[a], v);
  1233. put_reg (sp, get_reg (sp) + 2);
  1234. }
  1235. for (; a<8; a++)
  1236. if (imm & (1<<a))
  1237. {
  1238. v = mem_get_si (get_reg (sp));
  1239. put_reg (map[a], v);
  1240. put_reg (sp, get_reg (sp) + 4);
  1241. }
  1242. /** 1010 111w PUSH.size #IMM */
  1243. prefix (0, 0, 0);
  1244. imm = IMM(w+1);
  1245. tprintf("push%s: %x\n", w ? "hi" : "qi", imm);
  1246. int a = get_reg (sp) - 2;
  1247. if (w)
  1248. mem_put_hi (a, imm);
  1249. else
  1250. mem_put_qi (a, imm);
  1251. put_reg (sp, a);
  1252. /** 1100 sss w ss00 1110 PUSH.size src */
  1253. prefix (0, 1, 0);
  1254. sc = decode_dest23 (sss, ss, w+1);
  1255. a = get_src (sc);
  1256. put_reg (sp, get_reg (sp) - 2);
  1257. if (w)
  1258. mem_put_hi (get_reg (sp), a);
  1259. else
  1260. mem_put_qi (get_reg (sp), a);
  1261. tprintf("push%s: %x\n", w ? "hi" : "qi", a);
  1262. /** 1011 0110 0101 0011 PUSH.L #IMM32 */
  1263. imm = IMM(4);
  1264. put_reg (sp, get_reg (sp) - 4);
  1265. mem_put_si (get_reg (sp), imm);
  1266. /** 1010 sss0 ss00 0001 PUSH.L src */
  1267. prefix (0, 1, 0);
  1268. sc = decode_dest23 (sss, ss, 4);
  1269. a = get_src (sc);
  1270. put_reg (sp, get_reg (sp) - 4);
  1271. mem_put_si (get_reg (sp), a);
  1272. /** 1011 0sa0 ss00 0001 PUSHA src */
  1273. prefix (0, 0, 0);
  1274. sc = decode_dest23 (sa, ss, 1);
  1275. put_reg (sp, get_reg (sp) - 4);
  1276. mem_put_hi (get_reg (sp), sc.u.addr);
  1277. tprintf("pushsi: %x\n", sc.u.addr);
  1278. /** 1101 0001 1010 1src PUSHC src */
  1279. prefix (0, 0, 0);
  1280. sc = decode_cr_b (src, CR_B_DCT0);
  1281. a = get_src (sc);
  1282. put_reg (sp, get_reg (sp) - 2);
  1283. mem_put_hi (get_reg (sp), a);
  1284. tprintf("pushhi: %x\n", a);
  1285. /** 1101 0001 0010 1src PUSHC src */
  1286. prefix (0, 0, 0);
  1287. sc = decode_cr_b (src, CR_B_INTB);
  1288. a = get_src (sc);
  1289. put_reg (sp, get_reg (sp) - 4);
  1290. mem_put_si (get_reg (sp), a);
  1291. tprintf("pushsi: %x\n", a);
  1292. /** 1000 1111 PUSHM src */
  1293. static int map[] = { fb, sb, a1, a0, r3, r2, r1, r0 };
  1294. imm = IMM(1);
  1295. tprintf("pushm: %x\n", imm);
  1296. for (a=0; a<4; a++)
  1297. if (imm & (1<<a))
  1298. {
  1299. put_reg (sp, get_reg (sp) - 4);
  1300. v = get_reg (map[a]);
  1301. mem_put_si (get_reg (sp), v);
  1302. }
  1303. for (; a<8; a++)
  1304. if (imm & (1<<a))
  1305. {
  1306. put_reg (sp, get_reg (sp) - 2);
  1307. v = get_reg (map[a]);
  1308. mem_put_hi (get_reg (sp), v);
  1309. }
  1310. /** 1001 1110 REIT */
  1311. a = get_reg (sp);
  1312. put_reg (pc, mem_get_si (a));
  1313. a += 4;
  1314. put_reg (flags, mem_get_hi (a));
  1315. a += 2;
  1316. put_reg (sp, a);
  1317. /** 1011 1000 010w 0011 RMPA.size */
  1318. int count = get_reg (r3);
  1319. int list1 = get_reg (a0);
  1320. int list2 = get_reg (a1);
  1321. long long sum = get_reg_ll (r3r1r2r0) & 0xffffff;
  1322. while (count)
  1323. {
  1324. if (w)
  1325. {
  1326. a = sign_ext (mem_get_hi (list1), 16);
  1327. b = sign_ext (mem_get_hi (list2), 16);
  1328. }
  1329. else
  1330. {
  1331. a = sign_ext (mem_get_qi (list1), 8);
  1332. b = sign_ext (mem_get_qi (list2), 8);
  1333. }
  1334. tprintf("%lld + %d * %d = ", sum, a, b);
  1335. sum += a * b;
  1336. tprintf("%lld\n", sum);
  1337. list1 += w ? 2 : 1;
  1338. list2 += w ? 2 : 1;
  1339. count --;
  1340. }
  1341. put_reg (r3, count);
  1342. put_reg (a0, list1);
  1343. put_reg (a1, list2);
  1344. put_reg (r2r0, (int)(sum & 0xffffffffU));
  1345. put_reg (r1, (int)(sum >> 32));
  1346. /** 1011 ddd w dd10 1110 ROLC.size dest */
  1347. prefix (0, 1, 0);
  1348. dc = decode_dest23 (ddd, dd, w+1);
  1349. rot_op (dc, 1, 1);
  1350. /** 1010 ddd w dd10 1110 RORC.size dest */
  1351. prefix (0, 1, 0);
  1352. dc = decode_dest23 (ddd, dd, w+1);
  1353. rot_op (dc, 1, -1);
  1354. /** 1110 ddd w dd10 immm ROT.size #IMM, dest */
  1355. prefix (0, 1, 0);
  1356. dc = decode_dest23 (ddd, dd, w+1);
  1357. rot_op (dc, IMM4(), -1);
  1358. /** 1010 ddd w dd11 1111 ROT.size R1H,dest */
  1359. prefix (0, 1, 0);
  1360. dc = decode_dest23 (ddd, dd, w+1);
  1361. a = sign_ext (get_reg (r1h), 8);
  1362. rot_op (dc, a, -1);
  1363. /** 1101 1111 RTS */
  1364. put_reg (pc, mem_get_si (get_reg (sp)));
  1365. put_reg (sp, get_reg (sp) + 4);
  1366. /** 0000 0001 1001 ddd w dd10 1110 SBB.size #IMM, dest */
  1367. prefix (0, 0, 0);
  1368. dc = decode_dest23 (ddd, dd, w+1);
  1369. imm = IMM (w+1);
  1370. MATH_OP (dc, imm, !carry, -);
  1371. /** 0000 0001 1sss ddd w dd ss 0110 SBB.size src,dest */
  1372. prefix (0, 0, 0);
  1373. sc = decode_src23 (sss, ss, w+1);
  1374. dc = decode_dest23 (ddd, dd, w+1);
  1375. MATH_OP (dc, get_src (sc), !carry, -);
  1376. /** 1101 ddd1 dd11 cond SCcond dest */
  1377. prefix (0, 1, 0);
  1378. dc = decode_dest23 (ddd, dd, 2);
  1379. if (condition_true (cond))
  1380. put_dest (dc, 1);
  1381. else
  1382. put_dest (dc, 0);
  1383. /** 1011 1000 110w 0011 SCMPU.size */
  1384. ta0 = get_reg (a0);
  1385. ta1 = get_reg (a1);
  1386. for (;;)
  1387. {
  1388. t0 = mem_get_qi (ta0);
  1389. t2 = mem_get_qi (ta1);
  1390. if (w)
  1391. {
  1392. t1 = mem_get_qi (ta0 + 1);
  1393. t3 = mem_get_qi (ta1 + 1);
  1394. }
  1395. dif = t0 - t2;
  1396. if (dif == 0 && t0 != 0 && w)
  1397. dif = t1 - t3;
  1398. set_oszc (dif, 1, dif > 0);
  1399. ta0 += w ? 2 : 1;
  1400. ta1 += w ? 2 : 1;
  1401. if (t0 == 0 || t0 != t2)
  1402. break;
  1403. if (w && (t1 == 0 || t1 != t3))
  1404. break;
  1405. }
  1406. /** 1111 ddd w dd00 immm SHA.size #IMM,dest */
  1407. prefix (0, 1, 0);
  1408. dc = decode_dest23 (ddd, dd, w+1);
  1409. shift_op (dc, 1, IMM4(), 1);
  1410. /** 1010 ddd0 dd10 0001 SHA.L #IMM,dest */
  1411. prefix (0, 1, 0);
  1412. dc = decode_dest23 (ddd, dd, 4);
  1413. imm = sign_ext (IMM(1), 8);
  1414. shift_op (dc, 1, imm, 1);
  1415. /** 1011 ddd w dd11 1110 SHA.size R1H,dest */
  1416. prefix (0, 1, 0);
  1417. dc = decode_dest23 (ddd, dd, w+1);
  1418. a = sign_ext (get_reg (r1h), 8);
  1419. shift_op (dc, 1, a, 1);
  1420. /** 1100 ddd0 dd01 0001 SHA.L R1H,dest */
  1421. prefix (0, 1, 0);
  1422. dc = decode_dest23 (ddd, dd, 4);
  1423. a = sign_ext (get_reg (r1h), 8);
  1424. shift_op (dc, 1, a, 1);
  1425. /** 1100 ddd0 dd10 0001 SHANC.L #IMM,dest */
  1426. M32C_ONLY();
  1427. prefix (0, 1, 0);
  1428. dc = decode_dest23 (ddd, dd, 4);
  1429. imm = sign_ext (IMM(1), 8);
  1430. shift_op (dc, 1, imm, 0);
  1431. /** 1110 ddd w dd00 immm SHL.size #IMM, dest */
  1432. prefix (0, 1, 0);
  1433. dc = decode_dest23 (ddd, dd, w+1);
  1434. shift_op (dc, 0, IMM4(), 1);
  1435. /** 1001 ddd0 dd10 0001 SHL.L #IMM, dest */
  1436. prefix (0, 1, 0);
  1437. dc = decode_dest23 (ddd, dd, 4);
  1438. imm = sign_ext (IMM(1), 8);
  1439. shift_op (dc, 0, imm, 1);
  1440. /** 1010 ddd w dd11 1110 SHL.size R1H,dest */
  1441. prefix (0, 1, 0);
  1442. dc = decode_dest23 (ddd, dd, w+1);
  1443. a = sign_ext (get_reg (r1h), 8);
  1444. shift_op (dc, 0, a, 1);
  1445. /** 1100 ddd0 dd00 0001 SHL.L R1H,dest */
  1446. prefix (0, 1, 0);
  1447. dc = decode_dest23 (ddd, dd, 4);
  1448. a = sign_ext (get_reg (r1h), 8);
  1449. shift_op (dc, 0, a, 1);
  1450. /** 1000 ddd0 dd10 0001 SHLNC.L #IMM,dest */
  1451. M32C_ONLY();
  1452. prefix (0, 1, 0);
  1453. dc = decode_dest23 (ddd, dd, 4);
  1454. imm = sign_ext (IMM(1), 8);
  1455. shift_op (dc, 0, imm, 0);
  1456. /** 1011 0010 100w 0011 SIN.size */
  1457. v = get_reg (a0);
  1458. a = get_reg (a1);
  1459. b = get_reg (r3);
  1460. if (b) for (;b;)
  1461. {
  1462. if (w)
  1463. mem_put_hi(a, mem_get_hi (v));
  1464. else
  1465. mem_put_qi(a, mem_get_qi (v));
  1466. a += w ? 2 : 1;
  1467. b --;
  1468. }
  1469. put_reg (a0, v);
  1470. put_reg (a1, a);
  1471. put_reg (r3, b);
  1472. /** 1011 0110 100w 0011 SMOVB.size */
  1473. v = get_reg (a0);
  1474. a = get_reg (a1);
  1475. b = get_reg (r3);
  1476. if (b) for (;b;)
  1477. {
  1478. if (w)
  1479. mem_put_hi(a, mem_get_hi (v));
  1480. else
  1481. mem_put_qi(a, mem_get_qi (v));
  1482. v -= w ? 2 : 1;
  1483. a -= w ? 2 : 1;
  1484. b --;
  1485. }
  1486. put_reg (a0, v);
  1487. put_reg (a1, a);
  1488. put_reg (r3, b);
  1489. /** 1011 0000 100w 0011 SMOVF.size */
  1490. v = get_reg (a0);
  1491. a = get_reg (a1);
  1492. b = get_reg (r3);
  1493. if (b) for (;b;)
  1494. {
  1495. if (w)
  1496. mem_put_hi(a, mem_get_hi (v));
  1497. else
  1498. mem_put_qi(a, mem_get_qi (v));
  1499. v += w ? 2 : 1;
  1500. a += w ? 2 : 1;
  1501. b --;
  1502. }
  1503. put_reg (a0, v);
  1504. put_reg (a1, a);
  1505. put_reg (r3, b);
  1506. /** 1011 1000 100w 0011 SMOVU.size */
  1507. v = get_reg (a0);
  1508. a = get_reg (a1);
  1509. do
  1510. {
  1511. if (w)
  1512. mem_put_hi(a, (t0 = mem_get_hi (v)));
  1513. else
  1514. mem_put_qi(a, (t0 = mem_get_qi (v)));
  1515. v += w ? 2 : 1;
  1516. a += w ? 2 : 1;
  1517. if (t0 == 0
  1518. || (w && ((t0 & 0xff) == 0 || (t0 & 0xff00) == 0)))
  1519. break;
  1520. } while (1);
  1521. put_reg (a0, v);
  1522. put_reg (a1, a);
  1523. /** 1011 0100 100w 0011 SOUT.size */
  1524. v = get_reg (a0);
  1525. a = get_reg (a1);
  1526. b = get_reg (r3);
  1527. for (;b;)
  1528. {
  1529. if (w)
  1530. mem_put_hi(a, mem_get_hi (v));
  1531. else
  1532. mem_put_qi(a, mem_get_qi (v));
  1533. v += w ? 2 : 1;
  1534. b --;
  1535. }
  1536. put_reg (a0, v);
  1537. put_reg (a1, a);
  1538. put_reg (r3, b);
  1539. /** 1011 1000 000w 0011 SSTR.size */
  1540. a = get_reg (a1);
  1541. b = get_reg (r3);
  1542. v = get_reg (w ? r0 : r0l);
  1543. for (;b;)
  1544. {
  1545. if (w)
  1546. mem_put_hi(a, v);
  1547. else
  1548. mem_put_qi(a, v);
  1549. a += w ? 2 : 1;
  1550. b --;
  1551. }
  1552. put_reg (a1, a);
  1553. put_reg (r3, b);
  1554. /** 0000 0001 1101 ddd1 dd01 0src STC src,dest */
  1555. prefix (0, 0, 0);
  1556. dc = decode_dest23 (ddd, dd, 4);
  1557. sc = decode_cr_b (src, CR_B_DMA0);
  1558. a = get_src (sc);
  1559. put_dest (dc, a);
  1560. /** 0000 0001 1101 ddd1 dd01 1src STC src,dest */
  1561. prefix (0, 0, 0);
  1562. dc = decode_dest23 (ddd, dd, 2);
  1563. sc = decode_cr_b (src, CR_B_DCT0);
  1564. a = get_src (sc);
  1565. put_dest (dc, a);
  1566. /** 1101 ddd1 dd01 0src STC src,dest */
  1567. prefix (0, 0, 0);
  1568. dc = decode_dest23 (ddd, dd, 4);
  1569. sc = decode_cr_b (src, CR_B_INTB);
  1570. a = get_src (sc);
  1571. put_dest (dc, a);
  1572. /** 1011 0110 1101 0011 STCX abs16,abs24 */
  1573. NOTYET();
  1574. /** 1001 ddd w dd01 1111 STNZ.size #IMM,dest */
  1575. prefix (0, 1, 0);
  1576. dc = decode_dest23 (ddd, dd, w+1);
  1577. imm = IMM(w+1);
  1578. if (! FLAG_Z)
  1579. put_dest (dc, imm);
  1580. /** 1001 ddd w dd00 1111 STZ.size #IMM,dest */
  1581. prefix (0, 1, 0);
  1582. dc = decode_dest23 (ddd, dd, w+1);
  1583. imm = IMM(w+1);
  1584. if (FLAG_Z)
  1585. put_dest (dc, imm);
  1586. /** 1001 ddd w dd11 1111 STZX.size #IMM1,#IMM2,dest */
  1587. prefix (0, 1, 0);
  1588. dc = decode_dest23 (ddd, dd, w+1);
  1589. a = IMM(w+1);
  1590. b = IMM(w+1);
  1591. if (FLAG_Z)
  1592. put_dest (dc, a);
  1593. else
  1594. put_dest (dc, b);
  1595. /** 1000 ddd w dd11 1110 SUB.size:G #IMM,dest */
  1596. prefix (0, 1, 0);
  1597. dc = decode_dest23(ddd, dd, w+1);
  1598. imm = IMM(w+1);
  1599. MATH_OP (dc, imm, 0, -);
  1600. /** 1001 ddd0 dd11 0001 SUB.L:G #IMM,dest */
  1601. prefix (0, 1, 0);
  1602. dc = decode_dest23(ddd, dd, 4);
  1603. imm = IMM(4);
  1604. MATH_OP (dc, imm, 0, -);
  1605. /** 00dd 111w SUB.size:S #IMM,dest */
  1606. prefix (0, 1, 0);
  1607. dc = decode_dest2(dd, w+1);
  1608. imm = IMM (w+1);
  1609. MATH_OP (dc, imm, 0, -);
  1610. /** 1sss ddd w dd ss 1010 SUB.size:G src,dest */
  1611. prefix (1, 1, 0);
  1612. sc = decode_src23(sss, ss, w+1);
  1613. dc = decode_dest23(ddd, dd, w+1);
  1614. b = get_src (sc);
  1615. MATH_OP (dc, b, 0, -);
  1616. /** 1sss ddd1 dd ss 0000 SUB.L:G src,dest */
  1617. prefix (1, 1, 0);
  1618. sc = decode_src23(sss, ss, 4);
  1619. dc = decode_dest23(ddd, dd, 4);
  1620. b = get_src (sc);
  1621. MATH_OP (dc, b, 0, -);
  1622. /** 1001 ddd0 dd01 0001 SUBX #IMM,dest */
  1623. prefix (0, 1, 0);
  1624. dc = decode_dest23(ddd, dd, 4);
  1625. imm = sign_ext (IMM(1), 8);
  1626. MATH_OP (dc, imm, 0, -);
  1627. /** 1sss ddd0 dd ss 0000 SUBX src,dest */
  1628. prefix (1, 1, 0);
  1629. sc = decode_src23(sss, ss, 1);
  1630. dc = decode_dest23(ddd, dd, 4);
  1631. b = sign_ext (get_src (sc), 8);
  1632. MATH_OP (dc, b, 0, -);
  1633. /** 1001 ddd w dd11 1110 TST.size:G #IMM,dest */
  1634. prefix (0, 0, 0);
  1635. dc = decode_dest23 (ddd, dd, w+1);
  1636. imm = IMM(w+1);
  1637. a = get_src (dc);
  1638. v = a & imm;
  1639. set_sz (v, w+1);
  1640. /** 00dd 110w TST.size:S #IMM,dest */
  1641. prefix (0, 0, 0);
  1642. dc = decode_dest2 (dd, w+1);
  1643. imm = IMM(w+1);
  1644. a = get_src (dc);
  1645. v = a & imm;
  1646. set_sz (v, w+1);
  1647. /** 0000 0001 1sss ddd w dd ss 1001 TST.size:G src,dest */
  1648. prefix (0, 0, 0);
  1649. sc = decode_src23 (sss, ss, w+1);
  1650. dc = decode_dest23 (ddd, dd, w+1);
  1651. b = get_src (sc);
  1652. a = get_src (dc);
  1653. v = a & b;
  1654. set_sz (v, w+1);
  1655. /** 1111 1111 UND */
  1656. trigger_fixed_interrupt (0xffffdc);
  1657. /** 1011 0010 0000 0011 WAIT */
  1658. ;
  1659. /** 1101 ddd w dd00 1src XCHG.size src,dest */
  1660. dc = decode_dest23 (ddd, dd, w+1);
  1661. sc = decode_src3 (src, w+1);
  1662. a = get_src (dc);
  1663. b = get_src (sc);
  1664. put_dest (dc, b);
  1665. put_dest (sc, a);
  1666. /** 1001 ddd w dd00 1110 XOR.size #IMM,dest */
  1667. prefix (0, 1, 0);
  1668. dc = decode_dest23(ddd, dd, w+1);
  1669. imm = IMM(w+1);
  1670. LOGIC_OP (dc, imm, ^);
  1671. /** 1sss ddd w dd ss 1001 XOR.size src,dest */
  1672. prefix (1, 1, 0);
  1673. sc = decode_src23(sss, ss, w+1);
  1674. dc = decode_dest23(ddd, dd, w+1);
  1675. b = get_src (sc);
  1676. LOGIC_OP (dc, b, ^);
  1677. /** */
  1678. return step_result;
  1679. }