Home | History | Annotate | Download | only in AArch64
      1 ; RUN: llc < %s -march=arm64 -aarch64-neon-syntax=apple | FileCheck %s
      2 
      3 define <8 x i8> @subhn8b(<8 x i16>* %A, <8 x i16>* %B) nounwind {
      4 ;CHECK-LABEL: subhn8b:
      5 ;CHECK: subhn.8b
      6         %tmp1 = load <8 x i16>, <8 x i16>* %A
      7         %tmp2 = load <8 x i16>, <8 x i16>* %B
      8         %tmp3 = call <8 x i8> @llvm.aarch64.neon.subhn.v8i8(<8 x i16> %tmp1, <8 x i16> %tmp2)
      9         ret <8 x i8> %tmp3
     10 }
     11 
     12 define <4 x i16> @subhn4h(<4 x i32>* %A, <4 x i32>* %B) nounwind {
     13 ;CHECK-LABEL: subhn4h:
     14 ;CHECK: subhn.4h
     15         %tmp1 = load <4 x i32>, <4 x i32>* %A
     16         %tmp2 = load <4 x i32>, <4 x i32>* %B
     17         %tmp3 = call <4 x i16> @llvm.aarch64.neon.subhn.v4i16(<4 x i32> %tmp1, <4 x i32> %tmp2)
     18         ret <4 x i16> %tmp3
     19 }
     20 
     21 define <2 x i32> @subhn2s(<2 x i64>* %A, <2 x i64>* %B) nounwind {
     22 ;CHECK-LABEL: subhn2s:
     23 ;CHECK: subhn.2s
     24         %tmp1 = load <2 x i64>, <2 x i64>* %A
     25         %tmp2 = load <2 x i64>, <2 x i64>* %B
     26         %tmp3 = call <2 x i32> @llvm.aarch64.neon.subhn.v2i32(<2 x i64> %tmp1, <2 x i64> %tmp2)
     27         ret <2 x i32> %tmp3
     28 }
     29 
     30 define <16 x i8> @subhn2_16b(<8 x i16> %a, <8 x i16> %b) nounwind  {
     31 ;CHECK-LABEL: subhn2_16b:
     32 ;CHECK: subhn.8b
     33 ;CHECK-NEXT: subhn2.16b
     34   %vsubhn2.i = tail call <8 x i8> @llvm.aarch64.neon.subhn.v8i8(<8 x i16> %a, <8 x i16> %b) nounwind
     35   %vsubhn_high2.i = tail call <8 x i8> @llvm.aarch64.neon.subhn.v8i8(<8 x i16> %a, <8 x i16> %b) nounwind
     36   %res = shufflevector <8 x i8> %vsubhn2.i, <8 x i8> %vsubhn_high2.i, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15>
     37   ret <16 x i8> %res
     38 }
     39 
     40 define <8 x i16> @subhn2_8h(<4 x i32> %a, <4 x i32> %b) nounwind  {
     41 ;CHECK-LABEL: subhn2_8h:
     42 ;CHECK: subhn.4h
     43 ;CHECK-NEXT: subhn2.8h
     44   %vsubhn2.i = tail call <4 x i16> @llvm.aarch64.neon.subhn.v4i16(<4 x i32> %a, <4 x i32> %b) nounwind
     45   %vsubhn_high3.i = tail call <4 x i16> @llvm.aarch64.neon.subhn.v4i16(<4 x i32> %a, <4 x i32> %b) nounwind
     46   %res = shufflevector <4 x i16> %vsubhn2.i, <4 x i16> %vsubhn_high3.i, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7>
     47   ret <8 x i16> %res
     48 }
     49 
     50 define <4 x i32> @subhn2_4s(<2 x i64> %a, <2 x i64> %b) nounwind  {
     51 ;CHECK-LABEL: subhn2_4s:
     52 ;CHECK: subhn.2s
     53 ;CHECK-NEXT: subhn2.4s
     54   %vsubhn2.i = tail call <2 x i32> @llvm.aarch64.neon.subhn.v2i32(<2 x i64> %a, <2 x i64> %b) nounwind
     55   %vsubhn_high3.i = tail call <2 x i32> @llvm.aarch64.neon.subhn.v2i32(<2 x i64> %a, <2 x i64> %b) nounwind
     56   %res = shufflevector <2 x i32> %vsubhn2.i, <2 x i32> %vsubhn_high3.i, <4 x i32> <i32 0, i32 1, i32 2, i32 3>
     57   ret <4 x i32> %res
     58 }
     59 
     60 declare <2 x i32> @llvm.aarch64.neon.subhn.v2i32(<2 x i64>, <2 x i64>) nounwind readnone
     61 declare <4 x i16> @llvm.aarch64.neon.subhn.v4i16(<4 x i32>, <4 x i32>) nounwind readnone
     62 declare <8 x i8> @llvm.aarch64.neon.subhn.v8i8(<8 x i16>, <8 x i16>) nounwind readnone
     63 
     64 define <8 x i8> @rsubhn8b(<8 x i16>* %A, <8 x i16>* %B) nounwind {
     65 ;CHECK-LABEL: rsubhn8b:
     66 ;CHECK: rsubhn.8b
     67         %tmp1 = load <8 x i16>, <8 x i16>* %A
     68         %tmp2 = load <8 x i16>, <8 x i16>* %B
     69         %tmp3 = call <8 x i8> @llvm.aarch64.neon.rsubhn.v8i8(<8 x i16> %tmp1, <8 x i16> %tmp2)
     70         ret <8 x i8> %tmp3
     71 }
     72 
     73 define <4 x i16> @rsubhn4h(<4 x i32>* %A, <4 x i32>* %B) nounwind {
     74 ;CHECK-LABEL: rsubhn4h:
     75 ;CHECK: rsubhn.4h
     76         %tmp1 = load <4 x i32>, <4 x i32>* %A
     77         %tmp2 = load <4 x i32>, <4 x i32>* %B
     78         %tmp3 = call <4 x i16> @llvm.aarch64.neon.rsubhn.v4i16(<4 x i32> %tmp1, <4 x i32> %tmp2)
     79         ret <4 x i16> %tmp3
     80 }
     81 
     82 define <2 x i32> @rsubhn2s(<2 x i64>* %A, <2 x i64>* %B) nounwind {
     83 ;CHECK-LABEL: rsubhn2s:
     84 ;CHECK: rsubhn.2s
     85         %tmp1 = load <2 x i64>, <2 x i64>* %A
     86         %tmp2 = load <2 x i64>, <2 x i64>* %B
     87         %tmp3 = call <2 x i32> @llvm.aarch64.neon.rsubhn.v2i32(<2 x i64> %tmp1, <2 x i64> %tmp2)
     88         ret <2 x i32> %tmp3
     89 }
     90 
     91 define <16 x i8> @rsubhn2_16b(<8 x i16> %a, <8 x i16> %b) nounwind  {
     92 ;CHECK-LABEL: rsubhn2_16b:
     93 ;CHECK: rsubhn.8b
     94 ;CHECK-NEXT: rsubhn2.16b
     95   %vrsubhn2.i = tail call <8 x i8> @llvm.aarch64.neon.rsubhn.v8i8(<8 x i16> %a, <8 x i16> %b) nounwind
     96   %vrsubhn_high2.i = tail call <8 x i8> @llvm.aarch64.neon.rsubhn.v8i8(<8 x i16> %a, <8 x i16> %b) nounwind
     97   %res = shufflevector <8 x i8> %vrsubhn2.i, <8 x i8> %vrsubhn_high2.i, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15>
     98   ret <16 x i8> %res
     99 }
    100 
    101 define <8 x i16> @rsubhn2_8h(<4 x i32> %a, <4 x i32> %b) nounwind  {
    102 ;CHECK-LABEL: rsubhn2_8h:
    103 ;CHECK: rsubhn.4h
    104 ;CHECK-NEXT: rsubhn2.8h
    105   %vrsubhn2.i = tail call <4 x i16> @llvm.aarch64.neon.rsubhn.v4i16(<4 x i32> %a, <4 x i32> %b) nounwind
    106   %vrsubhn_high3.i = tail call <4 x i16> @llvm.aarch64.neon.rsubhn.v4i16(<4 x i32> %a, <4 x i32> %b) nounwind
    107   %res = shufflevector <4 x i16> %vrsubhn2.i, <4 x i16> %vrsubhn_high3.i, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7>
    108   ret <8 x i16> %res
    109 }
    110 
    111 define <4 x i32> @rsubhn2_4s(<2 x i64> %a, <2 x i64> %b) nounwind  {
    112 ;CHECK-LABEL: rsubhn2_4s:
    113 ;CHECK: rsubhn.2s
    114 ;CHECK-NEXT: rsubhn2.4s
    115   %vrsubhn2.i = tail call <2 x i32> @llvm.aarch64.neon.rsubhn.v2i32(<2 x i64> %a, <2 x i64> %b) nounwind
    116   %vrsubhn_high3.i = tail call <2 x i32> @llvm.aarch64.neon.rsubhn.v2i32(<2 x i64> %a, <2 x i64> %b) nounwind
    117   %res = shufflevector <2 x i32> %vrsubhn2.i, <2 x i32> %vrsubhn_high3.i, <4 x i32> <i32 0, i32 1, i32 2, i32 3>
    118   ret <4 x i32> %res
    119 }
    120 
    121 declare <2 x i32> @llvm.aarch64.neon.rsubhn.v2i32(<2 x i64>, <2 x i64>) nounwind readnone
    122 declare <4 x i16> @llvm.aarch64.neon.rsubhn.v4i16(<4 x i32>, <4 x i32>) nounwind readnone
    123 declare <8 x i8> @llvm.aarch64.neon.rsubhn.v8i8(<8 x i16>, <8 x i16>) nounwind readnone
    124 
    125 define <8 x i16> @ssubl8h(<8 x i8>* %A, <8 x i8>* %B) nounwind {
    126 ;CHECK-LABEL: ssubl8h:
    127 ;CHECK: ssubl.8h
    128         %tmp1 = load <8 x i8>, <8 x i8>* %A
    129         %tmp2 = load <8 x i8>, <8 x i8>* %B
    130   %tmp3 = sext <8 x i8> %tmp1 to <8 x i16>
    131   %tmp4 = sext <8 x i8> %tmp2 to <8 x i16>
    132   %tmp5 = sub <8 x i16> %tmp3, %tmp4
    133         ret <8 x i16> %tmp5
    134 }
    135 
    136 define <4 x i32> @ssubl4s(<4 x i16>* %A, <4 x i16>* %B) nounwind {
    137 ;CHECK-LABEL: ssubl4s:
    138 ;CHECK: ssubl.4s
    139         %tmp1 = load <4 x i16>, <4 x i16>* %A
    140         %tmp2 = load <4 x i16>, <4 x i16>* %B
    141   %tmp3 = sext <4 x i16> %tmp1 to <4 x i32>
    142   %tmp4 = sext <4 x i16> %tmp2 to <4 x i32>
    143   %tmp5 = sub <4 x i32> %tmp3, %tmp4
    144         ret <4 x i32> %tmp5
    145 }
    146 
    147 define <2 x i64> @ssubl2d(<2 x i32>* %A, <2 x i32>* %B) nounwind {
    148 ;CHECK-LABEL: ssubl2d:
    149 ;CHECK: ssubl.2d
    150         %tmp1 = load <2 x i32>, <2 x i32>* %A
    151         %tmp2 = load <2 x i32>, <2 x i32>* %B
    152   %tmp3 = sext <2 x i32> %tmp1 to <2 x i64>
    153   %tmp4 = sext <2 x i32> %tmp2 to <2 x i64>
    154   %tmp5 = sub <2 x i64> %tmp3, %tmp4
    155         ret <2 x i64> %tmp5
    156 }
    157 
    158 define <8 x i16> @ssubl2_8h(<16 x i8>* %A, <16 x i8>* %B) nounwind {
    159 ;CHECK-LABEL: ssubl2_8h:
    160 ;CHECK: ssubl2.8h
    161         %tmp1 = load <16 x i8>, <16 x i8>* %A
    162         %high1 = shufflevector <16 x i8> %tmp1, <16 x i8> undef, <8 x i32> <i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15>
    163         %ext1 = sext <8 x i8> %high1 to <8 x i16>
    164 
    165         %tmp2 = load <16 x i8>, <16 x i8>* %B
    166         %high2 = shufflevector <16 x i8> %tmp2, <16 x i8> undef, <8 x i32> <i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15>
    167         %ext2 = sext <8 x i8> %high2 to <8 x i16>
    168 
    169         %res = sub <8 x i16> %ext1, %ext2
    170         ret <8 x i16> %res
    171 }
    172 
    173 define <4 x i32> @ssubl2_4s(<8 x i16>* %A, <8 x i16>* %B) nounwind {
    174 ;CHECK-LABEL: ssubl2_4s:
    175 ;CHECK: ssubl2.4s
    176         %tmp1 = load <8 x i16>, <8 x i16>* %A
    177         %high1 = shufflevector <8 x i16> %tmp1, <8 x i16> undef, <4 x i32> <i32 4, i32 5, i32 6, i32 7>
    178         %ext1 = sext <4 x i16> %high1 to <4 x i32>
    179 
    180         %tmp2 = load <8 x i16>, <8 x i16>* %B
    181         %high2 = shufflevector <8 x i16> %tmp2, <8 x i16> undef, <4 x i32> <i32 4, i32 5, i32 6, i32 7>
    182         %ext2 = sext <4 x i16> %high2 to <4 x i32>
    183 
    184         %res = sub <4 x i32> %ext1, %ext2
    185         ret <4 x i32> %res
    186 }
    187 
    188 define <2 x i64> @ssubl2_2d(<4 x i32>* %A, <4 x i32>* %B) nounwind {
    189 ;CHECK-LABEL: ssubl2_2d:
    190 ;CHECK: ssubl2.2d
    191         %tmp1 = load <4 x i32>, <4 x i32>* %A
    192         %high1 = shufflevector <4 x i32> %tmp1, <4 x i32> undef, <2 x i32> <i32 2, i32 3>
    193         %ext1 = sext <2 x i32> %high1 to <2 x i64>
    194 
    195         %tmp2 = load <4 x i32>, <4 x i32>* %B
    196         %high2 = shufflevector <4 x i32> %tmp2, <4 x i32> undef, <2 x i32> <i32 2, i32 3>
    197         %ext2 = sext <2 x i32> %high2 to <2 x i64>
    198 
    199         %res = sub <2 x i64> %ext1, %ext2
    200         ret <2 x i64> %res
    201 }
    202 
    203 define <8 x i16> @usubl8h(<8 x i8>* %A, <8 x i8>* %B) nounwind {
    204 ;CHECK-LABEL: usubl8h:
    205 ;CHECK: usubl.8h
    206   %tmp1 = load <8 x i8>, <8 x i8>* %A
    207   %tmp2 = load <8 x i8>, <8 x i8>* %B
    208   %tmp3 = zext <8 x i8> %tmp1 to <8 x i16>
    209   %tmp4 = zext <8 x i8> %tmp2 to <8 x i16>
    210   %tmp5 = sub <8 x i16> %tmp3, %tmp4
    211   ret <8 x i16> %tmp5
    212 }
    213 
    214 define <4 x i32> @usubl4s(<4 x i16>* %A, <4 x i16>* %B) nounwind {
    215 ;CHECK-LABEL: usubl4s:
    216 ;CHECK: usubl.4s
    217   %tmp1 = load <4 x i16>, <4 x i16>* %A
    218   %tmp2 = load <4 x i16>, <4 x i16>* %B
    219   %tmp3 = zext <4 x i16> %tmp1 to <4 x i32>
    220   %tmp4 = zext <4 x i16> %tmp2 to <4 x i32>
    221   %tmp5 = sub <4 x i32> %tmp3, %tmp4
    222   ret <4 x i32> %tmp5
    223 }
    224 
    225 define <2 x i64> @usubl2d(<2 x i32>* %A, <2 x i32>* %B) nounwind {
    226 ;CHECK-LABEL: usubl2d:
    227 ;CHECK: usubl.2d
    228   %tmp1 = load <2 x i32>, <2 x i32>* %A
    229   %tmp2 = load <2 x i32>, <2 x i32>* %B
    230   %tmp3 = zext <2 x i32> %tmp1 to <2 x i64>
    231   %tmp4 = zext <2 x i32> %tmp2 to <2 x i64>
    232   %tmp5 = sub <2 x i64> %tmp3, %tmp4
    233   ret <2 x i64> %tmp5
    234 }
    235 
    236 define <8 x i16> @usubl2_8h(<16 x i8>* %A, <16 x i8>* %B) nounwind {
    237 ;CHECK-LABEL: usubl2_8h:
    238 ;CHECK: usubl2.8h
    239   %tmp1 = load <16 x i8>, <16 x i8>* %A
    240   %high1 = shufflevector <16 x i8> %tmp1, <16 x i8> undef, <8 x i32> <i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15>
    241   %ext1 = zext <8 x i8> %high1 to <8 x i16>
    242 
    243   %tmp2 = load <16 x i8>, <16 x i8>* %B
    244   %high2 = shufflevector <16 x i8> %tmp2, <16 x i8> undef, <8 x i32> <i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15>
    245   %ext2 = zext <8 x i8> %high2 to <8 x i16>
    246 
    247   %res = sub <8 x i16> %ext1, %ext2
    248   ret <8 x i16> %res
    249 }
    250 
    251 define <4 x i32> @usubl2_4s(<8 x i16>* %A, <8 x i16>* %B) nounwind {
    252 ;CHECK-LABEL: usubl2_4s:
    253 ;CHECK: usubl2.4s
    254   %tmp1 = load <8 x i16>, <8 x i16>* %A
    255   %high1 = shufflevector <8 x i16> %tmp1, <8 x i16> undef, <4 x i32> <i32 4, i32 5, i32 6, i32 7>
    256   %ext1 = zext <4 x i16> %high1 to <4 x i32>
    257 
    258   %tmp2 = load <8 x i16>, <8 x i16>* %B
    259   %high2 = shufflevector <8 x i16> %tmp2, <8 x i16> undef, <4 x i32> <i32 4, i32 5, i32 6, i32 7>
    260   %ext2 = zext <4 x i16> %high2 to <4 x i32>
    261 
    262   %res = sub <4 x i32> %ext1, %ext2
    263   ret <4 x i32> %res
    264 }
    265 
    266 define <2 x i64> @usubl2_2d(<4 x i32>* %A, <4 x i32>* %B) nounwind {
    267 ;CHECK-LABEL: usubl2_2d:
    268 ;CHECK: usubl2.2d
    269   %tmp1 = load <4 x i32>, <4 x i32>* %A
    270   %high1 = shufflevector <4 x i32> %tmp1, <4 x i32> undef, <2 x i32> <i32 2, i32 3>
    271   %ext1 = zext <2 x i32> %high1 to <2 x i64>
    272 
    273   %tmp2 = load <4 x i32>, <4 x i32>* %B
    274   %high2 = shufflevector <4 x i32> %tmp2, <4 x i32> undef, <2 x i32> <i32 2, i32 3>
    275   %ext2 = zext <2 x i32> %high2 to <2 x i64>
    276 
    277   %res = sub <2 x i64> %ext1, %ext2
    278   ret <2 x i64> %res
    279 }
    280 
    281 define <8 x i16> @ssubw8h(<8 x i16>* %A, <8 x i8>* %B) nounwind {
    282 ;CHECK-LABEL: ssubw8h:
    283 ;CHECK: ssubw.8h
    284         %tmp1 = load <8 x i16>, <8 x i16>* %A
    285         %tmp2 = load <8 x i8>, <8 x i8>* %B
    286   %tmp3 = sext <8 x i8> %tmp2 to <8 x i16>
    287   %tmp4 = sub <8 x i16> %tmp1, %tmp3
    288         ret <8 x i16> %tmp4
    289 }
    290 
    291 define <4 x i32> @ssubw4s(<4 x i32>* %A, <4 x i16>* %B) nounwind {
    292 ;CHECK-LABEL: ssubw4s:
    293 ;CHECK: ssubw.4s
    294         %tmp1 = load <4 x i32>, <4 x i32>* %A
    295         %tmp2 = load <4 x i16>, <4 x i16>* %B
    296   %tmp3 = sext <4 x i16> %tmp2 to <4 x i32>
    297   %tmp4 = sub <4 x i32> %tmp1, %tmp3
    298         ret <4 x i32> %tmp4
    299 }
    300 
    301 define <2 x i64> @ssubw2d(<2 x i64>* %A, <2 x i32>* %B) nounwind {
    302 ;CHECK-LABEL: ssubw2d:
    303 ;CHECK: ssubw.2d
    304         %tmp1 = load <2 x i64>, <2 x i64>* %A
    305         %tmp2 = load <2 x i32>, <2 x i32>* %B
    306   %tmp3 = sext <2 x i32> %tmp2 to <2 x i64>
    307   %tmp4 = sub <2 x i64> %tmp1, %tmp3
    308         ret <2 x i64> %tmp4
    309 }
    310 
    311 define <8 x i16> @ssubw2_8h(<8 x i16>* %A, <16 x i8>* %B) nounwind {
    312 ;CHECK-LABEL: ssubw2_8h:
    313 ;CHECK: ssubw2.8h
    314         %tmp1 = load <8 x i16>, <8 x i16>* %A
    315 
    316         %tmp2 = load <16 x i8>, <16 x i8>* %B
    317         %high2 = shufflevector <16 x i8> %tmp2, <16 x i8> undef, <8 x i32> <i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15>
    318         %ext2 = sext <8 x i8> %high2 to <8 x i16>
    319 
    320         %res = sub <8 x i16> %tmp1, %ext2
    321         ret <8 x i16> %res
    322 }
    323 
    324 define <4 x i32> @ssubw2_4s(<4 x i32>* %A, <8 x i16>* %B) nounwind {
    325 ;CHECK-LABEL: ssubw2_4s:
    326 ;CHECK: ssubw2.4s
    327         %tmp1 = load <4 x i32>, <4 x i32>* %A
    328 
    329         %tmp2 = load <8 x i16>, <8 x i16>* %B
    330         %high2 = shufflevector <8 x i16> %tmp2, <8 x i16> undef, <4 x i32> <i32 4, i32 5, i32 6, i32 7>
    331         %ext2 = sext <4 x i16> %high2 to <4 x i32>
    332 
    333         %res = sub <4 x i32> %tmp1, %ext2
    334         ret <4 x i32> %res
    335 }
    336 
    337 define <2 x i64> @ssubw2_2d(<2 x i64>* %A, <4 x i32>* %B) nounwind {
    338 ;CHECK-LABEL: ssubw2_2d:
    339 ;CHECK: ssubw2.2d
    340         %tmp1 = load <2 x i64>, <2 x i64>* %A
    341 
    342         %tmp2 = load <4 x i32>, <4 x i32>* %B
    343         %high2 = shufflevector <4 x i32> %tmp2, <4 x i32> undef, <2 x i32> <i32 2, i32 3>
    344         %ext2 = sext <2 x i32> %high2 to <2 x i64>
    345 
    346         %res = sub <2 x i64> %tmp1, %ext2
    347         ret <2 x i64> %res
    348 }
    349 
    350 define <8 x i16> @usubw8h(<8 x i16>* %A, <8 x i8>* %B) nounwind {
    351 ;CHECK-LABEL: usubw8h:
    352 ;CHECK: usubw.8h
    353         %tmp1 = load <8 x i16>, <8 x i16>* %A
    354         %tmp2 = load <8 x i8>, <8 x i8>* %B
    355   %tmp3 = zext <8 x i8> %tmp2 to <8 x i16>
    356   %tmp4 = sub <8 x i16> %tmp1, %tmp3
    357         ret <8 x i16> %tmp4
    358 }
    359 
    360 define <4 x i32> @usubw4s(<4 x i32>* %A, <4 x i16>* %B) nounwind {
    361 ;CHECK-LABEL: usubw4s:
    362 ;CHECK: usubw.4s
    363         %tmp1 = load <4 x i32>, <4 x i32>* %A
    364         %tmp2 = load <4 x i16>, <4 x i16>* %B
    365   %tmp3 = zext <4 x i16> %tmp2 to <4 x i32>
    366   %tmp4 = sub <4 x i32> %tmp1, %tmp3
    367         ret <4 x i32> %tmp4
    368 }
    369 
    370 define <2 x i64> @usubw2d(<2 x i64>* %A, <2 x i32>* %B) nounwind {
    371 ;CHECK-LABEL: usubw2d:
    372 ;CHECK: usubw.2d
    373         %tmp1 = load <2 x i64>, <2 x i64>* %A
    374         %tmp2 = load <2 x i32>, <2 x i32>* %B
    375   %tmp3 = zext <2 x i32> %tmp2 to <2 x i64>
    376   %tmp4 = sub <2 x i64> %tmp1, %tmp3
    377         ret <2 x i64> %tmp4
    378 }
    379 
    380 define <8 x i16> @usubw2_8h(<8 x i16>* %A, <16 x i8>* %B) nounwind {
    381 ;CHECK-LABEL: usubw2_8h:
    382 ;CHECK: usubw2.8h
    383         %tmp1 = load <8 x i16>, <8 x i16>* %A
    384 
    385         %tmp2 = load <16 x i8>, <16 x i8>* %B
    386         %high2 = shufflevector <16 x i8> %tmp2, <16 x i8> undef, <8 x i32> <i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15>
    387         %ext2 = zext <8 x i8> %high2 to <8 x i16>
    388 
    389         %res = sub <8 x i16> %tmp1, %ext2
    390         ret <8 x i16> %res
    391 }
    392 
    393 define <4 x i32> @usubw2_4s(<4 x i32>* %A, <8 x i16>* %B) nounwind {
    394 ;CHECK-LABEL: usubw2_4s:
    395 ;CHECK: usubw2.4s
    396         %tmp1 = load <4 x i32>, <4 x i32>* %A
    397 
    398         %tmp2 = load <8 x i16>, <8 x i16>* %B
    399         %high2 = shufflevector <8 x i16> %tmp2, <8 x i16> undef, <4 x i32> <i32 4, i32 5, i32 6, i32 7>
    400         %ext2 = zext <4 x i16> %high2 to <4 x i32>
    401 
    402         %res = sub <4 x i32> %tmp1, %ext2
    403         ret <4 x i32> %res
    404 }
    405 
    406 define <2 x i64> @usubw2_2d(<2 x i64>* %A, <4 x i32>* %B) nounwind {
    407 ;CHECK-LABEL: usubw2_2d:
    408 ;CHECK: usubw2.2d
    409         %tmp1 = load <2 x i64>, <2 x i64>* %A
    410 
    411         %tmp2 = load <4 x i32>, <4 x i32>* %B
    412         %high2 = shufflevector <4 x i32> %tmp2, <4 x i32> undef, <2 x i32> <i32 2, i32 3>
    413         %ext2 = zext <2 x i32> %high2 to <2 x i64>
    414 
    415         %res = sub <2 x i64> %tmp1, %ext2
    416         ret <2 x i64> %res
    417 }
    418