Home | History | Annotate | Download | only in ARM
      1 ; RUN: llc -mtriple=arm-eabi -mattr=+neon %s -o - | FileCheck %s
      2 
      3 define <8 x i8> @vaddi8(<8 x i8>* %A, <8 x i8>* %B) nounwind {
      4 ;CHECK-LABEL: vaddi8:
      5 ;CHECK: vadd.i8
      6 	%tmp1 = load <8 x i8>* %A
      7 	%tmp2 = load <8 x i8>* %B
      8 	%tmp3 = add <8 x i8> %tmp1, %tmp2
      9 	ret <8 x i8> %tmp3
     10 }
     11 
     12 define <4 x i16> @vaddi16(<4 x i16>* %A, <4 x i16>* %B) nounwind {
     13 ;CHECK-LABEL: vaddi16:
     14 ;CHECK: vadd.i16
     15 	%tmp1 = load <4 x i16>* %A
     16 	%tmp2 = load <4 x i16>* %B
     17 	%tmp3 = add <4 x i16> %tmp1, %tmp2
     18 	ret <4 x i16> %tmp3
     19 }
     20 
     21 define <2 x i32> @vaddi32(<2 x i32>* %A, <2 x i32>* %B) nounwind {
     22 ;CHECK-LABEL: vaddi32:
     23 ;CHECK: vadd.i32
     24 	%tmp1 = load <2 x i32>* %A
     25 	%tmp2 = load <2 x i32>* %B
     26 	%tmp3 = add <2 x i32> %tmp1, %tmp2
     27 	ret <2 x i32> %tmp3
     28 }
     29 
     30 define <1 x i64> @vaddi64(<1 x i64>* %A, <1 x i64>* %B) nounwind {
     31 ;CHECK-LABEL: vaddi64:
     32 ;CHECK: vadd.i64
     33 	%tmp1 = load <1 x i64>* %A
     34 	%tmp2 = load <1 x i64>* %B
     35 	%tmp3 = add <1 x i64> %tmp1, %tmp2
     36 	ret <1 x i64> %tmp3
     37 }
     38 
     39 define <2 x float> @vaddf32(<2 x float>* %A, <2 x float>* %B) nounwind {
     40 ;CHECK-LABEL: vaddf32:
     41 ;CHECK: vadd.f32
     42 	%tmp1 = load <2 x float>* %A
     43 	%tmp2 = load <2 x float>* %B
     44 	%tmp3 = fadd <2 x float> %tmp1, %tmp2
     45 	ret <2 x float> %tmp3
     46 }
     47 
     48 define <16 x i8> @vaddQi8(<16 x i8>* %A, <16 x i8>* %B) nounwind {
     49 ;CHECK-LABEL: vaddQi8:
     50 ;CHECK: vadd.i8
     51 	%tmp1 = load <16 x i8>* %A
     52 	%tmp2 = load <16 x i8>* %B
     53 	%tmp3 = add <16 x i8> %tmp1, %tmp2
     54 	ret <16 x i8> %tmp3
     55 }
     56 
     57 define <8 x i16> @vaddQi16(<8 x i16>* %A, <8 x i16>* %B) nounwind {
     58 ;CHECK-LABEL: vaddQi16:
     59 ;CHECK: vadd.i16
     60 	%tmp1 = load <8 x i16>* %A
     61 	%tmp2 = load <8 x i16>* %B
     62 	%tmp3 = add <8 x i16> %tmp1, %tmp2
     63 	ret <8 x i16> %tmp3
     64 }
     65 
     66 define <4 x i32> @vaddQi32(<4 x i32>* %A, <4 x i32>* %B) nounwind {
     67 ;CHECK-LABEL: vaddQi32:
     68 ;CHECK: vadd.i32
     69 	%tmp1 = load <4 x i32>* %A
     70 	%tmp2 = load <4 x i32>* %B
     71 	%tmp3 = add <4 x i32> %tmp1, %tmp2
     72 	ret <4 x i32> %tmp3
     73 }
     74 
     75 define <2 x i64> @vaddQi64(<2 x i64>* %A, <2 x i64>* %B) nounwind {
     76 ;CHECK-LABEL: vaddQi64:
     77 ;CHECK: vadd.i64
     78 	%tmp1 = load <2 x i64>* %A
     79 	%tmp2 = load <2 x i64>* %B
     80 	%tmp3 = add <2 x i64> %tmp1, %tmp2
     81 	ret <2 x i64> %tmp3
     82 }
     83 
     84 define <4 x float> @vaddQf32(<4 x float>* %A, <4 x float>* %B) nounwind {
     85 ;CHECK-LABEL: vaddQf32:
     86 ;CHECK: vadd.f32
     87 	%tmp1 = load <4 x float>* %A
     88 	%tmp2 = load <4 x float>* %B
     89 	%tmp3 = fadd <4 x float> %tmp1, %tmp2
     90 	ret <4 x float> %tmp3
     91 }
     92 
     93 define <8 x i8> @vraddhni16(<8 x i16>* %A, <8 x i16>* %B) nounwind {
     94 ;CHECK-LABEL: vraddhni16:
     95 ;CHECK: vraddhn.i16
     96 	%tmp1 = load <8 x i16>* %A
     97 	%tmp2 = load <8 x i16>* %B
     98 	%tmp3 = call <8 x i8> @llvm.arm.neon.vraddhn.v8i8(<8 x i16> %tmp1, <8 x i16> %tmp2)
     99 	ret <8 x i8> %tmp3
    100 }
    101 
    102 define <4 x i16> @vraddhni32(<4 x i32>* %A, <4 x i32>* %B) nounwind {
    103 ;CHECK-LABEL: vraddhni32:
    104 ;CHECK: vraddhn.i32
    105 	%tmp1 = load <4 x i32>* %A
    106 	%tmp2 = load <4 x i32>* %B
    107 	%tmp3 = call <4 x i16> @llvm.arm.neon.vraddhn.v4i16(<4 x i32> %tmp1, <4 x i32> %tmp2)
    108 	ret <4 x i16> %tmp3
    109 }
    110 
    111 define <2 x i32> @vraddhni64(<2 x i64>* %A, <2 x i64>* %B) nounwind {
    112 ;CHECK-LABEL: vraddhni64:
    113 ;CHECK: vraddhn.i64
    114 	%tmp1 = load <2 x i64>* %A
    115 	%tmp2 = load <2 x i64>* %B
    116 	%tmp3 = call <2 x i32> @llvm.arm.neon.vraddhn.v2i32(<2 x i64> %tmp1, <2 x i64> %tmp2)
    117 	ret <2 x i32> %tmp3
    118 }
    119 
    120 declare <8 x i8>  @llvm.arm.neon.vraddhn.v8i8(<8 x i16>, <8 x i16>) nounwind readnone
    121 declare <4 x i16> @llvm.arm.neon.vraddhn.v4i16(<4 x i32>, <4 x i32>) nounwind readnone
    122 declare <2 x i32> @llvm.arm.neon.vraddhn.v2i32(<2 x i64>, <2 x i64>) nounwind readnone
    123 
    124 define <8 x i8> @vaddhni16_natural(<8 x i16> %A, <8 x i16> %B) nounwind {
    125 ; CHECK-LABEL: vaddhni16_natural:
    126 ; CHECK: vaddhn.i16
    127   %sum = add <8 x i16> %A, %B
    128   %shift = lshr <8 x i16> %sum, <i16 8, i16 8, i16 8, i16 8, i16 8, i16 8, i16 8, i16 8>
    129   %trunc = trunc <8 x i16> %shift to <8 x i8>
    130   ret <8 x i8> %trunc
    131 }
    132 
    133 define <4 x i16> @vaddhni32_natural(<4 x i32> %A, <4 x i32> %B) nounwind {
    134 ; CHECK-LABEL: vaddhni32_natural:
    135 ; CHECK: vaddhn.i32
    136   %sum = add <4 x i32> %A, %B
    137   %shift = lshr <4 x i32> %sum, <i32 16, i32 16, i32 16, i32 16>
    138   %trunc = trunc <4 x i32> %shift to <4 x i16>
    139   ret <4 x i16> %trunc
    140 }
    141 
    142 define <2 x i32> @vaddhni64_natural(<2 x i64> %A, <2 x i64> %B) nounwind {
    143 ; CHECK-LABEL: vaddhni64_natural:
    144 ; CHECK: vaddhn.i64
    145   %sum = add <2 x i64> %A, %B
    146   %shift = lshr <2 x i64> %sum, <i64 32, i64 32>
    147   %trunc = trunc <2 x i64> %shift to <2 x i32>
    148   ret <2 x i32> %trunc
    149 }
    150 
    151 define <8 x i16> @vaddls8(<8 x i8>* %A, <8 x i8>* %B) nounwind {
    152 ;CHECK-LABEL: vaddls8:
    153 ;CHECK: vaddl.s8
    154 	%tmp1 = load <8 x i8>* %A
    155 	%tmp2 = load <8 x i8>* %B
    156 	%tmp3 = sext <8 x i8> %tmp1 to <8 x i16>
    157 	%tmp4 = sext <8 x i8> %tmp2 to <8 x i16>
    158 	%tmp5 = add <8 x i16> %tmp3, %tmp4
    159 	ret <8 x i16> %tmp5
    160 }
    161 
    162 define <4 x i32> @vaddls16(<4 x i16>* %A, <4 x i16>* %B) nounwind {
    163 ;CHECK-LABEL: vaddls16:
    164 ;CHECK: vaddl.s16
    165 	%tmp1 = load <4 x i16>* %A
    166 	%tmp2 = load <4 x i16>* %B
    167 	%tmp3 = sext <4 x i16> %tmp1 to <4 x i32>
    168 	%tmp4 = sext <4 x i16> %tmp2 to <4 x i32>
    169 	%tmp5 = add <4 x i32> %tmp3, %tmp4
    170 	ret <4 x i32> %tmp5
    171 }
    172 
    173 define <2 x i64> @vaddls32(<2 x i32>* %A, <2 x i32>* %B) nounwind {
    174 ;CHECK-LABEL: vaddls32:
    175 ;CHECK: vaddl.s32
    176 	%tmp1 = load <2 x i32>* %A
    177 	%tmp2 = load <2 x i32>* %B
    178 	%tmp3 = sext <2 x i32> %tmp1 to <2 x i64>
    179 	%tmp4 = sext <2 x i32> %tmp2 to <2 x i64>
    180 	%tmp5 = add <2 x i64> %tmp3, %tmp4
    181 	ret <2 x i64> %tmp5
    182 }
    183 
    184 define <8 x i16> @vaddlu8(<8 x i8>* %A, <8 x i8>* %B) nounwind {
    185 ;CHECK-LABEL: vaddlu8:
    186 ;CHECK: vaddl.u8
    187 	%tmp1 = load <8 x i8>* %A
    188 	%tmp2 = load <8 x i8>* %B
    189 	%tmp3 = zext <8 x i8> %tmp1 to <8 x i16>
    190 	%tmp4 = zext <8 x i8> %tmp2 to <8 x i16>
    191 	%tmp5 = add <8 x i16> %tmp3, %tmp4
    192 	ret <8 x i16> %tmp5
    193 }
    194 
    195 define <4 x i32> @vaddlu16(<4 x i16>* %A, <4 x i16>* %B) nounwind {
    196 ;CHECK-LABEL: vaddlu16:
    197 ;CHECK: vaddl.u16
    198 	%tmp1 = load <4 x i16>* %A
    199 	%tmp2 = load <4 x i16>* %B
    200 	%tmp3 = zext <4 x i16> %tmp1 to <4 x i32>
    201 	%tmp4 = zext <4 x i16> %tmp2 to <4 x i32>
    202 	%tmp5 = add <4 x i32> %tmp3, %tmp4
    203 	ret <4 x i32> %tmp5
    204 }
    205 
    206 define <2 x i64> @vaddlu32(<2 x i32>* %A, <2 x i32>* %B) nounwind {
    207 ;CHECK-LABEL: vaddlu32:
    208 ;CHECK: vaddl.u32
    209 	%tmp1 = load <2 x i32>* %A
    210 	%tmp2 = load <2 x i32>* %B
    211 	%tmp3 = zext <2 x i32> %tmp1 to <2 x i64>
    212 	%tmp4 = zext <2 x i32> %tmp2 to <2 x i64>
    213 	%tmp5 = add <2 x i64> %tmp3, %tmp4
    214 	ret <2 x i64> %tmp5
    215 }
    216 
    217 define <8 x i16> @vaddws8(<8 x i16>* %A, <8 x i8>* %B) nounwind {
    218 ;CHECK-LABEL: vaddws8:
    219 ;CHECK: vaddw.s8
    220 	%tmp1 = load <8 x i16>* %A
    221 	%tmp2 = load <8 x i8>* %B
    222 	%tmp3 = sext <8 x i8> %tmp2 to <8 x i16>
    223 	%tmp4 = add <8 x i16> %tmp1, %tmp3
    224 	ret <8 x i16> %tmp4
    225 }
    226 
    227 define <4 x i32> @vaddws16(<4 x i32>* %A, <4 x i16>* %B) nounwind {
    228 ;CHECK-LABEL: vaddws16:
    229 ;CHECK: vaddw.s16
    230 	%tmp1 = load <4 x i32>* %A
    231 	%tmp2 = load <4 x i16>* %B
    232 	%tmp3 = sext <4 x i16> %tmp2 to <4 x i32>
    233 	%tmp4 = add <4 x i32> %tmp1, %tmp3
    234 	ret <4 x i32> %tmp4
    235 }
    236 
    237 define <2 x i64> @vaddws32(<2 x i64>* %A, <2 x i32>* %B) nounwind {
    238 ;CHECK-LABEL: vaddws32:
    239 ;CHECK: vaddw.s32
    240 	%tmp1 = load <2 x i64>* %A
    241 	%tmp2 = load <2 x i32>* %B
    242 	%tmp3 = sext <2 x i32> %tmp2 to <2 x i64>
    243 	%tmp4 = add <2 x i64> %tmp1, %tmp3
    244 	ret <2 x i64> %tmp4
    245 }
    246 
    247 define <8 x i16> @vaddwu8(<8 x i16>* %A, <8 x i8>* %B) nounwind {
    248 ;CHECK-LABEL: vaddwu8:
    249 ;CHECK: vaddw.u8
    250 	%tmp1 = load <8 x i16>* %A
    251 	%tmp2 = load <8 x i8>* %B
    252 	%tmp3 = zext <8 x i8> %tmp2 to <8 x i16>
    253 	%tmp4 = add <8 x i16> %tmp1, %tmp3
    254 	ret <8 x i16> %tmp4
    255 }
    256 
    257 define <4 x i32> @vaddwu16(<4 x i32>* %A, <4 x i16>* %B) nounwind {
    258 ;CHECK-LABEL: vaddwu16:
    259 ;CHECK: vaddw.u16
    260 	%tmp1 = load <4 x i32>* %A
    261 	%tmp2 = load <4 x i16>* %B
    262 	%tmp3 = zext <4 x i16> %tmp2 to <4 x i32>
    263 	%tmp4 = add <4 x i32> %tmp1, %tmp3
    264 	ret <4 x i32> %tmp4
    265 }
    266 
    267 define <2 x i64> @vaddwu32(<2 x i64>* %A, <2 x i32>* %B) nounwind {
    268 ;CHECK-LABEL: vaddwu32:
    269 ;CHECK: vaddw.u32
    270 	%tmp1 = load <2 x i64>* %A
    271 	%tmp2 = load <2 x i32>* %B
    272 	%tmp3 = zext <2 x i32> %tmp2 to <2 x i64>
    273 	%tmp4 = add <2 x i64> %tmp1, %tmp3
    274 	ret <2 x i64> %tmp4
    275 }
    276