|  | ; Toshiba MeP FMAX Coprocessor 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. | 
|  |  | 
|  | ;------------------------------------------------------------------------------ | 
|  | ; MeP-Integrator will redefine the isa pmacros below to allow the bit widths | 
|  | ; specified below for each ME_MODULE using this coprocessor. | 
|  | ; This coprocessor requires only the 32 bit insns in the core. | 
|  | ;------------------------------------------------------------------------------ | 
|  | ; begin-isas | 
|  | (define-pmacro fmax-core-isa () (ISA ext_core2)) | 
|  | (define-pmacro all-fmax-isas () (ISA ext_core2)) | 
|  | ; end-isas | 
|  |  | 
|  | ;****************************************************************************** | 
|  | ; ifields | 
|  | ;------------------------------------------------------------------------------ | 
|  | ; opcodes | 
|  | (dnf f-fmax-0-4  "opcode" (all-fmax-isas)  0 4) | 
|  | (dnf f-fmax-4-4  "opcode" (all-fmax-isas)  4 4) | 
|  | (dnf f-fmax-8-4  "opcode" (all-fmax-isas)  8 4) | 
|  | (dnf f-fmax-12-4 "opcode" (all-fmax-isas) 12 4) | 
|  | (dnf f-fmax-16-4 "opcode" (all-fmax-isas) 16 4) | 
|  | (dnf f-fmax-20-4 "opcode" (all-fmax-isas) 20 4) | 
|  | (dnf f-fmax-24-4 "opcode" (all-fmax-isas) 24 4) | 
|  | (dnf f-fmax-28-1 "opcode" (all-fmax-isas) 28 1) | 
|  | (dnf f-fmax-29-1 "opcode" (all-fmax-isas) 29 1) | 
|  | (dnf f-fmax-30-1 "opcode" (all-fmax-isas) 30 1) | 
|  | (dnf f-fmax-31-1 "opcode" (all-fmax-isas) 31 1) | 
|  |  | 
|  | ;------------------------------------------------------------------------------ | 
|  | ; FR registers | 
|  | (define-multi-ifield | 
|  | (name f-fmax-frd) | 
|  | (comment "FRd register") | 
|  | (attrs all-fmax-isas) | 
|  | (mode UINT) | 
|  | (subfields f-fmax-28-1 f-fmax-4-4) | 
|  | (insert (sequence () | 
|  | (set (ifield f-fmax-4-4) (and (ifield f-fmax-frd) #xf)) | 
|  | (set (ifield f-fmax-28-1) (srl (ifield f-fmax-frd) 4)))) | 
|  | (extract (set (ifield f-fmax-frd) | 
|  | (or (sll (ifield f-fmax-28-1) 4) (ifield f-fmax-4-4)))) | 
|  | ) | 
|  | (define-multi-ifield | 
|  | (name f-fmax-frn) | 
|  | (comment "FRn register") | 
|  | (attrs all-fmax-isas) | 
|  | (mode UINT) | 
|  | (subfields f-fmax-29-1 f-fmax-20-4) | 
|  | (insert (sequence () | 
|  | (set (ifield f-fmax-20-4) (and (ifield f-fmax-frn) #xf)) | 
|  | (set (ifield f-fmax-29-1) (srl (ifield f-fmax-frn) 4)))) | 
|  | (extract (set (ifield f-fmax-frn) | 
|  | (or (sll (ifield f-fmax-29-1) 4) (ifield f-fmax-20-4)))) | 
|  | ) | 
|  | (define-multi-ifield | 
|  | (name f-fmax-frm) | 
|  | (comment "FRm register") | 
|  | (attrs all-fmax-isas) | 
|  | (mode UINT) | 
|  | (subfields f-fmax-30-1 f-fmax-24-4) | 
|  | (insert (sequence () | 
|  | (set (ifield f-fmax-24-4) (and (ifield f-fmax-frm) #xf)) | 
|  | (set (ifield f-fmax-30-1) (srl (ifield f-fmax-frm) 4)))) | 
|  | (extract (set (ifield f-fmax-frm) | 
|  | (or (sll (ifield f-fmax-30-1) 4) (ifield f-fmax-24-4)))) | 
|  | ) | 
|  |  | 
|  | ;------------------------------------------------------------------------------ | 
|  | ; Core General registers | 
|  | (dnf f-fmax-rm  "opcode" (all-fmax-isas)  8 4) | 
|  |  | 
|  | ;------------------------------------------------------------------------------ | 
|  | ; Condition opcodes enum | 
|  | (define-normal-insn-enum fmax-cond "condition opcode enum" (all-fmax-isas) FMAX_ f-fmax-8-4 | 
|  | ("f"  "u"  "e"  "ue"  "l"  "ul"  "le"  "ule" | 
|  | "fi" "ui" "ei" "uei" "li" "uli" "lei" "ulei") | 
|  | ) | 
|  |  | 
|  | ;****************************************************************************** | 
|  | ; Hardware | 
|  | ;------------------------------------------------------------------------------ | 
|  | ; FR registers | 
|  |  | 
|  | ; Given a coprocessor register number N, expand to a | 
|  | ; name/index pair: ($frN N) | 
|  | (define-pmacro (-fmax-fr-reg-pair n) ((.sym "fr" n) n)) | 
|  | (define-pmacro (-fmax-cr-reg-pair n) ((.sym "c" n) n)) | 
|  |  | 
|  | ; NOTE: This exists solely for the purpose of providing the proper register names for this coprocessor. | 
|  | ; GDB will use the hardware table generated from this declaration. The operands use h-cr | 
|  | ; from mep-core.cpu so that SID's semantic trace will be consistent between | 
|  | ; the core and the coprocessor but use parse/print handlers which reference the hardware table | 
|  | ; generated from this declarations | 
|  | (define-hardware | 
|  | (name h-cr-fmax) | 
|  | (comment "Floating point registers") | 
|  | (attrs all-fmax-isas VIRTUAL IS_FLOAT) | 
|  | (type register SF (32)) | 
|  | (indices keyword "$" | 
|  | (.splice (.unsplice (.map -fmax-fr-reg-pair (.iota 32))) | 
|  | (.unsplice (.map -fmax-cr-reg-pair (.iota 32)))) | 
|  | ) | 
|  | (get (index) (c-call SF "fmax_fr_get_handler" index)) | 
|  | (set (index newval) (c-call VOID "fmax_fr_set_handler" index newval)) | 
|  | ) | 
|  |  | 
|  | ;------------------------------------------------------------------------------ | 
|  | ; Control registers | 
|  | ; NOTE: This exists solely for the purpose of providing the proper register names for this coprocessor. | 
|  | ; GDB will use the hardware table generated from this declaration. The operands use h-ccr | 
|  | ; from mep-core.cpu so that SID's semantic trace will be consistent between | 
|  | ; the core and the coprocessor but use parse/print handlers which reference the hardware table | 
|  | ; generated from this declarations | 
|  | (define-hardware | 
|  | (name h-ccr-fmax) | 
|  | (comment "Coprocessor Identifier and Revision Register") | 
|  | (attrs all-fmax-isas VIRTUAL) | 
|  | (type register USI (16)) | 
|  | (indices keyword "$" ( | 
|  | ("cirr"  0) ("fcr0"   0) ("ccr0"   0) | 
|  | ("cbcr"  1) ("fcr1"   1) ("ccr1"   1) | 
|  | ("cerr" 15) ("fcr15" 15) ("ccr15" 15) | 
|  | ) | 
|  | ) | 
|  | (set (index newval) (c-call VOID "h_ccr_set" index newval)) | 
|  | (get (index) (c-call SI "h_ccr_get" index)) | 
|  | ) | 
|  |  | 
|  | ;------------------------------------------------------------------------------ | 
|  | ; Misc | 
|  | (define-hardware | 
|  | (name h-fmax-compare-i-p) | 
|  | (comment "flag") | 
|  | (attrs all-fmax-isas) | 
|  | (type register USI) | 
|  | ) | 
|  |  | 
|  | ;****************************************************************************** | 
|  | ; Operands | 
|  | ;------------------------------------------------------------------------------ | 
|  | ; FR Registers | 
|  | (define-full-operand fmax-FRd "FRd" (all-fmax-isas (CDATA FMAX_FLOAT)) h-cr SF f-fmax-frd ((parse "fmax_cr") (print "fmax_cr")) () ()) | 
|  | (define-full-operand fmax-FRn "FRn" (all-fmax-isas (CDATA FMAX_FLOAT)) h-cr SF f-fmax-frn ((parse "fmax_cr") (print "fmax_cr")) () ()) | 
|  | (define-full-operand fmax-FRm "FRm" (all-fmax-isas (CDATA FMAX_FLOAT)) h-cr SF f-fmax-frm ((parse "fmax_cr") (print "fmax_cr")) () ()) | 
|  |  | 
|  | (define-full-operand fmax-FRd-int "FRd as an integer" (all-fmax-isas (CDATA FMAX_INT)) h-cr SI f-fmax-frd ((parse "fmax_cr") (print "fmax_cr")) () ()) | 
|  | (define-full-operand fmax-FRn-int "FRn as an integer" (all-fmax-isas (CDATA FMAX_INT)) h-cr SI f-fmax-frn ((parse "fmax_cr") (print "fmax_cr")) () ()) | 
|  |  | 
|  | ;------------------------------------------------------------------------------ | 
|  | ; Control registers | 
|  | (define-full-operand fmax-CCRn "CCRn" (all-fmax-isas (CDATA REGNUM)) h-ccr DFLT f-fmax-4-4 ((parse "fmax_ccr") (print "fmax_ccr")) () ()) | 
|  |  | 
|  | (dnop fmax-CIRR "CIRR" (all-fmax-isas SEM-ONLY) h-ccr 0) | 
|  | (dnop fmax-CBCR "CBCR" (all-fmax-isas SEM-ONLY) h-ccr 1) | 
|  | (dnop fmax-CERR "CERR" (all-fmax-isas SEM-ONLY) h-ccr 15) | 
|  |  | 
|  | ;------------------------------------------------------------------------------ | 
|  | ; Core General Registers | 
|  | (dnop fmax-Rm "Rm" (all-fmax-isas) h-gpr f-fmax-rm) | 
|  |  | 
|  | ;------------------------------------------------------------------------------ | 
|  | ; misc | 
|  | (dnop fmax-Compare-i-p "flag" (all-fmax-isas SEM-ONLY) h-fmax-compare-i-p f-nil) | 
|  |  | 
|  | ;****************************************************************************** | 
|  | ; Instructions | 
|  | ;------------------------------------------------------------------------------ | 
|  | ; Binary Arithmetic | 
|  | (define-pmacro (fmax-binary-arith op opc sem) | 
|  | (dni op | 
|  | (.str op " FRd,FRn,FRm") | 
|  | (all-fmax-isas MAY_TRAP) | 
|  | (.str op " ${fmax-FRd},${fmax-FRn},${fmax-FRm}") | 
|  | (+ (f-fmax-0-4 #xF) fmax-FRd (f-fmax-8-4 opc) (f-fmax-12-4 #x7) (f-fmax-16-4 0) | 
|  | fmax-FRn fmax-FRm (f-fmax-31-1 0)) | 
|  | sem | 
|  | () | 
|  | ) | 
|  | ) | 
|  |  | 
|  | (fmax-binary-arith fadds #x0 (set fmax-FRd (add fmax-FRn fmax-FRm))) | 
|  | (fmax-binary-arith fsubs #x1 (set fmax-FRd (sub fmax-FRn fmax-FRm))) | 
|  | (fmax-binary-arith fmuls #x2 (set fmax-FRd (mul fmax-FRn fmax-FRm))) | 
|  | (fmax-binary-arith fdivs #x3 (set fmax-FRd (div fmax-FRn fmax-FRm))) | 
|  |  | 
|  | ;------------------------------------------------------------------------------ | 
|  | ; Unary Arithmetic | 
|  | (define-pmacro (fmax-unary-arith op opc sem) | 
|  | (dni op | 
|  | (.str op " FRd,FRn") | 
|  | (all-fmax-isas MAY_TRAP) | 
|  | (.str op " ${fmax-FRd},${fmax-FRn}") | 
|  | (+ (f-fmax-0-4 #xF) fmax-FRd (f-fmax-8-4 opc) (f-fmax-12-4 #x7) | 
|  | (f-fmax-16-4 0)  fmax-FRn (f-fmax-24-4 0) (f-fmax-30-1 0) (f-fmax-31-1 0)) | 
|  | sem | 
|  | () | 
|  | ) | 
|  | ) | 
|  |  | 
|  | (fmax-unary-arith fsqrts #x4 (set fmax-FRd (sqrt fmax-FRn))) | 
|  | (fmax-unary-arith fabss  #x5 (set fmax-FRd (abs fmax-FRn))) | 
|  | (fmax-unary-arith fnegs  #x7 (set fmax-FRd (neg fmax-FRn))) | 
|  | (fmax-unary-arith fmovs  #x6 (set fmax-FRd fmax-FRn)) | 
|  |  | 
|  | ;------------------------------------------------------------------------------ | 
|  | ; Conversions | 
|  | (define-pmacro (fmax-conv op opc1 opc2 opnd1 opnd2 sem) | 
|  | (dni op | 
|  | (.str op " FRd,FRn") | 
|  | (all-fmax-isas MAY_TRAP) | 
|  | (.str op " ${" opnd1 "},${" opnd2 "}") | 
|  | (+ (f-fmax-0-4 #xF) opnd1 (f-fmax-8-4 opc1) (f-fmax-12-4 #x7) | 
|  | (f-fmax-16-4 opc2)  opnd2 (f-fmax-24-4 0) (f-fmax-30-1 0) (f-fmax-31-1 0)) | 
|  | sem | 
|  | () | 
|  | ) | 
|  | ) | 
|  |  | 
|  | (fmax-conv froundws #xC #x0 fmax-FRd-int fmax-FRn     (set fmax-FRd-int (c-call SI "fmax_froundws" fmax-FRn))) | 
|  | (fmax-conv ftruncws #xD #x0 fmax-FRd-int fmax-FRn     (set fmax-FRd-int (c-call SI "fmax_ftruncws" fmax-FRn))) | 
|  | (fmax-conv fceilws  #xE #x0 fmax-FRd-int fmax-FRn     (set fmax-FRd-int (c-call SI "fmax_fceilws" fmax-FRn))) | 
|  | (fmax-conv ffloorws #xF #x0 fmax-FRd-int fmax-FRn     (set fmax-FRd-int (c-call SI "fmax_ffloorws" fmax-FRn))) | 
|  | (fmax-conv fcvtws   #x4 #x1 fmax-FRd-int fmax-FRn     (set fmax-FRd-int (c-call SI "fmax_fcvtws" fmax-FRn))) | 
|  | (fmax-conv fcvtsw   #x0 #x9 fmax-FRd     fmax-FRn-int (set fmax-FRd (float SF FPCONV-DEFAULT fmax-FRn-int))) | 
|  |  | 
|  | ;------------------------------------------------------------------------------ | 
|  | ; Comparisons | 
|  | ; | 
|  | ; Comparison with no exceptions | 
|  | (define-pmacro (fmax-f-sem x y)  (andif (gt x y) (lt x y))) ; do this to get exception detection | 
|  | (define-pmacro (fmax-u-sem x y)  (not (orif (lt x y) (orif (eq x y) (gt x y))))) | 
|  | (define-pmacro (fmax-e-sem x y)  (eq x y)) | 
|  | (define-pmacro (fmax-ue-sem x y) (not (orif (lt x y) (gt x y)))) | 
|  | (define-pmacro (fmax-l-sem x y)  (lt x y)) | 
|  | (define-pmacro (fmax-ul-sem x y) (not (orif (gt x y) (eq x y)))) | 
|  | (define-pmacro (fmax-le-sem x y) (orif (lt x y) (eq x y))) | 
|  | (define-pmacro (fmax-ule-sem x y) (not (gt x y))) | 
|  |  | 
|  | (define-pmacro (fmax-comp cond suffix exceptions) | 
|  | (dni (.sym fcmp cond suffix s) | 
|  | (.str "fcmp" cond suffix "s FRn,FRm") | 
|  | ;; Even though the instruction doesn't really trap if EXCEPTIONS | 
|  | ;; is zero, we don't want gcc to put it in a repeat or erepeat | 
|  | ;; block because of the hazards between fcmp instructions and | 
|  | ;; anything that reads CBCR. | 
|  | (all-fmax-isas MAY_TRAP) | 
|  | (.str "fcmp" cond suffix "s ${fmax-FRn},${fmax-FRm}") | 
|  | (+ (f-fmax-0-4 #xF) (f-fmax-4-4 0) (.sym FMAX_ cond suffix) (f-fmax-12-4 #x7) | 
|  | (f-fmax-16-4 #x2) (f-fmax-28-1 0) fmax-FRn fmax-FRm (f-fmax-31-1 0)) | 
|  | (sequence () | 
|  | (set fmax-Compare-i-p exceptions) | 
|  | (set fmax-CBCR ((.sym fmax- cond -sem) fmax-FRn fmax-FRm)) | 
|  | (set fmax-Compare-i-p 0) | 
|  | ) | 
|  | () | 
|  | ) | 
|  | ) | 
|  |  | 
|  | ; Comparison with no exceptions | 
|  | (fmax-comp f   "" 0) | 
|  | (fmax-comp u   "" 0) | 
|  | (fmax-comp e   "" 0) | 
|  | (fmax-comp ue  "" 0) | 
|  | (fmax-comp l   "" 0) | 
|  | (fmax-comp ul  "" 0) | 
|  | (fmax-comp le  "" 0) | 
|  | (fmax-comp ule "" 0) | 
|  |  | 
|  | ; Comparison with exceptions | 
|  | (fmax-comp f   i 1) | 
|  | (fmax-comp u   i 1) | 
|  | (fmax-comp e   i 1) | 
|  | (fmax-comp ue  i 1) | 
|  | (fmax-comp l   i 1) | 
|  | (fmax-comp ul  i 1) | 
|  | (fmax-comp le  i 1) | 
|  | (fmax-comp ule i 1) | 
|  |  | 
|  | ;------------------------------------------------------------------------------ | 
|  | ; Move to/from core registers | 
|  | (dni cmov-frn-rm | 
|  | "cmov FRn,Rm" | 
|  | (all-fmax-isas (INTRINSIC "cmov1")) | 
|  | "cmov ${fmax-FRd-int},${fmax-Rm}" | 
|  | (+ (f-fmax-0-4 #xF) fmax-FRd-int fmax-Rm (f-fmax-12-4 #x7) | 
|  | (f-fmax-16-4 #xF) (f-fmax-20-4 0) (f-fmax-24-4 0) | 
|  | (f-fmax-29-1 0) (f-fmax-30-1 0) (f-fmax-31-1 0)) | 
|  | (set fmax-FRd-int fmax-Rm) | 
|  | () | 
|  | ) | 
|  | (dni cmov-rm-frn | 
|  | "cmov Rm,FRn" | 
|  | (all-fmax-isas (INTRINSIC "cmov2")) | 
|  | "cmov ${fmax-Rm},${fmax-FRd-int}" | 
|  | (+ (f-fmax-0-4 #xF) fmax-FRd-int fmax-Rm (f-fmax-12-4 #x7) | 
|  | (f-fmax-16-4 #xF) (f-fmax-20-4 0) (f-fmax-24-4 0) | 
|  | (f-fmax-29-1 0) (f-fmax-30-1 0) (f-fmax-31-1 1)) | 
|  | (set fmax-Rm fmax-FRd-int) | 
|  | () | 
|  | ) | 
|  | (dni cmovc-ccrn-rm | 
|  | "cmovc CCRn,Rm" | 
|  | (all-fmax-isas (INTRINSIC "cmovc1")) | 
|  | "cmovc ${fmax-CCRn},${fmax-Rm}" | 
|  | (+ (f-fmax-0-4 #xF) fmax-CCRn fmax-Rm (f-fmax-12-4 #x7) | 
|  | (f-fmax-16-4 #xF) (f-fmax-20-4 0) (f-fmax-24-4 0) | 
|  | (f-fmax-28-1 0) (f-fmax-29-1 0) (f-fmax-30-1 1) (f-fmax-31-1 0)) | 
|  | (set fmax-CCRn fmax-Rm) | 
|  | () | 
|  | ) | 
|  | (dni cmovc-rm-ccrn | 
|  | "cmovc Rm,CCRn" | 
|  | (all-fmax-isas (INTRINSIC "cmovc2")) | 
|  | "cmovc ${fmax-Rm},${fmax-CCRn}" | 
|  | (+ (f-fmax-0-4 #xF) fmax-CCRn fmax-Rm (f-fmax-12-4 #x7) | 
|  | (f-fmax-16-4 #xF) (f-fmax-20-4 0) (f-fmax-24-4 0) | 
|  | (f-fmax-28-1 0) (f-fmax-29-1 0) (f-fmax-30-1 1) (f-fmax-31-1 1)) | 
|  | (set fmax-Rm fmax-CCRn) | 
|  | () | 
|  | ) |