1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966 |
- ; 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 (sll value 1) (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")
- ()
- )
|