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