Home | History | Annotate | Download | only in X86
      1 ; RUN: opt -mtriple=x86_64-apple-darwin -mattr=+sse2 -cost-model -analyze < %s | FileCheck --check-prefix=SSE2 %s
      2 ; RUN: opt -mtriple=x86_64-apple-darwin -mattr=+sse4.1 -cost-model -analyze < %s | FileCheck --check-prefix=SSE41 %s
      3 
      4 define void @zext_v16i16_to_v16i32(<16 x i16>* %a) {
      5 ; SSE2: zext_v16i16_to_v16i32
      6 ; SSE2: cost of 6 {{.*}} zext
      7 ;
      8 ; SSE41: zext_v16i16_to_v16i32
      9 ; SSE41: cost of 4 {{.*}} zext
     10 ;
     11   %1 = load <16 x i16>, <16 x i16>* %a
     12   %2 = zext <16 x i16> %1 to <16 x i32>
     13   store <16 x i32> %2, <16 x i32>* undef, align 4
     14   ret void
     15 }
     16 
     17 define void @sext_v16i16_to_v16i32(<16 x i16>* %a) {
     18 ; SSE2: sext_v16i16_to_v16i32
     19 ; SSE2: cost of 8 {{.*}} sext
     20 ;
     21 ; SSE41: sext_v16i16_to_v16i32
     22 ; SSE41: cost of 4 {{.*}} sext
     23 ;
     24   %1 = load <16 x i16>, <16 x i16>* %a
     25   %2 = sext <16 x i16> %1 to <16 x i32>
     26   store <16 x i32> %2, <16 x i32>* undef, align 4
     27   ret void
     28 }
     29 
     30 define void @zext_v8i16_to_v8i32(<8 x i16>* %a) {
     31 ; SSE2: zext_v8i16_to_v8i32
     32 ; SSE2: cost of 3 {{.*}} zext
     33 ;
     34 ; SSE41: zext_v8i16_to_v8i32
     35 ; SSE41: cost of 2 {{.*}} zext
     36 ;
     37   %1 = load <8 x i16>, <8 x i16>* %a
     38   %2 = zext <8 x i16> %1 to <8 x i32>
     39   store <8 x i32> %2, <8 x i32>* undef, align 4
     40   ret void
     41 }
     42 
     43 define void @sext_v8i16_to_v8i32(<8 x i16>* %a) {
     44 ; SSE2: sext_v8i16_to_v8i32
     45 ; SSE2: cost of 4 {{.*}} sext
     46 ;
     47 ; SSE41: sext_v8i16_to_v8i32
     48 ; SSE41: cost of 2 {{.*}} sext
     49 ;
     50   %1 = load <8 x i16>, <8 x i16>* %a
     51   %2 = sext <8 x i16> %1 to <8 x i32>
     52   store <8 x i32> %2, <8 x i32>* undef, align 4
     53   ret void
     54 }
     55 
     56 define void @zext_v4i16_to_v4i32(<4 x i16>* %a) {
     57 ; SSE2: zext_v4i16_to_v4i32
     58 ; SSE2: cost of 1 {{.*}} zext
     59 ;
     60 ; SSE41: zext_v4i16_to_v4i32
     61 ; SSE41: cost of 1 {{.*}} zext
     62 ;
     63   %1 = load <4 x i16>, <4 x i16>* %a
     64   %2 = zext <4 x i16> %1 to <4 x i32>
     65   store <4 x i32> %2, <4 x i32>* undef, align 4
     66   ret void
     67 }
     68 
     69 define void @sext_v4i16_to_v4i32(<4 x i16>* %a) {
     70 ; SSE2: sext_v4i16_to_v4i32
     71 ; SSE2: cost of 2 {{.*}} sext
     72 ;
     73 ; SSE41: sext_v4i16_to_v4i32
     74 ; SSE41: cost of 1 {{.*}} sext
     75 ;
     76   %1 = load <4 x i16>, <4 x i16>* %a
     77   %2 = sext <4 x i16> %1 to <4 x i32>
     78   store <4 x i32> %2, <4 x i32>* undef, align 4
     79   ret void
     80 }
     81 
     82 define void @zext_v16i8_to_v16i32(<16 x i8>* %a) {
     83 ; SSE2: zext_v16i8_to_v16i32
     84 ; SSE2: cost of 9 {{.*}} zext
     85 ;
     86 ; SSE41: zext_v16i8_to_v16i32
     87 ; SSE41: cost of 4 {{.*}} zext
     88 ;
     89   %1 = load <16 x i8>, <16 x i8>* %a
     90   %2 = zext <16 x i8> %1 to <16 x i32>
     91   store <16 x i32> %2, <16 x i32>* undef, align 4
     92   ret void
     93 }
     94 
     95 define void @sext_v16i8_to_v16i32(<16 x i8>* %a) {
     96 ; SSE2: sext_v16i8_to_v16i32
     97 ; SSE2: cost of 12 {{.*}} sext
     98 ;
     99 ; SSE41: sext_v16i8_to_v16i32
    100 ; SSE41: cost of 4 {{.*}} sext
    101 ;
    102   %1 = load <16 x i8>, <16 x i8>* %a
    103   %2 = sext <16 x i8> %1 to <16 x i32>
    104   store <16 x i32> %2, <16 x i32>* undef, align 4
    105   ret void
    106 }
    107 
    108 define void @zext_v8i8_to_v8i32(<8 x i8>* %a) {
    109 ; SSE2: zext_v8i8_to_v8i32
    110 ; SSE2: cost of 6 {{.*}} zext
    111 ;
    112 ; SSE41: zext_v8i8_to_v8i32
    113 ; SSE41: cost of 2 {{.*}} zext
    114 ;
    115   %1 = load <8 x i8>, <8 x i8>* %a
    116   %2 = zext <8 x i8> %1 to <8 x i32>
    117   store <8 x i32> %2, <8 x i32>* undef, align 4
    118   ret void
    119 }
    120 
    121 define void @sext_v8i8_to_v8i32(<8 x i8>* %a) {
    122 ; SSE2: sext_v8i8_to_v8i32
    123 ; SSE2: cost of 6 {{.*}} sext
    124 ;
    125 ; SSE41: sext_v8i8_to_v8i32
    126 ; SSE41: cost of 2 {{.*}} sext
    127 ;
    128   %1 = load <8 x i8>, <8 x i8>* %a
    129   %2 = sext <8 x i8> %1 to <8 x i32>
    130   store <8 x i32> %2, <8 x i32>* undef, align 4
    131   ret void
    132 }
    133 
    134 define void @zext_v4i8_to_v4i32(<4 x i8>* %a) {
    135 ; SSE2: zext_v4i8_to_v4i32
    136 ; SSE2: cost of 2 {{.*}} zext
    137 ;
    138 ; SSE41: zext_v4i8_to_v4i32
    139 ; SSE41: cost of 1 {{.*}} zext
    140 ;
    141   %1 = load <4 x i8>, <4 x i8>* %a
    142   %2 = zext <4 x i8> %1 to <4 x i32>
    143   store <4 x i32> %2, <4 x i32>* undef, align 4
    144   ret void
    145 }
    146 
    147 define void @sext_v4i8_to_v4i32(<4 x i8>* %a) {
    148 ; SSE2: sext_v4i8_to_v4i32
    149 ; SSE2: cost of 3 {{.*}} sext
    150 ;
    151 ; SSE41: sext_v4i8_to_v4i32
    152 ; SSE41: cost of 1 {{.*}} sext
    153 ;
    154   %1 = load <4 x i8>, <4 x i8>* %a
    155   %2 = sext <4 x i8> %1 to <4 x i32>
    156   store <4 x i32> %2, <4 x i32>* undef, align 4
    157   ret void
    158 }
    159 
    160 define void @zext_v16i8_to_v16i16(<16 x i8>* %a) {
    161 ; SSE2: zext_v16i8_to_v16i16
    162 ; SSE2: cost of 3 {{.*}} zext
    163 ;
    164 ; SSE41: zext_v16i8_to_v16i16
    165 ; SSE41: cost of 2 {{.*}} zext
    166 ;
    167   %1 = load <16 x i8>, <16 x i8>* %a
    168   %2 = zext <16 x i8> %1 to <16 x i16>
    169   store <16 x i16> %2, <16 x i16>* undef, align 4
    170   ret void
    171 }
    172 
    173 define void @sext_v16i8_to_v16i16(<16 x i8>* %a) {
    174 ; SSE2: sext_v16i8_to_v16i16
    175 ; SSE2: cost of 4 {{.*}} sext
    176 ;
    177 ; SSE41: sext_v16i8_to_v16i16
    178 ; SSE41: cost of 2 {{.*}} sext
    179 ;
    180   %1 = load <16 x i8>, <16 x i8>* %a
    181   %2 = sext <16 x i8> %1 to <16 x i16>
    182   store <16 x i16> %2, <16 x i16>* undef, align 4
    183   ret void
    184 }
    185 
    186 define void @zext_v8i8_to_v8i16(<8 x i8>* %a) {
    187 ; SSE2: zext_v8i8_to_v8i16
    188 ; SSE2: cost of 1 {{.*}} zext
    189 ;
    190 ; SSE41: zext_v8i8_to_v8i16
    191 ; SSE41: cost of 1 {{.*}} zext
    192 ;
    193   %1 = load <8 x i8>, <8 x i8>* %a
    194   %2 = zext <8 x i8> %1 to <8 x i16>
    195   store <8 x i16> %2, <8 x i16>* undef, align 4
    196   ret void
    197 }
    198 
    199 define void @sext_v8i8_to_v8i16(<8 x i8>* %a) {
    200 ; SSE2: sext_v8i8_to_v8i16
    201 ; SSE2: cost of 2 {{.*}} sext
    202 ;
    203 ; SSE41: sext_v8i8_to_v8i16
    204 ; SSE41: cost of 1 {{.*}} sext
    205 ;
    206   %1 = load <8 x i8>, <8 x i8>* %a
    207   %2 = sext <8 x i8> %1 to <8 x i16>
    208   store <8 x i16> %2, <8 x i16>* undef, align 4
    209   ret void
    210 }
    211 
    212 define void @zext_v4i8_to_v4i16(<4 x i8>* %a) {
    213 ; SSE2: zext_v4i8_to_v4i16
    214 ; SSE2: cost of 1 {{.*}} zext
    215 ;
    216 ; SSE41: zext_v4i8_to_v4i16
    217 ; SSE41: cost of 1 {{.*}} zext
    218 ;
    219   %1 = load <4 x i8>, <4 x i8>* %a
    220   %2 = zext <4 x i8> %1 to <4 x i16>
    221   store <4 x i16> %2, <4 x i16>* undef, align 4
    222   ret void
    223 }
    224 
    225 define void @sext_v4i8_to_v4i16(<4 x i8>* %a) {
    226 ; SSE2: sext_v4i8_to_v4i16
    227 ; SSE2: cost of 6 {{.*}} sext
    228 ;
    229 ; SSE41: sext_v4i8_to_v4i16
    230 ; SSE41: cost of 2 {{.*}} sext
    231 ;
    232   %1 = load <4 x i8>, <4 x i8>* %a
    233   %2 = sext <4 x i8> %1 to <4 x i16>
    234   store <4 x i16> %2, <4 x i16>* undef, align 4
    235   ret void
    236 }
    237 
    238 define void @truncate_v16i32_to_v16i16(<16 x i32>* %a) {
    239 ; SSE2: truncate_v16i32_to_v16i16
    240 ; SSE2: cost of 10 {{.*}} trunc
    241 ;
    242 ; SSE41: truncate_v16i32_to_v16i16
    243 ; SSE41: cost of 6 {{.*}} trunc
    244 ;
    245   %1 = load <16 x i32>, <16 x i32>* %a
    246   %2 = trunc <16 x i32> %1 to <16 x i16>
    247   store <16 x i16> %2, <16 x i16>* undef, align 4
    248   ret void
    249 }
    250 
    251 define void @truncate_v8i32_to_v8i16(<8 x i32>* %a) {
    252 ; SSE2: truncate_v8i32_to_v8i16
    253 ; SSE2: cost of 5 {{.*}} trunc
    254 ;
    255 ; SSE41: truncate_v8i32_to_v8i16
    256 ; SSE41: cost of 3 {{.*}} trunc
    257 ;
    258   %1 = load <8 x i32>, <8 x i32>* %a
    259   %2 = trunc <8 x i32> %1 to <8 x i16>
    260   store <8 x i16> %2, <8 x i16>* undef, align 4
    261   ret void
    262 }
    263 
    264 define void @truncate_v4i32_to_v4i16(<4 x i32>* %a) {
    265 ; SSE2: truncate_v4i32_to_v4i16
    266 ; SSE2: cost of 3 {{.*}} trunc
    267 ;
    268 ; SSE41: truncate_v4i32_to_v4i16
    269 ; SSE41: cost of 1 {{.*}} trunc
    270 ;
    271   %1 = load <4 x i32>, <4 x i32>* %a
    272   %2 = trunc <4 x i32> %1 to <4 x i16>
    273   store <4 x i16> %2, <4 x i16>* undef, align 4
    274   ret void
    275 }
    276 
    277 define void @truncate_v16i32_to_v16i8(<16 x i32>* %a) {
    278 ; SSE2: truncate_v16i32_to_v16i8
    279 ; SSE2: cost of 7 {{.*}} trunc
    280 ;
    281 ; SSE41: truncate_v16i32_to_v16i8
    282 ; SSE41: cost of 30 {{.*}} trunc
    283 ;
    284   %1 = load <16 x i32>, <16 x i32>* %a
    285   %2 = trunc <16 x i32> %1 to <16 x i8>
    286   store <16 x i8> %2, <16 x i8>* undef, align 4
    287   ret void
    288 }
    289 
    290 define void @truncate_v8i32_to_v8i8(<8 x i32>* %a) {
    291 ; SSE2: truncate_v8i32_to_v8i8
    292 ; SSE2: cost of 4 {{.*}} trunc
    293 ;
    294 ; SSE41: truncate_v8i32_to_v8i8
    295 ; SSE41: cost of 3 {{.*}} trunc
    296 ;
    297   %1 = load <8 x i32>, <8 x i32>* %a
    298   %2 = trunc <8 x i32> %1 to <8 x i8>
    299   store <8 x i8> %2, <8 x i8>* undef, align 4
    300   ret void
    301 }
    302 
    303 define void @truncate_v4i32_to_v4i8(<4 x i32>* %a) {
    304 ; SSE2: truncate_v4i32_to_v4i8
    305 ; SSE2: cost of 3 {{.*}} trunc
    306 ;
    307 ; SSE41: truncate_v4i32_to_v4i8
    308 ; SSE41: cost of 1 {{.*}} trunc
    309 ;
    310   %1 = load <4 x i32>, <4 x i32>* %a
    311   %2 = trunc <4 x i32> %1 to <4 x i8>
    312   store <4 x i8> %2, <4 x i8>* undef, align 4
    313   ret void
    314 }
    315 
    316 define void @truncate_v16i16_to_v16i8(<16 x i16>* %a) {
    317 ; SSE2: truncate_v16i16_to_v16i8
    318 ; SSE2: cost of 3 {{.*}} trunc
    319 ;
    320 ; SSE41: truncate_v16i16_to_v16i8
    321 ; SSE41: cost of 3 {{.*}} trunc
    322 ;
    323   %1 = load <16 x i16>, <16 x i16>* %a
    324   %2 = trunc <16 x i16> %1 to <16 x i8>
    325   store <16 x i8> %2, <16 x i8>* undef, align 4
    326   ret void
    327 }
    328 
    329 define void @truncate_v8i16_to_v8i8(<8 x i16>* %a) {
    330 ; SSE2: truncate_v8i16_to_v8i8
    331 ; SSE2: cost of 2 {{.*}} trunc
    332 ;
    333 ; SSE41: truncate_v8i16_to_v8i8
    334 ; SSE41: cost of 1 {{.*}} trunc
    335 ;
    336   %1 = load <8 x i16>, <8 x i16>* %a
    337   %2 = trunc <8 x i16> %1 to <8 x i8>
    338   store <8 x i8> %2, <8 x i8>* undef, align 4
    339   ret void
    340 }
    341 
    342 define void @truncate_v4i16_to_v4i8(<4 x i16>* %a) {
    343 ; SSE2: truncate_v4i16_to_v4i8
    344 ; SSE2: cost of 4 {{.*}} trunc
    345 ;
    346 ; SSE41: truncate_v4i16_to_v4i8
    347 ; SSE41: cost of 2 {{.*}} trunc
    348 ;
    349   %1 = load <4 x i16>, <4 x i16>* %a
    350   %2 = trunc <4 x i16> %1 to <4 x i8>
    351   store <4 x i8> %2, <4 x i8>* undef, align 4
    352   ret void
    353 }
    354