1 ; Toshiba MeP FMAX Coprocessor description. -*- Scheme -*- 2 ; Copyright 2011 Free Software Foundation, Inc. 3 ; 4 ; Contributed by Red Hat Inc; 5 ; 6 ; This file is part of the GNU Binutils. 7 ; 8 ; This program is free software; you can redistribute it and/or modify 9 ; it under the terms of the GNU General Public License as published by 10 ; the Free Software Foundation; either version 3 of the License, or 11 ; (at your option) any later version. 12 ; 13 ; This program is distributed in the hope that it will be useful, 14 ; but WITHOUT ANY WARRANTY; without even the implied warranty of 15 ; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 16 ; GNU General Public License for more details. 17 ; 18 ; You should have received a copy of the GNU General Public License 19 ; along with this program; if not, write to the Free Software 20 ; Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, 21 ; MA 02110-1301, USA. 22 23 ;------------------------------------------------------------------------------ 24 ; MeP-Integrator will redefine the isa pmacros below to allow the bit widths 25 ; specified below for each ME_MODULE using this coprocessor. 26 ; This coprocessor requires only the 32 bit insns in the core. 27 ;------------------------------------------------------------------------------ 28 ; begin-isas 29 (define-pmacro fmax-core-isa () (ISA ext_core2)) 30 (define-pmacro all-fmax-isas () (ISA ext_core2)) 31 ; end-isas 32 33 ;****************************************************************************** 34 ; ifields 35 ;------------------------------------------------------------------------------ 36 ; opcodes 37 (dnf f-fmax-0-4 "opcode" (all-fmax-isas) 0 4) 38 (dnf f-fmax-4-4 "opcode" (all-fmax-isas) 4 4) 39 (dnf f-fmax-8-4 "opcode" (all-fmax-isas) 8 4) 40 (dnf f-fmax-12-4 "opcode" (all-fmax-isas) 12 4) 41 (dnf f-fmax-16-4 "opcode" (all-fmax-isas) 16 4) 42 (dnf f-fmax-20-4 "opcode" (all-fmax-isas) 20 4) 43 (dnf f-fmax-24-4 "opcode" (all-fmax-isas) 24 4) 44 (dnf f-fmax-28-1 "opcode" (all-fmax-isas) 28 1) 45 (dnf f-fmax-29-1 "opcode" (all-fmax-isas) 29 1) 46 (dnf f-fmax-30-1 "opcode" (all-fmax-isas) 30 1) 47 (dnf f-fmax-31-1 "opcode" (all-fmax-isas) 31 1) 48 49 ;------------------------------------------------------------------------------ 50 ; FR registers 51 (define-multi-ifield 52 (name f-fmax-frd) 53 (comment "FRd register") 54 (attrs all-fmax-isas) 55 (mode UINT) 56 (subfields f-fmax-28-1 f-fmax-4-4) 57 (insert (sequence () 58 (set (ifield f-fmax-4-4) (and (ifield f-fmax-frd) #xf)) 59 (set (ifield f-fmax-28-1) (srl (ifield f-fmax-frd) 4)))) 60 (extract (set (ifield f-fmax-frd) 61 (or (sll (ifield f-fmax-28-1) 4) (ifield f-fmax-4-4)))) 62 ) 63 (define-multi-ifield 64 (name f-fmax-frn) 65 (comment "FRn register") 66 (attrs all-fmax-isas) 67 (mode UINT) 68 (subfields f-fmax-29-1 f-fmax-20-4) 69 (insert (sequence () 70 (set (ifield f-fmax-20-4) (and (ifield f-fmax-frn) #xf)) 71 (set (ifield f-fmax-29-1) (srl (ifield f-fmax-frn) 4)))) 72 (extract (set (ifield f-fmax-frn) 73 (or (sll (ifield f-fmax-29-1) 4) (ifield f-fmax-20-4)))) 74 ) 75 (define-multi-ifield 76 (name f-fmax-frm) 77 (comment "FRm register") 78 (attrs all-fmax-isas) 79 (mode UINT) 80 (subfields f-fmax-30-1 f-fmax-24-4) 81 (insert (sequence () 82 (set (ifield f-fmax-24-4) (and (ifield f-fmax-frm) #xf)) 83 (set (ifield f-fmax-30-1) (srl (ifield f-fmax-frm) 4)))) 84 (extract (set (ifield f-fmax-frm) 85 (or (sll (ifield f-fmax-30-1) 4) (ifield f-fmax-24-4)))) 86 ) 87 88 ;------------------------------------------------------------------------------ 89 ; Core General registers 90 (dnf f-fmax-rm "opcode" (all-fmax-isas) 8 4) 91 92 ;------------------------------------------------------------------------------ 93 ; Condition opcodes enum 94 (define-normal-insn-enum fmax-cond "condition opcode enum" (all-fmax-isas) FMAX_ f-fmax-8-4 95 ("f" "u" "e" "ue" "l" "ul" "le" "ule" 96 "fi" "ui" "ei" "uei" "li" "uli" "lei" "ulei") 97 ) 98 99 ;****************************************************************************** 100 ; Hardware 101 ;------------------------------------------------------------------------------ 102 ; FR registers 103 104 ; Given a coprocessor register number N, expand to a 105 ; name/index pair: ($frN N) 106 (define-pmacro (-fmax-fr-reg-pair n) ((.sym "fr" n) n)) 107 (define-pmacro (-fmax-cr-reg-pair n) ((.sym "c" n) n)) 108 109 ; NOTE: This exists solely for the purpose of providing the proper register names for this coprocessor. 110 ; GDB will use the hardware table generated from this declaration. The operands use h-cr 111 ; from mep-core.cpu so that SID's semantic trace will be consistent between 112 ; the core and the coprocessor but use parse/print handlers which reference the hardware table 113 ; generated from this declarations 114 (define-hardware 115 (name h-cr-fmax) 116 (comment "Floating point registers") 117 (attrs all-fmax-isas VIRTUAL IS_FLOAT) 118 (type register SF (32)) 119 (indices keyword "$" 120 (.splice (.unsplice (.map -fmax-fr-reg-pair (.iota 32))) 121 (.unsplice (.map -fmax-cr-reg-pair (.iota 32)))) 122 ) 123 (get (index) (c-call SF "fmax_fr_get_handler" index)) 124 (set (index newval) (c-call VOID "fmax_fr_set_handler" index newval)) 125 ) 126 127 ;------------------------------------------------------------------------------ 128 ; Control registers 129 ; NOTE: This exists solely for the purpose of providing the proper register names for this coprocessor. 130 ; GDB will use the hardware table generated from this declaration. The operands use h-ccr 131 ; from mep-core.cpu so that SID's semantic trace will be consistent between 132 ; the core and the coprocessor but use parse/print handlers which reference the hardware table 133 ; generated from this declarations 134 (define-hardware 135 (name h-ccr-fmax) 136 (comment "Coprocessor Identifier and Revision Register") 137 (attrs all-fmax-isas VIRTUAL) 138 (type register USI (16)) 139 (indices keyword "$" ( 140 ("cirr" 0) ("fcr0" 0) ("ccr0" 0) 141 ("cbcr" 1) ("fcr1" 1) ("ccr1" 1) 142 ("cerr" 15) ("fcr15" 15) ("ccr15" 15) 143 ) 144 ) 145 (set (index newval) (c-call VOID "h_ccr_set" index newval)) 146 (get (index) (c-call SI "h_ccr_get" index)) 147 ) 148 149 ;------------------------------------------------------------------------------ 150 ; Misc 151 (define-hardware 152 (name h-fmax-compare-i-p) 153 (comment "flag") 154 (attrs all-fmax-isas) 155 (type register USI) 156 ) 157 158 ;****************************************************************************** 159 ; Operands 160 ;------------------------------------------------------------------------------ 161 ; FR Registers 162 (define-full-operand fmax-FRd "FRd" (all-fmax-isas (CDATA FMAX_FLOAT)) h-cr SF f-fmax-frd ((parse "fmax_cr") (print "fmax_cr")) () ()) 163 (define-full-operand fmax-FRn "FRn" (all-fmax-isas (CDATA FMAX_FLOAT)) h-cr SF f-fmax-frn ((parse "fmax_cr") (print "fmax_cr")) () ()) 164 (define-full-operand fmax-FRm "FRm" (all-fmax-isas (CDATA FMAX_FLOAT)) h-cr SF f-fmax-frm ((parse "fmax_cr") (print "fmax_cr")) () ()) 165 166 (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")) () ()) 167 (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")) () ()) 168 169 ;------------------------------------------------------------------------------ 170 ; Control registers 171 (define-full-operand fmax-CCRn "CCRn" (all-fmax-isas (CDATA REGNUM)) h-ccr DFLT f-fmax-4-4 ((parse "fmax_ccr") (print "fmax_ccr")) () ()) 172 173 (dnop fmax-CIRR "CIRR" (all-fmax-isas SEM-ONLY) h-ccr 0) 174 (dnop fmax-CBCR "CBCR" (all-fmax-isas SEM-ONLY) h-ccr 1) 175 (dnop fmax-CERR "CERR" (all-fmax-isas SEM-ONLY) h-ccr 15) 176 177 ;------------------------------------------------------------------------------ 178 ; Core General Registers 179 (dnop fmax-Rm "Rm" (all-fmax-isas) h-gpr f-fmax-rm) 180 181 ;------------------------------------------------------------------------------ 182 ; misc 183 (dnop fmax-Compare-i-p "flag" (all-fmax-isas SEM-ONLY) h-fmax-compare-i-p f-nil) 184 185 ;****************************************************************************** 186 ; Instructions 187 ;------------------------------------------------------------------------------ 188 ; Binary Arithmetic 189 (define-pmacro (fmax-binary-arith op opc sem) 190 (dni op 191 (.str op " FRd,FRn,FRm") 192 (all-fmax-isas MAY_TRAP) 193 (.str op " ${fmax-FRd},${fmax-FRn},${fmax-FRm}") 194 (+ (f-fmax-0-4 #xF) fmax-FRd (f-fmax-8-4 opc) (f-fmax-12-4 #x7) (f-fmax-16-4 0) 195 fmax-FRn fmax-FRm (f-fmax-31-1 0)) 196 sem 197 () 198 ) 199 ) 200 201 (fmax-binary-arith fadds #x0 (set fmax-FRd (add fmax-FRn fmax-FRm))) 202 (fmax-binary-arith fsubs #x1 (set fmax-FRd (sub fmax-FRn fmax-FRm))) 203 (fmax-binary-arith fmuls #x2 (set fmax-FRd (mul fmax-FRn fmax-FRm))) 204 (fmax-binary-arith fdivs #x3 (set fmax-FRd (div fmax-FRn fmax-FRm))) 205 206 ;------------------------------------------------------------------------------ 207 ; Unary Arithmetic 208 (define-pmacro (fmax-unary-arith op opc sem) 209 (dni op 210 (.str op " FRd,FRn") 211 (all-fmax-isas MAY_TRAP) 212 (.str op " ${fmax-FRd},${fmax-FRn}") 213 (+ (f-fmax-0-4 #xF) fmax-FRd (f-fmax-8-4 opc) (f-fmax-12-4 #x7) 214 (f-fmax-16-4 0) fmax-FRn (f-fmax-24-4 0) (f-fmax-30-1 0) (f-fmax-31-1 0)) 215 sem 216 () 217 ) 218 ) 219 220 (fmax-unary-arith fsqrts #x4 (set fmax-FRd (sqrt fmax-FRn))) 221 (fmax-unary-arith fabss #x5 (set fmax-FRd (abs fmax-FRn))) 222 (fmax-unary-arith fnegs #x7 (set fmax-FRd (neg fmax-FRn))) 223 (fmax-unary-arith fmovs #x6 (set fmax-FRd fmax-FRn)) 224 225 ;------------------------------------------------------------------------------ 226 ; Conversions 227 (define-pmacro (fmax-conv op opc1 opc2 opnd1 opnd2 sem) 228 (dni op 229 (.str op " FRd,FRn") 230 (all-fmax-isas MAY_TRAP) 231 (.str op " ${" opnd1 "},${" opnd2 "}") 232 (+ (f-fmax-0-4 #xF) opnd1 (f-fmax-8-4 opc1) (f-fmax-12-4 #x7) 233 (f-fmax-16-4 opc2) opnd2 (f-fmax-24-4 0) (f-fmax-30-1 0) (f-fmax-31-1 0)) 234 sem 235 () 236 ) 237 ) 238 239 (fmax-conv froundws #xC #x0 fmax-FRd-int fmax-FRn (set fmax-FRd-int (c-call SI "fmax_froundws" fmax-FRn))) 240 (fmax-conv ftruncws #xD #x0 fmax-FRd-int fmax-FRn (set fmax-FRd-int (c-call SI "fmax_ftruncws" fmax-FRn))) 241 (fmax-conv fceilws #xE #x0 fmax-FRd-int fmax-FRn (set fmax-FRd-int (c-call SI "fmax_fceilws" fmax-FRn))) 242 (fmax-conv ffloorws #xF #x0 fmax-FRd-int fmax-FRn (set fmax-FRd-int (c-call SI "fmax_ffloorws" fmax-FRn))) 243 (fmax-conv fcvtws #x4 #x1 fmax-FRd-int fmax-FRn (set fmax-FRd-int (c-call SI "fmax_fcvtws" fmax-FRn))) 244 (fmax-conv fcvtsw #x0 #x9 fmax-FRd fmax-FRn-int (set fmax-FRd (float SF FPCONV-DEFAULT fmax-FRn-int))) 245 246 ;------------------------------------------------------------------------------ 247 ; Comparisons 248 ; 249 ; Comparison with no exceptions 250 (define-pmacro (fmax-f-sem x y) (andif (gt x y) (lt x y))) ; do this to get exception detection 251 (define-pmacro (fmax-u-sem x y) (not (orif (lt x y) (orif (eq x y) (gt x y))))) 252 (define-pmacro (fmax-e-sem x y) (eq x y)) 253 (define-pmacro (fmax-ue-sem x y) (not (orif (lt x y) (gt x y)))) 254 (define-pmacro (fmax-l-sem x y) (lt x y)) 255 (define-pmacro (fmax-ul-sem x y) (not (orif (gt x y) (eq x y)))) 256 (define-pmacro (fmax-le-sem x y) (orif (lt x y) (eq x y))) 257 (define-pmacro (fmax-ule-sem x y) (not (gt x y))) 258 259 (define-pmacro (fmax-comp cond suffix exceptions) 260 (dni (.sym fcmp cond suffix s) 261 (.str "fcmp" cond suffix "s FRn,FRm") 262 ;; Even though the instruction doesn't really trap if EXCEPTIONS 263 ;; is zero, we don't want gcc to put it in a repeat or erepeat 264 ;; block because of the hazards between fcmp instructions and 265 ;; anything that reads CBCR. 266 (all-fmax-isas MAY_TRAP) 267 (.str "fcmp" cond suffix "s ${fmax-FRn},${fmax-FRm}") 268 (+ (f-fmax-0-4 #xF) (f-fmax-4-4 0) (.sym FMAX_ cond suffix) (f-fmax-12-4 #x7) 269 (f-fmax-16-4 #x2) (f-fmax-28-1 0) fmax-FRn fmax-FRm (f-fmax-31-1 0)) 270 (sequence () 271 (set fmax-Compare-i-p exceptions) 272 (set fmax-CBCR ((.sym fmax- cond -sem) fmax-FRn fmax-FRm)) 273 (set fmax-Compare-i-p 0) 274 ) 275 () 276 ) 277 ) 278 279 ; Comparison with no exceptions 280 (fmax-comp f "" 0) 281 (fmax-comp u "" 0) 282 (fmax-comp e "" 0) 283 (fmax-comp ue "" 0) 284 (fmax-comp l "" 0) 285 (fmax-comp ul "" 0) 286 (fmax-comp le "" 0) 287 (fmax-comp ule "" 0) 288 289 ; Comparison with exceptions 290 (fmax-comp f i 1) 291 (fmax-comp u i 1) 292 (fmax-comp e i 1) 293 (fmax-comp ue i 1) 294 (fmax-comp l i 1) 295 (fmax-comp ul i 1) 296 (fmax-comp le i 1) 297 (fmax-comp ule i 1) 298 299 ;------------------------------------------------------------------------------ 300 ; Move to/from core registers 301 (dni cmov-frn-rm 302 "cmov FRn,Rm" 303 (all-fmax-isas (INTRINSIC "cmov1")) 304 "cmov ${fmax-FRd-int},${fmax-Rm}" 305 (+ (f-fmax-0-4 #xF) fmax-FRd-int fmax-Rm (f-fmax-12-4 #x7) 306 (f-fmax-16-4 #xF) (f-fmax-20-4 0) (f-fmax-24-4 0) 307 (f-fmax-29-1 0) (f-fmax-30-1 0) (f-fmax-31-1 0)) 308 (set fmax-FRd-int fmax-Rm) 309 () 310 ) 311 (dni cmov-rm-frn 312 "cmov Rm,FRn" 313 (all-fmax-isas (INTRINSIC "cmov2")) 314 "cmov ${fmax-Rm},${fmax-FRd-int}" 315 (+ (f-fmax-0-4 #xF) fmax-FRd-int fmax-Rm (f-fmax-12-4 #x7) 316 (f-fmax-16-4 #xF) (f-fmax-20-4 0) (f-fmax-24-4 0) 317 (f-fmax-29-1 0) (f-fmax-30-1 0) (f-fmax-31-1 1)) 318 (set fmax-Rm fmax-FRd-int) 319 () 320 ) 321 (dni cmovc-ccrn-rm 322 "cmovc CCRn,Rm" 323 (all-fmax-isas (INTRINSIC "cmovc1")) 324 "cmovc ${fmax-CCRn},${fmax-Rm}" 325 (+ (f-fmax-0-4 #xF) fmax-CCRn fmax-Rm (f-fmax-12-4 #x7) 326 (f-fmax-16-4 #xF) (f-fmax-20-4 0) (f-fmax-24-4 0) 327 (f-fmax-28-1 0) (f-fmax-29-1 0) (f-fmax-30-1 1) (f-fmax-31-1 0)) 328 (set fmax-CCRn fmax-Rm) 329 () 330 ) 331 (dni cmovc-rm-ccrn 332 "cmovc Rm,CCRn" 333 (all-fmax-isas (INTRINSIC "cmovc2")) 334 "cmovc ${fmax-Rm},${fmax-CCRn}" 335 (+ (f-fmax-0-4 #xF) fmax-CCRn fmax-Rm (f-fmax-12-4 #x7) 336 (f-fmax-16-4 #xF) (f-fmax-20-4 0) (f-fmax-24-4 0) 337 (f-fmax-28-1 0) (f-fmax-29-1 0) (f-fmax-30-1 1) (f-fmax-31-1 1)) 338 (set fmax-Rm fmax-CCRn) 339 () 340 ) 341