1 ; RUN: llc -mtriple=x86_64-apple-darwin -mcpu=core2 < %s | FileCheck --check-prefix=SSE2-CODEGEN %s 2 ; RUN: opt -mtriple=x86_64-apple-darwin -mcpu=core2 -cost-model -analyze < %s | FileCheck --check-prefix=SSE2 %s 3 4 ; In X86TargetTransformInfo::getCastInstrCost we have code that depends on 5 ; getSimpleVT on a value type. On AVX2 we execute this code. Make sure we exit 6 ; early if the type is not a simple value type before we call this function. 7 ; RUN: opt -mtriple=x86_64-apple-darwin -mcpu=core-avx2 -cost-model -analyze < %s 8 9 define <2 x double> @uitofpv2i8v2double(<2 x i8> %a) { 10 ; SSE2: uitofpv2i8v2double 11 ; SSE2: cost of 20 {{.*}} uitofp 12 ; SSE2-CODEGEN: uitofpv2i8v2double 13 ; SSE2-CODEGEN: movapd LCPI 14 ; SSE2-CODEGEN: subpd 15 ; SSE2-CODEGEN: addpd 16 %1 = uitofp <2 x i8> %a to <2 x double> 17 ret <2 x double> %1 18 } 19 20 define <4 x double> @uitofpv4i8v4double(<4 x i8> %a) { 21 ; SSE2: uitofpv4i8v4double 22 ; SSE2: cost of 40 {{.*}} uitofp 23 ; SSE2-CODEGEN: uitofpv4i8v4double 24 ; SSE2-CODEGEN: movapd LCPI 25 ; SSE2-CODEGEN: subpd 26 ; SSE2-CODEGEN: addpd 27 %1 = uitofp <4 x i8> %a to <4 x double> 28 ret <4 x double> %1 29 } 30 31 define <8 x double> @uitofpv8i8v8double(<8 x i8> %a) { 32 ; SSE2: uitofpv8i8v8double 33 ; SSE2: cost of 80 {{.*}} uitofp 34 ; SSE2-CODEGEN: uitofpv8i8v8double 35 ; SSE2-CODEGEN: movapd LCPI 36 ; SSE2-CODEGEN: subpd 37 ; SSE2-CODEGEN: addpd 38 %1 = uitofp <8 x i8> %a to <8 x double> 39 ret <8 x double> %1 40 } 41 42 define <16 x double> @uitofpv16i8v16double(<16 x i8> %a) { 43 ; SSE2: uitofpv16i8v16double 44 ; SSE2: cost of 160 {{.*}} uitofp 45 ; SSE2-CODEGEN: uitofpv16i8v16double 46 ; SSE2-CODEGEN: movapd LCPI 47 ; SSE2-CODEGEN: subpd 48 ; SSE2-CODEGEN: addpd 49 %1 = uitofp <16 x i8> %a to <16 x double> 50 ret <16 x double> %1 51 } 52 53 define <32 x double> @uitofpv32i8v32double(<32 x i8> %a) { 54 ; SSE2: uitofpv32i8v32double 55 ; SSE2: cost of 320 {{.*}} uitofp 56 ; SSE2-CODEGEN: uitofpv32i8v32double 57 ; SSE2-CODEGEN: movapd LCPI 58 ; SSE2-CODEGEN: subpd 59 ; SSE2-CODEGEN: addpd 60 %1 = uitofp <32 x i8> %a to <32 x double> 61 ret <32 x double> %1 62 } 63 64 define <2 x double> @uitofpv2i16v2double(<2 x i16> %a) { 65 ; SSE2: uitofpv2i16v2double 66 ; SSE2: cost of 20 {{.*}} uitofp 67 ; SSE2-CODEGEN: uitofpv2i16v2double 68 ; SSE2-CODEGEN: movapd LCPI 69 ; SSE2-CODEGEN: subpd 70 ; SSE2-CODEGEN: addpd 71 %1 = uitofp <2 x i16> %a to <2 x double> 72 ret <2 x double> %1 73 } 74 75 define <4 x double> @uitofpv4i16v4double(<4 x i16> %a) { 76 ; SSE2: uitofpv4i16v4double 77 ; SSE2: cost of 40 {{.*}} uitofp 78 ; SSE2-CODEGEN: uitofpv4i16v4double 79 ; SSE2-CODEGEN: movapd LCPI 80 ; SSE2-CODEGEN: subpd 81 ; SSE2-CODEGEN: addpd 82 %1 = uitofp <4 x i16> %a to <4 x double> 83 ret <4 x double> %1 84 } 85 86 define <8 x double> @uitofpv8i16v8double(<8 x i16> %a) { 87 ; SSE2: uitofpv8i16v8double 88 ; SSE2: cost of 80 {{.*}} uitofp 89 ; SSE2-CODEGEN: uitofpv8i16v8double 90 ; SSE2-CODEGEN: movapd LCPI 91 ; SSE2-CODEGEN: subpd 92 ; SSE2-CODEGEN: addpd 93 %1 = uitofp <8 x i16> %a to <8 x double> 94 ret <8 x double> %1 95 } 96 97 define <16 x double> @uitofpv16i16v16double(<16 x i16> %a) { 98 ; SSE2: uitofpv16i16v16double 99 ; SSE2: cost of 160 {{.*}} uitofp 100 ; SSE2-CODEGEN: uitofpv16i16v16double 101 ; SSE2-CODEGEN: movapd LCPI 102 ; SSE2-CODEGEN: subpd 103 ; SSE2-CODEGEN: addpd 104 %1 = uitofp <16 x i16> %a to <16 x double> 105 ret <16 x double> %1 106 } 107 108 define <32 x double> @uitofpv32i16v32double(<32 x i16> %a) { 109 ; SSE2: uitofpv32i16v32double 110 ; SSE2: cost of 320 {{.*}} uitofp 111 ; SSE2-CODEGEN: uitofpv32i16v32double 112 ; SSE2-CODEGEN: movapd LCPI 113 ; SSE2-CODEGEN: subpd 114 ; SSE2-CODEGEN: addpd 115 %1 = uitofp <32 x i16> %a to <32 x double> 116 ret <32 x double> %1 117 } 118 119 define <2 x double> @uitofpv2i32v2double(<2 x i32> %a) { 120 ; SSE2: uitofpv2i32v2double 121 ; SSE2: cost of 20 {{.*}} uitofp 122 ; SSE2-CODEGEN: uitofpv2i32v2double 123 ; SSE2-CODEGEN: movapd LCPI 124 ; SSE2-CODEGEN: subpd 125 ; SSE2-CODEGEN: addpd 126 %1 = uitofp <2 x i32> %a to <2 x double> 127 ret <2 x double> %1 128 } 129 130 define <4 x double> @uitofpv4i32v4double(<4 x i32> %a) { 131 ; SSE2: uitofpv4i32v4double 132 ; SSE2: cost of 40 {{.*}} uitofp 133 ; SSE2-CODEGEN: uitofpv4i32v4double 134 ; SSE2-CODEGEN: movapd LCPI 135 ; SSE2-CODEGEN: subpd 136 ; SSE2-CODEGEN: addpd 137 %1 = uitofp <4 x i32> %a to <4 x double> 138 ret <4 x double> %1 139 } 140 141 define <8 x double> @uitofpv8i32v8double(<8 x i32> %a) { 142 ; SSE2: uitofpv8i32v8double 143 ; SSE2: cost of 80 {{.*}} uitofp 144 ; SSE2-CODEGEN: uitofpv8i32v8double 145 ; SSE2-CODEGEN: movapd LCPI 146 ; SSE2-CODEGEN: subpd 147 ; SSE2-CODEGEN: addpd 148 %1 = uitofp <8 x i32> %a to <8 x double> 149 ret <8 x double> %1 150 } 151 152 define <16 x double> @uitofpv16i32v16double(<16 x i32> %a) { 153 ; SSE2: uitofpv16i32v16double 154 ; SSE2: cost of 160 {{.*}} uitofp 155 ; SSE2-CODEGEN: uitofpv16i32v16double 156 ; SSE2-CODEGEN: movapd LCPI 157 ; SSE2-CODEGEN: subpd 158 ; SSE2-CODEGEN: addpd 159 %1 = uitofp <16 x i32> %a to <16 x double> 160 ret <16 x double> %1 161 } 162 163 define <32 x double> @uitofpv32i32v32double(<32 x i32> %a) { 164 ; SSE2: uitofpv32i32v32double 165 ; SSE2: cost of 320 {{.*}} uitofp 166 ; SSE2-CODEGEN: uitofpv32i32v32double 167 ; SSE2-CODEGEN: movapd LCPI 168 ; SSE2-CODEGEN: subpd 169 ; SSE2-CODEGEN: addpd 170 %1 = uitofp <32 x i32> %a to <32 x double> 171 ret <32 x double> %1 172 } 173 174 define <2 x double> @uitofpv2i64v2double(<2 x i64> %a) { 175 ; SSE2: uitofpv2i64v2double 176 ; SSE2: cost of 20 {{.*}} uitofp 177 ; SSE2-CODEGEN: uitofpv2i64v2double 178 ; SSE2-CODEGEN: movapd LCPI 179 ; SSE2-CODEGEN: subpd 180 ; SSE2-CODEGEN: addpd 181 %1 = uitofp <2 x i64> %a to <2 x double> 182 ret <2 x double> %1 183 } 184 185 define <4 x double> @uitofpv4i64v4double(<4 x i64> %a) { 186 ; SSE2: uitofpv4i64v4double 187 ; SSE2: cost of 40 {{.*}} uitofp 188 ; SSE2-CODEGEN: uitofpv4i64v4double 189 ; SSE2-CODEGEN: movapd LCPI 190 ; SSE2-CODEGEN: subpd 191 ; SSE2-CODEGEN: addpd 192 %1 = uitofp <4 x i64> %a to <4 x double> 193 ret <4 x double> %1 194 } 195 196 define <8 x double> @uitofpv8i64v8double(<8 x i64> %a) { 197 %1 = uitofp <8 x i64> %a to <8 x double> 198 ; SSE2: uitofpv8i64v8double 199 ; SSE2: cost of 80 {{.*}} uitofp 200 ; SSE2-CODEGEN: uitofpv8i64v8double 201 ; SSE2-CODEGEN: movapd LCPI 202 ; SSE2-CODEGEN: subpd 203 ; SSE2-CODEGEN: addpd 204 ret <8 x double> %1 205 } 206 207 define <16 x double> @uitofpv16i64v16double(<16 x i64> %a) { 208 ; SSE2: uitofpv16i64v16double 209 ; SSE2: cost of 160 {{.*}} uitofp 210 ; SSE2-CODEGEN: uitofpv16i64v16double 211 ; SSE2-CODEGEN: movapd LCPI 212 ; SSE2-CODEGEN: subpd 213 ; SSE2-CODEGEN: addpd 214 %1 = uitofp <16 x i64> %a to <16 x double> 215 ret <16 x double> %1 216 } 217 218 define <32 x double> @uitofpv32i64v32double(<32 x i64> %a) { 219 ; SSE2: uitofpv32i64v32double 220 ; SSE2: cost of 320 {{.*}} uitofp 221 ; SSE2-CODEGEN: uitofpv32i64v32double 222 ; SSE2-CODEGEN: movapd LCPI 223 ; SSE2-CODEGEN: subpd 224 ; SSE2-CODEGEN: addpd 225 %1 = uitofp <32 x i64> %a to <32 x double> 226 ret <32 x double> %1 227 } 228 229 define <2 x float> @uitofpv2i8v2float(<2 x i8> %a) { 230 ; SSE2: uitofpv2i8v2float 231 ; SSE2: cost of 15 {{.*}} uitofp 232 %1 = uitofp <2 x i8> %a to <2 x float> 233 ret <2 x float> %1 234 } 235 236 define <4 x float> @uitofpv4i8v4float(<4 x i8> %a) { 237 ; SSE2: uitofpv4i8v4float 238 ; SSE2: cost of 15 {{.*}} uitofp 239 %1 = uitofp <4 x i8> %a to <4 x float> 240 ret <4 x float> %1 241 } 242 243 define <8 x float> @uitofpv8i8v8float(<8 x i8> %a) { 244 ; SSE2: uitofpv8i8v8float 245 ; SSE2: cost of 15 {{.*}} uitofp 246 %1 = uitofp <8 x i8> %a to <8 x float> 247 ret <8 x float> %1 248 } 249 250 define <16 x float> @uitofpv16i8v16float(<16 x i8> %a) { 251 ; SSE2: uitofpv16i8v16float 252 ; SSE2: cost of 8 {{.*}} uitofp 253 %1 = uitofp <16 x i8> %a to <16 x float> 254 ret <16 x float> %1 255 } 256 257 define <32 x float> @uitofpv32i8v32float(<32 x i8> %a) { 258 ; SSE2: uitofpv32i8v32float 259 ; SSE2: cost of 16 {{.*}} uitofp 260 %1 = uitofp <32 x i8> %a to <32 x float> 261 ret <32 x float> %1 262 } 263 264 define <2 x float> @uitofpv2i16v2float(<2 x i16> %a) { 265 ; SSE2: uitofpv2i16v2float 266 ; SSE2: cost of 15 {{.*}} uitofp 267 %1 = uitofp <2 x i16> %a to <2 x float> 268 ret <2 x float> %1 269 } 270 271 define <4 x float> @uitofpv4i16v4float(<4 x i16> %a) { 272 ; SSE2: uitofpv4i16v4float 273 ; SSE2: cost of 15 {{.*}} uitofp 274 %1 = uitofp <4 x i16> %a to <4 x float> 275 ret <4 x float> %1 276 } 277 278 define <8 x float> @uitofpv8i16v8float(<8 x i16> %a) { 279 ; SSE2: uitofpv8i16v8float 280 ; SSE2: cost of 15 {{.*}} uitofp 281 %1 = uitofp <8 x i16> %a to <8 x float> 282 ret <8 x float> %1 283 } 284 285 define <16 x float> @uitofpv16i16v16float(<16 x i16> %a) { 286 ; SSE2: uitofpv16i16v16float 287 ; SSE2: cost of 30 {{.*}} uitofp 288 %1 = uitofp <16 x i16> %a to <16 x float> 289 ret <16 x float> %1 290 } 291 292 define <32 x float> @uitofpv32i16v32float(<32 x i16> %a) { 293 ; SSE2: uitofpv32i16v32float 294 ; SSE2: cost of 60 {{.*}} uitofp 295 %1 = uitofp <32 x i16> %a to <32 x float> 296 ret <32 x float> %1 297 } 298 299 define <2 x float> @uitofpv2i32v2float(<2 x i32> %a) { 300 ; SSE2: uitofpv2i32v2float 301 ; SSE2: cost of 15 {{.*}} uitofp 302 %1 = uitofp <2 x i32> %a to <2 x float> 303 ret <2 x float> %1 304 } 305 306 define <4 x float> @uitofpv4i32v4float(<4 x i32> %a) { 307 ; SSE2: uitofpv4i32v4float 308 ; SSE2: cost of 15 {{.*}} uitofp 309 %1 = uitofp <4 x i32> %a to <4 x float> 310 ret <4 x float> %1 311 } 312 313 define <8 x float> @uitofpv8i32v8float(<8 x i32> %a) { 314 ; SSE2: uitofpv8i32v8float 315 ; SSE2: cost of 30 {{.*}} uitofp 316 %1 = uitofp <8 x i32> %a to <8 x float> 317 ret <8 x float> %1 318 } 319 320 define <16 x float> @uitofpv16i32v16float(<16 x i32> %a) { 321 ; SSE2: uitofpv16i32v16float 322 ; SSE2: cost of 60 {{.*}} uitofp 323 %1 = uitofp <16 x i32> %a to <16 x float> 324 ret <16 x float> %1 325 } 326 327 define <32 x float> @uitofpv32i32v32float(<32 x i32> %a) { 328 ; SSE2: uitofpv32i32v32float 329 ; SSE2: cost of 120 {{.*}} uitofp 330 %1 = uitofp <32 x i32> %a to <32 x float> 331 ret <32 x float> %1 332 } 333 334 define <2 x float> @uitofpv2i64v2float(<2 x i64> %a) { 335 ; SSE2: uitofpv2i64v2float 336 ; SSE2: cost of 15 {{.*}} uitofp 337 %1 = uitofp <2 x i64> %a to <2 x float> 338 ret <2 x float> %1 339 } 340 341 define <4 x float> @uitofpv4i64v4float(<4 x i64> %a) { 342 ; SSE2: uitofpv4i64v4float 343 ; SSE2: cost of 30 {{.*}} uitofp 344 %1 = uitofp <4 x i64> %a to <4 x float> 345 ret <4 x float> %1 346 } 347 348 define <8 x float> @uitofpv8i64v8float(<8 x i64> %a) { 349 ; SSE2: uitofpv8i64v8float 350 ; SSE2: cost of 60 {{.*}} uitofp 351 %1 = uitofp <8 x i64> %a to <8 x float> 352 ret <8 x float> %1 353 } 354 355 define <16 x float> @uitofpv16i64v16float(<16 x i64> %a) { 356 ; SSE2: uitofpv16i64v16float 357 ; SSE2: cost of 120 {{.*}} uitofp 358 %1 = uitofp <16 x i64> %a to <16 x float> 359 ret <16 x float> %1 360 } 361 362 define <32 x float> @uitofpv32i64v32float(<32 x i64> %a) { 363 ; SSE2: uitofpv32i64v32float 364 ; SSE2: cost of 240 {{.*}} uitofp 365 %1 = uitofp <32 x i64> %a to <32 x float> 366 ret <32 x float> %1 367 } 368 369