1*16dce513Schristos; Hitachi SH architecture description. -*- Scheme -*- 2*16dce513Schristos; 3*16dce513Schristos; Copyright 2000, 2001, 2007, 2009 Free Software Foundation, Inc. 4*16dce513Schristos; 5*16dce513Schristos; Contributed by Red Hat Inc; developed under contract from Hitachi 6*16dce513Schristos; Semiconductor (America) Inc. 7*16dce513Schristos; 8*16dce513Schristos; This file is part of the GNU Binutils. 9*16dce513Schristos; 10*16dce513Schristos; This program is free software; you can redistribute it and/or modify 11*16dce513Schristos; it under the terms of the GNU General Public License as published by 12*16dce513Schristos; the Free Software Foundation; either version 3 of the License, or 13*16dce513Schristos; (at your option) any later version. 14*16dce513Schristos; 15*16dce513Schristos; This program is distributed in the hope that it will be useful, 16*16dce513Schristos; but WITHOUT ANY WARRANTY; without even the implied warranty of 17*16dce513Schristos; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 18*16dce513Schristos; GNU General Public License for more details. 19*16dce513Schristos; 20*16dce513Schristos; You should have received a copy of the GNU General Public License 21*16dce513Schristos; along with this program; if not, write to the Free Software 22*16dce513Schristos; Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, 23*16dce513Schristos; MA 02110-1301, USA. 24*16dce513Schristos 25*16dce513Schristos 26*16dce513Schristos(include "simplify.inc") 27*16dce513Schristos 28*16dce513Schristos(define-arch 29*16dce513Schristos (name sh) 30*16dce513Schristos (comment "Hitachi SuperH (SH)") 31*16dce513Schristos (insn-lsb0? #t) 32*16dce513Schristos (machs sh2 sh3 sh3e sh4 sh5) 33*16dce513Schristos (isas compact media) 34*16dce513Schristos) 35*16dce513Schristos 36*16dce513Schristos 37*16dce513Schristos; Instruction sets. 38*16dce513Schristos 39*16dce513Schristos(define-isa 40*16dce513Schristos (name media) 41*16dce513Schristos (comment "SHmedia 32-bit instruction set") 42*16dce513Schristos (base-insn-bitsize 32) 43*16dce513Schristos) 44*16dce513Schristos 45*16dce513Schristos(define-isa 46*16dce513Schristos (name compact) 47*16dce513Schristos (comment "SHcompact 16-bit instruction set") 48*16dce513Schristos (base-insn-bitsize 16) 49*16dce513Schristos) 50*16dce513Schristos 51*16dce513Schristos 52*16dce513Schristos; CPU family. 53*16dce513Schristos 54*16dce513Schristos(define-cpu 55*16dce513Schristos (name sh64) 56*16dce513Schristos (comment "SH 64-bit family") 57*16dce513Schristos (endian either) 58*16dce513Schristos (word-bitsize 32) 59*16dce513Schristos) 60*16dce513Schristos 61*16dce513Schristos 62*16dce513Schristos(define-mach 63*16dce513Schristos (name sh2) 64*16dce513Schristos (comment "SH-2 CPU core") 65*16dce513Schristos (cpu sh64) 66*16dce513Schristos (isas compact) 67*16dce513Schristos) 68*16dce513Schristos 69*16dce513Schristos(define-mach 70*16dce513Schristos (name sh3) 71*16dce513Schristos (comment "SH-3 CPU core") 72*16dce513Schristos (cpu sh64) 73*16dce513Schristos (isas compact) 74*16dce513Schristos) 75*16dce513Schristos 76*16dce513Schristos(define-mach 77*16dce513Schristos (name sh3e) 78*16dce513Schristos (comment "SH-3e CPU core") 79*16dce513Schristos (cpu sh64) 80*16dce513Schristos (isas compact) 81*16dce513Schristos) 82*16dce513Schristos 83*16dce513Schristos(define-mach 84*16dce513Schristos (name sh4) 85*16dce513Schristos (comment "SH-4 CPU core") 86*16dce513Schristos (cpu sh64) 87*16dce513Schristos (isas compact) 88*16dce513Schristos) 89*16dce513Schristos 90*16dce513Schristos(define-mach 91*16dce513Schristos (name sh5) 92*16dce513Schristos (comment "SH-5 CPU core") 93*16dce513Schristos (cpu sh64) 94*16dce513Schristos (isas compact media) 95*16dce513Schristos) 96*16dce513Schristos 97*16dce513Schristos(define-model 98*16dce513Schristos (name sh5) 99*16dce513Schristos (comment "SH-5 reference implementation") 100*16dce513Schristos (mach sh5) 101*16dce513Schristos (unit u-exec "Execution unit" () 102*16dce513Schristos 1 1 ; issue done 103*16dce513Schristos () () () ()) 104*16dce513Schristos) 105*16dce513Schristos 106*16dce513Schristos; Hardware elements. 107*16dce513Schristos 108*16dce513Schristos(define-hardware 109*16dce513Schristos (name h-pc) 110*16dce513Schristos (comment "Program counter") 111*16dce513Schristos (attrs PC (ISA compact,media)) 112*16dce513Schristos (type pc UDI) 113*16dce513Schristos (get () (raw-reg h-pc)) 114*16dce513Schristos (set (newval) (sequence () 115*16dce513Schristos (set (raw-reg h-ism) (and newval 1)) 116*16dce513Schristos (set (raw-reg h-pc) (and newval (inv UDI 1))))) 117*16dce513Schristos) 118*16dce513Schristos 119*16dce513Schristos(define-pmacro (-build-greg-name n) ((.sym r n) n)) 120*16dce513Schristos 121*16dce513Schristos(define-hardware 122*16dce513Schristos (name h-gr) 123*16dce513Schristos (comment "General purpose integer registers") 124*16dce513Schristos (attrs (ISA media,compact)) 125*16dce513Schristos (type register DI (64)) 126*16dce513Schristos (indices keyword "" (.map -build-greg-name (.iota 64))) 127*16dce513Schristos (get (index) 128*16dce513Schristos (if DI (eq index 63) 129*16dce513Schristos (const 0) 130*16dce513Schristos (raw-reg h-gr index))) 131*16dce513Schristos (set (index newval) 132*16dce513Schristos (if (ne index 63) 133*16dce513Schristos (set (raw-reg h-gr index) newval) 134*16dce513Schristos (nop))) 135*16dce513Schristos) 136*16dce513Schristos 137*16dce513Schristos(define-hardware 138*16dce513Schristos (name h-grc) 139*16dce513Schristos (comment "General purpose integer registers (SHcompact view)") 140*16dce513Schristos (attrs VIRTUAL (ISA compact)) 141*16dce513Schristos (type register SI (16)) 142*16dce513Schristos (indices keyword "" (.map -build-greg-name (.iota 16))) 143*16dce513Schristos (get (index) 144*16dce513Schristos (and (raw-reg h-gr index) (zext DI #xFFFFFFFF))) 145*16dce513Schristos (set (index newval) 146*16dce513Schristos (set (raw-reg h-gr index) (ext DI newval))) 147*16dce513Schristos) 148*16dce513Schristos 149*16dce513Schristos(define-pmacro (-build-creg-name n) ((.sym cr n) n)) 150*16dce513Schristos 151*16dce513Schristos(define-hardware 152*16dce513Schristos (name h-cr) 153*16dce513Schristos (comment "Control registers") 154*16dce513Schristos (attrs (ISA media)) 155*16dce513Schristos (type register DI (64)) 156*16dce513Schristos (indices keyword "" (.map -build-creg-name (.iota 64))) 157*16dce513Schristos (get (index) 158*16dce513Schristos (if DI (eq index 0) 159*16dce513Schristos (zext DI (reg h-sr)) 160*16dce513Schristos (raw-reg h-cr index))) 161*16dce513Schristos (set (index newval) 162*16dce513Schristos (if (eq index 0) 163*16dce513Schristos (set (reg h-sr) newval) 164*16dce513Schristos (set (raw-reg h-cr index) newval))) 165*16dce513Schristos) 166*16dce513Schristos 167*16dce513Schristos(define-hardware 168*16dce513Schristos (name h-sr) 169*16dce513Schristos (comment "Status register") 170*16dce513Schristos (attrs (ISA compact,media)) 171*16dce513Schristos (type register SI) 172*16dce513Schristos) 173*16dce513Schristos 174*16dce513Schristos(define-hardware 175*16dce513Schristos (name h-fpscr) 176*16dce513Schristos (comment "Floating point status and control register") 177*16dce513Schristos (attrs (ISA compact,media)) 178*16dce513Schristos (type register SI) 179*16dce513Schristos) 180*16dce513Schristos 181*16dce513Schristos(define-hardware 182*16dce513Schristos (name h-frbit) 183*16dce513Schristos (comment "Floating point register file bit") 184*16dce513Schristos (attrs (ISA media,compact) VIRTUAL) 185*16dce513Schristos (type register BI) 186*16dce513Schristos (get () (and (srl (reg h-sr) 14) 1)) 187*16dce513Schristos (set (newvalue) (set (reg h-sr) (or (and (reg h-sr) (inv (sll 1 14))) (sll SI newvalue 14)))) 188*16dce513Schristos) 189*16dce513Schristos 190*16dce513Schristos(define-hardware 191*16dce513Schristos (name h-szbit) 192*16dce513Schristos (comment "Floating point transfer size bit") 193*16dce513Schristos (attrs (ISA media,compact) VIRTUAL) 194*16dce513Schristos (type register BI) 195*16dce513Schristos (get () (and (srl (reg h-sr) 13) 1)) 196*16dce513Schristos (set (newvalue) (set (reg h-sr) (or (and (reg h-sr) (inv (sll 1 13))) (sll SI newvalue 13)))) 197*16dce513Schristos) 198*16dce513Schristos 199*16dce513Schristos(define-hardware 200*16dce513Schristos (name h-prbit) 201*16dce513Schristos (comment "Floating point precision bit") 202*16dce513Schristos (attrs (ISA media,compact) VIRTUAL) 203*16dce513Schristos (type register BI) 204*16dce513Schristos (get () (and (srl (reg h-sr) 12) 1)) 205*16dce513Schristos (set (newvalue) (set (reg h-sr) (or (and (reg h-sr) (inv (sll 1 12))) (sll SI newvalue 12)))) 206*16dce513Schristos) 207*16dce513Schristos 208*16dce513Schristos(define-hardware 209*16dce513Schristos (name h-sbit) 210*16dce513Schristos (comment "Multiply-accumulate saturation flag") 211*16dce513Schristos (attrs (ISA compact) VIRTUAL) 212*16dce513Schristos (type register BI) 213*16dce513Schristos (get () (and (srl (reg h-sr) 1) 1)) 214*16dce513Schristos (set (newvalue) (set (reg h-sr) (or (and (reg h-sr) (inv 2)) (sll SI newvalue 1)))) 215*16dce513Schristos) 216*16dce513Schristos 217*16dce513Schristos(define-hardware 218*16dce513Schristos (name h-mbit) 219*16dce513Schristos (comment "Divide-step M flag") 220*16dce513Schristos (attrs (ISA compact) VIRTUAL) 221*16dce513Schristos (type register BI) 222*16dce513Schristos (get () (and (srl (reg h-sr) 9) 1)) 223*16dce513Schristos (set (newvalue) (set (reg h-sr) (or (and (reg h-sr) (inv (sll 1 9))) (sll SI newvalue 9)))) 224*16dce513Schristos) 225*16dce513Schristos 226*16dce513Schristos(define-hardware 227*16dce513Schristos (name h-qbit) 228*16dce513Schristos (comment "Divide-step Q flag") 229*16dce513Schristos (attrs (ISA compact) VIRTUAL) 230*16dce513Schristos (type register BI) 231*16dce513Schristos (get () (and (srl (reg h-sr) 8) 1)) 232*16dce513Schristos (set (newvalue) (set (reg h-sr) (or (and (reg h-sr) (inv (sll 1 8))) (sll SI newvalue 8)))) 233*16dce513Schristos) 234*16dce513Schristos 235*16dce513Schristos(define-pmacro (-build-freg-name n) ((.sym fr n) n)) 236*16dce513Schristos 237*16dce513Schristos(define-hardware 238*16dce513Schristos (name h-fr) 239*16dce513Schristos (comment "Single precision floating point registers") 240*16dce513Schristos (attrs (ISA media,compact)) 241*16dce513Schristos (type register SF (64)) 242*16dce513Schristos (indices keyword "" (.map -build-freg-name (.iota 64))) 243*16dce513Schristos) 244*16dce513Schristos 245*16dce513Schristos 246*16dce513Schristos(define-pmacro (-build-fpair-name n) ((.sym fp n) n)) 247*16dce513Schristos 248*16dce513Schristos(define-hardware 249*16dce513Schristos (name h-fp) 250*16dce513Schristos (comment "Single precision floating point register pairs") 251*16dce513Schristos (attrs (ISA media,compact)) 252*16dce513Schristos (type register DF (32)) 253*16dce513Schristos (indices keyword "" (.map -build-fpair-name (.iota 32))) 254*16dce513Schristos) 255*16dce513Schristos 256*16dce513Schristos(define-pmacro (-build-fvec-name n) ((.sym fv n) n)) 257*16dce513Schristos 258*16dce513Schristos(define-hardware 259*16dce513Schristos (name h-fv) 260*16dce513Schristos (comment "Single precision floating point vectors") 261*16dce513Schristos (attrs VIRTUAL (ISA media,compact)) 262*16dce513Schristos (type register SF (16)) 263*16dce513Schristos (indices keyword "" (.map -build-fvec-name (.iota 16))) 264*16dce513Schristos ; Mask with $F to ensure 0 <= index < 15. 265*16dce513Schristos (get (index) (reg h-fr (mul (and UQI index 15) 4))) 266*16dce513Schristos (set (index newval) (set (reg h-fr (mul (and UQI index 15) 4)) newval)) 267*16dce513Schristos) 268*16dce513Schristos 269*16dce513Schristos(define-hardware 270*16dce513Schristos (name h-fmtx) 271*16dce513Schristos (comment "Single precision floating point matrices") 272*16dce513Schristos (attrs VIRTUAL (ISA media)) 273*16dce513Schristos (type register SF (4)) 274*16dce513Schristos (indices keyword "" ((mtrx0 0) (mtrx1 1) (mtrx2 2) (mtrx3 3))) 275*16dce513Schristos ; Mask with $3 to ensure 0 <= index < 4. 276*16dce513Schristos (get (index) (reg h-fr (mul (and UQI index 3) 16))) 277*16dce513Schristos (set (index newval) (set (reg h-fr (mul (and UQI index 3) 16)) newval)) 278*16dce513Schristos) 279*16dce513Schristos 280*16dce513Schristos(define-pmacro (-build-dreg-name n) ((.sym dr n) n)) 281*16dce513Schristos 282*16dce513Schristos(define-hardware 283*16dce513Schristos (name h-dr) 284*16dce513Schristos (comment "Double precision floating point registers") 285*16dce513Schristos (attrs (ISA media,compact) VIRTUAL) 286*16dce513Schristos (type register DF (32)) 287*16dce513Schristos (indices keyword "" (.map -build-dreg-name (.iota 64))) 288*16dce513Schristos (get (index) 289*16dce513Schristos (subword DF 290*16dce513Schristos (or 291*16dce513Schristos (sll DI (zext DI (subword SI (reg h-fr index) 0)) 32) 292*16dce513Schristos (zext DI (subword SI (reg h-fr (add index 1)) 0))) 0)) 293*16dce513Schristos (set (index newval) 294*16dce513Schristos (sequence () 295*16dce513Schristos (set (reg h-fr index) 296*16dce513Schristos (subword SF (subword SI newval 0) 0)) 297*16dce513Schristos (set (reg h-fr (add index 1)) 298*16dce513Schristos (subword SF (subword SI newval 1) 0)))) 299*16dce513Schristos) 300*16dce513Schristos 301*16dce513Schristos(define-hardware 302*16dce513Schristos (name h-tr) 303*16dce513Schristos (comment "Branch target registers") 304*16dce513Schristos (attrs (ISA media)) 305*16dce513Schristos (type register DI (8)) 306*16dce513Schristos (indices keyword "" ((tr0 0) (tr1 1) (tr2 2) (tr3 3) (tr4 4) (tr5 5) (tr6 6) (tr7 7))) 307*16dce513Schristos) 308*16dce513Schristos 309*16dce513Schristos(define-hardware 310*16dce513Schristos (name h-endian) 311*16dce513Schristos (comment "Current endian mode") 312*16dce513Schristos (attrs (ISA compact,media) VIRTUAL) 313*16dce513Schristos (type register BI) 314*16dce513Schristos (get () (c-call BI "sh64_endian")) 315*16dce513Schristos (set (newval) (error "cannot alter target byte order mid-program")) 316*16dce513Schristos) 317*16dce513Schristos 318*16dce513Schristos(define-hardware 319*16dce513Schristos (name h-ism) 320*16dce513Schristos (comment "Current instruction set mode") 321*16dce513Schristos (attrs (ISA compact,media)) 322*16dce513Schristos (type register BI) 323*16dce513Schristos (get () (raw-reg h-ism)) 324*16dce513Schristos (set (newval) (error "cannot set ism directly")) 325*16dce513Schristos) 326*16dce513Schristos 327*16dce513Schristos 328*16dce513Schristos; Operands. 329*16dce513Schristos 330*16dce513Schristos(dnop endian "Endian mode" ((ISA compact,media)) h-endian f-nil) 331*16dce513Schristos(dnop ism "Instruction set mode" ((ISA compact,media)) h-ism f-nil) 332*16dce513Schristos 333*16dce513Schristos; Universally useful macros. 334*16dce513Schristos 335*16dce513Schristos; A pmacro for use in semantic bodies of unimplemented insns. 336*16dce513Schristos(define-pmacro (unimp mnemonic) (nop)) 337*16dce513Schristos 338*16dce513Schristos; Join 2 ints together in natural bit order. 339*16dce513Schristos(define-pmacro (-join-si s1 s0) 340*16dce513Schristos (or (sll (zext DI s1) 32) 341*16dce513Schristos (zext DI s0))) 342*16dce513Schristos 343*16dce513Schristos; Join 4 half-ints together in natural bit order. 344*16dce513Schristos(define-pmacro (-join-hi h3 h2 h1 h0) 345*16dce513Schristos (or (sll (zext DI h3) 48) 346*16dce513Schristos (or (sll (zext DI h2) 32) 347*16dce513Schristos (or (sll (zext DI h1) 16) 348*16dce513Schristos (zext DI h0))))) 349*16dce513Schristos 350*16dce513Schristos; Join 8 quarter-ints together in natural bit order. 351*16dce513Schristos(define-pmacro (-join-qi b7 b6 b5 b4 b3 b2 b1 b0) 352*16dce513Schristos (or (sll (zext DI b7) 56) 353*16dce513Schristos (or (sll (zext DI b6) 48) 354*16dce513Schristos (or (sll (zext DI b5) 40) 355*16dce513Schristos (or (sll (zext DI b4) 32) 356*16dce513Schristos (or (sll (zext DI b3) 24) 357*16dce513Schristos (or (sll (zext DI b2) 16) 358*16dce513Schristos (or (sll (zext DI b1) 8) 359*16dce513Schristos (zext DI b0))))))))) 360*16dce513Schristos 361*16dce513Schristos 362*16dce513Schristos; Include the two instruction set descriptions from their respective 363*16dce513Schristos; source files. 364*16dce513Schristos 365*16dce513Schristos(if (keep-isa? (compact)) 366*16dce513Schristos (include "sh64-compact.cpu")) 367*16dce513Schristos 368*16dce513Schristos(if (keep-isa? (media)) 369*16dce513Schristos (include "sh64-media.cpu")) 370