pa_cpu_string = "7100LC";
pa_cpu = PROCESSOR_7100LC;
}
+ else if (! strcmp (pa_cpu_string, "7200"))
+ {
+ pa_cpu_string = "7200";
+ pa_cpu = PROCESSOR_7200;
+ }
else
{
- warning ("Unknown -mschedule= option (%s).\nValid options are 700, 7100 and 7100LC\n", pa_cpu_string);
+ warning ("Unknown -mschedule= option (%s).\nValid options are 700, 7100 and 7100LC and 7200\n", pa_cpu_string);
}
if (flag_pic && TARGET_PORTABLE_RUNTIME)
{
case TYPE_FPLOAD:
/* This cost 3 cycles, not 2 as the md says for the
- 700 and 7100. Note scaling of cost for 7100. */
- return cost + (pa_cpu == PROCESSOR_700) ? 1 : 2;
+ 700 and 7100. */
+ return cost + 1;
case TYPE_FPALU:
case TYPE_FPMULSGL:
case TYPE_FPSQRTDBL:
/* In these important cases, we save one cycle compared to
when flop instruction feed each other. */
- return cost - (pa_cpu == PROCESSOR_700) ? 1 : 2;
+ return cost - 1;
default:
return cost;
preceding arithmetic operation has finished if
the target of the fpload is any of the sources
(or destination) of the arithmetic operation. */
- return cost - (pa_cpu == PROCESSOR_700) ? 1 : 2;
+ return cost - 1;
default:
return 0;
preceding divide or sqrt operation has finished if
the target of the ALU flop is any of the sources
(or destination) of the divide or sqrt operation. */
- return cost - (pa_cpu == PROCESSOR_700) ? 2 : 4;
+ return cost - 2;
default:
return 0;
preceding arithmetic operation has finished if
the target of the fpload is the destination of the
arithmetic operation. */
- return cost - (pa_cpu == PROCESSOR_700) ? 1 : 2;
+ return cost - 1;
default:
return 0;
preceding divide or sqrt operation has finished if
the target of the ALU flop is also the target of
of the divide or sqrt operation. */
- return cost - (pa_cpu == PROCESSOR_700) ? 2 : 4;
+ return cost - 2;
default:
return 0;
;;
;; FIXME: Add 800 scheduling for completeness?
-(define_attr "cpu" "700,7100,7100LC" (const (symbol_ref "pa_cpu_attr")))
+(define_attr "cpu" "700,7100,7100LC,7200" (const (symbol_ref "pa_cpu_attr")))
;; Length (in # of insns).
(define_attr "length" ""
;; floating point computations with non-floating point computations (fp loads
;; and stores are not fp computations).
;;
-;; As with the alpha we multiply the ready delay by two to encourage
-;; schedules which will allow the 7100/7150 to dual issue as many instructions
-;; as possible.
;; Memory. Disregarding Cache misses, memory loads take two cycles; stores also
;; take two cycles, during which no Dcache operations should be scheduled.
;; all have the same memory characteristics if one disregards cache misses.
(define_function_unit "pa7100memory" 1 0
(and (eq_attr "type" "load,fpload")
- (eq_attr "cpu" "7100,7100LC")) 4 0)
+ (eq_attr "cpu" "7100,7100LC")) 2 0)
(define_function_unit "pa7100memory" 1 0
(and (eq_attr "type" "store,fpstore")
- (eq_attr "cpu" "7100,7100LC")) 4 4)
+ (eq_attr "cpu" "7100,7100LC")) 2 2)
;; The 7100/7150 has three floating-point units: ALU, MUL, and DIV.
;; Timings:
(define_function_unit "pa7100fp_alu" 1 0
(and (eq_attr "type" "fpcc,fpalu")
- (eq_attr "cpu" "7100")) 4 2)
+ (eq_attr "cpu" "7100")) 2 1)
(define_function_unit "pa7100fp_mpy" 1 0
(and (eq_attr "type" "fpmulsgl,fpmuldbl")
- (eq_attr "cpu" "7100")) 4 2)
+ (eq_attr "cpu" "7100")) 2 1)
(define_function_unit "pa7100fp_div" 1 0
(and (eq_attr "type" "fpdivsgl,fpsqrtsgl")
- (eq_attr "cpu" "7100")) 16 16)
+ (eq_attr "cpu" "7100")) 8 8)
(define_function_unit "pa7100fp_div" 1 0
(and (eq_attr "type" "fpdivdbl,fpsqrtdbl")
- (eq_attr "cpu" "7100")) 30 30)
+ (eq_attr "cpu" "7100")) 15 15)
;; To encourage dual issue we define function units corresponding to
;; the instructions which can be dual issued. This is a rather crude
(define_function_unit "pa7100flop" 1 1
(and
(eq_attr "type" "fpcc,fpalu,fpmulsgl,fpmuldbl,fpdivsgl,fpsqrtsgl,fpdivdbl,fpsqrtdbl")
- (eq_attr "cpu" "7100,7100LC")) 2 2)
+ (eq_attr "cpu" "7100")) 1 1)
(define_function_unit "pa7100nonflop" 1 1
(and
(eq_attr "type" "!fpcc,fpalu,fpmulsgl,fpmuldbl,fpdivsgl,fpsqrtsgl,fpdivdbl,fpsqrtdbl")
- (eq_attr "cpu" "7100")) 2 2)
+ (eq_attr "cpu" "7100")) 1 1)
;; Memory subsystem works just like 7100/7150 (except for cache miss times which
(define_function_unit "pa7100LCfp_alu" 1 0
(and (eq_attr "type" "fpcc,fpalu")
- (eq_attr "cpu" "7100LC")) 4 2)
+ (eq_attr "cpu" "7100LC,7200")) 2 1)
(define_function_unit "pa7100LCfp_mpy" 1 0
(and (eq_attr "type" "fpmulsgl")
- (eq_attr "cpu" "7100LC")) 4 2)
+ (eq_attr "cpu" "7100LC,7200")) 2 1)
(define_function_unit "pa7100LCfp_mpy" 1 0
(and (eq_attr "type" "fpmuldbl")
- (eq_attr "cpu" "7100LC")) 6 4)
+ (eq_attr "cpu" "7100LC,7200")) 3 2)
(define_function_unit "pa7100LCfp_div" 1 0
(and (eq_attr "type" "fpdivsgl,fpsqrtsgl")
- (eq_attr "cpu" "7100LC")) 16 16)
+ (eq_attr "cpu" "7100LC,7200")) 8 8)
(define_function_unit "pa7100LCfp_div" 1 0
(and (eq_attr "type" "fpdivdbl,fpsqrtdbl")
- (eq_attr "cpu" "7100LC")) 30 30)
+ (eq_attr "cpu" "7100LC,7200")) 15 15)
;; Define the various functional units for dual-issue.
-;; The 7100LC shares the generic "flop" unit specification with the 7100/7150.
-;; The 7100LC has two basic integer which allow dual issue of most integer
-;; instructions. This needs further refinement to deal with the nullify,
-;; carry/borrow possible the ldw/ldw stw/stw special dual issue cases, and
-;; of course it needs to know about hte 2nd alu.
-(define_function_unit "pa7100LCnonflop" 1 1
+;; There's only one floating point unit.
+(define_function_unit "pa7100LCflop" 1 1
(and
- (eq_attr "type" "!fpcc,fpalu,fpmulsgl,fpmuldbl,fpdivsgl,fpsqrtsgl,fpdivdbl,fpsqrtdbl,load,fpload,store,fpstore,shift,nullshift")
- (eq_attr "cpu" "7100LC")) 2 2)
+ (eq_attr "type" "fpcc,fpalu,fpmulsgl,fpmuldbl,fpdivsgl,fpsqrtsgl,fpdivdbl,fpsqrtdbl")
+ (eq_attr "cpu" "7100LC,7200")) 1 1)
-(define_function_unit "pa7100LCshifter" 1 1
+;; Shifts and memory ops actually execute in one of the integer
+;; ALUs, but we can't really model that.
+(define_function_unit "pa7100LCshiftmem" 1 1
(and
- (eq_attr "type" "shift,nullshift")
- (eq_attr "cpu" "7100LC")) 2 2)
+ (eq_attr "type" "shift,nullshift,load,fpload,store,fpstore")
+ (eq_attr "cpu" "7100LC,7200")) 1 1)
-(define_function_unit "pa7100LCmem" 1 1
+;; We have two basic ALUs.
+(define_function_unit "pa7100LCalu" 2 2
(and
- (eq_attr "type" "load,fpload,store,fpstore")
- (eq_attr "cpu" "7100LC")) 2 2)
+ (eq_attr "type" "!fpcc,fpalu,fpmulsgl,fpmuldbl,fpdivsgl,fpsqrtsgl,fpdivdbl,fpsqrtdbl,load,fpload,store,fpstore,shift,nullshift")
+ (eq_attr "cpu" "7100LC,7200")) 1 1)
+
+;; I don't have complete information on the PA7200; however, most of
+;; what I've heard makes it look like a 7100LC without the store-store
+;; penalty. So that's how we'll model it.
+
+;; Memory. Disregarding Cache misses, memory loads and stores take
+;; two cycles. Any special cases are handled in pa_adjust_cost.
+(define_function_unit "pa7200memory" 1 0
+ (and (eq_attr "type" "load,fpload,store,fpstore")
+ (eq_attr "cpu" "7200")) 2 0)
+
+;; I don't have detailed information on the PA7200 FP pipeline, so I
+;; treat it just like the 7100LC pipeline.
+;; Similarly for the multi-issue fake units.
\f
;; Compare instructions.
float_format=i32
;;
hppa1.1-*-pro*)
+ if [ x$enable_haifa != xno ]; then
+ enable_haifa=yes
+ fi
tm_file="pa/pa-pro.h ${tm_file} pa/pa-pro-end.h libgloss.h"
xm_file=pa/xm-papro.h
tmake_file=pa/t-pro
;;
hppa1.1-*-osf*)
+ if [ x$enable_haifa != xno ]; then
+ enable_haifa=yes
+ fi
target_cpu_default=1
tm_file="${tm_file} pa/pa-osf.h"
use_collect2=yes
fixincludes=Makefile.in
;;
hppa1.1-*-rtems*)
+ if [ x$enable_haifa != xno ]; then
+ enable_haifa=yes
+ fi
tm_file="pa/pa-pro.h ${tm_file} pa/pa-pro-end.h libgloss.h pa/rtems.h"
xm_file=pa/xm-papro.h
tmake_file=pa/t-pro
;;
hppa1.0-*-osf*)
+ if [ x$enable_haifa != xno ]; then
+ enable_haifa=yes
+ fi
tm_file="${tm_file} pa/pa-osf.h"
use_collect2=yes
fixincludes=Makefile.in
;;
hppa1.1-*-bsd*)
+ if [ x$enable_haifa != xno ]; then
+ enable_haifa=yes
+ fi
target_cpu_default=1
use_collect2=yes
fixincludes=Makefile.in
;;
hppa1.0-*-bsd*)
+ if [ x$enable_haifa != xno ]; then
+ enable_haifa=yes
+ fi
use_collect2=yes
fixincludes=Makefile.in
;;
hppa1.0-*-hpux7*)
+ if [ x$enable_haifa != xno ]; then
+ enable_haifa=yes
+ fi
tm_file="pa/pa-oldas.h ${tm_file} pa/pa-hpux7.h"
xm_file=pa/xm-pahpux.h
xmake_file=pa/x-pa-hpux
use_collect2=yes
;;
hppa1.0-*-hpux8.0[0-2]*)
+ if [ x$enable_haifa != xno ]; then
+ enable_haifa=yes
+ fi
tm_file="${tm_file} pa/pa-hpux.h"
xm_file=pa/xm-pahpux.h
xmake_file=pa/x-pa-hpux
use_collect2=yes
;;
hppa1.1-*-hpux8.0[0-2]*)
+ if [ x$enable_haifa != xno ]; then
+ enable_haifa=yes
+ fi
target_cpu_default=1
tm_file="${tm_file} pa/pa-hpux.h"
xm_file=pa/xm-pahpux.h
use_collect2=yes
;;
hppa1.1-*-hpux8*)
+ if [ x$enable_haifa != xno ]; then
+ enable_haifa=yes
+ fi
target_cpu_default=1
tm_file="${tm_file} pa/pa-hpux.h"
xm_file=pa/xm-pahpux.h
use_collect2=yes
;;
hppa1.0-*-hpux8*)
+ if [ x$enable_haifa != xno ]; then
+ enable_haifa=yes
+ fi
tm_file="${tm_file} pa/pa-hpux.h"
xm_file=pa/xm-pahpux.h
xmake_file=pa/x-pa-hpux
use_collect2=yes
;;
hppa1.1-*-hpux10*)
+ if [ x$enable_haifa != xno ]; then
+ enable_haifa=yes
+ fi
target_cpu_default=1
tm_file="${tm_file} pa/pa-hpux.h pa/pa-hpux10.h"
xm_file=pa/xm-pahpux.h
use_collect2=yes
;;
hppa1.0-*-hpux10*)
+ if [ x$enable_haifa != xno ]; then
+ enable_haifa=yes
+ fi
tm_file="${tm_file} pa/pa-hpux.h pa/pa-hpux10.h"
xm_file=pa/xm-pahpux.h
xmake_file=pa/x-pa-hpux
use_collect2=yes
;;
hppa1.1-*-hpux*)
+ if [ x$enable_haifa != xno ]; then
+ enable_haifa=yes
+ fi
target_cpu_default=1
tm_file="${tm_file} pa/pa-hpux.h pa/pa-hpux9.h"
xm_file=pa/xm-pahpux.h
use_collect2=yes
;;
hppa1.0-*-hpux*)
+ if [ x$enable_haifa != xno ]; then
+ enable_haifa=yes
+ fi
tm_file="${tm_file} pa/pa-hpux.h pa/pa-hpux9.h"
xm_file=pa/xm-pahpux.h
xmake_file=pa/x-pa-hpux
use_collect2=yes
;;
hppa1.1-*-hiux*)
+ if [ x$enable_haifa != xno ]; then
+ enable_haifa=yes
+ fi
target_cpu_default=1
tm_file="${tm_file} pa/pa-hpux.h pa/pa-hiux.h"
xm_file=pa/xm-pahpux.h
use_collect2=yes
;;
hppa1.0-*-hiux*)
+ if [ x$enable_haifa != xno ]; then
+ enable_haifa=yes
+ fi
tm_file="${tm_file} pa/pa-hpux.h pa/pa-hiux.h"
xm_file=pa/xm-pahpux.h
xmake_file=pa/x-pa-hpux
use_collect2=yes
;;
hppa*-*-lites*)
+ if [ x$enable_haifa != xno ]; then
+ enable_haifa=yes
+ fi
target_cpu_default=1
use_collect2=yes
fixincludes=Makefile.in
float_format=i32
;;
hppa1.1-*-pro*)
+ if [[ x$enable_haifa != xno ]]; then
+ enable_haifa=yes
+ fi
tm_file="pa/pa-pro.h ${tm_file} pa/pa-pro-end.h libgloss.h"
xm_file=pa/xm-papro.h
tmake_file=pa/t-pro
;;
hppa1.1-*-osf*)
+ if [[ x$enable_haifa != xno ]]; then
+ enable_haifa=yes
+ fi
target_cpu_default=1
tm_file="${tm_file} pa/pa-osf.h"
use_collect2=yes
fixincludes=Makefile.in
;;
hppa1.1-*-rtems*)
+ if [[ x$enable_haifa != xno ]]; then
+ enable_haifa=yes
+ fi
tm_file="pa/pa-pro.h ${tm_file} pa/pa-pro-end.h libgloss.h pa/rtems.h"
xm_file=pa/xm-papro.h
tmake_file=pa/t-pro
;;
hppa1.0-*-osf*)
+ if [[ x$enable_haifa != xno ]]; then
+ enable_haifa=yes
+ fi
tm_file="${tm_file} pa/pa-osf.h"
use_collect2=yes
fixincludes=Makefile.in
;;
hppa1.1-*-bsd*)
+ if [[ x$enable_haifa != xno ]]; then
+ enable_haifa=yes
+ fi
target_cpu_default=1
use_collect2=yes
fixincludes=Makefile.in
;;
hppa1.0-*-bsd*)
+ if [[ x$enable_haifa != xno ]]; then
+ enable_haifa=yes
+ fi
use_collect2=yes
fixincludes=Makefile.in
;;
hppa1.0-*-hpux7*)
+ if [[ x$enable_haifa != xno ]]; then
+ enable_haifa=yes
+ fi
tm_file="pa/pa-oldas.h ${tm_file} pa/pa-hpux7.h"
xm_file=pa/xm-pahpux.h
xmake_file=pa/x-pa-hpux
use_collect2=yes
;;
hppa1.0-*-hpux8.0[[0-2]]*)
+ if [[ x$enable_haifa != xno ]]; then
+ enable_haifa=yes
+ fi
tm_file="${tm_file} pa/pa-hpux.h"
xm_file=pa/xm-pahpux.h
xmake_file=pa/x-pa-hpux
use_collect2=yes
;;
hppa1.1-*-hpux8.0[[0-2]]*)
+ if [[ x$enable_haifa != xno ]]; then
+ enable_haifa=yes
+ fi
target_cpu_default=1
tm_file="${tm_file} pa/pa-hpux.h"
xm_file=pa/xm-pahpux.h
use_collect2=yes
;;
hppa1.1-*-hpux8*)
+ if [[ x$enable_haifa != xno ]]; then
+ enable_haifa=yes
+ fi
target_cpu_default=1
tm_file="${tm_file} pa/pa-hpux.h"
xm_file=pa/xm-pahpux.h
use_collect2=yes
;;
hppa1.0-*-hpux8*)
+ if [[ x$enable_haifa != xno ]]; then
+ enable_haifa=yes
+ fi
tm_file="${tm_file} pa/pa-hpux.h"
xm_file=pa/xm-pahpux.h
xmake_file=pa/x-pa-hpux
use_collect2=yes
;;
hppa1.1-*-hpux10*)
+ if [[ x$enable_haifa != xno ]]; then
+ enable_haifa=yes
+ fi
target_cpu_default=1
tm_file="${tm_file} pa/pa-hpux.h pa/pa-hpux10.h"
xm_file=pa/xm-pahpux.h
use_collect2=yes
;;
hppa1.0-*-hpux10*)
+ if [[ x$enable_haifa != xno ]]; then
+ enable_haifa=yes
+ fi
tm_file="${tm_file} pa/pa-hpux.h pa/pa-hpux10.h"
xm_file=pa/xm-pahpux.h
xmake_file=pa/x-pa-hpux
use_collect2=yes
;;
hppa1.1-*-hpux*)
+ if [[ x$enable_haifa != xno ]]; then
+ enable_haifa=yes
+ fi
target_cpu_default=1
tm_file="${tm_file} pa/pa-hpux.h pa/pa-hpux9.h"
xm_file=pa/xm-pahpux.h
use_collect2=yes
;;
hppa1.0-*-hpux*)
+ if [[ x$enable_haifa != xno ]]; then
+ enable_haifa=yes
+ fi
tm_file="${tm_file} pa/pa-hpux.h pa/pa-hpux9.h"
xm_file=pa/xm-pahpux.h
xmake_file=pa/x-pa-hpux
use_collect2=yes
;;
hppa1.1-*-hiux*)
+ if [[ x$enable_haifa != xno ]]; then
+ enable_haifa=yes
+ fi
target_cpu_default=1
tm_file="${tm_file} pa/pa-hpux.h pa/pa-hiux.h"
xm_file=pa/xm-pahpux.h
use_collect2=yes
;;
hppa1.0-*-hiux*)
+ if [[ x$enable_haifa != xno ]]; then
+ enable_haifa=yes
+ fi
tm_file="${tm_file} pa/pa-hpux.h pa/pa-hiux.h"
xm_file=pa/xm-pahpux.h
xmake_file=pa/x-pa-hpux
use_collect2=yes
;;
hppa*-*-lites*)
+ if [[ x$enable_haifa != xno ]]; then
+ enable_haifa=yes
+ fi
target_cpu_default=1
use_collect2=yes
fixincludes=Makefile.in