sem.c 41 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665
  1. /* Simulator instruction semantics for lm32bf.
  2. THIS FILE IS MACHINE GENERATED WITH CGEN.
  3. Copyright 1996-2015 Free Software Foundation, Inc.
  4. This file is part of the GNU simulators.
  5. This file 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, or (at your option)
  8. any later version.
  9. It is distributed in the hope that it will be useful, but WITHOUT
  10. ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
  11. or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public
  12. License for more details.
  13. You should have received a copy of the GNU General Public License along
  14. with this program; if not, see <http://www.gnu.org/licenses/>.
  15. */
  16. #define WANT_CPU lm32bf
  17. #define WANT_CPU_LM32BF
  18. #include "sim-main.h"
  19. #include "cgen-mem.h"
  20. #include "cgen-ops.h"
  21. #undef GET_ATTR
  22. #define GET_ATTR(cpu, num, attr) CGEN_ATTR_VALUE (NULL, abuf->idesc->attrs, CGEN_INSN_##attr)
  23. /* This is used so that we can compile two copies of the semantic code,
  24. one with full feature support and one without that runs fast(er).
  25. FAST_P, when desired, is defined on the command line, -DFAST_P=1. */
  26. #if FAST_P
  27. #define SEM_FN_NAME(cpu,fn) XCONCAT3 (cpu,_semf_,fn)
  28. #undef CGEN_TRACE_RESULT
  29. #define CGEN_TRACE_RESULT(cpu, abuf, name, type, val)
  30. #else
  31. #define SEM_FN_NAME(cpu,fn) XCONCAT3 (cpu,_sem_,fn)
  32. #endif
  33. /* x-invalid: --invalid-- */
  34. static SEM_PC
  35. SEM_FN_NAME (lm32bf,x_invalid) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
  36. {
  37. #define FLD(f) abuf->fields.sfmt_empty.f
  38. ARGBUF *abuf = SEM_ARGBUF (sem_arg);
  39. int UNUSED written = 0;
  40. IADDR UNUSED pc = abuf->addr;
  41. SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 0);
  42. {
  43. /* Update the recorded pc in the cpu state struct.
  44. Only necessary for WITH_SCACHE case, but to avoid the
  45. conditional compilation .... */
  46. SET_H_PC (pc);
  47. /* Virtual insns have zero size. Overwrite vpc with address of next insn
  48. using the default-insn-bitsize spec. When executing insns in parallel
  49. we may want to queue the fault and continue execution. */
  50. vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
  51. vpc = sim_engine_invalid_insn (current_cpu, pc, vpc);
  52. }
  53. return vpc;
  54. #undef FLD
  55. }
  56. /* x-after: --after-- */
  57. static SEM_PC
  58. SEM_FN_NAME (lm32bf,x_after) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
  59. {
  60. #define FLD(f) abuf->fields.sfmt_empty.f
  61. ARGBUF *abuf = SEM_ARGBUF (sem_arg);
  62. int UNUSED written = 0;
  63. IADDR UNUSED pc = abuf->addr;
  64. SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 0);
  65. {
  66. #if WITH_SCACHE_PBB_LM32BF
  67. lm32bf_pbb_after (current_cpu, sem_arg);
  68. #endif
  69. }
  70. return vpc;
  71. #undef FLD
  72. }
  73. /* x-before: --before-- */
  74. static SEM_PC
  75. SEM_FN_NAME (lm32bf,x_before) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
  76. {
  77. #define FLD(f) abuf->fields.sfmt_empty.f
  78. ARGBUF *abuf = SEM_ARGBUF (sem_arg);
  79. int UNUSED written = 0;
  80. IADDR UNUSED pc = abuf->addr;
  81. SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 0);
  82. {
  83. #if WITH_SCACHE_PBB_LM32BF
  84. lm32bf_pbb_before (current_cpu, sem_arg);
  85. #endif
  86. }
  87. return vpc;
  88. #undef FLD
  89. }
  90. /* x-cti-chain: --cti-chain-- */
  91. static SEM_PC
  92. SEM_FN_NAME (lm32bf,x_cti_chain) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
  93. {
  94. #define FLD(f) abuf->fields.sfmt_empty.f
  95. ARGBUF *abuf = SEM_ARGBUF (sem_arg);
  96. int UNUSED written = 0;
  97. IADDR UNUSED pc = abuf->addr;
  98. SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 0);
  99. {
  100. #if WITH_SCACHE_PBB_LM32BF
  101. #ifdef DEFINE_SWITCH
  102. vpc = lm32bf_pbb_cti_chain (current_cpu, sem_arg,
  103. pbb_br_type, pbb_br_npc);
  104. BREAK (sem);
  105. #else
  106. /* FIXME: Allow provision of explicit ifmt spec in insn spec. */
  107. vpc = lm32bf_pbb_cti_chain (current_cpu, sem_arg,
  108. CPU_PBB_BR_TYPE (current_cpu),
  109. CPU_PBB_BR_NPC (current_cpu));
  110. #endif
  111. #endif
  112. }
  113. return vpc;
  114. #undef FLD
  115. }
  116. /* x-chain: --chain-- */
  117. static SEM_PC
  118. SEM_FN_NAME (lm32bf,x_chain) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
  119. {
  120. #define FLD(f) abuf->fields.sfmt_empty.f
  121. ARGBUF *abuf = SEM_ARGBUF (sem_arg);
  122. int UNUSED written = 0;
  123. IADDR UNUSED pc = abuf->addr;
  124. SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 0);
  125. {
  126. #if WITH_SCACHE_PBB_LM32BF
  127. vpc = lm32bf_pbb_chain (current_cpu, sem_arg);
  128. #ifdef DEFINE_SWITCH
  129. BREAK (sem);
  130. #endif
  131. #endif
  132. }
  133. return vpc;
  134. #undef FLD
  135. }
  136. /* x-begin: --begin-- */
  137. static SEM_PC
  138. SEM_FN_NAME (lm32bf,x_begin) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
  139. {
  140. #define FLD(f) abuf->fields.sfmt_empty.f
  141. ARGBUF *abuf = SEM_ARGBUF (sem_arg);
  142. int UNUSED written = 0;
  143. IADDR UNUSED pc = abuf->addr;
  144. SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 0);
  145. {
  146. #if WITH_SCACHE_PBB_LM32BF
  147. #if defined DEFINE_SWITCH || defined FAST_P
  148. /* In the switch case FAST_P is a constant, allowing several optimizations
  149. in any called inline functions. */
  150. vpc = lm32bf_pbb_begin (current_cpu, FAST_P);
  151. #else
  152. #if 0 /* cgen engine can't handle dynamic fast/full switching yet. */
  153. vpc = lm32bf_pbb_begin (current_cpu, STATE_RUN_FAST_P (CPU_STATE (current_cpu)));
  154. #else
  155. vpc = lm32bf_pbb_begin (current_cpu, 0);
  156. #endif
  157. #endif
  158. #endif
  159. }
  160. return vpc;
  161. #undef FLD
  162. }
  163. /* add: add $r2,$r0,$r1 */
  164. static SEM_PC
  165. SEM_FN_NAME (lm32bf,add) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
  166. {
  167. #define FLD(f) abuf->fields.sfmt_user.f
  168. ARGBUF *abuf = SEM_ARGBUF (sem_arg);
  169. int UNUSED written = 0;
  170. IADDR UNUSED pc = abuf->addr;
  171. SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
  172. {
  173. SI opval = ADDSI (CPU (h_gr[FLD (f_r0)]), CPU (h_gr[FLD (f_r1)]));
  174. CPU (h_gr[FLD (f_r2)]) = opval;
  175. CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
  176. }
  177. return vpc;
  178. #undef FLD
  179. }
  180. /* addi: addi $r1,$r0,$imm */
  181. static SEM_PC
  182. SEM_FN_NAME (lm32bf,addi) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
  183. {
  184. #define FLD(f) abuf->fields.sfmt_addi.f
  185. ARGBUF *abuf = SEM_ARGBUF (sem_arg);
  186. int UNUSED written = 0;
  187. IADDR UNUSED pc = abuf->addr;
  188. SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
  189. {
  190. SI opval = ADDSI (CPU (h_gr[FLD (f_r0)]), EXTHISI (TRUNCSIHI (FLD (f_imm))));
  191. CPU (h_gr[FLD (f_r1)]) = opval;
  192. CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
  193. }
  194. return vpc;
  195. #undef FLD
  196. }
  197. /* and: and $r2,$r0,$r1 */
  198. static SEM_PC
  199. SEM_FN_NAME (lm32bf,and) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
  200. {
  201. #define FLD(f) abuf->fields.sfmt_user.f
  202. ARGBUF *abuf = SEM_ARGBUF (sem_arg);
  203. int UNUSED written = 0;
  204. IADDR UNUSED pc = abuf->addr;
  205. SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
  206. {
  207. SI opval = ANDSI (CPU (h_gr[FLD (f_r0)]), CPU (h_gr[FLD (f_r1)]));
  208. CPU (h_gr[FLD (f_r2)]) = opval;
  209. CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
  210. }
  211. return vpc;
  212. #undef FLD
  213. }
  214. /* andi: andi $r1,$r0,$uimm */
  215. static SEM_PC
  216. SEM_FN_NAME (lm32bf,andi) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
  217. {
  218. #define FLD(f) abuf->fields.sfmt_andi.f
  219. ARGBUF *abuf = SEM_ARGBUF (sem_arg);
  220. int UNUSED written = 0;
  221. IADDR UNUSED pc = abuf->addr;
  222. SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
  223. {
  224. SI opval = ANDSI (CPU (h_gr[FLD (f_r0)]), ZEXTSISI (FLD (f_uimm)));
  225. CPU (h_gr[FLD (f_r1)]) = opval;
  226. CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
  227. }
  228. return vpc;
  229. #undef FLD
  230. }
  231. /* andhii: andhi $r1,$r0,$hi16 */
  232. static SEM_PC
  233. SEM_FN_NAME (lm32bf,andhii) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
  234. {
  235. #define FLD(f) abuf->fields.sfmt_andi.f
  236. ARGBUF *abuf = SEM_ARGBUF (sem_arg);
  237. int UNUSED written = 0;
  238. IADDR UNUSED pc = abuf->addr;
  239. SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
  240. {
  241. SI opval = ANDSI (CPU (h_gr[FLD (f_r0)]), SLLSI (FLD (f_uimm), 16));
  242. CPU (h_gr[FLD (f_r1)]) = opval;
  243. CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
  244. }
  245. return vpc;
  246. #undef FLD
  247. }
  248. /* b: b $r0 */
  249. static SEM_PC
  250. SEM_FN_NAME (lm32bf,b) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
  251. {
  252. #define FLD(f) abuf->fields.sfmt_be.f
  253. ARGBUF *abuf = SEM_ARGBUF (sem_arg);
  254. int UNUSED written = 0;
  255. IADDR UNUSED pc = abuf->addr;
  256. SEM_BRANCH_INIT
  257. SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
  258. {
  259. USI opval = lm32bf_b_insn (current_cpu, CPU (h_gr[FLD (f_r0)]), FLD (f_r0));
  260. SEM_BRANCH_VIA_ADDR (current_cpu, sem_arg, opval, vpc);
  261. CGEN_TRACE_RESULT (current_cpu, abuf, "pc", 'x', opval);
  262. }
  263. SEM_BRANCH_FINI (vpc);
  264. return vpc;
  265. #undef FLD
  266. }
  267. /* bi: bi $call */
  268. static SEM_PC
  269. SEM_FN_NAME (lm32bf,bi) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
  270. {
  271. #define FLD(f) abuf->fields.sfmt_bi.f
  272. ARGBUF *abuf = SEM_ARGBUF (sem_arg);
  273. int UNUSED written = 0;
  274. IADDR UNUSED pc = abuf->addr;
  275. SEM_BRANCH_INIT
  276. SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
  277. {
  278. USI opval = EXTSISI (FLD (i_call));
  279. SEM_BRANCH_VIA_ADDR (current_cpu, sem_arg, opval, vpc);
  280. CGEN_TRACE_RESULT (current_cpu, abuf, "pc", 'x', opval);
  281. }
  282. SEM_BRANCH_FINI (vpc);
  283. return vpc;
  284. #undef FLD
  285. }
  286. /* be: be $r0,$r1,$branch */
  287. static SEM_PC
  288. SEM_FN_NAME (lm32bf,be) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
  289. {
  290. #define FLD(f) abuf->fields.sfmt_be.f
  291. ARGBUF *abuf = SEM_ARGBUF (sem_arg);
  292. int UNUSED written = 0;
  293. IADDR UNUSED pc = abuf->addr;
  294. SEM_BRANCH_INIT
  295. SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
  296. if (EQSI (CPU (h_gr[FLD (f_r0)]), CPU (h_gr[FLD (f_r1)]))) {
  297. {
  298. USI opval = FLD (i_branch);
  299. SEM_BRANCH_VIA_CACHE (current_cpu, sem_arg, opval, vpc);
  300. written |= (1 << 3);
  301. CGEN_TRACE_RESULT (current_cpu, abuf, "pc", 'x', opval);
  302. }
  303. }
  304. abuf->written = written;
  305. SEM_BRANCH_FINI (vpc);
  306. return vpc;
  307. #undef FLD
  308. }
  309. /* bg: bg $r0,$r1,$branch */
  310. static SEM_PC
  311. SEM_FN_NAME (lm32bf,bg) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
  312. {
  313. #define FLD(f) abuf->fields.sfmt_be.f
  314. ARGBUF *abuf = SEM_ARGBUF (sem_arg);
  315. int UNUSED written = 0;
  316. IADDR UNUSED pc = abuf->addr;
  317. SEM_BRANCH_INIT
  318. SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
  319. if (GTSI (CPU (h_gr[FLD (f_r0)]), CPU (h_gr[FLD (f_r1)]))) {
  320. {
  321. USI opval = FLD (i_branch);
  322. SEM_BRANCH_VIA_CACHE (current_cpu, sem_arg, opval, vpc);
  323. written |= (1 << 3);
  324. CGEN_TRACE_RESULT (current_cpu, abuf, "pc", 'x', opval);
  325. }
  326. }
  327. abuf->written = written;
  328. SEM_BRANCH_FINI (vpc);
  329. return vpc;
  330. #undef FLD
  331. }
  332. /* bge: bge $r0,$r1,$branch */
  333. static SEM_PC
  334. SEM_FN_NAME (lm32bf,bge) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
  335. {
  336. #define FLD(f) abuf->fields.sfmt_be.f
  337. ARGBUF *abuf = SEM_ARGBUF (sem_arg);
  338. int UNUSED written = 0;
  339. IADDR UNUSED pc = abuf->addr;
  340. SEM_BRANCH_INIT
  341. SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
  342. if (GESI (CPU (h_gr[FLD (f_r0)]), CPU (h_gr[FLD (f_r1)]))) {
  343. {
  344. USI opval = FLD (i_branch);
  345. SEM_BRANCH_VIA_CACHE (current_cpu, sem_arg, opval, vpc);
  346. written |= (1 << 3);
  347. CGEN_TRACE_RESULT (current_cpu, abuf, "pc", 'x', opval);
  348. }
  349. }
  350. abuf->written = written;
  351. SEM_BRANCH_FINI (vpc);
  352. return vpc;
  353. #undef FLD
  354. }
  355. /* bgeu: bgeu $r0,$r1,$branch */
  356. static SEM_PC
  357. SEM_FN_NAME (lm32bf,bgeu) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
  358. {
  359. #define FLD(f) abuf->fields.sfmt_be.f
  360. ARGBUF *abuf = SEM_ARGBUF (sem_arg);
  361. int UNUSED written = 0;
  362. IADDR UNUSED pc = abuf->addr;
  363. SEM_BRANCH_INIT
  364. SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
  365. if (GEUSI (CPU (h_gr[FLD (f_r0)]), CPU (h_gr[FLD (f_r1)]))) {
  366. {
  367. USI opval = FLD (i_branch);
  368. SEM_BRANCH_VIA_CACHE (current_cpu, sem_arg, opval, vpc);
  369. written |= (1 << 3);
  370. CGEN_TRACE_RESULT (current_cpu, abuf, "pc", 'x', opval);
  371. }
  372. }
  373. abuf->written = written;
  374. SEM_BRANCH_FINI (vpc);
  375. return vpc;
  376. #undef FLD
  377. }
  378. /* bgu: bgu $r0,$r1,$branch */
  379. static SEM_PC
  380. SEM_FN_NAME (lm32bf,bgu) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
  381. {
  382. #define FLD(f) abuf->fields.sfmt_be.f
  383. ARGBUF *abuf = SEM_ARGBUF (sem_arg);
  384. int UNUSED written = 0;
  385. IADDR UNUSED pc = abuf->addr;
  386. SEM_BRANCH_INIT
  387. SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
  388. if (GTUSI (CPU (h_gr[FLD (f_r0)]), CPU (h_gr[FLD (f_r1)]))) {
  389. {
  390. USI opval = FLD (i_branch);
  391. SEM_BRANCH_VIA_CACHE (current_cpu, sem_arg, opval, vpc);
  392. written |= (1 << 3);
  393. CGEN_TRACE_RESULT (current_cpu, abuf, "pc", 'x', opval);
  394. }
  395. }
  396. abuf->written = written;
  397. SEM_BRANCH_FINI (vpc);
  398. return vpc;
  399. #undef FLD
  400. }
  401. /* bne: bne $r0,$r1,$branch */
  402. static SEM_PC
  403. SEM_FN_NAME (lm32bf,bne) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
  404. {
  405. #define FLD(f) abuf->fields.sfmt_be.f
  406. ARGBUF *abuf = SEM_ARGBUF (sem_arg);
  407. int UNUSED written = 0;
  408. IADDR UNUSED pc = abuf->addr;
  409. SEM_BRANCH_INIT
  410. SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
  411. if (NESI (CPU (h_gr[FLD (f_r0)]), CPU (h_gr[FLD (f_r1)]))) {
  412. {
  413. USI opval = FLD (i_branch);
  414. SEM_BRANCH_VIA_CACHE (current_cpu, sem_arg, opval, vpc);
  415. written |= (1 << 3);
  416. CGEN_TRACE_RESULT (current_cpu, abuf, "pc", 'x', opval);
  417. }
  418. }
  419. abuf->written = written;
  420. SEM_BRANCH_FINI (vpc);
  421. return vpc;
  422. #undef FLD
  423. }
  424. /* call: call $r0 */
  425. static SEM_PC
  426. SEM_FN_NAME (lm32bf,call) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
  427. {
  428. #define FLD(f) abuf->fields.sfmt_be.f
  429. ARGBUF *abuf = SEM_ARGBUF (sem_arg);
  430. int UNUSED written = 0;
  431. IADDR UNUSED pc = abuf->addr;
  432. SEM_BRANCH_INIT
  433. SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
  434. {
  435. {
  436. SI opval = ADDSI (pc, 4);
  437. CPU (h_gr[((UINT) 29)]) = opval;
  438. CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
  439. }
  440. {
  441. USI opval = CPU (h_gr[FLD (f_r0)]);
  442. SEM_BRANCH_VIA_ADDR (current_cpu, sem_arg, opval, vpc);
  443. CGEN_TRACE_RESULT (current_cpu, abuf, "pc", 'x', opval);
  444. }
  445. }
  446. SEM_BRANCH_FINI (vpc);
  447. return vpc;
  448. #undef FLD
  449. }
  450. /* calli: calli $call */
  451. static SEM_PC
  452. SEM_FN_NAME (lm32bf,calli) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
  453. {
  454. #define FLD(f) abuf->fields.sfmt_bi.f
  455. ARGBUF *abuf = SEM_ARGBUF (sem_arg);
  456. int UNUSED written = 0;
  457. IADDR UNUSED pc = abuf->addr;
  458. SEM_BRANCH_INIT
  459. SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
  460. {
  461. {
  462. SI opval = ADDSI (pc, 4);
  463. CPU (h_gr[((UINT) 29)]) = opval;
  464. CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
  465. }
  466. {
  467. USI opval = EXTSISI (FLD (i_call));
  468. SEM_BRANCH_VIA_ADDR (current_cpu, sem_arg, opval, vpc);
  469. CGEN_TRACE_RESULT (current_cpu, abuf, "pc", 'x', opval);
  470. }
  471. }
  472. SEM_BRANCH_FINI (vpc);
  473. return vpc;
  474. #undef FLD
  475. }
  476. /* cmpe: cmpe $r2,$r0,$r1 */
  477. static SEM_PC
  478. SEM_FN_NAME (lm32bf,cmpe) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
  479. {
  480. #define FLD(f) abuf->fields.sfmt_user.f
  481. ARGBUF *abuf = SEM_ARGBUF (sem_arg);
  482. int UNUSED written = 0;
  483. IADDR UNUSED pc = abuf->addr;
  484. SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
  485. {
  486. SI opval = EQSI (CPU (h_gr[FLD (f_r0)]), CPU (h_gr[FLD (f_r1)]));
  487. CPU (h_gr[FLD (f_r2)]) = opval;
  488. CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
  489. }
  490. return vpc;
  491. #undef FLD
  492. }
  493. /* cmpei: cmpei $r1,$r0,$imm */
  494. static SEM_PC
  495. SEM_FN_NAME (lm32bf,cmpei) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
  496. {
  497. #define FLD(f) abuf->fields.sfmt_addi.f
  498. ARGBUF *abuf = SEM_ARGBUF (sem_arg);
  499. int UNUSED written = 0;
  500. IADDR UNUSED pc = abuf->addr;
  501. SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
  502. {
  503. SI opval = EQSI (CPU (h_gr[FLD (f_r0)]), EXTHISI (TRUNCSIHI (FLD (f_imm))));
  504. CPU (h_gr[FLD (f_r1)]) = opval;
  505. CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
  506. }
  507. return vpc;
  508. #undef FLD
  509. }
  510. /* cmpg: cmpg $r2,$r0,$r1 */
  511. static SEM_PC
  512. SEM_FN_NAME (lm32bf,cmpg) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
  513. {
  514. #define FLD(f) abuf->fields.sfmt_user.f
  515. ARGBUF *abuf = SEM_ARGBUF (sem_arg);
  516. int UNUSED written = 0;
  517. IADDR UNUSED pc = abuf->addr;
  518. SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
  519. {
  520. SI opval = GTSI (CPU (h_gr[FLD (f_r0)]), CPU (h_gr[FLD (f_r1)]));
  521. CPU (h_gr[FLD (f_r2)]) = opval;
  522. CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
  523. }
  524. return vpc;
  525. #undef FLD
  526. }
  527. /* cmpgi: cmpgi $r1,$r0,$imm */
  528. static SEM_PC
  529. SEM_FN_NAME (lm32bf,cmpgi) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
  530. {
  531. #define FLD(f) abuf->fields.sfmt_addi.f
  532. ARGBUF *abuf = SEM_ARGBUF (sem_arg);
  533. int UNUSED written = 0;
  534. IADDR UNUSED pc = abuf->addr;
  535. SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
  536. {
  537. SI opval = GTSI (CPU (h_gr[FLD (f_r0)]), EXTHISI (TRUNCSIHI (FLD (f_imm))));
  538. CPU (h_gr[FLD (f_r1)]) = opval;
  539. CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
  540. }
  541. return vpc;
  542. #undef FLD
  543. }
  544. /* cmpge: cmpge $r2,$r0,$r1 */
  545. static SEM_PC
  546. SEM_FN_NAME (lm32bf,cmpge) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
  547. {
  548. #define FLD(f) abuf->fields.sfmt_user.f
  549. ARGBUF *abuf = SEM_ARGBUF (sem_arg);
  550. int UNUSED written = 0;
  551. IADDR UNUSED pc = abuf->addr;
  552. SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
  553. {
  554. SI opval = GESI (CPU (h_gr[FLD (f_r0)]), CPU (h_gr[FLD (f_r1)]));
  555. CPU (h_gr[FLD (f_r2)]) = opval;
  556. CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
  557. }
  558. return vpc;
  559. #undef FLD
  560. }
  561. /* cmpgei: cmpgei $r1,$r0,$imm */
  562. static SEM_PC
  563. SEM_FN_NAME (lm32bf,cmpgei) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
  564. {
  565. #define FLD(f) abuf->fields.sfmt_addi.f
  566. ARGBUF *abuf = SEM_ARGBUF (sem_arg);
  567. int UNUSED written = 0;
  568. IADDR UNUSED pc = abuf->addr;
  569. SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
  570. {
  571. SI opval = GESI (CPU (h_gr[FLD (f_r0)]), EXTHISI (TRUNCSIHI (FLD (f_imm))));
  572. CPU (h_gr[FLD (f_r1)]) = opval;
  573. CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
  574. }
  575. return vpc;
  576. #undef FLD
  577. }
  578. /* cmpgeu: cmpgeu $r2,$r0,$r1 */
  579. static SEM_PC
  580. SEM_FN_NAME (lm32bf,cmpgeu) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
  581. {
  582. #define FLD(f) abuf->fields.sfmt_user.f
  583. ARGBUF *abuf = SEM_ARGBUF (sem_arg);
  584. int UNUSED written = 0;
  585. IADDR UNUSED pc = abuf->addr;
  586. SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
  587. {
  588. SI opval = GEUSI (CPU (h_gr[FLD (f_r0)]), CPU (h_gr[FLD (f_r1)]));
  589. CPU (h_gr[FLD (f_r2)]) = opval;
  590. CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
  591. }
  592. return vpc;
  593. #undef FLD
  594. }
  595. /* cmpgeui: cmpgeui $r1,$r0,$uimm */
  596. static SEM_PC
  597. SEM_FN_NAME (lm32bf,cmpgeui) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
  598. {
  599. #define FLD(f) abuf->fields.sfmt_andi.f
  600. ARGBUF *abuf = SEM_ARGBUF (sem_arg);
  601. int UNUSED written = 0;
  602. IADDR UNUSED pc = abuf->addr;
  603. SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
  604. {
  605. SI opval = GEUSI (CPU (h_gr[FLD (f_r0)]), ZEXTSISI (FLD (f_uimm)));
  606. CPU (h_gr[FLD (f_r1)]) = opval;
  607. CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
  608. }
  609. return vpc;
  610. #undef FLD
  611. }
  612. /* cmpgu: cmpgu $r2,$r0,$r1 */
  613. static SEM_PC
  614. SEM_FN_NAME (lm32bf,cmpgu) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
  615. {
  616. #define FLD(f) abuf->fields.sfmt_user.f
  617. ARGBUF *abuf = SEM_ARGBUF (sem_arg);
  618. int UNUSED written = 0;
  619. IADDR UNUSED pc = abuf->addr;
  620. SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
  621. {
  622. SI opval = GTUSI (CPU (h_gr[FLD (f_r0)]), CPU (h_gr[FLD (f_r1)]));
  623. CPU (h_gr[FLD (f_r2)]) = opval;
  624. CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
  625. }
  626. return vpc;
  627. #undef FLD
  628. }
  629. /* cmpgui: cmpgui $r1,$r0,$uimm */
  630. static SEM_PC
  631. SEM_FN_NAME (lm32bf,cmpgui) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
  632. {
  633. #define FLD(f) abuf->fields.sfmt_andi.f
  634. ARGBUF *abuf = SEM_ARGBUF (sem_arg);
  635. int UNUSED written = 0;
  636. IADDR UNUSED pc = abuf->addr;
  637. SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
  638. {
  639. SI opval = GTUSI (CPU (h_gr[FLD (f_r0)]), ZEXTSISI (FLD (f_uimm)));
  640. CPU (h_gr[FLD (f_r1)]) = opval;
  641. CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
  642. }
  643. return vpc;
  644. #undef FLD
  645. }
  646. /* cmpne: cmpne $r2,$r0,$r1 */
  647. static SEM_PC
  648. SEM_FN_NAME (lm32bf,cmpne) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
  649. {
  650. #define FLD(f) abuf->fields.sfmt_user.f
  651. ARGBUF *abuf = SEM_ARGBUF (sem_arg);
  652. int UNUSED written = 0;
  653. IADDR UNUSED pc = abuf->addr;
  654. SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
  655. {
  656. SI opval = NESI (CPU (h_gr[FLD (f_r0)]), CPU (h_gr[FLD (f_r1)]));
  657. CPU (h_gr[FLD (f_r2)]) = opval;
  658. CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
  659. }
  660. return vpc;
  661. #undef FLD
  662. }
  663. /* cmpnei: cmpnei $r1,$r0,$imm */
  664. static SEM_PC
  665. SEM_FN_NAME (lm32bf,cmpnei) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
  666. {
  667. #define FLD(f) abuf->fields.sfmt_addi.f
  668. ARGBUF *abuf = SEM_ARGBUF (sem_arg);
  669. int UNUSED written = 0;
  670. IADDR UNUSED pc = abuf->addr;
  671. SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
  672. {
  673. SI opval = NESI (CPU (h_gr[FLD (f_r0)]), EXTHISI (TRUNCSIHI (FLD (f_imm))));
  674. CPU (h_gr[FLD (f_r1)]) = opval;
  675. CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
  676. }
  677. return vpc;
  678. #undef FLD
  679. }
  680. /* divu: divu $r2,$r0,$r1 */
  681. static SEM_PC
  682. SEM_FN_NAME (lm32bf,divu) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
  683. {
  684. #define FLD(f) abuf->fields.sfmt_user.f
  685. ARGBUF *abuf = SEM_ARGBUF (sem_arg);
  686. int UNUSED written = 0;
  687. IADDR UNUSED pc = abuf->addr;
  688. SEM_BRANCH_INIT
  689. SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
  690. {
  691. USI opval = lm32bf_divu_insn (current_cpu, pc, FLD (f_r0), FLD (f_r1), FLD (f_r2));
  692. SEM_BRANCH_VIA_ADDR (current_cpu, sem_arg, opval, vpc);
  693. CGEN_TRACE_RESULT (current_cpu, abuf, "pc", 'x', opval);
  694. }
  695. SEM_BRANCH_FINI (vpc);
  696. return vpc;
  697. #undef FLD
  698. }
  699. /* lb: lb $r1,($r0+$imm) */
  700. static SEM_PC
  701. SEM_FN_NAME (lm32bf,lb) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
  702. {
  703. #define FLD(f) abuf->fields.sfmt_addi.f
  704. ARGBUF *abuf = SEM_ARGBUF (sem_arg);
  705. int UNUSED written = 0;
  706. IADDR UNUSED pc = abuf->addr;
  707. SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
  708. {
  709. SI opval = EXTQISI (GETMEMQI (current_cpu, pc, ADDSI (CPU (h_gr[FLD (f_r0)]), EXTHISI (TRUNCSIHI (FLD (f_imm))))));
  710. CPU (h_gr[FLD (f_r1)]) = opval;
  711. CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
  712. }
  713. return vpc;
  714. #undef FLD
  715. }
  716. /* lbu: lbu $r1,($r0+$imm) */
  717. static SEM_PC
  718. SEM_FN_NAME (lm32bf,lbu) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
  719. {
  720. #define FLD(f) abuf->fields.sfmt_addi.f
  721. ARGBUF *abuf = SEM_ARGBUF (sem_arg);
  722. int UNUSED written = 0;
  723. IADDR UNUSED pc = abuf->addr;
  724. SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
  725. {
  726. SI opval = ZEXTQISI (GETMEMQI (current_cpu, pc, ADDSI (CPU (h_gr[FLD (f_r0)]), EXTHISI (TRUNCSIHI (FLD (f_imm))))));
  727. CPU (h_gr[FLD (f_r1)]) = opval;
  728. CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
  729. }
  730. return vpc;
  731. #undef FLD
  732. }
  733. /* lh: lh $r1,($r0+$imm) */
  734. static SEM_PC
  735. SEM_FN_NAME (lm32bf,lh) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
  736. {
  737. #define FLD(f) abuf->fields.sfmt_addi.f
  738. ARGBUF *abuf = SEM_ARGBUF (sem_arg);
  739. int UNUSED written = 0;
  740. IADDR UNUSED pc = abuf->addr;
  741. SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
  742. {
  743. SI opval = EXTHISI (GETMEMHI (current_cpu, pc, ADDSI (CPU (h_gr[FLD (f_r0)]), EXTHISI (TRUNCSIHI (FLD (f_imm))))));
  744. CPU (h_gr[FLD (f_r1)]) = opval;
  745. CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
  746. }
  747. return vpc;
  748. #undef FLD
  749. }
  750. /* lhu: lhu $r1,($r0+$imm) */
  751. static SEM_PC
  752. SEM_FN_NAME (lm32bf,lhu) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
  753. {
  754. #define FLD(f) abuf->fields.sfmt_addi.f
  755. ARGBUF *abuf = SEM_ARGBUF (sem_arg);
  756. int UNUSED written = 0;
  757. IADDR UNUSED pc = abuf->addr;
  758. SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
  759. {
  760. SI opval = ZEXTHISI (GETMEMHI (current_cpu, pc, ADDSI (CPU (h_gr[FLD (f_r0)]), EXTHISI (TRUNCSIHI (FLD (f_imm))))));
  761. CPU (h_gr[FLD (f_r1)]) = opval;
  762. CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
  763. }
  764. return vpc;
  765. #undef FLD
  766. }
  767. /* lw: lw $r1,($r0+$imm) */
  768. static SEM_PC
  769. SEM_FN_NAME (lm32bf,lw) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
  770. {
  771. #define FLD(f) abuf->fields.sfmt_addi.f
  772. ARGBUF *abuf = SEM_ARGBUF (sem_arg);
  773. int UNUSED written = 0;
  774. IADDR UNUSED pc = abuf->addr;
  775. SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
  776. {
  777. SI opval = GETMEMSI (current_cpu, pc, ADDSI (CPU (h_gr[FLD (f_r0)]), EXTHISI (TRUNCSIHI (FLD (f_imm)))));
  778. CPU (h_gr[FLD (f_r1)]) = opval;
  779. CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
  780. }
  781. return vpc;
  782. #undef FLD
  783. }
  784. /* modu: modu $r2,$r0,$r1 */
  785. static SEM_PC
  786. SEM_FN_NAME (lm32bf,modu) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
  787. {
  788. #define FLD(f) abuf->fields.sfmt_user.f
  789. ARGBUF *abuf = SEM_ARGBUF (sem_arg);
  790. int UNUSED written = 0;
  791. IADDR UNUSED pc = abuf->addr;
  792. SEM_BRANCH_INIT
  793. SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
  794. {
  795. USI opval = lm32bf_modu_insn (current_cpu, pc, FLD (f_r0), FLD (f_r1), FLD (f_r2));
  796. SEM_BRANCH_VIA_ADDR (current_cpu, sem_arg, opval, vpc);
  797. CGEN_TRACE_RESULT (current_cpu, abuf, "pc", 'x', opval);
  798. }
  799. SEM_BRANCH_FINI (vpc);
  800. return vpc;
  801. #undef FLD
  802. }
  803. /* mul: mul $r2,$r0,$r1 */
  804. static SEM_PC
  805. SEM_FN_NAME (lm32bf,mul) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
  806. {
  807. #define FLD(f) abuf->fields.sfmt_user.f
  808. ARGBUF *abuf = SEM_ARGBUF (sem_arg);
  809. int UNUSED written = 0;
  810. IADDR UNUSED pc = abuf->addr;
  811. SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
  812. {
  813. SI opval = MULSI (CPU (h_gr[FLD (f_r0)]), CPU (h_gr[FLD (f_r1)]));
  814. CPU (h_gr[FLD (f_r2)]) = opval;
  815. CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
  816. }
  817. return vpc;
  818. #undef FLD
  819. }
  820. /* muli: muli $r1,$r0,$imm */
  821. static SEM_PC
  822. SEM_FN_NAME (lm32bf,muli) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
  823. {
  824. #define FLD(f) abuf->fields.sfmt_addi.f
  825. ARGBUF *abuf = SEM_ARGBUF (sem_arg);
  826. int UNUSED written = 0;
  827. IADDR UNUSED pc = abuf->addr;
  828. SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
  829. {
  830. SI opval = MULSI (CPU (h_gr[FLD (f_r0)]), EXTHISI (TRUNCSIHI (FLD (f_imm))));
  831. CPU (h_gr[FLD (f_r1)]) = opval;
  832. CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
  833. }
  834. return vpc;
  835. #undef FLD
  836. }
  837. /* nor: nor $r2,$r0,$r1 */
  838. static SEM_PC
  839. SEM_FN_NAME (lm32bf,nor) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
  840. {
  841. #define FLD(f) abuf->fields.sfmt_user.f
  842. ARGBUF *abuf = SEM_ARGBUF (sem_arg);
  843. int UNUSED written = 0;
  844. IADDR UNUSED pc = abuf->addr;
  845. SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
  846. {
  847. SI opval = INVSI (ORSI (CPU (h_gr[FLD (f_r0)]), CPU (h_gr[FLD (f_r1)])));
  848. CPU (h_gr[FLD (f_r2)]) = opval;
  849. CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
  850. }
  851. return vpc;
  852. #undef FLD
  853. }
  854. /* nori: nori $r1,$r0,$uimm */
  855. static SEM_PC
  856. SEM_FN_NAME (lm32bf,nori) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
  857. {
  858. #define FLD(f) abuf->fields.sfmt_andi.f
  859. ARGBUF *abuf = SEM_ARGBUF (sem_arg);
  860. int UNUSED written = 0;
  861. IADDR UNUSED pc = abuf->addr;
  862. SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
  863. {
  864. SI opval = INVSI (ORSI (CPU (h_gr[FLD (f_r0)]), ZEXTSISI (FLD (f_uimm))));
  865. CPU (h_gr[FLD (f_r1)]) = opval;
  866. CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
  867. }
  868. return vpc;
  869. #undef FLD
  870. }
  871. /* or: or $r2,$r0,$r1 */
  872. static SEM_PC
  873. SEM_FN_NAME (lm32bf,or) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
  874. {
  875. #define FLD(f) abuf->fields.sfmt_user.f
  876. ARGBUF *abuf = SEM_ARGBUF (sem_arg);
  877. int UNUSED written = 0;
  878. IADDR UNUSED pc = abuf->addr;
  879. SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
  880. {
  881. SI opval = ORSI (CPU (h_gr[FLD (f_r0)]), CPU (h_gr[FLD (f_r1)]));
  882. CPU (h_gr[FLD (f_r2)]) = opval;
  883. CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
  884. }
  885. return vpc;
  886. #undef FLD
  887. }
  888. /* ori: ori $r1,$r0,$lo16 */
  889. static SEM_PC
  890. SEM_FN_NAME (lm32bf,ori) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
  891. {
  892. #define FLD(f) abuf->fields.sfmt_andi.f
  893. ARGBUF *abuf = SEM_ARGBUF (sem_arg);
  894. int UNUSED written = 0;
  895. IADDR UNUSED pc = abuf->addr;
  896. SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
  897. {
  898. SI opval = ORSI (CPU (h_gr[FLD (f_r0)]), ZEXTSISI (FLD (f_uimm)));
  899. CPU (h_gr[FLD (f_r1)]) = opval;
  900. CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
  901. }
  902. return vpc;
  903. #undef FLD
  904. }
  905. /* orhii: orhi $r1,$r0,$hi16 */
  906. static SEM_PC
  907. SEM_FN_NAME (lm32bf,orhii) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
  908. {
  909. #define FLD(f) abuf->fields.sfmt_andi.f
  910. ARGBUF *abuf = SEM_ARGBUF (sem_arg);
  911. int UNUSED written = 0;
  912. IADDR UNUSED pc = abuf->addr;
  913. SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
  914. {
  915. SI opval = ORSI (CPU (h_gr[FLD (f_r0)]), SLLSI (FLD (f_uimm), 16));
  916. CPU (h_gr[FLD (f_r1)]) = opval;
  917. CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
  918. }
  919. return vpc;
  920. #undef FLD
  921. }
  922. /* rcsr: rcsr $r2,$csr */
  923. static SEM_PC
  924. SEM_FN_NAME (lm32bf,rcsr) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
  925. {
  926. #define FLD(f) abuf->fields.sfmt_rcsr.f
  927. ARGBUF *abuf = SEM_ARGBUF (sem_arg);
  928. int UNUSED written = 0;
  929. IADDR UNUSED pc = abuf->addr;
  930. SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
  931. {
  932. SI opval = CPU (h_csr[FLD (f_csr)]);
  933. CPU (h_gr[FLD (f_r2)]) = opval;
  934. CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
  935. }
  936. return vpc;
  937. #undef FLD
  938. }
  939. /* sb: sb ($r0+$imm),$r1 */
  940. static SEM_PC
  941. SEM_FN_NAME (lm32bf,sb) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
  942. {
  943. #define FLD(f) abuf->fields.sfmt_addi.f
  944. ARGBUF *abuf = SEM_ARGBUF (sem_arg);
  945. int UNUSED written = 0;
  946. IADDR UNUSED pc = abuf->addr;
  947. SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
  948. {
  949. QI opval = CPU (h_gr[FLD (f_r1)]);
  950. SETMEMQI (current_cpu, pc, ADDSI (CPU (h_gr[FLD (f_r0)]), EXTHISI (TRUNCSIHI (FLD (f_imm)))), opval);
  951. CGEN_TRACE_RESULT (current_cpu, abuf, "memory", 'x', opval);
  952. }
  953. return vpc;
  954. #undef FLD
  955. }
  956. /* sextb: sextb $r2,$r0 */
  957. static SEM_PC
  958. SEM_FN_NAME (lm32bf,sextb) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
  959. {
  960. #define FLD(f) abuf->fields.sfmt_user.f
  961. ARGBUF *abuf = SEM_ARGBUF (sem_arg);
  962. int UNUSED written = 0;
  963. IADDR UNUSED pc = abuf->addr;
  964. SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
  965. {
  966. SI opval = EXTQISI (TRUNCSIQI (CPU (h_gr[FLD (f_r0)])));
  967. CPU (h_gr[FLD (f_r2)]) = opval;
  968. CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
  969. }
  970. return vpc;
  971. #undef FLD
  972. }
  973. /* sexth: sexth $r2,$r0 */
  974. static SEM_PC
  975. SEM_FN_NAME (lm32bf,sexth) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
  976. {
  977. #define FLD(f) abuf->fields.sfmt_user.f
  978. ARGBUF *abuf = SEM_ARGBUF (sem_arg);
  979. int UNUSED written = 0;
  980. IADDR UNUSED pc = abuf->addr;
  981. SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
  982. {
  983. SI opval = EXTHISI (TRUNCSIHI (CPU (h_gr[FLD (f_r0)])));
  984. CPU (h_gr[FLD (f_r2)]) = opval;
  985. CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
  986. }
  987. return vpc;
  988. #undef FLD
  989. }
  990. /* sh: sh ($r0+$imm),$r1 */
  991. static SEM_PC
  992. SEM_FN_NAME (lm32bf,sh) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
  993. {
  994. #define FLD(f) abuf->fields.sfmt_addi.f
  995. ARGBUF *abuf = SEM_ARGBUF (sem_arg);
  996. int UNUSED written = 0;
  997. IADDR UNUSED pc = abuf->addr;
  998. SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
  999. {
  1000. HI opval = CPU (h_gr[FLD (f_r1)]);
  1001. SETMEMHI (current_cpu, pc, ADDSI (CPU (h_gr[FLD (f_r0)]), EXTHISI (TRUNCSIHI (FLD (f_imm)))), opval);
  1002. CGEN_TRACE_RESULT (current_cpu, abuf, "memory", 'x', opval);
  1003. }
  1004. return vpc;
  1005. #undef FLD
  1006. }
  1007. /* sl: sl $r2,$r0,$r1 */
  1008. static SEM_PC
  1009. SEM_FN_NAME (lm32bf,sl) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
  1010. {
  1011. #define FLD(f) abuf->fields.sfmt_user.f
  1012. ARGBUF *abuf = SEM_ARGBUF (sem_arg);
  1013. int UNUSED written = 0;
  1014. IADDR UNUSED pc = abuf->addr;
  1015. SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
  1016. {
  1017. SI opval = SLLSI (CPU (h_gr[FLD (f_r0)]), CPU (h_gr[FLD (f_r1)]));
  1018. CPU (h_gr[FLD (f_r2)]) = opval;
  1019. CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
  1020. }
  1021. return vpc;
  1022. #undef FLD
  1023. }
  1024. /* sli: sli $r1,$r0,$imm */
  1025. static SEM_PC
  1026. SEM_FN_NAME (lm32bf,sli) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
  1027. {
  1028. #define FLD(f) abuf->fields.sfmt_addi.f
  1029. ARGBUF *abuf = SEM_ARGBUF (sem_arg);
  1030. int UNUSED written = 0;
  1031. IADDR UNUSED pc = abuf->addr;
  1032. SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
  1033. {
  1034. SI opval = SLLSI (CPU (h_gr[FLD (f_r0)]), FLD (f_imm));
  1035. CPU (h_gr[FLD (f_r1)]) = opval;
  1036. CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
  1037. }
  1038. return vpc;
  1039. #undef FLD
  1040. }
  1041. /* sr: sr $r2,$r0,$r1 */
  1042. static SEM_PC
  1043. SEM_FN_NAME (lm32bf,sr) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
  1044. {
  1045. #define FLD(f) abuf->fields.sfmt_user.f
  1046. ARGBUF *abuf = SEM_ARGBUF (sem_arg);
  1047. int UNUSED written = 0;
  1048. IADDR UNUSED pc = abuf->addr;
  1049. SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
  1050. {
  1051. SI opval = SRASI (CPU (h_gr[FLD (f_r0)]), CPU (h_gr[FLD (f_r1)]));
  1052. CPU (h_gr[FLD (f_r2)]) = opval;
  1053. CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
  1054. }
  1055. return vpc;
  1056. #undef FLD
  1057. }
  1058. /* sri: sri $r1,$r0,$imm */
  1059. static SEM_PC
  1060. SEM_FN_NAME (lm32bf,sri) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
  1061. {
  1062. #define FLD(f) abuf->fields.sfmt_addi.f
  1063. ARGBUF *abuf = SEM_ARGBUF (sem_arg);
  1064. int UNUSED written = 0;
  1065. IADDR UNUSED pc = abuf->addr;
  1066. SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
  1067. {
  1068. SI opval = SRASI (CPU (h_gr[FLD (f_r0)]), FLD (f_imm));
  1069. CPU (h_gr[FLD (f_r1)]) = opval;
  1070. CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
  1071. }
  1072. return vpc;
  1073. #undef FLD
  1074. }
  1075. /* sru: sru $r2,$r0,$r1 */
  1076. static SEM_PC
  1077. SEM_FN_NAME (lm32bf,sru) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
  1078. {
  1079. #define FLD(f) abuf->fields.sfmt_user.f
  1080. ARGBUF *abuf = SEM_ARGBUF (sem_arg);
  1081. int UNUSED written = 0;
  1082. IADDR UNUSED pc = abuf->addr;
  1083. SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
  1084. {
  1085. SI opval = SRLSI (CPU (h_gr[FLD (f_r0)]), CPU (h_gr[FLD (f_r1)]));
  1086. CPU (h_gr[FLD (f_r2)]) = opval;
  1087. CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
  1088. }
  1089. return vpc;
  1090. #undef FLD
  1091. }
  1092. /* srui: srui $r1,$r0,$imm */
  1093. static SEM_PC
  1094. SEM_FN_NAME (lm32bf,srui) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
  1095. {
  1096. #define FLD(f) abuf->fields.sfmt_addi.f
  1097. ARGBUF *abuf = SEM_ARGBUF (sem_arg);
  1098. int UNUSED written = 0;
  1099. IADDR UNUSED pc = abuf->addr;
  1100. SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
  1101. {
  1102. SI opval = SRLSI (CPU (h_gr[FLD (f_r0)]), FLD (f_imm));
  1103. CPU (h_gr[FLD (f_r1)]) = opval;
  1104. CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
  1105. }
  1106. return vpc;
  1107. #undef FLD
  1108. }
  1109. /* sub: sub $r2,$r0,$r1 */
  1110. static SEM_PC
  1111. SEM_FN_NAME (lm32bf,sub) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
  1112. {
  1113. #define FLD(f) abuf->fields.sfmt_user.f
  1114. ARGBUF *abuf = SEM_ARGBUF (sem_arg);
  1115. int UNUSED written = 0;
  1116. IADDR UNUSED pc = abuf->addr;
  1117. SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
  1118. {
  1119. SI opval = SUBSI (CPU (h_gr[FLD (f_r0)]), CPU (h_gr[FLD (f_r1)]));
  1120. CPU (h_gr[FLD (f_r2)]) = opval;
  1121. CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
  1122. }
  1123. return vpc;
  1124. #undef FLD
  1125. }
  1126. /* sw: sw ($r0+$imm),$r1 */
  1127. static SEM_PC
  1128. SEM_FN_NAME (lm32bf,sw) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
  1129. {
  1130. #define FLD(f) abuf->fields.sfmt_addi.f
  1131. ARGBUF *abuf = SEM_ARGBUF (sem_arg);
  1132. int UNUSED written = 0;
  1133. IADDR UNUSED pc = abuf->addr;
  1134. SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
  1135. {
  1136. SI opval = CPU (h_gr[FLD (f_r1)]);
  1137. SETMEMSI (current_cpu, pc, ADDSI (CPU (h_gr[FLD (f_r0)]), EXTHISI (TRUNCSIHI (FLD (f_imm)))), opval);
  1138. CGEN_TRACE_RESULT (current_cpu, abuf, "memory", 'x', opval);
  1139. }
  1140. return vpc;
  1141. #undef FLD
  1142. }
  1143. /* user: user $r2,$r0,$r1,$user */
  1144. static SEM_PC
  1145. SEM_FN_NAME (lm32bf,user) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
  1146. {
  1147. #define FLD(f) abuf->fields.sfmt_user.f
  1148. ARGBUF *abuf = SEM_ARGBUF (sem_arg);
  1149. int UNUSED written = 0;
  1150. IADDR UNUSED pc = abuf->addr;
  1151. SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
  1152. {
  1153. SI opval = lm32bf_user_insn (current_cpu, CPU (h_gr[FLD (f_r0)]), CPU (h_gr[FLD (f_r1)]), FLD (f_user));
  1154. CPU (h_gr[FLD (f_r2)]) = opval;
  1155. CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
  1156. }
  1157. return vpc;
  1158. #undef FLD
  1159. }
  1160. /* wcsr: wcsr $csr,$r1 */
  1161. static SEM_PC
  1162. SEM_FN_NAME (lm32bf,wcsr) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
  1163. {
  1164. #define FLD(f) abuf->fields.sfmt_wcsr.f
  1165. ARGBUF *abuf = SEM_ARGBUF (sem_arg);
  1166. int UNUSED written = 0;
  1167. IADDR UNUSED pc = abuf->addr;
  1168. SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
  1169. lm32bf_wcsr_insn (current_cpu, FLD (f_csr), CPU (h_gr[FLD (f_r1)]));
  1170. return vpc;
  1171. #undef FLD
  1172. }
  1173. /* xor: xor $r2,$r0,$r1 */
  1174. static SEM_PC
  1175. SEM_FN_NAME (lm32bf,xor) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
  1176. {
  1177. #define FLD(f) abuf->fields.sfmt_user.f
  1178. ARGBUF *abuf = SEM_ARGBUF (sem_arg);
  1179. int UNUSED written = 0;
  1180. IADDR UNUSED pc = abuf->addr;
  1181. SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
  1182. {
  1183. SI opval = XORSI (CPU (h_gr[FLD (f_r0)]), CPU (h_gr[FLD (f_r1)]));
  1184. CPU (h_gr[FLD (f_r2)]) = opval;
  1185. CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
  1186. }
  1187. return vpc;
  1188. #undef FLD
  1189. }
  1190. /* xori: xori $r1,$r0,$uimm */
  1191. static SEM_PC
  1192. SEM_FN_NAME (lm32bf,xori) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
  1193. {
  1194. #define FLD(f) abuf->fields.sfmt_andi.f
  1195. ARGBUF *abuf = SEM_ARGBUF (sem_arg);
  1196. int UNUSED written = 0;
  1197. IADDR UNUSED pc = abuf->addr;
  1198. SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
  1199. {
  1200. SI opval = XORSI (CPU (h_gr[FLD (f_r0)]), ZEXTSISI (FLD (f_uimm)));
  1201. CPU (h_gr[FLD (f_r1)]) = opval;
  1202. CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
  1203. }
  1204. return vpc;
  1205. #undef FLD
  1206. }
  1207. /* xnor: xnor $r2,$r0,$r1 */
  1208. static SEM_PC
  1209. SEM_FN_NAME (lm32bf,xnor) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
  1210. {
  1211. #define FLD(f) abuf->fields.sfmt_user.f
  1212. ARGBUF *abuf = SEM_ARGBUF (sem_arg);
  1213. int UNUSED written = 0;
  1214. IADDR UNUSED pc = abuf->addr;
  1215. SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
  1216. {
  1217. SI opval = INVSI (XORSI (CPU (h_gr[FLD (f_r0)]), CPU (h_gr[FLD (f_r1)])));
  1218. CPU (h_gr[FLD (f_r2)]) = opval;
  1219. CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
  1220. }
  1221. return vpc;
  1222. #undef FLD
  1223. }
  1224. /* xnori: xnori $r1,$r0,$uimm */
  1225. static SEM_PC
  1226. SEM_FN_NAME (lm32bf,xnori) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
  1227. {
  1228. #define FLD(f) abuf->fields.sfmt_andi.f
  1229. ARGBUF *abuf = SEM_ARGBUF (sem_arg);
  1230. int UNUSED written = 0;
  1231. IADDR UNUSED pc = abuf->addr;
  1232. SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
  1233. {
  1234. SI opval = INVSI (XORSI (CPU (h_gr[FLD (f_r0)]), ZEXTSISI (FLD (f_uimm))));
  1235. CPU (h_gr[FLD (f_r1)]) = opval;
  1236. CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
  1237. }
  1238. return vpc;
  1239. #undef FLD
  1240. }
  1241. /* break: break */
  1242. static SEM_PC
  1243. SEM_FN_NAME (lm32bf,break) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
  1244. {
  1245. #define FLD(f) abuf->fields.sfmt_empty.f
  1246. ARGBUF *abuf = SEM_ARGBUF (sem_arg);
  1247. int UNUSED written = 0;
  1248. IADDR UNUSED pc = abuf->addr;
  1249. SEM_BRANCH_INIT
  1250. SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
  1251. {
  1252. USI opval = lm32bf_break_insn (current_cpu, pc);
  1253. SEM_BRANCH_VIA_ADDR (current_cpu, sem_arg, opval, vpc);
  1254. CGEN_TRACE_RESULT (current_cpu, abuf, "pc", 'x', opval);
  1255. }
  1256. SEM_BRANCH_FINI (vpc);
  1257. return vpc;
  1258. #undef FLD
  1259. }
  1260. /* scall: scall */
  1261. static SEM_PC
  1262. SEM_FN_NAME (lm32bf,scall) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
  1263. {
  1264. #define FLD(f) abuf->fields.sfmt_empty.f
  1265. ARGBUF *abuf = SEM_ARGBUF (sem_arg);
  1266. int UNUSED written = 0;
  1267. IADDR UNUSED pc = abuf->addr;
  1268. SEM_BRANCH_INIT
  1269. SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
  1270. {
  1271. USI opval = lm32bf_scall_insn (current_cpu, pc);
  1272. SEM_BRANCH_VIA_ADDR (current_cpu, sem_arg, opval, vpc);
  1273. CGEN_TRACE_RESULT (current_cpu, abuf, "pc", 'x', opval);
  1274. }
  1275. SEM_BRANCH_FINI (vpc);
  1276. return vpc;
  1277. #undef FLD
  1278. }
  1279. /* Table of all semantic fns. */
  1280. static const struct sem_fn_desc sem_fns[] = {
  1281. { LM32BF_INSN_X_INVALID, SEM_FN_NAME (lm32bf,x_invalid) },
  1282. { LM32BF_INSN_X_AFTER, SEM_FN_NAME (lm32bf,x_after) },
  1283. { LM32BF_INSN_X_BEFORE, SEM_FN_NAME (lm32bf,x_before) },
  1284. { LM32BF_INSN_X_CTI_CHAIN, SEM_FN_NAME (lm32bf,x_cti_chain) },
  1285. { LM32BF_INSN_X_CHAIN, SEM_FN_NAME (lm32bf,x_chain) },
  1286. { LM32BF_INSN_X_BEGIN, SEM_FN_NAME (lm32bf,x_begin) },
  1287. { LM32BF_INSN_ADD, SEM_FN_NAME (lm32bf,add) },
  1288. { LM32BF_INSN_ADDI, SEM_FN_NAME (lm32bf,addi) },
  1289. { LM32BF_INSN_AND, SEM_FN_NAME (lm32bf,and) },
  1290. { LM32BF_INSN_ANDI, SEM_FN_NAME (lm32bf,andi) },
  1291. { LM32BF_INSN_ANDHII, SEM_FN_NAME (lm32bf,andhii) },
  1292. { LM32BF_INSN_B, SEM_FN_NAME (lm32bf,b) },
  1293. { LM32BF_INSN_BI, SEM_FN_NAME (lm32bf,bi) },
  1294. { LM32BF_INSN_BE, SEM_FN_NAME (lm32bf,be) },
  1295. { LM32BF_INSN_BG, SEM_FN_NAME (lm32bf,bg) },
  1296. { LM32BF_INSN_BGE, SEM_FN_NAME (lm32bf,bge) },
  1297. { LM32BF_INSN_BGEU, SEM_FN_NAME (lm32bf,bgeu) },
  1298. { LM32BF_INSN_BGU, SEM_FN_NAME (lm32bf,bgu) },
  1299. { LM32BF_INSN_BNE, SEM_FN_NAME (lm32bf,bne) },
  1300. { LM32BF_INSN_CALL, SEM_FN_NAME (lm32bf,call) },
  1301. { LM32BF_INSN_CALLI, SEM_FN_NAME (lm32bf,calli) },
  1302. { LM32BF_INSN_CMPE, SEM_FN_NAME (lm32bf,cmpe) },
  1303. { LM32BF_INSN_CMPEI, SEM_FN_NAME (lm32bf,cmpei) },
  1304. { LM32BF_INSN_CMPG, SEM_FN_NAME (lm32bf,cmpg) },
  1305. { LM32BF_INSN_CMPGI, SEM_FN_NAME (lm32bf,cmpgi) },
  1306. { LM32BF_INSN_CMPGE, SEM_FN_NAME (lm32bf,cmpge) },
  1307. { LM32BF_INSN_CMPGEI, SEM_FN_NAME (lm32bf,cmpgei) },
  1308. { LM32BF_INSN_CMPGEU, SEM_FN_NAME (lm32bf,cmpgeu) },
  1309. { LM32BF_INSN_CMPGEUI, SEM_FN_NAME (lm32bf,cmpgeui) },
  1310. { LM32BF_INSN_CMPGU, SEM_FN_NAME (lm32bf,cmpgu) },
  1311. { LM32BF_INSN_CMPGUI, SEM_FN_NAME (lm32bf,cmpgui) },
  1312. { LM32BF_INSN_CMPNE, SEM_FN_NAME (lm32bf,cmpne) },
  1313. { LM32BF_INSN_CMPNEI, SEM_FN_NAME (lm32bf,cmpnei) },
  1314. { LM32BF_INSN_DIVU, SEM_FN_NAME (lm32bf,divu) },
  1315. { LM32BF_INSN_LB, SEM_FN_NAME (lm32bf,lb) },
  1316. { LM32BF_INSN_LBU, SEM_FN_NAME (lm32bf,lbu) },
  1317. { LM32BF_INSN_LH, SEM_FN_NAME (lm32bf,lh) },
  1318. { LM32BF_INSN_LHU, SEM_FN_NAME (lm32bf,lhu) },
  1319. { LM32BF_INSN_LW, SEM_FN_NAME (lm32bf,lw) },
  1320. { LM32BF_INSN_MODU, SEM_FN_NAME (lm32bf,modu) },
  1321. { LM32BF_INSN_MUL, SEM_FN_NAME (lm32bf,mul) },
  1322. { LM32BF_INSN_MULI, SEM_FN_NAME (lm32bf,muli) },
  1323. { LM32BF_INSN_NOR, SEM_FN_NAME (lm32bf,nor) },
  1324. { LM32BF_INSN_NORI, SEM_FN_NAME (lm32bf,nori) },
  1325. { LM32BF_INSN_OR, SEM_FN_NAME (lm32bf,or) },
  1326. { LM32BF_INSN_ORI, SEM_FN_NAME (lm32bf,ori) },
  1327. { LM32BF_INSN_ORHII, SEM_FN_NAME (lm32bf,orhii) },
  1328. { LM32BF_INSN_RCSR, SEM_FN_NAME (lm32bf,rcsr) },
  1329. { LM32BF_INSN_SB, SEM_FN_NAME (lm32bf,sb) },
  1330. { LM32BF_INSN_SEXTB, SEM_FN_NAME (lm32bf,sextb) },
  1331. { LM32BF_INSN_SEXTH, SEM_FN_NAME (lm32bf,sexth) },
  1332. { LM32BF_INSN_SH, SEM_FN_NAME (lm32bf,sh) },
  1333. { LM32BF_INSN_SL, SEM_FN_NAME (lm32bf,sl) },
  1334. { LM32BF_INSN_SLI, SEM_FN_NAME (lm32bf,sli) },
  1335. { LM32BF_INSN_SR, SEM_FN_NAME (lm32bf,sr) },
  1336. { LM32BF_INSN_SRI, SEM_FN_NAME (lm32bf,sri) },
  1337. { LM32BF_INSN_SRU, SEM_FN_NAME (lm32bf,sru) },
  1338. { LM32BF_INSN_SRUI, SEM_FN_NAME (lm32bf,srui) },
  1339. { LM32BF_INSN_SUB, SEM_FN_NAME (lm32bf,sub) },
  1340. { LM32BF_INSN_SW, SEM_FN_NAME (lm32bf,sw) },
  1341. { LM32BF_INSN_USER, SEM_FN_NAME (lm32bf,user) },
  1342. { LM32BF_INSN_WCSR, SEM_FN_NAME (lm32bf,wcsr) },
  1343. { LM32BF_INSN_XOR, SEM_FN_NAME (lm32bf,xor) },
  1344. { LM32BF_INSN_XORI, SEM_FN_NAME (lm32bf,xori) },
  1345. { LM32BF_INSN_XNOR, SEM_FN_NAME (lm32bf,xnor) },
  1346. { LM32BF_INSN_XNORI, SEM_FN_NAME (lm32bf,xnori) },
  1347. { LM32BF_INSN_BREAK, SEM_FN_NAME (lm32bf,break) },
  1348. { LM32BF_INSN_SCALL, SEM_FN_NAME (lm32bf,scall) },
  1349. { 0, 0 }
  1350. };
  1351. /* Add the semantic fns to IDESC_TABLE. */
  1352. void
  1353. SEM_FN_NAME (lm32bf,init_idesc_table) (SIM_CPU *current_cpu)
  1354. {
  1355. IDESC *idesc_table = CPU_IDESC (current_cpu);
  1356. const struct sem_fn_desc *sf;
  1357. int mach_num = MACH_NUM (CPU_MACH (current_cpu));
  1358. for (sf = &sem_fns[0]; sf->fn != 0; ++sf)
  1359. {
  1360. const CGEN_INSN *insn = idesc_table[sf->index].idata;
  1361. int valid_p = (CGEN_INSN_VIRTUAL_P (insn)
  1362. || CGEN_INSN_MACH_HAS_P (insn, mach_num));
  1363. #if FAST_P
  1364. if (valid_p)
  1365. idesc_table[sf->index].sem_fast = sf->fn;
  1366. else
  1367. idesc_table[sf->index].sem_fast = SEM_FN_NAME (lm32bf,x_invalid);
  1368. #else
  1369. if (valid_p)
  1370. idesc_table[sf->index].sem_full = sf->fn;
  1371. else
  1372. idesc_table[sf->index].sem_full = SEM_FN_NAME (lm32bf,x_invalid);
  1373. #endif
  1374. }
  1375. }