epiphany.cpu 79 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250225122522253225422552256225722582259226022612262226322642265226622672268226922702271227222732274227522762277227822792280228122822283228422852286228722882289229022912292229322942295229622972298229923002301230223032304230523062307230823092310231123122313231423152316231723182319232023212322232323242325232623272328232923302331233223332334233523362337233823392340234123422343234423452346234723482349235023512352235323542355235623572358235923602361236223632364236523662367236823692370237123722373237423752376237723782379238023812382238323842385238623872388238923902391239223932394239523962397239823992400240124022403240424052406240724082409241024112412241324142415241624172418241924202421242224232424242524262427242824292430243124322433243424352436243724382439244024412442244324442445244624472448244924502451245224532454245524562457245824592460246124622463246424652466246724682469247024712472247324742475247624772478247924802481248224832484248524862487248824892490249124922493249424952496249724982499250025012502250325042505250625072508250925102511251225132514251525162517251825192520252125222523252425252526252725282529253025312532253325342535253625372538253925402541254225432544254525462547254825492550255125522553255425552556255725582559256025612562256325642565256625672568256925702571257225732574257525762577257825792580258125822583258425852586258725882589259025912592259325942595259625972598259926002601260226032604260526062607260826092610261126122613261426152616261726182619262026212622262326242625262626272628262926302631263226332634263526362637263826392640264126422643264426452646264726482649265026512652265326542655265626572658265926602661266226632664266526662667266826692670267126722673267426752676267726782679268026812682268326842685268626872688268926902691269226932694269526962697269826992700270127022703270427052706270727082709271027112712271327142715271627172718271927202721272227232724272527262727272827292730273127322733273427352736273727382739274027412742274327442745274627472748274927502751275227532754275527562757275827592760276127622763276427652766276727682769277027712772277327742775277627772778277927802781278227832784278527862787278827892790279127922793279427952796279727982799280028012802280328042805280628072808280928102811281228132814281528162817281828192820282128222823282428252826282728282829283028312832283328342835283628372838283928402841284228432844284528462847284828492850285128522853285428552856285728582859286028612862286328642865286628672868286928702871287228732874287528762877287828792880288128822883288428852886288728882889289028912892289328942895289628972898289929002901290229032904290529062907290829092910291129122913291429152916291729182919292029212922292329242925292629272928292929302931293229332934293529362937
  1. ; Adapteva EPIPHANY CPU description. -*- Scheme -*-
  2. ; Copyright 1998, 1999, 2000, 2001, 2003, 2006, 2007, 2008, 2009, 2010, 2011
  3. ; Free Software Foundation, Inc.
  4. ;
  5. ; Contributed by Embecosm on behalf of Adapteva, Inc.
  6. ; This file is part of the GNU Binutils and of GDB.
  7. ;
  8. ; This program is free software; you can redistribute it and/or modify
  9. ; it under the terms of the GNU General Public License as published by
  10. ; the Free Software Foundation; either version 3 of the License, or
  11. ; (at your option) any later version.
  12. ;
  13. ; This program is distributed in the hope that it will be useful,
  14. ; but WITHOUT ANY WARRANTY; without even the implied warranty of
  15. ; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  16. ; GNU General Public License for more details.
  17. ;
  18. ; You should have received a copy of the GNU General Public License
  19. ; along with this program; if not, write to the Free Software
  20. ; Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
  21. ; MA 02110-1301, USA.
  22. (include "simplify.inc")
  23. ; define-arch must appear first
  24. (define-arch
  25. (name epiphany) ; name of cpu family
  26. (comment "Adapteva, Inc. EPIPHANY family")
  27. (default-alignment aligned)
  28. (insn-lsb0? #t)
  29. ; - a 16/32 bit instruction machine (the default)
  30. (machs epiphany32)
  31. (isas epiphany)
  32. )
  33. ; Attributes.
  34. (define-attr
  35. (for insn)
  36. (type boolean)
  37. (name SHORT-INSN)
  38. (comment "instruction is a 16 bit form")
  39. )
  40. ;; 3 bit add/sub immediate forms - useful for relaxing into 11 bit form
  41. (define-attr
  42. (for insn)
  43. (type boolean)
  44. (name IMM3)
  45. (comment "instruction has a 3 bit immediate form")
  46. )
  47. ;; 8 bit mov immediate forms - useful for relaxing into 16 bit form
  48. (define-attr
  49. (for insn)
  50. (type boolean)
  51. (name IMM8)
  52. (comment "instruction has a 8 bit immediate form")
  53. )
  54. ; Instruction set parameters.
  55. (define-isa
  56. (name epiphany)
  57. (comment "Adapteva, Inc. EPIPHANY32 ISA")
  58. (default-insn-word-bitsize 32)
  59. (default-insn-bitsize 32)
  60. (base-insn-bitsize 32)
  61. (decode-assist (3 2 1 0)) ; CGEN can figure this out
  62. (liw-insns 1) ; # instructions fetched at once
  63. )
  64. ; Cpu family definitions.
  65. (define-cpu
  66. ; cpu names must be distinct from the architecture name and machine names.
  67. (name epiphanybf)
  68. (comment "Adapteva, Inc. EPIPHANY Family")
  69. (endian little)
  70. (word-bitsize 32)
  71. )
  72. (define-cpu
  73. (name epiphanymf)
  74. (comment "Adapteva, Inc. EPIPHANY Family")
  75. (endian little)
  76. (word-bitsize 32)
  77. )
  78. (define-mach
  79. (name epiphany32)
  80. (comment "Adapteva EPIPHANY")
  81. (cpu epiphanybf)
  82. )
  83. ; Model descriptions.
  84. (define-model
  85. (name epiphany32) (comment "Adapteva EPIPHANY 32/16") (attrs)
  86. (mach epiphany32)
  87. (unit u-exec "Execution Unit" ()
  88. 1 1 ; issue done
  89. () ; state
  90. () ; inputs
  91. () ; outputs
  92. () ; profile action (default)
  93. )
  94. )
  95. ; Instruction fields.
  96. ;
  97. ; Attributes:
  98. ; XXX: what EPIPHANY attrs
  99. ; PCREL-ADDR: pc relative value (for reloc and disassembly purposes)
  100. ; ABS-ADDR: absolute address (for reloc and disassembly purposes?)
  101. ; RESERVED: bits are not used to decode insn, must be all 0
  102. ; RELOC: there is a relocation associated with this field
  103. (define-attr
  104. (for ifield operand)
  105. (type boolean)
  106. (name RELOC)
  107. (comment "there is a reloc associated with this field (experiment)")
  108. )
  109. ;; define the fields of the instruction.
  110. ;; name description ATTR MSB LEN
  111. (dnf f-opc "primary opcode" () 3 4)
  112. (dnf f-opc-4-1 "secondary opcode" () 4 1)
  113. (dnf f-opc-6-3 "secondary opcode" () 6 3) ;;
  114. (dnf f-opc-8-5 "tertiary opcode" () 8 5) ;;
  115. (dnf f-opc-19-4 "additional opcode bits" () 19 4)
  116. (dnf f-condcode "condition codes" () 7 4)
  117. (dnf f-secondary-ccs "flag for secondary ccs" () 7 1)
  118. (dnf f-shift "shift amount" () 9 5)
  119. (dnf f-wordsize "load/store size" () 6 2)
  120. (dnf f-store "load/store flag" () 4 1) ;; 0==load,1==store
  121. (dnf f-opc-8-1 "opcode bits" () 8 1)
  122. (dnf f-opc-31-32 "all opcode set" () 31 32)
  123. (df f-simm8 "branch displacement" (PCREL-ADDR RELOC) 15 8 INT
  124. ((value pc) (sra SI (sub SI value pc) 1))
  125. ((value pc) (add SI (mul SI value 2) pc)))
  126. (df f-simm24 "branch displacement" (PCREL-ADDR RELOC) 31 24 INT
  127. ((value pc) (sra SI (sub SI value pc) 1))
  128. ((value pc) (add SI (mul SI value 2) pc)))
  129. (df f-sdisp3 "signed immediate 3 bit" () 9 3 INT #f #f)
  130. (dnf f-disp3 "address offset" () 9 3)
  131. (dnf f-disp8 "address offset" () 23 8)
  132. (dnf f-imm8 "move/add/sub imm8" () 12 8)
  133. (dnf f-imm-27-8 "move/add/sub imm16" () 27 8)
  134. (dnf f-addsubx "+/- index address" () 20 1)
  135. (dnf f-subd "+/- displ address" () 24 1)
  136. (dnf f-pm "post-modify immediate" () 25 1)
  137. (dnf f-rm "short rm" () 9 3) ;; RM
  138. (dnf f-rn "short rn" () 12 3) ;; RN
  139. (dnf f-rd "short rd" () 15 3) ;; RD
  140. (dnf f-rm-x "extension rm" () 25 3) ;; RM
  141. (dnf f-rn-x "extension rn" () 28 3) ;; RN
  142. (dnf f-rd-x "extension rd" () 31 3) ;; RD
  143. (dnf f-dc-9-1 "DC" (RESERVED) 9 1)
  144. (dnf f-sn "short sn" () 12 3) ;; SN
  145. (dnf f-sd "short sd" () 15 3) ;; SD
  146. (dnf f-sn-x "extension sn" () 28 3) ;; SN
  147. (dnf f-sd-x "extension sd" () 31 3) ;; SD
  148. (dnf f-dc-7-4 "movts zeros" () 7 4)
  149. (dnf f-trap-swi-9-1 "trap or swi" () 9 1)
  150. (dnf f-gien-gidis-9-1 "gien or gidis" () 9 1)
  151. (dnf f-dc-15-3 "DC" (RESERVED) 15 3)
  152. (dnf f-dc-15-7 "DC" (RESERVED) 15 7)
  153. (dnf f-dc-15-6 "DC" () 15 6)
  154. (dnf f-trap-num "trap number" () 15 6)
  155. (dnf f-dc-20-1 "DC" (RESERVED) 20 1)
  156. (dnf f-dc-21-1 "DC" (RESERVED) 21 1)
  157. (dnf f-dc-21-2 "DC" (RESERVED) 21 2)
  158. (dnf f-dc-22-3 "DC" (RESERVED) 22 3)
  159. (dnf f-dc-22-2 "DC" (RESERVED) 22 2)
  160. (dnf f-dc-22-1 "DC" (RESERVED) 22 1)
  161. (dnf f-dc-25-6 "DC" (RESERVED) 25 6)
  162. (dnf f-dc-25-4 "DC" (RESERVED) 25 4)
  163. (dnf f-dc-25-2 "DC" (RESERVED) 25 2)
  164. (dnf f-dc-25-1 "DC" (RESERVED) 25 1)
  165. (dnf f-dc-28-1 "DC" (RESERVED) 28 1)
  166. (dnf f-dc-31-3 "DC" (RESERVED) 31 3)
  167. (dnmf f-disp11 "Unsigned offset for load/store" () UINT (f-disp3 f-disp8)
  168. (sequence ()
  169. (set (ifield f-disp8) (and (srl (ifield f-disp11) 3) (const 255)))
  170. (set (ifield f-disp3) (and (ifield f-disp11) 7)))
  171. (sequence ()
  172. (set (ifield f-disp11) (or (sll (ifield f-disp8) 3)
  173. (ifield f-disp3)))
  174. )
  175. )
  176. (dnmf f-sdisp11 "Signed offset for load/store" () INT (f-disp3 f-disp8)
  177. (sequence () ;encode
  178. (set (ifield f-disp8) (and #xff (srl SI (ifield f-sdisp11) 3)))
  179. (set (ifield f-disp3) (and SI (ifield f-sdisp11) 7)))
  180. (sequence () ;decode
  181. (set (ifield f-sdisp11)
  182. (sub SI (xor (and (or (sll (ifield f-disp8) 3)
  183. (ifield f-disp3))
  184. #x7ff)
  185. #x400)
  186. #x400)))
  187. )
  188. (dnmf f-imm16 "Short immediate for move/add/sub" () UINT (f-imm8 f-imm-27-8)
  189. (sequence ()
  190. (set (ifield f-imm8) (and (ifield f-imm16) #xff))
  191. (set (ifield f-imm-27-8) (srl (ifield f-imm16) 8)))
  192. (sequence ()
  193. (set (ifield f-imm16) (or (sll (ifield f-imm-27-8) 8)
  194. (ifield f-imm8))))
  195. )
  196. ;; 32 bit instructions have the register number broken into two non-contiguous fields
  197. (define-pmacro (x-reg-field reg)
  198. (define-multi-ifield
  199. (name (.sym "f-" reg "6"))
  200. (mode UINT)
  201. (subfields (.sym "f-" reg "-x") (.sym "f-" reg))
  202. (insert (sequence ()
  203. (set (ifield (.sym "f-" reg)) (and (ifield (.sym "f-" reg "6"))
  204. (const 7)))
  205. (set (ifield (.sym "f-" reg "-x")) (srl (ifield (.sym "f-" reg "6"))
  206. (const 3)))
  207. ))
  208. (extract (sequence ()
  209. (set (ifield (.sym "f-" reg "6")) (or (sll (ifield (.sym "f-" reg "-x"))
  210. (const 3))
  211. (ifield (.sym "f-" reg))))
  212. ))
  213. )
  214. )
  215. (x-reg-field rd) ; f-rd6
  216. (x-reg-field rn) ; f-rn6
  217. (x-reg-field rm) ; f-rm6
  218. (x-reg-field sd) ; f-sd6
  219. (x-reg-field sn) ; f-sn6
  220. ;;;;;;;;;;
  221. ; Enums. ;
  222. ;;;;;;;;;;
  223. ; insn-opc: bits 3..0 - major family selector
  224. (define-normal-insn-enum insn-opc "opc enums" () OP4_ f-opc
  225. (
  226. BRANCH16 ;; 0000
  227. LDSTR16X ;; 0001
  228. FLOW16 ;; 0010
  229. IMM16 ;; 0011
  230. LDSTR16D ;; 0100
  231. LDSTR16P ;; 0101
  232. LSHIFT16 ;; 0110 - logical shift
  233. DSP16 ;; 0111 - 3 reg DSP 16 bit insns
  234. BRANCH ;; 1000
  235. LDSTRX ;; 1001
  236. ALU16 ;; 1010 - 3 reg 16 bit
  237. IMM32 ;; 1011
  238. LDSTRD ;; 1100
  239. LDSTRP ;; 1101
  240. ASHIFT16 ;; 1110 ASR, BITR
  241. MISC ;; 1111 - 32 bit shifts, 3 reg ALU, 3 reg DSP, FLOW, BITR
  242. )
  243. )
  244. (define-normal-insn-enum insn-wordsize "memory access width" () OPW_ f-wordsize
  245. ; specifies the size of a memory load/store operation
  246. (BYTE SHORT WORD DOUBLE)
  247. )
  248. (define-normal-insn-enum insn-memory-access "memory access direction" () OP_ f-store
  249. ; load=0, store=1
  250. (LOAD STORE)
  251. )
  252. ; enum for trap codes used by simulator
  253. (define-normal-insn-enum trap-codes "trap instruction dispatch code" () TRAP_ f-trap-num
  254. (write read open exit pass fail close other)
  255. )
  256. ; cond branch: bits 7..4
  257. ;
  258. (define-normal-insn-enum insn-cond "branch conditions" () OPC_ f-condcode
  259. (EQ NE GTU GTEU LTEU LTU GT GTE LT LTE BEQ BNE BLT BLTE B BL))
  260. ; dsp 3 operand opcodes
  261. (define-normal-insn-enum insn-bop "binary operator subcodes" () OPB_ f-opc-6-3
  262. (EOR ADD LSL SUB LSR AND ASR ORR))
  263. ; dsp 3 operand opcodes
  264. (define-normal-insn-enum insn-bopext "binary operator subcodes" () OPBE_ f-opc-6-3
  265. (FEXT FDEP LFSR - - - - -))
  266. (define-normal-insn-enum insn-fop "floating operators" () OPF_ f-opc-6-3
  267. (ADD SUB MUL MADD MSUB FLOAT FIX FABS))
  268. (define-normal-insn-enum insn-fopexn "extended floating operators" () OPF_ f-opc-6-3
  269. (FRECIP FSQRT - - - - - -))
  270. ; Immediate operation secondary opcodes
  271. (define-normal-insn-enum insn-immop "immediate operators" () OPI_ f-opc-6-3
  272. (- ADD - SUB - - - TRAP) ; TRAP is special extension for simulator
  273. )
  274. ; don't care fields
  275. (define-normal-insn-enum insn-dc-25-2 "don't cares" () OPI_25_2_ f-dc-25-2
  276. (MBZ))
  277. ; General Register keyword names.
  278. (define-keyword
  279. (name gr-names)
  280. (print-name h-registers)
  281. (prefix "")
  282. (values
  283. ; some preferred aliases
  284. (fp 11) (sp 13) (lr 14)
  285. ; the default register names
  286. (r0 0) (r1 1) (r2 2) (r3 3) (r4 4) (r5 5) (r6 6) (r7 7)
  287. (r8 8) (r9 9) (r10 10) (r11 11) (r12 12) (r13 13) (r14 14) (r15 15)
  288. (r16 16) (r17 17) (r18 18) (r19 19) (r20 20) (r21 21) (r22 22) (r23 23)
  289. (r24 24) (r25 25) (r26 26) (r27 27) (r28 28) (r29 29) (r30 30) (r31 31)
  290. (r32 32) (r33 33) (r34 34) (r35 35) (r36 36) (r37 37) (r38 38) (r39 39)
  291. (r40 40) (r41 41) (r42 42) (r43 43) (r44 44) (r45 45) (r46 46) (r47 47)
  292. (r48 48) (r49 49) (r50 50) (r51 51) (r52 52) (r53 53) (r54 54) (r55 55)
  293. (r56 56) (r57 57) (r58 58) (r59 59) (r60 60) (r61 61) (r62 62) (r63 63)
  294. ; some less popular aliases
  295. (a1 0) (a2 1) (a3 2) (a4 3) (v1 4) (v2 5) (v3 6) (v4 7)
  296. (v5 8) (v6 9) (v7 10) (v8 11)
  297. (sb 9) (sl 10) (ip 12)
  298. )
  299. )
  300. (define-normal-insn-enum post-index "+/- index register" () DIR_ f-addsubx (POSTINC POSTDEC))
  301. (define-normal-insn-enum disp-post-modify "postmodify displacement" () PMOD_ f-pm (DISP POST))
  302. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  303. ; Hardware pieces.
  304. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  305. ;; 64 general-purpose registers
  306. (define-hardware
  307. (name h-registers)
  308. (comment "all addressable registers")
  309. (type register SI (64))
  310. (attrs PROFILE CACHE-ADDR)
  311. (indices extern-keyword gr-names)
  312. )
  313. ;; Same 64 registers as floating point registers
  314. (define-hardware
  315. (name h-fpregisters)
  316. (comment "all GPRs as float values")
  317. (type register SF (64))
  318. (attrs PROFILE VIRTUAL)
  319. (indices extern-keyword gr-names)
  320. (get (index) (subword SF (reg h-registers index) 0))
  321. (set (index newval) (set (reg h-registers index) (subword SI newval 0)))
  322. )
  323. ;; define processor status bits as physical hardware
  324. (define-pmacro (psw-h-bit name cmt)
  325. (dsh name cmt () (register BI)))
  326. (psw-h-bit h-zbit "integer zero bit")
  327. (psw-h-bit h-nbit "integer neg bit")
  328. (psw-h-bit h-cbit "integer carry bit")
  329. (psw-h-bit h-vbit "integer overflow bit")
  330. (psw-h-bit h-vsbit "integer overflow sticky")
  331. (psw-h-bit h-bzbit "floating point zero bit")
  332. (psw-h-bit h-bnbit "floating point neg bit")
  333. (psw-h-bit h-bvbit "floating point ovfl bit")
  334. (psw-h-bit h-bubit "floating point underfl bit")
  335. (psw-h-bit h-bibit "floating point invalid bit")
  336. (psw-h-bit h-bcbit "floating point carry bit")
  337. (psw-h-bit h-bvsbit "floating point overflow sticky")
  338. (psw-h-bit h-bisbit "floating point invalid sticky")
  339. (psw-h-bit h-busbit "floating point underflow sticky")
  340. (psw-h-bit h-expcause0bit "exceprion cause bit0")
  341. (psw-h-bit h-expcause1bit "exceprion cause bit1")
  342. (psw-h-bit h-expcause2bit "external load stalled bit")
  343. (psw-h-bit h-extFstallbit "external fetch stalled bit")
  344. (psw-h-bit h-trmbit "0=round to nearest, 1=trunacte select bit")
  345. (psw-h-bit h-invExcEnbit "invalid exception enable bit")
  346. (psw-h-bit h-ovfExcEnbit "overflow exception enable bit")
  347. (psw-h-bit h-unExcEnbit "underflow exception enablebit ")
  348. (psw-h-bit h-timer0bit0 "timer 0 mode selection 0")
  349. (psw-h-bit h-timer0bit1 "timer 0 mode selection 1")
  350. (psw-h-bit h-timer0bit2 "timer 0 mode selection 2")
  351. (psw-h-bit h-timer0bit3 "timer 0 mode selection 3")
  352. (psw-h-bit h-timer1bit0 "timer 1 mode selection 0")
  353. (psw-h-bit h-timer1bit1 "timer 1 mode selection 1")
  354. (psw-h-bit h-timer1bit2 "timer 1 mode selection 2")
  355. (psw-h-bit h-timer1bit3 "timer 1 mode selection 3")
  356. (psw-h-bit h-mbkptEnbit "multicore bkpt enable")
  357. (psw-h-bit h-clockGateEnbit "clock gating enable bkpt enable")
  358. (psw-h-bit h-coreCfgResBit12 "core config bit 12")
  359. (psw-h-bit h-coreCfgResBit13 "core config bit 13")
  360. (psw-h-bit h-coreCfgResBit14 "core config bit 14")
  361. (psw-h-bit h-coreCfgResBit15 "core config bit 15")
  362. (psw-h-bit h-coreCfgResBit16 "core config bit 16")
  363. (psw-h-bit h-coreCfgResBit20 "core config bit 20")
  364. (psw-h-bit h-coreCfgResBit21 "core config bit 21")
  365. (psw-h-bit h-coreCfgResBit24 "core config bit 24")
  366. (psw-h-bit h-coreCfgResBit25 "core config bit 25")
  367. (psw-h-bit h-coreCfgResBit26 "core config bit 26")
  368. (psw-h-bit h-coreCfgResBit27 "core config bit 27")
  369. (psw-h-bit h-coreCfgResBit28 "core config bit 28")
  370. (psw-h-bit h-coreCfgResBit29 "core config bit 29")
  371. (psw-h-bit h-coreCfgResBit30 "core config bit 30")
  372. (psw-h-bit h-coreCfgResBit31 "core config bit 31")
  373. (psw-h-bit h-arithmetic-modebit0 "arithmetic mode bit0")
  374. (psw-h-bit h-arithmetic-modebit1 "arithmetic mode bit1")
  375. (psw-h-bit h-arithmetic-modebit2 "arithmetic mode bit2")
  376. (psw-h-bit h-gidisablebit "global interrupt disable bit")
  377. (psw-h-bit h-kmbit "kernel mode bit")
  378. (psw-h-bit h-caibit "core active indicator mode bit")
  379. (psw-h-bit h-sflagbit "sflag bit")
  380. ; Define operands for each of the physical bits
  381. (define-pmacro (psw-bit name hname cmt)
  382. (dnop name cmt (SEM-ONLY) hname f-nil)
  383. )
  384. (psw-bit zbit h-zbit "integer zero bit")
  385. (psw-bit nbit h-nbit "integer neg bit")
  386. (psw-bit cbit h-cbit "integer carry bit")
  387. (psw-bit vbit h-vbit "integer overflow bit")
  388. (psw-bit bzbit h-bzbit "floating point zero bit")
  389. (psw-bit bnbit h-bnbit "floating point neg bit")
  390. (psw-bit bvbit h-bvbit "floating point ovfl bit")
  391. (psw-bit bcbit h-bcbit "floating point carry bit")
  392. (psw-bit bubit h-bubit "floating point underfl bit")
  393. (psw-bit bibit h-bibit "floating point invalid bit")
  394. (psw-bit vsbit h-vsbit "integer overflow sticky")
  395. (psw-bit bvsbit h-bvsbit "floating point overflow sticky")
  396. (psw-bit bisbit h-bisbit "floating point invalid sticky")
  397. (psw-bit busbit h-busbit "floating point underflow sticky")
  398. (psw-bit expcause0bit h-expcause0bit "exceprion cause bit0")
  399. (psw-bit expcause1bit h-expcause1bit "exceprion cause bit1")
  400. (psw-bit expcause2bit h-expcause2bit "external load stalled bit")
  401. (psw-bit extFstallbit h-extFstallbit "external fetch stalled bit")
  402. (psw-bit trmbit h-trmbit "0=round to nearest, 1=trunacte selct bit")
  403. (psw-bit invExcEnbit h-invExcEnbit "invalid exception enable bit")
  404. (psw-bit ovfExcEnbit h-ovfExcEnbit "overflow exception enable bit")
  405. (psw-bit unExcEnbit h-unExcEnbit "underflow exception enable bit")
  406. (psw-bit timer0bit0 h-timer0bit0 "timer 0 mode selection 0")
  407. (psw-bit timer0bit1 h-timer0bit1 "timer 0 mode selection 1")
  408. (psw-bit timer0bit2 h-timer0bit2 "timer 0 mode selection 2")
  409. (psw-bit timer0bit3 h-timer0bit3 "timer 0 mode selection 3")
  410. (psw-bit timer1bit0 h-timer1bit0 "timer 1 mode selection 0")
  411. (psw-bit timer1bit1 h-timer1bit1 "timer 1 mode selection 1")
  412. (psw-bit timer1bit2 h-timer1bit2 "timer 1 mode selection 2")
  413. (psw-bit timer1bit3 h-timer1bit3 "timer 1 mode selection 3")
  414. (psw-bit mbkptEnbit h-mbkptEnbit "multicore bkpt enable")
  415. (psw-bit clockGateEnbit h-clockGateEnbit "clock gate enable enable")
  416. (psw-bit arithmetic-modebit0 h-arithmetic-modebit0 "arithmetic mode bit0")
  417. (psw-bit arithmetic-modebit1 h-arithmetic-modebit1 "arithmetic mode bit1")
  418. (psw-bit arithmetic-modebit2 h-arithmetic-modebit2 "arithmetic mode bit2")
  419. (psw-bit coreCfgResBit12 h-coreCfgResBit12 "core config bit 12")
  420. (psw-bit coreCfgResBit13 h-coreCfgResBit13 "core config bit 13")
  421. (psw-bit coreCfgResBit14 h-coreCfgResBit14 "core config bit 14")
  422. (psw-bit coreCfgResBit15 h-coreCfgResBit15 "core config bit 15")
  423. (psw-bit coreCfgResBit16 h-coreCfgResBit16 "core config bit 16")
  424. (psw-bit coreCfgResBit20 h-coreCfgResBit20 "core config bit 20")
  425. (psw-bit coreCfgResBit21 h-coreCfgResBit21 "core config bit 21")
  426. (psw-bit coreCfgResBit24 h-coreCfgResBit24 "core config bit 24")
  427. (psw-bit coreCfgResBit25 h-coreCfgResBit25 "core config bit 25")
  428. (psw-bit coreCfgResBit26 h-coreCfgResBit26 "core config bit 26")
  429. (psw-bit coreCfgResBit27 h-coreCfgResBit27 "core config bit 27")
  430. (psw-bit coreCfgResBit28 h-coreCfgResBit28 "core config bit 28")
  431. (psw-bit coreCfgResBit29 h-coreCfgResBit29 "core config bit 29")
  432. (psw-bit coreCfgResBit30 h-coreCfgResBit30 "core config bit 30")
  433. (psw-bit coreCfgResBit31 h-coreCfgResBit31 "core config bit 31")
  434. (psw-bit gidisablebit h-gidisablebit "global interrupt disable bit")
  435. (psw-bit kmbit h-kmbit "kernel mode bit")
  436. (psw-bit caibit h-caibit "core actibe indicator bit")
  437. (psw-bit sflagbit h-sflagbit "sflag bit")
  438. ;; Special registers - accessed via MOVTS and MOVFS.
  439. ;;
  440. ;; "Core control and status" in group MR0=0, MR1=0
  441. (define-keyword
  442. (name cr-names)
  443. (print-name h-core-registers)
  444. (prefix "")
  445. (values (config 0)
  446. (status 1) ; unified condition codes
  447. (pc 2) ; virtualized PC
  448. (debug 3);
  449. (iab 4)
  450. (lc 5);loop counter Not impemented
  451. (ls 6);loop start address Not impemented
  452. (le 7);loop end address Not impemented
  453. (iret 8)
  454. (imask 9)
  455. (ilat 10)
  456. (ilatst 11)
  457. (ilatcl 12)
  458. (ipend 13)
  459. (ctimer0 14)
  460. (ctimer1 15)
  461. (hstatus 16)
  462. )
  463. )
  464. ;; DMA registers in group MR0=1, MR1=0
  465. (define-keyword
  466. (name crdma-names)
  467. (print-name h-coredma-registers)
  468. (prefix "")
  469. (values
  470. (dma0config 0)
  471. (dma0stride 1)
  472. (dma0count 2)
  473. (dma0srcaddr 3)
  474. (dma0dstaddr 4)
  475. (dma0auto0 5)
  476. (dma0auto1 6)
  477. (dma0status 7)
  478. (dma1config 8)
  479. (dma1stride 9)
  480. (dma1count 10)
  481. (dma1srcaddr 11)
  482. (dma1dstaddr 12)
  483. (dma1auto0 13)
  484. (dma1auto1 14)
  485. (dma1status 15)
  486. )
  487. )
  488. ;; mem configuration registers in group MR0=0, MR1=1
  489. (define-keyword
  490. (name crmem-names)
  491. (print-name h-coremem-registers)
  492. (prefix "")
  493. (values
  494. (memconfig 0)
  495. (memstatus 1)
  496. (memprotect 2)
  497. (memreserve 3)
  498. )
  499. )
  500. ;; mesh configuration registers in group MR0=1, MR1=1
  501. (define-keyword
  502. (name crmesh-names)
  503. (print-name h-coremesh-registers)
  504. (prefix "")
  505. (values
  506. (meshconfig 0)
  507. (coreid 1)
  508. (meshmulticast 2)
  509. (swreset 3)
  510. )
  511. )
  512. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  513. ; PC is a byte-addressed register
  514. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  515. (dnh h-pc "program counter" (PC PROFILE) (pc) () () ())
  516. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  517. ; Memory Effective Address wants to be visible
  518. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  519. (dnh h-memaddr "memory effective address" (PROFILE) (register SI) () () ())
  520. (dnop memaddr "memory effective address" (SEM-ONLY) h-memaddr f-nil)
  521. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  522. ; Special Core Registers
  523. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  524. ;; STATUS
  525. ;; [0]=core active indicator
  526. ;; [1]=global interrupt disable
  527. ;; [2]=processor mode(1=user mode, 0=kernel mode)
  528. ;; [3]=wired AND global flag
  529. ;; [4]=integer zero zbit
  530. ;; [5]=integer negative nbit
  531. ;; [6]=integer carry cbit
  532. ;; [7]=integer overflow vbit
  533. ;; [8]=fpu zero flag bzbit
  534. ;; [9]=fpu negative flag bnbit
  535. ;; [10]=fpu overflow flag bvbit
  536. ;; [11]=fpu carry flag(not used) bcbit
  537. ;; [12]=ialu overflow flag(sticky) vsbit
  538. ;; [13]=fpu invalid flag(sticky) bisbit
  539. ;; [14]=fpu overflow flag(sticky) bvsbit
  540. ;; [15]=fpu underflow flag(sticky) busbit
  541. ;; [17:16]=exception cause 00=no exception 01=load-store exception 10=fpu exception 11=unimplemented instruction
  542. ;; expcause1bit
  543. ;; expcause0bit
  544. ;; [18]=external load stalled expcause2bit
  545. ;; [19]=external fetch stalled extFstallbit
  546. ;; [31:20]=RESERVED
  547. (define-hardware
  548. (name h-core-registers)
  549. (comment "Special Core Registers")
  550. (type register USI (17))
  551. (attrs)
  552. (indices extern-keyword cr-names)
  553. (get (index)
  554. (cond USI
  555. ((eq index (const 1)) ; STATUS reg ?
  556. (or (or (or (or (sll USI kmbit (const 2))
  557. (sll USI gidisablebit (const 1)))
  558. (or (or (sll USI expcause1bit (const 17))
  559. (sll USI expcause0bit (const 16)))
  560. (or (sll USI expcause2bit (const 18))
  561. (sll USI extFstallbit (const 19)))))
  562. (or (or (or (sll USI busbit (const 15))
  563. (sll USI bisbit (const 13)))
  564. (or (sll USI bvsbit (const 14))
  565. (sll USI vsbit (const 12))))
  566. (or (or (sll USI bvbit (const 10))
  567. (sll USI bcbit (const 11)))
  568. (or (sll USI bnbit (const 9))
  569. (sll USI bzbit (const 8))))))
  570. (or (or (or (sll USI vbit (const 7))
  571. (sll USI cbit (const 6)))
  572. (or (sll USI nbit (const 5))
  573. (sll USI zbit (const 4))))
  574. (or (sll USI sflagbit (const 3))
  575. (sll USI (const 1) (const 0)))))) ;caibit
  576. ((eq index (const 0)) ; Config reg ?
  577. (or (or (or (or (or (or (sll USI timer0bit2 (const 6))
  578. (sll USI timer0bit3 (const 7)))
  579. (or (or (sll USI coreCfgResBit28 (const 28))
  580. (sll USI coreCfgResBit29 (const 29)))
  581. (or (sll USI coreCfgResBit30 (const 30))
  582. (sll USI coreCfgResBit31 (const 31)))))
  583. (or (or (sll USI coreCfgResBit24 (const 24))
  584. (sll USI coreCfgResBit25 (const 25)))
  585. (or (sll USI coreCfgResBit26 (const 26))
  586. (sll USI coreCfgResBit27 (const 27)))))
  587. (or (or (sll USI timer0bit0 (const 4))
  588. (sll USI timer0bit1 (const 5)))
  589. (or (sll USI coreCfgResBit14 (const 14))
  590. (sll USI coreCfgResBit15 (const 15)))))
  591. (or (or (or (or (sll USI timer1bit2 (const 10))
  592. (sll USI timer1bit3 (const 11)))
  593. (or (sll USI coreCfgResBit12 (const 12))
  594. (sll USI coreCfgResBit13 (const 13))))
  595. (or (sll USI clockGateEnbit (const 22))
  596. (sll USI mbkptEnbit (const 23))))
  597. (or (or (sll USI timer1bit0 (const 8))
  598. (sll USI timer1bit1 (const 9)))
  599. (or (sll USI coreCfgResBit20 (const 20))
  600. (sll USI coreCfgResBit21 (const 21))))))
  601. (or (or (sll USI invExcEnbit (const 1))
  602. (sll USI ovfExcEnbit (const 2)))
  603. (or (or (sll USI trmbit (const 0))
  604. (sll USI unExcEnbit (const 3)))
  605. (or (or (sll USI arithmetic-modebit0 (const 17))
  606. (sll USI arithmetic-modebit1 (const 18)))
  607. (or (sll USI arithmetic-modebit2 (const 19))
  608. (sll USI coreCfgResBit16 (const 16)))))))) ;config reg
  609. ((eq index (const 2)) (raw-reg USI h-pc)) ;PC reg
  610. (else (raw-reg USI h-core-registers index))))
  611. (set (index val)
  612. (cond VOID
  613. ((eq index (const 0)) ; CONFIG reg
  614. (sequence ()
  615. (set trmbit (and (const 1) (srl val (const 0))))
  616. (set invExcEnbit (and (const 1) (srl val (const 1))))
  617. (set ovfExcEnbit (and (const 1) (srl val (const 2))))
  618. (set unExcEnbit (and (const 1) (srl val (const 3))))
  619. (set timer0bit0 (and (const 1) (srl val (const 4))))
  620. (set timer0bit1 (and (const 1) (srl val (const 5))))
  621. (set timer0bit2 (and (const 1) (srl val (const 6))))
  622. (set timer0bit3 (and (const 1) (srl val (const 7))))
  623. (set timer1bit0 (and (const 1) (srl val (const 8))))
  624. (set timer1bit1 (and (const 1) (srl val (const 9))))
  625. (set timer1bit2 (and (const 1) (srl val (const 10))))
  626. (set timer1bit3 (and (const 1) (srl val (const 11))))
  627. (set coreCfgResBit12 (and (const 1) (srl val (const 12))))
  628. (set coreCfgResBit13 (and (const 1) (srl val (const 13))))
  629. (set coreCfgResBit14 (and (const 1) (srl val (const 14))))
  630. (set coreCfgResBit15 (and (const 1) (srl val (const 15))))
  631. (set coreCfgResBit16 (and (const 1) (srl val (const 16))))
  632. (set arithmetic-modebit0 (and (const 1) (srl val (const 17))))
  633. (set arithmetic-modebit1 (and (const 1) (srl val (const 18))))
  634. (set arithmetic-modebit2 (and (const 1) (srl val (const 19))))
  635. (set coreCfgResBit20 (and (const 1) (srl val (const 20))))
  636. (set coreCfgResBit21 (and (const 1) (srl val (const 21))))
  637. (set clockGateEnbit (and (const 1) (srl val (const 22))))
  638. (set mbkptEnbit (and (const 1) (srl val (const 23))))
  639. (set coreCfgResBit24 (and (const 1) (srl val (const 24))))
  640. (set coreCfgResBit25 (and (const 1) (srl val (const 25))))
  641. (set coreCfgResBit26 (and (const 1) (srl val (const 26))))
  642. (set coreCfgResBit27 (and (const 1) (srl val (const 27))))
  643. (set coreCfgResBit28 (and (const 1) (srl val (const 28))))
  644. (set coreCfgResBit29 (and (const 1) (srl val (const 29))))
  645. (set coreCfgResBit30 (and (const 1) (srl val (const 30))))
  646. (set coreCfgResBit31 (and (const 1) (srl val (const 31))))
  647. (set (raw-reg USI h-core-registers index) val)
  648. ;; check LSB of CONFIG for rounding mode
  649. (c-call "epiphany_set_rounding_mode" val)
  650. )
  651. )
  652. ((eq index (const 1)) ;STATUS reg ; TODO check which bits can be set or clear
  653. (sequence ((USI newval))
  654. (set newval (and val (const #xfff2)))
  655. (set extFstallbit (and (const 1) (srl newval (const 19))))
  656. (set expcause2bit (and (const 1) (srl newval (const 18))))
  657. (set expcause1bit (and (const 1) (srl newval (const 17))))
  658. (set expcause0bit (and (const 1) (srl newval (const 16))))
  659. (set busbit (and (const 1) (srl newval (const 15))))
  660. (set bisbit (and (const 1) (srl newval (const 13))))
  661. (set bvsbit (and (const 1) (srl newval (const 14))))
  662. (set vsbit (and (const 1) (srl newval (const 12))))
  663. (set bvbit (and (const 1) (srl newval (const 10))))
  664. (set bcbit (and (const 1) (srl newval (const 11))))
  665. (set bnbit (and (const 1) (srl newval (const 9))))
  666. (set bzbit (and (const 1) (srl newval (const 8))))
  667. (set vbit (and (const 1) (srl newval (const 7))))
  668. (set cbit (and (const 1) (srl newval (const 6))))
  669. (set nbit (and (const 1) (srl newval (const 5))))
  670. (set zbit (and (const 1) (srl newval (const 4))))
  671. (set sflagbit (and (const 1) (srl newval (const 3))))
  672. (set kmbit (and (const 1) (srl newval (const 2))))
  673. ;;(set gie (and (const 1) (srl newval (const 1))))
  674. (set (raw-reg SI h-core-registers (const 1)) newval)
  675. ))
  676. ;; causes simulator errors
  677. ;; ((eq index (const 2)) ;PC reg
  678. ;; (set pc val))
  679. (else (set (raw-reg USI h-core-registers index) val))
  680. ))
  681. )
  682. ; (define-pmacro (hcr-config) (reg h-core-registers 0)) etc.
  683. (.splice begin (.unsplice (.map
  684. (.pmacro (xname xnum)
  685. (define-pmacro ((.sym hcr- xname)) (reg h-core-registers xnum)))
  686. (
  687. config
  688. status
  689. pc
  690. debug
  691. iab
  692. lc
  693. ls
  694. le
  695. iret
  696. imask
  697. ilat
  698. ilatst
  699. ilatcl
  700. ipend
  701. ctimer0
  702. ctimer1
  703. hstatus
  704. )
  705. (0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
  706. )
  707. )))
  708. ;; DMA registers in MMR space
  709. (define-hardware
  710. (name h-coredma-registers)
  711. (comment "DMA registers in MMR space")
  712. (type register USI (16))
  713. (attrs)
  714. (indices extern-keyword crdma-names)
  715. )
  716. ;; MEM registers in MMR space
  717. (define-hardware
  718. (name h-coremem-registers)
  719. (comment "MEM registers in MMR space")
  720. (type register USI (4))
  721. (attrs)
  722. (indices extern-keyword crmem-names)
  723. )
  724. ;; MEM registers in MMR space
  725. (define-hardware
  726. (name h-coremesh-registers)
  727. (comment "MESH registers in MMR space")
  728. (type register USI (4))
  729. (attrs)
  730. (indices extern-keyword crmesh-names)
  731. )
  732. ; Operands
  733. ; Branch displacements
  734. (define-operand
  735. (name simm24)
  736. (comment "branch address pc-relative")
  737. (attrs RELAX)
  738. (type h-iaddr)
  739. (index f-simm24)
  740. (handlers (parse "branch_addr")))
  741. (define-operand
  742. (name simm8)
  743. (comment "branch address pc-relative")
  744. (attrs RELAX)
  745. (type h-iaddr)
  746. (index f-simm8)
  747. (handlers (parse "branch_addr")))
  748. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  749. ; Register operands
  750. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  751. (define-pmacro (short-regs nm group hw cmt)
  752. (define-operand
  753. (name nm)
  754. (comment cmt)
  755. (attrs)
  756. (type hw)
  757. (index (.sym "f-r" group))
  758. (handlers (parse "shortregs") (print "keyword"))
  759. )
  760. )
  761. (define-pmacro (short-regs-core nm group hw cmt)
  762. (define-operand
  763. (name nm)
  764. (comment cmt)
  765. (attrs)
  766. (type hw)
  767. (index (.sym "f-s" group))
  768. (handlers (parse "shortregs") (print "keyword"))
  769. )
  770. )
  771. ; short regs (0-7)
  772. (short-regs rd d h-registers "destination register")
  773. (short-regs rn n h-registers "source register")
  774. (short-regs rm m h-registers "source register")
  775. (short-regs frd d h-fpregisters "fp destination register")
  776. (short-regs frn n h-fpregisters "fp source register")
  777. (short-regs frm m h-fpregisters "fp source register")
  778. ; long regs (0-63)
  779. (dnop rd6 "destination register" () h-registers f-rd6)
  780. (dnop rn6 "source register" () h-registers f-rn6)
  781. (dnop rm6 "source register" () h-registers f-rm6)
  782. (dnop frd6 "fp destination register" () h-fpregisters f-rd6)
  783. (dnop frn6 "fp source register" () h-fpregisters f-rn6)
  784. (dnop frm6 "fp source register" () h-fpregisters f-rm6)
  785. ; special regs (0-7)
  786. (short-regs-core sd d h-core-registers "special destination")
  787. (short-regs-core sn n h-core-registers "special source")
  788. ; special regs (long form)
  789. (dnop sd6 "special destination register" () h-core-registers f-sd6)
  790. (dnop sn6 "special source register" () h-core-registers f-sn6)
  791. (dnop sddma "dma register" () h-coredma-registers f-sd6)
  792. (dnop sndma "dma register" () h-coredma-registers f-sn6)
  793. (dnop sdmem "mem register" () h-coremem-registers f-sd6)
  794. (dnop snmem "mem register" () h-coremem-registers f-sn6)
  795. (dnop sdmesh "mesh register" () h-coremesh-registers f-sd6)
  796. (dnop snmesh "mesh register" () h-coremesh-registers f-sn6)
  797. ; Immediate literals - but don't allow register names!
  798. (define-pmacro (dimmop nm cmt hwtype idx)
  799. (define-operand (name nm) (comment cmt) (type hwtype) (index idx)
  800. (attrs RELAX)
  801. (handlers (parse "simm_not_reg")
  802. (print "simm_not_reg")))
  803. )
  804. (dimmop simm3 "signed 3-bit literal" h-sint f-sdisp3)
  805. (dimmop simm11 "signed 11-bit literal" h-sint f-sdisp11)
  806. (dnop disp3 "short data displacement" () h-uint f-disp3)
  807. (dnop trapnum6 "parameter for swi or trap" () h-uint f-trap-num)
  808. (define-pmacro (duimmop nm cmt hwtype idx)
  809. (define-operand (name nm) (comment cmt) (type hwtype) (index idx)
  810. (attrs)
  811. (handlers (parse "uimm_not_reg")
  812. (print "uimm_not_reg")))
  813. )
  814. (duimmop swi_num "unsigned 6-bit swi#" h-uint f-trap-num)
  815. (duimmop disp11 "sign-magnitude data displacement" h-uint f-disp11)
  816. (dnop shift "immediate shift amount" () h-uint f-shift)
  817. (define-operand (name imm16) (comment "16-bit unsigned literal") (attrs RELAX)
  818. (type h-addr) (index f-imm16) (handlers (parse "imm16")))
  819. (define-operand (name imm8) (comment "8-bit unsigned literal") (attrs RELAX)
  820. (type h-addr) (index f-imm8) (handlers (parse "imm8")))
  821. (define-operand
  822. (name direction)
  823. (comment "+/- indexing")
  824. (attrs)
  825. (type h-uint)
  826. (index f-addsubx)
  827. (handlers (parse "postindex")
  828. (print "postindex")))
  829. (define-operand
  830. (name dpmi)
  831. (comment "+/- magnitude immediate displacement")
  832. (attrs)
  833. (type h-uint)
  834. (index f-subd)
  835. (handlers (parse "postindex")
  836. (print "postindex")))
  837. ;; call exception macro - no check for imask
  838. (define-pmacro (call-exception vaddr bit-in-ilat)
  839. (if (eq gidisablebit 0)
  840. (if (eq (and (hcr-imask) bit-in-ilat) 0)
  841. (sequence ()
  842. (set kmbit 1)
  843. (set gidisablebit 1)
  844. (set (hcr-iret) (add pc (const 2)))
  845. (set (hcr-ipend) (or (hcr-ipend) (const bit-in-ilat)))
  846. (set pc (const vaddr))
  847. )
  848. ;; schedule interrupt
  849. (set (hcr-ilat) (or (hcr-ilat) (const bit-in-ilat)))
  850. )
  851. )
  852. )
  853. ;; (lc 5);loop counter Not impemented
  854. ;; (ls 6);loop start address Not impemented
  855. ;; (le 7);loop end address Not impemented
  856. ;;have callback to adjust pc in case od events ( HW loops ... )
  857. (define-pmacro (dni_wrapper isnid stdrdesc attr_ strassembl iopcode proceed null_b)
  858. (begin
  859. (dni isnid stdrdesc attr_ strassembl iopcode
  860. (sequence () proceed
  861. (sequence ((USI tmpPC))
  862. ;;(set tmpPC (c-call USI "epiphany_post_isn_callback" pc))
  863. (if (eq pc (hcr-le))
  864. (set (hcr-lc) (sub (hcr-lc) #x1)))
  865. (if (and
  866. (eq pc (hcr-le))
  867. (not (eq (hcr-lc) #x0)))
  868. (set pc (hcr-ls)))
  869. )
  870. )
  871. null_b)
  872. )
  873. )
  874. ;; Some handy macros
  875. ;;
  876. ;; define instructions
  877. ;; Short (16 bit forms) must appear first so that instruction
  878. ;; selection can reject them and match long forms when registers
  879. ;; or immediates exceed the values in the 16 bit instructions
  880. ;; B<COND> SIMM8
  881. ;; B<COND> SIMM24
  882. (define-pmacro (br-insn name cond g-op)
  883. (begin
  884. ; the 16-bit versions of branch
  885. (dni (.sym "b" name "16")
  886. (.str "Conditional Branch - 16 bit" name)
  887. (COND-CTI SHORT-INSN)
  888. (.str "b" name ".s $simm8")
  889. (+ OP4_BRANCH16 (.sym "OPC_" cond) simm8)
  890. (if (g-op)
  891. (set pc simm8)
  892. )
  893. ()
  894. )
  895. (dnmi (.sym "b" name "16r") "relaxable conditional branch"
  896. (COND-CTI RELAXABLE)
  897. (.str "b" name " $simm8")
  898. (emit (.sym "b" name "16") simm8)
  899. )
  900. (dni (.sym "b" name)
  901. (.str "Conditional Branch " name)
  902. (COND-CTI)
  903. (.str "b" name ".l $simm24")
  904. (+ OP4_BRANCH (.sym "OPC_" cond) simm24)
  905. (if (g-op)
  906. (set pc simm24)
  907. )
  908. ()
  909. )
  910. (dnmi (.sym "b" name "32r") "relaxable conditional branch"
  911. (COND-CTI RELAXED)
  912. (.str "b" name " $simm24")
  913. (emit (.sym "b" name) simm24)
  914. )
  915. )
  916. )
  917. ; basic conditional branches for integer arithmetic
  918. (br-insn "eq" EQ (.pmacro () (eq zbit #x1)))
  919. (br-insn "ne" NE (.pmacro () (eq zbit #x0)))
  920. (br-insn "gtu" GTU (.pmacro () (and BI cbit (not BI zbit))))
  921. (br-insn "gteu" GTEU (.pmacro () (eq cbit #x1)))
  922. (br-insn "lteu" LTEU (.pmacro () (or BI (not BI cbit) zbit)))
  923. (br-insn "ltu" LTU (.pmacro () (eq cbit #x0)))
  924. (br-insn "gt" GT (.pmacro () (and BI (not BI zbit) (eq vbit nbit))))
  925. (br-insn "gte" GTE (.pmacro () (eq vbit nbit)))
  926. (br-insn "lt" LT (.pmacro () (xor BI vbit nbit)))
  927. (br-insn "lte" LTE (.pmacro () (or BI zbit (xor vbit nbit))))
  928. ; floating point condition codes (floating point instructions)
  929. (br-insn "beq" BEQ (.pmacro () (or BI bzbit bzbit)))
  930. (br-insn "bne" BNE (.pmacro () (not BI bzbit)))
  931. (br-insn "blt" BLT (.pmacro () (and BI bnbit (not bzbit))))
  932. (br-insn "blte" BLTE (.pmacro () (or BI bnbit bzbit)))
  933. ; unconditional branches
  934. (dni b16 "short unconditional branch" (UNCOND-CTI SHORT-INSN)
  935. "b.s $simm8"
  936. (+ OP4_BRANCH16 OPC_B simm8)
  937. (set pc simm8)
  938. ()
  939. )
  940. (dnmi b16r "relaxable b16"
  941. (UNCOND-CTI RELAXABLE)
  942. "b $simm8"
  943. (emit b16 simm8)
  944. )
  945. (dni b "long unconditional branch" (UNCOND-CTI)
  946. "b.l $simm24"
  947. (+ OP4_BRANCH OPC_B simm24)
  948. (set pc simm24)
  949. ()
  950. )
  951. (dnmi b32r "relaxable b"
  952. (UNCOND-CTI RELAXED)
  953. "b $simm24"
  954. (emit b simm24))
  955. ;; BL R,ADDR
  956. (dni bl16 "branch and link"
  957. (UNCOND-CTI SHORT-INSN)
  958. ("bl.s $simm8")
  959. (+ OP4_BRANCH16 OPC_BL simm8)
  960. (sequence ()
  961. (set (reg h-registers 14) (add pc (const 2)))
  962. (set pc simm8))
  963. ()
  964. )
  965. (dnmi bl16r "bl16 relaxable"
  966. (UNCOND-CTI RELAXABLE)
  967. "bl $simm8"
  968. (emit bl16 simm8))
  969. (dni bl "branch and link"
  970. (UNCOND-CTI)
  971. ("bl.l $simm24")
  972. (+ OP4_BRANCH OPC_BL simm24)
  973. (sequence ()
  974. (set (reg h-registers 14) (add pc (const 4)))
  975. (set pc simm24))
  976. ()
  977. )
  978. (dnmi blr "bl relaxable"
  979. (UNCOND-CTI RELAXED)
  980. "bl $simm24"
  981. (emit bl simm24))
  982. ;; JUMP <RN>
  983. (dni jr16 "unconditional jump 16"
  984. (UNCOND-CTI SHORT-INSN)
  985. ("jr $rn")
  986. (+ OP4_FLOW16 (f-opc-8-5 #x14) (f-dc-15-3 #x0) (f-dc-9-1 #x0) rn)
  987. (set pc rn)
  988. ()
  989. )
  990. ;; RTS / JR
  991. ;; ??? Putting a constant into a multi-ifield does not work -
  992. ;; the constant gets inserted in full into each part.
  993. ;(dnmi rts "return from subroutine"
  994. ; (UNCOND-CTI)
  995. ; ("rts")
  996. ; (emit jr (rn6 14)) ; jr lr / jr r14
  997. ;)
  998. ;; RTS / JR
  999. (dni rts "return from subroutine"
  1000. (ALIAS UNCOND-CTI)
  1001. ("rts")
  1002. (+ OP4_MISC (f-opc-8-5 #x14) (f-opc-19-4 #x2) (f-rn 6) (f-rn-x 1)
  1003. (f-dc-9-1 #x0)
  1004. (f-dc-15-3 #x0)
  1005. (f-dc-25-6 #x0)
  1006. (f-dc-31-3 #x0)
  1007. )
  1008. (set pc (reg h-registers 14))
  1009. ()
  1010. )
  1011. (dni jr "unconditional jump"
  1012. (UNCOND-CTI)
  1013. ("jr $rn6")
  1014. (+ OP4_MISC (f-opc-8-5 #x14) (f-opc-19-4 #x2) rn6
  1015. (f-dc-9-1 #x0)
  1016. (f-dc-15-3 #x0)
  1017. (f-dc-25-6 #x0)
  1018. (f-dc-31-3 #x0)
  1019. )
  1020. (set pc rn6)
  1021. ()
  1022. )
  1023. ;; JALR <RN>
  1024. (dni jalr16 "jump and link register"
  1025. (UNCOND-CTI SHORT-INSN)
  1026. ("jalr $rn")
  1027. (+ OP4_FLOW16 (f-opc-8-5 #x15) (f-dc-15-3 #x0) (f-dc-9-1 #x0) rn)
  1028. (sequence ()
  1029. (set (reg h-registers 14) (add pc (const 2)))
  1030. (set pc rn)
  1031. )
  1032. ()
  1033. )
  1034. (dni jalr "jump and link register"
  1035. (UNCOND-CTI)
  1036. ("jalr $rn6")
  1037. (+ OP4_MISC
  1038. (f-opc-8-5 #x15)
  1039. (f-opc-19-4 #x2)
  1040. rn6
  1041. (f-dc-9-1 #x0)
  1042. (f-dc-15-3 #x0)
  1043. (f-dc-25-6 #x0)
  1044. (f-dc-31-3 #x0)
  1045. )
  1046. (sequence ()
  1047. (set (reg h-registers 14) (add pc (const 4)))
  1048. (set pc rn6))
  1049. ()
  1050. )
  1051. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  1052. ; Load/Store Memory Instructions
  1053. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  1054. (define-pmacro (callMisaligmentExceptionIfNeeded sel addr isAligmentAccess)
  1055. (sequence ((BI scale))
  1056. (set isAligmentAccess
  1057. (case BI sel
  1058. ((OPW_BYTE) (eq (and addr #x0) #x0))
  1059. ((OPW_SHORT) (eq (and addr #x1) #x0))
  1060. ((OPW_WORD) (eq (and addr #x3) #x0))
  1061. (else (eq (and addr #x7) #x0))))
  1062. (if (not BI isAligmentAccess)
  1063. (call-exception #x4 #x2))
  1064. )
  1065. )
  1066. ;; helper to convert size selector OPW_<mode> into a literal scale factor
  1067. (define-pmacro (ConvertSelectorToShift sel scale)
  1068. (set scale
  1069. (case SI sel
  1070. ((OPW_BYTE) (const 0))
  1071. ((OPW_SHORT) (const 1))
  1072. ((OPW_WORD) (const 2))
  1073. (else (const 3))))
  1074. )
  1075. ;; common load macros from effective address, handling 8/16/32/64 bits
  1076. (define-pmacro (load-double-from-ea regnum eff-addr mode sel)
  1077. (sequence ((SI loadaddr) (BI isAligmentAccess))
  1078. (set loadaddr eff-addr)
  1079. (callMisaligmentExceptionIfNeeded sel loadaddr isAligmentAccess)
  1080. (if (not (not BI isAligmentAccess))
  1081. (sequence ()
  1082. (set memaddr loadaddr)
  1083. (set regnum (mem SI loadaddr))
  1084. (set loadaddr (add loadaddr (const 4)))
  1085. (set memaddr loadaddr)
  1086. (set (reg h-registers
  1087. (add (index-of regnum)
  1088. (const 1)))
  1089. (mem SI loadaddr))
  1090. )
  1091. )
  1092. )
  1093. )
  1094. (define-pmacro (load-from-ea regnum eff-addr mode sel)
  1095. (sequence ((BI isAligmentAccess))
  1096. (callMisaligmentExceptionIfNeeded sel eff-addr isAligmentAccess)
  1097. (if (not (not BI isAligmentAccess))
  1098. (sequence ()
  1099. (set memaddr eff-addr)
  1100. (set regnum (zext SI (mem mode eff-addr)))
  1101. )
  1102. )
  1103. )
  1104. ) ;; 8/16/32 bit cases
  1105. ;; common store to effective address, handling 8/16/32/64 bit data
  1106. (define-pmacro (store-double-to-ea eff-addr regnum mode sel)
  1107. (sequence ((SI storeaddr) (BI isAligmentAccess))
  1108. (set storeaddr eff-addr)
  1109. (callMisaligmentExceptionIfNeeded sel storeaddr isAligmentAccess)
  1110. (if (not (not BI isAligmentAccess))
  1111. (sequence ()
  1112. (set memaddr storeaddr)
  1113. (set (mem SI storeaddr) regnum)
  1114. (set storeaddr (add storeaddr (const 4)))
  1115. (set memaddr storeaddr)
  1116. (set (mem SI storeaddr)
  1117. (reg h-registers (add (index-of regnum) (const 1))))
  1118. )
  1119. )
  1120. )
  1121. )
  1122. (define-pmacro (store-to-ea eff-addr regnum mode sel)
  1123. (sequence ((BI isAligmentAccess))
  1124. (callMisaligmentExceptionIfNeeded sel eff-addr isAligmentAccess)
  1125. (if (not (not BI isAligmentAccess))
  1126. (sequence ()
  1127. (set memaddr eff-addr)
  1128. (set (mem mode eff-addr) regnum)
  1129. )
  1130. )
  1131. )
  1132. ) ;8/16/32 bit cases
  1133. (define-pmacro (load-insn name mode sel sem-op)
  1134. (begin
  1135. (dni_wrapper (.sym name "x16.s")
  1136. (.str "load " mode " indexed")
  1137. (SHORT-INSN)
  1138. (.str name " $rd,[$rn,$rm]")
  1139. (+ OP4_LDSTR16X sel OP_LOAD rd rn rm)
  1140. (sequence ()
  1141. (sem-op rd (add rn rm) mode sel))
  1142. ()
  1143. )
  1144. (dni_wrapper (.sym name "p16.s")
  1145. (.str "load " mode " postmodify")
  1146. (SHORT-INSN)
  1147. (.str name " $rd,[$rn],$rm")
  1148. (+ OP4_LDSTR16P sel OP_LOAD rd rn rm)
  1149. (sequence ((SI tmprm))
  1150. (set tmprm rm)
  1151. (sem-op rd rn mode sel)
  1152. (set rn (add rn tmprm)))
  1153. ()
  1154. )
  1155. (dni_wrapper (.sym name "x.l")
  1156. (.str "load " mode " indexed")
  1157. ()
  1158. (.str name " $rd6,[$rn6,$direction$rm6]")
  1159. (+ OP4_LDSTRX sel OP_LOAD (f-opc-19-4 #x0) (f-dc-22-1 #x0) (f-dc-21-1 #x0) rd6 rn6 direction rm6)
  1160. (sequence ()
  1161. (if (ifield f-addsubx)
  1162. (sem-op rd6 (sub rn6 rm6) mode sel)
  1163. (sem-op rd6 (add rn6 rm6) mode sel)))
  1164. ()
  1165. )
  1166. (dnmi (.sym name "x")
  1167. (.str "load " mode " indexed")
  1168. (NO-DIS)
  1169. (.str name ".l $rd6,[$rn6,$direction$rm6]")
  1170. (emit (.sym name "x.l") rd6 rn6 direction rm6)
  1171. )
  1172. (dni_wrapper (.sym name "p.l")
  1173. (.str "load " mode " postmodify")
  1174. ()
  1175. (.str name " $rd6,[$rn6],$direction$rm6")
  1176. (+ OP4_LDSTRP sel OP_LOAD (f-opc-19-4 #x0) (f-dc-22-2 #x0) rd6 rn6 direction rm6)
  1177. (sequence ((SI tmprm))
  1178. (set tmprm rm6)
  1179. (sem-op rd6 rn6 mode sel)
  1180. (if (ifield f-addsubx)
  1181. (set rn6 (sub rn6 tmprm))
  1182. (set rn6 (add rn6 tmprm)))
  1183. )
  1184. ()
  1185. )
  1186. (dnmi (.sym name "p")
  1187. (.str "load " mode " postmodify")
  1188. (NO-DIS)
  1189. (.str name ".l $rd6,[$rn6],$direction$rm6")
  1190. (emit (.sym name "p.l") rd6 rn6 direction rm6)
  1191. )
  1192. ;;immediate modes last so reg forms found first.
  1193. (dni_wrapper (.sym name "d16.s")
  1194. (.str "load " mode " displacement")
  1195. (SHORT-INSN IMM3)
  1196. (.str name " $rd,[$rn,$disp3]")
  1197. (+ OP4_LDSTR16D sel OP_LOAD rd rn disp3) ;; convert size to 'B'
  1198. (sequence ((SI effa)
  1199. (SI scale))
  1200. (ConvertSelectorToShift sel scale)
  1201. (set effa (add rn (sll disp3 scale)))
  1202. (sem-op rd effa mode sel)
  1203. )
  1204. ()
  1205. )
  1206. (dni_wrapper (.sym name "d.l")
  1207. (.str "load " mode " displacement")
  1208. ()
  1209. (.str name " $rd6,[$rn6,$dpmi$disp11]")
  1210. (+ OP4_LDSTRD sel OP_LOAD PMOD_DISP rd6 rn6 dpmi disp11)
  1211. (sequence ((SI effa)
  1212. (SI scale))
  1213. (ConvertSelectorToShift sel scale)
  1214. (if dpmi
  1215. (set effa (sub rn6 (sll disp11 scale)))
  1216. (set effa (add rn6 (sll disp11 scale)))
  1217. )
  1218. (sem-op rd6 effa mode sel)
  1219. )
  1220. ()
  1221. )
  1222. (dnmi (.sym name "d")
  1223. (.str "load " mode " displacement")
  1224. (NO-DIS)
  1225. (.str name ".l $rd6,[$rn6,$dpmi$disp11]")
  1226. (emit (.sym name "d.l") rd6 rn6 dpmi disp11)
  1227. )
  1228. (dni_wrapper (.sym name "dpm.l")
  1229. (.str "load " mode " displacement post-modify")
  1230. ()
  1231. (.str name " $rd6,[$rn6],$dpmi$disp11")
  1232. (+ OP4_LDSTRD sel OP_LOAD PMOD_POST rd6 rn6 dpmi disp11)
  1233. (sequence ((SI scale))
  1234. (ConvertSelectorToShift sel scale)
  1235. (sem-op rd6 rn6 mode sel)
  1236. (if dpmi
  1237. (set rn6 (sub rn6 (sll disp11 scale)))
  1238. (set rn6 (add rn6 (sll disp11 scale)))
  1239. )
  1240. )
  1241. ()
  1242. )
  1243. (dnmi (.sym name "dpm")
  1244. (.str "load " mode " displacement post-modify")
  1245. (NO-DIS)
  1246. (.str name ".l $rd6,[$rn6],$dpmi$disp11")
  1247. (emit (.sym name "dpm.l") rd6 rn6 dpmi disp11)
  1248. )
  1249. ;; ;; macro form with a zero displacement
  1250. (dnmi (.sym name "ds0") "load with 0 disp"
  1251. (SHORT-INSN IMM3)
  1252. (.str name " $rd,[$rn]")
  1253. (emit (.sym name "d16.s") rd rn (disp3 0))
  1254. )
  1255. (dnmi (.sym name "dl0") "load with 0 disp"
  1256. (NO-DIS)
  1257. (.str name " $rd6,[$rn6]")
  1258. (emit (.sym name "d.l") rd6 rn6 (dpmi 0) (disp11 0))
  1259. )
  1260. (dnmi (.sym name "dl0.l") "load with 0 disp"
  1261. (NO-DIS)
  1262. (.str name ".l $rd6,[$rn6]")
  1263. (emit (.sym name "d.l") rd6 rn6 (dpmi 0) (disp11 0))
  1264. )
  1265. )
  1266. )
  1267. (load-insn ldrb QI OPW_BYTE load-from-ea)
  1268. (load-insn ldrh HI OPW_SHORT load-from-ea)
  1269. (load-insn ldr SI OPW_WORD load-from-ea)
  1270. (load-insn ldrd DI OPW_DOUBLE load-double-from-ea)
  1271. ;; TMP = MEM[RD+RM]; /* Copy content of memory to tmp. */
  1272. ;; if (~TMP) /* Check if memory location is zero. */
  1273. ;; MEM[RD+RM] = RD; /* If zero, write RD to memory. */
  1274. ;; RD = TMP; /* Always write tmp into RD (NOTE it's destructive). */
  1275. (define-pmacro (testset-insn name mode sel)
  1276. (begin
  1277. (dni_wrapper (.sym name "t")
  1278. (.str "testset " mode " indexed")
  1279. ()
  1280. (.str name " $rd6,[$rn6,$direction$rm6]")
  1281. (+ OP4_LDSTRX sel OP_LOAD (f-opc-19-4 #x0) (f-dc-22-1 #x0) (f-dc-21-1 #x1)
  1282. rd6 rn6 direction rm6)
  1283. (sequence ((SI tmemaddr) (SI tmpValReg))
  1284. ;;back up register
  1285. (set tmpValReg rd6)
  1286. (if (ifield f-addsubx)
  1287. (set tmemaddr (sub rn6 rm6))
  1288. (set tmemaddr (add rn6 rm6))
  1289. )
  1290. ;;always update rd
  1291. (load-from-ea rd6 tmemaddr mode sel)
  1292. ;;if zero
  1293. (if rd6
  1294. (nop)
  1295. (set (mem mode tmemaddr) tmpValReg)
  1296. )
  1297. )
  1298. ()
  1299. )
  1300. (dnmi (.sym name "t.l")
  1301. (.str "testset " mode ".l indexed")
  1302. (NO-DIS)
  1303. (.str name ".l $rd6,[$rn6,$direction$rm6]")
  1304. (emit (.sym name "t") rd6 rn6 direction rm6)
  1305. )
  1306. )
  1307. )
  1308. (testset-insn testsetb QI OPW_BYTE)
  1309. (testset-insn testseth HI OPW_SHORT)
  1310. (testset-insn testset SI OPW_WORD)
  1311. ;;no double mode support, since we have to send the src address, data
  1312. ;;(testset-insn testsetd DI OPW_DOUBLE load-double-from-ea)
  1313. ;; need 16 bit forms too
  1314. (define-pmacro (store-insn name mode sel sem-op)
  1315. (begin
  1316. (dni_wrapper (.sym name "x16")
  1317. (.str "store" mode " indexed")
  1318. (SHORT-INSN)
  1319. (.str name " $rd,[$rn,$rm]")
  1320. (+ OP4_LDSTR16X sel OP_STORE rd rn rm)
  1321. (sequence ()
  1322. (sem-op (add rn rm) rd mode sel)
  1323. )
  1324. ()
  1325. )
  1326. (dni_wrapper (.sym name "x")
  1327. (.str "store" mode " indexed")
  1328. ()
  1329. (.str name " $rd6,[$rn6,$direction$rm6]")
  1330. (+ OP4_LDSTRX sel OP_STORE (f-opc-19-4 #x0) (f-dc-22-1 #x0) (f-dc-21-1 #x0) rd6 rn6 direction rm6)
  1331. (sequence ()
  1332. (if (ifield f-addsubx)
  1333. (sem-op (sub rn6 rm6) rd6 mode sel)
  1334. (sem-op (add rn6 rm6) rd6 mode sel)
  1335. ))
  1336. ()
  1337. )
  1338. (dnmi (.sym name "x.l")
  1339. (.str "store" mode " indexed")
  1340. (NO-DIS)
  1341. (.str name ".l $rd6,[$rn6,$direction$rm6]")
  1342. (emit (.sym name "x") rd6 rn6 direction rm6)
  1343. )
  1344. (dni_wrapper (.sym name "p16")
  1345. (.str "store " mode " postmodify")
  1346. (SHORT-INSN)
  1347. (.str name " $rd,[$rn],$rm")
  1348. (+ OP4_LDSTR16P sel OP_STORE rd rn rm)
  1349. (sequence ()
  1350. (sem-op rn rd mode sel)
  1351. (set rn (add rn rm))
  1352. )
  1353. ()
  1354. )
  1355. (dni_wrapper (.sym name "p")
  1356. (.str "store " mode " postmodify")
  1357. ()
  1358. (.str name " $rd6,[$rn6],$direction$rm6")
  1359. (+ OP4_LDSTRP sel OP_STORE (f-opc-19-4 #x0) (f-dc-22-2 #x0) rd6 rn6 direction rm6)
  1360. (sequence ()
  1361. (sem-op rn6 rd6 mode sel)
  1362. (if (ifield f-addsubx)
  1363. (set rn6 (sub rn6 rm6))
  1364. (set rn6 (add rn6 rm6)))
  1365. )
  1366. ()
  1367. )
  1368. (dnmi (.sym name "p.l")
  1369. (.str "store " mode " postmodify")
  1370. (NO-DIS)
  1371. (.str name ".l $rd6,[$rn6],$direction$rm6")
  1372. (emit (.sym name "p") rd6 rn6 direction rm6)
  1373. )
  1374. (dni_wrapper (.sym name "d16")
  1375. (.str "store " mode " displacement")
  1376. (SHORT-INSN IMM3)
  1377. (.str name " $rd,[$rn,$disp3]")
  1378. (+ OP4_LDSTR16D sel OP_STORE rd rn disp3) ;; convert size to 'B'
  1379. (sequence ((SI effa)
  1380. (SI scale))
  1381. (ConvertSelectorToShift sel scale)
  1382. (set effa (add rn (sll disp3 scale)))
  1383. (sem-op effa rd mode sel)
  1384. )
  1385. ()
  1386. )
  1387. (dni_wrapper (.sym name "d")
  1388. (.str "store " mode " displacement")
  1389. ()
  1390. (.str name " $rd6,[$rn6,$dpmi$disp11]")
  1391. (+ OP4_LDSTRD sel OP_STORE PMOD_DISP rd6 rn6 dpmi disp11)
  1392. (sequence ((SI effa)
  1393. (SI scale))
  1394. (ConvertSelectorToShift sel scale)
  1395. (if dpmi
  1396. (set effa (sub rn6 (sll disp11 scale)))
  1397. (set effa (add rn6 (sll disp11 scale)))
  1398. )
  1399. (sem-op effa rd6 mode sel)
  1400. )
  1401. ()
  1402. )
  1403. (dnmi (.sym name "d.l")
  1404. (.str "store " mode " displacement")
  1405. (NO-DIS)
  1406. (.str name ".l $rd6,[$rn6,$dpmi$disp11]")
  1407. (emit (.sym name "d") rd6 rn6 dpmi disp11)
  1408. )
  1409. (dni_wrapper (.sym name "dpm")
  1410. (.str "store " mode " displacement post-modify")
  1411. ()
  1412. (.str name " $rd6,[$rn6],$dpmi$disp11")
  1413. (+ OP4_LDSTRD sel OP_STORE PMOD_POST rd6 rn6 dpmi disp11) ;; convert size to 'B'
  1414. (sequence ((SI scale))
  1415. (ConvertSelectorToShift sel scale)
  1416. (sem-op rn6 rd6 mode sel)
  1417. (if dpmi
  1418. (set rn6 (sub rn6 (sll disp11 scale)))
  1419. (set rn6 (add rn6 (sll disp11 scale)))
  1420. )
  1421. )
  1422. ()
  1423. )
  1424. (dnmi (.sym name "dpm.l")
  1425. (.str "store " mode " displacement post-modify")
  1426. (NO-DIS)
  1427. (.str name ".l $rd6,[$rn6],$dpmi$disp11")
  1428. (emit (.sym name "dpm") rd6 rn6 dpmi disp11)
  1429. )
  1430. ;; macro form with a zero displacement
  1431. (dnmi (.sym name "ds0") "store w 0 disp"
  1432. (SHORT-INSN IMM3)
  1433. (.str name " $rd,[$rn]")
  1434. (emit (.sym name "d16") rd rn (disp3 0))
  1435. )
  1436. (dnmi (.sym name "dl0") "store w 0 disp"
  1437. ()
  1438. (.str name " $rd6,[$rn6]")
  1439. (emit (.sym name "d") rd6 rn6 (dpmi 0) (disp11 0))
  1440. )
  1441. (dnmi (.sym name "dl0.l") "store w 0 disp"
  1442. (NO-DIS)
  1443. (.str name ".l $rd6,[$rn6]")
  1444. (emit (.sym name "d") rd6 rn6 (dpmi 0) (disp11 0))
  1445. )
  1446. )
  1447. )
  1448. (store-insn strb QI OPW_BYTE store-to-ea)
  1449. (store-insn strh HI OPW_SHORT store-to-ea)
  1450. (store-insn str SI OPW_WORD store-to-ea)
  1451. (store-insn strd DI OPW_DOUBLE store-double-to-ea)
  1452. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  1453. ;; MOV<COND> RD,RN
  1454. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  1455. (define-pmacro (move-insns name cond g-op)
  1456. (begin
  1457. (dni_wrapper (.sym "cmov16" cond)
  1458. (.str "move register " cond)
  1459. (SHORT-INSN)
  1460. (.str "mov" name " $rd,$rn")
  1461. (+ OP4_FLOW16 (.sym "OPC_" cond) (f-opc-8-1 #x0) (f-dc-9-1 #x0) rd rn)
  1462. (if (g-op)
  1463. (set rd rn))
  1464. ()
  1465. )
  1466. (dni_wrapper (.sym "cmov" cond)
  1467. (.str "move register " cond)
  1468. ()
  1469. (.str "mov" name " $rd6,$rn6")
  1470. (+ OP4_MISC (.sym "OPC_" cond) (f-opc-8-1 #x0) (f-dc-9-1 #x0) (f-opc-19-4 #x2) (f-dc-25-6 #x0) rd6 rn6)
  1471. (if (g-op)
  1472. (set rd6 rn6))
  1473. ()
  1474. )
  1475. (dnmi (.sym "cmov.l" cond)
  1476. (.str "move register " cond)
  1477. (NO-DIS)
  1478. (.str "mov" name ".l $rd6,$rn6")
  1479. (emit (.sym "cmov" cond) rd6 rn6)
  1480. )
  1481. )
  1482. )
  1483. ; basic conditional moves
  1484. (move-insns "eq" EQ (.pmacro () (eq zbit #x1)))
  1485. (move-insns "ne" NE (.pmacro () (eq zbit #x0)))
  1486. (move-insns "gtu" GTU (.pmacro () (and BI cbit (not BI zbit))))
  1487. (move-insns "gteu" GTEU (.pmacro () (eq cbit #x1)))
  1488. (move-insns "lteu" LTEU (.pmacro () (or BI (not BI cbit) zbit)))
  1489. (move-insns "ltu" LTU (.pmacro () (eq cbit #x0)))
  1490. (move-insns "gt" GT (.pmacro () (and BI (not BI zbit) (eq vbit nbit))))
  1491. (move-insns "gte" GTE (.pmacro () (eq vbit nbit)))
  1492. (move-insns "lt" LT (.pmacro () (xor BI vbit nbit)))
  1493. (move-insns "lte" LTE (.pmacro () (or BI zbit (xor vbit nbit))))
  1494. ; unconditional move
  1495. (move-insns "" B (.pmacro () #x1))
  1496. ; floating point condition codes (floating point instructions)
  1497. (move-insns "beq" BEQ (.pmacro () (or BI bzbit bzbit)))
  1498. (move-insns "bne" BNE (.pmacro () (not BI bzbit)))
  1499. (move-insns "blt" BLT (.pmacro () (and BI bnbit (not bzbit))))
  1500. (move-insns "blte" BLTE (.pmacro () (or BI bnbit bzbit)))
  1501. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  1502. ;; MOVTS RD,RN
  1503. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  1504. ;; 16 bits form exists for group zero ( M1 and M0 equals to zero ) only
  1505. (dni_wrapper movts16
  1506. "move to special reg"
  1507. (SHORT-INSN)
  1508. "movts $sn,$rd"
  1509. (+ OP4_FLOW16 (f-opc-8-5 #x10) (f-dc-9-1 #x0) rd sn) ;; rd is source for movts
  1510. (set sn rd)
  1511. ()
  1512. )
  1513. (define-pmacro (op-mmr-movts name sdreg code)
  1514. (begin
  1515. (dni_wrapper (.sym "movts" name)
  1516. (.str "move to " name)
  1517. ()
  1518. (.str "movts $" sdreg ",$rd6")
  1519. (+ OP4_MISC (f-dc-7-4 #x0) (f-opc-8-1 #x1) (f-dc-9-1 #x0) (f-opc-19-4 #x2) (f-dc-25-4 #x0) (f-dc-21-2 code) sdreg rd6);; rd is source for movts
  1520. (set sdreg rd6)
  1521. ()
  1522. )
  1523. (dnmi (.sym "movts.l" name)
  1524. (.str "move to " name)
  1525. (NO-DIS)
  1526. (.str "movts.l $" sdreg ",$rd6")
  1527. (emit (.sym "movts" name) sdreg rd6)
  1528. )
  1529. )
  1530. )
  1531. (op-mmr-movts 6 sn6 #x0)
  1532. (op-mmr-movts dma sndma #x1)
  1533. (op-mmr-movts mem snmem #x2)
  1534. (op-mmr-movts mesh snmesh #x3)
  1535. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  1536. ;; MOVFS
  1537. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  1538. (dni_wrapper movfs16
  1539. "move from special register"
  1540. (SHORT-INSN)
  1541. "movfs $rd,$sn"
  1542. (+ OP4_FLOW16 (f-opc-8-5 #x11) (f-dc-9-1 #x0) rd sn)
  1543. (set rd sn)
  1544. ()
  1545. )
  1546. (define-pmacro (op-mmr-movfs name snreg code)
  1547. (begin
  1548. (dni_wrapper (.sym "movfs" name)
  1549. (.str "move from " name)
  1550. ()
  1551. (.str "movfs $rd6,$" snreg)
  1552. (+ OP4_MISC (f-dc-7-4 #x1) (f-opc-8-1 #x1) (f-dc-9-1 #x0) (f-opc-19-4 #x2) (f-dc-25-4 #x0) (f-dc-21-2 code) rd6 snreg)
  1553. (set rd6 snreg)
  1554. ()
  1555. )
  1556. (dnmi (.sym "movfs.l" name)
  1557. (.str "move from " name)
  1558. (NO-DIS)
  1559. (.str "movfs.l $rd6,$" snreg)
  1560. (emit (.sym "movfs" name) rd6 snreg)
  1561. )
  1562. )
  1563. )
  1564. (op-mmr-movfs 6 sn6 #x0)
  1565. (op-mmr-movfs dma sndma #x1)
  1566. (op-mmr-movfs mem snmem #x2)
  1567. (op-mmr-movfs mesh snmesh #x3)
  1568. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  1569. ;; NOP 0x1a2
  1570. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  1571. (dni_wrapper nop
  1572. "no-operation"
  1573. (SHORT-INSN)
  1574. "nop"
  1575. (+ OP4_FLOW16 (f-opc-8-5 #x1a) (f-dc-15-7 #x0))
  1576. (nop)
  1577. ()
  1578. )
  1579. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  1580. ;; SNOP 0x3a2
  1581. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  1582. (dni_wrapper snop
  1583. "no-operation"
  1584. (SHORT-INSN)
  1585. "snop"
  1586. (+ OP4_FLOW16 (f-opc-8-5 #x3a) (f-dc-15-7 #x0))
  1587. (nop)
  1588. ()
  1589. )
  1590. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  1591. ;; UNIMPL
  1592. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  1593. (dni_wrapper unimpl
  1594. "not-implemented"
  1595. ()
  1596. "unimpl"
  1597. (+ (f-opc-31-32 #x000F000F))
  1598. (nop)
  1599. ()
  1600. )
  1601. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  1602. ;; IDLE
  1603. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  1604. (dni idle "idle until interrupt" () "idle"
  1605. (+ OP4_FLOW16 (f-opc-8-5 #x1b) (f-dc-15-7 #x0))
  1606. ;; (set pc pc) ;; should branch to self until interrupt, but not modeling interrupts
  1607. (sequence ()
  1608. (set caibit 0)
  1609. (c-code "sim_engine_halt (CPU_STATE (current_cpu), current_cpu, NULL, \
  1610. pc, sim_exited, 0);"))
  1611. ()
  1612. )
  1613. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  1614. ;; BKPT
  1615. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  1616. (dni bkpt
  1617. "breakpoint"
  1618. (SHORT-INSN)
  1619. "bkpt"
  1620. (+ OP4_FLOW16 (f-opc-8-5 #x1c) (f-dc-15-7 #x0))
  1621. (sequence ()
  1622. (c-call "epiphany_break" pc)
  1623. (set pc pc)
  1624. )
  1625. ()
  1626. )
  1627. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  1628. ;; MBKPT
  1629. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  1630. (dni mbkpt
  1631. "multicorebreakpoint"
  1632. (SHORT-INSN)
  1633. "mbkpt"
  1634. (+ OP4_FLOW16 (f-opc-8-5 #x1c) (f-dc-15-7 #x1))
  1635. ;;;(c-call "epiphany_break" pc)
  1636. (nop) ;; ignore the multi core break point in the simulator
  1637. ()
  1638. )
  1639. ;;;;;;;;;;;;;;;;
  1640. ;; RTI
  1641. ;;;;;;;;;;;;;;;;
  1642. (dni rti "return from interrupt" (SHORT-INSN UNCOND-CTI)
  1643. "rti"
  1644. (+ OP4_FLOW16 (f-opc-8-5 #x1d) (f-dc-15-7 #x0))
  1645. (sequence ()
  1646. ;; (set (hcr-ipend)
  1647. ;; (xor (hcr-ipend)
  1648. ;; (sll (const 1)
  1649. ;; (sub (c-raw-call SI "ffs" (and (hcr-ipend) (not (hcr-imask))))
  1650. ;; (const 1)))))
  1651. (set (hcr-ipend)
  1652. (c-call SI "epiphany_rti" (hcr-ipend) (hcr-imask)))
  1653. (set gidisablebit 0)
  1654. (set kmbit 0)
  1655. ;(set caibit 1)
  1656. (set pc (hcr-iret)))
  1657. ()
  1658. )
  1659. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  1660. ;; WAND is a wired flag that runs around the chip
  1661. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  1662. (dni_wrapper wand "wand"
  1663. (SHORT-INSN)
  1664. "wand"
  1665. (+ OP4_FLOW16 (f-opc-8-5 #x18) (f-dc-15-7 #x0))
  1666. (set sflagbit 1)
  1667. ()
  1668. )
  1669. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  1670. ;; Sync likes wand, but wired OR
  1671. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  1672. (dni_wrapper sync "sync"
  1673. (SHORT-INSN)
  1674. "sync"
  1675. (+ OP4_FLOW16 (f-opc-8-5 #x1f) (f-dc-15-7 #x0))
  1676. (nop);;TODO
  1677. ()
  1678. )
  1679. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  1680. ;; GIE
  1681. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  1682. (dni_wrapper gien "global interrupt enable"
  1683. (SHORT-INSN)
  1684. "gie"
  1685. (+ OP4_FLOW16 (f-gien-gidis-9-1 #x0) (f-opc-8-5 #x19) (f-dc-15-6 #x0))
  1686. (set gidisablebit 0)
  1687. ()
  1688. )
  1689. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  1690. ;; GIDIS
  1691. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  1692. (dni_wrapper gidis "global interrupt disable"
  1693. (SHORT-INSN)
  1694. "gid"
  1695. (+ OP4_FLOW16 (f-gien-gidis-9-1 #x1) (f-opc-8-5 #x19) (f-dc-15-6 #x0))
  1696. (set gidisablebit 1)
  1697. ()
  1698. )
  1699. ;;;;;;;;;;;;;;;;
  1700. ;; SWI
  1701. ;;;;;;;;;;;;;;;;
  1702. ;; Model only immediate 'fire' exception, if gien cleared or masked don't fire and don't check later - no ilat like behavior
  1703. (dni swi_num "software interrupt" (SHORT-INSN UNCOND-CTI)
  1704. "swi $swi_num"
  1705. (+ OP4_FLOW16 (f-opc-8-5 #x1e) (f-trap-swi-9-1 #x0) swi_num)
  1706. (sequence () (call-exception #x24 #x80))
  1707. ;; (if (eq gie 1)
  1708. ;; (sequence ()
  1709. ;; (set kmbit 1)
  1710. ;; (set gie 0)
  1711. ;; (set (hcr-iret) (add pc (const 2)))
  1712. ;; (set (hcr-ipend) (or (hcr-ipend) (const #x80)))
  1713. ;; (set pc (const #x1c))
  1714. ;; )
  1715. ;; ;; schedule interrupt
  1716. ;; (set (hcr-ilat) (or (hcr-ilat) (const #x80)))
  1717. ;; )
  1718. ()
  1719. )
  1720. (dni swi "software interrupt" (ALIAS SHORT-INSN UNCOND-CTI)
  1721. "swi"
  1722. (+ OP4_FLOW16 (f-opc-8-5 #x1e) (f-trap-swi-9-1 #x0) (f-dc-15-6 #x0))
  1723. (sequence () (call-exception #x24 #x80))
  1724. ()
  1725. )
  1726. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  1727. ;; TRAP #disp3 - simulator only and chip as well - make the same grouop as swi
  1728. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  1729. ;; Only defining 16-bit form of this instruction. It exists to support the
  1730. ;; simulator, by giving us a simple input/output mechanism beyond returning values
  1731. ;; in registers or memory.
  1732. ;; TRAP #N - special sw trap for simulator support; allows simple i/o using fixed arguments
  1733. ;; TRAP #0 - write (r0=i/o channel, r1=addr, r2=len) returns status in r0
  1734. ;; TRAP #1 - read (r0=i/o channel, r1=addr, r2=len) returns length or -<code> on error
  1735. ;; TRAP #2 - open (r0=string path, r1=mode) returns channel# or -<code> on error
  1736. ;; TRAP #3 - exit (r0=status code) never returns.
  1737. ;; TRAP #4 - print "pass\n" and exit
  1738. ;; TRAP #5 - print "fail\n" and exit
  1739. ;; TRAP #6 - close (r0=i/o channel)
  1740. (dni trap16 "trap to simulator"
  1741. (SHORT-INSN UNCOND-CTI)
  1742. "trap $trapnum6"
  1743. (+ OP4_FLOW16 (f-opc-8-5 #x1e) (f-trap-swi-9-1 #x1) trapnum6) ;; (+ OP4_IMM16 OPI_TRAP (f-rd 0) (f-rn 0) disp3)
  1744. (set (reg SI h-registers 0) (c-call SI "epiphany_trap" pc trapnum6))
  1745. ()
  1746. )
  1747. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  1748. ;; Integer arithmetic instructions 3 address forms
  1749. ;; both 16 and 32 bit forms
  1750. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  1751. (define-pmacro (op-rrr name sem-op cond-op)
  1752. (begin
  1753. (dni_wrapper (.sym name "16")
  1754. (.str name)
  1755. (SHORT-INSN)
  1756. (.str name " $rd,$rn,$rm")
  1757. (+ OP4_ALU16 (.sym "OPB_" (.upcase (.str name))) rd rn rm)
  1758. (sequence ()
  1759. (cond-op rn rm)
  1760. (set rd (sem-op SI rn rm))
  1761. (set zbit (zflag rd))
  1762. (set nbit (nflag rd))
  1763. )
  1764. ()
  1765. )
  1766. (dni_wrapper (.sym name)
  1767. (.str name)
  1768. ()
  1769. (.str name " $rd6,$rn6,$rm6")
  1770. (+ OP4_MISC (.sym "OPB_" (.upcase (.str name))) (f-opc-19-4 #xa) (f-dc-22-3 #x0) rd6 rn6 rm6)
  1771. (sequence ()
  1772. (cond-op rn6 rm6)
  1773. (set rd6 (sem-op SI rn6 rm6))
  1774. (set zbit (zflag rd6))
  1775. (set nbit (nflag rd6))
  1776. )
  1777. ()
  1778. )
  1779. (dnmi (.sym name ".l")
  1780. (.str name)
  1781. (NO-DIS)
  1782. (.str name ".l $rd6,$rn6,$rm6")
  1783. (emit (.sym name) rd6 rn6 rm6)
  1784. )
  1785. )
  1786. )
  1787. ;; submacros to set condition codes
  1788. ;; NZ are always set to reflect the sign and value of the result
  1789. ;; CV are a function of the operator
  1790. (define-pmacro (add-vc a b) (sequence ()
  1791. (set cbit (add-cflag SI a b 0))
  1792. (set vbit (add-oflag SI a b 0))
  1793. (set vsbit (or BI vsbit vbit))
  1794. ))
  1795. (define-pmacro (sub-vc a b) (sequence ()
  1796. (set cbit (not (sub-cflag SI a b 0)))
  1797. (set vbit (sub-oflag SI a b 0))
  1798. (set vsbit (or vsbit vbit))
  1799. ))
  1800. (define-pmacro (logic-vc a b) (sequence ()
  1801. (set cbit 0)
  1802. (set vbit 0)
  1803. ))
  1804. (op-rrr add add add-vc)
  1805. (op-rrr sub sub sub-vc)
  1806. (op-rrr and and logic-vc)
  1807. (op-rrr orr or logic-vc)
  1808. (op-rrr eor xor logic-vc)
  1809. ;; Integer arithmetic immediate forms
  1810. (define-pmacro (op-rri name code cond-op)
  1811. (begin
  1812. (dni_wrapper (.sym name "i16")
  1813. (.str name)
  1814. (SHORT-INSN IMM3)
  1815. (.str name ".s $rd,$rn,$simm3")
  1816. (+ OP4_IMM16 code rd rn simm3)
  1817. (sequence ()
  1818. (cond-op rn simm3)
  1819. (set rd (name SI rn simm3))
  1820. (set zbit (zflag rd))
  1821. (set nbit (nflag rd))
  1822. )
  1823. ()
  1824. )
  1825. (dni_wrapper (.sym name "i")
  1826. (.str name)
  1827. ()
  1828. (.str name ".l $rd6,$rn6,$simm11")
  1829. (+ OP4_IMM32 code OPI_25_2_MBZ rd6 rn6 simm11)
  1830. (sequence ()
  1831. (cond-op rn6 simm11)
  1832. (set rd6 (name SI rn6 simm11))
  1833. (set zbit (zflag rd6))
  1834. (set nbit (nflag rd6))
  1835. )
  1836. ()
  1837. )
  1838. ;; (dnmi (.sym name "ri") "relaxed arithmetic immediate" (RELAXED)
  1839. ;; (.str name " $rd6,$rn6,$simm11")
  1840. ;; (emit (.sym name "i") rd6 rn6 simm11))
  1841. )
  1842. )
  1843. (op-rri add OPI_ADD add-vc)
  1844. (op-rri sub OPI_SUB sub-vc)
  1845. (dnmi addir "relaxable short immediate add" (RELAXABLE IMM3)
  1846. "add $rd,$rn,$simm3"
  1847. (emit addi16 rd rn simm3))
  1848. (dnmi addi32r "relaxed long immediate add" (RELAXED)
  1849. "add $rd6,$rn6,$simm11"
  1850. (emit addi rd6 rn6 simm11))
  1851. ;; Again, but not relaxable so that full sized registers are handled
  1852. (dnmi addi32m "relaxed long immediate add" ()
  1853. "add $rd6,$rn6,$simm11"
  1854. (emit addi rd6 rn6 simm11))
  1855. (dnmi subir "relaxable short immediate sub" (RELAXABLE IMM3)
  1856. "sub $rd,$rn,$simm3"
  1857. (emit subi16 rd rn simm3))
  1858. (dnmi subi32r "relaxed long immediate sub" (RELAXED)
  1859. "sub $rd6,$rn6,$simm11"
  1860. (emit subi rd6 rn6 simm11))
  1861. (dnmi subi32m "relaxed long immediate sub" ()
  1862. "sub $rd6,$rn6,$simm11"
  1863. (emit subi rd6 rn6 simm11))
  1864. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  1865. ;; Shift instructions 3 address forms
  1866. ;; both 16 and 32 bit forms
  1867. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  1868. (define-pmacro (shift-rrr name sem-op)
  1869. (begin
  1870. (dni_wrapper (.sym name "16")
  1871. (.str name)
  1872. (SHORT-INSN)
  1873. (.str name " $rd,$rn,$rm")
  1874. (+ OP4_ALU16 (.sym "OPB_" (.upcase (.str name))) rd rn rm)
  1875. (sequence ()
  1876. (logic-vc rn rm)
  1877. (set rd (sem-op SI rn (and rm (const 31))))
  1878. (set zbit (zflag rd))
  1879. (set nbit (nflag rd))
  1880. )
  1881. ()
  1882. )
  1883. (dni_wrapper (.sym name)
  1884. (.str name)
  1885. ()
  1886. (.str name " $rd6,$rn6,$rm6")
  1887. (+ OP4_MISC (.sym "OPB_" (.upcase (.str name))) (f-opc-19-4 #xa) (f-dc-22-3 #x0) rd6 rn6 rm6)
  1888. (sequence ()
  1889. (logic-vc rn6 rm6)
  1890. (set rd6 (sem-op SI rn6 (and rm6 (const 31))))
  1891. (set zbit (zflag rd6))
  1892. (set nbit (nflag rd6))
  1893. )
  1894. ()
  1895. )
  1896. (dnmi (.sym name ".l")
  1897. (.str name)
  1898. (NO-DIS)
  1899. (.str name ".l $rd6,$rn6,$rm6")
  1900. (emit (.sym name) rd6 rn6 rm6)
  1901. )
  1902. )
  1903. )
  1904. (shift-rrr asr sra)
  1905. (shift-rrr lsr srl)
  1906. (shift-rrr lsl sll)
  1907. (define-pmacro (op-shift-rri name shortcode f5 longcode sem-op)
  1908. (begin
  1909. (dni_wrapper (.sym name "i16")
  1910. (.str name)
  1911. (SHORT-INSN)
  1912. (.str name " $rd,$rn,$shift")
  1913. (+ shortcode (f-opc-4-1 f5) rd rn shift)
  1914. (sequence ()
  1915. (logic-vc rn shift)
  1916. (set rd (sem-op SI rn shift))
  1917. (set zbit (zflag rd))
  1918. (set nbit (nflag rd))
  1919. )
  1920. ()
  1921. )
  1922. (dni_wrapper (.sym name "i32")
  1923. (.str name)
  1924. ()
  1925. (.str name " $rd6,$rn6,$shift")
  1926. (+ OP4_MISC (f-opc-4-1 f5) (f-opc-19-4 longcode) (f-dc-25-6 0) rd6 rn6 shift)
  1927. (sequence ()
  1928. (logic-vc rn6 shift)
  1929. (set rd6 (sem-op SI rn6 shift))
  1930. (set zbit (zflag rd6))
  1931. (set nbit (nflag rd6))
  1932. )
  1933. ()
  1934. )
  1935. (dnmi (.sym name "i32.l")
  1936. (.str name)
  1937. (NO-DIS)
  1938. (.str name ".l $rd6,$rn6,$shift")
  1939. (emit (.sym name "i32") rd6 rn6 shift)
  1940. )
  1941. )
  1942. )
  1943. (op-shift-rri lsr OP4_LSHIFT16 0 #x6 srl)
  1944. (op-shift-rri lsl OP4_LSHIFT16 1 #x6 sll)
  1945. (op-shift-rri asr OP4_ASHIFT16 0 #xe sra)
  1946. ;; BITR - bitreversal (FFT)
  1947. ;;
  1948. ;; From Dr Dobbs et al.
  1949. ;;
  1950. ;; unsigned int v;
  1951. ;; v = ((v >> 1) & 0x55555555) | ((v & 0x55555555) << 1); ;; swap odd-even bits
  1952. ;; v = ((v >> 2) & 0x33333333) | ((v & 0x33333333) << 2); ;; swap pairs
  1953. ;; v = ((v >> 4) & 0x0f0f0f0f) | ((v & 0x0f0f0f0f) << 4); ;; swap nibbles
  1954. ;; v = ((v >> 8) & 0x00ff00ff) | ((v & 0x00ff00ff) << 8); ;; swap bytes
  1955. ;; v = (v >> 16) | (v << 16); ;; swap halves
  1956. (define-pmacro (bit-reversal dest src)
  1957. (sequence ((SI v))
  1958. (set v src)
  1959. (set v (or (and (srl v 1) #x55555555) (sll (and v #x55555555) 1)))
  1960. (set v (or (and (srl v 2) #x33333333) (sll (and v #x33333333) 2)))
  1961. (set v (or (and (srl v 4) #x0f0f0f0f) (sll (and v #x0f0f0f0f) 4)))
  1962. (set v (or (and (srl v 8) #x00ff00ff) (sll (and v #x00ff00ff) 8)))
  1963. (set v (or (srl v 16) (sll v 16)))
  1964. (set dest v)
  1965. ))
  1966. (dni_wrapper bitr16 "bit reverse short"
  1967. (SHORT-INSN)
  1968. ("bitr $rd,$rn")
  1969. (+ OP4_ASHIFT16 (f-opc-4-1 1) rd rn (f-shift 0))
  1970. (sequence ()
  1971. (bit-reversal rd rn)
  1972. (set zbit (zflag rd))
  1973. (set nbit (nflag rd))
  1974. (set cbit 0)
  1975. (set vbit 0)
  1976. )
  1977. ()
  1978. )
  1979. (dni_wrapper bitr "bit reverse"
  1980. ()
  1981. ("bitr $rd6,$rn6")
  1982. (+ OP4_MISC (f-opc-4-1 1) (f-opc-19-4 #xe) (f-dc-25-6 0) rd6 rn6 (f-shift 0))
  1983. (sequence ()
  1984. (bit-reversal rd6 rn6)
  1985. (set zbit (zflag rd6))
  1986. (set nbit (nflag rd6))
  1987. (set cbit 0)
  1988. (set vbit 0)
  1989. )
  1990. ()
  1991. )
  1992. (dnmi bitrl "bit reverse l"
  1993. (NO-DIS)
  1994. ("bitr.l $rd6,$rn6")
  1995. (emit bitr rd6 rn6)
  1996. )
  1997. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  1998. ;; Integer arithmetic instructions
  1999. ;; Extended operation
  2000. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  2001. (define-pmacro (op-iextrrr name cond-op)
  2002. (begin
  2003. (dni_wrapper (.sym name)
  2004. (.str name)
  2005. ()
  2006. (.str name " $rd6,$rn6,$rm6")
  2007. (+ OP4_MISC (.sym "OPBE_" (.upcase (.str name))) (f-opc-19-4 #xa) (f-dc-22-2 #x0) (f-dc-20-1 #x1)
  2008. rd6 rn6 rm6)
  2009. (sequence ()
  2010. ;; TODO cond operation (cond-op rn6 rm6)
  2011. ;;(set rd6 (sem-op SI rn6 rm6))
  2012. (set zbit (zflag rd6))
  2013. (set nbit (nflag rd6))
  2014. )
  2015. ()
  2016. )
  2017. (dnmi (.sym name ".l")
  2018. (.str name)
  2019. (NO-DIS)
  2020. (.str name ".l $rd6,$rn6,$rm6")
  2021. (emit (.sym name) rd6 rn6 rm6)
  2022. )
  2023. )
  2024. )
  2025. (op-iextrrr fext sub-vc)
  2026. (op-iextrrr fdep sub-vc)
  2027. (op-iextrrr lfsr sub-vc)
  2028. ;; Immediate moves. The 8 bit form is relaxed if it doesn't fit or is external
  2029. ;; Move RD,#IMM
  2030. (dni_wrapper mov8
  2031. "mov imm8"
  2032. (SHORT-INSN)
  2033. "mov.b $rd,$imm8"
  2034. (+ OP4_IMM16 (f-opc-4-1 #x0) rd imm8)
  2035. (set rd (zext SI imm8))
  2036. ()
  2037. )
  2038. (dnmi mov8r "mov imm8 relaxable"
  2039. (RELAXABLE)
  2040. "mov $rd,$imm8"
  2041. (emit mov8 rd imm8))
  2042. (dni_wrapper mov16
  2043. "mov imm16"
  2044. ()
  2045. "mov.l $rd6,$imm16"
  2046. (+ OP4_IMM32 (f-opc-4-1 #x0) (f-opc-19-4 #x2) (f-dc-28-1 #x0) rd6 imm16)
  2047. (set rd6 (zext SI imm16))
  2048. ()
  2049. )
  2050. (dnmi mov16r "mov imm16 relaxable"
  2051. ()
  2052. "mov $rd6,$imm16"
  2053. (emit mov16 rd6 imm16))
  2054. ;; MOVE TO HIGH WORD
  2055. (dni_wrapper movt
  2056. "movt imm16"
  2057. ()
  2058. "movt $rd6,$imm16"
  2059. (+ OP4_IMM32 (f-opc-4-1 #x0) (f-opc-19-4 #x2) (f-dc-28-1 #x1) rd6 imm16)
  2060. (set rd6 (or (and SI rd6 (const #xffff)) ; keep low bits of rd
  2061. (sll SI imm16 (const 16)))) ; replacing just high bits
  2062. ()
  2063. )
  2064. (dnmi movtl
  2065. "movt imm16"
  2066. (NO-DIS)
  2067. "movt.l $rd6,$imm16"
  2068. (emit movt rd6 imm16)
  2069. )
  2070. ;; FLOATING POINT OPERATIONS
  2071. ;; TWO operands
  2072. (define-pmacro (op-two_operands-float name code)
  2073. (begin
  2074. (dni_wrapper
  2075. (.sym "f_" name "f16")
  2076. (.str "f_" name)
  2077. (SHORT-INSN)
  2078. (.str "f" name " $rd,$rn,$rm")
  2079. (+ OP4_DSP16 code rd rn rm)
  2080. (sequence ()
  2081. (if
  2082. (eq arithmetic-modebit2 0)
  2083. (sequence ((SF fptemp) (SI sdtmp))
  2084. (set sdtmp (c-call SI (.str "epiphany_f" name) rd rn rm))
  2085. ;;All bits are calculated in C
  2086. (set bzbit (c-call BI "get_epiphany_fzeroflag" sdtmp))
  2087. (set bnbit (c-call BI "get_epiphany_fnegativeflag" sdtmp))
  2088. (set bvbit (c-call BI "get_epiphany_foverflowflag" sdtmp))
  2089. (set bubit (c-call BI "get_epiphany_funderflowflag" sdtmp))
  2090. (set bibit (c-call BI "get_epiphany_finvalidflag" sdtmp))
  2091. (set bvsbit (or bvsbit bvbit))
  2092. (set busbit (or busbit bubit))
  2093. (set bisbit (or bisbit bibit))
  2094. (set rd sdtmp)
  2095. (if (or (and invExcEnbit bisbit)
  2096. (or (and ovfExcEnbit bvsbit) (and unExcEnbit busbit)))
  2097. (sequence ()
  2098. (set expcause0bit (const 1))
  2099. (set expcause1bit (const 1))
  2100. (call-exception #x4 #x2)))
  2101. ))
  2102. (if (eq arithmetic-modebit2 1)
  2103. (sequence ((SI sdtmp))
  2104. (set sdtmp (c-call SI (.str "epiphany_i" name) rd rn rm))
  2105. ;; carry is not connected inb the design (set bcbit bcbit)
  2106. (set bzbit (zflag sdtmp))
  2107. (set bnbit (nflag sdtmp))
  2108. (set rd sdtmp)))
  2109. )
  2110. ()
  2111. )
  2112. (dnmi (.sym "i_" name "f16")
  2113. (.str "i_" name)
  2114. (SHORT-INSN NO-DIS)
  2115. (.str "i" name " $rd,$rn,$rm")
  2116. (emit (.sym "f_" name "f16") rd rn rm)
  2117. )
  2118. (dni_wrapper
  2119. (.sym "f_" name "f32")
  2120. (.str "f_" name)
  2121. ()
  2122. (.str "f" name " $rd6,$rn6,$rm6")
  2123. (+ OP4_MISC code (f-opc-19-4 #x7) (f-dc-22-3 #x0) rd6 rn6 rm6)
  2124. (sequence ()
  2125. (if
  2126. (eq arithmetic-modebit2 0)
  2127. (sequence ((SF fptemp) (SI sdtmp))
  2128. (set sdtmp (c-call SI (.str "epiphany_f" name) rd6 rn6 rm6))
  2129. ;;All bits are calculated in C
  2130. (set bzbit (c-call BI "get_epiphany_fzeroflag" sdtmp))
  2131. (set bnbit (c-call BI "get_epiphany_fnegativeflag" sdtmp))
  2132. (set bvbit (c-call BI "get_epiphany_foverflowflag" sdtmp))
  2133. (set bubit (c-call BI "get_epiphany_funderflowflag" sdtmp))
  2134. (set bibit (c-call BI "get_epiphany_finvalidflag" sdtmp))
  2135. (set bvsbit (or bvsbit bvbit))
  2136. (set busbit (or busbit bubit))
  2137. (set bisbit (or bisbit bibit))
  2138. (set rd6 sdtmp)
  2139. (if (or (and invExcEnbit bisbit)
  2140. (or (and ovfExcEnbit bvsbit) (and unExcEnbit busbit)))
  2141. (sequence ()
  2142. (set expcause0bit (const 1))
  2143. (set expcause1bit (const 1))
  2144. (call-exception #x4 #x2)))
  2145. )
  2146. )
  2147. (if (eq arithmetic-modebit2 1)
  2148. (sequence ((SI sdtmp))
  2149. (set sdtmp (c-call SI (.str "epiphany_i" name) rd6 rn6 rm6))
  2150. ;; carry is not connected inb the design (set bcbit bcbit)
  2151. (set bzbit (zflag sdtmp))
  2152. (set bnbit (nflag sdtmp))
  2153. (set rd6 sdtmp)
  2154. )
  2155. )
  2156. )
  2157. ()
  2158. )
  2159. (dnmi (.sym "f_" name "f32.l")
  2160. (.str "f_" name)
  2161. (NO-DIS)
  2162. (.str "f" name ".l $rd6,$rn6,$rm6")
  2163. (emit (.sym "f_" name "f32") rd6 rn6 rm6)
  2164. )
  2165. (dnmi (.sym "i_" name "f32")
  2166. (.str "i_" name)
  2167. (NO-DIS)
  2168. (.str "i" name " $rd6,$rn6,$rm6")
  2169. (emit (.sym "f_" name "f32") rd6 rn6 rm6)
  2170. )
  2171. (dnmi (.sym "i_" name "f32.l")
  2172. (.str "i_" name)
  2173. (NO-DIS)
  2174. (.str "i" name ".l $rd6,$rn6,$rm6")
  2175. (emit (.sym "f_" name "f32") rd6 rn6 rm6)
  2176. )
  2177. )
  2178. )
  2179. (op-two_operands-float add OPF_ADD)
  2180. (op-two_operands-float sub OPF_SUB)
  2181. (op-two_operands-float mul OPF_MUL)
  2182. (op-two_operands-float madd OPF_MADD)
  2183. (op-two_operands-float msub OPF_MSUB)
  2184. ;; ONE operands
  2185. ;; FABS
  2186. (define-pmacro (op-fabs-float name code)
  2187. (begin
  2188. (dni_wrapper (.sym "f_" name "f16")
  2189. (.str "f_" name)
  2190. (SHORT-INSN)
  2191. (.str "f" name " rd,rn")
  2192. (+ OP4_DSP16 code rd rn rn)
  2193. (sequence ((SF fptemp) (SI sdtmp))
  2194. ;(set sdtmp (and rn #x7fffffff))
  2195. (set sdtmp (c-call SI (.str "epiphany_fabs") rd rn rn))
  2196. (set bnbit (const SI 0))
  2197. (set bzbit (eq SI sdtmp (const SI 0)))
  2198. ;;TODO subnormal ??
  2199. (set bvsbit (or bvsbit bvbit))
  2200. (set busbit (or busbit bubit))
  2201. (set bisbit (or bisbit bibit))
  2202. (set rd sdtmp)
  2203. )
  2204. ()
  2205. )
  2206. (dni_wrapper (.sym "f_" name "f32")
  2207. (.str "f_" name)
  2208. ()
  2209. (.str "f" name " $rd6,$rn6")
  2210. (+ OP4_MISC code (f-opc-19-4 #x7) (f-dc-22-3 #x0) rd6 rn6 rn6)
  2211. (sequence ((SF fptemp) (SI sdtmp))
  2212. ;(set sdtmp (and rn6 #x7fffffff))
  2213. (set sdtmp (c-call SI (.str "epiphany_fabs") rd6 rn6 rn6))
  2214. (set bnbit (const SI 0))
  2215. (set bzbit (eq SI sdtmp (const SI 0)))
  2216. (set bvsbit (or bvsbit bvbit))
  2217. (set busbit (or busbit bubit))
  2218. (set bisbit (or bisbit bibit))
  2219. (set rd6 sdtmp)
  2220. )
  2221. ()
  2222. )
  2223. (dnmi (.sym "f_" name "f32.l")
  2224. (.str "f_" name)
  2225. (NO-DIS)
  2226. (.str "f" name ".l $rd6,$rn6")
  2227. (emit (.sym "f_" name "f32") rd6 rn6)
  2228. )
  2229. )
  2230. )
  2231. (op-fabs-float abs OPF_FABS)
  2232. (define-pmacro (op-fix2float-float name code)
  2233. (begin
  2234. (dni_wrapper (.sym "f_" name "f16")
  2235. (.str "f_" name)
  2236. (SHORT-INSN)
  2237. (.str "f" name " $rd,$rn")
  2238. (+ OP4_DSP16 code frd frn frn)
  2239. (sequence ((SF fptemp) (SI sdtmp))
  2240. (set sdtmp (c-call SI (.str "epiphany_f" name) rd rn rn))
  2241. (set bnbit (lt SI sdtmp (const SI 0)))
  2242. (set bzbit (eq SI sdtmp (const SI 0)))
  2243. (set bvsbit (or bvsbit bvbit))
  2244. (set busbit (or busbit bubit))
  2245. (set bisbit (or bisbit bibit))
  2246. (set rd sdtmp)
  2247. )
  2248. ()
  2249. )
  2250. (dni_wrapper (.sym "f_" name "f32")
  2251. (.str "f_" name)
  2252. ()
  2253. (.str "f" name " $rd6,$rn6")
  2254. (+ OP4_MISC code (f-opc-19-4 #x7) (f-dc-22-3 #x0) rd6 rn6 rn6)
  2255. (sequence ((SF fptemp) (SI sdtmp))
  2256. (set sdtmp (c-call SI (.str "epiphany_f" name) rd6 rn6 rn6))
  2257. (set bnbit (lt SI sdtmp (const SI 0)))
  2258. (set bzbit (eq SI sdtmp (const SI 0)))
  2259. (set bvsbit (or bvsbit bvbit))
  2260. (set busbit (or busbit bubit))
  2261. (set bisbit (or bisbit bibit))
  2262. (set rd6 sdtmp)
  2263. )
  2264. ()
  2265. )
  2266. (dnmi (.sym "f_" name "f32.l")
  2267. (.str "f_" name)
  2268. (NO-DIS)
  2269. (.str "f" name ".l $rd6,$rn6")
  2270. (emit (.sym "f_" name "f32") rd6 rn6)
  2271. )
  2272. )
  2273. )
  2274. (op-fix2float-float loat OPF_FLOAT)
  2275. (define-pmacro (op-float2fix-float name code)
  2276. (begin
  2277. (dni_wrapper (.sym "f_" name "f16")
  2278. (.str "f_" name)
  2279. (SHORT-INSN)
  2280. (.str "f" name " $rd,$rn")
  2281. (+ OP4_DSP16 code rd rn rn)
  2282. (sequence ((SF fptemp) (SI sdtmp))
  2283. (set sdtmp (c-call SI (.str "epiphany_f" name) rd rn rn))
  2284. (set bzbit (zflag sdtmp))
  2285. (set bnbit (nflag sdtmp))
  2286. (set bvbit (c-call BI "get_epiphany_foverflowflag" sdtmp))
  2287. (set bubit (c-call BI "get_epiphany_funderflowflag" sdtmp))
  2288. (set bibit (c-call BI "get_epiphany_finvalidflag" sdtmp))
  2289. (set bvsbit (or bvsbit bvbit))
  2290. (set busbit (or busbit bubit))
  2291. (set bisbit (or bisbit bibit))
  2292. (set rd6 sdtmp)
  2293. (if (or (and invExcEnbit bisbit)
  2294. (or (and ovfExcEnbit busbit)
  2295. (and unExcEnbit bvsbit)))
  2296. (sequence ()
  2297. (set expcause0bit (const 1))
  2298. (set expcause1bit (const 1))
  2299. (call-exception #x4 #x2)))
  2300. (set rd sdtmp)
  2301. )
  2302. ()
  2303. )
  2304. (dni_wrapper (.sym "f_" name "f32")
  2305. (.str "f_" name)
  2306. ()
  2307. (.str "f" name " $rd6,$rn6")
  2308. (+ OP4_MISC code (f-opc-19-4 #x7) (f-dc-22-3 #x0) rd6 rn6 rn6)
  2309. (sequence ((SF fptemp) (SI sdtmp))
  2310. (set sdtmp (c-call SI (.str "epiphany_f" name) rd6 rn6 rm6))
  2311. (set bzbit (zflag sdtmp))
  2312. (set bnbit (nflag sdtmp))
  2313. (set bvbit (c-call BI "get_epiphany_foverflowflag" sdtmp))
  2314. (set bubit (c-call BI "get_epiphany_funderflowflag" sdtmp))
  2315. (set bibit (c-call BI "get_epiphany_finvalidflag" sdtmp))
  2316. (set bvsbit (or bvsbit bvbit))
  2317. (set busbit (or busbit bubit))
  2318. (set bisbit (or bisbit bibit))
  2319. (set rd6 sdtmp)
  2320. (if (or (and invExcEnbit bisbit)
  2321. (or (and ovfExcEnbit busbit)
  2322. (and unExcEnbit bvsbit)))
  2323. (sequence ()
  2324. (set expcause0bit (const 1))
  2325. (set expcause1bit (const 1))
  2326. (call-exception #x4 #x2))
  2327. )
  2328. )
  2329. ()
  2330. )
  2331. (dnmi (.sym "f_" name "f32.l")
  2332. (.str "f_" name)
  2333. (NO-DIS)
  2334. (.str "f" name ".l $rd6,$rn6")
  2335. (emit (.sym "f_" name "f32") rd6 rn6)
  2336. )
  2337. )
  2338. )
  2339. (op-float2fix-float ix OPF_FIX)
  2340. ;; MAC (Multiply and Accumulate Instructions
  2341. ;; (define-pmacro (op-mac-float name code)
  2342. ;; (begin
  2343. ;; (dni_wrapper (.sym "fm" name "f16")
  2344. ;; (.str "fm" name)
  2345. ;; (SHORT-INSN)
  2346. ;; (.str "fm" name " $frd,$frn,$frm")
  2347. ;; (+ OP4_DSP16 code frd frn frm)
  2348. ;; (sequence ((SF fptemp))
  2349. ;; (set bvbit 0)
  2350. ;; (set busbit 0)
  2351. ;; (set fptemp (c-call SF (.str "epiphany_fm" name) frd frm frn))
  2352. ;; (set bnbit (lt SF fptemp (const SF 0)))
  2353. ;; (set bzbit (eq SF fptemp (const SF 0)))
  2354. ;; (set bvsbit (or bvsbit bvbit))
  2355. ;; (set frd fptemp)
  2356. ;; ; (set rd (subword SI frd 0))
  2357. ;; )
  2358. ;; ()
  2359. ;; )
  2360. ;; (dni_wrapper (.sym "fm" name "f32")
  2361. ;; (.str "fm" name)
  2362. ;; ()
  2363. ;; (.str "fm" name " $frd6,$frn6,$frm6")
  2364. ;; (+ OP4_MISC code (f-opc-19-4 #x7) (f-dc-22-3 #x0) frd6 frn6 frm6)
  2365. ;; (sequence ((SF fptemp))
  2366. ;; (set bvbit 0)
  2367. ;; (set busbit 0)
  2368. ;; (set fptemp (c-call SF (.str "epiphany_fm" name) frd6 frm6 frn6))
  2369. ;; (set bnbit (lt SF fptemp (const SF 0)))
  2370. ;; (set bzbit (eq SF fptemp (const SF 0)))
  2371. ;; (set bvsbit (or bvsbit bvbit))
  2372. ;; (set frd6 fptemp)
  2373. ;; ; (set rd6 (subword SI frd6 0))
  2374. ;; )
  2375. ;; ()
  2376. ;; )
  2377. ;; )
  2378. ;; )
  2379. ; extended floating point operation
  2380. (define-pmacro (op-fextop-float name code)
  2381. (begin
  2382. (dni_wrapper (.sym "f_" name "f32")
  2383. (.str "f_" name)
  2384. ()
  2385. (.str "f" name " $frd6,$frn6")
  2386. (+ OP4_MISC code (f-opc-19-4 #x7) (f-dc-22-2 #x0) (f-dc-20-1 #x1) frd6 frn6 frn6)
  2387. (sequence ((SF fptemp))
  2388. (set bvbit 0)
  2389. (set busbit 0)
  2390. (set fptemp (c-call SF (.str "epiphany_f" name) frn6))
  2391. (set bnbit (lt SF fptemp (const SF 0)))
  2392. (set bzbit (eq SF fptemp (const SF 0)))
  2393. (set bvsbit (or bvsbit bvbit))
  2394. (set frd6 fptemp)
  2395. )
  2396. ()
  2397. )
  2398. (dnmi (.sym "f_" name "f32.l")
  2399. (.str "f_" name)
  2400. (NO-DIS)
  2401. (.str "f" name ".l $frd6,$frn6")
  2402. (emit (.sym "f_" name "f32") frd6 frn6)
  2403. )
  2404. )
  2405. )
  2406. (op-fextop-float recip OPF_FRECIP)
  2407. (op-fextop-float sqrt OPF_FSQRT)