Home | History | Annotate | Download | only in X86
      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