| ; OpenRISC Basic Instruction Set 32-bit (ORBIS) -*- Scheme -*- | |
| ; Copyright 2000-2014 Free Software Foundation, Inc. | |
| ; Contributed for OR32 by Johan Rydberg, jrydberg@opencores.org | |
| ; Modified by Julius Baxter, juliusbaxter@gmail.com | |
| ; Modified by Peter Gavin, pgavin@gmail.com | |
| ; | |
| ; 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, see <http://www.gnu.org/licenses/> | |
| ; Instruction fields. | |
| ; Hardware for immediate operands | |
| (dnh h-simm16 "16-bit signed immediate" ((MACH ORBIS-MACHS)) (immediate (INT 16)) () () ()) | |
| (dnh h-uimm16 "16-bit unsigned immediate" () (immediate (UINT 16)) () () ()) | |
| (dnh h-uimm6 "6-bit unsigned immediate" () (immediate (UINT 6)) () () ()) | |
| ; Hardware for the (internal) atomic registers | |
| (dsh h-atomic-reserve "atomic reserve flag" () (register BI)) | |
| (dsh h-atomic-address "atomic reserve address" () (register SI)) | |
| ; Instruction classes. | |
| (dnf f-opcode "insn opcode" ((MACH ORBIS-MACHS)) 31 6) | |
| ; Register fields. | |
| (dnf f-r1 "r1" ((MACH ORBIS-MACHS)) 25 5) | |
| (dnf f-r2 "r2" ((MACH ORBIS-MACHS)) 20 5) | |
| (dnf f-r3 "r3" ((MACH ORBIS-MACHS)) 15 5) | |
| ; Sub fields | |
| (dnf f-op-25-2 "op-25-2" ((MACH ORBIS-MACHS)) 25 2) ;; nop | |
| (dnf f-op-25-5 "op-25-5" ((MACH ORBIS-MACHS)) 25 5) ;; sys, trap, *sync, sf* | |
| (dnf f-op-16-1 "op-16-1" ((MACH ORBIS-MACHS)) 16 1) ;; movhi,macrc | |
| (dnf f-op-7-4 "op-7-4" ((MACH ORBIS-MACHS)) 7 4) | |
| (dnf f-op-3-4 "op-3-4" ((MACH ORBIS-MACHS)) 3 4) | |
| (dnf f-op-9-2 "op-9-2" ((MACH ORBIS-MACHS)) 9 2) ;; alu ops upper opcode | |
| (dnf f-op-9-4 "op-9-4" ((MACH ORBIS-MACHS)) 9 4) ;; | |
| (dnf f-op-7-8 "op-7-8" ((MACH ORBIS-MACHS)) 7 8) | |
| (dnf f-op-7-2 "op-7-2" ((MACH ORBIS-MACHS)) 7 2) ;; alu lower upper opc,shroti | |
| ; Reserved fields | |
| (dnf f-resv-25-26 "resv-25-26" ((MACH ORBIS-MACHS) RESERVED) 25 26) | |
| (dnf f-resv-25-10 "resv-25-10" ((MACH ORBIS-MACHS) RESERVED) 25 10) | |
| (dnf f-resv-25-5 "resv-25-5" ((MACH ORBIS-MACHS) RESERVED) 25 5) | |
| (dnf f-resv-23-8 "resv-23-8" ((MACH ORBIS-MACHS) RESERVED) 23 8) | |
| (dnf f-resv-20-21 "resv-20-21" ((MACH ORBIS-MACHS) RESERVED) 20 21) | |
| (dnf f-resv-20-5 "resv-20-5" ((MACH ORBIS-MACHS) RESERVED) 20 5) | |
| (dnf f-resv-20-4 "resv-20-4" ((MACH ORBIS-MACHS) RESERVED) 20 4) | |
| (dnf f-resv-15-8 "resv-15-8" ((MACH ORBIS-MACHS) RESERVED) 15 8) | |
| (dnf f-resv-15-6 "resv-15-6" ((MACH ORBIS-MACHS) RESERVED) 15 6) | |
| (dnf f-resv-10-11 "resv-10-11" ((MACH ORBIS-MACHS) RESERVED) 10 11) | |
| (dnf f-resv-10-7 "resv-10-7" ((MACH ORBIS-MACHS) RESERVED) 10 7) | |
| (dnf f-resv-10-3 "resv-10-3" ((MACH ORBIS-MACHS) RESERVED) 10 3) | |
| (dnf f-resv-10-1 "resv-10-1" ((MACH ORBIS-MACHS) RESERVED) 10 1) | |
| (dnf f-resv-8-1 "resv-8-1" ((MACH ORBIS-MACHS) RESERVED) 8 1) | |
| (dnf f-resv-7-4 "resv-7-4" ((MACH ORBIS-MACHS) RESERVED) 7 4) | |
| (dnf f-resv-5-2 "resv-5-2" ((MACH ORBIS-MACHS) RESERVED) 5 2) | |
| (dnf f-imm16-25-5 "imm16-25-5" ((MACH ORBIS-MACHS)) 25 5) | |
| (dnf f-imm16-10-11 "imm16-10-11" ((MACH ORBIS-MACHS)) 10 11) | |
| ; PC relative, 26-bit (2 shifted to right) | |
| (df f-disp26 | |
| "disp26" | |
| ((MACH ORBIS-MACHS) PCREL-ADDR) | |
| 25 | |
| 26 | |
| INT | |
| ((value pc) (sra IAI (sub IAI value pc) (const 2))) | |
| ((value pc) (add IAI (mul IAI value (const 4)) pc)) | |
| ) | |
| ; PC relative, 21-bit, 13 shifted to right, aligned. | |
| ; Note that the alignment means that we can't simplify relocations in the | |
| ; same way as we do for pc-relative, so we use ABS-ADDR instead of PCREL-ADDR. | |
| (df f-disp21 | |
| "disp21" | |
| ((MACH ORBIS-MACHS) ABS-ADDR) | |
| 20 | |
| 21 | |
| INT | |
| ((value pc) | |
| (sub IAI (sra IAI value (const 13)) (sra IAI pc (const 13)))) | |
| ((value pc) | |
| (mul IAI (add IAI value (sra IAI pc (const 13))) (const 8192))) | |
| ) | |
| ; Immediates. | |
| (dnf f-uimm16 "uimm16" ((MACH ORBIS-MACHS)) 15 16) | |
| (df f-simm16 "simm16" ((MACH ORBIS-MACHS) SIGN-OPT) 15 16 INT #f #f) | |
| (dnf f-uimm6 "uimm6" ((MACH ORBIS-MACHS)) 5 6) ;; shroti | |
| (define-multi-ifield | |
| (name f-uimm16-split) | |
| (comment "16-bit split unsigned immediate") | |
| (attrs (MACH ORBIS-MACHS)) | |
| (mode UINT) | |
| (subfields f-imm16-25-5 f-imm16-10-11) | |
| (insert (sequence () | |
| (set (ifield f-imm16-25-5) | |
| (and (srl (ifield f-uimm16-split) | |
| (const 11)) | |
| (const #x1f))) | |
| (set (ifield f-imm16-10-11) | |
| (and (ifield f-uimm16-split) | |
| (const #x7ff))))) | |
| (extract | |
| (set (ifield f-uimm16-split) | |
| (trunc UHI | |
| (or (sll (ifield f-imm16-25-5) | |
| (const 11)) | |
| (ifield f-imm16-10-11))))) | |
| ) | |
| (define-multi-ifield | |
| (name f-simm16-split) | |
| (comment "16-bit split signed immediate") | |
| (attrs (MACH ORBIS-MACHS) SIGN-OPT) | |
| (mode INT) | |
| (subfields f-imm16-25-5 f-imm16-10-11) | |
| (insert (sequence () | |
| (set (ifield f-imm16-25-5) | |
| (and (sra (ifield f-simm16-split) | |
| (const 11)) | |
| (const #x1f))) | |
| (set (ifield f-imm16-10-11) | |
| (and (ifield f-simm16-split) | |
| (const #x7ff))))) | |
| (extract | |
| (set (ifield f-simm16-split) | |
| (trunc HI | |
| (or (sll (ifield f-imm16-25-5) | |
| (const 11)) | |
| (ifield f-imm16-10-11))))) | |
| ) | |
| ; Enums. | |
| ; insn-opcode: bits 31-26 | |
| (define-normal-insn-enum | |
| insn-opcode "insn main opcode enums" ((MACH ORBIS-MACHS)) OPC_ f-opcode | |
| (("J" #x00) | |
| ("JAL" #x01) | |
| ("ADRP" #x02) | |
| ("BNF" #x03) | |
| ("BF" #x04) | |
| ("NOP" #x05) | |
| ("MOVHIMACRC" #x06) | |
| ("SYSTRAPSYNCS" #x08) | |
| ("RFE" #x09) | |
| ("VECTOR" #x0a) | |
| ("JR" #x11) | |
| ("JALR" #x12) | |
| ("MACI" #x13) | |
| ("LWA" #x1b) | |
| ("CUST1" #x1c) | |
| ("CUST2" #x1d) | |
| ("CUST3" #x1e) | |
| ("CUST4" #x1f) | |
| ("LD" #x20) | |
| ("LWZ" #x21) | |
| ("LWS" #x22) | |
| ("LBZ" #x23) | |
| ("LBS" #x24) | |
| ("LHZ" #x25) | |
| ("LHS" #x26) | |
| ("ADDI" #x27) | |
| ("ADDIC" #x28) | |
| ("ANDI" #x29) | |
| ("ORI" #x2a) | |
| ("XORI" #x2b) | |
| ("MULI" #x2c) | |
| ("MFSPR" #x2d) | |
| ("SHROTI" #x2e) | |
| ("SFI" #x2f) | |
| ("MTSPR" #x30) | |
| ("MAC" #x31) | |
| ("FLOAT" #x32) | |
| ("SWA" #x33) | |
| ("SD" #x34) | |
| ("SW" #x35) | |
| ("SB" #x36) | |
| ("SH" #x37) | |
| ("ALU" #x38) | |
| ("SF" #x39) | |
| ("CUST5" #x3c) | |
| ("CUST6" #x3d) | |
| ("CUST7" #x3e) | |
| ("CUST8" #x3f) | |
| ) | |
| ) | |
| (define-normal-insn-enum insn-opcode-systrapsyncs | |
| "systrapsync insn opcode enums" ((MACH ORBIS-MACHS)) | |
| OPC_SYSTRAPSYNCS_ f-op-25-5 | |
| (("SYSCALL" #x00 ) | |
| ("TRAP" #x08 ) | |
| ("MSYNC" #x10 ) | |
| ("PSYNC" #x14 ) | |
| ("CSYNC" #x18 ) | |
| ) | |
| ) | |
| (define-normal-insn-enum insn-opcode-movehimacrc | |
| "movhi/macrc insn opcode enums" ((MACH ORBIS-MACHS)) | |
| OPC_MOVHIMACRC_ f-op-16-1 | |
| (("MOVHI" #x0) | |
| ("MACRC" #x1) | |
| ) | |
| ) | |
| (define-normal-insn-enum insn-opcode-mac | |
| "multiply/accumulate insn opcode enums" ((MACH ORBIS-MACHS)) | |
| OPC_MAC_ f-op-3-4 | |
| (("MAC" #x1) | |
| ("MSB" #x2) | |
| ("MACU" #x3) | |
| ("MSBU" #x4) | |
| ) | |
| ) | |
| (define-normal-insn-enum insn-opcode-shorts | |
| "shift/rotate insn opcode enums" ((MACH ORBIS-MACHS)) | |
| OPC_SHROTS_ f-op-7-2 | |
| (("SLL" #x0 ) | |
| ("SRL" #x1 ) | |
| ("SRA" #x2 ) | |
| ("ROR" #x3 ) | |
| ) | |
| ) | |
| (define-normal-insn-enum insn-opcode-extbhs | |
| "extend byte/half opcode enums" ((MACH ORBIS-MACHS)) | |
| OPC_EXTBHS_ f-op-9-4 | |
| (("EXTHS" #x0) | |
| ("EXTBS" #x1) | |
| ("EXTHZ" #x2) | |
| ("EXTBZ" #x3) | |
| ) | |
| ) | |
| (define-normal-insn-enum insn-opcode-extws | |
| "extend word opcode enums" ((MACH ORBIS-MACHS)) | |
| OPC_EXTWS_ f-op-9-4 | |
| (("EXTWS" #x0) | |
| ("EXTWZ" #x1) | |
| ) | |
| ) | |
| (define-normal-insn-enum insn-opcode-alu-regreg | |
| "alu reg/reg insn opcode enums" ((MACH ORBIS-MACHS)) | |
| OPC_ALU_REGREG_ f-op-3-4 | |
| (("ADD" #x0) | |
| ("ADDC" #x1) | |
| ("SUB" #x2) | |
| ("AND" #x3) | |
| ("OR" #x4) | |
| ("XOR" #x5) | |
| ("MUL" #x6) | |
| ("MULD" #x7) | |
| ("SHROT" #x8) | |
| ("DIV" #x9) | |
| ("DIVU" #xA) | |
| ("MULU" #xB) | |
| ("EXTBH" #xC) | |
| ("EXTW" #xD) | |
| ("MULDU" #xD) | |
| ("CMOV" #xE) | |
| ("FFL1" #xF) | |
| ) | |
| ) | |
| (define-normal-insn-enum insn-opcode-setflag | |
| "setflag insn opcode enums" ((MACH ORBIS-MACHS)) | |
| OPC_SF_ f-op-25-5 | |
| (("EQ" #x00) | |
| ("NE" #x01) | |
| ("GTU" #x02) | |
| ("GEU" #x03) | |
| ("LTU" #x04) | |
| ("LEU" #x05) | |
| ("GTS" #x0A) | |
| ("GES" #x0B) | |
| ("LTS" #x0C) | |
| ("LES" #x0D) | |
| ) | |
| ) | |
| ; Instruction operands. | |
| (dnop sys-sr "supervision register" ((MACH ORBIS-MACHS) SEM-ONLY) h-sys-sr f-nil) | |
| (dnop sys-esr0 "exception supervision register 0" ((MACH ORBIS-MACHS) SEM-ONLY) h-sys-esr0 f-nil) | |
| (dnop sys-epcr0 "exception PC register 0" ((MACH ORBIS-MACHS) SEM-ONLY) h-sys-epcr0 f-nil) | |
| (dnop sys-sr-lee "SR little endian enable bit" ((MACH ORBIS-MACHS) SEM-ONLY) h-sys-sr-lee f-nil) | |
| (dnop sys-sr-f "SR flag bit" ((MACH ORBIS-MACHS) SEM-ONLY) h-sys-sr-f f-nil) | |
| (dnop sys-sr-cy "SR carry bit" ((MACH ORBIS-MACHS) SEM-ONLY) h-sys-sr-cy f-nil) | |
| (dnop sys-sr-ov "SR overflow bit" ((MACH ORBIS-MACHS) SEM-ONLY) h-sys-sr-ov f-nil) | |
| (dnop sys-sr-ove "SR overflow exception enable bit" ((MACH ORBIS-MACHS) SEM-ONLY) h-sys-sr-ove f-nil) | |
| (dnop sys-cpucfgr-ob64s "CPUCFGR ORBIS64 supported bit" ((MACH ORBIS-MACHS) SEM-ONLY) h-sys-cpucfgr-ob64s f-nil) | |
| (dnop sys-cpucfgr-nd "CPUCFGR no delay bit" ((MACH ORBIS-MACHS) SEM-ONLY) h-sys-cpucfgr-nd f-nil) | |
| (dnop sys-fpcsr-rm "floating point round mode" ((MACH ORBIS-MACHS) SEM-ONLY) h-sys-fpcsr-rm f-nil) | |
| (dnop mac-machi "MAC HI result register" ((MACH ORBIS-MACHS) SEM-ONLY) h-mac-machi f-nil) | |
| (dnop mac-maclo "MAC LO result register" ((MACH ORBIS-MACHS) SEM-ONLY) h-mac-maclo f-nil) | |
| (dnop atomic-reserve "atomic reserve flag" ((MACH ORBIS-MACHS) SEM-ONLY) h-atomic-reserve f-nil) | |
| (dnop atomic-address "atomic address" ((MACH ORBIS-MACHS) SEM-ONLY) h-atomic-address f-nil) | |
| (dnop uimm6 "uimm6" ((MACH ORBIS-MACHS)) h-uimm6 f-uimm6) | |
| (dnop rD "destination register" ((MACH ORBIS-MACHS)) h-gpr f-r1) | |
| (dnop rA "source register A" ((MACH ORBIS-MACHS)) h-gpr f-r2) | |
| (dnop rB "source register B" ((MACH ORBIS-MACHS)) h-gpr f-r3) | |
| (define-operand | |
| (name disp26) | |
| (comment "pc-rel 26 bit") | |
| (attrs (MACH ORBIS-MACHS)) | |
| (type h-iaddr) | |
| (index f-disp26) | |
| (handlers (parse "disp26")) | |
| ) | |
| (define-operand | |
| (name disp21) | |
| (comment "pc-rel 21 bit") | |
| (attrs (MACH ORBIS-MACHS)) | |
| (type h-iaddr) | |
| (index f-disp21) | |
| (handlers (parse "disp21")) | |
| ) | |
| (define-operand | |
| (name simm16) | |
| (comment "16-bit signed immediate") | |
| (attrs (MACH ORBIS-MACHS) SIGN-OPT) | |
| (type h-simm16) | |
| (index f-simm16) | |
| (handlers (parse "simm16")) | |
| ) | |
| (define-operand | |
| (name uimm16) | |
| (comment "16-bit unsigned immediate") | |
| (attrs (MACH ORBIS-MACHS)) | |
| (type h-uimm16) | |
| (index f-uimm16) | |
| (handlers (parse "uimm16")) | |
| ) | |
| (define-operand | |
| (name simm16-split) | |
| (comment "split 16-bit signed immediate") | |
| (attrs (MACH ORBIS-MACHS) SIGN-OPT) | |
| (type h-simm16) | |
| (index f-simm16-split) | |
| (handlers (parse "simm16_split")) | |
| ) | |
| (define-operand | |
| (name uimm16-split) | |
| (comment "split 16-bit unsigned immediate") | |
| (attrs (MACH ORBIS-MACHS)) | |
| (type h-uimm16) | |
| (index f-uimm16-split) | |
| (handlers (parse "uimm16_split")) | |
| ) | |
| ; Instructions. | |
| ; Branch releated instructions | |
| (define-pmacro (cti-link-return) | |
| (set IAI (reg h-gpr 9) (add pc (if sys-cpucfgr-nd 4 8))) | |
| ) | |
| (define-pmacro (cti-transfer-control condition target) | |
| ;; this mess is necessary because we're | |
| ;; skipping the delay slot, but it's | |
| ;; actually the start of the next basic | |
| ;; block | |
| (sequence () | |
| (if condition | |
| (delay 1 (set IAI pc target)) | |
| (if sys-cpucfgr-nd | |
| (delay 1 (set IAI pc (add pc 4)))) | |
| ) | |
| (if sys-cpucfgr-nd | |
| (skip 1) | |
| ) | |
| ) | |
| ) | |
| (define-pmacro | |
| (define-cti | |
| cti-name | |
| cti-comment | |
| cti-attrs | |
| cti-syntax | |
| cti-format | |
| cti-semantics) | |
| (begin | |
| (dni | |
| cti-name | |
| cti-comment | |
| (.splice (MACH ORBIS-MACHS) DELAYED-CTI NOT-IN-DELAY-SLOT (.unsplice cti-attrs)) | |
| cti-syntax | |
| cti-format | |
| (cti-semantics) | |
| () | |
| ) | |
| ) | |
| ) | |
| (define-cti | |
| l-j | |
| "jump (pc-relative iaddr)" | |
| (!COND-CTI UNCOND-CTI) | |
| "l.j ${disp26}" | |
| (+ OPC_J disp26) | |
| (.pmacro () | |
| (cti-transfer-control 1 disp26) | |
| ) | |
| ) | |
| (dni l-adrp "load pc-relative page address" | |
| ((MACH ORBIS-MACHS)) | |
| "l.adrp $rD,${disp21}" | |
| (+ OPC_ADRP rD disp21) | |
| (set UWI rD disp21) | |
| () | |
| ) | |
| (define-cti | |
| l-jal | |
| "jump and link (pc-relative iaddr)" | |
| (!COND-CTI UNCOND-CTI) | |
| "l.jal ${disp26}" | |
| (+ OPC_JAL disp26) | |
| (.pmacro () | |
| (sequence () | |
| (cti-link-return) | |
| (cti-transfer-control 1 disp26) | |
| ) | |
| ) | |
| ) | |
| (define-cti | |
| l-jr | |
| "jump register (absolute iaddr)" | |
| (!COND-CTI UNCOND-CTI) | |
| "l.jr $rB" | |
| (+ OPC_JR (f-resv-25-10 0) rB (f-resv-10-11 0)) | |
| (.pmacro () | |
| (cti-transfer-control 1 rB) | |
| ) | |
| ) | |
| (define-cti | |
| l-jalr | |
| "jump register and link (absolute iaddr)" | |
| (!COND-CTI UNCOND-CTI) | |
| "l.jalr $rB" | |
| (+ OPC_JALR (f-resv-25-10 0) rB (f-resv-10-11 0) ) | |
| (.pmacro () | |
| (sequence () | |
| (cti-link-return) | |
| (cti-transfer-control 1 rB) | |
| ) | |
| ) | |
| ) | |
| (define-cti | |
| l-bnf | |
| "branch if condition bit not set (pc relative iaddr)" | |
| (COND-CTI !UNCOND-CTI) | |
| "l.bnf ${disp26}" | |
| (+ OPC_BNF disp26) | |
| (.pmacro () | |
| (cti-transfer-control (not sys-sr-f) disp26) | |
| ) | |
| ) | |
| (define-cti | |
| l-bf | |
| "branch if condition bit set (pc relative iaddr)" | |
| (COND-CTI !UNCOND-CTI) | |
| "l.bf ${disp26}" | |
| (+ OPC_BF disp26) | |
| (.pmacro () | |
| (cti-transfer-control sys-sr-f disp26) | |
| ) | |
| ) | |
| (dni l-trap "trap (exception)" | |
| ((MACH ORBIS-MACHS) NOT-IN-DELAY-SLOT) | |
| "l.trap ${uimm16}" | |
| (+ OPC_SYSTRAPSYNCS OPC_SYSTRAPSYNCS_TRAP (f-resv-20-5 0) uimm16) | |
| ; Do exception entry handling in C function, PC set based on SR state | |
| (raise-exception EXCEPT-TRAP) | |
| () | |
| ) | |
| (dni l-sys "syscall (exception)" | |
| ; This function may not be in delay slot | |
| ((MACH ORBIS-MACHS) NOT-IN-DELAY-SLOT) | |
| "l.sys ${uimm16}" | |
| (+ OPC_SYSTRAPSYNCS OPC_SYSTRAPSYNCS_SYSCALL (f-resv-20-5 0) uimm16) | |
| ; Do exception entry handling in C function, PC set based on SR state | |
| (raise-exception EXCEPT-SYSCALL) | |
| () | |
| ) | |
| (dni l-msync "memory sync" | |
| ((MACH ORBIS-MACHS)) | |
| "l.msync" | |
| (+ OPC_SYSTRAPSYNCS OPC_SYSTRAPSYNCS_MSYNC (f-resv-20-21 0)) | |
| (nop) | |
| () | |
| ) | |
| (dni l-psync "pipeline sync" | |
| ((MACH ORBIS-MACHS)) | |
| "l.psync" | |
| (+ OPC_SYSTRAPSYNCS OPC_SYSTRAPSYNCS_PSYNC (f-resv-20-21 0)) | |
| (nop) | |
| () | |
| ) | |
| (dni l-csync "context sync" | |
| ((MACH ORBIS-MACHS)) | |
| "l.csync" | |
| (+ OPC_SYSTRAPSYNCS OPC_SYSTRAPSYNCS_CSYNC (f-resv-20-21 0)) | |
| (nop) | |
| () | |
| ) | |
| (dni l-rfe "return from exception" | |
| ; This function may not be in delay slot | |
| ((MACH ORBIS-MACHS) NOT-IN-DELAY-SLOT FORCED-CTI) | |
| "l.rfe" | |
| (+ OPC_RFE (f-resv-25-26 0)) | |
| (c-call VOID "@cpu@_rfe") | |
| () | |
| ) | |
| ; Misc instructions | |
| ; l.nop with immediate must be first so it handles all l.nops in sim | |
| (dni l-nop-imm "nop uimm16" | |
| ((MACH ORBIS-MACHS)) | |
| "l.nop ${uimm16}" | |
| (+ OPC_NOP (f-op-25-2 #x1) (f-resv-23-8 0) uimm16) | |
| (c-call VOID "@cpu@_nop" (zext UWI uimm16)) | |
| () | |
| ) | |
| (if (application-is? SIMULATOR) | |
| (begin) | |
| (begin | |
| (dni l-nop "nop" | |
| ((MACH ORBIS-MACHS)) | |
| "l.nop" | |
| (+ OPC_NOP (f-op-25-2 #x1) (f-resv-23-8 0) uimm16) | |
| (nop) | |
| () | |
| ) | |
| ) | |
| ) | |
| (dni l-movhi "movhi reg/uimm16" | |
| ((MACH ORBIS-MACHS)) | |
| "l.movhi $rD,$uimm16" | |
| (+ OPC_MOVHIMACRC rD (f-resv-20-4 0) OPC_MOVHIMACRC_MOVHI uimm16) | |
| (set UWI rD (sll UWI (zext UWI uimm16) (const 16))) | |
| () | |
| ) | |
| (dni l-macrc "macrc reg" | |
| ((MACH ORBIS-MACHS)) | |
| "l.macrc $rD" | |
| (+ OPC_MOVHIMACRC rD (f-resv-20-4 0) OPC_MOVHIMACRC_MACRC (f-uimm16 0)) | |
| (sequence () | |
| (set UWI rD mac-maclo) | |
| (set UWI mac-maclo 0) | |
| (set UWI mac-machi 0) | |
| ) | |
| () | |
| ) | |
| ; System releated instructions | |
| (dni l-mfspr "mfspr" | |
| ((MACH ORBIS-MACHS)) | |
| "l.mfspr $rD,$rA,${uimm16}" | |
| (+ OPC_MFSPR rD rA uimm16) | |
| (set UWI rD (c-call UWI "@cpu@_mfspr" (or rA (zext UWI uimm16)))) | |
| () | |
| ) | |
| (dni l-mtspr "mtspr" | |
| ((MACH ORBIS-MACHS)) | |
| "l.mtspr $rA,$rB,${uimm16-split}" | |
| (+ OPC_MTSPR rA rB uimm16-split ) | |
| (c-call VOID "@cpu@_mtspr" (or rA (zext WI uimm16-split)) rB) | |
| () | |
| ) | |
| ; Load instructions | |
| (define-pmacro (load-store-addr base offset size) | |
| (c-call AI "@cpu@_make_load_store_addr" base (ext SI offset) size)) | |
| (dni l-lwz "l.lwz reg/simm16(reg)" | |
| ((MACH ORBIS-MACHS)) | |
| "l.lwz $rD,${simm16}($rA)" | |
| (+ OPC_LWZ rD rA simm16) | |
| (set UWI rD (zext UWI (mem USI (load-store-addr rA simm16 4)))) | |
| () | |
| ) | |
| (dni l-lws "l.lws reg/simm16(reg)" | |
| ((MACH ORBIS-MACHS)) | |
| "l.lws $rD,${simm16}($rA)" | |
| (+ OPC_LWS rD rA simm16) | |
| (set WI rD (ext WI (mem SI (load-store-addr rA simm16 4)))) | |
| () | |
| ) | |
| (dni l-lwa "l.lwa reg/simm16(reg)" | |
| ((MACH ORBIS-MACHS)) | |
| "l.lwa $rD,${simm16}($rA)" | |
| (+ OPC_LWA rD rA simm16) | |
| (sequence () | |
| (set UWI rD (zext UWI (mem USI (load-store-addr rA simm16 4)))) | |
| (set atomic-reserve (const 1)) | |
| (set atomic-address (load-store-addr rA simm16 4)) | |
| ) | |
| () | |
| ) | |
| (dni l-lbz "l.lbz reg/simm16(reg)" | |
| ((MACH ORBIS-MACHS)) | |
| "l.lbz $rD,${simm16}($rA)" | |
| (+ OPC_LBZ rD rA simm16) | |
| (set UWI rD (zext UWI (mem UQI (load-store-addr rA simm16 1)))) | |
| () | |
| ) | |
| (dni l-lbs "l.lbs reg/simm16(reg)" | |
| ((MACH ORBIS-MACHS)) | |
| "l.lbs $rD,${simm16}($rA)" | |
| (+ OPC_LBS rD rA simm16) | |
| (set WI rD (ext WI (mem QI (load-store-addr rA simm16 1)))) | |
| () | |
| ) | |
| (dni l-lhz "l.lhz reg/simm16(reg)" | |
| ((MACH ORBIS-MACHS)) | |
| "l.lhz $rD,${simm16}($rA)" | |
| (+ OPC_LHZ rD simm16 rA) | |
| (set UWI rD (zext UWI (mem UHI (load-store-addr rA simm16 2)))) | |
| () | |
| ) | |
| (dni l-lhs "l.lhs reg/simm16(reg)" | |
| ((MACH ORBIS-MACHS)) | |
| "l.lhs $rD,${simm16}($rA)" | |
| (+ OPC_LHS rD rA simm16) | |
| (set WI rD (ext WI (mem HI (load-store-addr rA simm16 2)))) | |
| () | |
| ) | |
| ; Store instructions | |
| (define-pmacro (store-insn mnemonic opc-op mode size) | |
| (begin | |
| (dni (.sym l- mnemonic) | |
| (.str "l." mnemonic " simm16(reg)/reg") | |
| ((MACH ORBIS-MACHS)) | |
| (.str "l." mnemonic " ${simm16-split}($rA),$rB") | |
| (+ opc-op rA rB simm16-split) | |
| (sequence ((SI addr)) | |
| (set addr (load-store-addr rA simm16-split size)) | |
| (set mode (mem mode addr) (trunc mode rB)) | |
| (if (eq (and addr #xffffffc) atomic-address) | |
| (set atomic-reserve (const 0)) | |
| ) | |
| ) | |
| () | |
| ) | |
| ) | |
| ) | |
| (store-insn sw OPC_SW USI 4) | |
| (store-insn sb OPC_SB UQI 1) | |
| (store-insn sh OPC_SH UHI 2) | |
| (dni l-swa "l.swa simm16(reg)/reg" | |
| ((MACH ORBIS-MACHS)) | |
| "l.swa ${simm16-split}($rA),$rB" | |
| (+ OPC_SWA rA rB simm16) | |
| (sequence ((SI addr) (BI flag)) | |
| (set addr (load-store-addr rA simm16-split 4)) | |
| (set sys-sr-f (and atomic-reserve (eq addr atomic-address))) | |
| (if sys-sr-f | |
| (set USI (mem USI addr) (trunc USI rB)) | |
| ) | |
| (set atomic-reserve (const 0)) | |
| ) | |
| () | |
| ) | |
| ; Shift and rotate instructions | |
| (define-pmacro (shift-insn mnemonic) | |
| (begin | |
| (dni (.sym l- mnemonic) | |
| (.str "l." mnemonic " reg/reg/reg") | |
| ((MACH ORBIS-MACHS)) | |
| (.str "l." mnemonic " $rD,$rA,$rB") | |
| (+ OPC_ALU rD rA rB (f-resv-10-3 0) (.sym OPC_SHROTS_ (.upcase mnemonic)) (f-resv-5-2 0) | |
| OPC_ALU_REGREG_SHROT ) | |
| (set UWI rD (mnemonic rA rB)) | |
| () | |
| ) | |
| (dni (.sym l- mnemonic "i") | |
| (.str "l." mnemonic " reg/reg/uimm6") | |
| ((MACH ORBIS-MACHS)) | |
| (.str "l." mnemonic "i $rD,$rA,${uimm6}") | |
| (+ OPC_SHROTI rD rA (f-resv-15-8 0) (.sym OPC_SHROTS_ (.upcase mnemonic)) uimm6) | |
| (set rD (mnemonic rA uimm6)) | |
| () | |
| ) | |
| ) | |
| ) | |
| (shift-insn sll) | |
| (shift-insn srl) | |
| (shift-insn sra) | |
| (shift-insn ror) | |
| ; Arithmetic insns | |
| ; ALU op macro | |
| (define-pmacro (alu-insn mnemonic) | |
| (begin | |
| (dni (.sym l- mnemonic) | |
| (.str "l." mnemonic " reg/reg/reg") | |
| ((MACH ORBIS-MACHS)) | |
| (.str "l." mnemonic " $rD,$rA,$rB") | |
| (+ OPC_ALU rD rA rB (f-resv-10-7 0) (.sym OPC_ALU_REGREG_ (.upcase mnemonic))) | |
| (set rD (mnemonic rA rB)) | |
| () | |
| ) | |
| ) | |
| ) | |
| (alu-insn and) | |
| (alu-insn or) | |
| (alu-insn xor) | |
| (define-pmacro (alu-carry-insn mnemonic) | |
| (begin | |
| (dni (.sym l- mnemonic) | |
| (.str "l." mnemonic " reg/reg/reg") | |
| ((MACH ORBIS-MACHS)) | |
| (.str "l." mnemonic " $rD,$rA,$rB") | |
| (+ OPC_ALU rD rA rB (f-resv-10-7 #x00) (.sym OPC_ALU_REGREG_ (.upcase mnemonic))) | |
| (sequence () | |
| (sequence () | |
| (set BI sys-sr-cy ((.sym mnemonic "c-cflag") WI rA rB 0)) | |
| (set BI sys-sr-ov ((.sym mnemonic "c-oflag") WI rA rB 0)) | |
| (set rD (mnemonic WI rA rB)) | |
| ) | |
| (if (andif sys-sr-ov sys-sr-ove) | |
| (raise-exception EXCEPT-RANGE)) | |
| ) | |
| () | |
| ) | |
| ) | |
| ) | |
| (alu-carry-insn add) | |
| (alu-carry-insn sub) | |
| (dni (l-addc) "l.addc reg/reg/reg" | |
| ((MACH ORBIS-MACHS)) | |
| ("l.addc $rD,$rA,$rB") | |
| (+ OPC_ALU rD rA rB (f-resv-10-7 #x00) OPC_ALU_REGREG_ADDC) | |
| (sequence () | |
| (sequence ((BI tmp-sys-sr-cy)) | |
| (set BI tmp-sys-sr-cy sys-sr-cy) | |
| (set BI sys-sr-cy (addc-cflag WI rA rB tmp-sys-sr-cy)) | |
| (set BI sys-sr-ov (addc-oflag WI rA rB tmp-sys-sr-cy)) | |
| (set rD (addc WI rA rB tmp-sys-sr-cy)) | |
| ) | |
| (if (andif sys-sr-ov sys-sr-ove) | |
| (raise-exception EXCEPT-RANGE)) | |
| ) | |
| () | |
| ) | |
| (dni (l-mul) "l.mul reg/reg/reg" | |
| ((MACH ORBIS-MACHS)) | |
| ("l.mul $rD,$rA,$rB") | |
| (+ OPC_ALU rD rA rB (f-resv-10-7 #x30) OPC_ALU_REGREG_MUL) | |
| (sequence () | |
| (sequence () | |
| (set BI sys-sr-ov (mul-o2flag WI rA rB)) | |
| (set rD (mul WI rA rB)) | |
| ) | |
| (if (andif sys-sr-ov sys-sr-ove) | |
| (raise-exception EXCEPT-RANGE)) | |
| ) | |
| () | |
| ) | |
| (dni (l-muld) "l.muld reg/reg" | |
| ((MACH ORBIS-MACHS)) | |
| ("l.muld $rA,$rB") | |
| (+ OPC_ALU (f-resv-25-5 0) rA rB (f-resv-10-7 #x30) OPC_ALU_REGREG_MULD) | |
| (sequence ((DI result)) | |
| (set DI result (mul DI (ext DI rA) (ext DI rB))) | |
| (set SI mac-machi (subword SI result 0)) | |
| (set SI mac-maclo (subword SI result 1)) | |
| ) | |
| () | |
| ) | |
| (dni (l-mulu) "l.mulu reg/reg/reg" | |
| ((MACH ORBIS-MACHS)) | |
| ("l.mulu $rD,$rA,$rB") | |
| (+ OPC_ALU rD rA rB (f-resv-10-7 #x30) OPC_ALU_REGREG_MULU) | |
| (sequence () | |
| (sequence () | |
| (set BI sys-sr-cy (mul-o1flag UWI rA rB)) | |
| (set rD (mul UWI rA rB)) | |
| ) | |
| (if (andif sys-sr-cy sys-sr-ove) | |
| (raise-exception EXCEPT-RANGE)) | |
| ) | |
| () | |
| ) | |
| (dni (l-muldu) "l.muld reg/reg" | |
| ((MACH ORBIS-MACHS)) | |
| ("l.muldu $rA,$rB") | |
| (+ OPC_ALU (f-resv-25-5 0) rA rB (f-resv-10-7 #x30) OPC_ALU_REGREG_MULDU) | |
| (sequence ((DI result)) | |
| (set DI result (mul DI (zext DI rA) (zext DI rB))) | |
| (set SI mac-machi (subword SI result 0)) | |
| (set SI mac-maclo (subword SI result 1)) | |
| ) | |
| () | |
| ) | |
| (dni l-div "divide (signed)" | |
| ((MACH ORBIS-MACHS)) | |
| "l.div $rD,$rA,$rB" | |
| (+ OPC_ALU rD rA rB (f-resv-10-7 #x30) OPC_ALU_REGREG_DIV) | |
| (if (ne rB 0) | |
| (sequence () | |
| (set BI sys-sr-ov 0) | |
| (set WI rD (div WI rA rB)) | |
| ) | |
| (sequence () | |
| (set BI sys-sr-ov 1) | |
| (if sys-sr-ove | |
| (raise-exception EXCEPT-RANGE)) | |
| ) | |
| ) | |
| () | |
| ) | |
| (dni l-divu "divide (unsigned)" | |
| ((MACH ORBIS-MACHS)) | |
| "l.divu $rD,$rA,$rB" | |
| (+ OPC_ALU rD rA rB (f-resv-10-7 #x30) OPC_ALU_REGREG_DIVU) | |
| (if (ne rB 0) | |
| (sequence () | |
| (set BI sys-sr-cy 0) | |
| (set rD (udiv UWI rA rB)) | |
| ) | |
| (sequence () | |
| (set BI sys-sr-cy 1) | |
| (if sys-sr-ove | |
| (raise-exception EXCEPT-RANGE)) | |
| ) | |
| ) | |
| () | |
| ) | |
| (dni l-ff1 "find first '1'" | |
| ((MACH ORBIS-MACHS)) | |
| "l.ff1 $rD,$rA" | |
| (+ OPC_ALU rD rA rB (f-resv-10-7 #x00) OPC_ALU_REGREG_FFL1) | |
| (set rD (c-call UWI "@cpu@_ff1" rA)) | |
| () | |
| ) | |
| (dni l-fl1 "find last '1'" | |
| ((MACH ORBIS-MACHS)) | |
| "l.fl1 $rD,$rA" | |
| (+ OPC_ALU rD rA rB (f-resv-10-7 #x10) OPC_ALU_REGREG_FFL1) | |
| (set rD (c-call UWI "@cpu@_fl1" rA)) | |
| () | |
| ) | |
| (define-pmacro (alu-insn-simm mnemonic) | |
| (begin | |
| (dni (.sym l- mnemonic "i") | |
| (.str "l." mnemonic " reg/reg/simm16") | |
| ((MACH ORBIS-MACHS)) | |
| (.str "l." mnemonic "i $rD,$rA,$simm16") | |
| (+ (.sym OPC_ (.upcase mnemonic) "I") rD rA simm16) | |
| (set rD (mnemonic rA (ext WI simm16))) | |
| () | |
| ) | |
| ) | |
| ) | |
| (define-pmacro (alu-insn-uimm mnemonic) | |
| (begin | |
| (dni (.sym l- mnemonic "i") | |
| (.str "l." mnemonic " reg/reg/uimm16") | |
| ((MACH ORBIS-MACHS)) | |
| (.str "l." mnemonic "i $rD,$rA,$uimm16") | |
| (+ (.sym OPC_ (.upcase mnemonic) "I") rD rA uimm16) | |
| (set rD (mnemonic rA (zext UWI uimm16))) | |
| () | |
| ) | |
| ) | |
| ) | |
| (alu-insn-uimm and) | |
| (alu-insn-uimm or) | |
| (alu-insn-simm xor) | |
| (define-pmacro (alu-carry-insn-simm mnemonic) | |
| (begin | |
| (dni (.sym l- mnemonic "i") | |
| (.str "l." mnemonic "i reg/reg/simm16") | |
| ((MACH ORBIS-MACHS)) | |
| (.str "l." mnemonic "i $rD,$rA,$simm16") | |
| (+ (.sym OPC_ (.upcase mnemonic) "I") rD rA simm16) | |
| (sequence () | |
| (sequence () | |
| (set BI sys-sr-cy ((.sym mnemonic "c-cflag") WI rA (ext WI simm16) 0)) | |
| (set BI sys-sr-ov ((.sym mnemonic "c-oflag") WI rA (ext WI simm16) 0)) | |
| (set rD (mnemonic WI rA (ext WI simm16))) | |
| ) | |
| (if (andif sys-sr-ov sys-sr-ove) | |
| (raise-exception EXCEPT-RANGE)) | |
| ) | |
| () | |
| ) | |
| ) | |
| ) | |
| (alu-carry-insn-simm add) | |
| (dni (l-addic) | |
| ("l.addic reg/reg/simm16") | |
| ((MACH ORBIS-MACHS)) | |
| ("l.addic $rD,$rA,$simm16") | |
| (+ OPC_ADDIC rD rA simm16) | |
| (sequence () | |
| (sequence ((BI tmp-sys-sr-cy)) | |
| (set BI tmp-sys-sr-cy sys-sr-cy) | |
| (set BI sys-sr-cy (addc-cflag WI rA (ext WI simm16) tmp-sys-sr-cy)) | |
| (set BI sys-sr-ov (addc-oflag WI rA (ext WI simm16) tmp-sys-sr-cy)) | |
| (set WI rD (addc WI rA (ext WI simm16) tmp-sys-sr-cy)) | |
| ) | |
| (if (andif sys-sr-ov sys-sr-ove) | |
| (raise-exception EXCEPT-RANGE)) | |
| ) | |
| () | |
| ) | |
| (dni (l-muli) | |
| "l.muli reg/reg/simm16" | |
| ((MACH ORBIS-MACHS)) | |
| ("l.muli $rD,$rA,$simm16") | |
| (+ OPC_MULI rD rA simm16) | |
| (sequence () | |
| (sequence () | |
| (set sys-sr-ov (mul-o2flag WI rA (ext WI simm16))) | |
| (set rD (mul WI rA (ext WI simm16))) | |
| ) | |
| (if (andif sys-sr-ov sys-sr-ove) | |
| (raise-exception EXCEPT-RANGE)) | |
| ) | |
| () | |
| ) | |
| (define-pmacro (extbh-insn mnemonic extop extmode truncmode) | |
| (begin | |
| (dni (.sym l- mnemonic) | |
| (.str "l." mnemonic " reg/reg") | |
| ((MACH ORBIS-MACHS)) | |
| (.str "l." mnemonic " $rD,$rA") | |
| (+ OPC_ALU rD rA (f-resv-15-6 0) (.sym OPC_EXTBHS_ (.upcase mnemonic)) (f-resv-5-2 0) OPC_ALU_REGREG_EXTBH) | |
| (set rD (extop extmode (trunc truncmode rA))) | |
| () | |
| ) | |
| ) | |
| ) | |
| (extbh-insn exths ext WI HI) | |
| (extbh-insn extbs ext WI QI) | |
| (extbh-insn exthz zext UWI UHI) | |
| (extbh-insn extbz zext UWI UQI) | |
| (define-pmacro (extw-insn mnemonic extop extmode truncmode) | |
| (begin | |
| (dni (.sym l- mnemonic) | |
| (.str "l." mnemonic " reg/reg") | |
| ((MACH ORBIS-MACHS)) | |
| (.str "l." mnemonic " $rD,$rA") | |
| (+ OPC_ALU rD rA (f-resv-15-6 0) (.sym OPC_EXTWS_ (.upcase mnemonic)) (f-resv-5-2 0) OPC_ALU_REGREG_EXTW) | |
| (set rD (extop extmode (trunc truncmode rA))) | |
| () | |
| ) | |
| ) | |
| ) | |
| (extw-insn extws ext WI SI) | |
| (extw-insn extwz zext USI USI) | |
| (dni l-cmov | |
| "l.cmov reg/reg/reg" | |
| ((MACH ORBIS-MACHS)) | |
| "l.cmov $rD,$rA,$rB" | |
| (+ OPC_ALU rD rA rB (f-resv-10-1 0) (f-op-9-2 0) (f-resv-7-4 0) OPC_ALU_REGREG_CMOV) | |
| (if sys-sr-f | |
| (set UWI rD rA) | |
| (set UWI rD rB) | |
| ) | |
| () | |
| ) | |
| ; Compare instructions | |
| ; Ordering compare | |
| (define-pmacro (sf-insn op) | |
| (begin | |
| (dni (.sym l- "sf" op "s") ; l-sfgts | |
| (.str "l.sf" op "s reg/reg") ; "l.sfgts reg/reg" | |
| ((MACH ORBIS-MACHS)) | |
| (.str "l.sf" op "s $rA,$rB") ; "l.sfgts $rA,$rB" | |
| (+ OPC_SF (.sym "OPC_SF_" (.upcase op) "S") rA rB (f-resv-10-11 0)) ; (+ OPC_SF OPC_SF_GTS rA rB (f-resv-10-11 0)) | |
| (set sys-sr-f (op WI rA rB)) ; (set sys-sr-f (gt WI rA rB)) | |
| () | |
| ) | |
| (dni (.sym l- "sf" op "si") ; l-sfgtsi | |
| (.str "l.sf" op "si reg/simm16") ; "l.sfgtsi reg/simm16" | |
| ((MACH ORBIS-MACHS)) | |
| (.str "l.sf" op "si $rA,$simm16") ; "l.sfgtsi $rA,$simm16" | |
| (+ OPC_SFI (.sym "OPC_SF_" (.upcase op) "S") rA simm16) ; (+ OPC_SFI OPC_SF_GTS rA simm16) | |
| (set sys-sr-f (op WI rA (ext WI simm16))) ; (set sys-sr-f (gt WI rA (ext WI simm16))) | |
| () | |
| ) | |
| (dni (.sym l- "sf" op "u") ; l-sfgtu | |
| (.str "l.sf" op "u reg/reg") ; "l.sfgtu reg/reg" | |
| ((MACH ORBIS-MACHS)) | |
| (.str "l.sf" op "u $rA,$rB") ; "l.sfgtu $rA,$rB" | |
| (+ OPC_SF (.sym "OPC_SF_" (.upcase op) "U") rA rB (f-resv-10-11 0)) ; (+ OPC_SF OPC_SF_GTU rA rB (f-resv-10-11 0)) | |
| (set sys-sr-f ((.sym op "u") WI rA rB)) ; (set sys-sr-f (gtu WI rA rB)) | |
| () | |
| ) | |
| ; immediate is sign extended even for unsigned compare | |
| (dni (.sym l- "sf" op "ui") ; l-sfgtui | |
| (.str "l.sf" op "ui reg/simm16") ; "l.sfgtui reg/uimm16" | |
| ((MACH ORBIS-MACHS)) | |
| (.str "l.sf" op "ui $rA,$simm16") ; "l.sfgtui $rA,$simm16" | |
| (+ OPC_SFI (.sym "OPC_SF_" (.upcase op) "U") rA simm16) ; (+ OPC_SFI OPC_SF_GTU rA simm16) | |
| (set sys-sr-f ((.sym op "u") WI rA (ext WI simm16))) ; (set sys-sr-f (gtu WI rA (ext WI simm16))) | |
| () | |
| ) | |
| ) | |
| ) | |
| (sf-insn gt) | |
| (sf-insn ge) | |
| (sf-insn lt) | |
| (sf-insn le) | |
| ; Equality compare | |
| (define-pmacro (sf-insn-eq op) | |
| (begin | |
| (dni (.sym l- "sf" op) | |
| (.str "l." op " reg/reg") | |
| ((MACH ORBIS-MACHS)) | |
| (.str "l.sf" op " $rA,$rB") | |
| (+ OPC_SF (.sym "OPC_SF_" (.upcase op)) rA rB (f-resv-10-11 0)) | |
| (set sys-sr-f (op WI rA rB)) | |
| () | |
| ) | |
| (dni (.sym l- "sf" op "i") | |
| (.str "l.sf" op "i reg/simm16") | |
| ((MACH ORBIS-MACHS)) | |
| (.str "l.sf" op "i $rA,$simm16") | |
| (+ OPC_SFI (.sym "OPC_SF_" (.upcase op)) rA simm16) | |
| (set sys-sr-f (op WI rA (ext WI simm16))) | |
| () | |
| ) | |
| ) | |
| ) | |
| (sf-insn-eq eq) | |
| (sf-insn-eq ne) | |
| (dni l-mac | |
| "l.mac reg/reg" | |
| ((MACH ORBIS-MACHS)) | |
| "l.mac $rA,$rB" | |
| (+ OPC_MAC (f-op-25-5 0) rA rB (f-resv-10-7 0) OPC_MAC_MAC) | |
| (sequence () | |
| (sequence ((DI prod) (DI mac) (DI result)) | |
| (set DI prod (mul DI (ext DI rA) (ext DI rB))) | |
| (set DI mac (join DI SI mac-machi mac-maclo)) | |
| (set DI result (add prod mac)) | |
| (set SI mac-machi (subword SI result 0)) | |
| (set SI mac-maclo (subword SI result 1)) | |
| (set BI sys-sr-ov (addc-oflag prod mac 0)) | |
| ) | |
| (if (andif sys-sr-ov sys-sr-ove) | |
| (raise-exception EXCEPT-RANGE)) | |
| ) | |
| () | |
| ) | |
| (dni l-maci | |
| "l.maci reg/simm16" | |
| ((MACH ORBIS-MACHS)) | |
| "l.maci $rA,${simm16}" | |
| (+ OPC_MACI (f-resv-25-5 0) rA simm16) | |
| (sequence () | |
| (sequence ((DI prod) (DI mac) (DI result)) | |
| (set DI prod (mul DI (ext DI rA) (ext DI simm16))) | |
| (set DI mac (join DI SI mac-machi mac-maclo)) | |
| (set DI result (add mac prod)) | |
| (set SI mac-machi (subword SI result 0)) | |
| (set SI mac-maclo (subword SI result 1)) | |
| (set BI sys-sr-ov (addc-oflag prod mac 0)) | |
| ) | |
| (if (andif sys-sr-ov sys-sr-ove) | |
| (raise-exception EXCEPT-RANGE)) | |
| ) | |
| () | |
| ) | |
| (dni l-macu | |
| "l.macu reg/reg" | |
| ((MACH ORBIS-MACHS)) | |
| "l.macu $rA,$rB" | |
| (+ OPC_MAC (f-op-25-5 0) rA rB (f-resv-10-7 0) OPC_MAC_MACU) | |
| (sequence () | |
| (sequence ((DI prod) (DI mac) (DI result)) | |
| (set DI prod (mul DI (zext DI rA) (zext DI rB))) | |
| (set DI mac (join DI SI mac-machi mac-maclo)) | |
| (set DI result (add prod mac)) | |
| (set SI mac-machi (subword SI result 0)) | |
| (set SI mac-maclo (subword SI result 1)) | |
| (set BI sys-sr-cy (addc-cflag prod mac 0)) | |
| ) | |
| (if (andif sys-sr-cy sys-sr-ove) | |
| (raise-exception EXCEPT-RANGE)) | |
| ) | |
| () | |
| ) | |
| (dni l-msb | |
| "l.msb reg/reg" | |
| ((MACH ORBIS-MACHS)) | |
| "l.msb $rA,$rB" | |
| (+ OPC_MAC (f-op-25-5 0) rA rB (f-resv-10-7 0) OPC_MAC_MSB) | |
| (sequence () | |
| (sequence ((DI prod) (DI mac) (DI result)) | |
| (set DI prod (mul DI (ext DI rA) (ext DI rB))) | |
| (set DI mac (join DI SI mac-machi mac-maclo)) | |
| (set DI result (sub mac prod)) | |
| (set SI mac-machi (subword SI result 0)) | |
| (set SI mac-maclo (subword SI result 1)) | |
| (set BI sys-sr-ov (subc-oflag mac result 0)) | |
| ) | |
| (if (andif sys-sr-ov sys-sr-ove) | |
| (raise-exception EXCEPT-RANGE)) | |
| ) | |
| () | |
| ) | |
| (dni l-msbu | |
| "l.msbu reg/reg" | |
| ((MACH ORBIS-MACHS)) | |
| "l.msbu $rA,$rB" | |
| (+ OPC_MAC (f-op-25-5 0) rA rB (f-resv-10-7 0) OPC_MAC_MSBU) | |
| (sequence () | |
| (sequence ((DI prod) (DI mac) (DI result)) | |
| (set DI prod (mul DI (zext DI rA) (zext DI rB))) | |
| (set DI mac (join DI SI mac-machi mac-maclo)) | |
| (set DI result (sub mac prod)) | |
| (set SI mac-machi (subword SI result 0)) | |
| (set SI mac-maclo (subword SI result 1)) | |
| (set BI sys-sr-cy (subc-cflag mac result 0)) | |
| ) | |
| (if (andif sys-sr-cy sys-sr-ove) | |
| (raise-exception EXCEPT-RANGE)) | |
| ) | |
| () | |
| ) | |
| (define-pmacro (cust-insn cust-num) | |
| (begin | |
| (dni (.sym l- "cust" cust-num) | |
| (.str "l.cust" cust-num) | |
| ((MACH ORBIS-MACHS)) | |
| (.str "l.cust" cust-num) | |
| (+ (.sym OPC_CUST cust-num) (f-resv-25-26 0)) | |
| (nop) | |
| () | |
| ) | |
| ) | |
| ) | |
| (cust-insn "1") | |
| (cust-insn "2") | |
| (cust-insn "3") | |
| (cust-insn "4") | |
| (cust-insn "5") | |
| (cust-insn "6") | |
| (cust-insn "7") | |
| (cust-insn "8") |