PageRenderTime 57ms CodeModel.GetById 17ms RepoModel.GetById 1ms app.codeStats 0ms

/sim/d10v/simops.c

https://bitbucket.org/teawater/gdb
C | 2641 lines | 2210 code | 282 blank | 149 comment | 242 complexity | eff2f6385dc0e097066f3277437c996e MD5 | raw file
Possible License(s): BSD-3-Clause, GPL-3.0, LGPL-2.1, GPL-2.0, LGPL-2.0
  1. #include "config.h"
  2. #include <signal.h>
  3. #include <errno.h>
  4. #include <sys/types.h>
  5. #include <sys/stat.h>
  6. #ifdef HAVE_UNISTD_H
  7. #include <unistd.h>
  8. #endif
  9. #ifdef HAVE_STRING_H
  10. #include <string.h>
  11. #endif
  12. #include "d10v_sim.h"
  13. #include "simops.h"
  14. #include "targ-vals.h"
  15. extern char *strrchr ();
  16. enum op_types {
  17. OP_VOID,
  18. OP_REG,
  19. OP_REG_OUTPUT,
  20. OP_DREG,
  21. OP_DREG_OUTPUT,
  22. OP_ACCUM,
  23. OP_ACCUM_OUTPUT,
  24. OP_ACCUM_REVERSE,
  25. OP_CR,
  26. OP_CR_OUTPUT,
  27. OP_CR_REVERSE,
  28. OP_FLAG,
  29. OP_FLAG_OUTPUT,
  30. OP_CONSTANT16,
  31. OP_CONSTANT8,
  32. OP_CONSTANT3,
  33. OP_CONSTANT4,
  34. OP_MEMREF,
  35. OP_MEMREF2,
  36. OP_MEMREF3,
  37. OP_POSTDEC,
  38. OP_POSTINC,
  39. OP_PREDEC,
  40. OP_R0,
  41. OP_R1,
  42. OP_R2,
  43. };
  44. enum {
  45. PSW_MASK = (PSW_SM_BIT
  46. | PSW_EA_BIT
  47. | PSW_DB_BIT
  48. | PSW_IE_BIT
  49. | PSW_RP_BIT
  50. | PSW_MD_BIT
  51. | PSW_FX_BIT
  52. | PSW_ST_BIT
  53. | PSW_F0_BIT
  54. | PSW_F1_BIT
  55. | PSW_C_BIT),
  56. /* The following bits in the PSW _can't_ be set by instructions such
  57. as mvtc. */
  58. PSW_HW_MASK = (PSW_MASK | PSW_DM_BIT)
  59. };
  60. reg_t
  61. move_to_cr (int cr, reg_t mask, reg_t val, int psw_hw_p)
  62. {
  63. /* A MASK bit is set when the corresponding bit in the CR should
  64. be left alone */
  65. /* This assumes that (VAL & MASK) == 0 */
  66. switch (cr)
  67. {
  68. case PSW_CR:
  69. if (psw_hw_p)
  70. val &= PSW_HW_MASK;
  71. else
  72. val &= PSW_MASK;
  73. if ((mask & PSW_SM_BIT) == 0)
  74. {
  75. int new_psw_sm = (val & PSW_SM_BIT) != 0;
  76. /* save old SP */
  77. SET_HELD_SP (PSW_SM, GPR (SP_IDX));
  78. if (PSW_SM != new_psw_sm)
  79. /* restore new SP */
  80. SET_GPR (SP_IDX, HELD_SP (new_psw_sm));
  81. }
  82. if ((mask & (PSW_ST_BIT | PSW_FX_BIT)) == 0)
  83. {
  84. if (val & PSW_ST_BIT && !(val & PSW_FX_BIT))
  85. {
  86. (*d10v_callback->printf_filtered)
  87. (d10v_callback,
  88. "ERROR at PC 0x%x: ST can only be set when FX is set.\n",
  89. PC<<2);
  90. State.exception = SIGILL;
  91. }
  92. }
  93. /* keep an up-to-date psw around for tracing */
  94. State.trace.psw = (State.trace.psw & mask) | val;
  95. break;
  96. case BPSW_CR:
  97. case DPSW_CR:
  98. /* Just like PSW, mask things like DM out. */
  99. if (psw_hw_p)
  100. val &= PSW_HW_MASK;
  101. else
  102. val &= PSW_MASK;
  103. break;
  104. case MOD_S_CR:
  105. case MOD_E_CR:
  106. val &= ~1;
  107. break;
  108. default:
  109. break;
  110. }
  111. /* only issue an update if the register is being changed */
  112. if ((State.cregs[cr] & ~mask) != val)
  113. SLOT_PEND_MASK (State.cregs[cr], mask, val);
  114. return val;
  115. }
  116. #ifdef DEBUG
  117. static void trace_input_func PARAMS ((char *name,
  118. enum op_types in1,
  119. enum op_types in2,
  120. enum op_types in3));
  121. #define trace_input(name, in1, in2, in3) do { if (d10v_debug) trace_input_func (name, in1, in2, in3); } while (0)
  122. #ifndef SIZE_INSTRUCTION
  123. #define SIZE_INSTRUCTION 8
  124. #endif
  125. #ifndef SIZE_OPERANDS
  126. #define SIZE_OPERANDS 18
  127. #endif
  128. #ifndef SIZE_VALUES
  129. #define SIZE_VALUES 13
  130. #endif
  131. #ifndef SIZE_LOCATION
  132. #define SIZE_LOCATION 20
  133. #endif
  134. #ifndef SIZE_PC
  135. #define SIZE_PC 6
  136. #endif
  137. #ifndef SIZE_LINE_NUMBER
  138. #define SIZE_LINE_NUMBER 4
  139. #endif
  140. static void
  141. trace_input_func (name, in1, in2, in3)
  142. char *name;
  143. enum op_types in1;
  144. enum op_types in2;
  145. enum op_types in3;
  146. {
  147. char *comma;
  148. enum op_types in[3];
  149. int i;
  150. char buf[1024];
  151. char *p;
  152. long tmp;
  153. char *type;
  154. const char *filename;
  155. const char *functionname;
  156. unsigned int linenumber;
  157. bfd_vma byte_pc;
  158. if ((d10v_debug & DEBUG_TRACE) == 0)
  159. return;
  160. switch (State.ins_type)
  161. {
  162. default:
  163. case INS_UNKNOWN: type = " ?"; break;
  164. case INS_LEFT: type = " L"; break;
  165. case INS_RIGHT: type = " R"; break;
  166. case INS_LEFT_PARALLEL: type = "*L"; break;
  167. case INS_RIGHT_PARALLEL: type = "*R"; break;
  168. case INS_LEFT_COND_TEST: type = "?L"; break;
  169. case INS_RIGHT_COND_TEST: type = "?R"; break;
  170. case INS_LEFT_COND_EXE: type = "&L"; break;
  171. case INS_RIGHT_COND_EXE: type = "&R"; break;
  172. case INS_LONG: type = " B"; break;
  173. }
  174. if ((d10v_debug & DEBUG_LINE_NUMBER) == 0)
  175. (*d10v_callback->printf_filtered) (d10v_callback,
  176. "0x%.*x %s: %-*s ",
  177. SIZE_PC, (unsigned)PC,
  178. type,
  179. SIZE_INSTRUCTION, name);
  180. else
  181. {
  182. buf[0] = '\0';
  183. byte_pc = decode_pc ();
  184. if (text && byte_pc >= text_start && byte_pc < text_end)
  185. {
  186. filename = (const char *)0;
  187. functionname = (const char *)0;
  188. linenumber = 0;
  189. if (bfd_find_nearest_line (prog_bfd, text, (struct bfd_symbol **)0, byte_pc - text_start,
  190. &filename, &functionname, &linenumber))
  191. {
  192. p = buf;
  193. if (linenumber)
  194. {
  195. sprintf (p, "#%-*d ", SIZE_LINE_NUMBER, linenumber);
  196. p += strlen (p);
  197. }
  198. else
  199. {
  200. sprintf (p, "%-*s ", SIZE_LINE_NUMBER+1, "---");
  201. p += SIZE_LINE_NUMBER+2;
  202. }
  203. if (functionname)
  204. {
  205. sprintf (p, "%s ", functionname);
  206. p += strlen (p);
  207. }
  208. else if (filename)
  209. {
  210. char *q = strrchr (filename, '/');
  211. sprintf (p, "%s ", (q) ? q+1 : filename);
  212. p += strlen (p);
  213. }
  214. if (*p == ' ')
  215. *p = '\0';
  216. }
  217. }
  218. (*d10v_callback->printf_filtered) (d10v_callback,
  219. "0x%.*x %s: %-*.*s %-*s ",
  220. SIZE_PC, (unsigned)PC,
  221. type,
  222. SIZE_LOCATION, SIZE_LOCATION, buf,
  223. SIZE_INSTRUCTION, name);
  224. }
  225. in[0] = in1;
  226. in[1] = in2;
  227. in[2] = in3;
  228. comma = "";
  229. p = buf;
  230. for (i = 0; i < 3; i++)
  231. {
  232. switch (in[i])
  233. {
  234. case OP_VOID:
  235. case OP_R0:
  236. case OP_R1:
  237. case OP_R2:
  238. break;
  239. case OP_REG:
  240. case OP_REG_OUTPUT:
  241. case OP_DREG:
  242. case OP_DREG_OUTPUT:
  243. sprintf (p, "%sr%d", comma, OP[i]);
  244. p += strlen (p);
  245. comma = ",";
  246. break;
  247. case OP_CR:
  248. case OP_CR_OUTPUT:
  249. case OP_CR_REVERSE:
  250. sprintf (p, "%scr%d", comma, OP[i]);
  251. p += strlen (p);
  252. comma = ",";
  253. break;
  254. case OP_ACCUM:
  255. case OP_ACCUM_OUTPUT:
  256. case OP_ACCUM_REVERSE:
  257. sprintf (p, "%sa%d", comma, OP[i]);
  258. p += strlen (p);
  259. comma = ",";
  260. break;
  261. case OP_CONSTANT16:
  262. sprintf (p, "%s%d", comma, OP[i]);
  263. p += strlen (p);
  264. comma = ",";
  265. break;
  266. case OP_CONSTANT8:
  267. sprintf (p, "%s%d", comma, SEXT8(OP[i]));
  268. p += strlen (p);
  269. comma = ",";
  270. break;
  271. case OP_CONSTANT4:
  272. sprintf (p, "%s%d", comma, SEXT4(OP[i]));
  273. p += strlen (p);
  274. comma = ",";
  275. break;
  276. case OP_CONSTANT3:
  277. sprintf (p, "%s%d", comma, SEXT3(OP[i]));
  278. p += strlen (p);
  279. comma = ",";
  280. break;
  281. case OP_MEMREF:
  282. sprintf (p, "%s@r%d", comma, OP[i]);
  283. p += strlen (p);
  284. comma = ",";
  285. break;
  286. case OP_MEMREF2:
  287. sprintf (p, "%s@(%d,r%d)", comma, (int16)OP[i], OP[i+1]);
  288. p += strlen (p);
  289. comma = ",";
  290. break;
  291. case OP_MEMREF3:
  292. sprintf (p, "%s@%d", comma, OP[i]);
  293. p += strlen (p);
  294. comma = ",";
  295. break;
  296. case OP_POSTINC:
  297. sprintf (p, "%s@r%d+", comma, OP[i]);
  298. p += strlen (p);
  299. comma = ",";
  300. break;
  301. case OP_POSTDEC:
  302. sprintf (p, "%s@r%d-", comma, OP[i]);
  303. p += strlen (p);
  304. comma = ",";
  305. break;
  306. case OP_PREDEC:
  307. sprintf (p, "%s@-r%d", comma, OP[i]);
  308. p += strlen (p);
  309. comma = ",";
  310. break;
  311. case OP_FLAG:
  312. case OP_FLAG_OUTPUT:
  313. if (OP[i] == 0)
  314. sprintf (p, "%sf0", comma);
  315. else if (OP[i] == 1)
  316. sprintf (p, "%sf1", comma);
  317. else
  318. sprintf (p, "%sc", comma);
  319. p += strlen (p);
  320. comma = ",";
  321. break;
  322. }
  323. }
  324. if ((d10v_debug & DEBUG_VALUES) == 0)
  325. {
  326. *p++ = '\n';
  327. *p = '\0';
  328. (*d10v_callback->printf_filtered) (d10v_callback, "%s", buf);
  329. }
  330. else
  331. {
  332. *p = '\0';
  333. (*d10v_callback->printf_filtered) (d10v_callback, "%-*s", SIZE_OPERANDS, buf);
  334. p = buf;
  335. for (i = 0; i < 3; i++)
  336. {
  337. buf[0] = '\0';
  338. switch (in[i])
  339. {
  340. case OP_VOID:
  341. (*d10v_callback->printf_filtered) (d10v_callback, "%*s", SIZE_VALUES, "");
  342. break;
  343. case OP_REG_OUTPUT:
  344. case OP_DREG_OUTPUT:
  345. case OP_CR_OUTPUT:
  346. case OP_ACCUM_OUTPUT:
  347. case OP_FLAG_OUTPUT:
  348. (*d10v_callback->printf_filtered) (d10v_callback, "%*s", SIZE_VALUES, "---");
  349. break;
  350. case OP_REG:
  351. case OP_MEMREF:
  352. case OP_POSTDEC:
  353. case OP_POSTINC:
  354. case OP_PREDEC:
  355. (*d10v_callback->printf_filtered) (d10v_callback, "%*s0x%.4x", SIZE_VALUES-6, "",
  356. (uint16) GPR (OP[i]));
  357. break;
  358. case OP_MEMREF3:
  359. (*d10v_callback->printf_filtered) (d10v_callback, "%*s0x%.4x", SIZE_VALUES-6, "", (uint16) OP[i]);
  360. break;
  361. case OP_DREG:
  362. tmp = (long)((((uint32) GPR (OP[i])) << 16) | ((uint32) GPR (OP[i] + 1)));
  363. (*d10v_callback->printf_filtered) (d10v_callback, "%*s0x%.8lx", SIZE_VALUES-10, "", tmp);
  364. break;
  365. case OP_CR:
  366. case OP_CR_REVERSE:
  367. (*d10v_callback->printf_filtered) (d10v_callback, "%*s0x%.4x", SIZE_VALUES-6, "",
  368. (uint16) CREG (OP[i]));
  369. break;
  370. case OP_ACCUM:
  371. case OP_ACCUM_REVERSE:
  372. (*d10v_callback->printf_filtered) (d10v_callback, "%*s0x%.2x%.8lx", SIZE_VALUES-12, "",
  373. ((int)(ACC (OP[i]) >> 32) & 0xff),
  374. ((unsigned long) ACC (OP[i])) & 0xffffffff);
  375. break;
  376. case OP_CONSTANT16:
  377. (*d10v_callback->printf_filtered) (d10v_callback, "%*s0x%.4x", SIZE_VALUES-6, "",
  378. (uint16)OP[i]);
  379. break;
  380. case OP_CONSTANT4:
  381. (*d10v_callback->printf_filtered) (d10v_callback, "%*s0x%.4x", SIZE_VALUES-6, "",
  382. (uint16)SEXT4(OP[i]));
  383. break;
  384. case OP_CONSTANT8:
  385. (*d10v_callback->printf_filtered) (d10v_callback, "%*s0x%.4x", SIZE_VALUES-6, "",
  386. (uint16)SEXT8(OP[i]));
  387. break;
  388. case OP_CONSTANT3:
  389. (*d10v_callback->printf_filtered) (d10v_callback, "%*s0x%.4x", SIZE_VALUES-6, "",
  390. (uint16)SEXT3(OP[i]));
  391. break;
  392. case OP_FLAG:
  393. if (OP[i] == 0)
  394. (*d10v_callback->printf_filtered) (d10v_callback, "%*sF0 = %d", SIZE_VALUES-6, "",
  395. PSW_F0 != 0);
  396. else if (OP[i] == 1)
  397. (*d10v_callback->printf_filtered) (d10v_callback, "%*sF1 = %d", SIZE_VALUES-6, "",
  398. PSW_F1 != 0);
  399. else
  400. (*d10v_callback->printf_filtered) (d10v_callback, "%*sC = %d", SIZE_VALUES-5, "",
  401. PSW_C != 0);
  402. break;
  403. case OP_MEMREF2:
  404. (*d10v_callback->printf_filtered) (d10v_callback, "%*s0x%.4x", SIZE_VALUES-6, "",
  405. (uint16)OP[i]);
  406. (*d10v_callback->printf_filtered) (d10v_callback, "%*s0x%.4x", SIZE_VALUES-6, "",
  407. (uint16)GPR (OP[i + 1]));
  408. i++;
  409. break;
  410. case OP_R0:
  411. (*d10v_callback->printf_filtered) (d10v_callback, "%*s0x%.4x", SIZE_VALUES-6, "",
  412. (uint16) GPR (0));
  413. break;
  414. case OP_R1:
  415. (*d10v_callback->printf_filtered) (d10v_callback, "%*s0x%.4x", SIZE_VALUES-6, "",
  416. (uint16) GPR (1));
  417. break;
  418. case OP_R2:
  419. (*d10v_callback->printf_filtered) (d10v_callback, "%*s0x%.4x", SIZE_VALUES-6, "",
  420. (uint16) GPR (2));
  421. break;
  422. }
  423. }
  424. }
  425. (*d10v_callback->flush_stdout) (d10v_callback);
  426. }
  427. static void
  428. do_trace_output_flush (void)
  429. {
  430. (*d10v_callback->flush_stdout) (d10v_callback);
  431. }
  432. static void
  433. do_trace_output_finish (void)
  434. {
  435. (*d10v_callback->printf_filtered) (d10v_callback,
  436. " F0=%d F1=%d C=%d\n",
  437. (State.trace.psw & PSW_F0_BIT) != 0,
  438. (State.trace.psw & PSW_F1_BIT) != 0,
  439. (State.trace.psw & PSW_C_BIT) != 0);
  440. (*d10v_callback->flush_stdout) (d10v_callback);
  441. }
  442. static void
  443. trace_output_40 (uint64 val)
  444. {
  445. if ((d10v_debug & (DEBUG_TRACE | DEBUG_VALUES)) == (DEBUG_TRACE | DEBUG_VALUES))
  446. {
  447. (*d10v_callback->printf_filtered) (d10v_callback,
  448. " :: %*s0x%.2x%.8lx",
  449. SIZE_VALUES - 12,
  450. "",
  451. ((int)(val >> 32) & 0xff),
  452. ((unsigned long) val) & 0xffffffff);
  453. do_trace_output_finish ();
  454. }
  455. }
  456. static void
  457. trace_output_32 (uint32 val)
  458. {
  459. if ((d10v_debug & (DEBUG_TRACE | DEBUG_VALUES)) == (DEBUG_TRACE | DEBUG_VALUES))
  460. {
  461. (*d10v_callback->printf_filtered) (d10v_callback,
  462. " :: %*s0x%.8x",
  463. SIZE_VALUES - 10,
  464. "",
  465. (int) val);
  466. do_trace_output_finish ();
  467. }
  468. }
  469. static void
  470. trace_output_16 (uint16 val)
  471. {
  472. if ((d10v_debug & (DEBUG_TRACE | DEBUG_VALUES)) == (DEBUG_TRACE | DEBUG_VALUES))
  473. {
  474. (*d10v_callback->printf_filtered) (d10v_callback,
  475. " :: %*s0x%.4x",
  476. SIZE_VALUES - 6,
  477. "",
  478. (int) val);
  479. do_trace_output_finish ();
  480. }
  481. }
  482. static void
  483. trace_output_void ()
  484. {
  485. if ((d10v_debug & (DEBUG_TRACE | DEBUG_VALUES)) == (DEBUG_TRACE | DEBUG_VALUES))
  486. {
  487. (*d10v_callback->printf_filtered) (d10v_callback, "\n");
  488. do_trace_output_flush ();
  489. }
  490. }
  491. static void
  492. trace_output_flag ()
  493. {
  494. if ((d10v_debug & (DEBUG_TRACE | DEBUG_VALUES)) == (DEBUG_TRACE | DEBUG_VALUES))
  495. {
  496. (*d10v_callback->printf_filtered) (d10v_callback,
  497. " :: %*s",
  498. SIZE_VALUES,
  499. "");
  500. do_trace_output_finish ();
  501. }
  502. }
  503. #else
  504. #define trace_input(NAME, IN1, IN2, IN3)
  505. #define trace_output(RESULT)
  506. #endif
  507. /* abs */
  508. void
  509. OP_4607 ()
  510. {
  511. int16 tmp;
  512. trace_input ("abs", OP_REG, OP_VOID, OP_VOID);
  513. SET_PSW_F1 (PSW_F0);
  514. tmp = GPR(OP[0]);
  515. if (tmp < 0)
  516. {
  517. tmp = - tmp;
  518. SET_PSW_F0 (1);
  519. }
  520. else
  521. SET_PSW_F0 (0);
  522. SET_GPR (OP[0], tmp);
  523. trace_output_16 (tmp);
  524. }
  525. /* abs */
  526. void
  527. OP_5607 ()
  528. {
  529. int64 tmp;
  530. trace_input ("abs", OP_ACCUM, OP_VOID, OP_VOID);
  531. SET_PSW_F1 (PSW_F0);
  532. tmp = SEXT40 (ACC (OP[0]));
  533. if (tmp < 0 )
  534. {
  535. tmp = - tmp;
  536. if (PSW_ST)
  537. {
  538. if (tmp > SEXT40(MAX32))
  539. tmp = (MAX32);
  540. else if (tmp < SEXT40(MIN32))
  541. tmp = (MIN32);
  542. else
  543. tmp = (tmp & MASK40);
  544. }
  545. else
  546. tmp = (tmp & MASK40);
  547. SET_PSW_F0 (1);
  548. }
  549. else
  550. {
  551. tmp = (tmp & MASK40);
  552. SET_PSW_F0 (0);
  553. }
  554. SET_ACC (OP[0], tmp);
  555. trace_output_40 (tmp);
  556. }
  557. /* add */
  558. void
  559. OP_200 ()
  560. {
  561. uint16 a = GPR (OP[0]);
  562. uint16 b = GPR (OP[1]);
  563. uint16 tmp = (a + b);
  564. trace_input ("add", OP_REG, OP_REG, OP_VOID);
  565. SET_PSW_C (a > tmp);
  566. SET_GPR (OP[0], tmp);
  567. trace_output_16 (tmp);
  568. }
  569. /* add */
  570. void
  571. OP_1201 ()
  572. {
  573. int64 tmp;
  574. tmp = SEXT40(ACC (OP[0])) + (SEXT16 (GPR (OP[1])) << 16 | GPR (OP[1] + 1));
  575. trace_input ("add", OP_ACCUM, OP_REG, OP_VOID);
  576. if (PSW_ST)
  577. {
  578. if (tmp > SEXT40(MAX32))
  579. tmp = (MAX32);
  580. else if (tmp < SEXT40(MIN32))
  581. tmp = (MIN32);
  582. else
  583. tmp = (tmp & MASK40);
  584. }
  585. else
  586. tmp = (tmp & MASK40);
  587. SET_ACC (OP[0], tmp);
  588. trace_output_40 (tmp);
  589. }
  590. /* add */
  591. void
  592. OP_1203 ()
  593. {
  594. int64 tmp;
  595. tmp = SEXT40(ACC (OP[0])) + SEXT40(ACC (OP[1]));
  596. trace_input ("add", OP_ACCUM, OP_ACCUM, OP_VOID);
  597. if (PSW_ST)
  598. {
  599. if (tmp > SEXT40(MAX32))
  600. tmp = (MAX32);
  601. else if (tmp < SEXT40(MIN32))
  602. tmp = (MIN32);
  603. else
  604. tmp = (tmp & MASK40);
  605. }
  606. else
  607. tmp = (tmp & MASK40);
  608. SET_ACC (OP[0], tmp);
  609. trace_output_40 (tmp);
  610. }
  611. /* add2w */
  612. void
  613. OP_1200 ()
  614. {
  615. uint32 tmp;
  616. uint32 a = (GPR (OP[0])) << 16 | GPR (OP[0] + 1);
  617. uint32 b = (GPR (OP[1])) << 16 | GPR (OP[1] + 1);
  618. trace_input ("add2w", OP_DREG, OP_DREG, OP_VOID);
  619. tmp = a + b;
  620. SET_PSW_C (tmp < a);
  621. SET_GPR (OP[0] + 0, (tmp >> 16));
  622. SET_GPR (OP[0] + 1, (tmp & 0xFFFF));
  623. trace_output_32 (tmp);
  624. }
  625. /* add3 */
  626. void
  627. OP_1000000 ()
  628. {
  629. uint16 a = GPR (OP[1]);
  630. uint16 b = OP[2];
  631. uint16 tmp = (a + b);
  632. trace_input ("add3", OP_REG_OUTPUT, OP_REG, OP_CONSTANT16);
  633. SET_PSW_C (tmp < a);
  634. SET_GPR (OP[0], tmp);
  635. trace_output_16 (tmp);
  636. }
  637. /* addac3 */
  638. void
  639. OP_17000200 ()
  640. {
  641. int64 tmp;
  642. tmp = SEXT40(ACC (OP[2])) + SEXT40 ((GPR (OP[1]) << 16) | GPR (OP[1] + 1));
  643. trace_input ("addac3", OP_DREG_OUTPUT, OP_DREG, OP_ACCUM);
  644. SET_GPR (OP[0] + 0, ((tmp >> 16) & 0xffff));
  645. SET_GPR (OP[0] + 1, (tmp & 0xffff));
  646. trace_output_32 (tmp);
  647. }
  648. /* addac3 */
  649. void
  650. OP_17000202 ()
  651. {
  652. int64 tmp;
  653. tmp = SEXT40(ACC (OP[1])) + SEXT40(ACC (OP[2]));
  654. trace_input ("addac3", OP_DREG_OUTPUT, OP_ACCUM, OP_ACCUM);
  655. SET_GPR (OP[0] + 0, (tmp >> 16) & 0xffff);
  656. SET_GPR (OP[0] + 1, tmp & 0xffff);
  657. trace_output_32 (tmp);
  658. }
  659. /* addac3s */
  660. void
  661. OP_17001200 ()
  662. {
  663. int64 tmp;
  664. SET_PSW_F1 (PSW_F0);
  665. trace_input ("addac3s", OP_DREG_OUTPUT, OP_DREG, OP_ACCUM);
  666. tmp = SEXT40 (ACC (OP[2])) + SEXT40 ((GPR (OP[1]) << 16) | GPR (OP[1] + 1));
  667. if (tmp > SEXT40(MAX32))
  668. {
  669. tmp = (MAX32);
  670. SET_PSW_F0 (1);
  671. }
  672. else if (tmp < SEXT40(MIN32))
  673. {
  674. tmp = (MIN32);
  675. SET_PSW_F0 (1);
  676. }
  677. else
  678. {
  679. SET_PSW_F0 (0);
  680. }
  681. SET_GPR (OP[0] + 0, (tmp >> 16) & 0xffff);
  682. SET_GPR (OP[0] + 1, (tmp & 0xffff));
  683. trace_output_32 (tmp);
  684. }
  685. /* addac3s */
  686. void
  687. OP_17001202 ()
  688. {
  689. int64 tmp;
  690. SET_PSW_F1 (PSW_F0);
  691. trace_input ("addac3s", OP_DREG_OUTPUT, OP_ACCUM, OP_ACCUM);
  692. tmp = SEXT40(ACC (OP[1])) + SEXT40(ACC (OP[2]));
  693. if (tmp > SEXT40(MAX32))
  694. {
  695. tmp = (MAX32);
  696. SET_PSW_F0 (1);
  697. }
  698. else if (tmp < SEXT40(MIN32))
  699. {
  700. tmp = (MIN32);
  701. SET_PSW_F0 (1);
  702. }
  703. else
  704. {
  705. SET_PSW_F0 (0);
  706. }
  707. SET_GPR (OP[0] + 0, (tmp >> 16) & 0xffff);
  708. SET_GPR (OP[0] + 1, (tmp & 0xffff));
  709. trace_output_32 (tmp);
  710. }
  711. /* addi */
  712. void
  713. OP_201 ()
  714. {
  715. uint16 a = GPR (OP[0]);
  716. uint16 b;
  717. uint16 tmp;
  718. if (OP[1] == 0)
  719. OP[1] = 16;
  720. b = OP[1];
  721. tmp = (a + b);
  722. trace_input ("addi", OP_REG, OP_CONSTANT16, OP_VOID);
  723. SET_PSW_C (tmp < a);
  724. SET_GPR (OP[0], tmp);
  725. trace_output_16 (tmp);
  726. }
  727. /* and */
  728. void
  729. OP_C00 ()
  730. {
  731. uint16 tmp = GPR (OP[0]) & GPR (OP[1]);
  732. trace_input ("and", OP_REG, OP_REG, OP_VOID);
  733. SET_GPR (OP[0], tmp);
  734. trace_output_16 (tmp);
  735. }
  736. /* and3 */
  737. void
  738. OP_6000000 ()
  739. {
  740. uint16 tmp = GPR (OP[1]) & OP[2];
  741. trace_input ("and3", OP_REG_OUTPUT, OP_REG, OP_CONSTANT16);
  742. SET_GPR (OP[0], tmp);
  743. trace_output_16 (tmp);
  744. }
  745. /* bclri */
  746. void
  747. OP_C01 ()
  748. {
  749. int16 tmp;
  750. trace_input ("bclri", OP_REG, OP_CONSTANT16, OP_VOID);
  751. tmp = (GPR (OP[0]) &~(0x8000 >> OP[1]));
  752. SET_GPR (OP[0], tmp);
  753. trace_output_16 (tmp);
  754. }
  755. /* bl.s */
  756. void
  757. OP_4900 ()
  758. {
  759. trace_input ("bl.s", OP_CONSTANT8, OP_R0, OP_R1);
  760. SET_GPR (13, PC + 1);
  761. JMP( PC + SEXT8 (OP[0]));
  762. trace_output_void ();
  763. }
  764. /* bl.l */
  765. void
  766. OP_24800000 ()
  767. {
  768. trace_input ("bl.l", OP_CONSTANT16, OP_R0, OP_R1);
  769. SET_GPR (13, (PC + 1));
  770. JMP (PC + OP[0]);
  771. trace_output_void ();
  772. }
  773. /* bnoti */
  774. void
  775. OP_A01 ()
  776. {
  777. int16 tmp;
  778. trace_input ("bnoti", OP_REG, OP_CONSTANT16, OP_VOID);
  779. tmp = (GPR (OP[0]) ^ (0x8000 >> OP[1]));
  780. SET_GPR (OP[0], tmp);
  781. trace_output_16 (tmp);
  782. }
  783. /* bra.s */
  784. void
  785. OP_4800 ()
  786. {
  787. trace_input ("bra.s", OP_CONSTANT8, OP_VOID, OP_VOID);
  788. JMP (PC + SEXT8 (OP[0]));
  789. trace_output_void ();
  790. }
  791. /* bra.l */
  792. void
  793. OP_24000000 ()
  794. {
  795. trace_input ("bra.l", OP_CONSTANT16, OP_VOID, OP_VOID);
  796. JMP (PC + OP[0]);
  797. trace_output_void ();
  798. }
  799. /* brf0f.s */
  800. void
  801. OP_4A00 ()
  802. {
  803. trace_input ("brf0f.s", OP_CONSTANT8, OP_VOID, OP_VOID);
  804. if (!PSW_F0)
  805. JMP (PC + SEXT8 (OP[0]));
  806. trace_output_flag ();
  807. }
  808. /* brf0f.l */
  809. void
  810. OP_25000000 ()
  811. {
  812. trace_input ("brf0f.l", OP_CONSTANT16, OP_VOID, OP_VOID);
  813. if (!PSW_F0)
  814. JMP (PC + OP[0]);
  815. trace_output_flag ();
  816. }
  817. /* brf0t.s */
  818. void
  819. OP_4B00 ()
  820. {
  821. trace_input ("brf0t.s", OP_CONSTANT8, OP_VOID, OP_VOID);
  822. if (PSW_F0)
  823. JMP (PC + SEXT8 (OP[0]));
  824. trace_output_flag ();
  825. }
  826. /* brf0t.l */
  827. void
  828. OP_25800000 ()
  829. {
  830. trace_input ("brf0t.l", OP_CONSTANT16, OP_VOID, OP_VOID);
  831. if (PSW_F0)
  832. JMP (PC + OP[0]);
  833. trace_output_flag ();
  834. }
  835. /* bseti */
  836. void
  837. OP_801 ()
  838. {
  839. int16 tmp;
  840. trace_input ("bseti", OP_REG, OP_CONSTANT16, OP_VOID);
  841. tmp = (GPR (OP[0]) | (0x8000 >> OP[1]));
  842. SET_GPR (OP[0], tmp);
  843. trace_output_16 (tmp);
  844. }
  845. /* btsti */
  846. void
  847. OP_E01 ()
  848. {
  849. trace_input ("btsti", OP_REG, OP_CONSTANT16, OP_VOID);
  850. SET_PSW_F1 (PSW_F0);
  851. SET_PSW_F0 ((GPR (OP[0]) & (0x8000 >> OP[1])) ? 1 : 0);
  852. trace_output_flag ();
  853. }
  854. /* clrac */
  855. void
  856. OP_5601 ()
  857. {
  858. trace_input ("clrac", OP_ACCUM_OUTPUT, OP_VOID, OP_VOID);
  859. SET_ACC (OP[0], 0);
  860. trace_output_40 (0);
  861. }
  862. /* cmp */
  863. void
  864. OP_600 ()
  865. {
  866. trace_input ("cmp", OP_REG, OP_REG, OP_VOID);
  867. SET_PSW_F1 (PSW_F0);
  868. SET_PSW_F0 (((int16)(GPR (OP[0])) < (int16)(GPR (OP[1]))) ? 1 : 0);
  869. trace_output_flag ();
  870. }
  871. /* cmp */
  872. void
  873. OP_1603 ()
  874. {
  875. trace_input ("cmp", OP_ACCUM, OP_ACCUM, OP_VOID);
  876. SET_PSW_F1 (PSW_F0);
  877. SET_PSW_F0 ((SEXT40(ACC (OP[0])) < SEXT40(ACC (OP[1]))) ? 1 : 0);
  878. trace_output_flag ();
  879. }
  880. /* cmpeq */
  881. void
  882. OP_400 ()
  883. {
  884. trace_input ("cmpeq", OP_REG, OP_REG, OP_VOID);
  885. SET_PSW_F1 (PSW_F0);
  886. SET_PSW_F0 ((GPR (OP[0]) == GPR (OP[1])) ? 1 : 0);
  887. trace_output_flag ();
  888. }
  889. /* cmpeq */
  890. void
  891. OP_1403 ()
  892. {
  893. trace_input ("cmpeq", OP_ACCUM, OP_ACCUM, OP_VOID);
  894. SET_PSW_F1 (PSW_F0);
  895. SET_PSW_F0 (((ACC (OP[0]) & MASK40) == (ACC (OP[1]) & MASK40)) ? 1 : 0);
  896. trace_output_flag ();
  897. }
  898. /* cmpeqi.s */
  899. void
  900. OP_401 ()
  901. {
  902. trace_input ("cmpeqi.s", OP_REG, OP_CONSTANT4, OP_VOID);
  903. SET_PSW_F1 (PSW_F0);
  904. SET_PSW_F0 ((GPR (OP[0]) == (reg_t) SEXT4 (OP[1])) ? 1 : 0);
  905. trace_output_flag ();
  906. }
  907. /* cmpeqi.l */
  908. void
  909. OP_2000000 ()
  910. {
  911. trace_input ("cmpeqi.l", OP_REG, OP_CONSTANT16, OP_VOID);
  912. SET_PSW_F1 (PSW_F0);
  913. SET_PSW_F0 ((GPR (OP[0]) == (reg_t)OP[1]) ? 1 : 0);
  914. trace_output_flag ();
  915. }
  916. /* cmpi.s */
  917. void
  918. OP_601 ()
  919. {
  920. trace_input ("cmpi.s", OP_REG, OP_CONSTANT4, OP_VOID);
  921. SET_PSW_F1 (PSW_F0);
  922. SET_PSW_F0 (((int16)(GPR (OP[0])) < (int16)SEXT4(OP[1])) ? 1 : 0);
  923. trace_output_flag ();
  924. }
  925. /* cmpi.l */
  926. void
  927. OP_3000000 ()
  928. {
  929. trace_input ("cmpi.l", OP_REG, OP_CONSTANT16, OP_VOID);
  930. SET_PSW_F1 (PSW_F0);
  931. SET_PSW_F0 (((int16)(GPR (OP[0])) < (int16)(OP[1])) ? 1 : 0);
  932. trace_output_flag ();
  933. }
  934. /* cmpu */
  935. void
  936. OP_4600 ()
  937. {
  938. trace_input ("cmpu", OP_REG, OP_REG, OP_VOID);
  939. SET_PSW_F1 (PSW_F0);
  940. SET_PSW_F0 ((GPR (OP[0]) < GPR (OP[1])) ? 1 : 0);
  941. trace_output_flag ();
  942. }
  943. /* cmpui */
  944. void
  945. OP_23000000 ()
  946. {
  947. trace_input ("cmpui", OP_REG, OP_CONSTANT16, OP_VOID);
  948. SET_PSW_F1 (PSW_F0);
  949. SET_PSW_F0 ((GPR (OP[0]) < (reg_t)OP[1]) ? 1 : 0);
  950. trace_output_flag ();
  951. }
  952. /* cpfg */
  953. void
  954. OP_4E09 ()
  955. {
  956. uint8 val;
  957. trace_input ("cpfg", OP_FLAG_OUTPUT, OP_FLAG, OP_VOID);
  958. if (OP[1] == 0)
  959. val = PSW_F0;
  960. else if (OP[1] == 1)
  961. val = PSW_F1;
  962. else
  963. val = PSW_C;
  964. if (OP[0] == 0)
  965. SET_PSW_F0 (val);
  966. else
  967. SET_PSW_F1 (val);
  968. trace_output_flag ();
  969. }
  970. /* cpfg */
  971. void
  972. OP_4E0F ()
  973. {
  974. uint8 val;
  975. trace_input ("cpfg", OP_FLAG_OUTPUT, OP_FLAG, OP_VOID);
  976. if (OP[1] == 0)
  977. val = PSW_F0;
  978. else if (OP[1] == 1)
  979. val = PSW_F1;
  980. else
  981. val = PSW_C;
  982. if (OP[0] == 0)
  983. SET_PSW_F0 (val);
  984. else
  985. SET_PSW_F1 (val);
  986. trace_output_flag ();
  987. }
  988. /* dbt */
  989. void
  990. OP_5F20 ()
  991. {
  992. /* d10v_callback->printf_filtered(d10v_callback, "***** DBT ***** PC=%x\n",PC); */
  993. /* GDB uses the instruction pair ``dbt || nop'' as a break-point.
  994. The conditional below is for either of the instruction pairs
  995. ``dbt -> XXX'' or ``dbt <- XXX'' and treats them as as cases
  996. where the dbt instruction should be interpreted.
  997. The module `sim-break' provides a more effective mechanism for
  998. detecting GDB planted breakpoints. The code below may,
  999. eventually, be changed to use that mechanism. */
  1000. if (State.ins_type == INS_LEFT
  1001. || State.ins_type == INS_RIGHT)
  1002. {
  1003. trace_input ("dbt", OP_VOID, OP_VOID, OP_VOID);
  1004. SET_DPC (PC + 1);
  1005. SET_DPSW (PSW);
  1006. SET_HW_PSW (PSW_DM_BIT | (PSW & (PSW_F0_BIT | PSW_F1_BIT | PSW_C_BIT)));
  1007. JMP (DBT_VECTOR_START);
  1008. trace_output_void ();
  1009. }
  1010. else
  1011. {
  1012. State.exception = SIGTRAP;
  1013. }
  1014. }
  1015. /* divs */
  1016. void
  1017. OP_14002800 ()
  1018. {
  1019. uint16 foo, tmp, tmpf;
  1020. uint16 hi;
  1021. uint16 lo;
  1022. trace_input ("divs", OP_DREG, OP_REG, OP_VOID);
  1023. foo = (GPR (OP[0]) << 1) | (GPR (OP[0] + 1) >> 15);
  1024. tmp = (int16)foo - (int16)(GPR (OP[1]));
  1025. tmpf = (foo >= GPR (OP[1])) ? 1 : 0;
  1026. hi = ((tmpf == 1) ? tmp : foo);
  1027. lo = ((GPR (OP[0] + 1) << 1) | tmpf);
  1028. SET_GPR (OP[0] + 0, hi);
  1029. SET_GPR (OP[0] + 1, lo);
  1030. trace_output_32 (((uint32) hi << 16) | lo);
  1031. }
  1032. /* exef0f */
  1033. void
  1034. OP_4E04 ()
  1035. {
  1036. trace_input ("exef0f", OP_VOID, OP_VOID, OP_VOID);
  1037. State.exe = (PSW_F0 == 0);
  1038. trace_output_flag ();
  1039. }
  1040. /* exef0t */
  1041. void
  1042. OP_4E24 ()
  1043. {
  1044. trace_input ("exef0t", OP_VOID, OP_VOID, OP_VOID);
  1045. State.exe = (PSW_F0 != 0);
  1046. trace_output_flag ();
  1047. }
  1048. /* exef1f */
  1049. void
  1050. OP_4E40 ()
  1051. {
  1052. trace_input ("exef1f", OP_VOID, OP_VOID, OP_VOID);
  1053. State.exe = (PSW_F1 == 0);
  1054. trace_output_flag ();
  1055. }
  1056. /* exef1t */
  1057. void
  1058. OP_4E42 ()
  1059. {
  1060. trace_input ("exef1t", OP_VOID, OP_VOID, OP_VOID);
  1061. State.exe = (PSW_F1 != 0);
  1062. trace_output_flag ();
  1063. }
  1064. /* exefaf */
  1065. void
  1066. OP_4E00 ()
  1067. {
  1068. trace_input ("exefaf", OP_VOID, OP_VOID, OP_VOID);
  1069. State.exe = (PSW_F0 == 0) & (PSW_F1 == 0);
  1070. trace_output_flag ();
  1071. }
  1072. /* exefat */
  1073. void
  1074. OP_4E02 ()
  1075. {
  1076. trace_input ("exefat", OP_VOID, OP_VOID, OP_VOID);
  1077. State.exe = (PSW_F0 == 0) & (PSW_F1 != 0);
  1078. trace_output_flag ();
  1079. }
  1080. /* exetaf */
  1081. void
  1082. OP_4E20 ()
  1083. {
  1084. trace_input ("exetaf", OP_VOID, OP_VOID, OP_VOID);
  1085. State.exe = (PSW_F0 != 0) & (PSW_F1 == 0);
  1086. trace_output_flag ();
  1087. }
  1088. /* exetat */
  1089. void
  1090. OP_4E22 ()
  1091. {
  1092. trace_input ("exetat", OP_VOID, OP_VOID, OP_VOID);
  1093. State.exe = (PSW_F0 != 0) & (PSW_F1 != 0);
  1094. trace_output_flag ();
  1095. }
  1096. /* exp */
  1097. void
  1098. OP_15002A00 ()
  1099. {
  1100. uint32 tmp, foo;
  1101. int i;
  1102. trace_input ("exp", OP_REG_OUTPUT, OP_DREG, OP_VOID);
  1103. if (((int16)GPR (OP[1])) >= 0)
  1104. tmp = (GPR (OP[1]) << 16) | GPR (OP[1] + 1);
  1105. else
  1106. tmp = ~((GPR (OP[1]) << 16) | GPR (OP[1] + 1));
  1107. foo = 0x40000000;
  1108. for (i=1;i<17;i++)
  1109. {
  1110. if (tmp & foo)
  1111. {
  1112. SET_GPR (OP[0], (i - 1));
  1113. trace_output_16 (i - 1);
  1114. return;
  1115. }
  1116. foo >>= 1;
  1117. }
  1118. SET_GPR (OP[0], 16);
  1119. trace_output_16 (16);
  1120. }
  1121. /* exp */
  1122. void
  1123. OP_15002A02 ()
  1124. {
  1125. int64 tmp, foo;
  1126. int i;
  1127. trace_input ("exp", OP_REG_OUTPUT, OP_ACCUM, OP_VOID);
  1128. tmp = SEXT40(ACC (OP[1]));
  1129. if (tmp < 0)
  1130. tmp = ~tmp & MASK40;
  1131. foo = 0x4000000000LL;
  1132. for (i=1;i<25;i++)
  1133. {
  1134. if (tmp & foo)
  1135. {
  1136. SET_GPR (OP[0], i - 9);
  1137. trace_output_16 (i - 9);
  1138. return;
  1139. }
  1140. foo >>= 1;
  1141. }
  1142. SET_GPR (OP[0], 16);
  1143. trace_output_16 (16);
  1144. }
  1145. /* jl */
  1146. void
  1147. OP_4D00 ()
  1148. {
  1149. trace_input ("jl", OP_REG, OP_R0, OP_R1);
  1150. SET_GPR (13, PC + 1);
  1151. JMP (GPR (OP[0]));
  1152. trace_output_void ();
  1153. }
  1154. /* jmp */
  1155. void
  1156. OP_4C00 ()
  1157. {
  1158. trace_input ("jmp", OP_REG,
  1159. (OP[0] == 13) ? OP_R0 : OP_VOID,
  1160. (OP[0] == 13) ? OP_R1 : OP_VOID);
  1161. JMP (GPR (OP[0]));
  1162. trace_output_void ();
  1163. }
  1164. /* ld */
  1165. void
  1166. OP_30000000 ()
  1167. {
  1168. uint16 tmp;
  1169. uint16 addr = OP[1] + GPR (OP[2]);
  1170. trace_input ("ld", OP_REG_OUTPUT, OP_MEMREF2, OP_VOID);
  1171. if ((addr & 1))
  1172. {
  1173. State.exception = SIG_D10V_BUS;
  1174. State.pc_changed = 1; /* Don't increment the PC. */
  1175. trace_output_void ();
  1176. return;
  1177. }
  1178. tmp = RW (addr);
  1179. SET_GPR (OP[0], tmp);
  1180. trace_output_16 (tmp);
  1181. }
  1182. /* ld */
  1183. void
  1184. OP_6401 ()
  1185. {
  1186. uint16 tmp;
  1187. uint16 addr = GPR (OP[1]);
  1188. trace_input ("ld", OP_REG_OUTPUT, OP_POSTDEC, OP_VOID);
  1189. if ((addr & 1))
  1190. {
  1191. State.exception = SIG_D10V_BUS;
  1192. State.pc_changed = 1; /* Don't increment the PC. */
  1193. trace_output_void ();
  1194. return;
  1195. }
  1196. tmp = RW (addr);
  1197. SET_GPR (OP[0], tmp);
  1198. if (OP[0] != OP[1])
  1199. INC_ADDR (OP[1], -2);
  1200. trace_output_16 (tmp);
  1201. }
  1202. /* ld */
  1203. void
  1204. OP_6001 ()
  1205. {
  1206. uint16 tmp;
  1207. uint16 addr = GPR (OP[1]);
  1208. trace_input ("ld", OP_REG_OUTPUT, OP_POSTINC, OP_VOID);
  1209. if ((addr & 1))
  1210. {
  1211. State.exception = SIG_D10V_BUS;
  1212. State.pc_changed = 1; /* Don't increment the PC. */
  1213. trace_output_void ();
  1214. return;
  1215. }
  1216. tmp = RW (addr);
  1217. SET_GPR (OP[0], tmp);
  1218. if (OP[0] != OP[1])
  1219. INC_ADDR (OP[1], 2);
  1220. trace_output_16 (tmp);
  1221. }
  1222. /* ld */
  1223. void
  1224. OP_6000 ()
  1225. {
  1226. uint16 tmp;
  1227. uint16 addr = GPR (OP[1]);
  1228. trace_input ("ld", OP_REG_OUTPUT, OP_MEMREF, OP_VOID);
  1229. if ((addr & 1))
  1230. {
  1231. State.exception = SIG_D10V_BUS;
  1232. State.pc_changed = 1; /* Don't increment the PC. */
  1233. trace_output_void ();
  1234. return;
  1235. }
  1236. tmp = RW (addr);
  1237. SET_GPR (OP[0], tmp);
  1238. trace_output_16 (tmp);
  1239. }
  1240. /* ld */
  1241. void
  1242. OP_32010000 ()
  1243. {
  1244. uint16 tmp;
  1245. uint16 addr = OP[1];
  1246. trace_input ("ld", OP_REG_OUTPUT, OP_MEMREF3, OP_VOID);
  1247. if ((addr & 1))
  1248. {
  1249. State.exception = SIG_D10V_BUS;
  1250. State.pc_changed = 1; /* Don't increment the PC. */
  1251. trace_output_void ();
  1252. return;
  1253. }
  1254. tmp = RW (addr);
  1255. SET_GPR (OP[0], tmp);
  1256. trace_output_16 (tmp);
  1257. }
  1258. /* ld2w */
  1259. void
  1260. OP_31000000 ()
  1261. {
  1262. int32 tmp;
  1263. uint16 addr = OP[1] + GPR (OP[2]);
  1264. trace_input ("ld2w", OP_REG_OUTPUT, OP_MEMREF2, OP_VOID);
  1265. if ((addr & 1))
  1266. {
  1267. State.exception = SIG_D10V_BUS;
  1268. State.pc_changed = 1; /* Don't increment the PC. */
  1269. trace_output_void ();
  1270. return;
  1271. }
  1272. tmp = RLW (addr);
  1273. SET_GPR32 (OP[0], tmp);
  1274. trace_output_32 (tmp);
  1275. }
  1276. /* ld2w */
  1277. void
  1278. OP_6601 ()
  1279. {
  1280. uint16 addr = GPR (OP[1]);
  1281. int32 tmp;
  1282. trace_input ("ld2w", OP_REG_OUTPUT, OP_POSTDEC, OP_VOID);
  1283. if ((addr & 1))
  1284. {
  1285. State.exception = SIG_D10V_BUS;
  1286. State.pc_changed = 1; /* Don't increment the PC. */
  1287. trace_output_void ();
  1288. return;
  1289. }
  1290. tmp = RLW (addr);
  1291. SET_GPR32 (OP[0], tmp);
  1292. if (OP[0] != OP[1] && ((OP[0] + 1) != OP[1]))
  1293. INC_ADDR (OP[1], -4);
  1294. trace_output_32 (tmp);
  1295. }
  1296. /* ld2w */
  1297. void
  1298. OP_6201 ()
  1299. {
  1300. int32 tmp;
  1301. uint16 addr = GPR (OP[1]);
  1302. trace_input ("ld2w", OP_REG_OUTPUT, OP_POSTINC, OP_VOID);
  1303. if ((addr & 1))
  1304. {
  1305. State.exception = SIG_D10V_BUS;
  1306. State.pc_changed = 1; /* Don't increment the PC. */
  1307. trace_output_void ();
  1308. return;
  1309. }
  1310. tmp = RLW (addr);
  1311. SET_GPR32 (OP[0], tmp);
  1312. if (OP[0] != OP[1] && ((OP[0] + 1) != OP[1]))
  1313. INC_ADDR (OP[1], 4);
  1314. trace_output_32 (tmp);
  1315. }
  1316. /* ld2w */
  1317. void
  1318. OP_6200 ()
  1319. {
  1320. uint16 addr = GPR (OP[1]);
  1321. int32 tmp;
  1322. trace_input ("ld2w", OP_REG_OUTPUT, OP_MEMREF, OP_VOID);
  1323. if ((addr & 1))
  1324. {
  1325. State.exception = SIG_D10V_BUS;
  1326. State.pc_changed = 1; /* Don't increment the PC. */
  1327. trace_output_void ();
  1328. return;
  1329. }
  1330. tmp = RLW (addr);
  1331. SET_GPR32 (OP[0], tmp);
  1332. trace_output_32 (tmp);
  1333. }
  1334. /* ld2w */
  1335. void
  1336. OP_33010000 ()
  1337. {
  1338. int32 tmp;
  1339. uint16 addr = OP[1];
  1340. trace_input ("ld2w", OP_REG_OUTPUT, OP_MEMREF3, OP_VOID);
  1341. if ((addr & 1))
  1342. {
  1343. State.exception = SIG_D10V_BUS;
  1344. State.pc_changed = 1; /* Don't increment the PC. */
  1345. trace_output_void ();
  1346. return;
  1347. }
  1348. tmp = RLW (addr);
  1349. SET_GPR32 (OP[0], tmp);
  1350. trace_output_32 (tmp);
  1351. }
  1352. /* ldb */
  1353. void
  1354. OP_38000000 ()
  1355. {
  1356. int16 tmp;
  1357. trace_input ("ldb", OP_REG_OUTPUT, OP_MEMREF2, OP_VOID);
  1358. tmp = SEXT8 (RB (OP[1] + GPR (OP[2])));
  1359. SET_GPR (OP[0], tmp);
  1360. trace_output_16 (tmp);
  1361. }
  1362. /* ldb */
  1363. void
  1364. OP_7000 ()
  1365. {
  1366. int16 tmp;
  1367. trace_input ("ldb", OP_REG_OUTPUT, OP_MEMREF, OP_VOID);
  1368. tmp = SEXT8 (RB (GPR (OP[1])));
  1369. SET_GPR (OP[0], tmp);
  1370. trace_output_16 (tmp);
  1371. }
  1372. /* ldi.s */
  1373. void
  1374. OP_4001 ()
  1375. {
  1376. int16 tmp;
  1377. trace_input ("ldi.s", OP_REG_OUTPUT, OP_CONSTANT4, OP_VOID);
  1378. tmp = SEXT4 (OP[1]);
  1379. SET_GPR (OP[0], tmp);
  1380. trace_output_16 (tmp);
  1381. }
  1382. /* ldi.l */
  1383. void
  1384. OP_20000000 ()
  1385. {
  1386. int16 tmp;
  1387. trace_input ("ldi.l", OP_REG_OUTPUT, OP_CONSTANT16, OP_VOID);
  1388. tmp = OP[1];
  1389. SET_GPR (OP[0], tmp);
  1390. trace_output_16 (tmp);
  1391. }
  1392. /* ldub */
  1393. void
  1394. OP_39000000 ()
  1395. {
  1396. int16 tmp;
  1397. trace_input ("ldub", OP_REG_OUTPUT, OP_MEMREF2, OP_VOID);
  1398. tmp = RB (OP[1] + GPR (OP[2]));
  1399. SET_GPR (OP[0], tmp);
  1400. trace_output_16 (tmp);
  1401. }
  1402. /* ldub */
  1403. void
  1404. OP_7200 ()
  1405. {
  1406. int16 tmp;
  1407. trace_input ("ldub", OP_REG_OUTPUT, OP_MEMREF, OP_VOID);
  1408. tmp = RB (GPR (OP[1]));
  1409. SET_GPR (OP[0], tmp);
  1410. trace_output_16 (tmp);
  1411. }
  1412. /* mac */
  1413. void
  1414. OP_2A00 ()
  1415. {
  1416. int64 tmp;
  1417. trace_input ("mac", OP_ACCUM, OP_REG, OP_REG);
  1418. tmp = SEXT40 ((int16)(GPR (OP[1])) * (int16)(GPR (OP[2])));
  1419. if (PSW_FX)
  1420. tmp = SEXT40( (tmp << 1) & MASK40);
  1421. if (PSW_ST && tmp > SEXT40(MAX32))
  1422. tmp = (MAX32);
  1423. tmp += SEXT40 (ACC (OP[0]));
  1424. if (PSW_ST)
  1425. {
  1426. if (tmp > SEXT40(MAX32))
  1427. tmp = (MAX32);
  1428. else if (tmp < SEXT40(MIN32))
  1429. tmp = (MIN32);
  1430. else
  1431. tmp = (tmp & MASK40);
  1432. }
  1433. else
  1434. tmp = (tmp & MASK40);
  1435. SET_ACC (OP[0], tmp);
  1436. trace_output_40 (tmp);
  1437. }
  1438. /* macsu */
  1439. void
  1440. OP_1A00 ()
  1441. {
  1442. int64 tmp;
  1443. trace_input ("macsu", OP_ACCUM, OP_REG, OP_REG);
  1444. tmp = SEXT40 ((int16) GPR (OP[1]) * GPR (OP[2]));
  1445. if (PSW_FX)
  1446. tmp = SEXT40 ((tmp << 1) & MASK40);
  1447. tmp = ((SEXT40 (ACC (OP[0])) + tmp) & MASK40);
  1448. SET_ACC (OP[0], tmp);
  1449. trace_output_40 (tmp);
  1450. }
  1451. /* macu */
  1452. void
  1453. OP_3A00 ()
  1454. {
  1455. uint64 tmp;
  1456. uint32 src1;
  1457. uint32 src2;
  1458. trace_input ("macu", OP_ACCUM, OP_REG, OP_REG);
  1459. src1 = (uint16) GPR (OP[1]);
  1460. src2 = (uint16) GPR (OP[2]);
  1461. tmp = src1 * src2;
  1462. if (PSW_FX)
  1463. tmp = (tmp << 1);
  1464. tmp = ((ACC (OP[0]) + tmp) & MASK40);
  1465. SET_ACC (OP[0], tmp);
  1466. trace_output_40 (tmp);
  1467. }
  1468. /* max */
  1469. void
  1470. OP_2600 ()
  1471. {
  1472. int16 tmp;
  1473. trace_input ("max", OP_REG, OP_REG, OP_VOID);
  1474. SET_PSW_F1 (PSW_F0);
  1475. if ((int16) GPR (OP[1]) > (int16)GPR (OP[0]))
  1476. {
  1477. tmp = GPR (OP[1]);
  1478. SET_PSW_F0 (1);
  1479. }
  1480. else
  1481. {
  1482. tmp = GPR (OP[0]);
  1483. SET_PSW_F0 (0);
  1484. }
  1485. SET_GPR (OP[0], tmp);
  1486. trace_output_16 (tmp);
  1487. }
  1488. /* max */
  1489. void
  1490. OP_3600 ()
  1491. {
  1492. int64 tmp;
  1493. trace_input ("max", OP_ACCUM, OP_DREG, OP_VOID);
  1494. SET_PSW_F1 (PSW_F0);
  1495. tmp = SEXT16 (GPR (OP[1])) << 16 | GPR (OP[1] + 1);
  1496. if (tmp > SEXT40 (ACC (OP[0])))
  1497. {
  1498. tmp = (tmp & MASK40);
  1499. SET_PSW_F0 (1);
  1500. }
  1501. else
  1502. {
  1503. tmp = ACC (OP[0]);
  1504. SET_PSW_F0 (0);
  1505. }
  1506. SET_ACC (OP[0], tmp);
  1507. trace_output_40 (tmp);
  1508. }
  1509. /* max */
  1510. void
  1511. OP_3602 ()
  1512. {
  1513. int64 tmp;
  1514. trace_input ("max", OP_ACCUM, OP_ACCUM, OP_VOID);
  1515. SET_PSW_F1 (PSW_F0);
  1516. if (SEXT40 (ACC (OP[1])) > SEXT40 (ACC (OP[0])))
  1517. {
  1518. tmp = ACC (OP[1]);
  1519. SET_PSW_F0 (1);
  1520. }
  1521. else
  1522. {
  1523. tmp = ACC (OP[0]);
  1524. SET_PSW_F0 (0);
  1525. }
  1526. SET_ACC (OP[0], tmp);
  1527. trace_output_40 (tmp);
  1528. }
  1529. /* min */
  1530. void
  1531. OP_2601 ()
  1532. {
  1533. int16 tmp;
  1534. trace_input ("min", OP_REG, OP_REG, OP_VOID);
  1535. SET_PSW_F1 (PSW_F0);
  1536. if ((int16)GPR (OP[1]) < (int16)GPR (OP[0]))
  1537. {
  1538. tmp = GPR (OP[1]);
  1539. SET_PSW_F0 (1);
  1540. }
  1541. else
  1542. {
  1543. tmp = GPR (OP[0]);
  1544. SET_PSW_F0 (0);
  1545. }
  1546. SET_GPR (OP[0], tmp);
  1547. trace_output_16 (tmp);
  1548. }
  1549. /* min */
  1550. void
  1551. OP_3601 ()
  1552. {
  1553. int64 tmp;
  1554. trace_input ("min", OP_ACCUM, OP_DREG, OP_VOID);
  1555. SET_PSW_F1 (PSW_F0);
  1556. tmp = SEXT16 (GPR (OP[1])) << 16 | GPR (OP[1] + 1);
  1557. if (tmp < SEXT40(ACC (OP[0])))
  1558. {
  1559. tmp = (tmp & MASK40);
  1560. SET_PSW_F0 (1);
  1561. }
  1562. else
  1563. {
  1564. tmp = ACC (OP[0]);
  1565. SET_PSW_F0 (0);
  1566. }
  1567. SET_ACC (OP[0], tmp);
  1568. trace_output_40 (tmp);
  1569. }
  1570. /* min */
  1571. void
  1572. OP_3603 ()
  1573. {
  1574. int64 tmp;
  1575. trace_input ("min", OP_ACCUM, OP_ACCUM, OP_VOID);
  1576. SET_PSW_F1 (PSW_F0);
  1577. if (SEXT40(ACC (OP[1])) < SEXT40(ACC (OP[0])))
  1578. {
  1579. tmp = ACC (OP[1]);
  1580. SET_PSW_F0 (1);
  1581. }
  1582. else
  1583. {
  1584. tmp = ACC (OP[0]);
  1585. SET_PSW_F0 (0);
  1586. }
  1587. SET_ACC (OP[0], tmp);
  1588. trace_output_40 (tmp);
  1589. }
  1590. /* msb */
  1591. void
  1592. OP_2800 ()
  1593. {
  1594. int64 tmp;
  1595. trace_input ("msb", OP_ACCUM, OP_REG, OP_REG);
  1596. tmp = SEXT40 ((int16)(GPR (OP[1])) * (int16)(GPR (OP[2])));
  1597. if (PSW_FX)
  1598. tmp = SEXT40 ((tmp << 1) & MASK40);
  1599. if (PSW_ST && tmp > SEXT40(MAX32))
  1600. tmp = (MAX32);
  1601. tmp = SEXT40(ACC (OP[0])) - tmp;
  1602. if (PSW_ST)
  1603. {
  1604. if (tmp > SEXT40(MAX32))
  1605. tmp = (MAX32);
  1606. else if (tmp < SEXT40(MIN32))
  1607. tmp = (MIN32);
  1608. else
  1609. tmp = (tmp & MASK40);
  1610. }
  1611. else
  1612. {
  1613. tmp = (tmp & MASK40);
  1614. }
  1615. SET_ACC (OP[0], tmp);
  1616. trace_output_40 (tmp);
  1617. }
  1618. /* msbsu */
  1619. void
  1620. OP_1800 ()
  1621. {
  1622. int64 tmp;
  1623. trace_input ("msbsu", OP_ACCUM, OP_REG, OP_REG);
  1624. tmp = SEXT40 ((int16)GPR (OP[1]) * GPR (OP[2]));
  1625. if (PSW_FX)
  1626. tmp = SEXT40( (tmp << 1) & MASK40);
  1627. tmp = ((SEXT40 (ACC (OP[0])) - tmp) & MASK40);
  1628. SET_ACC (OP[0], tmp);
  1629. trace_output_40 (tmp);
  1630. }
  1631. /* msbu */
  1632. void
  1633. OP_3800 ()
  1634. {
  1635. uint64 tmp;
  1636. uint32 src1;
  1637. uint32 src2;
  1638. trace_input ("msbu", OP_ACCUM, OP_REG, OP_REG);
  1639. src1 = (uint16) GPR (OP[1]);
  1640. src2 = (uint16) GPR (OP[2]);
  1641. tmp = src1 * src2;
  1642. if (PSW_FX)
  1643. tmp = (tmp << 1);
  1644. tmp = ((ACC (OP[0]) - tmp) & MASK40);
  1645. SET_ACC (OP[0], tmp);
  1646. trace_output_40 (tmp);
  1647. }
  1648. /* mul */
  1649. void
  1650. OP_2E00 ()
  1651. {
  1652. int16 tmp;
  1653. trace_input ("mul", OP_REG, OP_REG, OP_VOID);
  1654. tmp = GPR (OP[0]) * GPR (OP[1]);
  1655. SET_GPR (OP[0], tmp);
  1656. trace_output_16 (tmp);
  1657. }
  1658. /* mulx */
  1659. void
  1660. OP_2C00 ()
  1661. {
  1662. int64 tmp;
  1663. trace_input ("mulx", OP_ACCUM_OUTPUT, OP_REG, OP_REG);
  1664. tmp = SEXT40 ((int16)(GPR (OP[1])) * (int16)(GPR (OP[2])));
  1665. if (PSW_FX)
  1666. tmp = SEXT40 ((tmp << 1) & MASK40);
  1667. if (PSW_ST && tmp > SEXT40(MAX32))
  1668. tmp = (MAX32);
  1669. else
  1670. tmp = (tmp & MASK40);
  1671. SET_ACC (OP[0], tmp);
  1672. trace_output_40 (tmp);
  1673. }
  1674. /* mulxsu */
  1675. void
  1676. OP_1C00 ()
  1677. {
  1678. int64 tmp;
  1679. trace_input ("mulxsu", OP_ACCUM_OUTPUT, OP_REG, OP_REG);
  1680. tmp = SEXT40 ((int16)(GPR (OP[1])) * GPR (OP[2]));
  1681. if (PSW_FX)
  1682. tmp <<= 1;
  1683. tmp = (tmp & MASK40);
  1684. SET_ACC (OP[0], tmp);
  1685. trace_output_40 (tmp);
  1686. }
  1687. /* mulxu */
  1688. void
  1689. OP_3C00 ()
  1690. {
  1691. uint64 tmp;
  1692. uint32 src1;
  1693. uint32 src2;
  1694. trace_input ("mulxu", OP_ACCUM_OUTPUT, OP_REG, OP_REG);
  1695. src1 = (uint16) GPR (OP[1]);
  1696. src2 = (uint16) GPR (OP[2]);
  1697. tmp = src1 * src2;
  1698. if (PSW_FX)
  1699. tmp <<= 1;
  1700. tmp = (tmp & MASK40);
  1701. SET_ACC (OP[0], tmp);
  1702. trace_output_40 (tmp);
  1703. }
  1704. /* mv */
  1705. void
  1706. OP_4000 ()
  1707. {
  1708. int16 tmp;
  1709. trace_input ("mv", OP_REG_OUTPUT, OP_REG, OP_VOID);
  1710. tmp = GPR (OP[1]);
  1711. SET_GPR (OP[0], tmp);
  1712. trace_output_16 (tmp);
  1713. }
  1714. /* mv2w */
  1715. void
  1716. OP_5000 ()
  1717. {
  1718. int32 tmp;
  1719. trace_input ("mv2w", OP_DREG_OUTPUT, OP_DREG, OP_VOID);
  1720. tmp = GPR32 (OP[1]);
  1721. SET_GPR32 (OP[0], tmp);
  1722. trace_output_32 (tmp);
  1723. }
  1724. /* mv2wfac */
  1725. void
  1726. OP_3E00 ()
  1727. {
  1728. int32 tmp;
  1729. trace_input ("mv2wfac", OP_DREG_OUTPUT, OP_ACCUM, OP_VOID);
  1730. tmp = ACC (OP[1]);
  1731. SET_GPR32 (OP[0], tmp);
  1732. trace_output_32 (tmp);
  1733. }
  1734. /* mv2wtac */
  1735. void
  1736. OP_3E01 ()
  1737. {
  1738. int64 tmp;
  1739. trace_input ("mv2wtac", OP_DREG, OP_ACCUM_OUTPUT, OP_VOID);
  1740. tmp = ((SEXT16 (GPR (OP[0])) << 16 | GPR (OP[0] + 1)) & MASK40);
  1741. SET_ACC (OP[1], tmp);
  1742. trace_output_40 (tmp);
  1743. }
  1744. /* mvac */
  1745. void
  1746. OP_3E03 ()
  1747. {
  1748. int64 tmp;
  1749. trace_input ("mvac", OP_ACCUM_OUTPUT, OP_ACCUM, OP_VOID);
  1750. tmp = ACC (OP[1]);
  1751. SET_ACC (OP[0], tmp);
  1752. trace_output_40 (tmp);
  1753. }
  1754. /* mvb */
  1755. void
  1756. OP_5400 ()
  1757. {
  1758. int16 tmp;
  1759. trace_input ("mvb", OP_REG_OUTPUT, OP_REG, OP_VOID);
  1760. tmp = SEXT8 (GPR (OP[1]) & 0xff);
  1761. SET_GPR (OP[0], tmp);
  1762. trace_output_16 (tmp);
  1763. }
  1764. /* mvf0f */
  1765. void
  1766. OP_4400 ()
  1767. {
  1768. int16 tmp;
  1769. trace_input ("mvf0f", OP_REG_OUTPUT, OP_REG, OP_VOID);
  1770. if (PSW_F0 == 0)
  1771. {
  1772. tmp = GPR (OP[1]);
  1773. SET_GPR (OP[0], tmp);
  1774. }
  1775. else
  1776. tmp = GPR (OP[0]);
  1777. trace_output_16 (tmp);
  1778. }
  1779. /* mvf0t */
  1780. void
  1781. OP_4401 ()
  1782. {
  1783. int16 tmp;
  1784. trace_input ("mvf0t", OP_REG_OUTPUT, OP_REG, OP_VOID);
  1785. if (PSW_F0)
  1786. {
  1787. tmp = GPR (OP[1]);
  1788. SET_GPR (OP[0], tmp);
  1789. }
  1790. else
  1791. tmp = GPR (OP[0]);
  1792. trace_output_16 (tmp);
  1793. }
  1794. /* mvfacg */
  1795. void
  1796. OP_1E04 ()
  1797. {
  1798. int16 tmp;
  1799. trace_input ("mvfacg", OP_REG_OUTPUT, OP_ACCUM, OP_VOID);
  1800. tmp = ((ACC (OP[1]) >> 32) & 0xff);
  1801. SET_GPR (OP[0], tmp);
  1802. trace_output_16 (tmp);
  1803. }
  1804. /* mvfachi */
  1805. void
  1806. OP_1E00 ()
  1807. {
  1808. int16 tmp;
  1809. trace_input ("mvfachi", OP_REG_OUTPUT, OP_ACCUM, OP_VOID);
  1810. tmp = (ACC (OP[1]) >> 16);
  1811. SET_GPR (OP[0], tmp);
  1812. trace_output_16 (tmp);
  1813. }
  1814. /* mvfaclo */
  1815. void
  1816. OP_1E02 ()
  1817. {
  1818. int16 tmp;
  1819. trace_input ("mvfaclo", OP_REG_OUTPUT, OP_ACCUM, OP_VOID);
  1820. tmp = ACC (OP[1]);
  1821. SET_GPR (OP[0], tmp);
  1822. trace_output_16 (tmp);
  1823. }
  1824. /* mvfc */
  1825. void
  1826. OP_5200 ()
  1827. {
  1828. int16 tmp;
  1829. trace_input ("mvfc", OP_REG_OUTPUT, OP_CR, OP_VOID);
  1830. tmp = CREG (OP[1]);
  1831. SET_GPR (OP[0], tmp);
  1832. trace_output_16 (tmp);
  1833. }
  1834. /* mvtacg */
  1835. void
  1836. OP_1E41 ()
  1837. {
  1838. int64 tmp;
  1839. trace_input ("mvtacg", OP_REG, OP_ACCUM, OP_VOID);
  1840. tmp = ((ACC (OP[1]) & MASK32)
  1841. | ((int64)(GPR (OP[0]) & 0xff) << 32));
  1842. SET_ACC (OP[1], tmp);
  1843. trace_output_40 (tmp);
  1844. }
  1845. /* mvtachi */
  1846. void
  1847. OP_1E01 ()
  1848. {
  1849. uint64 tmp;
  1850. trace_input ("mvtachi", OP_REG, OP_ACCUM, OP_VOID);
  1851. tmp = ACC (OP[1]) & 0xffff;
  1852. tmp = ((SEXT16 (GPR (OP[0])) << 16 | tmp) & MASK40);
  1853. SET_ACC (OP[1], tmp);
  1854. trace_output_40 (tmp);
  1855. }
  1856. /* mvtaclo */
  1857. void
  1858. OP_1E21 ()
  1859. {
  1860. int64 tmp;
  1861. trace_input ("mvtaclo", OP_REG, OP_ACCUM, OP_VOID);
  1862. tmp = ((SEXT16 (GPR (OP[0]))) & MASK40);
  1863. SET_ACC (OP[1], tmp);
  1864. trace_output_40 (tmp);
  1865. }
  1866. /* mvtc */
  1867. void
  1868. OP_5600 ()
  1869. {
  1870. int16 tmp;
  1871. trace_input ("mvtc", OP_REG, OP_CR_OUTPUT, OP_VOID);
  1872. tmp = GPR (OP[0]);
  1873. tmp = SET_CREG (OP[1], tmp);
  1874. trace_output_16 (tmp);
  1875. }
  1876. /* mvub */
  1877. void
  1878. OP_5401 ()
  1879. {
  1880. int16 tmp;
  1881. trace_input ("mvub", OP_REG_OUTPUT, OP_REG, OP_VOID);
  1882. tmp = (GPR (OP[1]) & 0xff);
  1883. SET_GPR (OP[0], tmp);
  1884. trace_output_16 (tmp);
  1885. }
  1886. /* neg */
  1887. void
  1888. OP_4605 ()
  1889. {
  1890. int16 tmp;
  1891. trace_input ("neg", OP_REG, OP_VOID, OP_VOID);
  1892. tmp = - GPR (OP[0]);
  1893. SET_GPR (OP[0], tmp);
  1894. trace_output_16 (tmp);
  1895. }
  1896. /* neg */
  1897. void
  1898. OP_5605 ()
  1899. {
  1900. int64 tmp;
  1901. trace_input ("neg", OP_ACCUM, OP_VOID, OP_VOID);
  1902. tmp = -SEXT40(ACC (OP[0]));
  1903. if (PSW_ST)
  1904. {
  1905. if (tmp > SEXT40(MAX32))
  1906. tmp = (MAX32);
  1907. else if (tmp < SEXT40(MIN32))
  1908. tmp = (MIN32);
  1909. else
  1910. tmp = (tmp & MASK40);
  1911. }
  1912. else
  1913. tmp = (tmp & MASK40);
  1914. SET_ACC (OP[0], tmp);
  1915. trace_output_40 (tmp);
  1916. }
  1917. /* nop */
  1918. void
  1919. OP_5E00 ()
  1920. {
  1921. trace_input ("nop", OP_VOID, OP_VOID, OP_VOID);
  1922. ins_type_counters[ (int)State.ins_type ]--; /* don't count nops as normal instructions */
  1923. switch (State.ins_type)
  1924. {
  1925. default:
  1926. ins_type_counters[ (int)INS_UNKNOWN ]++;
  1927. break;
  1928. case INS_LEFT_PARALLEL:
  1929. /* Don't count a parallel op that includes a NOP as a true parallel op */
  1930. ins_type_counters[ (int)INS_RIGHT_PARALLEL ]--;
  1931. ins_type_counters[ (int)INS_RIGHT ]++;
  1932. ins_type_counters[ (int)INS_LEFT_NOPS ]++;
  1933. break;
  1934. case INS_LEFT:
  1935. case INS_LEFT_COND_EXE:
  1936. ins_type_counters[ (int)INS_LEFT_NOPS ]++;
  1937. break;
  1938. case INS_RIGHT_PARALLEL:
  1939. /* Don't count a parallel op that includes a NOP as a true parallel op */
  1940. ins_type_counters[ (int)INS_LEFT_PARALLEL ]--;
  1941. ins_type_counters[ (int)INS_LEFT ]++;
  1942. ins_type_counters[ (int)INS_RIGHT_NOPS ]++;
  1943. break;
  1944. case INS_RIGHT:
  1945. case INS_RIGHT_COND_EXE:
  1946. ins_type_counters[ (int)INS_RIGHT_NOPS ]++;
  1947. break;
  1948. }
  1949. trace_output_void ();
  1950. }
  1951. /* not */
  1952. void
  1953. OP_4603 ()
  1954. {
  1955. int16 tmp;
  1956. trace_input ("not", OP_REG, OP_VOID, OP_VOID);
  1957. tmp = ~GPR (OP[0]);
  1958. SET_GPR (OP[0], tmp);
  1959. trace_output_16 (tmp);
  1960. }
  1961. /* or */
  1962. void
  1963. OP_800 ()
  1964. {
  1965. int16 tmp;
  1966. trace_input ("or", OP_REG, OP_REG, OP_VOID);
  1967. tmp = (GPR (OP[0]) | GPR (OP[1]));
  1968. SET_GPR (OP[0], tmp);
  1969. trace_output_16 (tmp);
  1970. }
  1971. /* or3 */
  1972. void
  1973. OP_4000000 ()
  1974. {
  1975. int16 tmp;
  1976. trace_input ("or3", OP_REG_OUTPUT, OP_REG, OP_CONSTANT16);
  1977. tmp = (GPR (OP[1]) | OP[2]);
  1978. SET_GPR (OP[0], tmp);
  1979. trace_output_16 (tmp);
  1980. }
  1981. /* rac */
  1982. void
  1983. OP_5201 ()
  1984. {
  1985. int64 tmp;
  1986. int shift = SEXT3 (OP[2]);
  1987. trace_input ("rac", OP_DREG_OUTPUT, OP_ACCUM, OP_CONSTANT3);
  1988. if (OP[1] != 0)
  1989. {
  1990. (*d10v_callback->printf_filtered) (d10v_callback,
  1991. "ERROR at PC 0x%x: instruction only valid for A0\n",
  1992. PC<<2);
  1993. State.exception = SIGILL;
  1994. }
  1995. SET_PSW_F1 (PSW_F0);
  1996. tmp = SEXT56 ((ACC (0) << 16) | (ACC (1) & 0xffff));
  1997. if (shift >=0)
  1998. tmp <<= shift;
  1999. else
  2000. tmp >>= -shift;
  2001. tmp += 0x8000;
  2002. tmp >>= 16; /* look at bits 0:43 */
  2003. if (tmp > SEXT44 (SIGNED64 (0x0007fffffff)))
  2004. {
  2005. tmp = 0x7fffffff;
  2006. SET_PSW_F0 (1);
  2007. }
  2008. else if (tmp < SEXT44 (SIGNED64 (0xfff80000000)))
  2009. {
  2010. tmp = 0x80000000;
  2011. SET_PSW_F0 (1);
  2012. }
  2013. else
  2014. {
  2015. SET_PSW_F0 (0);
  2016. }
  2017. SET_GPR32 (OP[0], tmp);
  2018. trace_output_32 (tmp);
  2019. }
  2020. /* rachi */
  2021. void
  2022. OP_4201 ()
  2023. {
  2024. signed64 tmp;
  2025. int shift = SEXT3 (OP[2]);
  2026. trace_input ("rachi", OP_REG_OUTPUT, OP_ACCUM, OP_CONSTANT3);
  2027. SET_PSW_F1 (PSW_F0);
  2028. if (shift >=0)
  2029. tmp = SEXT40 (ACC (OP[1])) << shift;
  2030. else
  2031. tmp = SEXT40 (ACC (OP[1])) >> -shift;
  2032. tmp += 0x8000;
  2033. if (tmp > SEXT44 (SIGNED64 (0x0007fffffff)))
  2034. {
  2035. tmp = 0x7fff;
  2036. SET_PSW_F0 (1);
  2037. }
  2038. else if (tmp < SEXT44 (SIGNED64 (0xfff80000000)))
  2039. {
  2040. tmp = 0x8000;
  2041. SET_PSW_F0 (1);
  2042. }
  2043. else
  2044. {
  2045. tmp = (tmp >> 16);
  2046. SET_PSW_F0 (0);
  2047. }
  2048. SET_GPR (OP[0], tmp);
  2049. trace_output_16 (tmp);
  2050. }
  2051. /* rep */
  2052. void
  2053. OP_27000000 ()
  2054. {
  2055. trace_input ("rep", OP_REG, OP_CONSTANT16, OP_VOID);
  2056. SET_RPT_S (PC + 1);
  2057. SET_RPT_E (PC + OP[1]);
  2058. SET_RPT_C (GPR (OP[0]));
  2059. SET_PSW_RP (1);
  2060. if (GPR (OP[0]) == 0)
  2061. {
  2062. (*d10v_callback->printf_filtered) (d10v_callback, "ERROR: rep with count=0 is illegal.\n");
  2063. State.exception = SIGILL;
  2064. }
  2065. if (OP[1] < 4)
  2066. {
  2067. (*d10v_callback->printf_filtered) (d10v_callback, "ERROR: rep must include at least 4 instructions.\n");
  2068. State.exception = SIGILL;
  2069. }
  2070. trace_output_void ();
  2071. }
  2072. /* repi */
  2073. void
  2074. OP_2F000000 ()
  2075. {
  2076. trace_input ("repi", OP_CONSTANT16, OP_CONSTANT16, OP_VOID);
  2077. SET_RPT_S (PC + 1);
  2078. SET_RPT_E (PC + OP[1]);
  2079. SET_RPT_C (OP[0]);
  2080. SET_PSW_RP (1);
  2081. if (OP[0] == 0)
  2082. {
  2083. (*d10v_callback->printf_filtered) (d10v_callback, "ERROR: repi with count=0 is illegal.\n");
  2084. State.exception = SIGILL;
  2085. }
  2086. if (OP[1] < 4)
  2087. {
  2088. (*d10v_callback->printf_filtered) (d10v_callback, "ERROR: repi must include at least 4 instructions.\n");
  2089. State.exception = SIGILL;
  2090. }
  2091. trace_output_void ();
  2092. }
  2093. /* rtd */
  2094. void
  2095. OP_5F60 ()
  2096. {
  2097. trace_input ("rtd", OP_VOID, OP_VOID, OP_VOID);
  2098. SET_CREG (PSW_CR, DPSW);
  2099. JMP(DPC);
  2100. trace_output_void ();
  2101. }
  2102. /* rte */
  2103. void
  2104. OP_5F40 ()
  2105. {
  2106. trace_input ("rte", OP_VOID, OP_VOID, OP_VOID);
  2107. SET_CREG (PSW_CR, BPSW);
  2108. JMP(BPC);
  2109. trace_output_void ();
  2110. }
  2111. /* sac */
  2112. void OP_5209 ()
  2113. {
  2114. int64 tmp;
  2115. trace_input ("sac", OP_REG_OUTPUT, OP_ACCUM, OP_VOID);
  2116. tmp = SEXT40(ACC (OP[1]));
  2117. SET_PSW_F1 (PSW_F0);
  2118. if (tmp > SEXT40(MAX32))
  2119. {
  2120. tmp = (MAX32);
  2121. SET_PSW_F0 (1);
  2122. }
  2123. else if (tmp < SEXT40(MIN32))
  2124. {
  2125. tmp = 0x80000000;
  2126. SET_PSW_F0 (1);
  2127. }
  2128. else
  2129. {
  2130. tmp = (tmp & MASK32);
  2131. SET_PSW_F0 (0);
  2132. }
  2133. SET_GPR32 (OP[0], tmp);
  2134. trace_output_40 (tmp);
  2135. }
  2136. /* sachi */
  2137. void
  2138. OP_4209 ()
  2139. {
  2140. int64 tmp;
  2141. trace_input ("sachi", OP_REG_OUTPUT, OP_ACCUM, OP_VOID);
  2142. tmp = SEXT40(ACC (OP[1]));
  2143. SET_PSW_F1 (PSW_F0);
  2144. if (tmp > SEXT40(MAX32))
  2145. {
  2146. tmp = 0x7fff;
  2147. SET_PSW_F0 (1);
  2148. }
  2149. else if (tmp < SEXT40(MIN32))
  2150. {
  2151. tmp = 0x8000;
  2152. SET_PSW_F0 (1);
  2153. }
  2154. else
  2155. {
  2156. tmp >>= 16;
  2157. SET_PSW_F0 (0);
  2158. }
  2159. SET_GPR (OP[0], tmp);
  2160. trace_output_16 (OP[0]);
  2161. }
  2162. /* sadd */
  2163. void
  2164. OP_1223 ()
  2165. {
  2166. int64 tmp;
  2167. trace_input ("sadd", OP_ACCUM, OP_ACCUM, OP_VOID);
  2168. tmp = SEXT40(ACC (OP[0])) + (SEXT40(ACC (OP[1])) >> 16);
  2169. if (PSW_ST)
  2170. {
  2171. if (tmp > SEXT40(MAX32))
  2172. tmp = (MAX32);
  2173. else if (tmp < SEXT40(MIN32))
  2174. tmp = (MIN32);
  2175. else
  2176. tmp = (tmp & MASK40);
  2177. }
  2178. else
  2179. tmp = (tmp & MASK40);
  2180. SET_ACC (OP[0], tmp);
  2181. trace_output_40 (tmp);
  2182. }
  2183. /* setf0f */
  2184. void
  2185. OP_4611 ()
  2186. {
  2187. int16 tmp;
  2188. trace_input ("setf0f", OP_REG_OUTPUT, OP_VOID, OP_VOID);
  2189. tmp = ((PSW_F0 == 0) ? 1 : 0);
  2190. SET_GPR (OP[0], tmp);
  2191. trace_output_16 (tmp);
  2192. }
  2193. /* setf0t */
  2194. void
  2195. OP_4613 ()
  2196. {
  2197. int16 tmp;
  2198. trace_input ("setf0t", OP_REG_OUTPUT, OP_VOID, OP_VOID);
  2199. tmp = ((PSW_F0 == 1) ? 1 : 0);
  2200. SET_GPR (OP[0], tmp);
  2201. trace_output_16 (tmp);
  2202. }
  2203. /* slae */
  2204. void
  2205. OP_3220 ()
  2206. {
  2207. int64 tmp;
  2208. int16 reg;
  2209. trace_input ("slae", OP_ACCUM, OP_REG, OP_VOID);
  2210. reg = SEXT16 (GPR (OP[1]));
  2211. if (reg >= 17 || reg <= -17)
  2212. {
  2213. (*d10v_callback->printf_filtered) (d10v_callback, "ERROR: shift value %d too large.\n", reg);
  2214. State.exception = SIGILL;
  2215. return;
  2216. }
  2217. tmp = SEXT40 (ACC (OP[0]));
  2218. if (PSW_ST && (tmp < SEXT40 (MIN32) || tmp > SEXT40 (MAX32)))
  2219. {
  2220. (*d10v_callback->printf_filtered) (d10v_callback, "ERROR: accumulator value 0x%.2x%.8lx out of range\n", ((int)(tmp >> 32) & 0xff), ((unsigned long) tmp) & 0xffffffff);
  2221. State.exception = SIGILL;
  2222. return;
  2223. }
  2224. if (reg >= 0 && reg <= 16)
  2225. {
  2226. tmp = SEXT56 ((SEXT56 (tmp)) << (GPR (OP[1])));
  2227. if (PSW_ST)
  2228. {
  2229. if (tmp > SEXT40(MAX32))
  2230. tmp = (MAX32);
  2231. else if (tmp < SEXT40(MIN32))
  2232. tmp = (MIN32);
  2233. else
  2234. tmp = (tmp & MASK40);
  2235. }
  2236. else
  2237. tmp = (tmp & MASK40);
  2238. }
  2239. else
  2240. {
  2241. tmp = (SEXT40 (ACC (OP[0]))) >> (-GPR (OP[1]));
  2242. }
  2243. SET_ACC(OP[0], tmp);
  2244. trace_output_40(tmp);
  2245. }
  2246. /* sleep */
  2247. void
  2248. OP_5FC0 ()
  2249. {
  2250. trace_input ("sleep", OP_VOID, OP_VOID, OP_VOID);
  2251. SET_PSW_IE (1);
  2252. trace_output_void ();
  2253. }
  2254. /* sll */
  2255. void
  2256. OP_2200 ()
  2257. {
  2258. int16 tmp;
  2259. trace_input ("sll", OP_REG, OP_REG, OP_VOID);
  2260. tmp = (GPR (OP[0]) << (GPR (OP[1]) & 0xf));
  2261. SET_GPR (OP[0], tmp);
  2262. trace_output_16 (tmp);
  2263. }
  2264. /* sll */
  2265. void
  2266. OP_3200 ()
  2267. {
  2268. int64 tmp;
  2269. trace_input ("sll", OP_ACCUM, OP_REG, OP_VOID);
  2270. if ((GPR (OP[1]) & 31) <= 16)
  2271. tmp = SEXT40 (ACC (OP[0])) << (GPR (OP[1]) & 31);
  2272. else
  2273. {
  2274. (*d10v_callback->printf_filtered) (d10v_callback, "ERROR: shift value %d too large.\n", GPR (OP[1]) & 31);
  2275. State.exception = SIGILL;
  2276. return;
  2277. }
  2278. if (PSW_ST)
  2279. {
  2280. if (tmp > SEXT40(MAX32))
  2281. tmp = (MAX32);
  2282. else if (tmp < SEXT40(MIN32))
  2283. tmp = (MIN32);
  2284. else
  2285. tmp = (tmp & MASK40);
  2286. }
  2287. else
  2288. tmp = (tmp & MASK40);
  2289. SET_ACC (OP[0], tmp);
  2290. trace_output_40 (tmp);
  2291. }
  2292. /* slli */
  2293. void
  2294. OP_2201 ()
  2295. {
  2296. int16 tmp;
  2297. trace_input ("slli", OP_REG, OP_CONSTANT16, OP_VOID);
  2298. tmp = (GPR (OP[0]) << OP[1]);
  2299. SET_GPR (OP[0], tmp);
  2300. trace_output_16 (tmp);
  2301. }
  2302. /* slli */
  2303. void
  2304. OP_3201 ()
  2305. {
  2306. int64 tmp;
  2307. if (OP[1] == 0)
  2308. OP[1] = 16;
  2309. trace_input ("slli", OP_ACCUM, OP_CONSTANT16, OP_VOID);
  2310. tmp = SEXT40(ACC (OP[0])) << OP[1];
  2311. if (PSW_ST)
  2312. {
  2313. if (tmp > SEXT40(MAX32))
  2314. tmp = (MAX32);
  2315. else if (tmp < SEXT40(MIN32))
  2316. tmp = (MIN32);
  2317. else
  2318. tmp = (tmp & MASK40);
  2319. }
  2320. else
  2321. tmp = (tmp & MASK40);
  2322. SET_ACC (OP[0], tmp);
  2323. trace_output_40 (tmp);
  2324. }
  2325. /* slx */
  2326. void
  2327. OP_460B ()
  2328. {
  2329. int16 tmp;
  2330. trace_input ("slx", OP_REG, OP_VOID, OP_VOID);
  2331. tmp = ((GPR (OP[0]) << 1) | PSW_F0);
  2332. SET_GPR (OP[0], tmp);
  2333. trace_output_16 (tmp);
  2334. }
  2335. /* sra */
  2336. void
  2337. OP_2400 ()
  2338. {
  2339. int16 tmp;
  2340. trace_input ("sra", OP_REG, OP_REG, OP_VOID);
  2341. tmp = (((int16)(GPR (OP[0]))) >> (GPR (OP[1]) & 0xf));
  2342. SET_GPR (OP[0], tmp);
  2343. trace_output_16 (tmp);
  2344. }
  2345. /* sra */
  2346. void
  2347. OP_3400 ()
  2348. {
  2349. trace_input ("sra", OP_ACCUM, OP_REG, OP_VOID);
  2350. if ((GPR (OP[1]) & 31) <= 16)
  2351. {
  2352. int64 tmp = ((SEXT40(ACC (OP[0])) >> (GPR (OP[1]) & 31)) & MASK40);
  2353. SET_ACC (OP[0], tmp);
  2354. trace_output_40 (tmp);
  2355. }
  2356. else
  2357. {
  2358. (*d10v_callback->printf_filtered) (d10v_callback, "ERROR: shift value %d too large.\n", GPR (OP[1]) & 31);