1*38fd1498Szrj;; Geode Scheduling 2*38fd1498Szrj;; Copyright (C) 2006-2018 Free Software Foundation, Inc. 3*38fd1498Szrj;; 4*38fd1498Szrj;; This file is part of GCC. 5*38fd1498Szrj;; 6*38fd1498Szrj;; GCC is free software; you can redistribute it and/or modify 7*38fd1498Szrj;; it under the terms of the GNU General Public License as published by 8*38fd1498Szrj;; the Free Software Foundation; either version 3, or (at your option) 9*38fd1498Szrj;; any later version. 10*38fd1498Szrj;; 11*38fd1498Szrj;; GCC is distributed in the hope that it will be useful, 12*38fd1498Szrj;; but WITHOUT ANY WARRANTY; without even the implied warranty of 13*38fd1498Szrj;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14*38fd1498Szrj;; GNU General Public License for more details. 15*38fd1498Szrj;; 16*38fd1498Szrj;; You should have received a copy of the GNU General Public License 17*38fd1498Szrj;; along with GCC; see the file COPYING3. If not see 18*38fd1498Szrj;; <http://www.gnu.org/licenses/>. 19*38fd1498Szrj;; 20*38fd1498Szrj;; The Geode architecture is one insn issue processor. 21*38fd1498Szrj;; 22*38fd1498Szrj;; This description is based on data from the following documents: 23*38fd1498Szrj;; 24*38fd1498Szrj;; "AMD Geode GX Processor Data Book" 25*38fd1498Szrj;; Advanced Micro Devices, Inc., Aug 2005. 26*38fd1498Szrj;; 27*38fd1498Szrj;; "AMD Geode LX Processor Data Book" 28*38fd1498Szrj;; Advanced Micro Devices, Inc., Jan 2006. 29*38fd1498Szrj;; 30*38fd1498Szrj;; 31*38fd1498Szrj;; CPU execution units of the Geode: 32*38fd1498Szrj;; 33*38fd1498Szrj;; issue describes the issue pipeline. 34*38fd1498Szrj;; alu describes the Integer unit 35*38fd1498Szrj;; fpu describes the FP unit 36*38fd1498Szrj;; 37*38fd1498Szrj;; The fp unit is out of order execution unit with register renaming. 38*38fd1498Szrj;; There is also memory management unit and execution pipeline for 39*38fd1498Szrj;; load/store operations. We ignore it and difference between insns 40*38fd1498Szrj;; using memory and registers. 41*38fd1498Szrj 42*38fd1498Szrj(define_automaton "geode") 43*38fd1498Szrj 44*38fd1498Szrj(define_cpu_unit "geode_issue,geode_alu,geode_fpu" "geode") 45*38fd1498Szrj 46*38fd1498Szrj(define_insn_reservation "alu" 1 47*38fd1498Szrj (and (eq_attr "cpu" "geode") 48*38fd1498Szrj (eq_attr "type" "alu,alu1,negnot,icmp,lea,test,imov,imovx,icmov,incdec,setcc")) 49*38fd1498Szrj "geode_issue,geode_alu") 50*38fd1498Szrj 51*38fd1498Szrj(define_insn_reservation "shift" 2 52*38fd1498Szrj (and (eq_attr "cpu" "geode") 53*38fd1498Szrj (eq_attr "type" "ishift,ishift1,rotate,rotate1")) 54*38fd1498Szrj "geode_issue,geode_alu*2") 55*38fd1498Szrj 56*38fd1498Szrj(define_insn_reservation "imul" 7 57*38fd1498Szrj (and (eq_attr "cpu" "geode") 58*38fd1498Szrj (eq_attr "type" "imul")) 59*38fd1498Szrj "geode_issue,geode_alu*7") 60*38fd1498Szrj 61*38fd1498Szrj(define_insn_reservation "idiv" 40 62*38fd1498Szrj (and (eq_attr "cpu" "geode") 63*38fd1498Szrj (eq_attr "type" "idiv")) 64*38fd1498Szrj "geode_issue,geode_alu*40") 65*38fd1498Szrj 66*38fd1498Szrj;; The branch unit. 67*38fd1498Szrj(define_insn_reservation "call" 2 68*38fd1498Szrj (and (eq_attr "cpu" "geode") 69*38fd1498Szrj (eq_attr "type" "call,callv")) 70*38fd1498Szrj "geode_issue,geode_alu*2") 71*38fd1498Szrj 72*38fd1498Szrj(define_insn_reservation "geode_branch" 1 73*38fd1498Szrj (and (eq_attr "cpu" "geode") 74*38fd1498Szrj (eq_attr "type" "ibr")) 75*38fd1498Szrj "geode_issue,geode_alu") 76*38fd1498Szrj 77*38fd1498Szrj(define_insn_reservation "geode_pop_push" 1 78*38fd1498Szrj (and (eq_attr "cpu" "geode") 79*38fd1498Szrj (eq_attr "type" "pop,push")) 80*38fd1498Szrj "geode_issue,geode_alu") 81*38fd1498Szrj 82*38fd1498Szrj(define_insn_reservation "geode_leave" 2 83*38fd1498Szrj (and (eq_attr "cpu" "geode") 84*38fd1498Szrj (eq_attr "type" "leave")) 85*38fd1498Szrj "geode_issue,geode_alu*2") 86*38fd1498Szrj 87*38fd1498Szrj(define_insn_reservation "geode_load_str" 4 88*38fd1498Szrj (and (eq_attr "cpu" "geode") 89*38fd1498Szrj (and (eq_attr "type" "str") 90*38fd1498Szrj (eq_attr "memory" "load,both"))) 91*38fd1498Szrj "geode_issue,geode_alu*4") 92*38fd1498Szrj 93*38fd1498Szrj(define_insn_reservation "geode_store_str" 2 94*38fd1498Szrj (and (eq_attr "cpu" "geode") 95*38fd1498Szrj (and (eq_attr "type" "str") 96*38fd1498Szrj (eq_attr "memory" "store"))) 97*38fd1498Szrj "geode_issue,geode_alu*2") 98*38fd1498Szrj 99*38fd1498Szrj;; Be optimistic 100*38fd1498Szrj(define_insn_reservation "geode_unknown" 1 101*38fd1498Szrj (and (eq_attr "cpu" "geode") 102*38fd1498Szrj (eq_attr "type" "multi,other")) 103*38fd1498Szrj "geode_issue,geode_alu") 104*38fd1498Szrj 105*38fd1498Szrj;; FPU 106*38fd1498Szrj 107*38fd1498Szrj(define_insn_reservation "geode_fop" 6 108*38fd1498Szrj (and (eq_attr "cpu" "geode") 109*38fd1498Szrj (eq_attr "type" "fop,fcmp")) 110*38fd1498Szrj "geode_issue,geode_fpu*6") 111*38fd1498Szrj 112*38fd1498Szrj(define_insn_reservation "geode_fsimple" 1 113*38fd1498Szrj (and (eq_attr "cpu" "geode") 114*38fd1498Szrj (eq_attr "type" "fmov,fcmov,fsgn,fxch")) 115*38fd1498Szrj "geode_issue,geode_fpu") 116*38fd1498Szrj 117*38fd1498Szrj(define_insn_reservation "geode_fist" 4 118*38fd1498Szrj (and (eq_attr "cpu" "geode") 119*38fd1498Szrj (eq_attr "type" "fistp,fisttp")) 120*38fd1498Szrj "geode_issue,geode_fpu*4") 121*38fd1498Szrj 122*38fd1498Szrj(define_insn_reservation "geode_fmul" 10 123*38fd1498Szrj (and (eq_attr "cpu" "geode") 124*38fd1498Szrj (eq_attr "type" "fmul")) 125*38fd1498Szrj "geode_issue,geode_fpu*10") 126*38fd1498Szrj 127*38fd1498Szrj(define_insn_reservation "geode_fdiv" 47 128*38fd1498Szrj (and (eq_attr "cpu" "geode") 129*38fd1498Szrj (eq_attr "type" "fdiv")) 130*38fd1498Szrj "geode_issue,geode_fpu*47") 131*38fd1498Szrj 132*38fd1498Szrj;; We use minimal latency (fsin) here 133*38fd1498Szrj(define_insn_reservation "geode_fpspc" 54 134*38fd1498Szrj (and (eq_attr "cpu" "geode") 135*38fd1498Szrj (eq_attr "type" "fpspc")) 136*38fd1498Szrj "geode_issue,geode_fpu*54") 137*38fd1498Szrj 138*38fd1498Szrj(define_insn_reservation "geode_frndint" 12 139*38fd1498Szrj (and (eq_attr "cpu" "geode") 140*38fd1498Szrj (eq_attr "type" "frndint")) 141*38fd1498Szrj "geode_issue,geode_fpu*12") 142*38fd1498Szrj 143*38fd1498Szrj(define_insn_reservation "geode_mmxmov" 1 144*38fd1498Szrj (and (eq_attr "cpu" "geode") 145*38fd1498Szrj (eq_attr "type" "mmxmov")) 146*38fd1498Szrj "geode_issue,geode_fpu") 147*38fd1498Szrj 148*38fd1498Szrj(define_insn_reservation "geode_mmx" 2 149*38fd1498Szrj (and (eq_attr "cpu" "geode") 150*38fd1498Szrj (eq_attr "type" "mmx,mmxadd,mmxmul,mmxcmp,mmxcvt,mmxshft")) 151*38fd1498Szrj "geode_issue,geode_fpu*2") 152