k6.md revision 117395
1;; AMD K6/K6-2 Scheduling
2;; Copyright (C) 2002 ;; Free Software Foundation, Inc.
3;;
4;; This file is part of GNU CC.
5;;
6;; GNU CC is free software; you can redistribute it and/or modify
7;; it under the terms of the GNU General Public License as published by
8;; the Free Software Foundation; either version 2, or (at your option)
9;; any later version.
10;;
11;; GNU CC is distributed in the hope that it will be useful,
12;; but WITHOUT ANY WARRANTY; without even the implied warranty of
13;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14;; GNU General Public License for more details.
15;;
16;; You should have received a copy of the GNU General Public License
17;; along with GNU CC; see the file COPYING.  If not, write to
18;; the Free Software Foundation, 59 Temple Place - Suite 330,
19;; Boston, MA 02111-1307, USA.  */
20;;
21;; The K6 has similar architecture to PPro.  Important difference is, that
22;; there are only two decoders and they seems to be much slower than execution
23;; units.  So we have to pay much more attention to proper decoding for
24;; schedulers.  We share most of scheduler code for PPro in i386.c
25;;
26;; The fp unit is not pipelined and do one operation per two cycles including
27;; the FXCH.
28;;
29;; alu	  describes both ALU units (ALU-X and ALU-Y).
30;; alux   describes X alu unit
31;; fpu    describes FPU unit
32;; load   describes load unit.
33;; branch describes branch unit.
34;; store  decsribes store unit.  This unit is not modelled completely and only
35;;        used to model lea operation.  Otherwise it lie outside of the critical
36;;        path.
37;;
38;; ??? fxch isn't handled; not an issue until sched3 after reg-stack is real.
39
40;; The decoder specification is in the PPro section above!
41
42;; Shift instructions and certain arithmetic are issued only to X pipe.
43(define_function_unit "k6_alux" 1 0
44  (and (eq_attr "cpu" "k6")
45       (eq_attr "type" "ishift,ishift1,rotate,rotate1,alu1,negnot,cld"))
46  1 1)
47
48;; The QI mode arithmetic is issued to X pipe only.
49(define_function_unit "k6_alux" 1 0
50  (and (eq_attr "cpu" "k6")
51       (and (eq_attr "type" "alu,alu1,negnot,icmp,test,imovx,incdec")
52	    (match_operand:QI 0 "general_operand" "")))
53  1 1)
54
55(define_function_unit "k6_alu" 2 0
56  (and (eq_attr "cpu" "k6")
57       (eq_attr "type" "ishift,ishift1,rotate,rotate1,alu1,negnot,alu,icmp,test,imovx,incdec,setcc,lea"))
58  1 1)
59
60(define_function_unit "k6_alu" 2 0
61  (and (eq_attr "cpu" "k6")
62       (and (eq_attr "type" "imov")
63       	    (eq_attr "memory" "none")))
64  1 1)
65
66(define_function_unit "k6_branch" 1 0
67  (and (eq_attr "cpu" "k6")
68       (eq_attr "type" "call,callv,ibr"))
69  1 1)
70
71;; Load unit have two cycle latency, but we take care for it in adjust_cost
72(define_function_unit "k6_load" 1 0
73  (and (eq_attr "cpu" "k6")
74       (ior (eq_attr "type" "pop")
75	    (eq_attr "memory" "load,both")))
76  1 1)
77
78(define_function_unit "k6_load" 1 0
79  (and (eq_attr "cpu" "k6")
80       (and (eq_attr "type" "str")
81	    (eq_attr "memory" "load,both")))
82  10 10)
83
84;; Lea have two instructions, so latency is probably 2
85(define_function_unit "k6_store" 1 0
86  (and (eq_attr "cpu" "k6")
87       (eq_attr "type" "lea"))
88  2 1)
89
90(define_function_unit "k6_store" 1 0
91  (and (eq_attr "cpu" "k6")
92       (eq_attr "type" "str"))
93  10 10)
94
95(define_function_unit "k6_store" 1 0
96  (and (eq_attr "cpu" "k6")
97       (ior (eq_attr "type" "push")
98	    (eq_attr "memory" "store,both")))
99  1 1)
100
101(define_function_unit "k6_fpu" 1 1
102  (and (eq_attr "cpu" "k6")
103       (eq_attr "type" "fop,fmov,fcmp,fistp"))
104  2 2)
105
106(define_function_unit "k6_fpu" 1 1
107  (and (eq_attr "cpu" "k6")
108       (eq_attr "type" "fmul"))
109  2 2)
110
111;; ??? Guess
112(define_function_unit "k6_fpu" 1 1
113  (and (eq_attr "cpu" "k6")
114       (eq_attr "type" "fdiv,fpspc"))
115  56 56)
116
117(define_function_unit "k6_alu" 2 0
118  (and (eq_attr "cpu" "k6")
119       (eq_attr "type" "imul"))
120  2 2)
121
122(define_function_unit "k6_alux" 1 0
123  (and (eq_attr "cpu" "k6")
124       (eq_attr "type" "imul"))
125  2 2)
126
127;; ??? Guess
128(define_function_unit "k6_alu" 2 0
129  (and (eq_attr "cpu" "k6")
130       (eq_attr "type" "idiv"))
131  17 17)
132
133(define_function_unit "k6_alux" 1 0
134  (and (eq_attr "cpu" "k6")
135       (eq_attr "type" "idiv"))
136  17 17)
137