1 /* IBM RS/6000 CPU names.. 2 Copyright (C) 1991-2022 Free Software Foundation, Inc. 3 Contributed by Richard Kenner (kenner (at) vlsi1.ultra.nyu.edu) 4 5 This file is part of GCC. 6 7 GCC is free software; you can redistribute it and/or modify it 8 under the terms of the GNU General Public License as published 9 by the Free Software Foundation; either version 3, or (at your 10 option) any later version. 11 12 GCC is distributed in the hope that it will be useful, but WITHOUT 13 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY 14 or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public 15 License for more details. 16 17 You should have received a copy of the GNU General Public License 18 along with GCC; see the file COPYING3. If not see 19 <http://www.gnu.org/licenses/>. */ 20 21 /* ISA masks. */ 22 #ifndef ISA_2_1_MASKS 23 #define ISA_2_1_MASKS OPTION_MASK_MFCRF 24 #define ISA_2_2_MASKS (ISA_2_1_MASKS | OPTION_MASK_POPCNTB) 25 #define ISA_2_4_MASKS (ISA_2_2_MASKS | OPTION_MASK_FPRND) 26 27 /* For ISA 2.05, don't add ALTIVEC, since in general it isn't a win on 28 power6. In ISA 2.04, fsel, fre, fsqrt, etc. were no longer documented 29 as optional. Group masks by server and embedded. */ 30 #define ISA_2_5_MASKS_EMBEDDED (ISA_2_4_MASKS \ 31 | OPTION_MASK_CMPB \ 32 | OPTION_MASK_RECIP_PRECISION \ 33 | OPTION_MASK_PPC_GFXOPT \ 34 | OPTION_MASK_PPC_GPOPT) 35 36 #define ISA_2_5_MASKS_SERVER (ISA_2_5_MASKS_EMBEDDED | OPTION_MASK_DFP) 37 38 /* For ISA 2.06, don't add ISEL, since in general it isn't a win, but 39 altivec is a win so enable it. */ 40 #define ISA_2_6_MASKS_EMBEDDED (ISA_2_5_MASKS_EMBEDDED | OPTION_MASK_POPCNTD) 41 #define ISA_2_6_MASKS_SERVER (ISA_2_5_MASKS_SERVER \ 42 | OPTION_MASK_POPCNTD \ 43 | OPTION_MASK_ALTIVEC \ 44 | OPTION_MASK_VSX) 45 46 /* For now, don't provide an embedded version of ISA 2.07. Do not set power8 47 fusion here, instead set it in rs6000.cc if we are tuning for a power8 48 system. */ 49 #define ISA_2_7_MASKS_SERVER (ISA_2_6_MASKS_SERVER \ 50 | OPTION_MASK_POWER8 \ 51 | OPTION_MASK_P8_VECTOR \ 52 | OPTION_MASK_CRYPTO \ 53 | OPTION_MASK_EFFICIENT_UNALIGNED_VSX \ 54 | OPTION_MASK_QUAD_MEMORY \ 55 | OPTION_MASK_QUAD_MEMORY_ATOMIC) 56 57 /* ISA masks setting fusion options. */ 58 #define OTHER_FUSION_MASKS (OPTION_MASK_P8_FUSION \ 59 | OPTION_MASK_P8_FUSION_SIGN) 60 61 /* Add ISEL back into ISA 3.0, since it is supposed to be a win. Do not add 62 FLOAT128_HW here until we are ready to make -mfloat128 on by default. */ 63 #define ISA_3_0_MASKS_SERVER ((ISA_2_7_MASKS_SERVER \ 64 | OPTION_MASK_ISEL \ 65 | OPTION_MASK_MODULO \ 66 | OPTION_MASK_P9_MINMAX \ 67 | OPTION_MASK_P9_MISC \ 68 | OPTION_MASK_P9_VECTOR) \ 69 & ~OTHER_FUSION_MASKS) 70 71 /* Support for the IEEE 128-bit floating point hardware requires a lot of the 72 VSX instructions that are part of ISA 3.0. */ 73 #define ISA_3_0_MASKS_IEEE (OPTION_MASK_VSX \ 74 | OPTION_MASK_P8_VECTOR \ 75 | OPTION_MASK_P9_VECTOR) 76 77 /* Flags that need to be turned off if -mno-power10. */ 78 /* We comment out PCREL_OPT here to disable it by default because SPEC2017 79 performance was degraded by it. */ 80 #define OTHER_POWER10_MASKS (OPTION_MASK_MMA \ 81 | OPTION_MASK_PCREL \ 82 /* | OPTION_MASK_PCREL_OPT */ \ 83 | OPTION_MASK_PREFIXED) 84 85 #define ISA_3_1_MASKS_SERVER (ISA_3_0_MASKS_SERVER \ 86 | OPTION_MASK_POWER10 \ 87 | OTHER_POWER10_MASKS \ 88 | OPTION_MASK_P10_FUSION) 89 90 /* Flags that need to be turned off if -mno-power9-vector. */ 91 #define OTHER_P9_VECTOR_MASKS (OPTION_MASK_FLOAT128_HW \ 92 | OPTION_MASK_P9_MINMAX) 93 94 /* Flags that need to be turned off if -mno-power8-vector. */ 95 #define OTHER_P8_VECTOR_MASKS (OTHER_P9_VECTOR_MASKS \ 96 | OPTION_MASK_P9_VECTOR \ 97 | OPTION_MASK_CRYPTO) 98 99 /* Flags that need to be turned off if -mno-vsx. */ 100 #define OTHER_VSX_VECTOR_MASKS (OTHER_P8_VECTOR_MASKS \ 101 | OPTION_MASK_EFFICIENT_UNALIGNED_VSX \ 102 | OPTION_MASK_FLOAT128_KEYWORD \ 103 | OPTION_MASK_P8_VECTOR) 104 105 /* Flags that need to be turned off if -mno-altivec. */ 106 #define OTHER_ALTIVEC_MASKS (OTHER_VSX_VECTOR_MASKS \ 107 | OPTION_MASK_VSX) 108 109 #define POWERPC_7400_MASK (OPTION_MASK_PPC_GFXOPT | OPTION_MASK_ALTIVEC) 110 111 /* Deal with ports that do not have -mstrict-align. */ 112 #ifdef OPTION_MASK_STRICT_ALIGN 113 #define OPTION_MASK_STRICT_ALIGN_OPTIONAL OPTION_MASK_STRICT_ALIGN 114 #else 115 #define OPTION_MASK_STRICT_ALIGN 0 116 #define OPTION_MASK_STRICT_ALIGN_OPTIONAL 0 117 #ifndef MASK_STRICT_ALIGN 118 #define MASK_STRICT_ALIGN 0 119 #endif 120 #endif 121 122 /* Mask of all options to set the default isa flags based on -mcpu=<xxx>. */ 123 #define POWERPC_MASKS (OPTION_MASK_ALTIVEC \ 124 | OPTION_MASK_CMPB \ 125 | OPTION_MASK_CRYPTO \ 126 | OPTION_MASK_DFP \ 127 | OPTION_MASK_DLMZB \ 128 | OPTION_MASK_EFFICIENT_UNALIGNED_VSX \ 129 | OPTION_MASK_FLOAT128_HW \ 130 | OPTION_MASK_FLOAT128_KEYWORD \ 131 | OPTION_MASK_FPRND \ 132 | OPTION_MASK_POWER10 \ 133 | OPTION_MASK_P10_FUSION \ 134 | OPTION_MASK_HTM \ 135 | OPTION_MASK_ISEL \ 136 | OPTION_MASK_MFCRF \ 137 | OPTION_MASK_MMA \ 138 | OPTION_MASK_MODULO \ 139 | OPTION_MASK_MULHW \ 140 | OPTION_MASK_NO_UPDATE \ 141 | OPTION_MASK_POWER8 \ 142 | OPTION_MASK_P8_FUSION \ 143 | OPTION_MASK_P8_VECTOR \ 144 | OPTION_MASK_P9_MINMAX \ 145 | OPTION_MASK_P9_MISC \ 146 | OPTION_MASK_P9_VECTOR \ 147 | OPTION_MASK_PCREL \ 148 | OPTION_MASK_PCREL_OPT \ 149 | OPTION_MASK_POPCNTB \ 150 | OPTION_MASK_POPCNTD \ 151 | OPTION_MASK_POWERPC64 \ 152 | OPTION_MASK_PPC_GFXOPT \ 153 | OPTION_MASK_PPC_GPOPT \ 154 | OPTION_MASK_PREFIXED \ 155 | OPTION_MASK_QUAD_MEMORY \ 156 | OPTION_MASK_QUAD_MEMORY_ATOMIC \ 157 | OPTION_MASK_RECIP_PRECISION \ 158 | OPTION_MASK_SOFT_FLOAT \ 159 | OPTION_MASK_STRICT_ALIGN_OPTIONAL \ 160 | OPTION_MASK_VSX) 161 162 #endif 163 164 /* This table occasionally claims that a processor does not support a 165 particular feature even though it does, but the feature is slower than the 166 alternative. Thus, it shouldn't be relied on as a complete description of 167 the processor's support. 168 169 Please keep this list in order, and don't forget to update the documentation 170 in invoke.texi when adding a new processor or flag. 171 172 Before including this file, define a macro: 173 174 RS6000_CPU (NAME, CPU, FLAGS) 175 176 where the arguments are the fields of struct rs6000_ptt. */ 177 178 RS6000_CPU ("401", PROCESSOR_PPC403, MASK_SOFT_FLOAT) 179 RS6000_CPU ("403", PROCESSOR_PPC403, MASK_SOFT_FLOAT | MASK_STRICT_ALIGN) 180 RS6000_CPU ("405", PROCESSOR_PPC405, MASK_SOFT_FLOAT | MASK_MULHW | MASK_DLMZB) 181 RS6000_CPU ("405fp", PROCESSOR_PPC405, MASK_MULHW | MASK_DLMZB) 182 RS6000_CPU ("440", PROCESSOR_PPC440, MASK_SOFT_FLOAT | MASK_MULHW | MASK_DLMZB) 183 RS6000_CPU ("440fp", PROCESSOR_PPC440, MASK_MULHW | MASK_DLMZB) 184 RS6000_CPU ("464", PROCESSOR_PPC440, MASK_SOFT_FLOAT | MASK_MULHW | MASK_DLMZB) 185 RS6000_CPU ("464fp", PROCESSOR_PPC440, MASK_MULHW | MASK_DLMZB) 186 RS6000_CPU ("476", PROCESSOR_PPC476, 187 MASK_SOFT_FLOAT | MASK_PPC_GFXOPT | MASK_MFCRF | MASK_POPCNTB 188 | MASK_FPRND | MASK_CMPB | MASK_MULHW | MASK_DLMZB) 189 RS6000_CPU ("476fp", PROCESSOR_PPC476, 190 MASK_PPC_GFXOPT | MASK_MFCRF | MASK_POPCNTB | MASK_FPRND 191 | MASK_CMPB | MASK_MULHW | MASK_DLMZB) 192 RS6000_CPU ("505", PROCESSOR_MPCCORE, 0) 193 RS6000_CPU ("601", PROCESSOR_PPC601, MASK_MULTIPLE) 194 RS6000_CPU ("602", PROCESSOR_PPC603, MASK_PPC_GFXOPT) 195 RS6000_CPU ("603", PROCESSOR_PPC603, MASK_PPC_GFXOPT) 196 RS6000_CPU ("603e", PROCESSOR_PPC603, MASK_PPC_GFXOPT) 197 RS6000_CPU ("604", PROCESSOR_PPC604, MASK_PPC_GFXOPT) 198 RS6000_CPU ("604e", PROCESSOR_PPC604e, MASK_PPC_GFXOPT) 199 RS6000_CPU ("620", PROCESSOR_PPC620, MASK_PPC_GFXOPT | MASK_POWERPC64) 200 RS6000_CPU ("630", PROCESSOR_PPC630, MASK_PPC_GFXOPT | MASK_POWERPC64) 201 RS6000_CPU ("740", PROCESSOR_PPC750, MASK_PPC_GFXOPT) 202 RS6000_CPU ("7400", PROCESSOR_PPC7400, POWERPC_7400_MASK) 203 RS6000_CPU ("7450", PROCESSOR_PPC7450, POWERPC_7400_MASK) 204 RS6000_CPU ("750", PROCESSOR_PPC750, MASK_PPC_GFXOPT) 205 RS6000_CPU ("801", PROCESSOR_MPCCORE, MASK_SOFT_FLOAT) 206 RS6000_CPU ("821", PROCESSOR_MPCCORE, MASK_SOFT_FLOAT) 207 RS6000_CPU ("823", PROCESSOR_MPCCORE, MASK_SOFT_FLOAT) 208 RS6000_CPU ("8540", PROCESSOR_PPC8540, MASK_STRICT_ALIGN | MASK_ISEL) 209 RS6000_CPU ("8548", PROCESSOR_PPC8548, MASK_STRICT_ALIGN | MASK_ISEL) 210 RS6000_CPU ("a2", PROCESSOR_PPCA2, 211 MASK_PPC_GFXOPT | MASK_POWERPC64 | MASK_POPCNTB | MASK_CMPB 212 | MASK_NO_UPDATE) 213 RS6000_CPU ("e300c2", PROCESSOR_PPCE300C2, MASK_SOFT_FLOAT) 214 RS6000_CPU ("e300c3", PROCESSOR_PPCE300C3, 0) 215 RS6000_CPU ("e500mc", PROCESSOR_PPCE500MC, MASK_PPC_GFXOPT | MASK_ISEL) 216 RS6000_CPU ("e500mc64", PROCESSOR_PPCE500MC64, 217 MASK_POWERPC64 | MASK_PPC_GFXOPT | MASK_ISEL) 218 RS6000_CPU ("e5500", PROCESSOR_PPCE5500, 219 MASK_POWERPC64 | MASK_PPC_GFXOPT | MASK_ISEL) 220 RS6000_CPU ("e6500", PROCESSOR_PPCE6500, POWERPC_7400_MASK | MASK_POWERPC64 221 | MASK_MFCRF | MASK_ISEL) 222 RS6000_CPU ("860", PROCESSOR_MPCCORE, MASK_SOFT_FLOAT) 223 RS6000_CPU ("970", PROCESSOR_POWER4, 224 POWERPC_7400_MASK | MASK_PPC_GPOPT | MASK_MFCRF | MASK_POWERPC64) 225 RS6000_CPU ("cell", PROCESSOR_CELL, 226 POWERPC_7400_MASK | MASK_PPC_GPOPT | MASK_MFCRF | MASK_POWERPC64) 227 RS6000_CPU ("ec603e", PROCESSOR_PPC603, MASK_SOFT_FLOAT) 228 RS6000_CPU ("G3", PROCESSOR_PPC750, MASK_PPC_GFXOPT) 229 RS6000_CPU ("G4", PROCESSOR_PPC7450, POWERPC_7400_MASK) 230 RS6000_CPU ("G5", PROCESSOR_POWER4, 231 POWERPC_7400_MASK | MASK_PPC_GPOPT | MASK_MFCRF | MASK_POWERPC64) 232 RS6000_CPU ("titan", PROCESSOR_TITAN, MASK_MULHW | MASK_DLMZB) 233 RS6000_CPU ("power3", PROCESSOR_PPC630, MASK_PPC_GFXOPT | MASK_POWERPC64) 234 RS6000_CPU ("power4", PROCESSOR_POWER4, MASK_POWERPC64 | MASK_PPC_GPOPT 235 | MASK_PPC_GFXOPT | MASK_MFCRF) 236 RS6000_CPU ("power5", PROCESSOR_POWER5, MASK_POWERPC64 | MASK_PPC_GPOPT 237 | MASK_PPC_GFXOPT | MASK_MFCRF | MASK_POPCNTB) 238 RS6000_CPU ("power5+", PROCESSOR_POWER5, MASK_POWERPC64 | MASK_PPC_GPOPT 239 | MASK_PPC_GFXOPT | MASK_MFCRF | MASK_POPCNTB | MASK_FPRND) 240 RS6000_CPU ("power6", PROCESSOR_POWER6, MASK_POWERPC64 | MASK_PPC_GPOPT 241 | MASK_PPC_GFXOPT | MASK_MFCRF | MASK_POPCNTB | MASK_FPRND 242 | MASK_CMPB | MASK_DFP | MASK_RECIP_PRECISION) 243 RS6000_CPU ("power6x", PROCESSOR_POWER6, MASK_POWERPC64 | MASK_PPC_GPOPT 244 | MASK_PPC_GFXOPT | MASK_MFCRF | MASK_POPCNTB | MASK_FPRND 245 | MASK_CMPB | MASK_DFP | MASK_RECIP_PRECISION) 246 RS6000_CPU ("power7", PROCESSOR_POWER7, MASK_POWERPC64 | ISA_2_6_MASKS_SERVER) 247 RS6000_CPU ("power8", PROCESSOR_POWER8, MASK_POWERPC64 | ISA_2_7_MASKS_SERVER 248 | OPTION_MASK_HTM) 249 RS6000_CPU ("power9", PROCESSOR_POWER9, MASK_POWERPC64 | ISA_3_0_MASKS_SERVER 250 | OPTION_MASK_HTM) 251 RS6000_CPU ("power10", PROCESSOR_POWER10, MASK_POWERPC64 | ISA_3_1_MASKS_SERVER) 252 RS6000_CPU ("powerpc", PROCESSOR_POWERPC, 0) 253 RS6000_CPU ("powerpc64", PROCESSOR_POWERPC64, MASK_PPC_GFXOPT | MASK_POWERPC64) 254 RS6000_CPU ("powerpc64le", PROCESSOR_POWER8, MASK_POWERPC64 | ISA_2_7_MASKS_SERVER 255 | OPTION_MASK_HTM) 256 RS6000_CPU ("rs64", PROCESSOR_RS64A, MASK_PPC_GFXOPT | MASK_POWERPC64) 257