translate.c 87 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056205720582059206020612062206320642065206620672068206920702071207220732074207520762077207820792080208120822083208420852086208720882089209020912092209320942095209620972098209921002101210221032104210521062107210821092110211121122113211421152116211721182119212021212122212321242125212621272128212921302131213221332134213521362137213821392140214121422143214421452146214721482149215021512152215321542155215621572158215921602161216221632164216521662167216821692170217121722173217421752176217721782179218021812182218321842185218621872188218921902191219221932194219521962197219821992200220122022203220422052206220722082209221022112212221322142215221622172218221922202221222222232224222522262227222822292230223122322233223422352236223722382239224022412242224322442245224622472248224922502251225222532254225522562257225822592260226122622263226422652266226722682269227022712272227322742275227622772278227922802281228222832284228522862287228822892290229122922293229422952296229722982299230023012302230323042305230623072308230923102311231223132314231523162317231823192320232123222323232423252326232723282329233023312332233323342335233623372338233923402341234223432344234523462347234823492350235123522353235423552356235723582359236023612362236323642365236623672368236923702371237223732374237523762377237823792380238123822383238423852386238723882389239023912392239323942395239623972398239924002401240224032404240524062407240824092410241124122413241424152416241724182419242024212422242324242425242624272428242924302431243224332434243524362437243824392440244124422443244424452446244724482449245024512452245324542455245624572458245924602461246224632464246524662467246824692470247124722473247424752476247724782479248024812482248324842485248624872488248924902491249224932494249524962497249824992500250125022503250425052506250725082509251025112512251325142515251625172518251925202521252225232524252525262527252825292530253125322533253425352536253725382539254025412542254325442545254625472548254925502551255225532554255525562557255825592560256125622563256425652566256725682569257025712572257325742575257625772578257925802581258225832584258525862587258825892590259125922593259425952596259725982599260026012602260326042605260626072608260926102611261226132614261526162617261826192620262126222623262426252626262726282629263026312632263326342635263626372638263926402641264226432644264526462647264826492650265126522653265426552656265726582659266026612662266326642665266626672668266926702671267226732674267526762677267826792680268126822683268426852686268726882689269026912692269326942695269626972698269927002701270227032704270527062707270827092710271127122713271427152716271727182719272027212722272327242725272627272728272927302731273227332734273527362737273827392740274127422743274427452746274727482749275027512752275327542755275627572758275927602761276227632764276527662767276827692770277127722773277427752776277727782779278027812782278327842785278627872788278927902791279227932794279527962797279827992800280128022803280428052806280728082809281028112812281328142815281628172818281928202821282228232824282528262827282828292830283128322833283428352836283728382839284028412842284328442845284628472848284928502851285228532854285528562857285828592860286128622863286428652866286728682869287028712872287328742875287628772878287928802881288228832884288528862887288828892890289128922893289428952896289728982899290029012902290329042905290629072908290929102911291229132914291529162917291829192920292129222923292429252926292729282929293029312932293329342935293629372938293929402941294229432944294529462947294829492950295129522953295429552956295729582959296029612962296329642965296629672968296929702971297229732974297529762977297829792980298129822983298429852986298729882989299029912992299329942995299629972998299930003001300230033004300530063007300830093010301130123013301430153016301730183019302030213022302330243025302630273028302930303031303230333034303530363037303830393040304130423043304430453046304730483049305030513052305330543055305630573058305930603061
  1. /*
  2. * QEMU AVR CPU
  3. *
  4. * Copyright (c) 2019-2020 Michael Rolnik
  5. *
  6. * This library is free software; you can redistribute it and/or
  7. * modify it under the terms of the GNU Lesser General Public
  8. * License as published by the Free Software Foundation; either
  9. * version 2.1 of the License, or (at your option) any later version.
  10. *
  11. * This library is distributed in the hope that it will be useful,
  12. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  13. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
  14. * Lesser General Public License for more details.
  15. *
  16. * You should have received a copy of the GNU Lesser General Public
  17. * License along with this library; if not, see
  18. * <http://www.gnu.org/licenses/lgpl-2.1.html>
  19. */
  20. #include "qemu/osdep.h"
  21. #include "qemu/qemu-print.h"
  22. #include "tcg/tcg.h"
  23. #include "cpu.h"
  24. #include "exec/exec-all.h"
  25. #include "tcg/tcg-op.h"
  26. #include "exec/cpu_ldst.h"
  27. #include "exec/helper-proto.h"
  28. #include "exec/helper-gen.h"
  29. #include "exec/log.h"
  30. #include "exec/translator.h"
  31. #include "exec/gen-icount.h"
  32. /*
  33. * Define if you want a BREAK instruction translated to a breakpoint
  34. * Active debugging connection is assumed
  35. * This is for
  36. * https://github.com/seharris/qemu-avr-tests/tree/master/instruction-tests
  37. * tests
  38. */
  39. #undef BREAKPOINT_ON_BREAK
  40. static TCGv cpu_pc;
  41. static TCGv cpu_Cf;
  42. static TCGv cpu_Zf;
  43. static TCGv cpu_Nf;
  44. static TCGv cpu_Vf;
  45. static TCGv cpu_Sf;
  46. static TCGv cpu_Hf;
  47. static TCGv cpu_Tf;
  48. static TCGv cpu_If;
  49. static TCGv cpu_rampD;
  50. static TCGv cpu_rampX;
  51. static TCGv cpu_rampY;
  52. static TCGv cpu_rampZ;
  53. static TCGv cpu_r[NUMBER_OF_CPU_REGISTERS];
  54. static TCGv cpu_eind;
  55. static TCGv cpu_sp;
  56. static TCGv cpu_skip;
  57. static const char reg_names[NUMBER_OF_CPU_REGISTERS][8] = {
  58. "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
  59. "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
  60. "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
  61. "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31",
  62. };
  63. #define REG(x) (cpu_r[x])
  64. enum {
  65. DISAS_EXIT = DISAS_TARGET_0, /* We want return to the cpu main loop. */
  66. DISAS_LOOKUP = DISAS_TARGET_1, /* We have a variable condition exit. */
  67. DISAS_CHAIN = DISAS_TARGET_2, /* We have a single condition exit. */
  68. };
  69. typedef struct DisasContext DisasContext;
  70. /* This is the state at translation time. */
  71. struct DisasContext {
  72. TranslationBlock *tb;
  73. CPUAVRState *env;
  74. CPUState *cs;
  75. target_long npc;
  76. uint32_t opcode;
  77. /* Routine used to access memory */
  78. int memidx;
  79. int bstate;
  80. int singlestep;
  81. /*
  82. * some AVR instructions can make the following instruction to be skipped
  83. * Let's name those instructions
  84. * A - instruction that can skip the next one
  85. * B - instruction that can be skipped. this depends on execution of A
  86. * there are two scenarios
  87. * 1. A and B belong to the same translation block
  88. * 2. A is the last instruction in the translation block and B is the last
  89. *
  90. * following variables are used to simplify the skipping logic, they are
  91. * used in the following manner (sketch)
  92. *
  93. * TCGLabel *skip_label = NULL;
  94. * if (ctx.skip_cond != TCG_COND_NEVER) {
  95. * skip_label = gen_new_label();
  96. * tcg_gen_brcond_tl(skip_cond, skip_var0, skip_var1, skip_label);
  97. * }
  98. *
  99. * if (free_skip_var0) {
  100. * tcg_temp_free(skip_var0);
  101. * free_skip_var0 = false;
  102. * }
  103. *
  104. * translate(&ctx);
  105. *
  106. * if (skip_label) {
  107. * gen_set_label(skip_label);
  108. * }
  109. */
  110. TCGv skip_var0;
  111. TCGv skip_var1;
  112. TCGCond skip_cond;
  113. bool free_skip_var0;
  114. };
  115. void avr_cpu_tcg_init(void)
  116. {
  117. int i;
  118. #define AVR_REG_OFFS(x) offsetof(CPUAVRState, x)
  119. cpu_pc = tcg_global_mem_new_i32(cpu_env, AVR_REG_OFFS(pc_w), "pc");
  120. cpu_Cf = tcg_global_mem_new_i32(cpu_env, AVR_REG_OFFS(sregC), "Cf");
  121. cpu_Zf = tcg_global_mem_new_i32(cpu_env, AVR_REG_OFFS(sregZ), "Zf");
  122. cpu_Nf = tcg_global_mem_new_i32(cpu_env, AVR_REG_OFFS(sregN), "Nf");
  123. cpu_Vf = tcg_global_mem_new_i32(cpu_env, AVR_REG_OFFS(sregV), "Vf");
  124. cpu_Sf = tcg_global_mem_new_i32(cpu_env, AVR_REG_OFFS(sregS), "Sf");
  125. cpu_Hf = tcg_global_mem_new_i32(cpu_env, AVR_REG_OFFS(sregH), "Hf");
  126. cpu_Tf = tcg_global_mem_new_i32(cpu_env, AVR_REG_OFFS(sregT), "Tf");
  127. cpu_If = tcg_global_mem_new_i32(cpu_env, AVR_REG_OFFS(sregI), "If");
  128. cpu_rampD = tcg_global_mem_new_i32(cpu_env, AVR_REG_OFFS(rampD), "rampD");
  129. cpu_rampX = tcg_global_mem_new_i32(cpu_env, AVR_REG_OFFS(rampX), "rampX");
  130. cpu_rampY = tcg_global_mem_new_i32(cpu_env, AVR_REG_OFFS(rampY), "rampY");
  131. cpu_rampZ = tcg_global_mem_new_i32(cpu_env, AVR_REG_OFFS(rampZ), "rampZ");
  132. cpu_eind = tcg_global_mem_new_i32(cpu_env, AVR_REG_OFFS(eind), "eind");
  133. cpu_sp = tcg_global_mem_new_i32(cpu_env, AVR_REG_OFFS(sp), "sp");
  134. cpu_skip = tcg_global_mem_new_i32(cpu_env, AVR_REG_OFFS(skip), "skip");
  135. for (i = 0; i < NUMBER_OF_CPU_REGISTERS; i++) {
  136. cpu_r[i] = tcg_global_mem_new_i32(cpu_env, AVR_REG_OFFS(r[i]),
  137. reg_names[i]);
  138. }
  139. #undef AVR_REG_OFFS
  140. }
  141. static int to_regs_16_31_by_one(DisasContext *ctx, int indx)
  142. {
  143. return 16 + (indx % 16);
  144. }
  145. static int to_regs_16_23_by_one(DisasContext *ctx, int indx)
  146. {
  147. return 16 + (indx % 8);
  148. }
  149. static int to_regs_24_30_by_two(DisasContext *ctx, int indx)
  150. {
  151. return 24 + (indx % 4) * 2;
  152. }
  153. static int to_regs_00_30_by_two(DisasContext *ctx, int indx)
  154. {
  155. return (indx % 16) * 2;
  156. }
  157. static uint16_t next_word(DisasContext *ctx)
  158. {
  159. return cpu_lduw_code(ctx->env, ctx->npc++ * 2);
  160. }
  161. static int append_16(DisasContext *ctx, int x)
  162. {
  163. return x << 16 | next_word(ctx);
  164. }
  165. static bool avr_have_feature(DisasContext *ctx, int feature)
  166. {
  167. if (!avr_feature(ctx->env, feature)) {
  168. gen_helper_unsupported(cpu_env);
  169. ctx->bstate = DISAS_NORETURN;
  170. return false;
  171. }
  172. return true;
  173. }
  174. static bool decode_insn(DisasContext *ctx, uint16_t insn);
  175. #include "decode_insn.c.inc"
  176. /*
  177. * Arithmetic Instructions
  178. */
  179. /*
  180. * Utility functions for updating status registers:
  181. *
  182. * - gen_add_CHf()
  183. * - gen_add_Vf()
  184. * - gen_sub_CHf()
  185. * - gen_sub_Vf()
  186. * - gen_NSf()
  187. * - gen_ZNSf()
  188. *
  189. */
  190. static void gen_add_CHf(TCGv R, TCGv Rd, TCGv Rr)
  191. {
  192. TCGv t1 = tcg_temp_new_i32();
  193. TCGv t2 = tcg_temp_new_i32();
  194. TCGv t3 = tcg_temp_new_i32();
  195. tcg_gen_and_tl(t1, Rd, Rr); /* t1 = Rd & Rr */
  196. tcg_gen_andc_tl(t2, Rd, R); /* t2 = Rd & ~R */
  197. tcg_gen_andc_tl(t3, Rr, R); /* t3 = Rr & ~R */
  198. tcg_gen_or_tl(t1, t1, t2); /* t1 = t1 | t2 | t3 */
  199. tcg_gen_or_tl(t1, t1, t3);
  200. tcg_gen_shri_tl(cpu_Cf, t1, 7); /* Cf = t1(7) */
  201. tcg_gen_shri_tl(cpu_Hf, t1, 3); /* Hf = t1(3) */
  202. tcg_gen_andi_tl(cpu_Hf, cpu_Hf, 1);
  203. tcg_temp_free_i32(t3);
  204. tcg_temp_free_i32(t2);
  205. tcg_temp_free_i32(t1);
  206. }
  207. static void gen_add_Vf(TCGv R, TCGv Rd, TCGv Rr)
  208. {
  209. TCGv t1 = tcg_temp_new_i32();
  210. TCGv t2 = tcg_temp_new_i32();
  211. /* t1 = Rd & Rr & ~R | ~Rd & ~Rr & R */
  212. /* = (Rd ^ R) & ~(Rd ^ Rr) */
  213. tcg_gen_xor_tl(t1, Rd, R);
  214. tcg_gen_xor_tl(t2, Rd, Rr);
  215. tcg_gen_andc_tl(t1, t1, t2);
  216. tcg_gen_shri_tl(cpu_Vf, t1, 7); /* Vf = t1(7) */
  217. tcg_temp_free_i32(t2);
  218. tcg_temp_free_i32(t1);
  219. }
  220. static void gen_sub_CHf(TCGv R, TCGv Rd, TCGv Rr)
  221. {
  222. TCGv t1 = tcg_temp_new_i32();
  223. TCGv t2 = tcg_temp_new_i32();
  224. TCGv t3 = tcg_temp_new_i32();
  225. tcg_gen_not_tl(t1, Rd); /* t1 = ~Rd */
  226. tcg_gen_and_tl(t2, t1, Rr); /* t2 = ~Rd & Rr */
  227. tcg_gen_or_tl(t3, t1, Rr); /* t3 = (~Rd | Rr) & R */
  228. tcg_gen_and_tl(t3, t3, R);
  229. tcg_gen_or_tl(t2, t2, t3); /* t2 = ~Rd & Rr | ~Rd & R | R & Rr */
  230. tcg_gen_shri_tl(cpu_Cf, t2, 7); /* Cf = t2(7) */
  231. tcg_gen_shri_tl(cpu_Hf, t2, 3); /* Hf = t2(3) */
  232. tcg_gen_andi_tl(cpu_Hf, cpu_Hf, 1);
  233. tcg_temp_free_i32(t3);
  234. tcg_temp_free_i32(t2);
  235. tcg_temp_free_i32(t1);
  236. }
  237. static void gen_sub_Vf(TCGv R, TCGv Rd, TCGv Rr)
  238. {
  239. TCGv t1 = tcg_temp_new_i32();
  240. TCGv t2 = tcg_temp_new_i32();
  241. /* t1 = Rd & ~Rr & ~R | ~Rd & Rr & R */
  242. /* = (Rd ^ R) & (Rd ^ R) */
  243. tcg_gen_xor_tl(t1, Rd, R);
  244. tcg_gen_xor_tl(t2, Rd, Rr);
  245. tcg_gen_and_tl(t1, t1, t2);
  246. tcg_gen_shri_tl(cpu_Vf, t1, 7); /* Vf = t1(7) */
  247. tcg_temp_free_i32(t2);
  248. tcg_temp_free_i32(t1);
  249. }
  250. static void gen_NSf(TCGv R)
  251. {
  252. tcg_gen_shri_tl(cpu_Nf, R, 7); /* Nf = R(7) */
  253. tcg_gen_xor_tl(cpu_Sf, cpu_Nf, cpu_Vf); /* Sf = Nf ^ Vf */
  254. }
  255. static void gen_ZNSf(TCGv R)
  256. {
  257. tcg_gen_setcondi_tl(TCG_COND_EQ, cpu_Zf, R, 0); /* Zf = R == 0 */
  258. /* update status register */
  259. tcg_gen_shri_tl(cpu_Nf, R, 7); /* Nf = R(7) */
  260. tcg_gen_xor_tl(cpu_Sf, cpu_Nf, cpu_Vf); /* Sf = Nf ^ Vf */
  261. }
  262. /*
  263. * Adds two registers without the C Flag and places the result in the
  264. * destination register Rd.
  265. */
  266. static bool trans_ADD(DisasContext *ctx, arg_ADD *a)
  267. {
  268. TCGv Rd = cpu_r[a->rd];
  269. TCGv Rr = cpu_r[a->rr];
  270. TCGv R = tcg_temp_new_i32();
  271. tcg_gen_add_tl(R, Rd, Rr); /* Rd = Rd + Rr */
  272. tcg_gen_andi_tl(R, R, 0xff); /* make it 8 bits */
  273. /* update status register */
  274. gen_add_CHf(R, Rd, Rr);
  275. gen_add_Vf(R, Rd, Rr);
  276. gen_ZNSf(R);
  277. /* update output registers */
  278. tcg_gen_mov_tl(Rd, R);
  279. tcg_temp_free_i32(R);
  280. return true;
  281. }
  282. /*
  283. * Adds two registers and the contents of the C Flag and places the result in
  284. * the destination register Rd.
  285. */
  286. static bool trans_ADC(DisasContext *ctx, arg_ADC *a)
  287. {
  288. TCGv Rd = cpu_r[a->rd];
  289. TCGv Rr = cpu_r[a->rr];
  290. TCGv R = tcg_temp_new_i32();
  291. tcg_gen_add_tl(R, Rd, Rr); /* R = Rd + Rr + Cf */
  292. tcg_gen_add_tl(R, R, cpu_Cf);
  293. tcg_gen_andi_tl(R, R, 0xff); /* make it 8 bits */
  294. /* update status register */
  295. gen_add_CHf(R, Rd, Rr);
  296. gen_add_Vf(R, Rd, Rr);
  297. gen_ZNSf(R);
  298. /* update output registers */
  299. tcg_gen_mov_tl(Rd, R);
  300. tcg_temp_free_i32(R);
  301. return true;
  302. }
  303. /*
  304. * Adds an immediate value (0 - 63) to a register pair and places the result
  305. * in the register pair. This instruction operates on the upper four register
  306. * pairs, and is well suited for operations on the pointer registers. This
  307. * instruction is not available in all devices. Refer to the device specific
  308. * instruction set summary.
  309. */
  310. static bool trans_ADIW(DisasContext *ctx, arg_ADIW *a)
  311. {
  312. if (!avr_have_feature(ctx, AVR_FEATURE_ADIW_SBIW)) {
  313. return true;
  314. }
  315. TCGv RdL = cpu_r[a->rd];
  316. TCGv RdH = cpu_r[a->rd + 1];
  317. int Imm = (a->imm);
  318. TCGv R = tcg_temp_new_i32();
  319. TCGv Rd = tcg_temp_new_i32();
  320. tcg_gen_deposit_tl(Rd, RdL, RdH, 8, 8); /* Rd = RdH:RdL */
  321. tcg_gen_addi_tl(R, Rd, Imm); /* R = Rd + Imm */
  322. tcg_gen_andi_tl(R, R, 0xffff); /* make it 16 bits */
  323. /* update status register */
  324. tcg_gen_andc_tl(cpu_Cf, Rd, R); /* Cf = Rd & ~R */
  325. tcg_gen_shri_tl(cpu_Cf, cpu_Cf, 15);
  326. tcg_gen_andc_tl(cpu_Vf, R, Rd); /* Vf = R & ~Rd */
  327. tcg_gen_shri_tl(cpu_Vf, cpu_Vf, 15);
  328. tcg_gen_setcondi_tl(TCG_COND_EQ, cpu_Zf, R, 0); /* Zf = R == 0 */
  329. tcg_gen_shri_tl(cpu_Nf, R, 15); /* Nf = R(15) */
  330. tcg_gen_xor_tl(cpu_Sf, cpu_Nf, cpu_Vf);/* Sf = Nf ^ Vf */
  331. /* update output registers */
  332. tcg_gen_andi_tl(RdL, R, 0xff);
  333. tcg_gen_shri_tl(RdH, R, 8);
  334. tcg_temp_free_i32(Rd);
  335. tcg_temp_free_i32(R);
  336. return true;
  337. }
  338. /*
  339. * Subtracts two registers and places the result in the destination
  340. * register Rd.
  341. */
  342. static bool trans_SUB(DisasContext *ctx, arg_SUB *a)
  343. {
  344. TCGv Rd = cpu_r[a->rd];
  345. TCGv Rr = cpu_r[a->rr];
  346. TCGv R = tcg_temp_new_i32();
  347. tcg_gen_sub_tl(R, Rd, Rr); /* R = Rd - Rr */
  348. tcg_gen_andi_tl(R, R, 0xff); /* make it 8 bits */
  349. /* update status register */
  350. tcg_gen_andc_tl(cpu_Cf, Rd, R); /* Cf = Rd & ~R */
  351. gen_sub_CHf(R, Rd, Rr);
  352. gen_sub_Vf(R, Rd, Rr);
  353. gen_ZNSf(R);
  354. /* update output registers */
  355. tcg_gen_mov_tl(Rd, R);
  356. tcg_temp_free_i32(R);
  357. return true;
  358. }
  359. /*
  360. * Subtracts a register and a constant and places the result in the
  361. * destination register Rd. This instruction is working on Register R16 to R31
  362. * and is very well suited for operations on the X, Y, and Z-pointers.
  363. */
  364. static bool trans_SUBI(DisasContext *ctx, arg_SUBI *a)
  365. {
  366. TCGv Rd = cpu_r[a->rd];
  367. TCGv Rr = tcg_const_i32(a->imm);
  368. TCGv R = tcg_temp_new_i32();
  369. tcg_gen_sub_tl(R, Rd, Rr); /* R = Rd - Imm */
  370. tcg_gen_andi_tl(R, R, 0xff); /* make it 8 bits */
  371. /* update status register */
  372. gen_sub_CHf(R, Rd, Rr);
  373. gen_sub_Vf(R, Rd, Rr);
  374. gen_ZNSf(R);
  375. /* update output registers */
  376. tcg_gen_mov_tl(Rd, R);
  377. tcg_temp_free_i32(R);
  378. tcg_temp_free_i32(Rr);
  379. return true;
  380. }
  381. /*
  382. * Subtracts two registers and subtracts with the C Flag and places the
  383. * result in the destination register Rd.
  384. */
  385. static bool trans_SBC(DisasContext *ctx, arg_SBC *a)
  386. {
  387. TCGv Rd = cpu_r[a->rd];
  388. TCGv Rr = cpu_r[a->rr];
  389. TCGv R = tcg_temp_new_i32();
  390. TCGv zero = tcg_const_i32(0);
  391. tcg_gen_sub_tl(R, Rd, Rr); /* R = Rd - Rr - Cf */
  392. tcg_gen_sub_tl(R, R, cpu_Cf);
  393. tcg_gen_andi_tl(R, R, 0xff); /* make it 8 bits */
  394. /* update status register */
  395. gen_sub_CHf(R, Rd, Rr);
  396. gen_sub_Vf(R, Rd, Rr);
  397. gen_NSf(R);
  398. /*
  399. * Previous value remains unchanged when the result is zero;
  400. * cleared otherwise.
  401. */
  402. tcg_gen_movcond_tl(TCG_COND_EQ, cpu_Zf, R, zero, cpu_Zf, zero);
  403. /* update output registers */
  404. tcg_gen_mov_tl(Rd, R);
  405. tcg_temp_free_i32(zero);
  406. tcg_temp_free_i32(R);
  407. return true;
  408. }
  409. /*
  410. * SBCI -- Subtract Immediate with Carry
  411. */
  412. static bool trans_SBCI(DisasContext *ctx, arg_SBCI *a)
  413. {
  414. TCGv Rd = cpu_r[a->rd];
  415. TCGv Rr = tcg_const_i32(a->imm);
  416. TCGv R = tcg_temp_new_i32();
  417. TCGv zero = tcg_const_i32(0);
  418. tcg_gen_sub_tl(R, Rd, Rr); /* R = Rd - Rr - Cf */
  419. tcg_gen_sub_tl(R, R, cpu_Cf);
  420. tcg_gen_andi_tl(R, R, 0xff); /* make it 8 bits */
  421. /* update status register */
  422. gen_sub_CHf(R, Rd, Rr);
  423. gen_sub_Vf(R, Rd, Rr);
  424. gen_NSf(R);
  425. /*
  426. * Previous value remains unchanged when the result is zero;
  427. * cleared otherwise.
  428. */
  429. tcg_gen_movcond_tl(TCG_COND_EQ, cpu_Zf, R, zero, cpu_Zf, zero);
  430. /* update output registers */
  431. tcg_gen_mov_tl(Rd, R);
  432. tcg_temp_free_i32(zero);
  433. tcg_temp_free_i32(R);
  434. tcg_temp_free_i32(Rr);
  435. return true;
  436. }
  437. /*
  438. * Subtracts an immediate value (0-63) from a register pair and places the
  439. * result in the register pair. This instruction operates on the upper four
  440. * register pairs, and is well suited for operations on the Pointer Registers.
  441. * This instruction is not available in all devices. Refer to the device
  442. * specific instruction set summary.
  443. */
  444. static bool trans_SBIW(DisasContext *ctx, arg_SBIW *a)
  445. {
  446. if (!avr_have_feature(ctx, AVR_FEATURE_ADIW_SBIW)) {
  447. return true;
  448. }
  449. TCGv RdL = cpu_r[a->rd];
  450. TCGv RdH = cpu_r[a->rd + 1];
  451. int Imm = (a->imm);
  452. TCGv R = tcg_temp_new_i32();
  453. TCGv Rd = tcg_temp_new_i32();
  454. tcg_gen_deposit_tl(Rd, RdL, RdH, 8, 8); /* Rd = RdH:RdL */
  455. tcg_gen_subi_tl(R, Rd, Imm); /* R = Rd - Imm */
  456. tcg_gen_andi_tl(R, R, 0xffff); /* make it 16 bits */
  457. /* update status register */
  458. tcg_gen_andc_tl(cpu_Cf, R, Rd);
  459. tcg_gen_shri_tl(cpu_Cf, cpu_Cf, 15); /* Cf = R & ~Rd */
  460. tcg_gen_andc_tl(cpu_Vf, Rd, R);
  461. tcg_gen_shri_tl(cpu_Vf, cpu_Vf, 15); /* Vf = Rd & ~R */
  462. tcg_gen_setcondi_tl(TCG_COND_EQ, cpu_Zf, R, 0); /* Zf = R == 0 */
  463. tcg_gen_shri_tl(cpu_Nf, R, 15); /* Nf = R(15) */
  464. tcg_gen_xor_tl(cpu_Sf, cpu_Nf, cpu_Vf); /* Sf = Nf ^ Vf */
  465. /* update output registers */
  466. tcg_gen_andi_tl(RdL, R, 0xff);
  467. tcg_gen_shri_tl(RdH, R, 8);
  468. tcg_temp_free_i32(Rd);
  469. tcg_temp_free_i32(R);
  470. return true;
  471. }
  472. /*
  473. * Performs the logical AND between the contents of register Rd and register
  474. * Rr and places the result in the destination register Rd.
  475. */
  476. static bool trans_AND(DisasContext *ctx, arg_AND *a)
  477. {
  478. TCGv Rd = cpu_r[a->rd];
  479. TCGv Rr = cpu_r[a->rr];
  480. TCGv R = tcg_temp_new_i32();
  481. tcg_gen_and_tl(R, Rd, Rr); /* Rd = Rd and Rr */
  482. /* update status register */
  483. tcg_gen_movi_tl(cpu_Vf, 0); /* Vf = 0 */
  484. tcg_gen_setcondi_tl(TCG_COND_EQ, cpu_Zf, R, 0); /* Zf = R == 0 */
  485. gen_ZNSf(R);
  486. /* update output registers */
  487. tcg_gen_mov_tl(Rd, R);
  488. tcg_temp_free_i32(R);
  489. return true;
  490. }
  491. /*
  492. * Performs the logical AND between the contents of register Rd and a constant
  493. * and places the result in the destination register Rd.
  494. */
  495. static bool trans_ANDI(DisasContext *ctx, arg_ANDI *a)
  496. {
  497. TCGv Rd = cpu_r[a->rd];
  498. int Imm = (a->imm);
  499. tcg_gen_andi_tl(Rd, Rd, Imm); /* Rd = Rd & Imm */
  500. /* update status register */
  501. tcg_gen_movi_tl(cpu_Vf, 0x00); /* Vf = 0 */
  502. gen_ZNSf(Rd);
  503. return true;
  504. }
  505. /*
  506. * Performs the logical OR between the contents of register Rd and register
  507. * Rr and places the result in the destination register Rd.
  508. */
  509. static bool trans_OR(DisasContext *ctx, arg_OR *a)
  510. {
  511. TCGv Rd = cpu_r[a->rd];
  512. TCGv Rr = cpu_r[a->rr];
  513. TCGv R = tcg_temp_new_i32();
  514. tcg_gen_or_tl(R, Rd, Rr);
  515. /* update status register */
  516. tcg_gen_movi_tl(cpu_Vf, 0);
  517. gen_ZNSf(R);
  518. /* update output registers */
  519. tcg_gen_mov_tl(Rd, R);
  520. tcg_temp_free_i32(R);
  521. return true;
  522. }
  523. /*
  524. * Performs the logical OR between the contents of register Rd and a
  525. * constant and places the result in the destination register Rd.
  526. */
  527. static bool trans_ORI(DisasContext *ctx, arg_ORI *a)
  528. {
  529. TCGv Rd = cpu_r[a->rd];
  530. int Imm = (a->imm);
  531. tcg_gen_ori_tl(Rd, Rd, Imm); /* Rd = Rd | Imm */
  532. /* update status register */
  533. tcg_gen_movi_tl(cpu_Vf, 0x00); /* Vf = 0 */
  534. gen_ZNSf(Rd);
  535. return true;
  536. }
  537. /*
  538. * Performs the logical EOR between the contents of register Rd and
  539. * register Rr and places the result in the destination register Rd.
  540. */
  541. static bool trans_EOR(DisasContext *ctx, arg_EOR *a)
  542. {
  543. TCGv Rd = cpu_r[a->rd];
  544. TCGv Rr = cpu_r[a->rr];
  545. tcg_gen_xor_tl(Rd, Rd, Rr);
  546. /* update status register */
  547. tcg_gen_movi_tl(cpu_Vf, 0);
  548. gen_ZNSf(Rd);
  549. return true;
  550. }
  551. /*
  552. * Clears the specified bits in register Rd. Performs the logical AND
  553. * between the contents of register Rd and the complement of the constant mask
  554. * K. The result will be placed in register Rd.
  555. */
  556. static bool trans_COM(DisasContext *ctx, arg_COM *a)
  557. {
  558. TCGv Rd = cpu_r[a->rd];
  559. TCGv R = tcg_temp_new_i32();
  560. tcg_gen_xori_tl(Rd, Rd, 0xff);
  561. /* update status register */
  562. tcg_gen_movi_tl(cpu_Cf, 1); /* Cf = 1 */
  563. tcg_gen_movi_tl(cpu_Vf, 0); /* Vf = 0 */
  564. gen_ZNSf(Rd);
  565. tcg_temp_free_i32(R);
  566. return true;
  567. }
  568. /*
  569. * Replaces the contents of register Rd with its two's complement; the
  570. * value $80 is left unchanged.
  571. */
  572. static bool trans_NEG(DisasContext *ctx, arg_NEG *a)
  573. {
  574. TCGv Rd = cpu_r[a->rd];
  575. TCGv t0 = tcg_const_i32(0);
  576. TCGv R = tcg_temp_new_i32();
  577. tcg_gen_sub_tl(R, t0, Rd); /* R = 0 - Rd */
  578. tcg_gen_andi_tl(R, R, 0xff); /* make it 8 bits */
  579. /* update status register */
  580. gen_sub_CHf(R, t0, Rd);
  581. gen_sub_Vf(R, t0, Rd);
  582. gen_ZNSf(R);
  583. /* update output registers */
  584. tcg_gen_mov_tl(Rd, R);
  585. tcg_temp_free_i32(t0);
  586. tcg_temp_free_i32(R);
  587. return true;
  588. }
  589. /*
  590. * Adds one -1- to the contents of register Rd and places the result in the
  591. * destination register Rd. The C Flag in SREG is not affected by the
  592. * operation, thus allowing the INC instruction to be used on a loop counter in
  593. * multiple-precision computations. When operating on unsigned numbers, only
  594. * BREQ and BRNE branches can be expected to perform consistently. When
  595. * operating on two's complement values, all signed branches are available.
  596. */
  597. static bool trans_INC(DisasContext *ctx, arg_INC *a)
  598. {
  599. TCGv Rd = cpu_r[a->rd];
  600. tcg_gen_addi_tl(Rd, Rd, 1);
  601. tcg_gen_andi_tl(Rd, Rd, 0xff);
  602. /* update status register */
  603. tcg_gen_setcondi_tl(TCG_COND_EQ, cpu_Vf, Rd, 0x80); /* Vf = Rd == 0x80 */
  604. gen_ZNSf(Rd);
  605. return true;
  606. }
  607. /*
  608. * Subtracts one -1- from the contents of register Rd and places the result
  609. * in the destination register Rd. The C Flag in SREG is not affected by the
  610. * operation, thus allowing the DEC instruction to be used on a loop counter in
  611. * multiple-precision computations. When operating on unsigned values, only
  612. * BREQ and BRNE branches can be expected to perform consistently. When
  613. * operating on two's complement values, all signed branches are available.
  614. */
  615. static bool trans_DEC(DisasContext *ctx, arg_DEC *a)
  616. {
  617. TCGv Rd = cpu_r[a->rd];
  618. tcg_gen_subi_tl(Rd, Rd, 1); /* Rd = Rd - 1 */
  619. tcg_gen_andi_tl(Rd, Rd, 0xff); /* make it 8 bits */
  620. /* update status register */
  621. tcg_gen_setcondi_tl(TCG_COND_EQ, cpu_Vf, Rd, 0x7f); /* Vf = Rd == 0x7f */
  622. gen_ZNSf(Rd);
  623. return true;
  624. }
  625. /*
  626. * This instruction performs 8-bit x 8-bit -> 16-bit unsigned multiplication.
  627. */
  628. static bool trans_MUL(DisasContext *ctx, arg_MUL *a)
  629. {
  630. if (!avr_have_feature(ctx, AVR_FEATURE_MUL)) {
  631. return true;
  632. }
  633. TCGv R0 = cpu_r[0];
  634. TCGv R1 = cpu_r[1];
  635. TCGv Rd = cpu_r[a->rd];
  636. TCGv Rr = cpu_r[a->rr];
  637. TCGv R = tcg_temp_new_i32();
  638. tcg_gen_mul_tl(R, Rd, Rr); /* R = Rd * Rr */
  639. tcg_gen_andi_tl(R0, R, 0xff);
  640. tcg_gen_shri_tl(R1, R, 8);
  641. /* update status register */
  642. tcg_gen_shri_tl(cpu_Cf, R, 15); /* Cf = R(15) */
  643. tcg_gen_setcondi_tl(TCG_COND_EQ, cpu_Zf, R, 0); /* Zf = R == 0 */
  644. tcg_temp_free_i32(R);
  645. return true;
  646. }
  647. /*
  648. * This instruction performs 8-bit x 8-bit -> 16-bit signed multiplication.
  649. */
  650. static bool trans_MULS(DisasContext *ctx, arg_MULS *a)
  651. {
  652. if (!avr_have_feature(ctx, AVR_FEATURE_MUL)) {
  653. return true;
  654. }
  655. TCGv R0 = cpu_r[0];
  656. TCGv R1 = cpu_r[1];
  657. TCGv Rd = cpu_r[a->rd];
  658. TCGv Rr = cpu_r[a->rr];
  659. TCGv R = tcg_temp_new_i32();
  660. TCGv t0 = tcg_temp_new_i32();
  661. TCGv t1 = tcg_temp_new_i32();
  662. tcg_gen_ext8s_tl(t0, Rd); /* make Rd full 32 bit signed */
  663. tcg_gen_ext8s_tl(t1, Rr); /* make Rr full 32 bit signed */
  664. tcg_gen_mul_tl(R, t0, t1); /* R = Rd * Rr */
  665. tcg_gen_andi_tl(R, R, 0xffff); /* make it 16 bits */
  666. tcg_gen_andi_tl(R0, R, 0xff);
  667. tcg_gen_shri_tl(R1, R, 8);
  668. /* update status register */
  669. tcg_gen_shri_tl(cpu_Cf, R, 15); /* Cf = R(15) */
  670. tcg_gen_setcondi_tl(TCG_COND_EQ, cpu_Zf, R, 0); /* Zf = R == 0 */
  671. tcg_temp_free_i32(t1);
  672. tcg_temp_free_i32(t0);
  673. tcg_temp_free_i32(R);
  674. return true;
  675. }
  676. /*
  677. * This instruction performs 8-bit x 8-bit -> 16-bit multiplication of a
  678. * signed and an unsigned number.
  679. */
  680. static bool trans_MULSU(DisasContext *ctx, arg_MULSU *a)
  681. {
  682. if (!avr_have_feature(ctx, AVR_FEATURE_MUL)) {
  683. return true;
  684. }
  685. TCGv R0 = cpu_r[0];
  686. TCGv R1 = cpu_r[1];
  687. TCGv Rd = cpu_r[a->rd];
  688. TCGv Rr = cpu_r[a->rr];
  689. TCGv R = tcg_temp_new_i32();
  690. TCGv t0 = tcg_temp_new_i32();
  691. tcg_gen_ext8s_tl(t0, Rd); /* make Rd full 32 bit signed */
  692. tcg_gen_mul_tl(R, t0, Rr); /* R = Rd * Rr */
  693. tcg_gen_andi_tl(R, R, 0xffff); /* make R 16 bits */
  694. tcg_gen_andi_tl(R0, R, 0xff);
  695. tcg_gen_shri_tl(R1, R, 8);
  696. /* update status register */
  697. tcg_gen_shri_tl(cpu_Cf, R, 15); /* Cf = R(15) */
  698. tcg_gen_setcondi_tl(TCG_COND_EQ, cpu_Zf, R, 0); /* Zf = R == 0 */
  699. tcg_temp_free_i32(t0);
  700. tcg_temp_free_i32(R);
  701. return true;
  702. }
  703. /*
  704. * This instruction performs 8-bit x 8-bit -> 16-bit unsigned
  705. * multiplication and shifts the result one bit left.
  706. */
  707. static bool trans_FMUL(DisasContext *ctx, arg_FMUL *a)
  708. {
  709. if (!avr_have_feature(ctx, AVR_FEATURE_MUL)) {
  710. return true;
  711. }
  712. TCGv R0 = cpu_r[0];
  713. TCGv R1 = cpu_r[1];
  714. TCGv Rd = cpu_r[a->rd];
  715. TCGv Rr = cpu_r[a->rr];
  716. TCGv R = tcg_temp_new_i32();
  717. tcg_gen_mul_tl(R, Rd, Rr); /* R = Rd * Rr */
  718. /* update status register */
  719. tcg_gen_shri_tl(cpu_Cf, R, 15); /* Cf = R(15) */
  720. tcg_gen_setcondi_tl(TCG_COND_EQ, cpu_Zf, R, 0); /* Zf = R == 0 */
  721. /* update output registers */
  722. tcg_gen_shli_tl(R, R, 1);
  723. tcg_gen_andi_tl(R0, R, 0xff);
  724. tcg_gen_shri_tl(R1, R, 8);
  725. tcg_gen_andi_tl(R1, R1, 0xff);
  726. tcg_temp_free_i32(R);
  727. return true;
  728. }
  729. /*
  730. * This instruction performs 8-bit x 8-bit -> 16-bit signed multiplication
  731. * and shifts the result one bit left.
  732. */
  733. static bool trans_FMULS(DisasContext *ctx, arg_FMULS *a)
  734. {
  735. if (!avr_have_feature(ctx, AVR_FEATURE_MUL)) {
  736. return true;
  737. }
  738. TCGv R0 = cpu_r[0];
  739. TCGv R1 = cpu_r[1];
  740. TCGv Rd = cpu_r[a->rd];
  741. TCGv Rr = cpu_r[a->rr];
  742. TCGv R = tcg_temp_new_i32();
  743. TCGv t0 = tcg_temp_new_i32();
  744. TCGv t1 = tcg_temp_new_i32();
  745. tcg_gen_ext8s_tl(t0, Rd); /* make Rd full 32 bit signed */
  746. tcg_gen_ext8s_tl(t1, Rr); /* make Rr full 32 bit signed */
  747. tcg_gen_mul_tl(R, t0, t1); /* R = Rd * Rr */
  748. tcg_gen_andi_tl(R, R, 0xffff); /* make it 16 bits */
  749. /* update status register */
  750. tcg_gen_shri_tl(cpu_Cf, R, 15); /* Cf = R(15) */
  751. tcg_gen_setcondi_tl(TCG_COND_EQ, cpu_Zf, R, 0); /* Zf = R == 0 */
  752. /* update output registers */
  753. tcg_gen_shli_tl(R, R, 1);
  754. tcg_gen_andi_tl(R0, R, 0xff);
  755. tcg_gen_shri_tl(R1, R, 8);
  756. tcg_gen_andi_tl(R1, R1, 0xff);
  757. tcg_temp_free_i32(t1);
  758. tcg_temp_free_i32(t0);
  759. tcg_temp_free_i32(R);
  760. return true;
  761. }
  762. /*
  763. * This instruction performs 8-bit x 8-bit -> 16-bit signed multiplication
  764. * and shifts the result one bit left.
  765. */
  766. static bool trans_FMULSU(DisasContext *ctx, arg_FMULSU *a)
  767. {
  768. if (!avr_have_feature(ctx, AVR_FEATURE_MUL)) {
  769. return true;
  770. }
  771. TCGv R0 = cpu_r[0];
  772. TCGv R1 = cpu_r[1];
  773. TCGv Rd = cpu_r[a->rd];
  774. TCGv Rr = cpu_r[a->rr];
  775. TCGv R = tcg_temp_new_i32();
  776. TCGv t0 = tcg_temp_new_i32();
  777. tcg_gen_ext8s_tl(t0, Rd); /* make Rd full 32 bit signed */
  778. tcg_gen_mul_tl(R, t0, Rr); /* R = Rd * Rr */
  779. tcg_gen_andi_tl(R, R, 0xffff); /* make it 16 bits */
  780. /* update status register */
  781. tcg_gen_shri_tl(cpu_Cf, R, 15); /* Cf = R(15) */
  782. tcg_gen_setcondi_tl(TCG_COND_EQ, cpu_Zf, R, 0); /* Zf = R == 0 */
  783. /* update output registers */
  784. tcg_gen_shli_tl(R, R, 1);
  785. tcg_gen_andi_tl(R0, R, 0xff);
  786. tcg_gen_shri_tl(R1, R, 8);
  787. tcg_gen_andi_tl(R1, R1, 0xff);
  788. tcg_temp_free_i32(t0);
  789. tcg_temp_free_i32(R);
  790. return true;
  791. }
  792. /*
  793. * The module is an instruction set extension to the AVR CPU, performing
  794. * DES iterations. The 64-bit data block (plaintext or ciphertext) is placed in
  795. * the CPU register file, registers R0-R7, where LSB of data is placed in LSB
  796. * of R0 and MSB of data is placed in MSB of R7. The full 64-bit key (including
  797. * parity bits) is placed in registers R8- R15, organized in the register file
  798. * with LSB of key in LSB of R8 and MSB of key in MSB of R15. Executing one DES
  799. * instruction performs one round in the DES algorithm. Sixteen rounds must be
  800. * executed in increasing order to form the correct DES ciphertext or
  801. * plaintext. Intermediate results are stored in the register file (R0-R15)
  802. * after each DES instruction. The instruction's operand (K) determines which
  803. * round is executed, and the half carry flag (H) determines whether encryption
  804. * or decryption is performed. The DES algorithm is described in
  805. * "Specifications for the Data Encryption Standard" (Federal Information
  806. * Processing Standards Publication 46). Intermediate results in this
  807. * implementation differ from the standard because the initial permutation and
  808. * the inverse initial permutation are performed each iteration. This does not
  809. * affect the result in the final ciphertext or plaintext, but reduces
  810. * execution time.
  811. */
  812. static bool trans_DES(DisasContext *ctx, arg_DES *a)
  813. {
  814. /* TODO */
  815. if (!avr_have_feature(ctx, AVR_FEATURE_DES)) {
  816. return true;
  817. }
  818. qemu_log_mask(LOG_UNIMP, "%s: not implemented\n", __func__);
  819. return true;
  820. }
  821. /*
  822. * Branch Instructions
  823. */
  824. static void gen_jmp_ez(DisasContext *ctx)
  825. {
  826. tcg_gen_deposit_tl(cpu_pc, cpu_r[30], cpu_r[31], 8, 8);
  827. tcg_gen_or_tl(cpu_pc, cpu_pc, cpu_eind);
  828. ctx->bstate = DISAS_LOOKUP;
  829. }
  830. static void gen_jmp_z(DisasContext *ctx)
  831. {
  832. tcg_gen_deposit_tl(cpu_pc, cpu_r[30], cpu_r[31], 8, 8);
  833. ctx->bstate = DISAS_LOOKUP;
  834. }
  835. static void gen_push_ret(DisasContext *ctx, int ret)
  836. {
  837. if (avr_feature(ctx->env, AVR_FEATURE_1_BYTE_PC)) {
  838. TCGv t0 = tcg_const_i32((ret & 0x0000ff));
  839. tcg_gen_qemu_st_tl(t0, cpu_sp, MMU_DATA_IDX, MO_UB);
  840. tcg_gen_subi_tl(cpu_sp, cpu_sp, 1);
  841. tcg_temp_free_i32(t0);
  842. } else if (avr_feature(ctx->env, AVR_FEATURE_2_BYTE_PC)) {
  843. TCGv t0 = tcg_const_i32((ret & 0x00ffff));
  844. tcg_gen_subi_tl(cpu_sp, cpu_sp, 1);
  845. tcg_gen_qemu_st_tl(t0, cpu_sp, MMU_DATA_IDX, MO_BEUW);
  846. tcg_gen_subi_tl(cpu_sp, cpu_sp, 1);
  847. tcg_temp_free_i32(t0);
  848. } else if (avr_feature(ctx->env, AVR_FEATURE_3_BYTE_PC)) {
  849. TCGv lo = tcg_const_i32((ret & 0x0000ff));
  850. TCGv hi = tcg_const_i32((ret & 0xffff00) >> 8);
  851. tcg_gen_qemu_st_tl(lo, cpu_sp, MMU_DATA_IDX, MO_UB);
  852. tcg_gen_subi_tl(cpu_sp, cpu_sp, 2);
  853. tcg_gen_qemu_st_tl(hi, cpu_sp, MMU_DATA_IDX, MO_BEUW);
  854. tcg_gen_subi_tl(cpu_sp, cpu_sp, 1);
  855. tcg_temp_free_i32(lo);
  856. tcg_temp_free_i32(hi);
  857. }
  858. }
  859. static void gen_pop_ret(DisasContext *ctx, TCGv ret)
  860. {
  861. if (avr_feature(ctx->env, AVR_FEATURE_1_BYTE_PC)) {
  862. tcg_gen_addi_tl(cpu_sp, cpu_sp, 1);
  863. tcg_gen_qemu_ld_tl(ret, cpu_sp, MMU_DATA_IDX, MO_UB);
  864. } else if (avr_feature(ctx->env, AVR_FEATURE_2_BYTE_PC)) {
  865. tcg_gen_addi_tl(cpu_sp, cpu_sp, 1);
  866. tcg_gen_qemu_ld_tl(ret, cpu_sp, MMU_DATA_IDX, MO_BEUW);
  867. tcg_gen_addi_tl(cpu_sp, cpu_sp, 1);
  868. } else if (avr_feature(ctx->env, AVR_FEATURE_3_BYTE_PC)) {
  869. TCGv lo = tcg_temp_new_i32();
  870. TCGv hi = tcg_temp_new_i32();
  871. tcg_gen_addi_tl(cpu_sp, cpu_sp, 1);
  872. tcg_gen_qemu_ld_tl(hi, cpu_sp, MMU_DATA_IDX, MO_BEUW);
  873. tcg_gen_addi_tl(cpu_sp, cpu_sp, 2);
  874. tcg_gen_qemu_ld_tl(lo, cpu_sp, MMU_DATA_IDX, MO_UB);
  875. tcg_gen_deposit_tl(ret, lo, hi, 8, 16);
  876. tcg_temp_free_i32(lo);
  877. tcg_temp_free_i32(hi);
  878. }
  879. }
  880. static void gen_goto_tb(DisasContext *ctx, int n, target_ulong dest)
  881. {
  882. TranslationBlock *tb = ctx->tb;
  883. if (ctx->singlestep == 0) {
  884. tcg_gen_goto_tb(n);
  885. tcg_gen_movi_i32(cpu_pc, dest);
  886. tcg_gen_exit_tb(tb, n);
  887. } else {
  888. tcg_gen_movi_i32(cpu_pc, dest);
  889. gen_helper_debug(cpu_env);
  890. tcg_gen_exit_tb(NULL, 0);
  891. }
  892. ctx->bstate = DISAS_NORETURN;
  893. }
  894. /*
  895. * Relative jump to an address within PC - 2K +1 and PC + 2K (words). For
  896. * AVR microcontrollers with Program memory not exceeding 4K words (8KB) this
  897. * instruction can address the entire memory from every address location. See
  898. * also JMP.
  899. */
  900. static bool trans_RJMP(DisasContext *ctx, arg_RJMP *a)
  901. {
  902. int dst = ctx->npc + a->imm;
  903. gen_goto_tb(ctx, 0, dst);
  904. return true;
  905. }
  906. /*
  907. * Indirect jump to the address pointed to by the Z (16 bits) Pointer
  908. * Register in the Register File. The Z-pointer Register is 16 bits wide and
  909. * allows jump within the lowest 64K words (128KB) section of Program memory.
  910. * This instruction is not available in all devices. Refer to the device
  911. * specific instruction set summary.
  912. */
  913. static bool trans_IJMP(DisasContext *ctx, arg_IJMP *a)
  914. {
  915. if (!avr_have_feature(ctx, AVR_FEATURE_IJMP_ICALL)) {
  916. return true;
  917. }
  918. gen_jmp_z(ctx);
  919. return true;
  920. }
  921. /*
  922. * Indirect jump to the address pointed to by the Z (16 bits) Pointer
  923. * Register in the Register File and the EIND Register in the I/O space. This
  924. * instruction allows for indirect jumps to the entire 4M (words) Program
  925. * memory space. See also IJMP. This instruction is not available in all
  926. * devices. Refer to the device specific instruction set summary.
  927. */
  928. static bool trans_EIJMP(DisasContext *ctx, arg_EIJMP *a)
  929. {
  930. if (!avr_have_feature(ctx, AVR_FEATURE_EIJMP_EICALL)) {
  931. return true;
  932. }
  933. gen_jmp_ez(ctx);
  934. return true;
  935. }
  936. /*
  937. * Jump to an address within the entire 4M (words) Program memory. See also
  938. * RJMP. This instruction is not available in all devices. Refer to the device
  939. * specific instruction set summary.0
  940. */
  941. static bool trans_JMP(DisasContext *ctx, arg_JMP *a)
  942. {
  943. if (!avr_have_feature(ctx, AVR_FEATURE_JMP_CALL)) {
  944. return true;
  945. }
  946. gen_goto_tb(ctx, 0, a->imm);
  947. return true;
  948. }
  949. /*
  950. * Relative call to an address within PC - 2K + 1 and PC + 2K (words). The
  951. * return address (the instruction after the RCALL) is stored onto the Stack.
  952. * See also CALL. For AVR microcontrollers with Program memory not exceeding 4K
  953. * words (8KB) this instruction can address the entire memory from every
  954. * address location. The Stack Pointer uses a post-decrement scheme during
  955. * RCALL.
  956. */
  957. static bool trans_RCALL(DisasContext *ctx, arg_RCALL *a)
  958. {
  959. int ret = ctx->npc;
  960. int dst = ctx->npc + a->imm;
  961. gen_push_ret(ctx, ret);
  962. gen_goto_tb(ctx, 0, dst);
  963. return true;
  964. }
  965. /*
  966. * Calls to a subroutine within the entire 4M (words) Program memory. The
  967. * return address (to the instruction after the CALL) will be stored onto the
  968. * Stack. See also RCALL. The Stack Pointer uses a post-decrement scheme during
  969. * CALL. This instruction is not available in all devices. Refer to the device
  970. * specific instruction set summary.
  971. */
  972. static bool trans_ICALL(DisasContext *ctx, arg_ICALL *a)
  973. {
  974. if (!avr_have_feature(ctx, AVR_FEATURE_IJMP_ICALL)) {
  975. return true;
  976. }
  977. int ret = ctx->npc;
  978. gen_push_ret(ctx, ret);
  979. gen_jmp_z(ctx);
  980. return true;
  981. }
  982. /*
  983. * Indirect call of a subroutine pointed to by the Z (16 bits) Pointer
  984. * Register in the Register File and the EIND Register in the I/O space. This
  985. * instruction allows for indirect calls to the entire 4M (words) Program
  986. * memory space. See also ICALL. The Stack Pointer uses a post-decrement scheme
  987. * during EICALL. This instruction is not available in all devices. Refer to
  988. * the device specific instruction set summary.
  989. */
  990. static bool trans_EICALL(DisasContext *ctx, arg_EICALL *a)
  991. {
  992. if (!avr_have_feature(ctx, AVR_FEATURE_EIJMP_EICALL)) {
  993. return true;
  994. }
  995. int ret = ctx->npc;
  996. gen_push_ret(ctx, ret);
  997. gen_jmp_ez(ctx);
  998. return true;
  999. }
  1000. /*
  1001. * Calls to a subroutine within the entire Program memory. The return
  1002. * address (to the instruction after the CALL) will be stored onto the Stack.
  1003. * (See also RCALL). The Stack Pointer uses a post-decrement scheme during
  1004. * CALL. This instruction is not available in all devices. Refer to the device
  1005. * specific instruction set summary.
  1006. */
  1007. static bool trans_CALL(DisasContext *ctx, arg_CALL *a)
  1008. {
  1009. if (!avr_have_feature(ctx, AVR_FEATURE_JMP_CALL)) {
  1010. return true;
  1011. }
  1012. int Imm = a->imm;
  1013. int ret = ctx->npc;
  1014. gen_push_ret(ctx, ret);
  1015. gen_goto_tb(ctx, 0, Imm);
  1016. return true;
  1017. }
  1018. /*
  1019. * Returns from subroutine. The return address is loaded from the STACK.
  1020. * The Stack Pointer uses a preincrement scheme during RET.
  1021. */
  1022. static bool trans_RET(DisasContext *ctx, arg_RET *a)
  1023. {
  1024. gen_pop_ret(ctx, cpu_pc);
  1025. ctx->bstate = DISAS_LOOKUP;
  1026. return true;
  1027. }
  1028. /*
  1029. * Returns from interrupt. The return address is loaded from the STACK and
  1030. * the Global Interrupt Flag is set. Note that the Status Register is not
  1031. * automatically stored when entering an interrupt routine, and it is not
  1032. * restored when returning from an interrupt routine. This must be handled by
  1033. * the application program. The Stack Pointer uses a pre-increment scheme
  1034. * during RETI.
  1035. */
  1036. static bool trans_RETI(DisasContext *ctx, arg_RETI *a)
  1037. {
  1038. gen_pop_ret(ctx, cpu_pc);
  1039. tcg_gen_movi_tl(cpu_If, 1);
  1040. /* Need to return to main loop to re-evaluate interrupts. */
  1041. ctx->bstate = DISAS_EXIT;
  1042. return true;
  1043. }
  1044. /*
  1045. * This instruction performs a compare between two registers Rd and Rr, and
  1046. * skips the next instruction if Rd = Rr.
  1047. */
  1048. static bool trans_CPSE(DisasContext *ctx, arg_CPSE *a)
  1049. {
  1050. ctx->skip_cond = TCG_COND_EQ;
  1051. ctx->skip_var0 = cpu_r[a->rd];
  1052. ctx->skip_var1 = cpu_r[a->rr];
  1053. return true;
  1054. }
  1055. /*
  1056. * This instruction performs a compare between two registers Rd and Rr.
  1057. * None of the registers are changed. All conditional branches can be used
  1058. * after this instruction.
  1059. */
  1060. static bool trans_CP(DisasContext *ctx, arg_CP *a)
  1061. {
  1062. TCGv Rd = cpu_r[a->rd];
  1063. TCGv Rr = cpu_r[a->rr];
  1064. TCGv R = tcg_temp_new_i32();
  1065. tcg_gen_sub_tl(R, Rd, Rr); /* R = Rd - Rr */
  1066. tcg_gen_andi_tl(R, R, 0xff); /* make it 8 bits */
  1067. /* update status register */
  1068. gen_sub_CHf(R, Rd, Rr);
  1069. gen_sub_Vf(R, Rd, Rr);
  1070. gen_ZNSf(R);
  1071. tcg_temp_free_i32(R);
  1072. return true;
  1073. }
  1074. /*
  1075. * This instruction performs a compare between two registers Rd and Rr and
  1076. * also takes into account the previous carry. None of the registers are
  1077. * changed. All conditional branches can be used after this instruction.
  1078. */
  1079. static bool trans_CPC(DisasContext *ctx, arg_CPC *a)
  1080. {
  1081. TCGv Rd = cpu_r[a->rd];
  1082. TCGv Rr = cpu_r[a->rr];
  1083. TCGv R = tcg_temp_new_i32();
  1084. TCGv zero = tcg_const_i32(0);
  1085. tcg_gen_sub_tl(R, Rd, Rr); /* R = Rd - Rr - Cf */
  1086. tcg_gen_sub_tl(R, R, cpu_Cf);
  1087. tcg_gen_andi_tl(R, R, 0xff); /* make it 8 bits */
  1088. /* update status register */
  1089. gen_sub_CHf(R, Rd, Rr);
  1090. gen_sub_Vf(R, Rd, Rr);
  1091. gen_NSf(R);
  1092. /*
  1093. * Previous value remains unchanged when the result is zero;
  1094. * cleared otherwise.
  1095. */
  1096. tcg_gen_movcond_tl(TCG_COND_EQ, cpu_Zf, R, zero, cpu_Zf, zero);
  1097. tcg_temp_free_i32(zero);
  1098. tcg_temp_free_i32(R);
  1099. return true;
  1100. }
  1101. /*
  1102. * This instruction performs a compare between register Rd and a constant.
  1103. * The register is not changed. All conditional branches can be used after this
  1104. * instruction.
  1105. */
  1106. static bool trans_CPI(DisasContext *ctx, arg_CPI *a)
  1107. {
  1108. TCGv Rd = cpu_r[a->rd];
  1109. int Imm = a->imm;
  1110. TCGv Rr = tcg_const_i32(Imm);
  1111. TCGv R = tcg_temp_new_i32();
  1112. tcg_gen_sub_tl(R, Rd, Rr); /* R = Rd - Rr */
  1113. tcg_gen_andi_tl(R, R, 0xff); /* make it 8 bits */
  1114. /* update status register */
  1115. gen_sub_CHf(R, Rd, Rr);
  1116. gen_sub_Vf(R, Rd, Rr);
  1117. gen_ZNSf(R);
  1118. tcg_temp_free_i32(R);
  1119. tcg_temp_free_i32(Rr);
  1120. return true;
  1121. }
  1122. /*
  1123. * This instruction tests a single bit in a register and skips the next
  1124. * instruction if the bit is cleared.
  1125. */
  1126. static bool trans_SBRC(DisasContext *ctx, arg_SBRC *a)
  1127. {
  1128. TCGv Rr = cpu_r[a->rr];
  1129. ctx->skip_cond = TCG_COND_EQ;
  1130. ctx->skip_var0 = tcg_temp_new();
  1131. ctx->free_skip_var0 = true;
  1132. tcg_gen_andi_tl(ctx->skip_var0, Rr, 1 << a->bit);
  1133. return true;
  1134. }
  1135. /*
  1136. * This instruction tests a single bit in a register and skips the next
  1137. * instruction if the bit is set.
  1138. */
  1139. static bool trans_SBRS(DisasContext *ctx, arg_SBRS *a)
  1140. {
  1141. TCGv Rr = cpu_r[a->rr];
  1142. ctx->skip_cond = TCG_COND_NE;
  1143. ctx->skip_var0 = tcg_temp_new();
  1144. ctx->free_skip_var0 = true;
  1145. tcg_gen_andi_tl(ctx->skip_var0, Rr, 1 << a->bit);
  1146. return true;
  1147. }
  1148. /*
  1149. * This instruction tests a single bit in an I/O Register and skips the
  1150. * next instruction if the bit is cleared. This instruction operates on the
  1151. * lower 32 I/O Registers -- addresses 0-31.
  1152. */
  1153. static bool trans_SBIC(DisasContext *ctx, arg_SBIC *a)
  1154. {
  1155. TCGv temp = tcg_const_i32(a->reg);
  1156. gen_helper_inb(temp, cpu_env, temp);
  1157. tcg_gen_andi_tl(temp, temp, 1 << a->bit);
  1158. ctx->skip_cond = TCG_COND_EQ;
  1159. ctx->skip_var0 = temp;
  1160. ctx->free_skip_var0 = true;
  1161. return true;
  1162. }
  1163. /*
  1164. * This instruction tests a single bit in an I/O Register and skips the
  1165. * next instruction if the bit is set. This instruction operates on the lower
  1166. * 32 I/O Registers -- addresses 0-31.
  1167. */
  1168. static bool trans_SBIS(DisasContext *ctx, arg_SBIS *a)
  1169. {
  1170. TCGv temp = tcg_const_i32(a->reg);
  1171. gen_helper_inb(temp, cpu_env, temp);
  1172. tcg_gen_andi_tl(temp, temp, 1 << a->bit);
  1173. ctx->skip_cond = TCG_COND_NE;
  1174. ctx->skip_var0 = temp;
  1175. ctx->free_skip_var0 = true;
  1176. return true;
  1177. }
  1178. /*
  1179. * Conditional relative branch. Tests a single bit in SREG and branches
  1180. * relatively to PC if the bit is cleared. This instruction branches relatively
  1181. * to PC in either direction (PC - 63 < = destination <= PC + 64). The
  1182. * parameter k is the offset from PC and is represented in two's complement
  1183. * form.
  1184. */
  1185. static bool trans_BRBC(DisasContext *ctx, arg_BRBC *a)
  1186. {
  1187. TCGLabel *not_taken = gen_new_label();
  1188. TCGv var;
  1189. switch (a->bit) {
  1190. case 0x00:
  1191. var = cpu_Cf;
  1192. break;
  1193. case 0x01:
  1194. var = cpu_Zf;
  1195. break;
  1196. case 0x02:
  1197. var = cpu_Nf;
  1198. break;
  1199. case 0x03:
  1200. var = cpu_Vf;
  1201. break;
  1202. case 0x04:
  1203. var = cpu_Sf;
  1204. break;
  1205. case 0x05:
  1206. var = cpu_Hf;
  1207. break;
  1208. case 0x06:
  1209. var = cpu_Tf;
  1210. break;
  1211. case 0x07:
  1212. var = cpu_If;
  1213. break;
  1214. default:
  1215. g_assert_not_reached();
  1216. }
  1217. tcg_gen_brcondi_i32(TCG_COND_NE, var, 0, not_taken);
  1218. gen_goto_tb(ctx, 0, ctx->npc + a->imm);
  1219. gen_set_label(not_taken);
  1220. ctx->bstate = DISAS_CHAIN;
  1221. return true;
  1222. }
  1223. /*
  1224. * Conditional relative branch. Tests a single bit in SREG and branches
  1225. * relatively to PC if the bit is set. This instruction branches relatively to
  1226. * PC in either direction (PC - 63 < = destination <= PC + 64). The parameter k
  1227. * is the offset from PC and is represented in two's complement form.
  1228. */
  1229. static bool trans_BRBS(DisasContext *ctx, arg_BRBS *a)
  1230. {
  1231. TCGLabel *not_taken = gen_new_label();
  1232. TCGv var;
  1233. switch (a->bit) {
  1234. case 0x00:
  1235. var = cpu_Cf;
  1236. break;
  1237. case 0x01:
  1238. var = cpu_Zf;
  1239. break;
  1240. case 0x02:
  1241. var = cpu_Nf;
  1242. break;
  1243. case 0x03:
  1244. var = cpu_Vf;
  1245. break;
  1246. case 0x04:
  1247. var = cpu_Sf;
  1248. break;
  1249. case 0x05:
  1250. var = cpu_Hf;
  1251. break;
  1252. case 0x06:
  1253. var = cpu_Tf;
  1254. break;
  1255. case 0x07:
  1256. var = cpu_If;
  1257. break;
  1258. default:
  1259. g_assert_not_reached();
  1260. }
  1261. tcg_gen_brcondi_i32(TCG_COND_EQ, var, 0, not_taken);
  1262. gen_goto_tb(ctx, 0, ctx->npc + a->imm);
  1263. gen_set_label(not_taken);
  1264. ctx->bstate = DISAS_CHAIN;
  1265. return true;
  1266. }
  1267. /*
  1268. * Data Transfer Instructions
  1269. */
  1270. /*
  1271. * in the gen_set_addr & gen_get_addr functions
  1272. * H assumed to be in 0x00ff0000 format
  1273. * M assumed to be in 0x000000ff format
  1274. * L assumed to be in 0x000000ff format
  1275. */
  1276. static void gen_set_addr(TCGv addr, TCGv H, TCGv M, TCGv L)
  1277. {
  1278. tcg_gen_andi_tl(L, addr, 0x000000ff);
  1279. tcg_gen_andi_tl(M, addr, 0x0000ff00);
  1280. tcg_gen_shri_tl(M, M, 8);
  1281. tcg_gen_andi_tl(H, addr, 0x00ff0000);
  1282. }
  1283. static void gen_set_xaddr(TCGv addr)
  1284. {
  1285. gen_set_addr(addr, cpu_rampX, cpu_r[27], cpu_r[26]);
  1286. }
  1287. static void gen_set_yaddr(TCGv addr)
  1288. {
  1289. gen_set_addr(addr, cpu_rampY, cpu_r[29], cpu_r[28]);
  1290. }
  1291. static void gen_set_zaddr(TCGv addr)
  1292. {
  1293. gen_set_addr(addr, cpu_rampZ, cpu_r[31], cpu_r[30]);
  1294. }
  1295. static TCGv gen_get_addr(TCGv H, TCGv M, TCGv L)
  1296. {
  1297. TCGv addr = tcg_temp_new_i32();
  1298. tcg_gen_deposit_tl(addr, M, H, 8, 8);
  1299. tcg_gen_deposit_tl(addr, L, addr, 8, 16);
  1300. return addr;
  1301. }
  1302. static TCGv gen_get_xaddr(void)
  1303. {
  1304. return gen_get_addr(cpu_rampX, cpu_r[27], cpu_r[26]);
  1305. }
  1306. static TCGv gen_get_yaddr(void)
  1307. {
  1308. return gen_get_addr(cpu_rampY, cpu_r[29], cpu_r[28]);
  1309. }
  1310. static TCGv gen_get_zaddr(void)
  1311. {
  1312. return gen_get_addr(cpu_rampZ, cpu_r[31], cpu_r[30]);
  1313. }
  1314. /*
  1315. * Load one byte indirect from data space to register and stores an clear
  1316. * the bits in data space specified by the register. The instruction can only
  1317. * be used towards internal SRAM. The data location is pointed to by the Z (16
  1318. * bits) Pointer Register in the Register File. Memory access is limited to the
  1319. * current data segment of 64KB. To access another data segment in devices with
  1320. * more than 64KB data space, the RAMPZ in register in the I/O area has to be
  1321. * changed. The Z-pointer Register is left unchanged by the operation. This
  1322. * instruction is especially suited for clearing status bits stored in SRAM.
  1323. */
  1324. static void gen_data_store(DisasContext *ctx, TCGv data, TCGv addr)
  1325. {
  1326. if (ctx->tb->flags & TB_FLAGS_FULL_ACCESS) {
  1327. gen_helper_fullwr(cpu_env, data, addr);
  1328. } else {
  1329. tcg_gen_qemu_st8(data, addr, MMU_DATA_IDX); /* mem[addr] = data */
  1330. }
  1331. }
  1332. static void gen_data_load(DisasContext *ctx, TCGv data, TCGv addr)
  1333. {
  1334. if (ctx->tb->flags & TB_FLAGS_FULL_ACCESS) {
  1335. gen_helper_fullrd(data, cpu_env, addr);
  1336. } else {
  1337. tcg_gen_qemu_ld8u(data, addr, MMU_DATA_IDX); /* data = mem[addr] */
  1338. }
  1339. }
  1340. /*
  1341. * This instruction makes a copy of one register into another. The source
  1342. * register Rr is left unchanged, while the destination register Rd is loaded
  1343. * with a copy of Rr.
  1344. */
  1345. static bool trans_MOV(DisasContext *ctx, arg_MOV *a)
  1346. {
  1347. TCGv Rd = cpu_r[a->rd];
  1348. TCGv Rr = cpu_r[a->rr];
  1349. tcg_gen_mov_tl(Rd, Rr);
  1350. return true;
  1351. }
  1352. /*
  1353. * This instruction makes a copy of one register pair into another register
  1354. * pair. The source register pair Rr+1:Rr is left unchanged, while the
  1355. * destination register pair Rd+1:Rd is loaded with a copy of Rr + 1:Rr. This
  1356. * instruction is not available in all devices. Refer to the device specific
  1357. * instruction set summary.
  1358. */
  1359. static bool trans_MOVW(DisasContext *ctx, arg_MOVW *a)
  1360. {
  1361. if (!avr_have_feature(ctx, AVR_FEATURE_MOVW)) {
  1362. return true;
  1363. }
  1364. TCGv RdL = cpu_r[a->rd];
  1365. TCGv RdH = cpu_r[a->rd + 1];
  1366. TCGv RrL = cpu_r[a->rr];
  1367. TCGv RrH = cpu_r[a->rr + 1];
  1368. tcg_gen_mov_tl(RdH, RrH);
  1369. tcg_gen_mov_tl(RdL, RrL);
  1370. return true;
  1371. }
  1372. /*
  1373. * Loads an 8 bit constant directly to register 16 to 31.
  1374. */
  1375. static bool trans_LDI(DisasContext *ctx, arg_LDI *a)
  1376. {
  1377. TCGv Rd = cpu_r[a->rd];
  1378. int imm = a->imm;
  1379. tcg_gen_movi_tl(Rd, imm);
  1380. return true;
  1381. }
  1382. /*
  1383. * Loads one byte from the data space to a register. For parts with SRAM,
  1384. * the data space consists of the Register File, I/O memory and internal SRAM
  1385. * (and external SRAM if applicable). For parts without SRAM, the data space
  1386. * consists of the register file only. The EEPROM has a separate address space.
  1387. * A 16-bit address must be supplied. Memory access is limited to the current
  1388. * data segment of 64KB. The LDS instruction uses the RAMPD Register to access
  1389. * memory above 64KB. To access another data segment in devices with more than
  1390. * 64KB data space, the RAMPD in register in the I/O area has to be changed.
  1391. * This instruction is not available in all devices. Refer to the device
  1392. * specific instruction set summary.
  1393. */
  1394. static bool trans_LDS(DisasContext *ctx, arg_LDS *a)
  1395. {
  1396. TCGv Rd = cpu_r[a->rd];
  1397. TCGv addr = tcg_temp_new_i32();
  1398. TCGv H = cpu_rampD;
  1399. a->imm = next_word(ctx);
  1400. tcg_gen_mov_tl(addr, H); /* addr = H:M:L */
  1401. tcg_gen_shli_tl(addr, addr, 16);
  1402. tcg_gen_ori_tl(addr, addr, a->imm);
  1403. gen_data_load(ctx, Rd, addr);
  1404. tcg_temp_free_i32(addr);
  1405. return true;
  1406. }
  1407. /*
  1408. * Loads one byte indirect from the data space to a register. For parts
  1409. * with SRAM, the data space consists of the Register File, I/O memory and
  1410. * internal SRAM (and external SRAM if applicable). For parts without SRAM, the
  1411. * data space consists of the Register File only. In some parts the Flash
  1412. * Memory has been mapped to the data space and can be read using this command.
  1413. * The EEPROM has a separate address space. The data location is pointed to by
  1414. * the X (16 bits) Pointer Register in the Register File. Memory access is
  1415. * limited to the current data segment of 64KB. To access another data segment
  1416. * in devices with more than 64KB data space, the RAMPX in register in the I/O
  1417. * area has to be changed. The X-pointer Register can either be left unchanged
  1418. * by the operation, or it can be post-incremented or predecremented. These
  1419. * features are especially suited for accessing arrays, tables, and Stack
  1420. * Pointer usage of the X-pointer Register. Note that only the low byte of the
  1421. * X-pointer is updated in devices with no more than 256 bytes data space. For
  1422. * such devices, the high byte of the pointer is not used by this instruction
  1423. * and can be used for other purposes. The RAMPX Register in the I/O area is
  1424. * updated in parts with more than 64KB data space or more than 64KB Program
  1425. * memory, and the increment/decrement is added to the entire 24-bit address on
  1426. * such devices. Not all variants of this instruction is available in all
  1427. * devices. Refer to the device specific instruction set summary. In the
  1428. * Reduced Core tinyAVR the LD instruction can be used to achieve the same
  1429. * operation as LPM since the program memory is mapped to the data memory
  1430. * space.
  1431. */
  1432. static bool trans_LDX1(DisasContext *ctx, arg_LDX1 *a)
  1433. {
  1434. TCGv Rd = cpu_r[a->rd];
  1435. TCGv addr = gen_get_xaddr();
  1436. gen_data_load(ctx, Rd, addr);
  1437. tcg_temp_free_i32(addr);
  1438. return true;
  1439. }
  1440. static bool trans_LDX2(DisasContext *ctx, arg_LDX2 *a)
  1441. {
  1442. TCGv Rd = cpu_r[a->rd];
  1443. TCGv addr = gen_get_xaddr();
  1444. gen_data_load(ctx, Rd, addr);
  1445. tcg_gen_addi_tl(addr, addr, 1); /* addr = addr + 1 */
  1446. gen_set_xaddr(addr);
  1447. tcg_temp_free_i32(addr);
  1448. return true;
  1449. }
  1450. static bool trans_LDX3(DisasContext *ctx, arg_LDX3 *a)
  1451. {
  1452. TCGv Rd = cpu_r[a->rd];
  1453. TCGv addr = gen_get_xaddr();
  1454. tcg_gen_subi_tl(addr, addr, 1); /* addr = addr - 1 */
  1455. gen_data_load(ctx, Rd, addr);
  1456. gen_set_xaddr(addr);
  1457. tcg_temp_free_i32(addr);
  1458. return true;
  1459. }
  1460. /*
  1461. * Loads one byte indirect with or without displacement from the data space
  1462. * to a register. For parts with SRAM, the data space consists of the Register
  1463. * File, I/O memory and internal SRAM (and external SRAM if applicable). For
  1464. * parts without SRAM, the data space consists of the Register File only. In
  1465. * some parts the Flash Memory has been mapped to the data space and can be
  1466. * read using this command. The EEPROM has a separate address space. The data
  1467. * location is pointed to by the Y (16 bits) Pointer Register in the Register
  1468. * File. Memory access is limited to the current data segment of 64KB. To
  1469. * access another data segment in devices with more than 64KB data space, the
  1470. * RAMPY in register in the I/O area has to be changed. The Y-pointer Register
  1471. * can either be left unchanged by the operation, or it can be post-incremented
  1472. * or predecremented. These features are especially suited for accessing
  1473. * arrays, tables, and Stack Pointer usage of the Y-pointer Register. Note that
  1474. * only the low byte of the Y-pointer is updated in devices with no more than
  1475. * 256 bytes data space. For such devices, the high byte of the pointer is not
  1476. * used by this instruction and can be used for other purposes. The RAMPY
  1477. * Register in the I/O area is updated in parts with more than 64KB data space
  1478. * or more than 64KB Program memory, and the increment/decrement/displacement
  1479. * is added to the entire 24-bit address on such devices. Not all variants of
  1480. * this instruction is available in all devices. Refer to the device specific
  1481. * instruction set summary. In the Reduced Core tinyAVR the LD instruction can
  1482. * be used to achieve the same operation as LPM since the program memory is
  1483. * mapped to the data memory space.
  1484. */
  1485. static bool trans_LDY2(DisasContext *ctx, arg_LDY2 *a)
  1486. {
  1487. TCGv Rd = cpu_r[a->rd];
  1488. TCGv addr = gen_get_yaddr();
  1489. gen_data_load(ctx, Rd, addr);
  1490. tcg_gen_addi_tl(addr, addr, 1); /* addr = addr + 1 */
  1491. gen_set_yaddr(addr);
  1492. tcg_temp_free_i32(addr);
  1493. return true;
  1494. }
  1495. static bool trans_LDY3(DisasContext *ctx, arg_LDY3 *a)
  1496. {
  1497. TCGv Rd = cpu_r[a->rd];
  1498. TCGv addr = gen_get_yaddr();
  1499. tcg_gen_subi_tl(addr, addr, 1); /* addr = addr - 1 */
  1500. gen_data_load(ctx, Rd, addr);
  1501. gen_set_yaddr(addr);
  1502. tcg_temp_free_i32(addr);
  1503. return true;
  1504. }
  1505. static bool trans_LDDY(DisasContext *ctx, arg_LDDY *a)
  1506. {
  1507. TCGv Rd = cpu_r[a->rd];
  1508. TCGv addr = gen_get_yaddr();
  1509. tcg_gen_addi_tl(addr, addr, a->imm); /* addr = addr + q */
  1510. gen_data_load(ctx, Rd, addr);
  1511. tcg_temp_free_i32(addr);
  1512. return true;
  1513. }
  1514. /*
  1515. * Loads one byte indirect with or without displacement from the data space
  1516. * to a register. For parts with SRAM, the data space consists of the Register
  1517. * File, I/O memory and internal SRAM (and external SRAM if applicable). For
  1518. * parts without SRAM, the data space consists of the Register File only. In
  1519. * some parts the Flash Memory has been mapped to the data space and can be
  1520. * read using this command. The EEPROM has a separate address space. The data
  1521. * location is pointed to by the Z (16 bits) Pointer Register in the Register
  1522. * File. Memory access is limited to the current data segment of 64KB. To
  1523. * access another data segment in devices with more than 64KB data space, the
  1524. * RAMPZ in register in the I/O area has to be changed. The Z-pointer Register
  1525. * can either be left unchanged by the operation, or it can be post-incremented
  1526. * or predecremented. These features are especially suited for Stack Pointer
  1527. * usage of the Z-pointer Register, however because the Z-pointer Register can
  1528. * be used for indirect subroutine calls, indirect jumps and table lookup, it
  1529. * is often more convenient to use the X or Y-pointer as a dedicated Stack
  1530. * Pointer. Note that only the low byte of the Z-pointer is updated in devices
  1531. * with no more than 256 bytes data space. For such devices, the high byte of
  1532. * the pointer is not used by this instruction and can be used for other
  1533. * purposes. The RAMPZ Register in the I/O area is updated in parts with more
  1534. * than 64KB data space or more than 64KB Program memory, and the
  1535. * increment/decrement/displacement is added to the entire 24-bit address on
  1536. * such devices. Not all variants of this instruction is available in all
  1537. * devices. Refer to the device specific instruction set summary. In the
  1538. * Reduced Core tinyAVR the LD instruction can be used to achieve the same
  1539. * operation as LPM since the program memory is mapped to the data memory
  1540. * space. For using the Z-pointer for table lookup in Program memory see the
  1541. * LPM and ELPM instructions.
  1542. */
  1543. static bool trans_LDZ2(DisasContext *ctx, arg_LDZ2 *a)
  1544. {
  1545. TCGv Rd = cpu_r[a->rd];
  1546. TCGv addr = gen_get_zaddr();
  1547. gen_data_load(ctx, Rd, addr);
  1548. tcg_gen_addi_tl(addr, addr, 1); /* addr = addr + 1 */
  1549. gen_set_zaddr(addr);
  1550. tcg_temp_free_i32(addr);
  1551. return true;
  1552. }
  1553. static bool trans_LDZ3(DisasContext *ctx, arg_LDZ3 *a)
  1554. {
  1555. TCGv Rd = cpu_r[a->rd];
  1556. TCGv addr = gen_get_zaddr();
  1557. tcg_gen_subi_tl(addr, addr, 1); /* addr = addr - 1 */
  1558. gen_data_load(ctx, Rd, addr);
  1559. gen_set_zaddr(addr);
  1560. tcg_temp_free_i32(addr);
  1561. return true;
  1562. }
  1563. static bool trans_LDDZ(DisasContext *ctx, arg_LDDZ *a)
  1564. {
  1565. TCGv Rd = cpu_r[a->rd];
  1566. TCGv addr = gen_get_zaddr();
  1567. tcg_gen_addi_tl(addr, addr, a->imm); /* addr = addr + q */
  1568. gen_data_load(ctx, Rd, addr);
  1569. tcg_temp_free_i32(addr);
  1570. return true;
  1571. }
  1572. /*
  1573. * Stores one byte from a Register to the data space. For parts with SRAM,
  1574. * the data space consists of the Register File, I/O memory and internal SRAM
  1575. * (and external SRAM if applicable). For parts without SRAM, the data space
  1576. * consists of the Register File only. The EEPROM has a separate address space.
  1577. * A 16-bit address must be supplied. Memory access is limited to the current
  1578. * data segment of 64KB. The STS instruction uses the RAMPD Register to access
  1579. * memory above 64KB. To access another data segment in devices with more than
  1580. * 64KB data space, the RAMPD in register in the I/O area has to be changed.
  1581. * This instruction is not available in all devices. Refer to the device
  1582. * specific instruction set summary.
  1583. */
  1584. static bool trans_STS(DisasContext *ctx, arg_STS *a)
  1585. {
  1586. TCGv Rd = cpu_r[a->rd];
  1587. TCGv addr = tcg_temp_new_i32();
  1588. TCGv H = cpu_rampD;
  1589. a->imm = next_word(ctx);
  1590. tcg_gen_mov_tl(addr, H); /* addr = H:M:L */
  1591. tcg_gen_shli_tl(addr, addr, 16);
  1592. tcg_gen_ori_tl(addr, addr, a->imm);
  1593. gen_data_store(ctx, Rd, addr);
  1594. tcg_temp_free_i32(addr);
  1595. return true;
  1596. }
  1597. /*
  1598. * Stores one byte indirect from a register to data space. For parts with SRAM,
  1599. * the data space consists of the Register File, I/O memory, and internal SRAM
  1600. * (and external SRAM if applicable). For parts without SRAM, the data space
  1601. * consists of the Register File only. The EEPROM has a separate address space.
  1602. *
  1603. * The data location is pointed to by the X (16 bits) Pointer Register in the
  1604. * Register File. Memory access is limited to the current data segment of 64KB.
  1605. * To access another data segment in devices with more than 64KB data space, the
  1606. * RAMPX in register in the I/O area has to be changed.
  1607. *
  1608. * The X-pointer Register can either be left unchanged by the operation, or it
  1609. * can be post-incremented or pre-decremented. These features are especially
  1610. * suited for accessing arrays, tables, and Stack Pointer usage of the
  1611. * X-pointer Register. Note that only the low byte of the X-pointer is updated
  1612. * in devices with no more than 256 bytes data space. For such devices, the high
  1613. * byte of the pointer is not used by this instruction and can be used for other
  1614. * purposes. The RAMPX Register in the I/O area is updated in parts with more
  1615. * than 64KB data space or more than 64KB Program memory, and the increment /
  1616. * decrement is added to the entire 24-bit address on such devices.
  1617. */
  1618. static bool trans_STX1(DisasContext *ctx, arg_STX1 *a)
  1619. {
  1620. TCGv Rd = cpu_r[a->rr];
  1621. TCGv addr = gen_get_xaddr();
  1622. gen_data_store(ctx, Rd, addr);
  1623. tcg_temp_free_i32(addr);
  1624. return true;
  1625. }
  1626. static bool trans_STX2(DisasContext *ctx, arg_STX2 *a)
  1627. {
  1628. TCGv Rd = cpu_r[a->rr];
  1629. TCGv addr = gen_get_xaddr();
  1630. gen_data_store(ctx, Rd, addr);
  1631. tcg_gen_addi_tl(addr, addr, 1); /* addr = addr + 1 */
  1632. gen_set_xaddr(addr);
  1633. tcg_temp_free_i32(addr);
  1634. return true;
  1635. }
  1636. static bool trans_STX3(DisasContext *ctx, arg_STX3 *a)
  1637. {
  1638. TCGv Rd = cpu_r[a->rr];
  1639. TCGv addr = gen_get_xaddr();
  1640. tcg_gen_subi_tl(addr, addr, 1); /* addr = addr - 1 */
  1641. gen_data_store(ctx, Rd, addr);
  1642. gen_set_xaddr(addr);
  1643. tcg_temp_free_i32(addr);
  1644. return true;
  1645. }
  1646. /*
  1647. * Stores one byte indirect with or without displacement from a register to data
  1648. * space. For parts with SRAM, the data space consists of the Register File, I/O
  1649. * memory, and internal SRAM (and external SRAM if applicable). For parts
  1650. * without SRAM, the data space consists of the Register File only. The EEPROM
  1651. * has a separate address space.
  1652. *
  1653. * The data location is pointed to by the Y (16 bits) Pointer Register in the
  1654. * Register File. Memory access is limited to the current data segment of 64KB.
  1655. * To access another data segment in devices with more than 64KB data space, the
  1656. * RAMPY in register in the I/O area has to be changed.
  1657. *
  1658. * The Y-pointer Register can either be left unchanged by the operation, or it
  1659. * can be post-incremented or pre-decremented. These features are especially
  1660. * suited for accessing arrays, tables, and Stack Pointer usage of the Y-pointer
  1661. * Register. Note that only the low byte of the Y-pointer is updated in devices
  1662. * with no more than 256 bytes data space. For such devices, the high byte of
  1663. * the pointer is not used by this instruction and can be used for other
  1664. * purposes. The RAMPY Register in the I/O area is updated in parts with more
  1665. * than 64KB data space or more than 64KB Program memory, and the increment /
  1666. * decrement / displacement is added to the entire 24-bit address on such
  1667. * devices.
  1668. */
  1669. static bool trans_STY2(DisasContext *ctx, arg_STY2 *a)
  1670. {
  1671. TCGv Rd = cpu_r[a->rd];
  1672. TCGv addr = gen_get_yaddr();
  1673. gen_data_store(ctx, Rd, addr);
  1674. tcg_gen_addi_tl(addr, addr, 1); /* addr = addr + 1 */
  1675. gen_set_yaddr(addr);
  1676. tcg_temp_free_i32(addr);
  1677. return true;
  1678. }
  1679. static bool trans_STY3(DisasContext *ctx, arg_STY3 *a)
  1680. {
  1681. TCGv Rd = cpu_r[a->rd];
  1682. TCGv addr = gen_get_yaddr();
  1683. tcg_gen_subi_tl(addr, addr, 1); /* addr = addr - 1 */
  1684. gen_data_store(ctx, Rd, addr);
  1685. gen_set_yaddr(addr);
  1686. tcg_temp_free_i32(addr);
  1687. return true;
  1688. }
  1689. static bool trans_STDY(DisasContext *ctx, arg_STDY *a)
  1690. {
  1691. TCGv Rd = cpu_r[a->rd];
  1692. TCGv addr = gen_get_yaddr();
  1693. tcg_gen_addi_tl(addr, addr, a->imm); /* addr = addr + q */
  1694. gen_data_store(ctx, Rd, addr);
  1695. tcg_temp_free_i32(addr);
  1696. return true;
  1697. }
  1698. /*
  1699. * Stores one byte indirect with or without displacement from a register to data
  1700. * space. For parts with SRAM, the data space consists of the Register File, I/O
  1701. * memory, and internal SRAM (and external SRAM if applicable). For parts
  1702. * without SRAM, the data space consists of the Register File only. The EEPROM
  1703. * has a separate address space.
  1704. *
  1705. * The data location is pointed to by the Y (16 bits) Pointer Register in the
  1706. * Register File. Memory access is limited to the current data segment of 64KB.
  1707. * To access another data segment in devices with more than 64KB data space, the
  1708. * RAMPY in register in the I/O area has to be changed.
  1709. *
  1710. * The Y-pointer Register can either be left unchanged by the operation, or it
  1711. * can be post-incremented or pre-decremented. These features are especially
  1712. * suited for accessing arrays, tables, and Stack Pointer usage of the Y-pointer
  1713. * Register. Note that only the low byte of the Y-pointer is updated in devices
  1714. * with no more than 256 bytes data space. For such devices, the high byte of
  1715. * the pointer is not used by this instruction and can be used for other
  1716. * purposes. The RAMPY Register in the I/O area is updated in parts with more
  1717. * than 64KB data space or more than 64KB Program memory, and the increment /
  1718. * decrement / displacement is added to the entire 24-bit address on such
  1719. * devices.
  1720. */
  1721. static bool trans_STZ2(DisasContext *ctx, arg_STZ2 *a)
  1722. {
  1723. TCGv Rd = cpu_r[a->rd];
  1724. TCGv addr = gen_get_zaddr();
  1725. gen_data_store(ctx, Rd, addr);
  1726. tcg_gen_addi_tl(addr, addr, 1); /* addr = addr + 1 */
  1727. gen_set_zaddr(addr);
  1728. tcg_temp_free_i32(addr);
  1729. return true;
  1730. }
  1731. static bool trans_STZ3(DisasContext *ctx, arg_STZ3 *a)
  1732. {
  1733. TCGv Rd = cpu_r[a->rd];
  1734. TCGv addr = gen_get_zaddr();
  1735. tcg_gen_subi_tl(addr, addr, 1); /* addr = addr - 1 */
  1736. gen_data_store(ctx, Rd, addr);
  1737. gen_set_zaddr(addr);
  1738. tcg_temp_free_i32(addr);
  1739. return true;
  1740. }
  1741. static bool trans_STDZ(DisasContext *ctx, arg_STDZ *a)
  1742. {
  1743. TCGv Rd = cpu_r[a->rd];
  1744. TCGv addr = gen_get_zaddr();
  1745. tcg_gen_addi_tl(addr, addr, a->imm); /* addr = addr + q */
  1746. gen_data_store(ctx, Rd, addr);
  1747. tcg_temp_free_i32(addr);
  1748. return true;
  1749. }
  1750. /*
  1751. * Loads one byte pointed to by the Z-register into the destination
  1752. * register Rd. This instruction features a 100% space effective constant
  1753. * initialization or constant data fetch. The Program memory is organized in
  1754. * 16-bit words while the Z-pointer is a byte address. Thus, the least
  1755. * significant bit of the Z-pointer selects either low byte (ZLSB = 0) or high
  1756. * byte (ZLSB = 1). This instruction can address the first 64KB (32K words) of
  1757. * Program memory. The Zpointer Register can either be left unchanged by the
  1758. * operation, or it can be incremented. The incrementation does not apply to
  1759. * the RAMPZ Register.
  1760. *
  1761. * Devices with Self-Programming capability can use the LPM instruction to read
  1762. * the Fuse and Lock bit values.
  1763. */
  1764. static bool trans_LPM1(DisasContext *ctx, arg_LPM1 *a)
  1765. {
  1766. if (!avr_have_feature(ctx, AVR_FEATURE_LPM)) {
  1767. return true;
  1768. }
  1769. TCGv Rd = cpu_r[0];
  1770. TCGv addr = tcg_temp_new_i32();
  1771. TCGv H = cpu_r[31];
  1772. TCGv L = cpu_r[30];
  1773. tcg_gen_shli_tl(addr, H, 8); /* addr = H:L */
  1774. tcg_gen_or_tl(addr, addr, L);
  1775. tcg_gen_qemu_ld8u(Rd, addr, MMU_CODE_IDX); /* Rd = mem[addr] */
  1776. tcg_temp_free_i32(addr);
  1777. return true;
  1778. }
  1779. static bool trans_LPM2(DisasContext *ctx, arg_LPM2 *a)
  1780. {
  1781. if (!avr_have_feature(ctx, AVR_FEATURE_LPM)) {
  1782. return true;
  1783. }
  1784. TCGv Rd = cpu_r[a->rd];
  1785. TCGv addr = tcg_temp_new_i32();
  1786. TCGv H = cpu_r[31];
  1787. TCGv L = cpu_r[30];
  1788. tcg_gen_shli_tl(addr, H, 8); /* addr = H:L */
  1789. tcg_gen_or_tl(addr, addr, L);
  1790. tcg_gen_qemu_ld8u(Rd, addr, MMU_CODE_IDX); /* Rd = mem[addr] */
  1791. tcg_temp_free_i32(addr);
  1792. return true;
  1793. }
  1794. static bool trans_LPMX(DisasContext *ctx, arg_LPMX *a)
  1795. {
  1796. if (!avr_have_feature(ctx, AVR_FEATURE_LPMX)) {
  1797. return true;
  1798. }
  1799. TCGv Rd = cpu_r[a->rd];
  1800. TCGv addr = tcg_temp_new_i32();
  1801. TCGv H = cpu_r[31];
  1802. TCGv L = cpu_r[30];
  1803. tcg_gen_shli_tl(addr, H, 8); /* addr = H:L */
  1804. tcg_gen_or_tl(addr, addr, L);
  1805. tcg_gen_qemu_ld8u(Rd, addr, MMU_CODE_IDX); /* Rd = mem[addr] */
  1806. tcg_gen_addi_tl(addr, addr, 1); /* addr = addr + 1 */
  1807. tcg_gen_andi_tl(L, addr, 0xff);
  1808. tcg_gen_shri_tl(addr, addr, 8);
  1809. tcg_gen_andi_tl(H, addr, 0xff);
  1810. tcg_temp_free_i32(addr);
  1811. return true;
  1812. }
  1813. /*
  1814. * Loads one byte pointed to by the Z-register and the RAMPZ Register in
  1815. * the I/O space, and places this byte in the destination register Rd. This
  1816. * instruction features a 100% space effective constant initialization or
  1817. * constant data fetch. The Program memory is organized in 16-bit words while
  1818. * the Z-pointer is a byte address. Thus, the least significant bit of the
  1819. * Z-pointer selects either low byte (ZLSB = 0) or high byte (ZLSB = 1). This
  1820. * instruction can address the entire Program memory space. The Z-pointer
  1821. * Register can either be left unchanged by the operation, or it can be
  1822. * incremented. The incrementation applies to the entire 24-bit concatenation
  1823. * of the RAMPZ and Z-pointer Registers.
  1824. *
  1825. * Devices with Self-Programming capability can use the ELPM instruction to
  1826. * read the Fuse and Lock bit value.
  1827. */
  1828. static bool trans_ELPM1(DisasContext *ctx, arg_ELPM1 *a)
  1829. {
  1830. if (!avr_have_feature(ctx, AVR_FEATURE_ELPM)) {
  1831. return true;
  1832. }
  1833. TCGv Rd = cpu_r[0];
  1834. TCGv addr = gen_get_zaddr();
  1835. tcg_gen_qemu_ld8u(Rd, addr, MMU_CODE_IDX); /* Rd = mem[addr] */
  1836. tcg_temp_free_i32(addr);
  1837. return true;
  1838. }
  1839. static bool trans_ELPM2(DisasContext *ctx, arg_ELPM2 *a)
  1840. {
  1841. if (!avr_have_feature(ctx, AVR_FEATURE_ELPM)) {
  1842. return true;
  1843. }
  1844. TCGv Rd = cpu_r[a->rd];
  1845. TCGv addr = gen_get_zaddr();
  1846. tcg_gen_qemu_ld8u(Rd, addr, MMU_CODE_IDX); /* Rd = mem[addr] */
  1847. tcg_temp_free_i32(addr);
  1848. return true;
  1849. }
  1850. static bool trans_ELPMX(DisasContext *ctx, arg_ELPMX *a)
  1851. {
  1852. if (!avr_have_feature(ctx, AVR_FEATURE_ELPMX)) {
  1853. return true;
  1854. }
  1855. TCGv Rd = cpu_r[a->rd];
  1856. TCGv addr = gen_get_zaddr();
  1857. tcg_gen_qemu_ld8u(Rd, addr, MMU_CODE_IDX); /* Rd = mem[addr] */
  1858. tcg_gen_addi_tl(addr, addr, 1); /* addr = addr + 1 */
  1859. gen_set_zaddr(addr);
  1860. tcg_temp_free_i32(addr);
  1861. return true;
  1862. }
  1863. /*
  1864. * SPM can be used to erase a page in the Program memory, to write a page
  1865. * in the Program memory (that is already erased), and to set Boot Loader Lock
  1866. * bits. In some devices, the Program memory can be written one word at a time,
  1867. * in other devices an entire page can be programmed simultaneously after first
  1868. * filling a temporary page buffer. In all cases, the Program memory must be
  1869. * erased one page at a time. When erasing the Program memory, the RAMPZ and
  1870. * Z-register are used as page address. When writing the Program memory, the
  1871. * RAMPZ and Z-register are used as page or word address, and the R1:R0
  1872. * register pair is used as data(1). When setting the Boot Loader Lock bits,
  1873. * the R1:R0 register pair is used as data. Refer to the device documentation
  1874. * for detailed description of SPM usage. This instruction can address the
  1875. * entire Program memory.
  1876. *
  1877. * The SPM instruction is not available in all devices. Refer to the device
  1878. * specific instruction set summary.
  1879. *
  1880. * Note: 1. R1 determines the instruction high byte, and R0 determines the
  1881. * instruction low byte.
  1882. */
  1883. static bool trans_SPM(DisasContext *ctx, arg_SPM *a)
  1884. {
  1885. /* TODO */
  1886. if (!avr_have_feature(ctx, AVR_FEATURE_SPM)) {
  1887. return true;
  1888. }
  1889. return true;
  1890. }
  1891. static bool trans_SPMX(DisasContext *ctx, arg_SPMX *a)
  1892. {
  1893. /* TODO */
  1894. if (!avr_have_feature(ctx, AVR_FEATURE_SPMX)) {
  1895. return true;
  1896. }
  1897. return true;
  1898. }
  1899. /*
  1900. * Loads data from the I/O Space (Ports, Timers, Configuration Registers,
  1901. * etc.) into register Rd in the Register File.
  1902. */
  1903. static bool trans_IN(DisasContext *ctx, arg_IN *a)
  1904. {
  1905. TCGv Rd = cpu_r[a->rd];
  1906. TCGv port = tcg_const_i32(a->imm);
  1907. gen_helper_inb(Rd, cpu_env, port);
  1908. tcg_temp_free_i32(port);
  1909. return true;
  1910. }
  1911. /*
  1912. * Stores data from register Rr in the Register File to I/O Space (Ports,
  1913. * Timers, Configuration Registers, etc.).
  1914. */
  1915. static bool trans_OUT(DisasContext *ctx, arg_OUT *a)
  1916. {
  1917. TCGv Rd = cpu_r[a->rd];
  1918. TCGv port = tcg_const_i32(a->imm);
  1919. gen_helper_outb(cpu_env, port, Rd);
  1920. tcg_temp_free_i32(port);
  1921. return true;
  1922. }
  1923. /*
  1924. * This instruction stores the contents of register Rr on the STACK. The
  1925. * Stack Pointer is post-decremented by 1 after the PUSH. This instruction is
  1926. * not available in all devices. Refer to the device specific instruction set
  1927. * summary.
  1928. */
  1929. static bool trans_PUSH(DisasContext *ctx, arg_PUSH *a)
  1930. {
  1931. TCGv Rd = cpu_r[a->rd];
  1932. gen_data_store(ctx, Rd, cpu_sp);
  1933. tcg_gen_subi_tl(cpu_sp, cpu_sp, 1);
  1934. return true;
  1935. }
  1936. /*
  1937. * This instruction loads register Rd with a byte from the STACK. The Stack
  1938. * Pointer is pre-incremented by 1 before the POP. This instruction is not
  1939. * available in all devices. Refer to the device specific instruction set
  1940. * summary.
  1941. */
  1942. static bool trans_POP(DisasContext *ctx, arg_POP *a)
  1943. {
  1944. /*
  1945. * Using a temp to work around some strange behaviour:
  1946. * tcg_gen_addi_tl(cpu_sp, cpu_sp, 1);
  1947. * gen_data_load(ctx, Rd, cpu_sp);
  1948. * seems to cause the add to happen twice.
  1949. * This doesn't happen if either the add or the load is removed.
  1950. */
  1951. TCGv t1 = tcg_temp_new_i32();
  1952. TCGv Rd = cpu_r[a->rd];
  1953. tcg_gen_addi_tl(t1, cpu_sp, 1);
  1954. gen_data_load(ctx, Rd, t1);
  1955. tcg_gen_mov_tl(cpu_sp, t1);
  1956. return true;
  1957. }
  1958. /*
  1959. * Exchanges one byte indirect between register and data space. The data
  1960. * location is pointed to by the Z (16 bits) Pointer Register in the Register
  1961. * File. Memory access is limited to the current data segment of 64KB. To
  1962. * access another data segment in devices with more than 64KB data space, the
  1963. * RAMPZ in register in the I/O area has to be changed.
  1964. *
  1965. * The Z-pointer Register is left unchanged by the operation. This instruction
  1966. * is especially suited for writing/reading status bits stored in SRAM.
  1967. */
  1968. static bool trans_XCH(DisasContext *ctx, arg_XCH *a)
  1969. {
  1970. if (!avr_have_feature(ctx, AVR_FEATURE_RMW)) {
  1971. return true;
  1972. }
  1973. TCGv Rd = cpu_r[a->rd];
  1974. TCGv t0 = tcg_temp_new_i32();
  1975. TCGv addr = gen_get_zaddr();
  1976. gen_data_load(ctx, t0, addr);
  1977. gen_data_store(ctx, Rd, addr);
  1978. tcg_gen_mov_tl(Rd, t0);
  1979. tcg_temp_free_i32(t0);
  1980. tcg_temp_free_i32(addr);
  1981. return true;
  1982. }
  1983. /*
  1984. * Load one byte indirect from data space to register and set bits in data
  1985. * space specified by the register. The instruction can only be used towards
  1986. * internal SRAM. The data location is pointed to by the Z (16 bits) Pointer
  1987. * Register in the Register File. Memory access is limited to the current data
  1988. * segment of 64KB. To access another data segment in devices with more than
  1989. * 64KB data space, the RAMPZ in register in the I/O area has to be changed.
  1990. *
  1991. * The Z-pointer Register is left unchanged by the operation. This instruction
  1992. * is especially suited for setting status bits stored in SRAM.
  1993. */
  1994. static bool trans_LAS(DisasContext *ctx, arg_LAS *a)
  1995. {
  1996. if (!avr_have_feature(ctx, AVR_FEATURE_RMW)) {
  1997. return true;
  1998. }
  1999. TCGv Rr = cpu_r[a->rd];
  2000. TCGv addr = gen_get_zaddr();
  2001. TCGv t0 = tcg_temp_new_i32();
  2002. TCGv t1 = tcg_temp_new_i32();
  2003. gen_data_load(ctx, t0, addr); /* t0 = mem[addr] */
  2004. tcg_gen_or_tl(t1, t0, Rr);
  2005. tcg_gen_mov_tl(Rr, t0); /* Rr = t0 */
  2006. gen_data_store(ctx, t1, addr); /* mem[addr] = t1 */
  2007. tcg_temp_free_i32(t1);
  2008. tcg_temp_free_i32(t0);
  2009. tcg_temp_free_i32(addr);
  2010. return true;
  2011. }
  2012. /*
  2013. * Load one byte indirect from data space to register and stores and clear
  2014. * the bits in data space specified by the register. The instruction can
  2015. * only be used towards internal SRAM. The data location is pointed to by
  2016. * the Z (16 bits) Pointer Register in the Register File. Memory access is
  2017. * limited to the current data segment of 64KB. To access another data
  2018. * segment in devices with more than 64KB data space, the RAMPZ in register
  2019. * in the I/O area has to be changed.
  2020. *
  2021. * The Z-pointer Register is left unchanged by the operation. This instruction
  2022. * is especially suited for clearing status bits stored in SRAM.
  2023. */
  2024. static bool trans_LAC(DisasContext *ctx, arg_LAC *a)
  2025. {
  2026. if (!avr_have_feature(ctx, AVR_FEATURE_RMW)) {
  2027. return true;
  2028. }
  2029. TCGv Rr = cpu_r[a->rd];
  2030. TCGv addr = gen_get_zaddr();
  2031. TCGv t0 = tcg_temp_new_i32();
  2032. TCGv t1 = tcg_temp_new_i32();
  2033. gen_data_load(ctx, t0, addr); /* t0 = mem[addr] */
  2034. tcg_gen_andc_tl(t1, t0, Rr); /* t1 = t0 & (0xff - Rr) = t0 & ~Rr */
  2035. tcg_gen_mov_tl(Rr, t0); /* Rr = t0 */
  2036. gen_data_store(ctx, t1, addr); /* mem[addr] = t1 */
  2037. tcg_temp_free_i32(t1);
  2038. tcg_temp_free_i32(t0);
  2039. tcg_temp_free_i32(addr);
  2040. return true;
  2041. }
  2042. /*
  2043. * Load one byte indirect from data space to register and toggles bits in
  2044. * the data space specified by the register. The instruction can only be used
  2045. * towards SRAM. The data location is pointed to by the Z (16 bits) Pointer
  2046. * Register in the Register File. Memory access is limited to the current data
  2047. * segment of 64KB. To access another data segment in devices with more than
  2048. * 64KB data space, the RAMPZ in register in the I/O area has to be changed.
  2049. *
  2050. * The Z-pointer Register is left unchanged by the operation. This instruction
  2051. * is especially suited for changing status bits stored in SRAM.
  2052. */
  2053. static bool trans_LAT(DisasContext *ctx, arg_LAT *a)
  2054. {
  2055. if (!avr_have_feature(ctx, AVR_FEATURE_RMW)) {
  2056. return true;
  2057. }
  2058. TCGv Rd = cpu_r[a->rd];
  2059. TCGv addr = gen_get_zaddr();
  2060. TCGv t0 = tcg_temp_new_i32();
  2061. TCGv t1 = tcg_temp_new_i32();
  2062. gen_data_load(ctx, t0, addr); /* t0 = mem[addr] */
  2063. tcg_gen_xor_tl(t1, t0, Rd);
  2064. tcg_gen_mov_tl(Rd, t0); /* Rd = t0 */
  2065. gen_data_store(ctx, t1, addr); /* mem[addr] = t1 */
  2066. tcg_temp_free_i32(t1);
  2067. tcg_temp_free_i32(t0);
  2068. tcg_temp_free_i32(addr);
  2069. return true;
  2070. }
  2071. /*
  2072. * Bit and Bit-test Instructions
  2073. */
  2074. static void gen_rshift_ZNVSf(TCGv R)
  2075. {
  2076. tcg_gen_setcondi_tl(TCG_COND_EQ, cpu_Zf, R, 0); /* Zf = R == 0 */
  2077. tcg_gen_shri_tl(cpu_Nf, R, 7); /* Nf = R(7) */
  2078. tcg_gen_xor_tl(cpu_Vf, cpu_Nf, cpu_Cf);
  2079. tcg_gen_xor_tl(cpu_Sf, cpu_Nf, cpu_Vf); /* Sf = Nf ^ Vf */
  2080. }
  2081. /*
  2082. * Shifts all bits in Rd one place to the right. Bit 7 is cleared. Bit 0 is
  2083. * loaded into the C Flag of the SREG. This operation effectively divides an
  2084. * unsigned value by two. The C Flag can be used to round the result.
  2085. */
  2086. static bool trans_LSR(DisasContext *ctx, arg_LSR *a)
  2087. {
  2088. TCGv Rd = cpu_r[a->rd];
  2089. tcg_gen_andi_tl(cpu_Cf, Rd, 1);
  2090. tcg_gen_shri_tl(Rd, Rd, 1);
  2091. /* update status register */
  2092. tcg_gen_setcondi_tl(TCG_COND_EQ, cpu_Zf, Rd, 0); /* Zf = Rd == 0 */
  2093. tcg_gen_movi_tl(cpu_Nf, 0);
  2094. tcg_gen_mov_tl(cpu_Vf, cpu_Cf);
  2095. tcg_gen_mov_tl(cpu_Sf, cpu_Vf);
  2096. return true;
  2097. }
  2098. /*
  2099. * Shifts all bits in Rd one place to the right. The C Flag is shifted into
  2100. * bit 7 of Rd. Bit 0 is shifted into the C Flag. This operation, combined
  2101. * with ASR, effectively divides multi-byte signed values by two. Combined with
  2102. * LSR it effectively divides multi-byte unsigned values by two. The Carry Flag
  2103. * can be used to round the result.
  2104. */
  2105. static bool trans_ROR(DisasContext *ctx, arg_ROR *a)
  2106. {
  2107. TCGv Rd = cpu_r[a->rd];
  2108. TCGv t0 = tcg_temp_new_i32();
  2109. tcg_gen_shli_tl(t0, cpu_Cf, 7);
  2110. /* update status register */
  2111. tcg_gen_andi_tl(cpu_Cf, Rd, 1);
  2112. /* update output register */
  2113. tcg_gen_shri_tl(Rd, Rd, 1);
  2114. tcg_gen_or_tl(Rd, Rd, t0);
  2115. /* update status register */
  2116. gen_rshift_ZNVSf(Rd);
  2117. tcg_temp_free_i32(t0);
  2118. return true;
  2119. }
  2120. /*
  2121. * Shifts all bits in Rd one place to the right. Bit 7 is held constant. Bit 0
  2122. * is loaded into the C Flag of the SREG. This operation effectively divides a
  2123. * signed value by two without changing its sign. The Carry Flag can be used to
  2124. * round the result.
  2125. */
  2126. static bool trans_ASR(DisasContext *ctx, arg_ASR *a)
  2127. {
  2128. TCGv Rd = cpu_r[a->rd];
  2129. TCGv t0 = tcg_temp_new_i32();
  2130. /* update status register */
  2131. tcg_gen_andi_tl(cpu_Cf, Rd, 1); /* Cf = Rd(0) */
  2132. /* update output register */
  2133. tcg_gen_andi_tl(t0, Rd, 0x80); /* Rd = (Rd & 0x80) | (Rd >> 1) */
  2134. tcg_gen_shri_tl(Rd, Rd, 1);
  2135. tcg_gen_or_tl(Rd, Rd, t0);
  2136. /* update status register */
  2137. gen_rshift_ZNVSf(Rd);
  2138. tcg_temp_free_i32(t0);
  2139. return true;
  2140. }
  2141. /*
  2142. * Swaps high and low nibbles in a register.
  2143. */
  2144. static bool trans_SWAP(DisasContext *ctx, arg_SWAP *a)
  2145. {
  2146. TCGv Rd = cpu_r[a->rd];
  2147. TCGv t0 = tcg_temp_new_i32();
  2148. TCGv t1 = tcg_temp_new_i32();
  2149. tcg_gen_andi_tl(t0, Rd, 0x0f);
  2150. tcg_gen_shli_tl(t0, t0, 4);
  2151. tcg_gen_andi_tl(t1, Rd, 0xf0);
  2152. tcg_gen_shri_tl(t1, t1, 4);
  2153. tcg_gen_or_tl(Rd, t0, t1);
  2154. tcg_temp_free_i32(t1);
  2155. tcg_temp_free_i32(t0);
  2156. return true;
  2157. }
  2158. /*
  2159. * Sets a specified bit in an I/O Register. This instruction operates on
  2160. * the lower 32 I/O Registers -- addresses 0-31.
  2161. */
  2162. static bool trans_SBI(DisasContext *ctx, arg_SBI *a)
  2163. {
  2164. TCGv data = tcg_temp_new_i32();
  2165. TCGv port = tcg_const_i32(a->reg);
  2166. gen_helper_inb(data, cpu_env, port);
  2167. tcg_gen_ori_tl(data, data, 1 << a->bit);
  2168. gen_helper_outb(cpu_env, port, data);
  2169. tcg_temp_free_i32(port);
  2170. tcg_temp_free_i32(data);
  2171. return true;
  2172. }
  2173. /*
  2174. * Clears a specified bit in an I/O Register. This instruction operates on
  2175. * the lower 32 I/O Registers -- addresses 0-31.
  2176. */
  2177. static bool trans_CBI(DisasContext *ctx, arg_CBI *a)
  2178. {
  2179. TCGv data = tcg_temp_new_i32();
  2180. TCGv port = tcg_const_i32(a->reg);
  2181. gen_helper_inb(data, cpu_env, port);
  2182. tcg_gen_andi_tl(data, data, ~(1 << a->bit));
  2183. gen_helper_outb(cpu_env, port, data);
  2184. tcg_temp_free_i32(data);
  2185. tcg_temp_free_i32(port);
  2186. return true;
  2187. }
  2188. /*
  2189. * Stores bit b from Rd to the T Flag in SREG (Status Register).
  2190. */
  2191. static bool trans_BST(DisasContext *ctx, arg_BST *a)
  2192. {
  2193. TCGv Rd = cpu_r[a->rd];
  2194. tcg_gen_andi_tl(cpu_Tf, Rd, 1 << a->bit);
  2195. tcg_gen_shri_tl(cpu_Tf, cpu_Tf, a->bit);
  2196. return true;
  2197. }
  2198. /*
  2199. * Copies the T Flag in the SREG (Status Register) to bit b in register Rd.
  2200. */
  2201. static bool trans_BLD(DisasContext *ctx, arg_BLD *a)
  2202. {
  2203. TCGv Rd = cpu_r[a->rd];
  2204. TCGv t1 = tcg_temp_new_i32();
  2205. tcg_gen_andi_tl(Rd, Rd, ~(1u << a->bit)); /* clear bit */
  2206. tcg_gen_shli_tl(t1, cpu_Tf, a->bit); /* create mask */
  2207. tcg_gen_or_tl(Rd, Rd, t1);
  2208. tcg_temp_free_i32(t1);
  2209. return true;
  2210. }
  2211. /*
  2212. * Sets a single Flag or bit in SREG.
  2213. */
  2214. static bool trans_BSET(DisasContext *ctx, arg_BSET *a)
  2215. {
  2216. switch (a->bit) {
  2217. case 0x00:
  2218. tcg_gen_movi_tl(cpu_Cf, 0x01);
  2219. break;
  2220. case 0x01:
  2221. tcg_gen_movi_tl(cpu_Zf, 0x01);
  2222. break;
  2223. case 0x02:
  2224. tcg_gen_movi_tl(cpu_Nf, 0x01);
  2225. break;
  2226. case 0x03:
  2227. tcg_gen_movi_tl(cpu_Vf, 0x01);
  2228. break;
  2229. case 0x04:
  2230. tcg_gen_movi_tl(cpu_Sf, 0x01);
  2231. break;
  2232. case 0x05:
  2233. tcg_gen_movi_tl(cpu_Hf, 0x01);
  2234. break;
  2235. case 0x06:
  2236. tcg_gen_movi_tl(cpu_Tf, 0x01);
  2237. break;
  2238. case 0x07:
  2239. tcg_gen_movi_tl(cpu_If, 0x01);
  2240. break;
  2241. }
  2242. return true;
  2243. }
  2244. /*
  2245. * Clears a single Flag in SREG.
  2246. */
  2247. static bool trans_BCLR(DisasContext *ctx, arg_BCLR *a)
  2248. {
  2249. switch (a->bit) {
  2250. case 0x00:
  2251. tcg_gen_movi_tl(cpu_Cf, 0x00);
  2252. break;
  2253. case 0x01:
  2254. tcg_gen_movi_tl(cpu_Zf, 0x00);
  2255. break;
  2256. case 0x02:
  2257. tcg_gen_movi_tl(cpu_Nf, 0x00);
  2258. break;
  2259. case 0x03:
  2260. tcg_gen_movi_tl(cpu_Vf, 0x00);
  2261. break;
  2262. case 0x04:
  2263. tcg_gen_movi_tl(cpu_Sf, 0x00);
  2264. break;
  2265. case 0x05:
  2266. tcg_gen_movi_tl(cpu_Hf, 0x00);
  2267. break;
  2268. case 0x06:
  2269. tcg_gen_movi_tl(cpu_Tf, 0x00);
  2270. break;
  2271. case 0x07:
  2272. tcg_gen_movi_tl(cpu_If, 0x00);
  2273. break;
  2274. }
  2275. return true;
  2276. }
  2277. /*
  2278. * MCU Control Instructions
  2279. */
  2280. /*
  2281. * The BREAK instruction is used by the On-chip Debug system, and is
  2282. * normally not used in the application software. When the BREAK instruction is
  2283. * executed, the AVR CPU is set in the Stopped Mode. This gives the On-chip
  2284. * Debugger access to internal resources. If any Lock bits are set, or either
  2285. * the JTAGEN or OCDEN Fuses are unprogrammed, the CPU will treat the BREAK
  2286. * instruction as a NOP and will not enter the Stopped mode. This instruction
  2287. * is not available in all devices. Refer to the device specific instruction
  2288. * set summary.
  2289. */
  2290. static bool trans_BREAK(DisasContext *ctx, arg_BREAK *a)
  2291. {
  2292. if (!avr_have_feature(ctx, AVR_FEATURE_BREAK)) {
  2293. return true;
  2294. }
  2295. #ifdef BREAKPOINT_ON_BREAK
  2296. tcg_gen_movi_tl(cpu_pc, ctx->npc - 1);
  2297. gen_helper_debug(cpu_env);
  2298. ctx->bstate = DISAS_EXIT;
  2299. #else
  2300. /* NOP */
  2301. #endif
  2302. return true;
  2303. }
  2304. /*
  2305. * This instruction performs a single cycle No Operation.
  2306. */
  2307. static bool trans_NOP(DisasContext *ctx, arg_NOP *a)
  2308. {
  2309. /* NOP */
  2310. return true;
  2311. }
  2312. /*
  2313. * This instruction sets the circuit in sleep mode defined by the MCU
  2314. * Control Register.
  2315. */
  2316. static bool trans_SLEEP(DisasContext *ctx, arg_SLEEP *a)
  2317. {
  2318. gen_helper_sleep(cpu_env);
  2319. ctx->bstate = DISAS_NORETURN;
  2320. return true;
  2321. }
  2322. /*
  2323. * This instruction resets the Watchdog Timer. This instruction must be
  2324. * executed within a limited time given by the WD prescaler. See the Watchdog
  2325. * Timer hardware specification.
  2326. */
  2327. static bool trans_WDR(DisasContext *ctx, arg_WDR *a)
  2328. {
  2329. gen_helper_wdr(cpu_env);
  2330. return true;
  2331. }
  2332. /*
  2333. * Core translation mechanism functions:
  2334. *
  2335. * - translate()
  2336. * - canonicalize_skip()
  2337. * - gen_intermediate_code()
  2338. * - restore_state_to_opc()
  2339. *
  2340. */
  2341. static void translate(DisasContext *ctx)
  2342. {
  2343. uint32_t opcode = next_word(ctx);
  2344. if (!decode_insn(ctx, opcode)) {
  2345. gen_helper_unsupported(cpu_env);
  2346. ctx->bstate = DISAS_NORETURN;
  2347. }
  2348. }
  2349. /* Standardize the cpu_skip condition to NE. */
  2350. static bool canonicalize_skip(DisasContext *ctx)
  2351. {
  2352. switch (ctx->skip_cond) {
  2353. case TCG_COND_NEVER:
  2354. /* Normal case: cpu_skip is known to be false. */
  2355. return false;
  2356. case TCG_COND_ALWAYS:
  2357. /*
  2358. * Breakpoint case: cpu_skip is known to be true, via TB_FLAGS_SKIP.
  2359. * The breakpoint is on the instruction being skipped, at the start
  2360. * of the TranslationBlock. No need to update.
  2361. */
  2362. return false;
  2363. case TCG_COND_NE:
  2364. if (ctx->skip_var1 == NULL) {
  2365. tcg_gen_mov_tl(cpu_skip, ctx->skip_var0);
  2366. } else {
  2367. tcg_gen_xor_tl(cpu_skip, ctx->skip_var0, ctx->skip_var1);
  2368. ctx->skip_var1 = NULL;
  2369. }
  2370. break;
  2371. default:
  2372. /* Convert to a NE condition vs 0. */
  2373. if (ctx->skip_var1 == NULL) {
  2374. tcg_gen_setcondi_tl(ctx->skip_cond, cpu_skip, ctx->skip_var0, 0);
  2375. } else {
  2376. tcg_gen_setcond_tl(ctx->skip_cond, cpu_skip,
  2377. ctx->skip_var0, ctx->skip_var1);
  2378. ctx->skip_var1 = NULL;
  2379. }
  2380. ctx->skip_cond = TCG_COND_NE;
  2381. break;
  2382. }
  2383. if (ctx->free_skip_var0) {
  2384. tcg_temp_free(ctx->skip_var0);
  2385. ctx->free_skip_var0 = false;
  2386. }
  2387. ctx->skip_var0 = cpu_skip;
  2388. return true;
  2389. }
  2390. void gen_intermediate_code(CPUState *cs, TranslationBlock *tb, int max_insns)
  2391. {
  2392. CPUAVRState *env = cs->env_ptr;
  2393. DisasContext ctx = {
  2394. .tb = tb,
  2395. .cs = cs,
  2396. .env = env,
  2397. .memidx = 0,
  2398. .bstate = DISAS_NEXT,
  2399. .skip_cond = TCG_COND_NEVER,
  2400. .singlestep = cs->singlestep_enabled,
  2401. };
  2402. target_ulong pc_start = tb->pc / 2;
  2403. int num_insns = 0;
  2404. if (tb->flags & TB_FLAGS_FULL_ACCESS) {
  2405. /*
  2406. * This flag is set by ST/LD instruction we will regenerate it ONLY
  2407. * with mem/cpu memory access instead of mem access
  2408. */
  2409. max_insns = 1;
  2410. }
  2411. if (ctx.singlestep) {
  2412. max_insns = 1;
  2413. }
  2414. gen_tb_start(tb);
  2415. ctx.npc = pc_start;
  2416. if (tb->flags & TB_FLAGS_SKIP) {
  2417. ctx.skip_cond = TCG_COND_ALWAYS;
  2418. ctx.skip_var0 = cpu_skip;
  2419. }
  2420. do {
  2421. TCGLabel *skip_label = NULL;
  2422. /* translate current instruction */
  2423. tcg_gen_insn_start(ctx.npc);
  2424. num_insns++;
  2425. /*
  2426. * this is due to some strange GDB behavior
  2427. * let's assume main has address 0x100
  2428. * b main - sets breakpoint at address 0x00000100 (code)
  2429. * b *0x100 - sets breakpoint at address 0x00800100 (data)
  2430. */
  2431. if (unlikely(!ctx.singlestep &&
  2432. (cpu_breakpoint_test(cs, OFFSET_CODE + ctx.npc * 2, BP_ANY) ||
  2433. cpu_breakpoint_test(cs, OFFSET_DATA + ctx.npc * 2, BP_ANY)))) {
  2434. canonicalize_skip(&ctx);
  2435. tcg_gen_movi_tl(cpu_pc, ctx.npc);
  2436. gen_helper_debug(cpu_env);
  2437. goto done_generating;
  2438. }
  2439. /* Conditionally skip the next instruction, if indicated. */
  2440. if (ctx.skip_cond != TCG_COND_NEVER) {
  2441. skip_label = gen_new_label();
  2442. if (ctx.skip_var0 == cpu_skip) {
  2443. /*
  2444. * Copy cpu_skip so that we may zero it before the branch.
  2445. * This ensures that cpu_skip is non-zero after the label
  2446. * if and only if the skipped insn itself sets a skip.
  2447. */
  2448. ctx.free_skip_var0 = true;
  2449. ctx.skip_var0 = tcg_temp_new();
  2450. tcg_gen_mov_tl(ctx.skip_var0, cpu_skip);
  2451. tcg_gen_movi_tl(cpu_skip, 0);
  2452. }
  2453. if (ctx.skip_var1 == NULL) {
  2454. tcg_gen_brcondi_tl(ctx.skip_cond, ctx.skip_var0, 0, skip_label);
  2455. } else {
  2456. tcg_gen_brcond_tl(ctx.skip_cond, ctx.skip_var0,
  2457. ctx.skip_var1, skip_label);
  2458. ctx.skip_var1 = NULL;
  2459. }
  2460. if (ctx.free_skip_var0) {
  2461. tcg_temp_free(ctx.skip_var0);
  2462. ctx.free_skip_var0 = false;
  2463. }
  2464. ctx.skip_cond = TCG_COND_NEVER;
  2465. ctx.skip_var0 = NULL;
  2466. }
  2467. translate(&ctx);
  2468. if (skip_label) {
  2469. canonicalize_skip(&ctx);
  2470. gen_set_label(skip_label);
  2471. if (ctx.bstate == DISAS_NORETURN) {
  2472. ctx.bstate = DISAS_CHAIN;
  2473. }
  2474. }
  2475. } while (ctx.bstate == DISAS_NEXT
  2476. && num_insns < max_insns
  2477. && (ctx.npc - pc_start) * 2 < TARGET_PAGE_SIZE - 4
  2478. && !tcg_op_buf_full());
  2479. if (tb->cflags & CF_LAST_IO) {
  2480. gen_io_end();
  2481. }
  2482. bool nonconst_skip = canonicalize_skip(&ctx);
  2483. switch (ctx.bstate) {
  2484. case DISAS_NORETURN:
  2485. assert(!nonconst_skip);
  2486. break;
  2487. case DISAS_NEXT:
  2488. case DISAS_TOO_MANY:
  2489. case DISAS_CHAIN:
  2490. if (!nonconst_skip) {
  2491. /* Note gen_goto_tb checks singlestep. */
  2492. gen_goto_tb(&ctx, 1, ctx.npc);
  2493. break;
  2494. }
  2495. tcg_gen_movi_tl(cpu_pc, ctx.npc);
  2496. /* fall through */
  2497. case DISAS_LOOKUP:
  2498. if (!ctx.singlestep) {
  2499. tcg_gen_lookup_and_goto_ptr();
  2500. break;
  2501. }
  2502. /* fall through */
  2503. case DISAS_EXIT:
  2504. if (ctx.singlestep) {
  2505. gen_helper_debug(cpu_env);
  2506. } else {
  2507. tcg_gen_exit_tb(NULL, 0);
  2508. }
  2509. break;
  2510. default:
  2511. g_assert_not_reached();
  2512. }
  2513. done_generating:
  2514. gen_tb_end(tb, num_insns);
  2515. tb->size = (ctx.npc - pc_start) * 2;
  2516. tb->icount = num_insns;
  2517. #ifdef DEBUG_DISAS
  2518. if (qemu_loglevel_mask(CPU_LOG_TB_IN_ASM)
  2519. && qemu_log_in_addr_range(tb->pc)) {
  2520. FILE *fd;
  2521. fd = qemu_log_lock();
  2522. qemu_log("IN: %s\n", lookup_symbol(tb->pc));
  2523. log_target_disas(cs, tb->pc, tb->size);
  2524. qemu_log("\n");
  2525. qemu_log_unlock(fd);
  2526. }
  2527. #endif
  2528. }
  2529. void restore_state_to_opc(CPUAVRState *env, TranslationBlock *tb,
  2530. target_ulong *data)
  2531. {
  2532. env->pc_w = data[0];
  2533. }