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> @vabas8(<8 x i8>* %A, <8 x i8>* %B, <8 x i8>* %C) nounwind {
      4 ;CHECK-LABEL: vabas8:
      5 ;CHECK: vaba.s8
      6 	%tmp1 = load <8 x i8>, <8 x i8>* %A
      7 	%tmp2 = load <8 x i8>, <8 x i8>* %B
      8 	%tmp3 = load <8 x i8>, <8 x i8>* %C
      9 	%tmp4 = call <8 x i8> @llvm.arm.neon.vabds.v8i8(<8 x i8> %tmp2, <8 x i8> %tmp3)
     10 	%tmp5 = add <8 x i8> %tmp1, %tmp4
     11 	ret <8 x i8> %tmp5
     12 }
     13 
     14 define <4 x i16> @vabas16(<4 x i16>* %A, <4 x i16>* %B, <4 x i16>* %C) nounwind {
     15 ;CHECK-LABEL: vabas16:
     16 ;CHECK: vaba.s16
     17 	%tmp1 = load <4 x i16>, <4 x i16>* %A
     18 	%tmp2 = load <4 x i16>, <4 x i16>* %B
     19 	%tmp3 = load <4 x i16>, <4 x i16>* %C
     20 	%tmp4 = call <4 x i16> @llvm.arm.neon.vabds.v4i16(<4 x i16> %tmp2, <4 x i16> %tmp3)
     21 	%tmp5 = add <4 x i16> %tmp1, %tmp4
     22 	ret <4 x i16> %tmp5
     23 }
     24 
     25 define <2 x i32> @vabas32(<2 x i32>* %A, <2 x i32>* %B, <2 x i32>* %C) nounwind {
     26 ;CHECK-LABEL: vabas32:
     27 ;CHECK: vaba.s32
     28 	%tmp1 = load <2 x i32>, <2 x i32>* %A
     29 	%tmp2 = load <2 x i32>, <2 x i32>* %B
     30 	%tmp3 = load <2 x i32>, <2 x i32>* %C
     31 	%tmp4 = call <2 x i32> @llvm.arm.neon.vabds.v2i32(<2 x i32> %tmp2, <2 x i32> %tmp3)
     32 	%tmp5 = add <2 x i32> %tmp1, %tmp4
     33 	ret <2 x i32> %tmp5
     34 }
     35 
     36 define <8 x i8> @vabau8(<8 x i8>* %A, <8 x i8>* %B, <8 x i8>* %C) nounwind {
     37 ;CHECK-LABEL: vabau8:
     38 ;CHECK: vaba.u8
     39 	%tmp1 = load <8 x i8>, <8 x i8>* %A
     40 	%tmp2 = load <8 x i8>, <8 x i8>* %B
     41 	%tmp3 = load <8 x i8>, <8 x i8>* %C
     42 	%tmp4 = call <8 x i8> @llvm.arm.neon.vabdu.v8i8(<8 x i8> %tmp2, <8 x i8> %tmp3)
     43 	%tmp5 = add <8 x i8> %tmp1, %tmp4
     44 	ret <8 x i8> %tmp5
     45 }
     46 
     47 define <4 x i16> @vabau16(<4 x i16>* %A, <4 x i16>* %B, <4 x i16>* %C) nounwind {
     48 ;CHECK-LABEL: vabau16:
     49 ;CHECK: vaba.u16
     50 	%tmp1 = load <4 x i16>, <4 x i16>* %A
     51 	%tmp2 = load <4 x i16>, <4 x i16>* %B
     52 	%tmp3 = load <4 x i16>, <4 x i16>* %C
     53 	%tmp4 = call <4 x i16> @llvm.arm.neon.vabdu.v4i16(<4 x i16> %tmp2, <4 x i16> %tmp3)
     54 	%tmp5 = add <4 x i16> %tmp1, %tmp4
     55 	ret <4 x i16> %tmp5
     56 }
     57 
     58 define <2 x i32> @vabau32(<2 x i32>* %A, <2 x i32>* %B, <2 x i32>* %C) nounwind {
     59 ;CHECK-LABEL: vabau32:
     60 ;CHECK: vaba.u32
     61 	%tmp1 = load <2 x i32>, <2 x i32>* %A
     62 	%tmp2 = load <2 x i32>, <2 x i32>* %B
     63 	%tmp3 = load <2 x i32>, <2 x i32>* %C
     64 	%tmp4 = call <2 x i32> @llvm.arm.neon.vabdu.v2i32(<2 x i32> %tmp2, <2 x i32> %tmp3)
     65 	%tmp5 = add <2 x i32> %tmp1, %tmp4
     66 	ret <2 x i32> %tmp5
     67 }
     68 
     69 define <16 x i8> @vabaQs8(<16 x i8>* %A, <16 x i8>* %B, <16 x i8>* %C) nounwind {
     70 ;CHECK-LABEL: vabaQs8:
     71 ;CHECK: vaba.s8
     72 	%tmp1 = load <16 x i8>, <16 x i8>* %A
     73 	%tmp2 = load <16 x i8>, <16 x i8>* %B
     74 	%tmp3 = load <16 x i8>, <16 x i8>* %C
     75 	%tmp4 = call <16 x i8> @llvm.arm.neon.vabds.v16i8(<16 x i8> %tmp2, <16 x i8> %tmp3)
     76 	%tmp5 = add <16 x i8> %tmp1, %tmp4
     77 	ret <16 x i8> %tmp5
     78 }
     79 
     80 define <8 x i16> @vabaQs16(<8 x i16>* %A, <8 x i16>* %B, <8 x i16>* %C) nounwind {
     81 ;CHECK-LABEL: vabaQs16:
     82 ;CHECK: vaba.s16
     83 	%tmp1 = load <8 x i16>, <8 x i16>* %A
     84 	%tmp2 = load <8 x i16>, <8 x i16>* %B
     85 	%tmp3 = load <8 x i16>, <8 x i16>* %C
     86 	%tmp4 = call <8 x i16> @llvm.arm.neon.vabds.v8i16(<8 x i16> %tmp2, <8 x i16> %tmp3)
     87 	%tmp5 = add <8 x i16> %tmp1, %tmp4
     88 	ret <8 x i16> %tmp5
     89 }
     90 
     91 define <4 x i32> @vabaQs32(<4 x i32>* %A, <4 x i32>* %B, <4 x i32>* %C) nounwind {
     92 ;CHECK-LABEL: vabaQs32:
     93 ;CHECK: vaba.s32
     94 	%tmp1 = load <4 x i32>, <4 x i32>* %A
     95 	%tmp2 = load <4 x i32>, <4 x i32>* %B
     96 	%tmp3 = load <4 x i32>, <4 x i32>* %C
     97 	%tmp4 = call <4 x i32> @llvm.arm.neon.vabds.v4i32(<4 x i32> %tmp2, <4 x i32> %tmp3)
     98 	%tmp5 = add <4 x i32> %tmp1, %tmp4
     99 	ret <4 x i32> %tmp5
    100 }
    101 
    102 define <16 x i8> @vabaQu8(<16 x i8>* %A, <16 x i8>* %B, <16 x i8>* %C) nounwind {
    103 ;CHECK-LABEL: vabaQu8:
    104 ;CHECK: vaba.u8
    105 	%tmp1 = load <16 x i8>, <16 x i8>* %A
    106 	%tmp2 = load <16 x i8>, <16 x i8>* %B
    107 	%tmp3 = load <16 x i8>, <16 x i8>* %C
    108 	%tmp4 = call <16 x i8> @llvm.arm.neon.vabdu.v16i8(<16 x i8> %tmp2, <16 x i8> %tmp3)
    109 	%tmp5 = add <16 x i8> %tmp1, %tmp4
    110 	ret <16 x i8> %tmp5
    111 }
    112 
    113 define <8 x i16> @vabaQu16(<8 x i16>* %A, <8 x i16>* %B, <8 x i16>* %C) nounwind {
    114 ;CHECK-LABEL: vabaQu16:
    115 ;CHECK: vaba.u16
    116 	%tmp1 = load <8 x i16>, <8 x i16>* %A
    117 	%tmp2 = load <8 x i16>, <8 x i16>* %B
    118 	%tmp3 = load <8 x i16>, <8 x i16>* %C
    119 	%tmp4 = call <8 x i16> @llvm.arm.neon.vabdu.v8i16(<8 x i16> %tmp2, <8 x i16> %tmp3)
    120 	%tmp5 = add <8 x i16> %tmp1, %tmp4
    121 	ret <8 x i16> %tmp5
    122 }
    123 
    124 define <4 x i32> @vabaQu32(<4 x i32>* %A, <4 x i32>* %B, <4 x i32>* %C) nounwind {
    125 ;CHECK-LABEL: vabaQu32:
    126 ;CHECK: vaba.u32
    127 	%tmp1 = load <4 x i32>, <4 x i32>* %A
    128 	%tmp2 = load <4 x i32>, <4 x i32>* %B
    129 	%tmp3 = load <4 x i32>, <4 x i32>* %C
    130 	%tmp4 = call <4 x i32> @llvm.arm.neon.vabdu.v4i32(<4 x i32> %tmp2, <4 x i32> %tmp3)
    131 	%tmp5 = add <4 x i32> %tmp1, %tmp4
    132 	ret <4 x i32> %tmp5
    133 }
    134 
    135 declare <8 x i8>  @llvm.arm.neon.vabds.v8i8(<8 x i8>, <8 x i8>) nounwind readnone
    136 declare <4 x i16> @llvm.arm.neon.vabds.v4i16(<4 x i16>, <4 x i16>) nounwind readnone
    137 declare <2 x i32> @llvm.arm.neon.vabds.v2i32(<2 x i32>, <2 x i32>) nounwind readnone
    138 
    139 declare <8 x i8>  @llvm.arm.neon.vabdu.v8i8(<8 x i8>, <8 x i8>) nounwind readnone
    140 declare <4 x i16> @llvm.arm.neon.vabdu.v4i16(<4 x i16>, <4 x i16>) nounwind readnone
    141 declare <2 x i32> @llvm.arm.neon.vabdu.v2i32(<2 x i32>, <2 x i32>) nounwind readnone
    142 
    143 declare <16 x i8> @llvm.arm.neon.vabds.v16i8(<16 x i8>, <16 x i8>) nounwind readnone
    144 declare <8 x i16> @llvm.arm.neon.vabds.v8i16(<8 x i16>, <8 x i16>) nounwind readnone
    145 declare <4 x i32> @llvm.arm.neon.vabds.v4i32(<4 x i32>, <4 x i32>) nounwind readnone
    146 
    147 declare <16 x i8> @llvm.arm.neon.vabdu.v16i8(<16 x i8>, <16 x i8>) nounwind readnone
    148 declare <8 x i16> @llvm.arm.neon.vabdu.v8i16(<8 x i16>, <8 x i16>) nounwind readnone
    149 declare <4 x i32> @llvm.arm.neon.vabdu.v4i32(<4 x i32>, <4 x i32>) nounwind readnone
    150 
    151 define <8 x i16> @vabals8(<8 x i16>* %A, <8 x i8>* %B, <8 x i8>* %C) nounwind {
    152 ;CHECK-LABEL: vabals8:
    153 ;CHECK: vabal.s8
    154 	%tmp1 = load <8 x i16>, <8 x i16>* %A
    155 	%tmp2 = load <8 x i8>, <8 x i8>* %B
    156 	%tmp3 = load <8 x i8>, <8 x i8>* %C
    157 	%tmp4 = call <8 x i8> @llvm.arm.neon.vabds.v8i8(<8 x i8> %tmp2, <8 x i8> %tmp3)
    158 	%tmp5 = zext <8 x i8> %tmp4 to <8 x i16>
    159 	%tmp6 = add <8 x i16> %tmp1, %tmp5
    160 	ret <8 x i16> %tmp6
    161 }
    162 
    163 define <4 x i32> @vabals16(<4 x i32>* %A, <4 x i16>* %B, <4 x i16>* %C) nounwind {
    164 ;CHECK-LABEL: vabals16:
    165 ;CHECK: vabal.s16
    166 	%tmp1 = load <4 x i32>, <4 x i32>* %A
    167 	%tmp2 = load <4 x i16>, <4 x i16>* %B
    168 	%tmp3 = load <4 x i16>, <4 x i16>* %C
    169 	%tmp4 = call <4 x i16> @llvm.arm.neon.vabds.v4i16(<4 x i16> %tmp2, <4 x i16> %tmp3)
    170 	%tmp5 = zext <4 x i16> %tmp4 to <4 x i32>
    171 	%tmp6 = add <4 x i32> %tmp1, %tmp5
    172 	ret <4 x i32> %tmp6
    173 }
    174 
    175 define <2 x i64> @vabals32(<2 x i64>* %A, <2 x i32>* %B, <2 x i32>* %C) nounwind {
    176 ;CHECK-LABEL: vabals32:
    177 ;CHECK: vabal.s32
    178 	%tmp1 = load <2 x i64>, <2 x i64>* %A
    179 	%tmp2 = load <2 x i32>, <2 x i32>* %B
    180 	%tmp3 = load <2 x i32>, <2 x i32>* %C
    181 	%tmp4 = call <2 x i32> @llvm.arm.neon.vabds.v2i32(<2 x i32> %tmp2, <2 x i32> %tmp3)
    182 	%tmp5 = zext <2 x i32> %tmp4 to <2 x i64>
    183 	%tmp6 = add <2 x i64> %tmp1, %tmp5
    184 	ret <2 x i64> %tmp6
    185 }
    186 
    187 define <8 x i16> @vabalu8(<8 x i16>* %A, <8 x i8>* %B, <8 x i8>* %C) nounwind {
    188 ;CHECK-LABEL: vabalu8:
    189 ;CHECK: vabal.u8
    190 	%tmp1 = load <8 x i16>, <8 x i16>* %A
    191 	%tmp2 = load <8 x i8>, <8 x i8>* %B
    192 	%tmp3 = load <8 x i8>, <8 x i8>* %C
    193 	%tmp4 = call <8 x i8> @llvm.arm.neon.vabdu.v8i8(<8 x i8> %tmp2, <8 x i8> %tmp3)
    194 	%tmp5 = zext <8 x i8> %tmp4 to <8 x i16>
    195 	%tmp6 = add <8 x i16> %tmp1, %tmp5
    196 	ret <8 x i16> %tmp6
    197 }
    198 
    199 define <4 x i32> @vabalu16(<4 x i32>* %A, <4 x i16>* %B, <4 x i16>* %C) nounwind {
    200 ;CHECK-LABEL: vabalu16:
    201 ;CHECK: vabal.u16
    202 	%tmp1 = load <4 x i32>, <4 x i32>* %A
    203 	%tmp2 = load <4 x i16>, <4 x i16>* %B
    204 	%tmp3 = load <4 x i16>, <4 x i16>* %C
    205 	%tmp4 = call <4 x i16> @llvm.arm.neon.vabdu.v4i16(<4 x i16> %tmp2, <4 x i16> %tmp3)
    206 	%tmp5 = zext <4 x i16> %tmp4 to <4 x i32>
    207 	%tmp6 = add <4 x i32> %tmp1, %tmp5
    208 	ret <4 x i32> %tmp6
    209 }
    210 
    211 define <2 x i64> @vabalu32(<2 x i64>* %A, <2 x i32>* %B, <2 x i32>* %C) nounwind {
    212 ;CHECK-LABEL: vabalu32:
    213 ;CHECK: vabal.u32
    214 	%tmp1 = load <2 x i64>, <2 x i64>* %A
    215 	%tmp2 = load <2 x i32>, <2 x i32>* %B
    216 	%tmp3 = load <2 x i32>, <2 x i32>* %C
    217 	%tmp4 = call <2 x i32> @llvm.arm.neon.vabdu.v2i32(<2 x i32> %tmp2, <2 x i32> %tmp3)
    218 	%tmp5 = zext <2 x i32> %tmp4 to <2 x i64>
    219 	%tmp6 = add <2 x i64> %tmp1, %tmp5
    220 	ret <2 x i64> %tmp6
    221 }
    222