123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965 |
- ; xstormy16 CPU core description. -*- Scheme -*-
- ; Copyright 2011 Free Software Foundation, Inc.
- ;
- ; Contributed by Red Hat Inc;
- ;
- ; This file is part of the GNU Binutils.
- ;
- ; This program is free software; you can redistribute it and/or modify
- ; it under the terms of the GNU General Public License as published by
- ; the Free Software Foundation; either version 3 of the License, or
- ; (at your option) any later version.
- ;
- ; This program is distributed in the hope that it will be useful,
- ; but WITHOUT ANY WARRANTY; without even the implied warranty of
- ; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- ; GNU General Public License for more details.
- ;
- ; You should have received a copy of the GNU General Public License
- ; along with this program; if not, write to the Free Software
- ; Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
- ; MA 02110-1301, USA.
- (define-rtl-version 0 8)
- (include "simplify.inc")
- (define-arch
- (name xstormy16)
- (comment "Xstormy16 architecture")
- (insn-lsb0? #f)
- (machs xstormy16)
- (isas xstormy16)
- )
- (define-isa
- (name xstormy16)
- (comment "Xstormy16 instruction set")
- (default-insn-word-bitsize 32)
- (default-insn-bitsize 32)
- ; FIXME base-insn-bitsize should be 16 too, but at present CGEN has
- ; no support for instruction sets with opcode bits past
- ; base-insn-bitsize, so we must set it to at least 20.
- (base-insn-bitsize 32)
- )
- (define-cpu
- (name xstormy16)
- (comment "Xstormy16 CPU core")
- (endian little)
- (insn-endian little)
- (insn-chunk-bitsize 16)
- (word-bitsize 32)
- )
- (define-mach
- (name xstormy16)
- (comment "Xstormy16 CPU core")
- (cpu xstormy16)
- (isas xstormy16)
- )
- (define-model
- (name xstormy16)
- (comment "Xstormy16 CPU core")
- (unit u-exec "Execution Unit" ()
- 1 1 ; issue done
- () () () ())
- )
- ; IDOC attribute for instruction documentation.
- (define-attr
- (for insn)
- (type enum)
- (name IDOC)
- (comment "insn kind for documentation")
- (attrs META)
- (values
- (MEM - () "Memory")
- (ALU - () "ALU")
- (FPU - () "FPU")
- (BR - () "Branch")
- (PRIV - () "Priviledged")
- (MISC - () "Miscellaneous")
- )
- )
- ; Hardware elements.
- (define-hardware
- (name h-pc)
- (comment "program counter")
- (attrs PC)
- (type pc)
- (set (newval) (c-call "h_pc_set_handler" newval))
- )
- (define-keyword
- (name gr-names)
- (enum-prefix H-GR-)
- (values (r0 0) (r1 1) (r2 2) (r3 3)
- (r4 4) (r5 5) (r6 6) (r7 7)
- (r8 8) (r9 9) (r10 10) (r11 11)
- (r12 12) (r13 13) (r14 14) (r15 15)
- (psw 14) (sp 15)))
- (define-keyword
- (name gr-Rb-names)
- (enum-prefix H-RBJ-)
- (values (r8 0) (r9 1) (r10 2) (r11 3)
- (r12 4) (r13 5) (r14 6) (r15 7)
- (psw 6) (sp 7)))
- (define-hardware
- (name h-gr)
- (comment "registers")
- (type register WI (16))
- (indices extern-keyword gr-names)
- (get (index) (and #xFFFF (raw-reg h-gr index)))
- (set (index newval) (c-call "h_gr_set_handler" index newval))
- )
- (define-hardware
- (name h-Rb)
- (comment "Rb registers")
- (attrs VIRTUAL)
- (type register SI(8))
- (indices extern-keyword gr-Rb-names)
- (get (index) (reg h-gr (add index 8)))
- (set (index newval) (set (reg h-gr (add index 8)) newval))
- )
- (define-hardware
- (name h-Rbj)
- (comment "Rbj registers")
- (attrs VIRTUAL)
- (type register SI(2))
- (indices extern-keyword gr-Rb-names)
- (get (index) (reg h-gr (add index 8)))
- (set (index newval) (set (reg h-gr (add index 8)) newval))
- )
- (define-hardware
- (name h-Rpsw)
- (comment "Register number field of the PSW")
- (attrs VIRTUAL)
- (type register WI)
- (get () (and #xF (srl psw 12)))
- (set (newval) (set psw (or (and psw #xFFF)
- (sll HI newval 12)))))
- (define-pmacro (define-psw-field fnam hnam index)
- (define-hardware
- (name hnam)
- (attrs VIRTUAL)
- (type register SI)
- (get () (and 1 (srl psw index)))
- (set (newval) (set psw (or (and psw (inv (sll HI 1 index)))
- (sll HI newval index)))))
- ;(dnop fnam "" (SEM-ONLY) hnam f-nil)
- )
- (define-psw-field psw-z8 h-z8 0)
- (dnop psw-z8 "" (SEM-ONLY) h-z8 f-nil)
- (define-psw-field psw-z16 h-z16 1)
- (dnop psw-z16 "" (SEM-ONLY) h-z16 f-nil)
- (define-psw-field psw-cy h-cy 2)
- (dnop psw-cy "" (SEM-ONLY) h-cy f-nil)
- (define-psw-field psw-hc h-hc 3)
- (dnop psw-hc "" (SEM-ONLY) h-hc f-nil)
- (define-psw-field psw-ov h-ov 4)
- (dnop psw-ov "" (SEM-ONLY) h-ov f-nil)
- (define-psw-field psw-pt h-pt 5)
- (dnop psw-pt "" (SEM-ONLY) h-pt f-nil)
- (define-psw-field psw-s h-s 6)
- (dnop psw-s "" (SEM-ONLY) h-s f-nil)
- (define-hardware
- (name h-branchcond)
- (comment "Condition of a branch instruction")
- (type immediate (UINT 4))
- (values keyword ""
- (("ge" 0) ("nc" 1) ("lt" 2) ("c" 3)
- ("gt" 4) ("hi" 5) ("le" 6) ("ls" 7)
- ("pl" 8) ("nv" 9) ("mi" 10) ("v" 11)
- ("nz.b" 12) ("nz" 13) ("z.b" 14) ("z" 15)))
- )
- (define-hardware
- (name h-wordsize)
- (comment "Data size")
- (type immediate (UINT 1))
- (values keyword "" ((".b" 0) (".w" 1) ("" 1)))
- )
-
- ; Instruction fields, and the corresponding operands.
- ; Register fields
- (dnf f-Rd "general register destination" () 12 4)
- (dnop Rd "general register destination" () h-gr f-Rd)
- (dnf f-Rdm "general register destination" () 13 3)
- (dnop Rdm "general register destination" () h-gr f-Rdm)
- (dnf f-Rm "general register for memory" () 4 3)
- (dnop Rm "general register for memory" () h-gr f-Rm)
- (dnf f-Rs "general register source" () 8 4)
- (dnop Rs "general register source" () h-gr f-Rs)
- (dnf f-Rb "base register" () 17 3)
- (dnop Rb "base register" () h-Rb f-Rb)
- (dnf f-Rbj "base register for jump" () 11 1)
- (dnop Rbj "base register for jump" () h-Rbj f-Rbj)
- ; Main opcodes in 4 bit chunks
- (dnf f-op1 "opcode" () 0 4)
- (define-normal-insn-enum insn-op1 "insn op enums" () OP1_ f-op1
- ( "0" "1" "2" "3" "4" "5" "6" "7" "8" "9" "A" "B" "C" "D" "E" "F" ))
- (dnf f-op2 "opcode" () 4 4)
- (define-normal-insn-enum insn-op2 "insn op enums" () OP2_ f-op2
- ( "0" "1" "2" "3" "4" "5" "6" "7" "8" "9" "A" "B" "C" "D" "E" "F" ))
- (dnop bcond2 "branch condition opcode" () h-branchcond f-op2)
- (dnf f-op2a "opcode" () 4 3)
- (define-normal-insn-enum insn-op2a "insn op enums" () OP2A_ f-op2a
- ( "0" "2" "4" "6" "8" "A" "C" "E" ))
- (dnf f-op2m "opcode" () 7 1)
- (define-normal-insn-enum insn-op2m "insn op enums" () OP2M_ f-op2m
- ( "0" "1" ))
- (dnop ws2 "word size opcode" () h-wordsize f-op2m)
- (dnf f-op3 "opcode" () 8 4)
- (define-normal-insn-enum insn-op3 "insn op enums" () OP3_ f-op3
- ( "0" "1" "2" "3" "4" "5" "6" "7" "8" "9" "A" "B" "C" "D" "E" "F" ))
- (dnf f-op3a "opcode" () 8 2)
- (define-normal-insn-enum insn-op3a "insn op enums" () OP3A_ f-op3a
- ( "0" "1" "2" "3" ))
- (dnf f-op3b "opcode" () 8 3)
- (define-normal-insn-enum insn-op3b "insn op enums" () OP3B_ f-op3b
- ( "0" "2" "4" "6" "8" "A" "C" "E" ))
- (dnf f-op4 "opcode" () 12 4)
- (define-normal-insn-enum insn-op4 "insn op enums" () OP4_ f-op4
- ( "0" "1" "2" "3" "4" "5" "6" "7" "8" "9" "A" "B" "C" "D" "E" "F" ))
- (dnf f-op4m "opcode" () 12 1)
- (define-normal-insn-enum insn-op4m "insn op enums" () OP4M_ f-op4m
- ( "0" "1" ))
- (dnf f-op4b "opcode" () 15 1)
- (define-normal-insn-enum insn-op4b "insn op enums" () OP4B_ f-op4b
- ( "0" "1" ))
- (dnf f-op5 "opcode" () 16 4)
- (define-normal-insn-enum insn-op5 "insn op enums" () OP5_ f-op5
- ( "0" "1" "2" "3" "4" "5" "6" "7" "8" "9" "A" "B" "C" "D" "E" "F" ))
- (dnop bcond5 "branch condition opcode" () h-branchcond f-op5)
- (dnf f-op5a "opcode" () 16 1)
- (define-normal-insn-enum insn-op5a "insn op enums" () OP5A_ f-op5a
- ( "0" "1" ))
- ; The whole first word
- (dnf f-op "opcode" () 0 16)
- ; Immediate fields
- (dnf f-imm2 "2 bit unsigned" () 10 2)
- (dnop imm2 "2 bit unsigned immediate" () h-uint f-imm2)
- (dnf f-imm3 "3 bit unsigned" () 4 3)
- (dnop imm3 "3 bit unsigned immediate" () h-uint f-imm3)
- (dnf f-imm3b "3 bit unsigned for bit tests" () 17 3)
- (dnop imm3b "3 bit unsigned immediate for bit tests" () h-uint f-imm3b)
- (dnf f-imm4 "4 bit unsigned" () 8 4)
- (define-operand
- (name imm4)
- (comment "4 bit unsigned immediate")
- (attrs)
- (type h-uint)
- (index f-imm4)
- (handlers (parse "small_immediate"))
- )
- (dnf f-imm8 "8 bit unsigned" () 8 8)
- (dnop imm8 "8 bit unsigned immediate" () h-uint f-imm8)
- (define-operand
- (name imm8small)
- (comment "8 bit unsigned immediate")
- (attrs)
- (type h-uint)
- (index f-imm8)
- (handlers (parse "small_immediate"))
- )
- (define-ifield
- (name f-imm12)
- (comment "12 bit signed")
- (attrs)
- (start 20)
- (length 12)
- (mode INT)
- )
- (dnop imm12 "12 bit signed immediate" () h-sint f-imm12)
- (dnf f-imm16 "16 bit" (SIGN-OPT) 16 16)
- (define-operand
- (name imm16)
- (comment "16 bit immediate")
- (attrs)
- (type h-uint)
- (index f-imm16)
- (handlers (parse "immediate16"))
- )
- (dnf f-lmem8 "8 bit unsigned low memory" (ABS-ADDR) 8 8)
- (define-operand
- (name lmem8)
- (comment "8 bit unsigned immediate low memory")
- (attrs)
- (type h-uint)
- (index f-lmem8)
- (handlers (parse "mem8"))
- )
- (define-ifield
- (name f-hmem8)
- (comment "8 bit unsigned high memory")
- (attrs ABS-ADDR)
- (start 8)
- (length 8)
- (mode UINT)
- (encode (value pc) (sub HI value #x7F00))
- (decode (value pc) (add HI value #x7F00))
- )
- (define-operand
- (name hmem8)
- (comment "8 bit unsigned immediate high memory")
- (attrs)
- (type h-uint)
- (index f-hmem8)
- (handlers (parse "mem8"))
- )
- (define-ifield
- (name f-rel8-2)
- (comment "8 bit relative address for 2-byte instruction")
- (attrs PCREL-ADDR)
- (start 8)
- (length 8)
- (mode INT)
- (encode (value pc) (sub SI value (add SI pc 2)))
- (decode (value pc) (add SI value (add SI pc 2)))
- )
- (dnop rel8-2 "8 bit relative address" () h-uint f-rel8-2)
- (define-ifield
- (name f-rel8-4)
- (comment "8 bit relative address for 4-byte instruction")
- (attrs PCREL-ADDR)
- (start 8)
- (length 8)
- (mode INT)
- (encode (value pc) (sub SI value (add SI pc 4)))
- (decode (value pc) (add SI value (add SI pc 4)))
- )
- (dnop rel8-4 "8 bit relative address" () h-uint f-rel8-4)
- (define-ifield
- (name f-rel12)
- (comment "12 bit relative address")
- (attrs PCREL-ADDR)
- (start 20)
- (length 12)
- (mode INT)
- (encode (value pc) (sub SI value (add SI pc 4)))
- (decode (value pc) (add SI value (add SI pc 4)))
- )
- (dnop rel12 "12 bit relative address" () h-uint f-rel12)
- (define-ifield
- (name f-rel12a)
- (comment "12 bit relative address")
- (attrs PCREL-ADDR)
- (start 4)
- (length 11)
- (mode INT)
- (encode (value pc) (sra SI (sub SI value (add SI pc 2)) 1))
- (decode (value pc) (add SI (mul value 2) (add SI pc 2)))
- )
- (dnop rel12a "12 bit relative address" () h-uint f-rel12a)
- (dnf f-abs24-1 "abs24 low part" () 8 8)
- (dnf f-abs24-2 "abs24 high part" () 16 16)
- (define-multi-ifield
- (name f-abs24)
- (comment "Absolute address for jmpf instruction")
- (attrs ABS-ADDR)
- (mode UINT)
- (subfields f-abs24-1 f-abs24-2)
- (insert (sequence ()
- (set (ifield f-abs24-1) (and (ifield f-abs24) #xFF))
- (set (ifield f-abs24-2) (srl (ifield f-abs24) 8))))
- (extract (set (ifield f-abs24) (or (sll (ifield f-abs24-2) 8) f-abs24-1)))
- )
- (dnop abs24 "24 bit absolute address" () h-uint f-abs24)
- ; Names for registers
- (dnop psw "program status word" (SEM-ONLY) h-gr 14)
- (dnop Rpsw "N0-N3 of the program status word" (SEM-ONLY) h-Rpsw f-nil)
- (dnop sp "stack pointer" (SEM-ONLY) h-gr 15)
- (dnop R0 "R0" (SEM-ONLY) h-gr 0)
- (dnop R1 "R1" (SEM-ONLY) h-gr 1)
- (dnop R2 "R2" (SEM-ONLY) h-gr 2)
- (dnop R8 "R8" (SEM-ONLY) h-gr 8)
- ; Useful macros.
- ; THe Z8, Z16, PT, and S flags of the PSW.
- (define-pmacro (basic-psw value ws)
- (or (or (zflag (and value #xFF))
- (sll HI (zflag HI value) 1))
- (or (sll HI (c-call BI "parity" value) 5)
- (sll HI (nflag QI (srl value (mul ws 8))) 6))))
- ; Update the PSW for destination register Rd, set Rd to value.
- (define-pmacro (set-psw Rd index value ws)
- (sequence ((HI nvalue))
- (set nvalue value)
- (set (reg HI h-gr index) nvalue)
- (set psw (or (and psw #x0F9C)
- (or (sll index 12)
- (basic-psw nvalue ws))))))
- ; Update the PSW for destination register Rd.
- (define-pmacro (set-psw-nowrite index value ws)
- (sequence ((HI nvalue))
- (set nvalue value)
- (set psw (or (and psw #x0F9C)
- (or (sll index 12)
- (basic-psw nvalue ws))))))
- ; Update the PSW for destination non-register dest, set dest to value.
- (define-pmacro (set-mem-psw dest value ws)
- (sequence ((HI nvalue))
- (set nvalue value)
- (set psw (or (and psw #xFF9C)
- (basic-psw nvalue ws)))
- (set dest nvalue)))
- ; Update the PSW as with set-psw, but also set the carry flag.
- (define-pmacro (set-psw-carry Rd index value carry ws)
- (sequence ((HI nvalue) (HI newpsw))
- (set nvalue value)
- (set newpsw (or (or (and psw #x0F98)
- (sll (and carry #x1) 2))
- (or (sll index 12)
- (basic-psw nvalue ws))))
- (set (reg HI h-gr index) nvalue)
- (set psw newpsw)
- ))
- ; The all-purpose addition operation.
- (define-pmacro (set-psw-add Rd index a b c)
- (sequence ((HI value) (HI newpsw))
- (set value (addc a b c))
- (set newpsw (or (or (and psw #x0F80)
- (basic-psw value 1))
- (or (or (sll HI (add-oflag HI a b c) 4)
- (sll HI (add-cflag HI a b c) 2))
- (or (and (srl HI (addc HI (and a #xF) (and b #xF) c)
- 1) #x8)
- (sll index 12)))))
- (set (reg HI h-gr index) value)
- (set psw newpsw)
- ))
- ; Set the PSW for a subtraction of a-b into Rd, but don't actually
- ; do the subtract.
- (define-pmacro (set-psw-cmp Rd index a b)
- (sequence ((HI value))
- (set value (sub a b))
- (set psw (or (or (and psw #x0F80)
- (basic-psw value 1))
- (or (or (sll HI (sub-oflag HI a b 0) 4)
- (sll HI (sub-cflag HI a b 0) 2))
- (or (and (srl HI (sub HI (and a #xF) (and b #xF))
- 1) #x8)
- (sll index 12)))))))
- ; Likewise, for subtraction
- ; (this chip has a borrow for subtraction, rather than
- ; just using a carry for both).
- (define-pmacro (set-psw-sub Rd index a b c)
- (sequence ((HI value) (HI newpsw))
- (set value (subc a b c))
- (set newpsw (or (or (and psw #x0F80)
- (basic-psw value 1))
- (or (or (sll HI (sub-oflag HI a b c) 4)
- (sll HI (sub-cflag HI a b c) 2))
- (or (and (srl HI (subc HI (and a #xF) (and b #xF) c)
- 1) #x8)
- (sll index 12)))))
- (set (reg HI h-gr index) value)
- (set psw newpsw)
- ))
- ; A 17-bit rotate-left operation
- (define-pmacro (set-psw-rotate17 Rd index src c rot)
- (sequence ((SI tmpfoo))
- (set tmpfoo (or (or (and (sll SI src 15) #x7FFE0000)
- src)
- (or (sll SI c 31)
- (sll SI c 16))))
- (set tmpfoo (rol tmpfoo (and rot #x1F)))
- (set-psw-carry (reg HI h-gr index) index (trunc HI tmpfoo) (and (srl tmpfoo 16) 1) 1)))
- ; A 17-bit rotate-right operation
- (define-pmacro (set-psw-rrotate17 Rd index src c rot)
- (sequence ((SI tmpfoo))
- (set tmpfoo (or (or (and (sll SI src 17) #xFFFE0000)
- src)
- (sll SI c 16)))
- (set tmpfoo (ror tmpfoo (and rot #x0F)))
- (set-psw-carry (reg HI h-gr index) index (trunc HI tmpfoo) (and (srl tmpfoo 16) 1) 1)))
- ; Move Operations
- (define-pmacro (alignfix-mem where)
- (mem HI (and where #xFFFE)))
- (define-pmacro (set-alignfix-mem where what)
- (set (mem HI (and where #xFFFE)) what))
- (define-pmacro (alignfix-mem-far where)
- (mem HI (and where #xFFFFFFFE)))
- (define-pmacro (set-alignfix-mem-far where what)
- (set (mem HI (and where #xFFFFFFFE)) what))
- (dni movlmemimm
- "Move immediate to low memory"
- ()
- ("mov$ws2 $lmem8,#$imm16")
- (+ OP1_7 OP2A_8 ws2 lmem8 imm16)
- (if ws2
- (set-mem-psw (mem HI (and lmem8 #xFFFE)) imm16 ws2)
- (set-mem-psw (mem QI lmem8) (and imm16 #xFF) ws2))
- ()
- )
- (dni movhmemimm
- "Move immediate to high memory"
- ()
- ("mov$ws2 $hmem8,#$imm16")
- (+ OP1_7 OP2A_A ws2 hmem8 imm16)
- (if ws2
- (set-mem-psw (mem HI (and hmem8 #xFFFE)) imm16 ws2)
- (set-mem-psw (mem QI hmem8) (and imm16 #xFF) ws2))
- ()
- )
- (dni movlgrmem
- "Move low memory to register"
- ()
- ("mov$ws2 $Rm,$lmem8")
- (+ OP1_8 Rm ws2 lmem8)
- (if ws2
- (set-psw Rm (index-of Rm) (alignfix-mem lmem8) ws2)
- (set-psw Rm (index-of Rm) (mem QI lmem8) ws2))
- ()
- )
- (dni movhgrmem
- "Move high memory to register"
- ()
- ("mov$ws2 $Rm,$hmem8")
- (+ OP1_A Rm ws2 hmem8)
- (if ws2
- (set-psw Rm (index-of Rm) (alignfix-mem hmem8) ws2)
- (set-psw Rm (index-of Rm) (mem QI hmem8) ws2))
- ()
- )
- (dni movlmemgr
- "Move low memory register to byte"
- ()
- ("mov$ws2 $lmem8,$Rm")
- (+ OP1_9 Rm ws2 lmem8)
- (if ws2
- (set-mem-psw (mem HI (and lmem8 #xFFFE)) Rm ws2)
- (set-mem-psw (mem QI lmem8) Rm ws2))
- ()
- )
- (dni movhmemgr
- "Move high memory register to byte"
- ()
- ("mov$ws2 $hmem8,$Rm")
- (+ OP1_B Rm ws2 hmem8)
- (if ws2
- (set-mem-psw (mem HI (and hmem8 #xFFFE)) Rm ws2)
- (set-mem-psw (mem QI hmem8) Rm ws2))
- ()
- )
- (dni movgrgri
- "Move memory addressed by register to register"
- ()
- ("mov$ws2 $Rdm,($Rs)")
- (+ OP1_7 OP2A_0 ws2 Rs OP4M_0 Rdm)
- (if ws2
- (set-psw Rdm (index-of Rdm) (alignfix-mem Rs) ws2)
- (set-psw Rdm (index-of Rdm) (and #xFF (mem QI Rs)) ws2))
- ()
- )
- (dni movgrgripostinc
- "Move memory addressed by postincrement register to register"
- ()
- ("mov$ws2 $Rdm,($Rs++)")
- (+ OP1_6 OP2A_0 ws2 Rs OP4M_0 Rdm)
- (sequence ()
- (if ws2
- (set-psw Rdm (index-of Rdm) (alignfix-mem Rs) ws2)
- (set-psw Rdm (index-of Rdm) (and #xFF (mem QI Rs)) ws2))
- (set Rs (add Rs (add 1 ws2))))
- ()
- )
- (dni movgrgripredec
- "Move memory addressed by predecrement register to register"
- ()
- ("mov$ws2 $Rdm,(--$Rs)")
- (+ OP1_6 OP2A_8 ws2 Rs OP4M_0 Rdm)
- (sequence ()
- (set Rs (sub Rs (add 1 ws2)))
- (if ws2
- (set-psw Rdm (index-of Rdm) (alignfix-mem Rs) ws2)
- (set-psw Rdm (index-of Rdm) (and #xFF (mem QI Rs)) ws2)))
- ()
- )
- (dni movgrigr
- "Move register to memory addressed by register"
- ()
- ("mov$ws2 ($Rs),$Rdm")
- (+ OP1_7 OP2A_2 ws2 Rs OP4M_0 Rdm)
- (sequence ()
- (if ws2
- (set-alignfix-mem Rs Rdm)
- (set (mem QI Rs) Rdm))
- (set-psw-nowrite (index-of Rdm) Rdm ws2))
- ()
- )
- (dni movgripostincgr
- "Move register to memory addressed by postincrement register"
- ()
- ("mov$ws2 ($Rs++),$Rdm")
- (+ OP1_6 OP2A_2 ws2 Rs OP4M_0 Rdm)
- (sequence ()
- (if ws2
- (set-alignfix-mem Rs Rdm)
- (set (mem QI Rs) Rdm))
- (set-psw-nowrite (index-of Rdm) Rdm ws2)
- (set Rs (add Rs (add ws2 1))))
- ()
- )
- (dni movgripredecgr
- "Move register to memory addressed by predecrement register"
- ()
- ("mov$ws2 (--$Rs),$Rdm")
- (+ OP1_6 OP2A_A ws2 Rs OP4M_0 Rdm)
- (sequence ()
- (set Rs (sub Rs (add ws2 1)))
- (set-psw-nowrite (index-of Rdm) Rdm ws2)
- (if ws2
- (set-alignfix-mem Rs Rdm)
- (set (mem QI Rs) Rdm)))
- ()
- )
- (dni movgrgrii
- "Move memory addressed by indexed register to register"
- ()
- ("mov$ws2 $Rdm,($Rs,$imm12)")
- (+ OP1_7 OP2A_0 ws2 Rs OP4M_1 Rdm OP5_0 imm12)
- (if ws2
- (set-psw Rdm (index-of Rdm) (alignfix-mem (add Rs imm12)) ws2)
- (set-psw Rdm (index-of Rdm) (and #xFF (mem QI (add Rs imm12))) ws2))
- ()
- )
- (dni movgrgriipostinc
- "Move memory addressed by indexed register postincrement to register"
- ()
- ("mov$ws2 $Rdm,($Rs++,$imm12)")
- (+ OP1_6 OP2A_0 ws2 Rs OP4M_1 Rdm OP5_0 imm12)
- (sequence ()
- (if ws2
- (set-psw Rdm (index-of Rdm) (alignfix-mem (add Rs imm12)) ws2)
- (set-psw Rdm (index-of Rdm) (and #xFF (mem QI (add Rs imm12))) ws2))
- (set Rs (add Rs (add ws2 1))))
- ()
- )
- (dni movgrgriipredec
- "Move memory addressed by indexed register predecrement to register"
- ()
- ("mov$ws2 $Rdm,(--$Rs,$imm12)")
- (+ OP1_6 OP2A_8 ws2 Rs OP4M_1 Rdm OP5_0 imm12)
- (sequence ()
- (set Rs (sub Rs (add ws2 1)))
- (if ws2
- (set-psw Rdm (index-of Rdm) (alignfix-mem (add Rs imm12)) ws2)
- (set-psw Rdm (index-of Rdm) (and #xFF (mem QI (add Rs imm12))) ws2)))
- ()
- )
- (dni movgriigr
- "Move register to memory addressed by indexed register"
- ()
- ("mov$ws2 ($Rs,$imm12),$Rdm")
- (+ OP1_7 OP2A_2 ws2 Rs OP4M_1 Rdm OP5_0 imm12)
- (sequence ()
- (if ws2
- (set-alignfix-mem (add Rs imm12) Rdm)
- (set (mem QI (add Rs imm12)) Rdm))
- (set-psw-nowrite (index-of Rdm) Rdm ws2))
- ()
- )
- (dni movgriipostincgr
- "Move register to memory addressed by indexed register postincrement"
- ()
- ("mov$ws2 ($Rs++,$imm12),$Rdm")
- (+ OP1_6 OP2A_2 ws2 Rs OP4M_1 Rdm OP5_0 imm12)
- (sequence ()
- (if ws2
- (set-alignfix-mem (add Rs imm12) Rdm)
- (set (mem QI (add Rs imm12)) Rdm))
- (set-psw-nowrite (index-of Rdm) Rdm ws2)
- (set Rs (add Rs (add ws2 1))))
- ()
- )
- (dni movgriipredecgr
- "Move register to memory addressed by indexed register predecrement"
- ()
- ("mov$ws2 (--$Rs,$imm12),$Rdm")
- (+ OP1_6 OP2A_A ws2 Rs OP4M_1 Rdm OP5_0 imm12)
- (sequence ()
- (set Rs (sub Rs (add ws2 1)))
- (set-psw-nowrite (index-of Rdm) Rdm ws2)
- (if ws2
- (set-alignfix-mem (add Rs imm12) Rdm)
- (set (mem QI (add Rs imm12)) Rdm)))
- ()
- )
- (dni movgrgr
- "Move general register to general register"
- ()
- ("mov $Rd,$Rs")
- (+ OP1_4 OP2_6 Rs Rd)
- (set-psw Rd (index-of Rd) Rs 1)
- ()
- )
- (dnmi movimm8
- "Move 8-bit immediate"
- ()
- ("mov Rx,#$imm8")
- (emit movwimm8 imm8)
- )
- (dni movwimm8
- "Move 8-bit immediate"
- ()
- ("mov.w Rx,#$imm8")
- (+ OP1_4 OP2_7 imm8)
- (set-psw (reg HI h-gr Rpsw) Rpsw imm8 1)
- ()
- )
- (dnmi movgrimm8
- "Move 8-bit immediate to general register"
- ()
- ("mov $Rm,#$imm8small")
- (emit movwgrimm8 Rm imm8small)
- )
- (dni movwgrimm8
- "Move 8-bit immediate to general register"
- ()
- ("mov.w $Rm,#$imm8small")
- (+ OP1_2 Rm OP2M_1 imm8small)
- (set-psw Rm (index-of Rm) imm8small 1)
- ()
- )
- (dnmi movgrimm16
- "Move 16-bit immediate to general register"
- ()
- ("mov $Rd,#$imm16")
- (emit movwgrimm16 Rd imm16)
- )
- (dni movwgrimm16
- "Move 16-bit immediate to general register"
- ()
- ("mov.w $Rd,#$imm16")
- (+ OP1_3 OP2_1 OP3_3 Rd imm16)
- (set-psw Rd (index-of Rd) imm16 1)
- ()
- )
- (dni movlowgr
- "Move 8 low bits to general register"
- ()
- ("mov.b $Rd,RxL")
- (+ OP1_3 OP2_0 OP3_C Rd)
- (set-psw Rd (index-of Rd) (or (and Rd #xFF00) (and (reg HI h-gr Rpsw) #xFF)) 0)
- ()
- )
- (dni movhighgr
- "Move 8 high bits to general register"
- ()
- ("mov.b $Rd,RxH")
- (+ OP1_3 OP2_0 OP3_D Rd)
- (set-psw Rd (index-of Rd) (or (and Rd #x00FF) (and (reg HI h-gr Rpsw) #xFF00)) 1)
- ()
- )
- (dni movfgrgri
- "Move far memory addressed by register to register"
- ()
- ("movf$ws2 $Rdm,($Rs)")
- (+ OP1_7 OP2A_4 ws2 Rs OP4M_0 Rdm)
- (if ws2
- (set-psw Rdm (index-of Rdm) (alignfix-mem-far (or (sll SI R8 16) Rs)) ws2)
- (set-psw Rdm (index-of Rdm) (and #xFF (mem QI (or (sll SI R8 16) Rs))) ws2))
- ()
- )
- (dni movfgrgripostinc
- "Move far memory addressed by postincrement register to register"
- ()
- ("movf$ws2 $Rdm,($Rs++)")
- (+ OP1_6 OP2A_4 ws2 Rs OP4M_0 Rdm)
- (sequence ()
- (if ws2
- (set-psw Rdm (index-of Rdm) (alignfix-mem-far (join SI HI R8 Rs)) ws2)
- (set-psw Rdm (index-of Rdm) (and #xFF (mem QI (join SI HI R8 Rs))) ws2))
- (set Rs (add Rs (add ws2 1))))
- ()
- )
- (dni movfgrgripredec
- "Move far memory addressed by predecrement register to register"
- ()
- ("movf$ws2 $Rdm,(--$Rs)")
- (+ OP1_6 OP2A_C ws2 Rs OP4M_0 Rdm)
- (sequence ()
- (set Rs (sub Rs (add ws2 1)))
- (if ws2
- (set-psw Rdm (index-of Rdm) (alignfix-mem-far (join SI HI R8 Rs)) ws2)
- (set-psw Rdm (index-of Rdm) (and #xFF (mem QI (join SI HI R8 Rs))) ws2)))
- ()
- )
- (dni movfgrigr
- "Move far register to memory addressed by register"
- ()
- ("movf$ws2 ($Rs),$Rdm")
- (+ OP1_7 OP2A_6 ws2 Rs OP4M_0 Rdm)
- (sequence ()
- (if ws2
- (set-alignfix-mem-far (join SI HI R8 Rs) Rdm)
- (set (mem QI (join SI HI R8 Rs)) Rdm))
- (set-psw-nowrite (index-of Rdm) Rdm ws2))
- ()
- )
- (dni movfgripostincgr
- "Move far register to memory addressed by postincrement register"
- ()
- ("movf$ws2 ($Rs++),$Rdm")
- (+ OP1_6 OP2A_6 ws2 Rs OP4M_0 Rdm)
- (sequence ()
- (if ws2
- (set-alignfix-mem-far (join SI HI R8 Rs) Rdm)
- (set (mem QI (join SI HI R8 Rs)) Rdm))
- (set-psw-nowrite (index-of Rdm) Rdm ws2)
- (set Rs (add Rs (add ws2 1))))
- ()
- )
- (dni movfgripredecgr
- "Move far register to memory addressed by predecrement register"
- ()
- ("movf$ws2 (--$Rs),$Rdm")
- (+ OP1_6 OP2A_E ws2 Rs OP4M_0 Rdm)
- (sequence ()
- (set-psw-nowrite (index-of Rdm) Rdm ws2)
- (set Rs (sub Rs (add ws2 1)))
- (if ws2
- (set-alignfix-mem-far (join SI HI R8 Rs) Rdm)
- (set (mem QI (join SI HI R8 Rs)) Rdm)))
- ()
- )
- (dni movfgrgrii
- "Move far memory addressed by indexed register to register"
- ()
- ("movf$ws2 $Rdm,($Rb,$Rs,$imm12)")
- (+ OP1_7 OP2A_4 ws2 Rs OP4M_1 Rdm OP5A_0 Rb imm12)
- (if ws2
- (set-psw Rdm (index-of Rdm) (alignfix-mem-far (add (join SI HI Rb Rs) imm12)) ws2)
- (set-psw Rdm (index-of Rdm) (and #xFF (mem QI (add (join SI HI Rb Rs) imm12))) ws2))
- ()
- )
- (dni movfgrgriipostinc
- "Move far memory addressed by indexed register postincrement to register"
- ()
- ("movf$ws2 $Rdm,($Rb,$Rs++,$imm12)")
- (+ OP1_6 OP2A_4 ws2 Rs OP4M_1 Rdm OP5A_0 Rb imm12)
- (sequence ()
- (if ws2
- (set-psw Rdm (index-of Rdm) (alignfix-mem-far (add (join SI HI Rb Rs) imm12)) ws2)
- (set-psw Rdm (index-of Rdm) (and #xFF (mem QI (add (join SI HI Rb Rs) imm12))) ws2))
- (set Rs (add Rs (add ws2 1)))
- ; Note - despite the XStormy16 ISA documentation the
- ; addition *is* propogated into the base register.
- (if (eq Rs 0) (set Rb (add Rb 1)))
- )
- ()
- )
- (dni movfgrgriipredec
- "Move far memory addressed by indexed register predecrement to register"
- ()
- ("movf$ws2 $Rdm,($Rb,--$Rs,$imm12)")
- (+ OP1_6 OP2A_C ws2 Rs OP4M_1 Rdm OP5A_0 Rb imm12)
- (sequence ()
- ; Note - despite the XStormy16 ISA documentation the
- ; subtraction *is* propogated into the base register.
- (if (eq Rs 0) (set Rb (sub Rb 1)))
- (set Rs (sub Rs (add ws2 1)))
- (if ws2
- (set-psw Rdm (index-of Rdm) (alignfix-mem-far (add (join SI HI Rb Rs) imm12)) ws2)
- (set-psw Rdm (index-of Rdm) (and #xFF (mem QI (add (join SI HI Rb Rs) imm12))) ws2)))
- ()
- )
- (dni movfgriigr
- "Move far register to memory addressed by indexed register"
- ()
- ("movf$ws2 ($Rb,$Rs,$imm12),$Rdm")
- (+ OP1_7 OP2A_6 ws2 Rs OP4M_1 Rdm OP5A_0 Rb imm12)
- (sequence ()
- (if ws2
- (set (mem HI (and (add (join SI HI Rb Rs) imm12) #xFFFFFFFE))
- Rdm)
- (set (mem QI (add (join SI HI Rb Rs) imm12)) Rdm))
- (set-psw-nowrite (index-of Rdm) Rdm ws2))
- ()
- )
- (dni movfgriipostincgr
- "Move far register to memory addressed by indexed register postincrement"
- ()
- ("movf$ws2 ($Rb,$Rs++,$imm12),$Rdm")
- (+ OP1_6 OP2A_6 ws2 Rs OP4M_1 Rdm OP5A_0 Rb imm12)
- (sequence ()
- (if ws2
- (set (mem HI (and (add (join SI HI Rb Rs) imm12) #xFFFFFFFE)) Rdm)
- (set (mem QI (add (join SI HI Rb Rs) imm12)) Rdm))
- (set-psw-nowrite (index-of Rdm) Rdm ws2)
- (set Rs (add Rs (add ws2 1)))
- ; Note - despite the XStormy16 ISA documentation the
- ; addition *is* propogated into the base register.
- (if (eq Rs 0) (set Rb (add Rb 1)))
- )
- ()
- )
- (dni movfgriipredecgr
- "Move far register to memory addressed by indexed register predecrement"
- ()
- ("movf$ws2 ($Rb,--$Rs,$imm12),$Rdm")
- (+ OP1_6 OP2A_E ws2 Rs OP4M_1 Rdm OP5A_0 Rb imm12)
- (sequence ()
- ; Note - despite the XStormy16 ISA documentation the
- ; subtraction *is* propogated into the base register.
- (if (eq Rs 0) (set Rb (sub Rb 1)))
- (set Rs (sub Rs (add ws2 1)))
- (set-psw-nowrite (index-of Rdm) Rdm ws2)
- (if ws2
- (set (mem HI (and (add (join SI HI Rb Rs) imm12) #xFFFFFFFE)) Rdm)
- (set (mem QI (add (join SI HI Rb Rs) imm12)) Rdm)))
- ()
- )
- (dni maskgrgr
- "Mask insert controlled by general register"
- ()
- ("mask $Rd,$Rs")
- (+ OP1_3 OP2_3 Rs Rd)
- (set-psw Rd (index-of Rd) (or HI (and HI Rd (inv HI Rs)) (and (reg HI h-gr Rpsw) Rs)) 1)
- ()
- )
- (dni maskgrimm16
- "Mask insert controlled by immediate value"
- ()
- ("mask $Rd,#$imm16")
- (+ OP1_3 OP2_0 OP3_E Rd imm16)
- (set-psw Rd (index-of Rd) (or (and Rd (inv imm16)) (and (reg HI h-gr Rpsw) imm16)) 1)
- ()
- )
- ; Push, Pop
- (dni pushgr
- "Push register"
- ()
- ("push $Rd")
- (+ OP1_0 OP2_0 OP3_8 Rd)
- (sequence ()
- (set (mem HI sp) Rd)
- (set sp (add sp 2)))
- ()
- )
- (dni popgr
- "Pop into a register"
- ()
- ("pop $Rd")
- (+ OP1_0 OP2_0 OP3_9 Rd)
- (sequence ()
- (set sp (add sp -2))
- (set Rd (mem HI sp)))
- ()
- )
- ; Swap
- (dni swpn
- "Swap low nibbles"
- ()
- ("swpn $Rd")
- (+ OP1_3 OP2_0 OP3_9 Rd)
- (set-psw Rd (index-of Rd) (or (or (and (sll Rd 4) #xF0)
- (and (srl Rd 4) #x0F))
- (and Rd #xFF00)) 0)
- ()
- )
- (dni swpb
- "Swap bytes"
- ()
- ("swpb $Rd")
- (+ OP1_3 OP2_0 OP3_8 Rd)
- (set-psw Rd (index-of Rd) (or (sll Rd 8) (srl Rd 8)) 1)
- ()
- )
- (dni swpw
- "Swap words"
- ()
- ("swpw $Rd,$Rs")
- (+ OP1_3 OP2_2 Rs Rd)
- (sequence ((HI foo))
- (set foo Rs)
- (set Rs Rd)
- (set-psw Rd (index-of Rd) foo 1))
- ()
- )
- ; Logical Operations
- (dni andgrgr
- "AND general register with general register"
- ()
- ("and $Rd,$Rs")
- (+ OP1_4 OP2_0 Rs Rd)
- (set-psw Rd (index-of Rd) (and Rd Rs) 1)
- ()
- )
- (dni andimm8
- "AND with 8-bit immediate"
- ()
- ("and Rx,#$imm8")
- (+ OP1_4 OP2_1 imm8)
- (set-psw (reg HI h-gr Rpsw) Rpsw (and (reg HI h-gr Rpsw) imm8) 1)
- ()
- )
- (dni andgrimm16
- "AND general register with 16-bit immediate"
- ()
- ("and $Rd,#$imm16")
- (+ OP1_3 OP2_1 OP3_0 Rd imm16)
- (set-psw Rd (index-of Rd) (and Rd imm16) 1)
- ()
- )
- (dni orgrgr
- "OR general register with general register"
- ()
- ("or $Rd,$Rs")
- (+ OP1_4 OP2_2 Rs Rd)
- (set-psw Rd (index-of Rd) (or Rd Rs) 1)
- ()
- )
- (dni orimm8
- "OR with 8-bit immediate"
- ()
- ("or Rx,#$imm8")
- (+ OP1_4 OP2_3 imm8)
- (set-psw (reg HI h-gr Rpsw) Rpsw (or (reg HI h-gr Rpsw) imm8) 1)
- ()
- )
- (dni orgrimm16
- "OR general register with 16-bit immediate"
- ()
- ("or $Rd,#$imm16")
- (+ OP1_3 OP2_1 OP3_1 Rd imm16)
- (set-psw Rd (index-of Rd) (or Rd imm16) 1)
- ()
- )
- (dni xorgrgr
- "XOR general register with general register"
- ()
- ("xor $Rd,$Rs")
- (+ OP1_4 OP2_4 Rs Rd)
- (set-psw Rd (index-of Rd) (xor Rd Rs) 1)
- ()
- )
- (dni xorimm8
- "XOR with 8-bit immediate"
- ()
- ("xor Rx,#$imm8")
- (+ OP1_4 OP2_5 imm8)
- (set-psw (reg HI h-gr Rpsw) Rpsw (xor (reg HI h-gr Rpsw) imm8) 1)
- ()
- )
- (dni xorgrimm16
- "XOR general register with 16-bit immediate"
- ()
- ("xor $Rd,#$imm16")
- (+ OP1_3 OP2_1 OP3_2 Rd imm16)
- (set-psw Rd (index-of Rd) (xor Rd imm16) 1)
- ()
- )
- (dni notgr
- "NOT general register"
- ()
- ("not $Rd")
- (+ OP1_3 OP2_0 OP3_B Rd)
- (set-psw Rd (index-of Rd) (inv Rd) 1)
- ()
- )
- ; Arithmetic operations
- (dni addgrgr
- "ADD general register to general register"
- ()
- ("add $Rd,$Rs")
- (+ OP1_4 OP2_9 Rs Rd)
- (set-psw-add Rd (index-of Rd) Rd Rs 0)
- ()
- )
- (dni addgrimm4
- "ADD 4-bit immediate to general register"
- ()
- ("add $Rd,#$imm4")
- (+ OP1_5 OP2_1 imm4 Rd)
- (set-psw-add Rd (index-of Rd) Rd imm4 0)
- ()
- )
- (dni addimm8
- "ADD 8-bit immediate"
- ()
- ("add Rx,#$imm8")
- (+ OP1_5 OP2_9 imm8)
- (set-psw-add (reg HI h-gr Rpsw) Rpsw (reg HI h-gr Rpsw) imm8 0)
- ()
- )
- (dni addgrimm16
- "ADD 16-bit immediate to general register"
- ()
- ("add $Rd,#$imm16")
- (+ OP1_3 OP2_1 OP3_4 Rd imm16)
- (set-psw-add Rd (index-of Rd) Rd imm16 0)
- ()
- )
- (dni adcgrgr
- "ADD carry and general register to general register"
- ()
- ("adc $Rd,$Rs")
- (+ OP1_4 OP2_B Rs Rd)
- (set-psw-add Rd (index-of Rd) Rd Rs psw-cy)
- ()
- )
- (dni adcgrimm4
- "ADD carry and 4-bit immediate to general register"
- ()
- ("adc $Rd,#$imm4")
- (+ OP1_5 OP2_3 imm4 Rd)
- (set-psw-add Rd (index-of Rd) Rd imm4 psw-cy)
- ()
- )
- (dni adcimm8
- "ADD carry and 8-bit immediate"
- ()
- ("adc Rx,#$imm8")
- (+ OP1_5 OP2_B imm8)
- (set-psw-add (reg HI h-gr Rpsw) Rpsw (reg HI h-gr Rpsw) imm8 psw-cy)
- ()
- )
- (dni adcgrimm16
- "ADD carry and 16-bit immediate to general register"
- ()
- ("adc $Rd,#$imm16")
- (+ OP1_3 OP2_1 OP3_5 Rd imm16)
- (set-psw-add Rd (index-of Rd) Rd imm16 psw-cy)
- ()
- )
- (dni subgrgr
- "SUB general register from general register"
- ()
- ("sub $Rd,$Rs")
- (+ OP1_4 OP2_D Rs Rd)
- (set-psw-sub Rd (index-of Rd) Rd Rs 0)
- ()
- )
- (dni subgrimm4
- "SUB 4-bit immediate from general register"
- ()
- ("sub $Rd,#$imm4")
- (+ OP1_5 OP2_5 imm4 Rd)
- (set-psw-sub Rd (index-of Rd) Rd imm4 0)
- ()
- )
- (dni subimm8
- "SUB 8-bit immediate"
- ()
- ("sub Rx,#$imm8")
- (+ OP1_5 OP2_D imm8)
- (set-psw-sub (reg HI h-gr Rpsw) Rpsw (reg HI h-gr Rpsw) imm8 0)
- ()
- )
- (dni subgrimm16
- "SUB 16-bit immediate from general register"
- ()
- ("sub $Rd,#$imm16")
- (+ OP1_3 OP2_1 OP3_6 Rd imm16)
- (set-psw-sub Rd (index-of Rd) Rd imm16 0)
- ()
- )
- (dni sbcgrgr
- "SUB carry and general register from general register"
- ()
- ("sbc $Rd,$Rs")
- (+ OP1_4 OP2_F Rs Rd)
- (set-psw-sub Rd (index-of Rd) Rd Rs psw-cy)
- ()
- )
- (dni sbcgrimm4
- "SUB carry and 4-bit immediate from general register"
- ()
- ("sbc $Rd,#$imm4")
- (+ OP1_5 OP2_7 imm4 Rd)
- (set-psw-sub Rd (index-of Rd) Rd imm4 psw-cy)
- ()
- )
- (dni sbcgrimm8
- "SUB carry and 8-bit immediate"
- ()
- ("sbc Rx,#$imm8")
- (+ OP1_5 OP2_F imm8)
- (set-psw-sub (reg HI h-gr Rpsw) Rpsw (reg HI h-gr Rpsw) imm8 psw-cy)
- ()
- )
- (dni sbcgrimm16
- "SUB carry and 16-bit immediate from general register"
- ()
- ("sbc $Rd,#$imm16")
- (+ OP1_3 OP2_1 OP3_7 Rd imm16)
- (set-psw-sub Rd (index-of Rd) Rd imm16 psw-cy)
- ()
- )
- (dnmi incgr
- "Increment general register"
- ()
- ("inc $Rd")
- (emit incgrimm2 Rd (imm2 0))
- )
- (dni incgrimm2
- "Increment general register by 2-bit immediate"
- ()
- ("inc $Rd,#$imm2")
- (+ OP1_3 OP2_0 OP3A_0 imm2 Rd)
- (set-psw Rd (index-of Rd) (add Rd (add imm2 1)) 1)
- ()
- )
- (dnmi decgr
- "Decrement general register"
- ()
- ("dec $Rd")
- (emit decgrimm2 Rd (imm2 0))
- )
- (dni decgrimm2
- "Decrement general register by 2-bit immediate"
- ()
- ("dec $Rd,#$imm2")
- (+ OP1_3 OP2_0 OP3A_1 imm2 Rd)
- (set-psw Rd (index-of Rd) (sub Rd (add imm2 1)) 1)
- ()
- )
- ; Logical Shift
- (dni rrcgrgr
- "Rotate right general register by general register"
- ()
- ("rrc $Rd,$Rs")
- (+ OP1_3 OP2_8 Rs Rd)
- (set-psw-rrotate17 Rd (index-of Rd) Rd psw-cy Rs)
- ()
- )
- (dni rrcgrimm4
- "Rotate right general register by immediate"
- ()
- ("rrc $Rd,#$imm4")
- (+ OP1_3 OP2_9 imm4 Rd)
- (set-psw-rrotate17 Rd (index-of Rd) Rd psw-cy imm4)
- ()
- )
- (dni rlcgrgr
- "Rotate left general register by general register"
- ()
- ("rlc $Rd,$Rs")
- (+ OP1_3 OP2_A Rs Rd)
- (set-psw-rotate17 Rd (index-of Rd) Rd psw-cy (and Rs #xF))
- ()
- )
- (dni rlcgrimm4
- "Rotate left general register by immediate"
- ()
- ("rlc $Rd,#$imm4")
- (+ OP1_3 OP2_B imm4 Rd)
- (set-psw-rotate17 Rd (index-of Rd) Rd psw-cy imm4)
- ()
- )
- (dni shrgrgr
- "Shift right general register by general register"
- ()
- ("shr $Rd,$Rs")
- (+ OP1_3 OP2_C Rs Rd)
- (set-psw-carry Rd (index-of Rd)
- (srl Rd (and Rs #xF))
- (and SI (if SI (eq (and Rs #xF) 0)
- psw-cy
- (srl Rd (sub (and Rs #xF) 1)))
- 1) 1)
- ()
- )
- (dni shrgrimm
- "Shift right general register by immediate"
- ()
- ("shr $Rd,#$imm4")
- (+ OP1_3 OP2_D imm4 Rd)
- (set-psw-carry Rd (index-of Rd)
- (srl Rd imm4)
- (and SI (if SI (eq imm4 0)
- psw-cy
- (srl Rd (sub imm4 1)))
- 1) 1)
- ()
- )
- (dni shlgrgr
- "Shift left general register by general register"
- ()
- ("shl $Rd,$Rs")
- (+ OP1_3 OP2_E Rs Rd)
- (set-psw-carry Rd (index-of Rd)
- (sll Rd (and Rs #xF))
- (srl SI (if SI (eq (and Rs #xF) 0)
- (sll psw-cy 15)
- (sll Rd (sub (and Rs #xF) 1)))
- 15) 1)
- ()
- )
- (dni shlgrimm
- "Shift left general register by immediate"
- ()
- ("shl $Rd,#$imm4")
- (+ OP1_3 OP2_F imm4 Rd)
- (set-psw-carry Rd (index-of Rd)
- (sll Rd imm4)
- (srl SI (if SI (eq imm4 0)
- (sll psw-cy 15)
- (sll Rd (sub imm4 1)))
- 15) 1)
- ()
- )
- (dni asrgrgr
- "Arithmetic shift right general register by general register"
- ()
- ("asr $Rd,$Rs")
- (+ OP1_3 OP2_6 Rs Rd)
- (set-psw-carry Rd (index-of Rd)
- (sra HI Rd (and Rs #xF))
- (and SI (if SI (eq (and Rs #xF) 0)
- psw-cy
- (srl Rd (sub (and Rs #xF) 1)))
- 1) 1)
- ()
- )
- (dni asrgrimm
- "Arithmetic shift right general register by immediate"
- ()
- ("asr $Rd,#$imm4")
- (+ OP1_3 OP2_7 imm4 Rd)
- (set-psw-carry Rd (index-of Rd)
- (sra HI Rd imm4)
- (and SI (if SI (eq imm4 0)
- psw-cy
- (srl Rd (sub imm4 1)))
- 1) 1)
- ()
- )
- ; Bitwise operations
- (dni set1grimm
- "Set bit in general register by immediate"
- ()
- ("set1 $Rd,#$imm4")
- (+ OP1_0 OP2_9 imm4 Rd)
- (set-psw Rd (index-of Rd) (or Rd (sll 1 imm4)) 1)
- ()
- )
- (dni set1grgr
- "Set bit in general register by general register"
- ()
- ("set1 $Rd,$Rs")
- (+ OP1_0 OP2_B Rs Rd)
- (set-psw Rd (index-of Rd) (or Rd (sll 1 (and Rs #xF))) 1)
- ()
- )
- (dni set1lmemimm
- "Set bit in low memory by immediate"
- ()
- ("set1 $lmem8,#$imm3")
- (+ OP1_E imm3 OP2M_1 lmem8)
- (set-mem-psw (mem QI lmem8) (or (mem QI lmem8) (sll 1 imm3)) 0)
- ()
- )
- (dni set1hmemimm
- "Set bit in high memory by immediate"
- ()
- ("set1 $hmem8,#$imm3")
- (+ OP1_F imm3 OP2M_1 hmem8)
- (set-mem-psw (mem QI hmem8) (or (mem QI hmem8) (sll 1 imm3)) 0)
- ()
- )
- (dni clr1grimm
- "Clear bit in general register by immediate"
- ()
- ("clr1 $Rd,#$imm4")
- (+ OP1_0 OP2_8 imm4 Rd)
- (set-psw Rd (index-of Rd) (and Rd (inv (sll 1 imm4))) 1)
- ()
- )
- (dni clr1grgr
- "Clear bit in general register by general register"
- ()
- ("clr1 $Rd,$Rs")
- (+ OP1_0 OP2_A Rs Rd)
- (set-psw Rd (index-of Rd) (and Rd (inv (sll 1 (and Rs #xF)))) 1)
- ()
- )
- (dni clr1lmemimm
- "Clear bit in low memory"
- ()
- ("clr1 $lmem8,#$imm3")
- (+ OP1_E imm3 OP2M_0 lmem8)
- (set-mem-psw (mem QI lmem8) (and (mem QI lmem8) (inv (sll 1 imm3))) 0)
- ()
- )
- (dni clr1hmemimm
- "Clear bit in high memory"
- ()
- ("clr1 $hmem8,#$imm3")
- (+ OP1_F imm3 OP2M_0 hmem8)
- (set-mem-psw (mem QI hmem8) (and (mem QI hmem8) (inv (sll 1 imm3))) 0)
- ()
- )
- ; Data conversion
- (dni cbwgr
- "Sign-extend byte in general register"
- ()
- ("cbw $Rd")
- (+ OP1_3 OP2_0 OP3_A Rd)
- (set-psw Rd (index-of Rd) (ext HI (trunc QI Rd)) 1)
- ()
- )
- (dni revgr
- "Reverse bit pattern in general register"
- ()
- ("rev $Rd")
- (+ OP1_3 OP2_0 OP3_F Rd)
- (set-psw Rd (index-of Rd)
- (or (sll (and Rd #x0001) 15)
- (or (sll (and Rd #x0002) 13)
- (or (sll (and Rd #x0004) 11)
- (or (sll (and Rd #x0008) 9)
- (or (sll (and Rd #x0010) 7)
- (or (sll (and Rd #x0020) 5)
- (or (sll (and Rd #x0040) 3)
- (or (sll (and Rd #x0080) 1)
- (or (srl (and Rd #x0100) 1)
- (or (srl (and Rd #x0200) 3)
- (or (srl (and Rd #x0400) 5)
- (or (srl (and Rd #x0800) 7)
- (or (srl (and Rd #x1000) 9)
- (or (srl (and Rd #x2000) 11)
- (or (srl (and Rd #x4000) 13)
- (srl (and Rd #x8000) 15))))))))))))))))
- 1)
- ()
- )
- ; Conditional Branches
- (define-pmacro (cbranch cond dest)
- (sequence ((BI tmp))
- (case cond
- ((0) (set tmp (not (xor psw-s psw-ov)))) ; ge
- ((1) (set tmp (not psw-cy))) ; nc
- ((2) (set tmp (xor psw-s psw-ov))) ; lt
- ((3) (set tmp psw-cy)) ; c
- ((4) (set tmp (not (or (xor psw-s psw-ov) psw-z16)))) ; gt
- ((5) (set tmp (not (or psw-cy psw-z16)))) ; hi
- ((6) (set tmp (or (xor psw-s psw-ov) psw-z16))) ; le
- ((7) (set tmp (or psw-cy psw-z16))) ; ls
- ((8) (set tmp (not psw-s))) ; pl
- ((9) (set tmp (not psw-ov))) ; nv
- ((10) (set tmp psw-s)) ; mi
- ((11) (set tmp psw-ov)) ; v
- ((12) (set tmp (not psw-z8))) ; nz.b
- ((13) (set tmp (not psw-z16))) ; nz
- ((14) (set tmp psw-z8)) ; z.b
- ((15) (set tmp psw-z16))) ; z
- (if tmp (set pc dest)))
- )
- (dni bccgrgr
- "Conditional branch comparing general register with general register"
- ()
- ("b$bcond5 $Rd,$Rs,$rel12")
- (+ OP1_0 OP2_D Rs Rd bcond5 rel12)
- (sequence ()
- (set-psw-cmp Rd (index-of Rd) Rd Rs)
- (cbranch bcond5 rel12))
- ()
- )
- ; 4 bytes
- (dni bccgrimm8
- "Conditional branch comparing general register with 8-bit immediate"
- ()
- ("b$bcond5 $Rm,#$imm8,$rel12")
- (+ OP1_2 OP2M_0 Rm imm8 bcond5 rel12)
- (sequence ()
- (set-psw-cmp Rm (index-of Rm) Rm imm8)
- (cbranch bcond5 rel12))
- ()
- )
- ; 4 bytes
- (dni bccimm16
- "Conditional branch comparing general register with 16-bit immediate"
- ()
- ("b$bcond2 Rx,#$imm16,${rel8-4}")
- (+ OP1_C bcond2 rel8-4 imm16)
- (sequence ()
- (set-psw-cmp (reg HI h-gr Rpsw) Rpsw (reg HI h-gr Rpsw) imm16)
- (cbranch bcond2 rel8-4))
- ()
- )
- (dni bngrimm4
- "Test bit in general register by immediate and branch if 0"
- ()
- ("bn $Rd,#$imm4,$rel12")
- (+ OP1_0 OP2_4 imm4 Rd OP5_0 rel12)
- (sequence ()
- (set Rpsw (index-of Rd))
- (if (eq (and Rd (sll 1 imm4)) 0)
- (set pc rel12)))
- ()
- )
- (dni bngrgr
- "Test bit in general register by general register and branch if 0"
- ()
- ("bn $Rd,$Rs,$rel12")
- (+ OP1_0 OP2_6 Rs Rd OP5_0 rel12)
- (sequence ()
- (set Rpsw (index-of Rd))
- (if (eq (and Rd (sll 1 Rs)) 0)
- (set pc rel12)))
- ()
- )
- (dni bnlmemimm
- "Test bit in memory by immediate and branch if 0"
- ()
- ("bn $lmem8,#$imm3b,$rel12")
- (+ OP1_7 OP2_C lmem8 OP5A_0 imm3b rel12)
- (if (eq (and (mem QI lmem8) (sll 1 imm3b)) 0)
- (set pc rel12))
- ()
- )
- (dni bnhmemimm
- "Test bit in memory by immediate and branch if 0"
- ()
- ("bn $hmem8,#$imm3b,$rel12")
- (+ OP1_7 OP2_E hmem8 OP5A_0 imm3b rel12)
- (if (eq (and (mem QI hmem8) (sll 1 imm3b)) 0)
- (set pc rel12))
- ()
- )
- (dni bpgrimm4
- "Test bit in general register by immediate and branch if 1"
- ()
- ("bp $Rd,#$imm4,$rel12")
- (+ OP1_0 OP2_5 imm4 Rd OP5_0 rel12)
- (sequence ()
- (set Rpsw (index-of Rd))
- (if (ne (and Rd (sll 1 imm4)) 0)
- (set pc rel12)))
- ()
- )
- (dni bpgrgr
- "Test bit in general register by general register and branch if 1"
- ()
- ("bp $Rd,$Rs,$rel12")
- (+ OP1_0 OP2_7 Rs Rd OP5_0 rel12)
- (sequence ()
- (set Rpsw (index-of Rd))
- (if (ne (and Rd (sll 1 Rs)) 0)
- (set pc rel12)))
- ()
- )
- (dni bplmemimm
- "Test bit in memory by immediate and branch if 1"
- ()
- ("bp $lmem8,#$imm3b,$rel12")
- (+ OP1_7 OP2_D lmem8 OP5A_0 imm3b rel12)
- (if (ne (and (mem QI lmem8) (sll 1 imm3b)) 0)
- (set pc rel12))
- ()
- )
- (dni bphmemimm
- "Test bit in memory by immediate and branch if 1"
- ()
- ("bp $hmem8,#$imm3b,$rel12")
- (+ OP1_7 OP2_F hmem8 OP5A_0 imm3b rel12)
- (if (ne (and (mem QI hmem8) (sll 1 imm3b)) 0)
- (set pc rel12))
- ()
- )
- (dni bcc
- "Conditional branch on flag registers"
- ()
- ("b$bcond2 ${rel8-2}")
- (+ OP1_D bcond2 rel8-2)
- (cbranch bcond2 rel8-2)
- ()
- )
- ; Unconditional Branching
- (dni bgr
- "Branch to register"
- ()
- ("br $Rd")
- (+ OP1_0 OP2_0 OP3_2 Rd)
- (set pc (add (add pc 2) Rd))
- ()
- )
- (dni br
- "Branch"
- ()
- ("br $rel12a")
- (+ OP1_1 rel12a OP4B_0)
- (set pc rel12a)
- ()
- )
- (dni jmp
- "Jump"
- ()
- ("jmp $Rbj,$Rd")
- (+ OP1_0 OP2_0 OP3B_4 Rbj Rd)
- (set pc (join SI HI Rbj Rd))
- ()
- )
- (dni jmpf
- "Jump far"
- ()
- ("jmpf $abs24")
- (+ OP1_0 OP2_2 abs24)
- (set pc abs24)
- ()
- )
- ; Call instructions
- (define-pmacro (do-call dest ilen)
- (sequence ()
- (set (mem SI sp) (add pc ilen))
- (set sp (add sp 4))
- (set pc dest)))
- (dni callrgr
- "Call relative to general register"
- ()
- ("callr $Rd")
- (+ OP1_0 OP2_0 OP3_1 Rd)
- (do-call (add Rd (add pc 2)) 2)
- ()
- )
- (dni callrimm
- "Call relative to immediate address"
- ()
- ("callr $rel12a")
- (+ OP1_1 rel12a OP4B_1)
- (do-call rel12a 2)
- ()
- )
- (dni callgr
- "Call to general registers"
- ()
- ("call $Rbj,$Rd")
- (+ OP1_0 OP2_0 OP3B_A Rbj Rd)
- (do-call (join SI HI Rbj Rd) 2)
- ()
- )
- (dni callfimm
- "Call far to absolute address"
- ()
- ("callf $abs24")
- (+ OP1_0 OP2_1 abs24)
- (do-call abs24 4)
- ()
- )
- (define-pmacro (do-calli dest ilen)
- (sequence ()
- (set (mem SI sp) (add pc ilen))
- (set (mem HI (add sp 4)) psw)
- (set sp (add sp 6))
- (set pc dest)))
- (dni icallrgr
- "Call interrupt to general registers pc-relative"
- ()
- ("icallr $Rd")
- (+ OP1_0 OP2_0 OP3_3 Rd)
- (do-calli (add Rd (add pc 2)) 2)
- ()
- )
- (dni icallgr
- "Call interrupt to general registers"
- ()
- ("icall $Rbj,$Rd")
- (+ OP1_0 OP2_0 OP3B_6 Rbj Rd)
- (do-calli (join SI HI Rbj Rd) 2)
- ()
- )
- (dni icallfimm
- "Call interrupt far to absolute address"
- ()
- ("icallf $abs24")
- (+ OP1_0 OP2_3 abs24)
- (do-calli abs24 4)
- ()
- )
- ; Return instructions
- (dni iret
- "Return from interrupt"
- ()
- ("iret")
- (+ (f-op #x0002))
- (sequence ()
- (set sp (sub sp 6))
- (set pc (mem SI sp))
- (set psw (mem HI (add sp 4))))
- ()
- )
- (dni ret
- "Return"
- ()
- ("ret")
- (+ (f-op #x0003))
- (sequence ()
- (set sp (sub sp 4))
- (set pc (mem SI sp)))
- ()
- )
- ; Multiply and Divide instructions
- (dni mul
- "Multiply"
- ()
- ("mul")
- (+ (f-op #x00D0))
- (sequence ((SI value))
- (set value (mul SI (and SI R0 #xFFFF) (and SI R2 #xFFFF)))
- (set psw (or (and psw #xFF9C)
- (basic-psw (trunc HI value) 1)))
- (set R0 (trunc HI value))
- (set R1 (trunc HI (srl value 16))))
- ()
- )
- (dni div
- "Divide"
- ()
- ("div")
- (+ (f-op #x00C0))
- (sequence ()
- (set R1 (umod R0 R2))
- (set-mem-psw R0 (udiv R0 R2) 1))
- ()
- )
- (dni sdiv
- "Signed Divide"
- ()
- ("sdiv")
- (+ (f-op #x00C8))
- (sequence ()
- (set R1 (mod HI R0 R2))
- (set-mem-psw R0 (div HI R0 R2) 1))
- ()
- )
- (dni sdivlh
- "Divide 32/16"
- ()
- ("sdivlh")
- (+ (f-op #x00E8))
- (sequence ((SI value))
- (set value (add SI (sll SI (and SI R1 #xffff) #x10) (and SI R0 #xffff)))
- (set R1 (mod SI value (ext SI (trunc HI R2))))
- (set-mem-psw R0 (div SI value (ext SI (trunc HI R2))) 1))
- ()
- )
- (dni divlh
- "Divide 32/16"
- ()
- ("divlh")
- (+ (f-op #x00E0))
- (sequence ((SI value))
- (set value (add SI (sll SI (and SI R1 #xffff) #x10) (and SI R0 #xffff)))
- (set R1 (umod SI value R2))
- (set-mem-psw R0 (udiv SI value R2) 1))
- ()
- )
- ; System Control
- ; added per sanyo's req -- eq to nop for the moment, but can
- ; add function later
- (dni reset "reset" () ("reset") (+ (f-op #x000f)) (nop) ())
- (dni nop "nop" () ("nop") (+ (f-op #x0000)) (nop) ())
- (dni halt "halt" () ("halt") (+ (f-op #x0008)) (c-call VOID "do_halt") ())
- (dni hold "hold" () ("hold") (+ (f-op #x000A)) (c-call VOID "do_hold") ())
- (dni holdx "holdx" () ("holdx") (+ (f-op #x000B)) (c-call VOID "do_holdx") ())
- (dni brk "brk" () ("brk") (+ (f-op #x0005)) (c-call VOID "do_brk") ())
- ; An instruction for test instrumentation.
- ; Using a reserved opcode.
- (dni syscall
- "simulator system call"
- ()
- ("--unused--")
- (+ (f-op #x0001))
- (c-call VOID "syscall")
- ()
- )
|