packages/gcc/gcc-14.2.1-espresso-cpu.patch

443 lines
15 KiB
Diff
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

diff --git a/gcc/config.gcc b/gcc/config.gcc
index a3566f5c77d..9b06ac3be06 100644
--- a/gcc/config.gcc
+++ b/gcc/config.gcc
@@ -5606,7 +5606,7 @@ case "${target}" in
| rs64 \
| 401 | 403 | 405 | 405fp | 440 | 440fp | 464 | 464fp \
| 476 | 476fp | 505 | 601 | 602 | 603 | 603e | ec603e \
- | 604 | 604e | 620 | 630 | 740 | 750 | 7400 | 7450 \
+ | 604 | 604e | 620 | 630 | 740 | 750 | 7400 | 7450 | espresso \
| a2 | e300c[23] | 854[08] | e500mc | e500mc64 | e5500 | e6500 \
| titan | 801 | 821 | 823 | 860 | 970 | G3 | G4 | G5 | cell)
# OK
diff --git a/gcc/config/rs6000/7xx.md b/gcc/config/rs6000/7xx.md
index c7512beab3e..1553f46a094 100644
--- a/gcc/config/rs6000/7xx.md
+++ b/gcc/config/rs6000/7xx.md
@@ -47,79 +47,79 @@
(define_insn_reservation "ppc750-load" 2
(and (eq_attr "type" "load,fpload,vecload,load_l")
- (eq_attr "cpu" "ppc750,ppc7400"))
+ (eq_attr "cpu" "ppc750,ppc7400,espresso"))
"ppc750_du,lsu_7xx")
(define_insn_reservation "ppc750-store" 2
(and (eq_attr "type" "store,fpstore,vecstore")
- (eq_attr "cpu" "ppc750,ppc7400"))
+ (eq_attr "cpu" "ppc750,ppc7400,espresso"))
"ppc750_du,lsu_7xx")
(define_insn_reservation "ppc750-storec" 8
(and (eq_attr "type" "store_c")
- (eq_attr "cpu" "ppc750,ppc7400"))
+ (eq_attr "cpu" "ppc750,ppc7400,espresso"))
"ppc750_du,lsu_7xx")
(define_insn_reservation "ppc750-integer" 1
(and (ior (eq_attr "type" "integer,insert,trap,cntlz,isel")
(and (eq_attr "type" "add,logical,shift,exts")
(eq_attr "dot" "no")))
- (eq_attr "cpu" "ppc750,ppc7400"))
+ (eq_attr "cpu" "ppc750,ppc7400,espresso"))
"ppc750_du,iu1_7xx|iu2_7xx")
(define_insn_reservation "ppc750-two" 1
(and (eq_attr "type" "two")
- (eq_attr "cpu" "ppc750,ppc7400"))
+ (eq_attr "cpu" "ppc750,ppc7400,espresso"))
"ppc750_du,iu1_7xx|iu2_7xx,iu1_7xx|iu2_7xx")
(define_insn_reservation "ppc750-three" 1
(and (eq_attr "type" "three")
- (eq_attr "cpu" "ppc750,ppc7400"))
+ (eq_attr "cpu" "ppc750,ppc7400,espresso"))
"ppc750_du,iu1_7xx|iu2_7xx,iu1_7xx|iu2_7xx,iu1_7xx|iu2_7xx")
(define_insn_reservation "ppc750-imul" 4
(and (eq_attr "type" "mul")
(eq_attr "size" "32")
- (eq_attr "cpu" "ppc750,ppc7400"))
+ (eq_attr "cpu" "ppc750,ppc7400,espresso"))
"ppc750_du,iu1_7xx*4")
(define_insn_reservation "ppc750-imul2" 3
(and (eq_attr "type" "mul")
(eq_attr "size" "16")
- (eq_attr "cpu" "ppc750,ppc7400"))
+ (eq_attr "cpu" "ppc750,ppc7400,espresso"))
"ppc750_du,iu1_7xx*2")
(define_insn_reservation "ppc750-imul3" 2
(and (eq_attr "type" "mul")
(eq_attr "size" "8")
- (eq_attr "cpu" "ppc750,ppc7400"))
+ (eq_attr "cpu" "ppc750,ppc7400,espresso"))
"ppc750_du,iu1_7xx")
(define_insn_reservation "ppc750-idiv" 19
(and (eq_attr "type" "div")
- (eq_attr "cpu" "ppc750,ppc7400"))
+ (eq_attr "cpu" "ppc750,ppc7400,espresso"))
"ppc750_du,iu1_7xx*19")
(define_insn_reservation "ppc750-compare" 2
(and (ior (eq_attr "type" "cmp")
(and (eq_attr "type" "add,logical,shift,exts")
(eq_attr "dot" "yes")))
- (eq_attr "cpu" "ppc750,ppc7400"))
+ (eq_attr "cpu" "ppc750,ppc7400,espresso"))
"ppc750_du,(iu1_7xx|iu2_7xx)")
(define_insn_reservation "ppc750-fpcompare" 2
(and (eq_attr "type" "fpcompare")
- (eq_attr "cpu" "ppc750,ppc7400"))
+ (eq_attr "cpu" "ppc750,ppc7400,espresso"))
"ppc750_du,fpu_7xx")
(define_insn_reservation "ppc750-fp" 3
(and (eq_attr "type" "fp,fpsimple")
- (eq_attr "cpu" "ppc750,ppc7400"))
+ (eq_attr "cpu" "ppc750,ppc7400,espresso"))
"ppc750_du,fpu_7xx")
(define_insn_reservation "ppc750-dmul" 4
(and (eq_attr "type" "dmul")
- (eq_attr "cpu" "ppc750"))
+ (eq_attr "cpu" "ppc750,espresso"))
"ppc750_du,fpu_7xx*2")
(define_insn_reservation "ppc7400-dmul" 3
@@ -130,37 +130,37 @@
; Divides are not pipelined
(define_insn_reservation "ppc750-sdiv" 17
(and (eq_attr "type" "sdiv")
- (eq_attr "cpu" "ppc750,ppc7400"))
+ (eq_attr "cpu" "ppc750,ppc7400,espresso"))
"ppc750_du,fpu_7xx*17")
(define_insn_reservation "ppc750-ddiv" 31
(and (eq_attr "type" "ddiv")
- (eq_attr "cpu" "ppc750,ppc7400"))
+ (eq_attr "cpu" "ppc750,ppc7400,espresso"))
"ppc750_du,fpu_7xx*31")
(define_insn_reservation "ppc750-mfcr" 2
(and (eq_attr "type" "mfcr,mtcr")
- (eq_attr "cpu" "ppc750,ppc7400"))
+ (eq_attr "cpu" "ppc750,ppc7400,espresso"))
"ppc750_du,iu1_7xx")
(define_insn_reservation "ppc750-crlogical" 3
(and (eq_attr "type" "cr_logical")
- (eq_attr "cpu" "ppc750,ppc7400"))
+ (eq_attr "cpu" "ppc750,ppc7400,espresso"))
"nothing,sru_7xx*2")
(define_insn_reservation "ppc750-mtjmpr" 2
(and (eq_attr "type" "mtjmpr,isync,sync")
- (eq_attr "cpu" "ppc750,ppc7400"))
+ (eq_attr "cpu" "ppc750,ppc7400,espresso"))
"nothing,sru_7xx*2")
(define_insn_reservation "ppc750-mfjmpr" 3
(and (eq_attr "type" "mfjmpr")
- (eq_attr "cpu" "ppc750,ppc7400"))
+ (eq_attr "cpu" "ppc750,ppc7400,espresso"))
"nothing,sru_7xx*2")
(define_insn_reservation "ppc750-jmpreg" 1
(and (eq_attr "type" "jmpreg,branch,isync")
- (eq_attr "cpu" "ppc750,ppc7400"))
+ (eq_attr "cpu" "ppc750,ppc7400,espresso"))
"nothing,bpu_7xx")
;; Altivec
diff --git a/gcc/config/rs6000/driver-rs6000.cc b/gcc/config/rs6000/driver-rs6000.cc
index f4900724b98..617a4f8d6f2 100644
--- a/gcc/config/rs6000/driver-rs6000.cc
+++ b/gcc/config/rs6000/driver-rs6000.cc
@@ -508,6 +508,7 @@ static const struct asm_name asm_names[] = {
{ "630", "-mppc64" },
{ "740", "-mppc" },
{ "750", "-mppc" },
+ { "espresso", "-mppc" },
{ "G3", "-mppc" },
{ "7400", "-mppc %{!mvsx:%{!maltivec:-maltivec}}" },
{ "7450", "-mppc %{!mvsx:%{!maltivec:-maltivec}}" },
diff --git a/gcc/config/rs6000/rs6000-c.cc b/gcc/config/rs6000/rs6000-c.cc
index 68519e1397f..82aa147d308 100644
--- a/gcc/config/rs6000/rs6000-c.cc
+++ b/gcc/config/rs6000/rs6000-c.cc
@@ -649,6 +649,8 @@ rs6000_cpu_cpp_builtins (cpp_reader *pfile)
/* Used by lwarx/stwcx. errata work-around. */
if (rs6000_cpu == PROCESSOR_PPC405)
builtin_define ("__PPC405__");
+ if (rs6000_cpu == PROCESSOR_ESPRESSO)
+ builtin_define ("__ESPRESSO__");
/* Used by libstdc++. */
if (TARGET_NO_LWSYNC)
builtin_define ("__NO_LWSYNC__");
diff --git a/gcc/config/rs6000/rs6000-cpus.def b/gcc/config/rs6000/rs6000-cpus.def
index 84fac8bdac1..a79d15a415a 100644
--- a/gcc/config/rs6000/rs6000-cpus.def
+++ b/gcc/config/rs6000/rs6000-cpus.def
@@ -203,6 +203,7 @@ RS6000_CPU ("740", PROCESSOR_PPC750, OPTION_MASK_PPC_GFXOPT)
RS6000_CPU ("7400", PROCESSOR_PPC7400, POWERPC_7400_MASK)
RS6000_CPU ("7450", PROCESSOR_PPC7450, POWERPC_7400_MASK)
RS6000_CPU ("750", PROCESSOR_PPC750, OPTION_MASK_PPC_GFXOPT)
+RS6000_CPU ("espresso", PROCESSOR_ESPRESSO, OPTION_MASK_PPC_GFXOPT)
RS6000_CPU ("801", PROCESSOR_MPCCORE, OPTION_MASK_SOFT_FLOAT)
RS6000_CPU ("821", PROCESSOR_MPCCORE, OPTION_MASK_SOFT_FLOAT)
RS6000_CPU ("823", PROCESSOR_MPCCORE, OPTION_MASK_SOFT_FLOAT)
diff --git a/gcc/config/rs6000/rs6000-logue.cc b/gcc/config/rs6000/rs6000-logue.cc
index edc0d6c8f52..f70ca4e1bba 100644
--- a/gcc/config/rs6000/rs6000-logue.cc
+++ b/gcc/config/rs6000/rs6000-logue.cc
@@ -4313,6 +4313,7 @@ rs6000_emit_epilogue (enum epilogue_type epilogue_type)
bool using_mtcr_multiple = (rs6000_tune == PROCESSOR_PPC601
|| rs6000_tune == PROCESSOR_PPC603
|| rs6000_tune == PROCESSOR_PPC750
+ || rs6000_tune == PROCESSOR_ESPRESSO
|| optimize_size);
/* Restore via the backchain when we have a large frame, since this
diff --git a/gcc/config/rs6000/rs6000-opts.h b/gcc/config/rs6000/rs6000-opts.h
index 88e357835a5..b92f9b0780d 100644
--- a/gcc/config/rs6000/rs6000-opts.h
+++ b/gcc/config/rs6000/rs6000-opts.h
@@ -40,6 +40,7 @@ enum processor_type
PROCESSOR_PPC750,
PROCESSOR_PPC7400,
PROCESSOR_PPC7450,
+ PROCESSOR_ESPRESSO,
PROCESSOR_PPC403,
PROCESSOR_PPC405,
diff --git a/gcc/config/rs6000/rs6000-tables.opt b/gcc/config/rs6000/rs6000-tables.opt
index a5649fef1ec..c44ddff735a 100644
--- a/gcc/config/rs6000/rs6000-tables.opt
+++ b/gcc/config/rs6000/rs6000-tables.opt
@@ -96,97 +96,97 @@ EnumValue
Enum(rs6000_cpu_opt_value) String(750) Value(22)
EnumValue
-Enum(rs6000_cpu_opt_value) String(801) Value(23)
+Enum(rs6000_cpu_opt_value) String(espresso) Value(23)
EnumValue
-Enum(rs6000_cpu_opt_value) String(821) Value(24)
+Enum(rs6000_cpu_opt_value) String(801) Value(24)
EnumValue
-Enum(rs6000_cpu_opt_value) String(823) Value(25)
+Enum(rs6000_cpu_opt_value) String(821) Value(25)
EnumValue
-Enum(rs6000_cpu_opt_value) String(8540) Value(26)
+Enum(rs6000_cpu_opt_value) String(823) Value(26)
EnumValue
-Enum(rs6000_cpu_opt_value) String(8548) Value(27)
+Enum(rs6000_cpu_opt_value) String(8540) Value(27)
EnumValue
-Enum(rs6000_cpu_opt_value) String(a2) Value(28)
+Enum(rs6000_cpu_opt_value) String(8548) Value(28)
EnumValue
-Enum(rs6000_cpu_opt_value) String(e300c2) Value(29)
+Enum(rs6000_cpu_opt_value) String(a2) Value(29)
EnumValue
-Enum(rs6000_cpu_opt_value) String(e300c3) Value(30)
+Enum(rs6000_cpu_opt_value) String(e300c2) Value(30)
EnumValue
-Enum(rs6000_cpu_opt_value) String(e500mc) Value(31)
+Enum(rs6000_cpu_opt_value) String(e300c3) Value(31)
EnumValue
-Enum(rs6000_cpu_opt_value) String(e500mc64) Value(32)
+Enum(rs6000_cpu_opt_value) String(e500mc) Value(32)
EnumValue
-Enum(rs6000_cpu_opt_value) String(e5500) Value(33)
+Enum(rs6000_cpu_opt_value) String(e5500mc64) Value(33)
EnumValue
-Enum(rs6000_cpu_opt_value) String(e6500) Value(34)
+Enum(rs6000_cpu_opt_value) String(e5500) Value(34)
EnumValue
-Enum(rs6000_cpu_opt_value) String(860) Value(35)
+Enum(rs6000_cpu_opt_value) String(e6500) Value(35)
EnumValue
-Enum(rs6000_cpu_opt_value) String(970) Value(36)
+Enum(rs6000_cpu_opt_value) String(860) Value(36)
EnumValue
-Enum(rs6000_cpu_opt_value) String(cell) Value(37)
+Enum(rs6000_cpu_opt_value) String(970) Value(37)
EnumValue
-Enum(rs6000_cpu_opt_value) String(ec603e) Value(38)
+Enum(rs6000_cpu_opt_value) String(cell) Value(38)
EnumValue
-Enum(rs6000_cpu_opt_value) String(G3) Value(39)
+Enum(rs6000_cpu_opt_value) String(ec603e) Value(39)
EnumValue
-Enum(rs6000_cpu_opt_value) String(G4) Value(40)
+Enum(rs6000_cpu_opt_value) String(G3) Value(40)
EnumValue
-Enum(rs6000_cpu_opt_value) String(G5) Value(41)
+Enum(rs6000_cpu_opt_value) String(G4) Value(41)
EnumValue
-Enum(rs6000_cpu_opt_value) String(titan) Value(42)
+Enum(rs6000_cpu_opt_value) String(G5) Value(42)
EnumValue
-Enum(rs6000_cpu_opt_value) String(power3) Value(43)
+Enum(rs6000_cpu_opt_value) String(titan) Value(43)
EnumValue
-Enum(rs6000_cpu_opt_value) String(power4) Value(44)
+Enum(rs6000_cpu_opt_value) String(power3) Value(44)
EnumValue
-Enum(rs6000_cpu_opt_value) String(power5) Value(45)
+Enum(rs6000_cpu_opt_value) String(power4) Value(45)
EnumValue
-Enum(rs6000_cpu_opt_value) String(power5+) Value(46)
+Enum(rs6000_cpu_opt_value) String(power5) Value(46)
EnumValue
-Enum(rs6000_cpu_opt_value) String(power6) Value(47)
+Enum(rs6000_cpu_opt_value) String(power5+) Value(47)
EnumValue
-Enum(rs6000_cpu_opt_value) String(power6x) Value(48)
+Enum(rs6000_cpu_opt_value) String(power6) Value(48)
EnumValue
-Enum(rs6000_cpu_opt_value) String(power7) Value(49)
+Enum(rs6000_cpu_opt_value) String(power6x) Value(49)
EnumValue
-Enum(rs6000_cpu_opt_value) String(power8) Value(50)
+Enum(rs6000_cpu_opt_value) String(power7) Value(50)
EnumValue
-Enum(rs6000_cpu_opt_value) String(power9) Value(51)
+Enum(rs6000_cpu_opt_value) String(power8) Value(51)
EnumValue
-Enum(rs6000_cpu_opt_value) String(power10) Value(52)
+Enum(rs6000_cpu_opt_value) String(power9) Value(52)
EnumValue
-Enum(rs6000_cpu_opt_value) String(power11) Value(53)
+Enum(rs6000_cpu_opt_value) String(power10) Value(53)
EnumValue
Enum(rs6000_cpu_opt_value) String(powerpc) Value(54)
diff --git a/gcc/config/rs6000/rs6000.cc b/gcc/config/rs6000/rs6000.cc
index 5fd31bf8242..b1b6674f2f6 100644
--- a/gcc/config/rs6000/rs6000.cc
+++ b/gcc/config/rs6000/rs6000.cc
@@ -4656,6 +4656,7 @@ rs6000_option_override_internal (bool global_init_p)
case PROCESSOR_PPC750:
case PROCESSOR_PPC7400:
+ case PROCESSOR_ESPRESSO:
rs6000_cost = &ppc750_cost;
break;
@@ -16830,6 +16831,10 @@ emit_store_conditional (machine_mode mode, rtx res, rtx mem, rtx val)
if (PPC405_ERRATUM77)
emit_insn (gen_hwsync ());
+ /* Emit dcbst before stwcx. to address Espresso erratum */
+ if (ESPRESSO_ERRATUM)
+ emit_insn (gen_rs6000_dcbst (mem));
+
emit_insn (fn (res, mem, val));
}
@@ -18250,6 +18255,7 @@ rs6000_adjust_cost (rtx_insn *insn, int dep_type, rtx_insn *dep_insn, int cost,
|| rs6000_tune == PROCESSOR_PPC620
|| rs6000_tune == PROCESSOR_PPC630
|| rs6000_tune == PROCESSOR_PPC750
+ || rs6000_tune == PROCESSOR_ESPRESSO
|| rs6000_tune == PROCESSOR_PPC7400
|| rs6000_tune == PROCESSOR_PPC7450
|| rs6000_tune == PROCESSOR_PPCE5500
@@ -18807,6 +18813,7 @@ rs6000_issue_rate (void)
case PROCESSOR_PPC440:
case PROCESSOR_PPC603:
case PROCESSOR_PPC750:
+ case PROCESSOR_ESPRESSO:
case PROCESSOR_PPC7400:
case PROCESSOR_PPC8540:
case PROCESSOR_PPC8548:
diff --git a/gcc/config/rs6000/rs6000.h b/gcc/config/rs6000/rs6000.h
index 197922fbb84..43772bdbc98 100644
--- a/gcc/config/rs6000/rs6000.h
+++ b/gcc/config/rs6000/rs6000.h
@@ -77,6 +77,9 @@
#define PPC405_ERRATUM77 0
#endif
+/* Support Espresso stwcx erratum. */
+#define ESPRESSO_ERRATUM (rs6000_cpu == PROCESSOR_ESPRESSO)
+
#ifndef SUBTARGET_DRIVER_SELF_SPECS
# define SUBTARGET_DRIVER_SELF_SPECS ""
#endif
@@ -144,6 +147,7 @@
mcpu=630: -mppc64; \
mcpu=740: -mppc; \
mcpu=750: -mppc; \
+ mcpu=espresso: -mppc; \
mcpu=G3: -mppc; \
mcpu=7400: -mppc %{!mvsx:%{!maltivec:-maltivec}}; \
mcpu=7450: -mppc %{!mvsx:%{!maltivec:-maltivec}}; \
diff --git a/gcc/config/rs6000/rs6000.md b/gcc/config/rs6000/rs6000.md
index 74b87f926d7..c93a828073f 100644
--- a/gcc/config/rs6000/rs6000.md
+++ b/gcc/config/rs6000/rs6000.md
@@ -347,7 +347,7 @@
;; enumeration in rs6000-opts.h.
(define_attr "cpu"
"ppc601,ppc603,ppc604,ppc604e,ppc620,ppc630,
- ppc750,ppc7400,ppc7450,
+ ppc750,ppc7400,ppc7450,espresso,
ppc403,ppc405,ppc440,ppc476,
ppc8540,ppc8548,ppce300c2,ppce300c3,ppce500mc,ppce500mc64,ppce5500,ppce6500,
power4,power5,power6,power7,power8,power9,power10,power11,
diff --git a/gcc/config/rs6000/sync.md b/gcc/config/rs6000/sync.md
index 425eff855d2..6dce7d8b327 100644
--- a/gcc/config/rs6000/sync.md
+++ b/gcc/config/rs6000/sync.md
@@ -347,6 +347,13 @@
"<stcx> %2,%y1"
[(set_attr "type" "store_c")])
+;; I am pretty sure VOID is correct since this actually affects a cache-block sized
+;; chunk of memory
+ (define_insn "rs6000_dcbst"
+ [(match_operand:VOID 0 "memory_operand" "=Z")]
+ ""
+ "dcbst %y0")
+
;; Use a temporary register to force getting an even register for the
;; lqarx/stqcrx. instructions. Normal optimizations will eliminate this extra
;; copy on big endian systems.