Home | History | Annotate | Download | only in ARM
      1 ; RUN: llc < %s -march=arm -mattr=+neon | FileCheck %s
      2 
      3 define <8 x i8> @vaddi8(<8 x i8>* %A, <8 x i8>* %B) nounwind {
      4 ;CHECK: 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: 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: 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: 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: 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: 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: 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: 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: 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: 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> @vaddhni16(<8 x i16>* %A, <8 x i16>* %B) nounwind {
     94 ;CHECK: vaddhni16:
     95 ;CHECK: vaddhn.i16
     96 	%tmp1 = load <8 x i16>* %A
     97 	%tmp2 = load <8 x i16>* %B
     98 	%tmp3 = call <8 x i8> @llvm.arm.neon.vaddhn.v8i8(<8 x i16> %tmp1, <8 x i16> %tmp2)
     99 	ret <8 x i8> %tmp3
    100 }
    101 
    102 define <4 x i16> @vaddhni32(<4 x i32>* %A, <4 x i32>* %B) nounwind {
    103 ;CHECK: vaddhni32:
    104 ;CHECK: vaddhn.i32
    105 	%tmp1 = load <4 x i32>* %A
    106 	%tmp2 = load <4 x i32>* %B
    107 	%tmp3 = call <4 x i16> @llvm.arm.neon.vaddhn.v4i16(<4 x i32> %tmp1, <4 x i32> %tmp2)
    108 	ret <4 x i16> %tmp3
    109 }
    110 
    111 define <2 x i32> @vaddhni64(<2 x i64>* %A, <2 x i64>* %B) nounwind {
    112 ;CHECK: vaddhni64:
    113 ;CHECK: vaddhn.i64
    114 	%tmp1 = load <2 x i64>* %A
    115 	%tmp2 = load <2 x i64>* %B
    116 	%tmp3 = call <2 x i32> @llvm.arm.neon.vaddhn.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.vaddhn.v8i8(<8 x i16>, <8 x i16>) nounwind readnone
    121 declare <4 x i16> @llvm.arm.neon.vaddhn.v4i16(<4 x i32>, <4 x i32>) nounwind readnone
    122 declare <2 x i32> @llvm.arm.neon.vaddhn.v2i32(<2 x i64>, <2 x i64>) nounwind readnone
    123 
    124 define <8 x i8> @vraddhni16(<8 x i16>* %A, <8 x i16>* %B) nounwind {
    125 ;CHECK: vraddhni16:
    126 ;CHECK: vraddhn.i16
    127 	%tmp1 = load <8 x i16>* %A
    128 	%tmp2 = load <8 x i16>* %B
    129 	%tmp3 = call <8 x i8> @llvm.arm.neon.vraddhn.v8i8(<8 x i16> %tmp1, <8 x i16> %tmp2)
    130 	ret <8 x i8> %tmp3
    131 }
    132 
    133 define <4 x i16> @vraddhni32(<4 x i32>* %A, <4 x i32>* %B) nounwind {
    134 ;CHECK: vraddhni32:
    135 ;CHECK: vraddhn.i32
    136 	%tmp1 = load <4 x i32>* %A
    137 	%tmp2 = load <4 x i32>* %B
    138 	%tmp3 = call <4 x i16> @llvm.arm.neon.vraddhn.v4i16(<4 x i32> %tmp1, <4 x i32> %tmp2)
    139 	ret <4 x i16> %tmp3
    140 }
    141 
    142 define <2 x i32> @vraddhni64(<2 x i64>* %A, <2 x i64>* %B) nounwind {
    143 ;CHECK: vraddhni64:
    144 ;CHECK: vraddhn.i64
    145 	%tmp1 = load <2 x i64>* %A
    146 	%tmp2 = load <2 x i64>* %B
    147 	%tmp3 = call <2 x i32> @llvm.arm.neon.vraddhn.v2i32(<2 x i64> %tmp1, <2 x i64> %tmp2)
    148 	ret <2 x i32> %tmp3
    149 }
    150 
    151 declare <8 x i8>  @llvm.arm.neon.vraddhn.v8i8(<8 x i16>, <8 x i16>) nounwind readnone
    152 declare <4 x i16> @llvm.arm.neon.vraddhn.v4i16(<4 x i32>, <4 x i32>) nounwind readnone
    153 declare <2 x i32> @llvm.arm.neon.vraddhn.v2i32(<2 x i64>, <2 x i64>) nounwind readnone
    154 
    155 define <8 x i16> @vaddls8(<8 x i8>* %A, <8 x i8>* %B) nounwind {
    156 ;CHECK: vaddls8:
    157 ;CHECK: vaddl.s8
    158 	%tmp1 = load <8 x i8>* %A
    159 	%tmp2 = load <8 x i8>* %B
    160 	%tmp3 = sext <8 x i8> %tmp1 to <8 x i16>
    161 	%tmp4 = sext <8 x i8> %tmp2 to <8 x i16>
    162 	%tmp5 = add <8 x i16> %tmp3, %tmp4
    163 	ret <8 x i16> %tmp5
    164 }
    165 
    166 define <4 x i32> @vaddls16(<4 x i16>* %A, <4 x i16>* %B) nounwind {
    167 ;CHECK: vaddls16:
    168 ;CHECK: vaddl.s16
    169 	%tmp1 = load <4 x i16>* %A
    170 	%tmp2 = load <4 x i16>* %B
    171 	%tmp3 = sext <4 x i16> %tmp1 to <4 x i32>
    172 	%tmp4 = sext <4 x i16> %tmp2 to <4 x i32>
    173 	%tmp5 = add <4 x i32> %tmp3, %tmp4
    174 	ret <4 x i32> %tmp5
    175 }
    176 
    177 define <2 x i64> @vaddls32(<2 x i32>* %A, <2 x i32>* %B) nounwind {
    178 ;CHECK: vaddls32:
    179 ;CHECK: vaddl.s32
    180 	%tmp1 = load <2 x i32>* %A
    181 	%tmp2 = load <2 x i32>* %B
    182 	%tmp3 = sext <2 x i32> %tmp1 to <2 x i64>
    183 	%tmp4 = sext <2 x i32> %tmp2 to <2 x i64>
    184 	%tmp5 = add <2 x i64> %tmp3, %tmp4
    185 	ret <2 x i64> %tmp5
    186 }
    187 
    188 define <8 x i16> @vaddlu8(<8 x i8>* %A, <8 x i8>* %B) nounwind {
    189 ;CHECK: vaddlu8:
    190 ;CHECK: vaddl.u8
    191 	%tmp1 = load <8 x i8>* %A
    192 	%tmp2 = load <8 x i8>* %B
    193 	%tmp3 = zext <8 x i8> %tmp1 to <8 x i16>
    194 	%tmp4 = zext <8 x i8> %tmp2 to <8 x i16>
    195 	%tmp5 = add <8 x i16> %tmp3, %tmp4
    196 	ret <8 x i16> %tmp5
    197 }
    198 
    199 define <4 x i32> @vaddlu16(<4 x i16>* %A, <4 x i16>* %B) nounwind {
    200 ;CHECK: vaddlu16:
    201 ;CHECK: vaddl.u16
    202 	%tmp1 = load <4 x i16>* %A
    203 	%tmp2 = load <4 x i16>* %B
    204 	%tmp3 = zext <4 x i16> %tmp1 to <4 x i32>
    205 	%tmp4 = zext <4 x i16> %tmp2 to <4 x i32>
    206 	%tmp5 = add <4 x i32> %tmp3, %tmp4
    207 	ret <4 x i32> %tmp5
    208 }
    209 
    210 define <2 x i64> @vaddlu32(<2 x i32>* %A, <2 x i32>* %B) nounwind {
    211 ;CHECK: vaddlu32:
    212 ;CHECK: vaddl.u32
    213 	%tmp1 = load <2 x i32>* %A
    214 	%tmp2 = load <2 x i32>* %B
    215 	%tmp3 = zext <2 x i32> %tmp1 to <2 x i64>
    216 	%tmp4 = zext <2 x i32> %tmp2 to <2 x i64>
    217 	%tmp5 = add <2 x i64> %tmp3, %tmp4
    218 	ret <2 x i64> %tmp5
    219 }
    220 
    221 define <8 x i16> @vaddws8(<8 x i16>* %A, <8 x i8>* %B) nounwind {
    222 ;CHECK: vaddws8:
    223 ;CHECK: vaddw.s8
    224 	%tmp1 = load <8 x i16>* %A
    225 	%tmp2 = load <8 x i8>* %B
    226 	%tmp3 = sext <8 x i8> %tmp2 to <8 x i16>
    227 	%tmp4 = add <8 x i16> %tmp1, %tmp3
    228 	ret <8 x i16> %tmp4
    229 }
    230 
    231 define <4 x i32> @vaddws16(<4 x i32>* %A, <4 x i16>* %B) nounwind {
    232 ;CHECK: vaddws16:
    233 ;CHECK: vaddw.s16
    234 	%tmp1 = load <4 x i32>* %A
    235 	%tmp2 = load <4 x i16>* %B
    236 	%tmp3 = sext <4 x i16> %tmp2 to <4 x i32>
    237 	%tmp4 = add <4 x i32> %tmp1, %tmp3
    238 	ret <4 x i32> %tmp4
    239 }
    240 
    241 define <2 x i64> @vaddws32(<2 x i64>* %A, <2 x i32>* %B) nounwind {
    242 ;CHECK: vaddws32:
    243 ;CHECK: vaddw.s32
    244 	%tmp1 = load <2 x i64>* %A
    245 	%tmp2 = load <2 x i32>* %B
    246 	%tmp3 = sext <2 x i32> %tmp2 to <2 x i64>
    247 	%tmp4 = add <2 x i64> %tmp1, %tmp3
    248 	ret <2 x i64> %tmp4
    249 }
    250 
    251 define <8 x i16> @vaddwu8(<8 x i16>* %A, <8 x i8>* %B) nounwind {
    252 ;CHECK: vaddwu8:
    253 ;CHECK: vaddw.u8
    254 	%tmp1 = load <8 x i16>* %A
    255 	%tmp2 = load <8 x i8>* %B
    256 	%tmp3 = zext <8 x i8> %tmp2 to <8 x i16>
    257 	%tmp4 = add <8 x i16> %tmp1, %tmp3
    258 	ret <8 x i16> %tmp4
    259 }
    260 
    261 define <4 x i32> @vaddwu16(<4 x i32>* %A, <4 x i16>* %B) nounwind {
    262 ;CHECK: vaddwu16:
    263 ;CHECK: vaddw.u16
    264 	%tmp1 = load <4 x i32>* %A
    265 	%tmp2 = load <4 x i16>* %B
    266 	%tmp3 = zext <4 x i16> %tmp2 to <4 x i32>
    267 	%tmp4 = add <4 x i32> %tmp1, %tmp3
    268 	ret <4 x i32> %tmp4
    269 }
    270 
    271 define <2 x i64> @vaddwu32(<2 x i64>* %A, <2 x i32>* %B) nounwind {
    272 ;CHECK: vaddwu32:
    273 ;CHECK: vaddw.u32
    274 	%tmp1 = load <2 x i64>* %A
    275 	%tmp2 = load <2 x i32>* %B
    276 	%tmp3 = zext <2 x i32> %tmp2 to <2 x i64>
    277 	%tmp4 = add <2 x i64> %tmp1, %tmp3
    278 	ret <2 x i64> %tmp4
    279 }
    280