freebsd-dev/contrib/gcc/config/i386/ppro.md
2004-07-28 03:11:36 +00:00

4.5 KiB

;; Pentium Pro/PII Scheduling ;; Copyright (C) 2002 Free Software Foundation, Inc. ;; ;; This file is part of GCC. ;; ;; GCC 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 2, or (at your option) ;; any later version. ;; ;; GCC 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 GCC; see the file COPYING. If not, write to ;; the Free Software Foundation, 59 Temple Place - Suite 330, ;; Boston, MA 02111-1307, USA. */

;; Categorize how many uops an ia32 instruction evaluates to: ;; one -- an instruction with 1 uop can be decoded by any of the ;; three decoders. ;; few -- an instruction with 1 to 4 uops can be decoded only by ;; decoder 0. ;; many -- a complex instruction may take an unspecified number of ;; cycles to decode in decoder 0.

(define_attr "ppro_uops" "one,few,many" (cond [(eq_attr "type" "other,multi,call,callv,fpspc,str") (const_string "many") (eq_attr "type" "icmov,fcmov,str,cld,leave") (const_string "few") (eq_attr "type" "imov") (if_then_else (eq_attr "memory" "store,both") (const_string "few") (const_string "one")) (eq_attr "memory" "!none") (const_string "few") ] (const_string "one")))

;; ;; The PPro has an out-of-order core, but the instruction decoders are ;; naturally in-order and asymmetric. We get best performance by scheduling ;; for the decoders, for in doing so we give the oo execution unit the ;; most choices. ;; ;; Rough readiness numbers. Fine tuning happens in i386.c. ;; ;; p0 describes port 0. ;; p01 describes ports 0 and 1 as a pair; alu insns can issue to either. ;; p2 describes port 2 for loads. ;; p34 describes ports 3 and 4 for stores. ;; fpu describes the fpu accessed via port 0. ;; ??? It is less than clear if there are separate fadd and fmul units ;; that could operate in parallel. ;; ;; ??? fxch isn't handled; not an issue until sched3 after reg-stack is real.

(define_function_unit "ppro_p0" 1 0 (and (eq_attr "cpu" "pentiumpro") (eq_attr "type" "ishift,rotate,ishift1,rotate1,lea,ibr,cld")) 1 1)

(define_function_unit "ppro_p0" 1 0 (and (eq_attr "cpu" "pentiumpro") (eq_attr "type" "imul")) 4 1)

;; ??? Does the divider lock out the pipe while it works, ;; or is there a disconnected unit? (define_function_unit "ppro_p0" 1 0 (and (eq_attr "cpu" "pentiumpro") (eq_attr "type" "idiv")) 17 17)

(define_function_unit "ppro_p0" 1 0 (and (eq_attr "cpu" "pentiumpro") (eq_attr "type" "fop,fsgn,fistp")) 3 1)

(define_function_unit "ppro_p0" 1 0 (and (eq_attr "cpu" "pentiumpro") (eq_attr "type" "fcmov")) 2 1)

(define_function_unit "ppro_p0" 1 0 (and (eq_attr "cpu" "pentiumpro") (eq_attr "type" "fcmp")) 1 1)

(define_function_unit "ppro_p0" 1 0 (and (eq_attr "cpu" "pentiumpro") (eq_attr "type" "fmov")) 1 1)

(define_function_unit "ppro_p0" 1 0 (and (eq_attr "cpu" "pentiumpro") (eq_attr "type" "fmul")) 5 1)

(define_function_unit "ppro_p0" 1 0 (and (eq_attr "cpu" "pentiumpro") (eq_attr "type" "fdiv,fpspc")) 56 1)

(define_function_unit "ppro_p01" 2 0 (and (eq_attr "cpu" "pentiumpro") (eq_attr "type" "!imov,fmov")) 1 1)

(define_function_unit "ppro_p01" 2 0 (and (and (eq_attr "cpu" "pentiumpro") (eq_attr "type" "imov,fmov")) (eq_attr "memory" "none")) 1 1)

(define_function_unit "ppro_p2" 1 0 (and (eq_attr "cpu" "pentiumpro") (ior (eq_attr "type" "pop,leave") (eq_attr "memory" "load,both"))) 3 1)

(define_function_unit "ppro_p34" 1 0 (and (eq_attr "cpu" "pentiumpro") (ior (eq_attr "type" "push") (eq_attr "memory" "store,both"))) 1 1)

(define_function_unit "fpu" 1 0 (and (eq_attr "cpu" "pentiumpro") (eq_attr "type" "fop,fsgn,fmov,fcmp,fcmov,fistp")) 1 1)

(define_function_unit "fpu" 1 0 (and (eq_attr "cpu" "pentiumpro") (eq_attr "type" "fmul")) 5 2)

(define_function_unit "fpu" 1 0 (and (eq_attr "cpu" "pentiumpro") (eq_attr "type" "fdiv,fpspc")) 56 56)

;; imul uses the fpu. ??? does it have the same throughput as fmul? (define_function_unit "fpu" 1 0 (and (eq_attr "cpu" "pentiumpro") (eq_attr "type" "imul")) 4 1)