sem-switch.c 65 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250225122522253225422552256225722582259226022612262226322642265226622672268226922702271227222732274227522762277227822792280228122822283228422852286228722882289229022912292229322942295229622972298229923002301230223032304230523062307230823092310231123122313231423152316231723182319232023212322232323242325232623272328232923302331233223332334233523362337233823392340234123422343234423452346234723482349235023512352235323542355235623572358235923602361236223632364236523662367236823692370237123722373237423752376237723782379238023812382238323842385238623872388238923902391239223932394239523962397239823992400240124022403240424052406240724082409241024112412241324142415241624172418241924202421242224232424242524262427242824292430243124322433243424352436243724382439244024412442244324442445244624472448244924502451245224532454245524562457245824592460246124622463246424652466246724682469247024712472247324742475247624772478247924802481248224832484248524862487248824892490249124922493249424952496249724982499250025012502250325042505250625072508250925102511251225132514251525162517251825192520252125222523252425252526252725282529253025312532253325342535253625372538253925402541254225432544254525462547254825492550255125522553255425552556255725582559256025612562256325642565256625672568256925702571257225732574257525762577257825792580258125822583258425852586258725882589259025912592259325942595259625972598259926002601260226032604260526062607260826092610
  1. /* Simulator instruction semantics for m32rbf.
  2. THIS FILE IS MACHINE GENERATED WITH CGEN.
  3. Copyright 1996-2022 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. #ifdef DEFINE_LABELS
  17. /* The labels have the case they have because the enum of insn types
  18. is all uppercase and in the non-stdc case the insn symbol is built
  19. into the enum name. */
  20. static struct {
  21. int index;
  22. void *label;
  23. } labels[] = {
  24. { M32RBF_INSN_X_INVALID, && case_sem_INSN_X_INVALID },
  25. { M32RBF_INSN_X_AFTER, && case_sem_INSN_X_AFTER },
  26. { M32RBF_INSN_X_BEFORE, && case_sem_INSN_X_BEFORE },
  27. { M32RBF_INSN_X_CTI_CHAIN, && case_sem_INSN_X_CTI_CHAIN },
  28. { M32RBF_INSN_X_CHAIN, && case_sem_INSN_X_CHAIN },
  29. { M32RBF_INSN_X_BEGIN, && case_sem_INSN_X_BEGIN },
  30. { M32RBF_INSN_ADD, && case_sem_INSN_ADD },
  31. { M32RBF_INSN_ADD3, && case_sem_INSN_ADD3 },
  32. { M32RBF_INSN_AND, && case_sem_INSN_AND },
  33. { M32RBF_INSN_AND3, && case_sem_INSN_AND3 },
  34. { M32RBF_INSN_OR, && case_sem_INSN_OR },
  35. { M32RBF_INSN_OR3, && case_sem_INSN_OR3 },
  36. { M32RBF_INSN_XOR, && case_sem_INSN_XOR },
  37. { M32RBF_INSN_XOR3, && case_sem_INSN_XOR3 },
  38. { M32RBF_INSN_ADDI, && case_sem_INSN_ADDI },
  39. { M32RBF_INSN_ADDV, && case_sem_INSN_ADDV },
  40. { M32RBF_INSN_ADDV3, && case_sem_INSN_ADDV3 },
  41. { M32RBF_INSN_ADDX, && case_sem_INSN_ADDX },
  42. { M32RBF_INSN_BC8, && case_sem_INSN_BC8 },
  43. { M32RBF_INSN_BC24, && case_sem_INSN_BC24 },
  44. { M32RBF_INSN_BEQ, && case_sem_INSN_BEQ },
  45. { M32RBF_INSN_BEQZ, && case_sem_INSN_BEQZ },
  46. { M32RBF_INSN_BGEZ, && case_sem_INSN_BGEZ },
  47. { M32RBF_INSN_BGTZ, && case_sem_INSN_BGTZ },
  48. { M32RBF_INSN_BLEZ, && case_sem_INSN_BLEZ },
  49. { M32RBF_INSN_BLTZ, && case_sem_INSN_BLTZ },
  50. { M32RBF_INSN_BNEZ, && case_sem_INSN_BNEZ },
  51. { M32RBF_INSN_BL8, && case_sem_INSN_BL8 },
  52. { M32RBF_INSN_BL24, && case_sem_INSN_BL24 },
  53. { M32RBF_INSN_BNC8, && case_sem_INSN_BNC8 },
  54. { M32RBF_INSN_BNC24, && case_sem_INSN_BNC24 },
  55. { M32RBF_INSN_BNE, && case_sem_INSN_BNE },
  56. { M32RBF_INSN_BRA8, && case_sem_INSN_BRA8 },
  57. { M32RBF_INSN_BRA24, && case_sem_INSN_BRA24 },
  58. { M32RBF_INSN_CMP, && case_sem_INSN_CMP },
  59. { M32RBF_INSN_CMPI, && case_sem_INSN_CMPI },
  60. { M32RBF_INSN_CMPU, && case_sem_INSN_CMPU },
  61. { M32RBF_INSN_CMPUI, && case_sem_INSN_CMPUI },
  62. { M32RBF_INSN_DIV, && case_sem_INSN_DIV },
  63. { M32RBF_INSN_DIVU, && case_sem_INSN_DIVU },
  64. { M32RBF_INSN_REM, && case_sem_INSN_REM },
  65. { M32RBF_INSN_REMU, && case_sem_INSN_REMU },
  66. { M32RBF_INSN_JL, && case_sem_INSN_JL },
  67. { M32RBF_INSN_JMP, && case_sem_INSN_JMP },
  68. { M32RBF_INSN_LD, && case_sem_INSN_LD },
  69. { M32RBF_INSN_LD_D, && case_sem_INSN_LD_D },
  70. { M32RBF_INSN_LDB, && case_sem_INSN_LDB },
  71. { M32RBF_INSN_LDB_D, && case_sem_INSN_LDB_D },
  72. { M32RBF_INSN_LDH, && case_sem_INSN_LDH },
  73. { M32RBF_INSN_LDH_D, && case_sem_INSN_LDH_D },
  74. { M32RBF_INSN_LDUB, && case_sem_INSN_LDUB },
  75. { M32RBF_INSN_LDUB_D, && case_sem_INSN_LDUB_D },
  76. { M32RBF_INSN_LDUH, && case_sem_INSN_LDUH },
  77. { M32RBF_INSN_LDUH_D, && case_sem_INSN_LDUH_D },
  78. { M32RBF_INSN_LD_PLUS, && case_sem_INSN_LD_PLUS },
  79. { M32RBF_INSN_LD24, && case_sem_INSN_LD24 },
  80. { M32RBF_INSN_LDI8, && case_sem_INSN_LDI8 },
  81. { M32RBF_INSN_LDI16, && case_sem_INSN_LDI16 },
  82. { M32RBF_INSN_LOCK, && case_sem_INSN_LOCK },
  83. { M32RBF_INSN_MACHI, && case_sem_INSN_MACHI },
  84. { M32RBF_INSN_MACLO, && case_sem_INSN_MACLO },
  85. { M32RBF_INSN_MACWHI, && case_sem_INSN_MACWHI },
  86. { M32RBF_INSN_MACWLO, && case_sem_INSN_MACWLO },
  87. { M32RBF_INSN_MUL, && case_sem_INSN_MUL },
  88. { M32RBF_INSN_MULHI, && case_sem_INSN_MULHI },
  89. { M32RBF_INSN_MULLO, && case_sem_INSN_MULLO },
  90. { M32RBF_INSN_MULWHI, && case_sem_INSN_MULWHI },
  91. { M32RBF_INSN_MULWLO, && case_sem_INSN_MULWLO },
  92. { M32RBF_INSN_MV, && case_sem_INSN_MV },
  93. { M32RBF_INSN_MVFACHI, && case_sem_INSN_MVFACHI },
  94. { M32RBF_INSN_MVFACLO, && case_sem_INSN_MVFACLO },
  95. { M32RBF_INSN_MVFACMI, && case_sem_INSN_MVFACMI },
  96. { M32RBF_INSN_MVFC, && case_sem_INSN_MVFC },
  97. { M32RBF_INSN_MVTACHI, && case_sem_INSN_MVTACHI },
  98. { M32RBF_INSN_MVTACLO, && case_sem_INSN_MVTACLO },
  99. { M32RBF_INSN_MVTC, && case_sem_INSN_MVTC },
  100. { M32RBF_INSN_NEG, && case_sem_INSN_NEG },
  101. { M32RBF_INSN_NOP, && case_sem_INSN_NOP },
  102. { M32RBF_INSN_NOT, && case_sem_INSN_NOT },
  103. { M32RBF_INSN_RAC, && case_sem_INSN_RAC },
  104. { M32RBF_INSN_RACH, && case_sem_INSN_RACH },
  105. { M32RBF_INSN_RTE, && case_sem_INSN_RTE },
  106. { M32RBF_INSN_SETH, && case_sem_INSN_SETH },
  107. { M32RBF_INSN_SLL, && case_sem_INSN_SLL },
  108. { M32RBF_INSN_SLL3, && case_sem_INSN_SLL3 },
  109. { M32RBF_INSN_SLLI, && case_sem_INSN_SLLI },
  110. { M32RBF_INSN_SRA, && case_sem_INSN_SRA },
  111. { M32RBF_INSN_SRA3, && case_sem_INSN_SRA3 },
  112. { M32RBF_INSN_SRAI, && case_sem_INSN_SRAI },
  113. { M32RBF_INSN_SRL, && case_sem_INSN_SRL },
  114. { M32RBF_INSN_SRL3, && case_sem_INSN_SRL3 },
  115. { M32RBF_INSN_SRLI, && case_sem_INSN_SRLI },
  116. { M32RBF_INSN_ST, && case_sem_INSN_ST },
  117. { M32RBF_INSN_ST_D, && case_sem_INSN_ST_D },
  118. { M32RBF_INSN_STB, && case_sem_INSN_STB },
  119. { M32RBF_INSN_STB_D, && case_sem_INSN_STB_D },
  120. { M32RBF_INSN_STH, && case_sem_INSN_STH },
  121. { M32RBF_INSN_STH_D, && case_sem_INSN_STH_D },
  122. { M32RBF_INSN_ST_PLUS, && case_sem_INSN_ST_PLUS },
  123. { M32RBF_INSN_ST_MINUS, && case_sem_INSN_ST_MINUS },
  124. { M32RBF_INSN_SUB, && case_sem_INSN_SUB },
  125. { M32RBF_INSN_SUBV, && case_sem_INSN_SUBV },
  126. { M32RBF_INSN_SUBX, && case_sem_INSN_SUBX },
  127. { M32RBF_INSN_TRAP, && case_sem_INSN_TRAP },
  128. { M32RBF_INSN_UNLOCK, && case_sem_INSN_UNLOCK },
  129. { M32RBF_INSN_CLRPSW, && case_sem_INSN_CLRPSW },
  130. { M32RBF_INSN_SETPSW, && case_sem_INSN_SETPSW },
  131. { M32RBF_INSN_BSET, && case_sem_INSN_BSET },
  132. { M32RBF_INSN_BCLR, && case_sem_INSN_BCLR },
  133. { M32RBF_INSN_BTST, && case_sem_INSN_BTST },
  134. { 0, 0 }
  135. };
  136. int i;
  137. for (i = 0; labels[i].label != 0; ++i)
  138. {
  139. #if FAST_P
  140. CPU_IDESC (current_cpu) [labels[i].index].sem_fast_lab = labels[i].label;
  141. #else
  142. CPU_IDESC (current_cpu) [labels[i].index].sem_full_lab = labels[i].label;
  143. #endif
  144. }
  145. #undef DEFINE_LABELS
  146. #endif /* DEFINE_LABELS */
  147. #ifdef DEFINE_SWITCH
  148. /* If hyper-fast [well not unnecessarily slow] execution is selected, turn
  149. off frills like tracing and profiling. */
  150. /* FIXME: A better way would be to have CGEN_TRACE_RESULT check for something
  151. that can cause it to be optimized out. Another way would be to emit
  152. special handlers into the instruction "stream". */
  153. #if FAST_P
  154. #undef CGEN_TRACE_RESULT
  155. #define CGEN_TRACE_RESULT(cpu, abuf, name, type, val)
  156. #endif
  157. #undef GET_ATTR
  158. #define GET_ATTR(cpu, num, attr) CGEN_ATTR_VALUE (NULL, abuf->idesc->attrs, CGEN_INSN_##attr)
  159. {
  160. #if WITH_SCACHE_PBB
  161. /* Branch to next handler without going around main loop. */
  162. #define NEXT(vpc) goto * SEM_ARGBUF (vpc) -> semantic.sem_case
  163. SWITCH (sem, SEM_ARGBUF (vpc) -> semantic.sem_case)
  164. #else /* ! WITH_SCACHE_PBB */
  165. #define NEXT(vpc) BREAK (sem)
  166. #ifdef __GNUC__
  167. #if FAST_P
  168. SWITCH (sem, SEM_ARGBUF (sc) -> idesc->sem_fast_lab)
  169. #else
  170. SWITCH (sem, SEM_ARGBUF (sc) -> idesc->sem_full_lab)
  171. #endif
  172. #else
  173. SWITCH (sem, SEM_ARGBUF (sc) -> idesc->num)
  174. #endif
  175. #endif /* ! WITH_SCACHE_PBB */
  176. {
  177. CASE (sem, INSN_X_INVALID) : /* --invalid-- */
  178. {
  179. SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
  180. ARGBUF *abuf = SEM_ARGBUF (sem_arg);
  181. #define FLD(f) abuf->fields.sfmt_empty.f
  182. int UNUSED written = 0;
  183. IADDR UNUSED pc = abuf->addr;
  184. vpc = SEM_NEXT_VPC (sem_arg, pc, 0);
  185. {
  186. /* Update the recorded pc in the cpu state struct.
  187. Only necessary for WITH_SCACHE case, but to avoid the
  188. conditional compilation .... */
  189. SET_H_PC (pc);
  190. /* Virtual insns have zero size. Overwrite vpc with address of next insn
  191. using the default-insn-bitsize spec. When executing insns in parallel
  192. we may want to queue the fault and continue execution. */
  193. vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
  194. vpc = sim_engine_invalid_insn (current_cpu, pc, vpc);
  195. }
  196. #undef FLD
  197. }
  198. NEXT (vpc);
  199. CASE (sem, INSN_X_AFTER) : /* --after-- */
  200. {
  201. SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
  202. ARGBUF *abuf = SEM_ARGBUF (sem_arg);
  203. #define FLD(f) abuf->fields.sfmt_empty.f
  204. int UNUSED written = 0;
  205. IADDR UNUSED pc = abuf->addr;
  206. vpc = SEM_NEXT_VPC (sem_arg, pc, 0);
  207. {
  208. #if WITH_SCACHE_PBB_M32RBF
  209. m32rbf_pbb_after (current_cpu, sem_arg);
  210. #endif
  211. }
  212. #undef FLD
  213. }
  214. NEXT (vpc);
  215. CASE (sem, INSN_X_BEFORE) : /* --before-- */
  216. {
  217. SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
  218. ARGBUF *abuf = SEM_ARGBUF (sem_arg);
  219. #define FLD(f) abuf->fields.sfmt_empty.f
  220. int UNUSED written = 0;
  221. IADDR UNUSED pc = abuf->addr;
  222. vpc = SEM_NEXT_VPC (sem_arg, pc, 0);
  223. {
  224. #if WITH_SCACHE_PBB_M32RBF
  225. m32rbf_pbb_before (current_cpu, sem_arg);
  226. #endif
  227. }
  228. #undef FLD
  229. }
  230. NEXT (vpc);
  231. CASE (sem, INSN_X_CTI_CHAIN) : /* --cti-chain-- */
  232. {
  233. SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
  234. ARGBUF *abuf = SEM_ARGBUF (sem_arg);
  235. #define FLD(f) abuf->fields.sfmt_empty.f
  236. int UNUSED written = 0;
  237. IADDR UNUSED pc = abuf->addr;
  238. vpc = SEM_NEXT_VPC (sem_arg, pc, 0);
  239. {
  240. #if WITH_SCACHE_PBB_M32RBF
  241. #ifdef DEFINE_SWITCH
  242. vpc = m32rbf_pbb_cti_chain (current_cpu, sem_arg,
  243. pbb_br_type, pbb_br_npc);
  244. BREAK (sem);
  245. #else
  246. /* FIXME: Allow provision of explicit ifmt spec in insn spec. */
  247. vpc = m32rbf_pbb_cti_chain (current_cpu, sem_arg,
  248. CPU_PBB_BR_TYPE (current_cpu),
  249. CPU_PBB_BR_NPC (current_cpu));
  250. #endif
  251. #endif
  252. }
  253. #undef FLD
  254. }
  255. NEXT (vpc);
  256. CASE (sem, INSN_X_CHAIN) : /* --chain-- */
  257. {
  258. SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
  259. ARGBUF *abuf = SEM_ARGBUF (sem_arg);
  260. #define FLD(f) abuf->fields.sfmt_empty.f
  261. int UNUSED written = 0;
  262. IADDR UNUSED pc = abuf->addr;
  263. vpc = SEM_NEXT_VPC (sem_arg, pc, 0);
  264. {
  265. #if WITH_SCACHE_PBB_M32RBF
  266. vpc = m32rbf_pbb_chain (current_cpu, sem_arg);
  267. #ifdef DEFINE_SWITCH
  268. BREAK (sem);
  269. #endif
  270. #endif
  271. }
  272. #undef FLD
  273. }
  274. NEXT (vpc);
  275. CASE (sem, INSN_X_BEGIN) : /* --begin-- */
  276. {
  277. SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
  278. ARGBUF *abuf = SEM_ARGBUF (sem_arg);
  279. #define FLD(f) abuf->fields.sfmt_empty.f
  280. int UNUSED written = 0;
  281. IADDR UNUSED pc = abuf->addr;
  282. vpc = SEM_NEXT_VPC (sem_arg, pc, 0);
  283. {
  284. #if WITH_SCACHE_PBB_M32RBF
  285. #if defined DEFINE_SWITCH || defined FAST_P
  286. /* In the switch case FAST_P is a constant, allowing several optimizations
  287. in any called inline functions. */
  288. vpc = m32rbf_pbb_begin (current_cpu, FAST_P);
  289. #else
  290. #if 0 /* cgen engine can't handle dynamic fast/full switching yet. */
  291. vpc = m32rbf_pbb_begin (current_cpu, STATE_RUN_FAST_P (CPU_STATE (current_cpu)));
  292. #else
  293. vpc = m32rbf_pbb_begin (current_cpu, 0);
  294. #endif
  295. #endif
  296. #endif
  297. }
  298. #undef FLD
  299. }
  300. NEXT (vpc);
  301. CASE (sem, INSN_ADD) : /* add $dr,$sr */
  302. {
  303. SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
  304. ARGBUF *abuf = SEM_ARGBUF (sem_arg);
  305. #define FLD(f) abuf->fields.sfmt_add.f
  306. int UNUSED written = 0;
  307. IADDR UNUSED pc = abuf->addr;
  308. vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
  309. {
  310. SI opval = ADDSI (* FLD (i_dr), * FLD (i_sr));
  311. * FLD (i_dr) = opval;
  312. CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
  313. }
  314. #undef FLD
  315. }
  316. NEXT (vpc);
  317. CASE (sem, INSN_ADD3) : /* add3 $dr,$sr,$hash$slo16 */
  318. {
  319. SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
  320. ARGBUF *abuf = SEM_ARGBUF (sem_arg);
  321. #define FLD(f) abuf->fields.sfmt_add3.f
  322. int UNUSED written = 0;
  323. IADDR UNUSED pc = abuf->addr;
  324. vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
  325. {
  326. SI opval = ADDSI (* FLD (i_sr), FLD (f_simm16));
  327. * FLD (i_dr) = opval;
  328. CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
  329. }
  330. #undef FLD
  331. }
  332. NEXT (vpc);
  333. CASE (sem, INSN_AND) : /* and $dr,$sr */
  334. {
  335. SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
  336. ARGBUF *abuf = SEM_ARGBUF (sem_arg);
  337. #define FLD(f) abuf->fields.sfmt_add.f
  338. int UNUSED written = 0;
  339. IADDR UNUSED pc = abuf->addr;
  340. vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
  341. {
  342. SI opval = ANDSI (* FLD (i_dr), * FLD (i_sr));
  343. * FLD (i_dr) = opval;
  344. CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
  345. }
  346. #undef FLD
  347. }
  348. NEXT (vpc);
  349. CASE (sem, INSN_AND3) : /* and3 $dr,$sr,$uimm16 */
  350. {
  351. SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
  352. ARGBUF *abuf = SEM_ARGBUF (sem_arg);
  353. #define FLD(f) abuf->fields.sfmt_and3.f
  354. int UNUSED written = 0;
  355. IADDR UNUSED pc = abuf->addr;
  356. vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
  357. {
  358. SI opval = ANDSI (* FLD (i_sr), FLD (f_uimm16));
  359. * FLD (i_dr) = opval;
  360. CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
  361. }
  362. #undef FLD
  363. }
  364. NEXT (vpc);
  365. CASE (sem, INSN_OR) : /* or $dr,$sr */
  366. {
  367. SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
  368. ARGBUF *abuf = SEM_ARGBUF (sem_arg);
  369. #define FLD(f) abuf->fields.sfmt_add.f
  370. int UNUSED written = 0;
  371. IADDR UNUSED pc = abuf->addr;
  372. vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
  373. {
  374. SI opval = ORSI (* FLD (i_dr), * FLD (i_sr));
  375. * FLD (i_dr) = opval;
  376. CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
  377. }
  378. #undef FLD
  379. }
  380. NEXT (vpc);
  381. CASE (sem, INSN_OR3) : /* or3 $dr,$sr,$hash$ulo16 */
  382. {
  383. SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
  384. ARGBUF *abuf = SEM_ARGBUF (sem_arg);
  385. #define FLD(f) abuf->fields.sfmt_and3.f
  386. int UNUSED written = 0;
  387. IADDR UNUSED pc = abuf->addr;
  388. vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
  389. {
  390. SI opval = ORSI (* FLD (i_sr), FLD (f_uimm16));
  391. * FLD (i_dr) = opval;
  392. CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
  393. }
  394. #undef FLD
  395. }
  396. NEXT (vpc);
  397. CASE (sem, INSN_XOR) : /* xor $dr,$sr */
  398. {
  399. SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
  400. ARGBUF *abuf = SEM_ARGBUF (sem_arg);
  401. #define FLD(f) abuf->fields.sfmt_add.f
  402. int UNUSED written = 0;
  403. IADDR UNUSED pc = abuf->addr;
  404. vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
  405. {
  406. SI opval = XORSI (* FLD (i_dr), * FLD (i_sr));
  407. * FLD (i_dr) = opval;
  408. CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
  409. }
  410. #undef FLD
  411. }
  412. NEXT (vpc);
  413. CASE (sem, INSN_XOR3) : /* xor3 $dr,$sr,$uimm16 */
  414. {
  415. SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
  416. ARGBUF *abuf = SEM_ARGBUF (sem_arg);
  417. #define FLD(f) abuf->fields.sfmt_and3.f
  418. int UNUSED written = 0;
  419. IADDR UNUSED pc = abuf->addr;
  420. vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
  421. {
  422. SI opval = XORSI (* FLD (i_sr), FLD (f_uimm16));
  423. * FLD (i_dr) = opval;
  424. CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
  425. }
  426. #undef FLD
  427. }
  428. NEXT (vpc);
  429. CASE (sem, INSN_ADDI) : /* addi $dr,$simm8 */
  430. {
  431. SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
  432. ARGBUF *abuf = SEM_ARGBUF (sem_arg);
  433. #define FLD(f) abuf->fields.sfmt_addi.f
  434. int UNUSED written = 0;
  435. IADDR UNUSED pc = abuf->addr;
  436. vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
  437. {
  438. SI opval = ADDSI (* FLD (i_dr), FLD (f_simm8));
  439. * FLD (i_dr) = opval;
  440. CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
  441. }
  442. #undef FLD
  443. }
  444. NEXT (vpc);
  445. CASE (sem, INSN_ADDV) : /* addv $dr,$sr */
  446. {
  447. SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
  448. ARGBUF *abuf = SEM_ARGBUF (sem_arg);
  449. #define FLD(f) abuf->fields.sfmt_add.f
  450. int UNUSED written = 0;
  451. IADDR UNUSED pc = abuf->addr;
  452. vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
  453. {
  454. SI temp0;BI temp1;
  455. temp0 = ADDSI (* FLD (i_dr), * FLD (i_sr));
  456. temp1 = ADDOFSI (* FLD (i_dr), * FLD (i_sr), 0);
  457. {
  458. SI opval = temp0;
  459. * FLD (i_dr) = opval;
  460. CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
  461. }
  462. {
  463. BI opval = temp1;
  464. CPU (h_cond) = opval;
  465. CGEN_TRACE_RESULT (current_cpu, abuf, "cond", 'x', opval);
  466. }
  467. }
  468. #undef FLD
  469. }
  470. NEXT (vpc);
  471. CASE (sem, INSN_ADDV3) : /* addv3 $dr,$sr,$simm16 */
  472. {
  473. SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
  474. ARGBUF *abuf = SEM_ARGBUF (sem_arg);
  475. #define FLD(f) abuf->fields.sfmt_add3.f
  476. int UNUSED written = 0;
  477. IADDR UNUSED pc = abuf->addr;
  478. vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
  479. {
  480. SI temp0;BI temp1;
  481. temp0 = ADDSI (* FLD (i_sr), FLD (f_simm16));
  482. temp1 = ADDOFSI (* FLD (i_sr), FLD (f_simm16), 0);
  483. {
  484. SI opval = temp0;
  485. * FLD (i_dr) = opval;
  486. CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
  487. }
  488. {
  489. BI opval = temp1;
  490. CPU (h_cond) = opval;
  491. CGEN_TRACE_RESULT (current_cpu, abuf, "cond", 'x', opval);
  492. }
  493. }
  494. #undef FLD
  495. }
  496. NEXT (vpc);
  497. CASE (sem, INSN_ADDX) : /* addx $dr,$sr */
  498. {
  499. SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
  500. ARGBUF *abuf = SEM_ARGBUF (sem_arg);
  501. #define FLD(f) abuf->fields.sfmt_add.f
  502. int UNUSED written = 0;
  503. IADDR UNUSED pc = abuf->addr;
  504. vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
  505. {
  506. SI temp0;BI temp1;
  507. temp0 = ADDCSI (* FLD (i_dr), * FLD (i_sr), CPU (h_cond));
  508. temp1 = ADDCFSI (* FLD (i_dr), * FLD (i_sr), CPU (h_cond));
  509. {
  510. SI opval = temp0;
  511. * FLD (i_dr) = opval;
  512. CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
  513. }
  514. {
  515. BI opval = temp1;
  516. CPU (h_cond) = opval;
  517. CGEN_TRACE_RESULT (current_cpu, abuf, "cond", 'x', opval);
  518. }
  519. }
  520. #undef FLD
  521. }
  522. NEXT (vpc);
  523. CASE (sem, INSN_BC8) : /* bc.s $disp8 */
  524. {
  525. SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
  526. ARGBUF *abuf = SEM_ARGBUF (sem_arg);
  527. #define FLD(f) abuf->fields.sfmt_bl8.f
  528. int UNUSED written = 0;
  529. IADDR UNUSED pc = abuf->addr;
  530. SEM_BRANCH_INIT
  531. vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
  532. if (CPU (h_cond)) {
  533. {
  534. USI opval = FLD (i_disp8);
  535. SEM_BRANCH_VIA_CACHE (current_cpu, sem_arg, opval, vpc);
  536. written |= (1 << 2);
  537. CGEN_TRACE_RESULT (current_cpu, abuf, "pc", 'x', opval);
  538. }
  539. }
  540. abuf->written = written;
  541. SEM_BRANCH_FINI (vpc);
  542. #undef FLD
  543. }
  544. NEXT (vpc);
  545. CASE (sem, INSN_BC24) : /* bc.l $disp24 */
  546. {
  547. SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
  548. ARGBUF *abuf = SEM_ARGBUF (sem_arg);
  549. #define FLD(f) abuf->fields.sfmt_bl24.f
  550. int UNUSED written = 0;
  551. IADDR UNUSED pc = abuf->addr;
  552. SEM_BRANCH_INIT
  553. vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
  554. if (CPU (h_cond)) {
  555. {
  556. USI opval = FLD (i_disp24);
  557. SEM_BRANCH_VIA_CACHE (current_cpu, sem_arg, opval, vpc);
  558. written |= (1 << 2);
  559. CGEN_TRACE_RESULT (current_cpu, abuf, "pc", 'x', opval);
  560. }
  561. }
  562. abuf->written = written;
  563. SEM_BRANCH_FINI (vpc);
  564. #undef FLD
  565. }
  566. NEXT (vpc);
  567. CASE (sem, INSN_BEQ) : /* beq $src1,$src2,$disp16 */
  568. {
  569. SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
  570. ARGBUF *abuf = SEM_ARGBUF (sem_arg);
  571. #define FLD(f) abuf->fields.sfmt_beq.f
  572. int UNUSED written = 0;
  573. IADDR UNUSED pc = abuf->addr;
  574. SEM_BRANCH_INIT
  575. vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
  576. if (EQSI (* FLD (i_src1), * FLD (i_src2))) {
  577. {
  578. USI opval = FLD (i_disp16);
  579. SEM_BRANCH_VIA_CACHE (current_cpu, sem_arg, opval, vpc);
  580. written |= (1 << 3);
  581. CGEN_TRACE_RESULT (current_cpu, abuf, "pc", 'x', opval);
  582. }
  583. }
  584. abuf->written = written;
  585. SEM_BRANCH_FINI (vpc);
  586. #undef FLD
  587. }
  588. NEXT (vpc);
  589. CASE (sem, INSN_BEQZ) : /* beqz $src2,$disp16 */
  590. {
  591. SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
  592. ARGBUF *abuf = SEM_ARGBUF (sem_arg);
  593. #define FLD(f) abuf->fields.sfmt_beq.f
  594. int UNUSED written = 0;
  595. IADDR UNUSED pc = abuf->addr;
  596. SEM_BRANCH_INIT
  597. vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
  598. if (EQSI (* FLD (i_src2), 0)) {
  599. {
  600. USI opval = FLD (i_disp16);
  601. SEM_BRANCH_VIA_CACHE (current_cpu, sem_arg, opval, vpc);
  602. written |= (1 << 2);
  603. CGEN_TRACE_RESULT (current_cpu, abuf, "pc", 'x', opval);
  604. }
  605. }
  606. abuf->written = written;
  607. SEM_BRANCH_FINI (vpc);
  608. #undef FLD
  609. }
  610. NEXT (vpc);
  611. CASE (sem, INSN_BGEZ) : /* bgez $src2,$disp16 */
  612. {
  613. SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
  614. ARGBUF *abuf = SEM_ARGBUF (sem_arg);
  615. #define FLD(f) abuf->fields.sfmt_beq.f
  616. int UNUSED written = 0;
  617. IADDR UNUSED pc = abuf->addr;
  618. SEM_BRANCH_INIT
  619. vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
  620. if (GESI (* FLD (i_src2), 0)) {
  621. {
  622. USI opval = FLD (i_disp16);
  623. SEM_BRANCH_VIA_CACHE (current_cpu, sem_arg, opval, vpc);
  624. written |= (1 << 2);
  625. CGEN_TRACE_RESULT (current_cpu, abuf, "pc", 'x', opval);
  626. }
  627. }
  628. abuf->written = written;
  629. SEM_BRANCH_FINI (vpc);
  630. #undef FLD
  631. }
  632. NEXT (vpc);
  633. CASE (sem, INSN_BGTZ) : /* bgtz $src2,$disp16 */
  634. {
  635. SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
  636. ARGBUF *abuf = SEM_ARGBUF (sem_arg);
  637. #define FLD(f) abuf->fields.sfmt_beq.f
  638. int UNUSED written = 0;
  639. IADDR UNUSED pc = abuf->addr;
  640. SEM_BRANCH_INIT
  641. vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
  642. if (GTSI (* FLD (i_src2), 0)) {
  643. {
  644. USI opval = FLD (i_disp16);
  645. SEM_BRANCH_VIA_CACHE (current_cpu, sem_arg, opval, vpc);
  646. written |= (1 << 2);
  647. CGEN_TRACE_RESULT (current_cpu, abuf, "pc", 'x', opval);
  648. }
  649. }
  650. abuf->written = written;
  651. SEM_BRANCH_FINI (vpc);
  652. #undef FLD
  653. }
  654. NEXT (vpc);
  655. CASE (sem, INSN_BLEZ) : /* blez $src2,$disp16 */
  656. {
  657. SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
  658. ARGBUF *abuf = SEM_ARGBUF (sem_arg);
  659. #define FLD(f) abuf->fields.sfmt_beq.f
  660. int UNUSED written = 0;
  661. IADDR UNUSED pc = abuf->addr;
  662. SEM_BRANCH_INIT
  663. vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
  664. if (LESI (* FLD (i_src2), 0)) {
  665. {
  666. USI opval = FLD (i_disp16);
  667. SEM_BRANCH_VIA_CACHE (current_cpu, sem_arg, opval, vpc);
  668. written |= (1 << 2);
  669. CGEN_TRACE_RESULT (current_cpu, abuf, "pc", 'x', opval);
  670. }
  671. }
  672. abuf->written = written;
  673. SEM_BRANCH_FINI (vpc);
  674. #undef FLD
  675. }
  676. NEXT (vpc);
  677. CASE (sem, INSN_BLTZ) : /* bltz $src2,$disp16 */
  678. {
  679. SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
  680. ARGBUF *abuf = SEM_ARGBUF (sem_arg);
  681. #define FLD(f) abuf->fields.sfmt_beq.f
  682. int UNUSED written = 0;
  683. IADDR UNUSED pc = abuf->addr;
  684. SEM_BRANCH_INIT
  685. vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
  686. if (LTSI (* FLD (i_src2), 0)) {
  687. {
  688. USI opval = FLD (i_disp16);
  689. SEM_BRANCH_VIA_CACHE (current_cpu, sem_arg, opval, vpc);
  690. written |= (1 << 2);
  691. CGEN_TRACE_RESULT (current_cpu, abuf, "pc", 'x', opval);
  692. }
  693. }
  694. abuf->written = written;
  695. SEM_BRANCH_FINI (vpc);
  696. #undef FLD
  697. }
  698. NEXT (vpc);
  699. CASE (sem, INSN_BNEZ) : /* bnez $src2,$disp16 */
  700. {
  701. SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
  702. ARGBUF *abuf = SEM_ARGBUF (sem_arg);
  703. #define FLD(f) abuf->fields.sfmt_beq.f
  704. int UNUSED written = 0;
  705. IADDR UNUSED pc = abuf->addr;
  706. SEM_BRANCH_INIT
  707. vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
  708. if (NESI (* FLD (i_src2), 0)) {
  709. {
  710. USI opval = FLD (i_disp16);
  711. SEM_BRANCH_VIA_CACHE (current_cpu, sem_arg, opval, vpc);
  712. written |= (1 << 2);
  713. CGEN_TRACE_RESULT (current_cpu, abuf, "pc", 'x', opval);
  714. }
  715. }
  716. abuf->written = written;
  717. SEM_BRANCH_FINI (vpc);
  718. #undef FLD
  719. }
  720. NEXT (vpc);
  721. CASE (sem, INSN_BL8) : /* bl.s $disp8 */
  722. {
  723. SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
  724. ARGBUF *abuf = SEM_ARGBUF (sem_arg);
  725. #define FLD(f) abuf->fields.sfmt_bl8.f
  726. int UNUSED written = 0;
  727. IADDR UNUSED pc = abuf->addr;
  728. SEM_BRANCH_INIT
  729. vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
  730. {
  731. {
  732. SI opval = ADDSI (ANDSI (pc, -4), 4);
  733. CPU (h_gr[((UINT) 14)]) = opval;
  734. CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
  735. }
  736. {
  737. USI opval = FLD (i_disp8);
  738. SEM_BRANCH_VIA_CACHE (current_cpu, sem_arg, opval, vpc);
  739. CGEN_TRACE_RESULT (current_cpu, abuf, "pc", 'x', opval);
  740. }
  741. }
  742. SEM_BRANCH_FINI (vpc);
  743. #undef FLD
  744. }
  745. NEXT (vpc);
  746. CASE (sem, INSN_BL24) : /* bl.l $disp24 */
  747. {
  748. SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
  749. ARGBUF *abuf = SEM_ARGBUF (sem_arg);
  750. #define FLD(f) abuf->fields.sfmt_bl24.f
  751. int UNUSED written = 0;
  752. IADDR UNUSED pc = abuf->addr;
  753. SEM_BRANCH_INIT
  754. vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
  755. {
  756. {
  757. SI opval = ADDSI (pc, 4);
  758. CPU (h_gr[((UINT) 14)]) = opval;
  759. CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
  760. }
  761. {
  762. USI opval = FLD (i_disp24);
  763. SEM_BRANCH_VIA_CACHE (current_cpu, sem_arg, opval, vpc);
  764. CGEN_TRACE_RESULT (current_cpu, abuf, "pc", 'x', opval);
  765. }
  766. }
  767. SEM_BRANCH_FINI (vpc);
  768. #undef FLD
  769. }
  770. NEXT (vpc);
  771. CASE (sem, INSN_BNC8) : /* bnc.s $disp8 */
  772. {
  773. SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
  774. ARGBUF *abuf = SEM_ARGBUF (sem_arg);
  775. #define FLD(f) abuf->fields.sfmt_bl8.f
  776. int UNUSED written = 0;
  777. IADDR UNUSED pc = abuf->addr;
  778. SEM_BRANCH_INIT
  779. vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
  780. if (NOTBI (CPU (h_cond))) {
  781. {
  782. USI opval = FLD (i_disp8);
  783. SEM_BRANCH_VIA_CACHE (current_cpu, sem_arg, opval, vpc);
  784. written |= (1 << 2);
  785. CGEN_TRACE_RESULT (current_cpu, abuf, "pc", 'x', opval);
  786. }
  787. }
  788. abuf->written = written;
  789. SEM_BRANCH_FINI (vpc);
  790. #undef FLD
  791. }
  792. NEXT (vpc);
  793. CASE (sem, INSN_BNC24) : /* bnc.l $disp24 */
  794. {
  795. SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
  796. ARGBUF *abuf = SEM_ARGBUF (sem_arg);
  797. #define FLD(f) abuf->fields.sfmt_bl24.f
  798. int UNUSED written = 0;
  799. IADDR UNUSED pc = abuf->addr;
  800. SEM_BRANCH_INIT
  801. vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
  802. if (NOTBI (CPU (h_cond))) {
  803. {
  804. USI opval = FLD (i_disp24);
  805. SEM_BRANCH_VIA_CACHE (current_cpu, sem_arg, opval, vpc);
  806. written |= (1 << 2);
  807. CGEN_TRACE_RESULT (current_cpu, abuf, "pc", 'x', opval);
  808. }
  809. }
  810. abuf->written = written;
  811. SEM_BRANCH_FINI (vpc);
  812. #undef FLD
  813. }
  814. NEXT (vpc);
  815. CASE (sem, INSN_BNE) : /* bne $src1,$src2,$disp16 */
  816. {
  817. SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
  818. ARGBUF *abuf = SEM_ARGBUF (sem_arg);
  819. #define FLD(f) abuf->fields.sfmt_beq.f
  820. int UNUSED written = 0;
  821. IADDR UNUSED pc = abuf->addr;
  822. SEM_BRANCH_INIT
  823. vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
  824. if (NESI (* FLD (i_src1), * FLD (i_src2))) {
  825. {
  826. USI opval = FLD (i_disp16);
  827. SEM_BRANCH_VIA_CACHE (current_cpu, sem_arg, opval, vpc);
  828. written |= (1 << 3);
  829. CGEN_TRACE_RESULT (current_cpu, abuf, "pc", 'x', opval);
  830. }
  831. }
  832. abuf->written = written;
  833. SEM_BRANCH_FINI (vpc);
  834. #undef FLD
  835. }
  836. NEXT (vpc);
  837. CASE (sem, INSN_BRA8) : /* bra.s $disp8 */
  838. {
  839. SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
  840. ARGBUF *abuf = SEM_ARGBUF (sem_arg);
  841. #define FLD(f) abuf->fields.sfmt_bl8.f
  842. int UNUSED written = 0;
  843. IADDR UNUSED pc = abuf->addr;
  844. SEM_BRANCH_INIT
  845. vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
  846. {
  847. USI opval = FLD (i_disp8);
  848. SEM_BRANCH_VIA_CACHE (current_cpu, sem_arg, opval, vpc);
  849. CGEN_TRACE_RESULT (current_cpu, abuf, "pc", 'x', opval);
  850. }
  851. SEM_BRANCH_FINI (vpc);
  852. #undef FLD
  853. }
  854. NEXT (vpc);
  855. CASE (sem, INSN_BRA24) : /* bra.l $disp24 */
  856. {
  857. SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
  858. ARGBUF *abuf = SEM_ARGBUF (sem_arg);
  859. #define FLD(f) abuf->fields.sfmt_bl24.f
  860. int UNUSED written = 0;
  861. IADDR UNUSED pc = abuf->addr;
  862. SEM_BRANCH_INIT
  863. vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
  864. {
  865. USI opval = FLD (i_disp24);
  866. SEM_BRANCH_VIA_CACHE (current_cpu, sem_arg, opval, vpc);
  867. CGEN_TRACE_RESULT (current_cpu, abuf, "pc", 'x', opval);
  868. }
  869. SEM_BRANCH_FINI (vpc);
  870. #undef FLD
  871. }
  872. NEXT (vpc);
  873. CASE (sem, INSN_CMP) : /* cmp $src1,$src2 */
  874. {
  875. SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
  876. ARGBUF *abuf = SEM_ARGBUF (sem_arg);
  877. #define FLD(f) abuf->fields.sfmt_st_plus.f
  878. int UNUSED written = 0;
  879. IADDR UNUSED pc = abuf->addr;
  880. vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
  881. {
  882. BI opval = LTSI (* FLD (i_src1), * FLD (i_src2));
  883. CPU (h_cond) = opval;
  884. CGEN_TRACE_RESULT (current_cpu, abuf, "cond", 'x', opval);
  885. }
  886. #undef FLD
  887. }
  888. NEXT (vpc);
  889. CASE (sem, INSN_CMPI) : /* cmpi $src2,$simm16 */
  890. {
  891. SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
  892. ARGBUF *abuf = SEM_ARGBUF (sem_arg);
  893. #define FLD(f) abuf->fields.sfmt_st_d.f
  894. int UNUSED written = 0;
  895. IADDR UNUSED pc = abuf->addr;
  896. vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
  897. {
  898. BI opval = LTSI (* FLD (i_src2), FLD (f_simm16));
  899. CPU (h_cond) = opval;
  900. CGEN_TRACE_RESULT (current_cpu, abuf, "cond", 'x', opval);
  901. }
  902. #undef FLD
  903. }
  904. NEXT (vpc);
  905. CASE (sem, INSN_CMPU) : /* cmpu $src1,$src2 */
  906. {
  907. SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
  908. ARGBUF *abuf = SEM_ARGBUF (sem_arg);
  909. #define FLD(f) abuf->fields.sfmt_st_plus.f
  910. int UNUSED written = 0;
  911. IADDR UNUSED pc = abuf->addr;
  912. vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
  913. {
  914. BI opval = LTUSI (* FLD (i_src1), * FLD (i_src2));
  915. CPU (h_cond) = opval;
  916. CGEN_TRACE_RESULT (current_cpu, abuf, "cond", 'x', opval);
  917. }
  918. #undef FLD
  919. }
  920. NEXT (vpc);
  921. CASE (sem, INSN_CMPUI) : /* cmpui $src2,$simm16 */
  922. {
  923. SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
  924. ARGBUF *abuf = SEM_ARGBUF (sem_arg);
  925. #define FLD(f) abuf->fields.sfmt_st_d.f
  926. int UNUSED written = 0;
  927. IADDR UNUSED pc = abuf->addr;
  928. vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
  929. {
  930. BI opval = LTUSI (* FLD (i_src2), FLD (f_simm16));
  931. CPU (h_cond) = opval;
  932. CGEN_TRACE_RESULT (current_cpu, abuf, "cond", 'x', opval);
  933. }
  934. #undef FLD
  935. }
  936. NEXT (vpc);
  937. CASE (sem, INSN_DIV) : /* div $dr,$sr */
  938. {
  939. SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
  940. ARGBUF *abuf = SEM_ARGBUF (sem_arg);
  941. #define FLD(f) abuf->fields.sfmt_add.f
  942. int UNUSED written = 0;
  943. IADDR UNUSED pc = abuf->addr;
  944. vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
  945. if (NESI (* FLD (i_sr), 0)) {
  946. {
  947. SI opval = DIVSI (* FLD (i_dr), * FLD (i_sr));
  948. * FLD (i_dr) = opval;
  949. written |= (1 << 2);
  950. CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
  951. }
  952. }
  953. abuf->written = written;
  954. #undef FLD
  955. }
  956. NEXT (vpc);
  957. CASE (sem, INSN_DIVU) : /* divu $dr,$sr */
  958. {
  959. SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
  960. ARGBUF *abuf = SEM_ARGBUF (sem_arg);
  961. #define FLD(f) abuf->fields.sfmt_add.f
  962. int UNUSED written = 0;
  963. IADDR UNUSED pc = abuf->addr;
  964. vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
  965. if (NESI (* FLD (i_sr), 0)) {
  966. {
  967. SI opval = UDIVSI (* FLD (i_dr), * FLD (i_sr));
  968. * FLD (i_dr) = opval;
  969. written |= (1 << 2);
  970. CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
  971. }
  972. }
  973. abuf->written = written;
  974. #undef FLD
  975. }
  976. NEXT (vpc);
  977. CASE (sem, INSN_REM) : /* rem $dr,$sr */
  978. {
  979. SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
  980. ARGBUF *abuf = SEM_ARGBUF (sem_arg);
  981. #define FLD(f) abuf->fields.sfmt_add.f
  982. int UNUSED written = 0;
  983. IADDR UNUSED pc = abuf->addr;
  984. vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
  985. if (NESI (* FLD (i_sr), 0)) {
  986. {
  987. SI opval = MODSI (* FLD (i_dr), * FLD (i_sr));
  988. * FLD (i_dr) = opval;
  989. written |= (1 << 2);
  990. CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
  991. }
  992. }
  993. abuf->written = written;
  994. #undef FLD
  995. }
  996. NEXT (vpc);
  997. CASE (sem, INSN_REMU) : /* remu $dr,$sr */
  998. {
  999. SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
  1000. ARGBUF *abuf = SEM_ARGBUF (sem_arg);
  1001. #define FLD(f) abuf->fields.sfmt_add.f
  1002. int UNUSED written = 0;
  1003. IADDR UNUSED pc = abuf->addr;
  1004. vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
  1005. if (NESI (* FLD (i_sr), 0)) {
  1006. {
  1007. SI opval = UMODSI (* FLD (i_dr), * FLD (i_sr));
  1008. * FLD (i_dr) = opval;
  1009. written |= (1 << 2);
  1010. CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
  1011. }
  1012. }
  1013. abuf->written = written;
  1014. #undef FLD
  1015. }
  1016. NEXT (vpc);
  1017. CASE (sem, INSN_JL) : /* jl $sr */
  1018. {
  1019. SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
  1020. ARGBUF *abuf = SEM_ARGBUF (sem_arg);
  1021. #define FLD(f) abuf->fields.sfmt_jl.f
  1022. int UNUSED written = 0;
  1023. IADDR UNUSED pc = abuf->addr;
  1024. SEM_BRANCH_INIT
  1025. vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
  1026. {
  1027. SI temp0;USI temp1;
  1028. temp0 = ADDSI (ANDSI (pc, -4), 4);
  1029. temp1 = ANDSI (* FLD (i_sr), -4);
  1030. {
  1031. SI opval = temp0;
  1032. CPU (h_gr[((UINT) 14)]) = opval;
  1033. CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
  1034. }
  1035. {
  1036. USI opval = temp1;
  1037. SEM_BRANCH_VIA_ADDR (current_cpu, sem_arg, opval, vpc);
  1038. CGEN_TRACE_RESULT (current_cpu, abuf, "pc", 'x', opval);
  1039. }
  1040. }
  1041. SEM_BRANCH_FINI (vpc);
  1042. #undef FLD
  1043. }
  1044. NEXT (vpc);
  1045. CASE (sem, INSN_JMP) : /* jmp $sr */
  1046. {
  1047. SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
  1048. ARGBUF *abuf = SEM_ARGBUF (sem_arg);
  1049. #define FLD(f) abuf->fields.sfmt_jl.f
  1050. int UNUSED written = 0;
  1051. IADDR UNUSED pc = abuf->addr;
  1052. SEM_BRANCH_INIT
  1053. vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
  1054. {
  1055. USI opval = ANDSI (* FLD (i_sr), -4);
  1056. SEM_BRANCH_VIA_ADDR (current_cpu, sem_arg, opval, vpc);
  1057. CGEN_TRACE_RESULT (current_cpu, abuf, "pc", 'x', opval);
  1058. }
  1059. SEM_BRANCH_FINI (vpc);
  1060. #undef FLD
  1061. }
  1062. NEXT (vpc);
  1063. CASE (sem, INSN_LD) : /* ld $dr,@$sr */
  1064. {
  1065. SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
  1066. ARGBUF *abuf = SEM_ARGBUF (sem_arg);
  1067. #define FLD(f) abuf->fields.sfmt_ld_plus.f
  1068. int UNUSED written = 0;
  1069. IADDR UNUSED pc = abuf->addr;
  1070. vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
  1071. {
  1072. SI opval = GETMEMSI (current_cpu, pc, * FLD (i_sr));
  1073. * FLD (i_dr) = opval;
  1074. CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
  1075. }
  1076. #undef FLD
  1077. }
  1078. NEXT (vpc);
  1079. CASE (sem, INSN_LD_D) : /* ld $dr,@($slo16,$sr) */
  1080. {
  1081. SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
  1082. ARGBUF *abuf = SEM_ARGBUF (sem_arg);
  1083. #define FLD(f) abuf->fields.sfmt_add3.f
  1084. int UNUSED written = 0;
  1085. IADDR UNUSED pc = abuf->addr;
  1086. vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
  1087. {
  1088. SI opval = GETMEMSI (current_cpu, pc, ADDSI (* FLD (i_sr), FLD (f_simm16)));
  1089. * FLD (i_dr) = opval;
  1090. CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
  1091. }
  1092. #undef FLD
  1093. }
  1094. NEXT (vpc);
  1095. CASE (sem, INSN_LDB) : /* ldb $dr,@$sr */
  1096. {
  1097. SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
  1098. ARGBUF *abuf = SEM_ARGBUF (sem_arg);
  1099. #define FLD(f) abuf->fields.sfmt_ld_plus.f
  1100. int UNUSED written = 0;
  1101. IADDR UNUSED pc = abuf->addr;
  1102. vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
  1103. {
  1104. SI opval = EXTQISI (GETMEMQI (current_cpu, pc, * FLD (i_sr)));
  1105. * FLD (i_dr) = opval;
  1106. CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
  1107. }
  1108. #undef FLD
  1109. }
  1110. NEXT (vpc);
  1111. CASE (sem, INSN_LDB_D) : /* ldb $dr,@($slo16,$sr) */
  1112. {
  1113. SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
  1114. ARGBUF *abuf = SEM_ARGBUF (sem_arg);
  1115. #define FLD(f) abuf->fields.sfmt_add3.f
  1116. int UNUSED written = 0;
  1117. IADDR UNUSED pc = abuf->addr;
  1118. vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
  1119. {
  1120. SI opval = EXTQISI (GETMEMQI (current_cpu, pc, ADDSI (* FLD (i_sr), FLD (f_simm16))));
  1121. * FLD (i_dr) = opval;
  1122. CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
  1123. }
  1124. #undef FLD
  1125. }
  1126. NEXT (vpc);
  1127. CASE (sem, INSN_LDH) : /* ldh $dr,@$sr */
  1128. {
  1129. SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
  1130. ARGBUF *abuf = SEM_ARGBUF (sem_arg);
  1131. #define FLD(f) abuf->fields.sfmt_ld_plus.f
  1132. int UNUSED written = 0;
  1133. IADDR UNUSED pc = abuf->addr;
  1134. vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
  1135. {
  1136. SI opval = EXTHISI (GETMEMHI (current_cpu, pc, * FLD (i_sr)));
  1137. * FLD (i_dr) = opval;
  1138. CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
  1139. }
  1140. #undef FLD
  1141. }
  1142. NEXT (vpc);
  1143. CASE (sem, INSN_LDH_D) : /* ldh $dr,@($slo16,$sr) */
  1144. {
  1145. SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
  1146. ARGBUF *abuf = SEM_ARGBUF (sem_arg);
  1147. #define FLD(f) abuf->fields.sfmt_add3.f
  1148. int UNUSED written = 0;
  1149. IADDR UNUSED pc = abuf->addr;
  1150. vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
  1151. {
  1152. SI opval = EXTHISI (GETMEMHI (current_cpu, pc, ADDSI (* FLD (i_sr), FLD (f_simm16))));
  1153. * FLD (i_dr) = opval;
  1154. CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
  1155. }
  1156. #undef FLD
  1157. }
  1158. NEXT (vpc);
  1159. CASE (sem, INSN_LDUB) : /* ldub $dr,@$sr */
  1160. {
  1161. SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
  1162. ARGBUF *abuf = SEM_ARGBUF (sem_arg);
  1163. #define FLD(f) abuf->fields.sfmt_ld_plus.f
  1164. int UNUSED written = 0;
  1165. IADDR UNUSED pc = abuf->addr;
  1166. vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
  1167. {
  1168. SI opval = ZEXTQISI (GETMEMQI (current_cpu, pc, * FLD (i_sr)));
  1169. * FLD (i_dr) = opval;
  1170. CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
  1171. }
  1172. #undef FLD
  1173. }
  1174. NEXT (vpc);
  1175. CASE (sem, INSN_LDUB_D) : /* ldub $dr,@($slo16,$sr) */
  1176. {
  1177. SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
  1178. ARGBUF *abuf = SEM_ARGBUF (sem_arg);
  1179. #define FLD(f) abuf->fields.sfmt_add3.f
  1180. int UNUSED written = 0;
  1181. IADDR UNUSED pc = abuf->addr;
  1182. vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
  1183. {
  1184. SI opval = ZEXTQISI (GETMEMQI (current_cpu, pc, ADDSI (* FLD (i_sr), FLD (f_simm16))));
  1185. * FLD (i_dr) = opval;
  1186. CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
  1187. }
  1188. #undef FLD
  1189. }
  1190. NEXT (vpc);
  1191. CASE (sem, INSN_LDUH) : /* lduh $dr,@$sr */
  1192. {
  1193. SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
  1194. ARGBUF *abuf = SEM_ARGBUF (sem_arg);
  1195. #define FLD(f) abuf->fields.sfmt_ld_plus.f
  1196. int UNUSED written = 0;
  1197. IADDR UNUSED pc = abuf->addr;
  1198. vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
  1199. {
  1200. SI opval = ZEXTHISI (GETMEMHI (current_cpu, pc, * FLD (i_sr)));
  1201. * FLD (i_dr) = opval;
  1202. CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
  1203. }
  1204. #undef FLD
  1205. }
  1206. NEXT (vpc);
  1207. CASE (sem, INSN_LDUH_D) : /* lduh $dr,@($slo16,$sr) */
  1208. {
  1209. SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
  1210. ARGBUF *abuf = SEM_ARGBUF (sem_arg);
  1211. #define FLD(f) abuf->fields.sfmt_add3.f
  1212. int UNUSED written = 0;
  1213. IADDR UNUSED pc = abuf->addr;
  1214. vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
  1215. {
  1216. SI opval = ZEXTHISI (GETMEMHI (current_cpu, pc, ADDSI (* FLD (i_sr), FLD (f_simm16))));
  1217. * FLD (i_dr) = opval;
  1218. CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
  1219. }
  1220. #undef FLD
  1221. }
  1222. NEXT (vpc);
  1223. CASE (sem, INSN_LD_PLUS) : /* ld $dr,@$sr+ */
  1224. {
  1225. SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
  1226. ARGBUF *abuf = SEM_ARGBUF (sem_arg);
  1227. #define FLD(f) abuf->fields.sfmt_ld_plus.f
  1228. int UNUSED written = 0;
  1229. IADDR UNUSED pc = abuf->addr;
  1230. vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
  1231. {
  1232. SI temp0;SI temp1;
  1233. temp0 = GETMEMSI (current_cpu, pc, * FLD (i_sr));
  1234. temp1 = ADDSI (* FLD (i_sr), 4);
  1235. {
  1236. SI opval = temp0;
  1237. * FLD (i_dr) = opval;
  1238. CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
  1239. }
  1240. {
  1241. SI opval = temp1;
  1242. * FLD (i_sr) = opval;
  1243. CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
  1244. }
  1245. }
  1246. #undef FLD
  1247. }
  1248. NEXT (vpc);
  1249. CASE (sem, INSN_LD24) : /* ld24 $dr,$uimm24 */
  1250. {
  1251. SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
  1252. ARGBUF *abuf = SEM_ARGBUF (sem_arg);
  1253. #define FLD(f) abuf->fields.sfmt_ld24.f
  1254. int UNUSED written = 0;
  1255. IADDR UNUSED pc = abuf->addr;
  1256. vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
  1257. {
  1258. SI opval = FLD (i_uimm24);
  1259. * FLD (i_dr) = opval;
  1260. CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
  1261. }
  1262. #undef FLD
  1263. }
  1264. NEXT (vpc);
  1265. CASE (sem, INSN_LDI8) : /* ldi8 $dr,$simm8 */
  1266. {
  1267. SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
  1268. ARGBUF *abuf = SEM_ARGBUF (sem_arg);
  1269. #define FLD(f) abuf->fields.sfmt_addi.f
  1270. int UNUSED written = 0;
  1271. IADDR UNUSED pc = abuf->addr;
  1272. vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
  1273. {
  1274. SI opval = FLD (f_simm8);
  1275. * FLD (i_dr) = opval;
  1276. CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
  1277. }
  1278. #undef FLD
  1279. }
  1280. NEXT (vpc);
  1281. CASE (sem, INSN_LDI16) : /* ldi16 $dr,$hash$slo16 */
  1282. {
  1283. SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
  1284. ARGBUF *abuf = SEM_ARGBUF (sem_arg);
  1285. #define FLD(f) abuf->fields.sfmt_add3.f
  1286. int UNUSED written = 0;
  1287. IADDR UNUSED pc = abuf->addr;
  1288. vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
  1289. {
  1290. SI opval = FLD (f_simm16);
  1291. * FLD (i_dr) = opval;
  1292. CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
  1293. }
  1294. #undef FLD
  1295. }
  1296. NEXT (vpc);
  1297. CASE (sem, INSN_LOCK) : /* lock $dr,@$sr */
  1298. {
  1299. SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
  1300. ARGBUF *abuf = SEM_ARGBUF (sem_arg);
  1301. #define FLD(f) abuf->fields.sfmt_ld_plus.f
  1302. int UNUSED written = 0;
  1303. IADDR UNUSED pc = abuf->addr;
  1304. vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
  1305. {
  1306. {
  1307. BI opval = 1;
  1308. CPU (h_lock) = opval;
  1309. CGEN_TRACE_RESULT (current_cpu, abuf, "lock", 'x', opval);
  1310. }
  1311. {
  1312. SI opval = GETMEMSI (current_cpu, pc, * FLD (i_sr));
  1313. * FLD (i_dr) = opval;
  1314. CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
  1315. }
  1316. }
  1317. #undef FLD
  1318. }
  1319. NEXT (vpc);
  1320. CASE (sem, INSN_MACHI) : /* machi $src1,$src2 */
  1321. {
  1322. SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
  1323. ARGBUF *abuf = SEM_ARGBUF (sem_arg);
  1324. #define FLD(f) abuf->fields.sfmt_st_plus.f
  1325. int UNUSED written = 0;
  1326. IADDR UNUSED pc = abuf->addr;
  1327. vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
  1328. {
  1329. DI opval = SRADI (SLLDI (ADDDI (GET_H_ACCUM (), MULDI (EXTSIDI (ANDSI (* FLD (i_src1), 0xffff0000)), EXTHIDI (TRUNCSIHI (SRASI (* FLD (i_src2), 16))))), 8), 8);
  1330. SET_H_ACCUM (opval);
  1331. CGEN_TRACE_RESULT (current_cpu, abuf, "accum", 'D', opval);
  1332. }
  1333. #undef FLD
  1334. }
  1335. NEXT (vpc);
  1336. CASE (sem, INSN_MACLO) : /* maclo $src1,$src2 */
  1337. {
  1338. SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
  1339. ARGBUF *abuf = SEM_ARGBUF (sem_arg);
  1340. #define FLD(f) abuf->fields.sfmt_st_plus.f
  1341. int UNUSED written = 0;
  1342. IADDR UNUSED pc = abuf->addr;
  1343. vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
  1344. {
  1345. DI opval = SRADI (SLLDI (ADDDI (GET_H_ACCUM (), MULDI (EXTSIDI (SLLSI (* FLD (i_src1), 16)), EXTHIDI (TRUNCSIHI (* FLD (i_src2))))), 8), 8);
  1346. SET_H_ACCUM (opval);
  1347. CGEN_TRACE_RESULT (current_cpu, abuf, "accum", 'D', opval);
  1348. }
  1349. #undef FLD
  1350. }
  1351. NEXT (vpc);
  1352. CASE (sem, INSN_MACWHI) : /* macwhi $src1,$src2 */
  1353. {
  1354. SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
  1355. ARGBUF *abuf = SEM_ARGBUF (sem_arg);
  1356. #define FLD(f) abuf->fields.sfmt_st_plus.f
  1357. int UNUSED written = 0;
  1358. IADDR UNUSED pc = abuf->addr;
  1359. vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
  1360. {
  1361. DI opval = SRADI (SLLDI (ADDDI (GET_H_ACCUM (), MULDI (EXTSIDI (* FLD (i_src1)), EXTHIDI (TRUNCSIHI (SRASI (* FLD (i_src2), 16))))), 8), 8);
  1362. SET_H_ACCUM (opval);
  1363. CGEN_TRACE_RESULT (current_cpu, abuf, "accum", 'D', opval);
  1364. }
  1365. #undef FLD
  1366. }
  1367. NEXT (vpc);
  1368. CASE (sem, INSN_MACWLO) : /* macwlo $src1,$src2 */
  1369. {
  1370. SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
  1371. ARGBUF *abuf = SEM_ARGBUF (sem_arg);
  1372. #define FLD(f) abuf->fields.sfmt_st_plus.f
  1373. int UNUSED written = 0;
  1374. IADDR UNUSED pc = abuf->addr;
  1375. vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
  1376. {
  1377. DI opval = SRADI (SLLDI (ADDDI (GET_H_ACCUM (), MULDI (EXTSIDI (* FLD (i_src1)), EXTHIDI (TRUNCSIHI (* FLD (i_src2))))), 8), 8);
  1378. SET_H_ACCUM (opval);
  1379. CGEN_TRACE_RESULT (current_cpu, abuf, "accum", 'D', opval);
  1380. }
  1381. #undef FLD
  1382. }
  1383. NEXT (vpc);
  1384. CASE (sem, INSN_MUL) : /* mul $dr,$sr */
  1385. {
  1386. SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
  1387. ARGBUF *abuf = SEM_ARGBUF (sem_arg);
  1388. #define FLD(f) abuf->fields.sfmt_add.f
  1389. int UNUSED written = 0;
  1390. IADDR UNUSED pc = abuf->addr;
  1391. vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
  1392. {
  1393. SI opval = MULSI (* FLD (i_dr), * FLD (i_sr));
  1394. * FLD (i_dr) = opval;
  1395. CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
  1396. }
  1397. #undef FLD
  1398. }
  1399. NEXT (vpc);
  1400. CASE (sem, INSN_MULHI) : /* mulhi $src1,$src2 */
  1401. {
  1402. SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
  1403. ARGBUF *abuf = SEM_ARGBUF (sem_arg);
  1404. #define FLD(f) abuf->fields.sfmt_st_plus.f
  1405. int UNUSED written = 0;
  1406. IADDR UNUSED pc = abuf->addr;
  1407. vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
  1408. {
  1409. DI opval = SRADI (SLLDI (MULDI (EXTSIDI (ANDSI (* FLD (i_src1), 0xffff0000)), EXTHIDI (TRUNCSIHI (SRASI (* FLD (i_src2), 16)))), 16), 16);
  1410. SET_H_ACCUM (opval);
  1411. CGEN_TRACE_RESULT (current_cpu, abuf, "accum", 'D', opval);
  1412. }
  1413. #undef FLD
  1414. }
  1415. NEXT (vpc);
  1416. CASE (sem, INSN_MULLO) : /* mullo $src1,$src2 */
  1417. {
  1418. SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
  1419. ARGBUF *abuf = SEM_ARGBUF (sem_arg);
  1420. #define FLD(f) abuf->fields.sfmt_st_plus.f
  1421. int UNUSED written = 0;
  1422. IADDR UNUSED pc = abuf->addr;
  1423. vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
  1424. {
  1425. DI opval = SRADI (SLLDI (MULDI (EXTSIDI (SLLSI (* FLD (i_src1), 16)), EXTHIDI (TRUNCSIHI (* FLD (i_src2)))), 16), 16);
  1426. SET_H_ACCUM (opval);
  1427. CGEN_TRACE_RESULT (current_cpu, abuf, "accum", 'D', opval);
  1428. }
  1429. #undef FLD
  1430. }
  1431. NEXT (vpc);
  1432. CASE (sem, INSN_MULWHI) : /* mulwhi $src1,$src2 */
  1433. {
  1434. SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
  1435. ARGBUF *abuf = SEM_ARGBUF (sem_arg);
  1436. #define FLD(f) abuf->fields.sfmt_st_plus.f
  1437. int UNUSED written = 0;
  1438. IADDR UNUSED pc = abuf->addr;
  1439. vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
  1440. {
  1441. DI opval = SRADI (SLLDI (MULDI (EXTSIDI (* FLD (i_src1)), EXTHIDI (TRUNCSIHI (SRASI (* FLD (i_src2), 16)))), 8), 8);
  1442. SET_H_ACCUM (opval);
  1443. CGEN_TRACE_RESULT (current_cpu, abuf, "accum", 'D', opval);
  1444. }
  1445. #undef FLD
  1446. }
  1447. NEXT (vpc);
  1448. CASE (sem, INSN_MULWLO) : /* mulwlo $src1,$src2 */
  1449. {
  1450. SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
  1451. ARGBUF *abuf = SEM_ARGBUF (sem_arg);
  1452. #define FLD(f) abuf->fields.sfmt_st_plus.f
  1453. int UNUSED written = 0;
  1454. IADDR UNUSED pc = abuf->addr;
  1455. vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
  1456. {
  1457. DI opval = SRADI (SLLDI (MULDI (EXTSIDI (* FLD (i_src1)), EXTHIDI (TRUNCSIHI (* FLD (i_src2)))), 8), 8);
  1458. SET_H_ACCUM (opval);
  1459. CGEN_TRACE_RESULT (current_cpu, abuf, "accum", 'D', opval);
  1460. }
  1461. #undef FLD
  1462. }
  1463. NEXT (vpc);
  1464. CASE (sem, INSN_MV) : /* mv $dr,$sr */
  1465. {
  1466. SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
  1467. ARGBUF *abuf = SEM_ARGBUF (sem_arg);
  1468. #define FLD(f) abuf->fields.sfmt_ld_plus.f
  1469. int UNUSED written = 0;
  1470. IADDR UNUSED pc = abuf->addr;
  1471. vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
  1472. {
  1473. SI opval = * FLD (i_sr);
  1474. * FLD (i_dr) = opval;
  1475. CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
  1476. }
  1477. #undef FLD
  1478. }
  1479. NEXT (vpc);
  1480. CASE (sem, INSN_MVFACHI) : /* mvfachi $dr */
  1481. {
  1482. SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
  1483. ARGBUF *abuf = SEM_ARGBUF (sem_arg);
  1484. #define FLD(f) abuf->fields.sfmt_seth.f
  1485. int UNUSED written = 0;
  1486. IADDR UNUSED pc = abuf->addr;
  1487. vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
  1488. {
  1489. SI opval = TRUNCDISI (SRADI (GET_H_ACCUM (), 32));
  1490. * FLD (i_dr) = opval;
  1491. CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
  1492. }
  1493. #undef FLD
  1494. }
  1495. NEXT (vpc);
  1496. CASE (sem, INSN_MVFACLO) : /* mvfaclo $dr */
  1497. {
  1498. SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
  1499. ARGBUF *abuf = SEM_ARGBUF (sem_arg);
  1500. #define FLD(f) abuf->fields.sfmt_seth.f
  1501. int UNUSED written = 0;
  1502. IADDR UNUSED pc = abuf->addr;
  1503. vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
  1504. {
  1505. SI opval = TRUNCDISI (GET_H_ACCUM ());
  1506. * FLD (i_dr) = opval;
  1507. CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
  1508. }
  1509. #undef FLD
  1510. }
  1511. NEXT (vpc);
  1512. CASE (sem, INSN_MVFACMI) : /* mvfacmi $dr */
  1513. {
  1514. SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
  1515. ARGBUF *abuf = SEM_ARGBUF (sem_arg);
  1516. #define FLD(f) abuf->fields.sfmt_seth.f
  1517. int UNUSED written = 0;
  1518. IADDR UNUSED pc = abuf->addr;
  1519. vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
  1520. {
  1521. SI opval = TRUNCDISI (SRADI (GET_H_ACCUM (), 16));
  1522. * FLD (i_dr) = opval;
  1523. CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
  1524. }
  1525. #undef FLD
  1526. }
  1527. NEXT (vpc);
  1528. CASE (sem, INSN_MVFC) : /* mvfc $dr,$scr */
  1529. {
  1530. SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
  1531. ARGBUF *abuf = SEM_ARGBUF (sem_arg);
  1532. #define FLD(f) abuf->fields.sfmt_ld_plus.f
  1533. int UNUSED written = 0;
  1534. IADDR UNUSED pc = abuf->addr;
  1535. vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
  1536. {
  1537. SI opval = GET_H_CR (FLD (f_r2));
  1538. * FLD (i_dr) = opval;
  1539. CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
  1540. }
  1541. #undef FLD
  1542. }
  1543. NEXT (vpc);
  1544. CASE (sem, INSN_MVTACHI) : /* mvtachi $src1 */
  1545. {
  1546. SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
  1547. ARGBUF *abuf = SEM_ARGBUF (sem_arg);
  1548. #define FLD(f) abuf->fields.sfmt_st_plus.f
  1549. int UNUSED written = 0;
  1550. IADDR UNUSED pc = abuf->addr;
  1551. vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
  1552. {
  1553. DI opval = ORDI (ANDDI (GET_H_ACCUM (), MAKEDI (0, 0xffffffff)), SLLDI (EXTSIDI (* FLD (i_src1)), 32));
  1554. SET_H_ACCUM (opval);
  1555. CGEN_TRACE_RESULT (current_cpu, abuf, "accum", 'D', opval);
  1556. }
  1557. #undef FLD
  1558. }
  1559. NEXT (vpc);
  1560. CASE (sem, INSN_MVTACLO) : /* mvtaclo $src1 */
  1561. {
  1562. SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
  1563. ARGBUF *abuf = SEM_ARGBUF (sem_arg);
  1564. #define FLD(f) abuf->fields.sfmt_st_plus.f
  1565. int UNUSED written = 0;
  1566. IADDR UNUSED pc = abuf->addr;
  1567. vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
  1568. {
  1569. DI opval = ORDI (ANDDI (GET_H_ACCUM (), MAKEDI (0xffffffff, 0)), ZEXTSIDI (* FLD (i_src1)));
  1570. SET_H_ACCUM (opval);
  1571. CGEN_TRACE_RESULT (current_cpu, abuf, "accum", 'D', opval);
  1572. }
  1573. #undef FLD
  1574. }
  1575. NEXT (vpc);
  1576. CASE (sem, INSN_MVTC) : /* mvtc $sr,$dcr */
  1577. {
  1578. SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
  1579. ARGBUF *abuf = SEM_ARGBUF (sem_arg);
  1580. #define FLD(f) abuf->fields.sfmt_ld_plus.f
  1581. int UNUSED written = 0;
  1582. IADDR UNUSED pc = abuf->addr;
  1583. vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
  1584. {
  1585. USI opval = * FLD (i_sr);
  1586. SET_H_CR (FLD (f_r1), opval);
  1587. CGEN_TRACE_RESULT (current_cpu, abuf, "cr", 'x', opval);
  1588. }
  1589. #undef FLD
  1590. }
  1591. NEXT (vpc);
  1592. CASE (sem, INSN_NEG) : /* neg $dr,$sr */
  1593. {
  1594. SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
  1595. ARGBUF *abuf = SEM_ARGBUF (sem_arg);
  1596. #define FLD(f) abuf->fields.sfmt_ld_plus.f
  1597. int UNUSED written = 0;
  1598. IADDR UNUSED pc = abuf->addr;
  1599. vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
  1600. {
  1601. SI opval = NEGSI (* FLD (i_sr));
  1602. * FLD (i_dr) = opval;
  1603. CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
  1604. }
  1605. #undef FLD
  1606. }
  1607. NEXT (vpc);
  1608. CASE (sem, INSN_NOP) : /* nop */
  1609. {
  1610. SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
  1611. ARGBUF *abuf = SEM_ARGBUF (sem_arg);
  1612. #define FLD(f) abuf->fields.sfmt_empty.f
  1613. int UNUSED written = 0;
  1614. IADDR UNUSED pc = abuf->addr;
  1615. vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
  1616. PROFILE_COUNT_FILLNOPS (current_cpu, abuf->addr);
  1617. #undef FLD
  1618. }
  1619. NEXT (vpc);
  1620. CASE (sem, INSN_NOT) : /* not $dr,$sr */
  1621. {
  1622. SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
  1623. ARGBUF *abuf = SEM_ARGBUF (sem_arg);
  1624. #define FLD(f) abuf->fields.sfmt_ld_plus.f
  1625. int UNUSED written = 0;
  1626. IADDR UNUSED pc = abuf->addr;
  1627. vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
  1628. {
  1629. SI opval = INVSI (* FLD (i_sr));
  1630. * FLD (i_dr) = opval;
  1631. CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
  1632. }
  1633. #undef FLD
  1634. }
  1635. NEXT (vpc);
  1636. CASE (sem, INSN_RAC) : /* rac */
  1637. {
  1638. SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
  1639. ARGBUF *abuf = SEM_ARGBUF (sem_arg);
  1640. #define FLD(f) abuf->fields.sfmt_empty.f
  1641. int UNUSED written = 0;
  1642. IADDR UNUSED pc = abuf->addr;
  1643. vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
  1644. {
  1645. DI tmp_tmp1;
  1646. tmp_tmp1 = SLLDI (GET_H_ACCUM (), 1);
  1647. tmp_tmp1 = ADDDI (tmp_tmp1, MAKEDI (0, 32768));
  1648. {
  1649. DI opval = (GTDI (tmp_tmp1, MAKEDI (32767, 0xffff0000))) ? (MAKEDI (32767, 0xffff0000)) : (LTDI (tmp_tmp1, MAKEDI (0xffff8000, 0))) ? (MAKEDI (0xffff8000, 0)) : (ANDDI (tmp_tmp1, MAKEDI (0xffffffff, 0xffff0000)));
  1650. SET_H_ACCUM (opval);
  1651. CGEN_TRACE_RESULT (current_cpu, abuf, "accum", 'D', opval);
  1652. }
  1653. }
  1654. #undef FLD
  1655. }
  1656. NEXT (vpc);
  1657. CASE (sem, INSN_RACH) : /* rach */
  1658. {
  1659. SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
  1660. ARGBUF *abuf = SEM_ARGBUF (sem_arg);
  1661. #define FLD(f) abuf->fields.sfmt_empty.f
  1662. int UNUSED written = 0;
  1663. IADDR UNUSED pc = abuf->addr;
  1664. vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
  1665. {
  1666. DI tmp_tmp1;
  1667. tmp_tmp1 = ANDDI (GET_H_ACCUM (), MAKEDI (16777215, 0xffffffff));
  1668. if (ANDIF (GEDI (tmp_tmp1, MAKEDI (16383, 0x80000000)), LEDI (tmp_tmp1, MAKEDI (8388607, 0xffffffff)))) {
  1669. tmp_tmp1 = MAKEDI (16383, 0x80000000);
  1670. } else {
  1671. if (ANDIF (GEDI (tmp_tmp1, MAKEDI (8388608, 0)), LEDI (tmp_tmp1, MAKEDI (16760832, 0)))) {
  1672. tmp_tmp1 = MAKEDI (16760832, 0);
  1673. } else {
  1674. tmp_tmp1 = ANDDI (ADDDI (GET_H_ACCUM (), MAKEDI (0, 1073741824)), MAKEDI (0xffffffff, 0x80000000));
  1675. }
  1676. }
  1677. tmp_tmp1 = SLLDI (tmp_tmp1, 1);
  1678. {
  1679. DI opval = SRADI (SLLDI (tmp_tmp1, 7), 7);
  1680. SET_H_ACCUM (opval);
  1681. CGEN_TRACE_RESULT (current_cpu, abuf, "accum", 'D', opval);
  1682. }
  1683. }
  1684. #undef FLD
  1685. }
  1686. NEXT (vpc);
  1687. CASE (sem, INSN_RTE) : /* rte */
  1688. {
  1689. SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
  1690. ARGBUF *abuf = SEM_ARGBUF (sem_arg);
  1691. #define FLD(f) abuf->fields.sfmt_empty.f
  1692. int UNUSED written = 0;
  1693. IADDR UNUSED pc = abuf->addr;
  1694. SEM_BRANCH_INIT
  1695. vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
  1696. {
  1697. {
  1698. USI opval = ANDSI (GET_H_CR (((UINT) 6)), -4);
  1699. SEM_BRANCH_VIA_ADDR (current_cpu, sem_arg, opval, vpc);
  1700. CGEN_TRACE_RESULT (current_cpu, abuf, "pc", 'x', opval);
  1701. }
  1702. {
  1703. USI opval = GET_H_CR (((UINT) 14));
  1704. SET_H_CR (((UINT) 6), opval);
  1705. CGEN_TRACE_RESULT (current_cpu, abuf, "cr", 'x', opval);
  1706. }
  1707. {
  1708. UQI opval = CPU (h_bpsw);
  1709. SET_H_PSW (opval);
  1710. CGEN_TRACE_RESULT (current_cpu, abuf, "psw", 'x', opval);
  1711. }
  1712. {
  1713. UQI opval = CPU (h_bbpsw);
  1714. CPU (h_bpsw) = opval;
  1715. CGEN_TRACE_RESULT (current_cpu, abuf, "bpsw", 'x', opval);
  1716. }
  1717. }
  1718. SEM_BRANCH_FINI (vpc);
  1719. #undef FLD
  1720. }
  1721. NEXT (vpc);
  1722. CASE (sem, INSN_SETH) : /* seth $dr,$hash$hi16 */
  1723. {
  1724. SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
  1725. ARGBUF *abuf = SEM_ARGBUF (sem_arg);
  1726. #define FLD(f) abuf->fields.sfmt_seth.f
  1727. int UNUSED written = 0;
  1728. IADDR UNUSED pc = abuf->addr;
  1729. vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
  1730. {
  1731. SI opval = SLLSI (FLD (f_hi16), 16);
  1732. * FLD (i_dr) = opval;
  1733. CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
  1734. }
  1735. #undef FLD
  1736. }
  1737. NEXT (vpc);
  1738. CASE (sem, INSN_SLL) : /* sll $dr,$sr */
  1739. {
  1740. SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
  1741. ARGBUF *abuf = SEM_ARGBUF (sem_arg);
  1742. #define FLD(f) abuf->fields.sfmt_add.f
  1743. int UNUSED written = 0;
  1744. IADDR UNUSED pc = abuf->addr;
  1745. vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
  1746. {
  1747. SI opval = SLLSI (* FLD (i_dr), ANDSI (* FLD (i_sr), 31));
  1748. * FLD (i_dr) = opval;
  1749. CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
  1750. }
  1751. #undef FLD
  1752. }
  1753. NEXT (vpc);
  1754. CASE (sem, INSN_SLL3) : /* sll3 $dr,$sr,$simm16 */
  1755. {
  1756. SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
  1757. ARGBUF *abuf = SEM_ARGBUF (sem_arg);
  1758. #define FLD(f) abuf->fields.sfmt_add3.f
  1759. int UNUSED written = 0;
  1760. IADDR UNUSED pc = abuf->addr;
  1761. vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
  1762. {
  1763. SI opval = SLLSI (* FLD (i_sr), ANDSI (FLD (f_simm16), 31));
  1764. * FLD (i_dr) = opval;
  1765. CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
  1766. }
  1767. #undef FLD
  1768. }
  1769. NEXT (vpc);
  1770. CASE (sem, INSN_SLLI) : /* slli $dr,$uimm5 */
  1771. {
  1772. SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
  1773. ARGBUF *abuf = SEM_ARGBUF (sem_arg);
  1774. #define FLD(f) abuf->fields.sfmt_slli.f
  1775. int UNUSED written = 0;
  1776. IADDR UNUSED pc = abuf->addr;
  1777. vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
  1778. {
  1779. SI opval = SLLSI (* FLD (i_dr), FLD (f_uimm5));
  1780. * FLD (i_dr) = opval;
  1781. CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
  1782. }
  1783. #undef FLD
  1784. }
  1785. NEXT (vpc);
  1786. CASE (sem, INSN_SRA) : /* sra $dr,$sr */
  1787. {
  1788. SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
  1789. ARGBUF *abuf = SEM_ARGBUF (sem_arg);
  1790. #define FLD(f) abuf->fields.sfmt_add.f
  1791. int UNUSED written = 0;
  1792. IADDR UNUSED pc = abuf->addr;
  1793. vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
  1794. {
  1795. SI opval = SRASI (* FLD (i_dr), ANDSI (* FLD (i_sr), 31));
  1796. * FLD (i_dr) = opval;
  1797. CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
  1798. }
  1799. #undef FLD
  1800. }
  1801. NEXT (vpc);
  1802. CASE (sem, INSN_SRA3) : /* sra3 $dr,$sr,$simm16 */
  1803. {
  1804. SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
  1805. ARGBUF *abuf = SEM_ARGBUF (sem_arg);
  1806. #define FLD(f) abuf->fields.sfmt_add3.f
  1807. int UNUSED written = 0;
  1808. IADDR UNUSED pc = abuf->addr;
  1809. vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
  1810. {
  1811. SI opval = SRASI (* FLD (i_sr), ANDSI (FLD (f_simm16), 31));
  1812. * FLD (i_dr) = opval;
  1813. CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
  1814. }
  1815. #undef FLD
  1816. }
  1817. NEXT (vpc);
  1818. CASE (sem, INSN_SRAI) : /* srai $dr,$uimm5 */
  1819. {
  1820. SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
  1821. ARGBUF *abuf = SEM_ARGBUF (sem_arg);
  1822. #define FLD(f) abuf->fields.sfmt_slli.f
  1823. int UNUSED written = 0;
  1824. IADDR UNUSED pc = abuf->addr;
  1825. vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
  1826. {
  1827. SI opval = SRASI (* FLD (i_dr), FLD (f_uimm5));
  1828. * FLD (i_dr) = opval;
  1829. CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
  1830. }
  1831. #undef FLD
  1832. }
  1833. NEXT (vpc);
  1834. CASE (sem, INSN_SRL) : /* srl $dr,$sr */
  1835. {
  1836. SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
  1837. ARGBUF *abuf = SEM_ARGBUF (sem_arg);
  1838. #define FLD(f) abuf->fields.sfmt_add.f
  1839. int UNUSED written = 0;
  1840. IADDR UNUSED pc = abuf->addr;
  1841. vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
  1842. {
  1843. SI opval = SRLSI (* FLD (i_dr), ANDSI (* FLD (i_sr), 31));
  1844. * FLD (i_dr) = opval;
  1845. CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
  1846. }
  1847. #undef FLD
  1848. }
  1849. NEXT (vpc);
  1850. CASE (sem, INSN_SRL3) : /* srl3 $dr,$sr,$simm16 */
  1851. {
  1852. SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
  1853. ARGBUF *abuf = SEM_ARGBUF (sem_arg);
  1854. #define FLD(f) abuf->fields.sfmt_add3.f
  1855. int UNUSED written = 0;
  1856. IADDR UNUSED pc = abuf->addr;
  1857. vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
  1858. {
  1859. SI opval = SRLSI (* FLD (i_sr), ANDSI (FLD (f_simm16), 31));
  1860. * FLD (i_dr) = opval;
  1861. CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
  1862. }
  1863. #undef FLD
  1864. }
  1865. NEXT (vpc);
  1866. CASE (sem, INSN_SRLI) : /* srli $dr,$uimm5 */
  1867. {
  1868. SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
  1869. ARGBUF *abuf = SEM_ARGBUF (sem_arg);
  1870. #define FLD(f) abuf->fields.sfmt_slli.f
  1871. int UNUSED written = 0;
  1872. IADDR UNUSED pc = abuf->addr;
  1873. vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
  1874. {
  1875. SI opval = SRLSI (* FLD (i_dr), FLD (f_uimm5));
  1876. * FLD (i_dr) = opval;
  1877. CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
  1878. }
  1879. #undef FLD
  1880. }
  1881. NEXT (vpc);
  1882. CASE (sem, INSN_ST) : /* st $src1,@$src2 */
  1883. {
  1884. SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
  1885. ARGBUF *abuf = SEM_ARGBUF (sem_arg);
  1886. #define FLD(f) abuf->fields.sfmt_st_plus.f
  1887. int UNUSED written = 0;
  1888. IADDR UNUSED pc = abuf->addr;
  1889. vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
  1890. {
  1891. SI opval = * FLD (i_src1);
  1892. SETMEMSI (current_cpu, pc, * FLD (i_src2), opval);
  1893. CGEN_TRACE_RESULT (current_cpu, abuf, "memory", 'x', opval);
  1894. }
  1895. #undef FLD
  1896. }
  1897. NEXT (vpc);
  1898. CASE (sem, INSN_ST_D) : /* st $src1,@($slo16,$src2) */
  1899. {
  1900. SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
  1901. ARGBUF *abuf = SEM_ARGBUF (sem_arg);
  1902. #define FLD(f) abuf->fields.sfmt_st_d.f
  1903. int UNUSED written = 0;
  1904. IADDR UNUSED pc = abuf->addr;
  1905. vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
  1906. {
  1907. SI opval = * FLD (i_src1);
  1908. SETMEMSI (current_cpu, pc, ADDSI (* FLD (i_src2), FLD (f_simm16)), opval);
  1909. CGEN_TRACE_RESULT (current_cpu, abuf, "memory", 'x', opval);
  1910. }
  1911. #undef FLD
  1912. }
  1913. NEXT (vpc);
  1914. CASE (sem, INSN_STB) : /* stb $src1,@$src2 */
  1915. {
  1916. SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
  1917. ARGBUF *abuf = SEM_ARGBUF (sem_arg);
  1918. #define FLD(f) abuf->fields.sfmt_st_plus.f
  1919. int UNUSED written = 0;
  1920. IADDR UNUSED pc = abuf->addr;
  1921. vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
  1922. {
  1923. QI opval = * FLD (i_src1);
  1924. SETMEMQI (current_cpu, pc, * FLD (i_src2), opval);
  1925. CGEN_TRACE_RESULT (current_cpu, abuf, "memory", 'x', opval);
  1926. }
  1927. #undef FLD
  1928. }
  1929. NEXT (vpc);
  1930. CASE (sem, INSN_STB_D) : /* stb $src1,@($slo16,$src2) */
  1931. {
  1932. SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
  1933. ARGBUF *abuf = SEM_ARGBUF (sem_arg);
  1934. #define FLD(f) abuf->fields.sfmt_st_d.f
  1935. int UNUSED written = 0;
  1936. IADDR UNUSED pc = abuf->addr;
  1937. vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
  1938. {
  1939. QI opval = * FLD (i_src1);
  1940. SETMEMQI (current_cpu, pc, ADDSI (* FLD (i_src2), FLD (f_simm16)), opval);
  1941. CGEN_TRACE_RESULT (current_cpu, abuf, "memory", 'x', opval);
  1942. }
  1943. #undef FLD
  1944. }
  1945. NEXT (vpc);
  1946. CASE (sem, INSN_STH) : /* sth $src1,@$src2 */
  1947. {
  1948. SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
  1949. ARGBUF *abuf = SEM_ARGBUF (sem_arg);
  1950. #define FLD(f) abuf->fields.sfmt_st_plus.f
  1951. int UNUSED written = 0;
  1952. IADDR UNUSED pc = abuf->addr;
  1953. vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
  1954. {
  1955. HI opval = * FLD (i_src1);
  1956. SETMEMHI (current_cpu, pc, * FLD (i_src2), opval);
  1957. CGEN_TRACE_RESULT (current_cpu, abuf, "memory", 'x', opval);
  1958. }
  1959. #undef FLD
  1960. }
  1961. NEXT (vpc);
  1962. CASE (sem, INSN_STH_D) : /* sth $src1,@($slo16,$src2) */
  1963. {
  1964. SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
  1965. ARGBUF *abuf = SEM_ARGBUF (sem_arg);
  1966. #define FLD(f) abuf->fields.sfmt_st_d.f
  1967. int UNUSED written = 0;
  1968. IADDR UNUSED pc = abuf->addr;
  1969. vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
  1970. {
  1971. HI opval = * FLD (i_src1);
  1972. SETMEMHI (current_cpu, pc, ADDSI (* FLD (i_src2), FLD (f_simm16)), opval);
  1973. CGEN_TRACE_RESULT (current_cpu, abuf, "memory", 'x', opval);
  1974. }
  1975. #undef FLD
  1976. }
  1977. NEXT (vpc);
  1978. CASE (sem, INSN_ST_PLUS) : /* st $src1,@+$src2 */
  1979. {
  1980. SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
  1981. ARGBUF *abuf = SEM_ARGBUF (sem_arg);
  1982. #define FLD(f) abuf->fields.sfmt_st_plus.f
  1983. int UNUSED written = 0;
  1984. IADDR UNUSED pc = abuf->addr;
  1985. vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
  1986. {
  1987. SI tmp_new_src2;
  1988. tmp_new_src2 = ADDSI (* FLD (i_src2), 4);
  1989. {
  1990. SI opval = * FLD (i_src1);
  1991. SETMEMSI (current_cpu, pc, tmp_new_src2, opval);
  1992. CGEN_TRACE_RESULT (current_cpu, abuf, "memory", 'x', opval);
  1993. }
  1994. {
  1995. SI opval = tmp_new_src2;
  1996. * FLD (i_src2) = opval;
  1997. CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
  1998. }
  1999. }
  2000. #undef FLD
  2001. }
  2002. NEXT (vpc);
  2003. CASE (sem, INSN_ST_MINUS) : /* st $src1,@-$src2 */
  2004. {
  2005. SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
  2006. ARGBUF *abuf = SEM_ARGBUF (sem_arg);
  2007. #define FLD(f) abuf->fields.sfmt_st_plus.f
  2008. int UNUSED written = 0;
  2009. IADDR UNUSED pc = abuf->addr;
  2010. vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
  2011. {
  2012. SI tmp_new_src2;
  2013. tmp_new_src2 = SUBSI (* FLD (i_src2), 4);
  2014. {
  2015. SI opval = * FLD (i_src1);
  2016. SETMEMSI (current_cpu, pc, tmp_new_src2, opval);
  2017. CGEN_TRACE_RESULT (current_cpu, abuf, "memory", 'x', opval);
  2018. }
  2019. {
  2020. SI opval = tmp_new_src2;
  2021. * FLD (i_src2) = opval;
  2022. CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
  2023. }
  2024. }
  2025. #undef FLD
  2026. }
  2027. NEXT (vpc);
  2028. CASE (sem, INSN_SUB) : /* sub $dr,$sr */
  2029. {
  2030. SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
  2031. ARGBUF *abuf = SEM_ARGBUF (sem_arg);
  2032. #define FLD(f) abuf->fields.sfmt_add.f
  2033. int UNUSED written = 0;
  2034. IADDR UNUSED pc = abuf->addr;
  2035. vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
  2036. {
  2037. SI opval = SUBSI (* FLD (i_dr), * FLD (i_sr));
  2038. * FLD (i_dr) = opval;
  2039. CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
  2040. }
  2041. #undef FLD
  2042. }
  2043. NEXT (vpc);
  2044. CASE (sem, INSN_SUBV) : /* subv $dr,$sr */
  2045. {
  2046. SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
  2047. ARGBUF *abuf = SEM_ARGBUF (sem_arg);
  2048. #define FLD(f) abuf->fields.sfmt_add.f
  2049. int UNUSED written = 0;
  2050. IADDR UNUSED pc = abuf->addr;
  2051. vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
  2052. {
  2053. SI temp0;BI temp1;
  2054. temp0 = SUBSI (* FLD (i_dr), * FLD (i_sr));
  2055. temp1 = SUBOFSI (* FLD (i_dr), * FLD (i_sr), 0);
  2056. {
  2057. SI opval = temp0;
  2058. * FLD (i_dr) = opval;
  2059. CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
  2060. }
  2061. {
  2062. BI opval = temp1;
  2063. CPU (h_cond) = opval;
  2064. CGEN_TRACE_RESULT (current_cpu, abuf, "cond", 'x', opval);
  2065. }
  2066. }
  2067. #undef FLD
  2068. }
  2069. NEXT (vpc);
  2070. CASE (sem, INSN_SUBX) : /* subx $dr,$sr */
  2071. {
  2072. SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
  2073. ARGBUF *abuf = SEM_ARGBUF (sem_arg);
  2074. #define FLD(f) abuf->fields.sfmt_add.f
  2075. int UNUSED written = 0;
  2076. IADDR UNUSED pc = abuf->addr;
  2077. vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
  2078. {
  2079. SI temp0;BI temp1;
  2080. temp0 = SUBCSI (* FLD (i_dr), * FLD (i_sr), CPU (h_cond));
  2081. temp1 = SUBCFSI (* FLD (i_dr), * FLD (i_sr), CPU (h_cond));
  2082. {
  2083. SI opval = temp0;
  2084. * FLD (i_dr) = opval;
  2085. CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
  2086. }
  2087. {
  2088. BI opval = temp1;
  2089. CPU (h_cond) = opval;
  2090. CGEN_TRACE_RESULT (current_cpu, abuf, "cond", 'x', opval);
  2091. }
  2092. }
  2093. #undef FLD
  2094. }
  2095. NEXT (vpc);
  2096. CASE (sem, INSN_TRAP) : /* trap $uimm4 */
  2097. {
  2098. SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
  2099. ARGBUF *abuf = SEM_ARGBUF (sem_arg);
  2100. #define FLD(f) abuf->fields.sfmt_trap.f
  2101. int UNUSED written = 0;
  2102. IADDR UNUSED pc = abuf->addr;
  2103. SEM_BRANCH_INIT
  2104. vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
  2105. {
  2106. {
  2107. USI opval = GET_H_CR (((UINT) 6));
  2108. SET_H_CR (((UINT) 14), opval);
  2109. CGEN_TRACE_RESULT (current_cpu, abuf, "cr", 'x', opval);
  2110. }
  2111. {
  2112. USI opval = ADDSI (pc, 4);
  2113. SET_H_CR (((UINT) 6), opval);
  2114. CGEN_TRACE_RESULT (current_cpu, abuf, "cr", 'x', opval);
  2115. }
  2116. {
  2117. UQI opval = CPU (h_bpsw);
  2118. CPU (h_bbpsw) = opval;
  2119. CGEN_TRACE_RESULT (current_cpu, abuf, "bbpsw", 'x', opval);
  2120. }
  2121. {
  2122. UQI opval = GET_H_PSW ();
  2123. CPU (h_bpsw) = opval;
  2124. CGEN_TRACE_RESULT (current_cpu, abuf, "bpsw", 'x', opval);
  2125. }
  2126. {
  2127. UQI opval = ANDQI (GET_H_PSW (), 128);
  2128. SET_H_PSW (opval);
  2129. CGEN_TRACE_RESULT (current_cpu, abuf, "psw", 'x', opval);
  2130. }
  2131. {
  2132. SI opval = m32r_trap (current_cpu, pc, FLD (f_uimm4));
  2133. SEM_BRANCH_VIA_ADDR (current_cpu, sem_arg, opval, vpc);
  2134. CGEN_TRACE_RESULT (current_cpu, abuf, "pc", 'x', opval);
  2135. }
  2136. }
  2137. SEM_BRANCH_FINI (vpc);
  2138. #undef FLD
  2139. }
  2140. NEXT (vpc);
  2141. CASE (sem, INSN_UNLOCK) : /* unlock $src1,@$src2 */
  2142. {
  2143. SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
  2144. ARGBUF *abuf = SEM_ARGBUF (sem_arg);
  2145. #define FLD(f) abuf->fields.sfmt_st_plus.f
  2146. int UNUSED written = 0;
  2147. IADDR UNUSED pc = abuf->addr;
  2148. vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
  2149. {
  2150. if (CPU (h_lock)) {
  2151. {
  2152. SI opval = * FLD (i_src1);
  2153. SETMEMSI (current_cpu, pc, * FLD (i_src2), opval);
  2154. written |= (1 << 4);
  2155. CGEN_TRACE_RESULT (current_cpu, abuf, "memory", 'x', opval);
  2156. }
  2157. }
  2158. {
  2159. BI opval = 0;
  2160. CPU (h_lock) = opval;
  2161. CGEN_TRACE_RESULT (current_cpu, abuf, "lock", 'x', opval);
  2162. }
  2163. }
  2164. abuf->written = written;
  2165. #undef FLD
  2166. }
  2167. NEXT (vpc);
  2168. CASE (sem, INSN_CLRPSW) : /* clrpsw $uimm8 */
  2169. {
  2170. SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
  2171. ARGBUF *abuf = SEM_ARGBUF (sem_arg);
  2172. #define FLD(f) abuf->fields.sfmt_clrpsw.f
  2173. int UNUSED written = 0;
  2174. IADDR UNUSED pc = abuf->addr;
  2175. vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
  2176. {
  2177. USI opval = ANDSI (GET_H_CR (((UINT) 0)), ORSI (ZEXTQISI (INVQI (FLD (f_uimm8))), 65280));
  2178. SET_H_CR (((UINT) 0), opval);
  2179. CGEN_TRACE_RESULT (current_cpu, abuf, "cr", 'x', opval);
  2180. }
  2181. #undef FLD
  2182. }
  2183. NEXT (vpc);
  2184. CASE (sem, INSN_SETPSW) : /* setpsw $uimm8 */
  2185. {
  2186. SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
  2187. ARGBUF *abuf = SEM_ARGBUF (sem_arg);
  2188. #define FLD(f) abuf->fields.sfmt_clrpsw.f
  2189. int UNUSED written = 0;
  2190. IADDR UNUSED pc = abuf->addr;
  2191. vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
  2192. {
  2193. USI opval = FLD (f_uimm8);
  2194. SET_H_CR (((UINT) 0), opval);
  2195. CGEN_TRACE_RESULT (current_cpu, abuf, "cr", 'x', opval);
  2196. }
  2197. #undef FLD
  2198. }
  2199. NEXT (vpc);
  2200. CASE (sem, INSN_BSET) : /* bset $uimm3,@($slo16,$sr) */
  2201. {
  2202. SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
  2203. ARGBUF *abuf = SEM_ARGBUF (sem_arg);
  2204. #define FLD(f) abuf->fields.sfmt_bset.f
  2205. int UNUSED written = 0;
  2206. IADDR UNUSED pc = abuf->addr;
  2207. vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
  2208. {
  2209. QI opval = ORQI (GETMEMQI (current_cpu, pc, ADDSI (* FLD (i_sr), FLD (f_simm16))), SLLQI (1, SUBSI (7, FLD (f_uimm3))));
  2210. SETMEMQI (current_cpu, pc, ADDSI (* FLD (i_sr), FLD (f_simm16)), opval);
  2211. CGEN_TRACE_RESULT (current_cpu, abuf, "memory", 'x', opval);
  2212. }
  2213. #undef FLD
  2214. }
  2215. NEXT (vpc);
  2216. CASE (sem, INSN_BCLR) : /* bclr $uimm3,@($slo16,$sr) */
  2217. {
  2218. SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
  2219. ARGBUF *abuf = SEM_ARGBUF (sem_arg);
  2220. #define FLD(f) abuf->fields.sfmt_bset.f
  2221. int UNUSED written = 0;
  2222. IADDR UNUSED pc = abuf->addr;
  2223. vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
  2224. {
  2225. QI opval = ANDQI (GETMEMQI (current_cpu, pc, ADDSI (* FLD (i_sr), FLD (f_simm16))), INVQI (SLLQI (1, SUBSI (7, FLD (f_uimm3)))));
  2226. SETMEMQI (current_cpu, pc, ADDSI (* FLD (i_sr), FLD (f_simm16)), opval);
  2227. CGEN_TRACE_RESULT (current_cpu, abuf, "memory", 'x', opval);
  2228. }
  2229. #undef FLD
  2230. }
  2231. NEXT (vpc);
  2232. CASE (sem, INSN_BTST) : /* btst $uimm3,$sr */
  2233. {
  2234. SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
  2235. ARGBUF *abuf = SEM_ARGBUF (sem_arg);
  2236. #define FLD(f) abuf->fields.sfmt_bset.f
  2237. int UNUSED written = 0;
  2238. IADDR UNUSED pc = abuf->addr;
  2239. vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
  2240. {
  2241. BI opval = ANDQI (SRLQI (* FLD (i_sr), SUBSI (7, FLD (f_uimm3))), 1);
  2242. CPU (h_cond) = opval;
  2243. CGEN_TRACE_RESULT (current_cpu, abuf, "cond", 'x', opval);
  2244. }
  2245. #undef FLD
  2246. }
  2247. NEXT (vpc);
  2248. }
  2249. ENDSWITCH (sem) /* End of semantic switch. */
  2250. /* At this point `vpc' contains the next insn to execute. */
  2251. }
  2252. #undef DEFINE_SWITCH
  2253. #endif /* DEFINE_SWITCH */