URL
https://opencores.org/ocsvn/open8_urisc/open8_urisc/trunk
Subversion Repositories open8_urisc
[/] [open8_urisc/] [trunk/] [gnu/] [binutils/] [cpu/] [mep-fmax.cpu] - Rev 241
Go to most recent revision | Compare with Previous | Blame | View Log
; 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)())
Go to most recent revision | Compare with Previous | Blame | View Log
