393 lines · plain
1; RUN: llc < %s -mtriple armeb-eabi -mattr v7,neon -float-abi soft -o - | FileCheck %s2; RUN: llc < %s -mtriple armeb-eabi -mattr v7,neon -float-abi hard -o - | FileCheck %s -check-prefix CHECK-HARD3 4@v2i64 = global <2 x i64> zeroinitializer5@v2i32 = global <2 x i32> zeroinitializer6@v4i32 = global <4 x i32> zeroinitializer7@v4i16 = global <4 x i16> zeroinitializer8@v8i16 = global <8 x i16> zeroinitializer9@v8i8 = global <8 x i8> zeroinitializer10@v16i8 = global <16 x i8> zeroinitializer11 12@v2f32 = global <2 x float> zeroinitializer13@v2f64 = global <2 x double> zeroinitializer14@v4f32 = global <4 x float> zeroinitializer15 16 17; 64 bit conversions18define void @conv_i64_to_v8i8( i64 %val, ptr %store ) {19; CHECK-LABEL: conv_i64_to_v8i8:20; CHECK: vrev64.821 %v = bitcast i64 %val to <8 x i8>22 %w = load <8 x i8>, ptr @v8i823 %a = add <8 x i8> %v, %w24 store <8 x i8> %a, ptr %store25 ret void26}27 28define void @conv_v8i8_to_i64( ptr %load, ptr %store ) {29; CHECK-LABEL: conv_v8i8_to_i64:30; CHECK: vrev64.831 %v = load <8 x i8>, ptr %load32 %w = load <8 x i8>, ptr @v8i833 %a = add <8 x i8> %v, %w34 %f = bitcast <8 x i8> %a to i6435 call void @conv_i64_to_v8i8( i64 %f, ptr %store )36 ret void37}38 39define void @conv_i64_to_v4i16( i64 %val, ptr %store ) {40; CHECK-LABEL: conv_i64_to_v4i16:41; CHECK: vrev64.1642 %v = bitcast i64 %val to <4 x i16>43 %w = load <4 x i16>, ptr @v4i1644 %a = add <4 x i16> %v, %w45 store <4 x i16> %a, ptr %store46 ret void47}48 49define void @conv_v4i16_to_i64( ptr %load, ptr %store ) {50; CHECK-LABEL: conv_v4i16_to_i64:51; CHECK: vrev64.1652 %v = load <4 x i16>, ptr %load53 %w = load <4 x i16>, ptr @v4i1654 %a = add <4 x i16> %v, %w55 %f = bitcast <4 x i16> %a to i6456 call void @conv_i64_to_v4i16( i64 %f, ptr %store )57 ret void58}59 60define void @conv_i64_to_v2i32( i64 %val, ptr %store ) {61; CHECK-LABEL: conv_i64_to_v2i32:62; CHECK: vrev64.3263 %v = bitcast i64 %val to <2 x i32>64 %w = load <2 x i32>, ptr @v2i3265 %a = add <2 x i32> %v, %w66 store <2 x i32> %a, ptr %store67 ret void68}69 70define void @conv_v2i32_to_i64( ptr %load, ptr %store ) {71; CHECK-LABEL: conv_v2i32_to_i64:72; CHECK: vrev64.3273 %v = load <2 x i32>, ptr %load74 %w = load <2 x i32>, ptr @v2i3275 %a = add <2 x i32> %v, %w76 %f = bitcast <2 x i32> %a to i6477 call void @conv_i64_to_v2i32( i64 %f, ptr %store )78 ret void79}80 81define void @conv_i64_to_v2f32( i64 %val, ptr %store ) {82; CHECK-LABEL: conv_i64_to_v2f32:83; CHECK: vrev64.3284 %v = bitcast i64 %val to <2 x float>85 %w = load <2 x float>, ptr @v2f3286 %a = fadd <2 x float> %v, %w87 store <2 x float> %a, ptr %store88 ret void89}90 91define void @conv_v2f32_to_i64( ptr %load, ptr %store ) {92; CHECK-LABEL: conv_v2f32_to_i64:93; CHECK: vrev64.3294 %v = load <2 x float>, ptr %load95 %w = load <2 x float>, ptr @v2f3296 %a = fadd <2 x float> %v, %w97 %f = bitcast <2 x float> %a to i6498 call void @conv_i64_to_v2f32( i64 %f, ptr %store )99 ret void100}101 102define void @conv_f64_to_v8i8( double %val, ptr %store ) {103; CHECK-LABEL: conv_f64_to_v8i8:104; CHECK: vrev64.8105 %v = bitcast double %val to <8 x i8>106 %w = load <8 x i8>, ptr @v8i8107 %a = add <8 x i8> %v, %w108 store <8 x i8> %a, ptr %store109 ret void110}111 112define void @conv_v8i8_to_f64( ptr %load, ptr %store ) {113; CHECK-LABEL: conv_v8i8_to_f64:114; CHECK: vrev64.8115 %v = load <8 x i8>, ptr %load116 %w = load <8 x i8>, ptr @v8i8117 %a = add <8 x i8> %v, %w118 %f = bitcast <8 x i8> %a to double119 call void @conv_f64_to_v8i8( double %f, ptr %store )120 ret void121}122 123define void @conv_f64_to_v4i16( double %val, ptr %store ) {124; CHECK-LABEL: conv_f64_to_v4i16:125; CHECK: vrev64.16126 %v = bitcast double %val to <4 x i16>127 %w = load <4 x i16>, ptr @v4i16128 %a = add <4 x i16> %v, %w129 store <4 x i16> %a, ptr %store130 ret void131}132 133define void @conv_v4i16_to_f64( ptr %load, ptr %store ) {134; CHECK-LABEL: conv_v4i16_to_f64:135; CHECK: vrev64.16136 %v = load <4 x i16>, ptr %load137 %w = load <4 x i16>, ptr @v4i16138 %a = add <4 x i16> %v, %w139 %f = bitcast <4 x i16> %a to double140 call void @conv_f64_to_v4i16( double %f, ptr %store )141 ret void142}143 144define void @conv_f64_to_v2i32( double %val, ptr %store ) {145; CHECK-LABEL: conv_f64_to_v2i32:146; CHECK: vrev64.32147 %v = bitcast double %val to <2 x i32>148 %w = load <2 x i32>, ptr @v2i32149 %a = add <2 x i32> %v, %w150 store <2 x i32> %a, ptr %store151 ret void152}153 154define void @conv_v2i32_to_f64( ptr %load, ptr %store ) {155; CHECK-LABEL: conv_v2i32_to_f64:156; CHECK: vrev64.32157 %v = load <2 x i32>, ptr %load158 %w = load <2 x i32>, ptr @v2i32159 %a = add <2 x i32> %v, %w160 %f = bitcast <2 x i32> %a to double161 call void @conv_f64_to_v2i32( double %f, ptr %store )162 ret void163}164 165define void @conv_f64_to_v2f32( double %val, ptr %store ) {166; CHECK-LABEL: conv_f64_to_v2f32:167; CHECK: vrev64.32168 %v = bitcast double %val to <2 x float>169 %w = load <2 x float>, ptr @v2f32170 %a = fadd <2 x float> %v, %w171 store <2 x float> %a, ptr %store172 ret void173}174 175define void @conv_v2f32_to_f64( ptr %load, ptr %store ) {176; CHECK-LABEL: conv_v2f32_to_f64:177; CHECK: vrev64.32178 %v = load <2 x float>, ptr %load179 %w = load <2 x float>, ptr @v2f32180 %a = fadd <2 x float> %v, %w181 %f = bitcast <2 x float> %a to double182 call void @conv_f64_to_v2f32( double %f, ptr %store )183 ret void184}185 186; 128 bit conversions187 188 189define void @conv_i128_to_v16i8( i128 %val, ptr %store ) {190; CHECK-LABEL: conv_i128_to_v16i8:191; CHECK: vrev32.8192 %v = bitcast i128 %val to <16 x i8>193 %w = load <16 x i8>, ptr @v16i8194 %a = add <16 x i8> %v, %w195 store <16 x i8> %a, ptr %store196 ret void197}198 199define void @conv_v16i8_to_i128( ptr %load, ptr %store ) {200; CHECK-LABEL: conv_v16i8_to_i128:201; CHECK: vrev32.8202 %v = load <16 x i8>, ptr %load203 %w = load <16 x i8>, ptr @v16i8204 %a = add <16 x i8> %v, %w205 %f = bitcast <16 x i8> %a to i128206 call void @conv_i128_to_v16i8( i128 %f, ptr %store )207 ret void208}209 210define void @conv_i128_to_v8i16( i128 %val, ptr %store ) {211; CHECK-LABEL: conv_i128_to_v8i16:212; CHECK: vrev32.16213 %v = bitcast i128 %val to <8 x i16>214 %w = load <8 x i16>, ptr @v8i16215 %a = add <8 x i16> %v, %w216 store <8 x i16> %a, ptr %store217 ret void218}219 220define void @conv_v8i16_to_i128( ptr %load, ptr %store ) {221; CHECK-LABEL: conv_v8i16_to_i128:222; CHECK: vrev32.16223 %v = load <8 x i16>, ptr %load224 %w = load <8 x i16>, ptr @v8i16225 %a = add <8 x i16> %v, %w226 %f = bitcast <8 x i16> %a to i128227 call void @conv_i128_to_v8i16( i128 %f, ptr %store )228 ret void229}230 231define void @conv_i128_to_v4i32( i128 %val, ptr %store ) {232; CHECK-LABEL: conv_i128_to_v4i32:233; CHECK: vrev64.32234 %v = bitcast i128 %val to <4 x i32>235 %w = load <4 x i32>, ptr @v4i32236 %a = add <4 x i32> %v, %w237 store <4 x i32> %a, ptr %store238 ret void239}240 241define void @conv_v4i32_to_i128( ptr %load, ptr %store ) {242; CHECK-LABEL: conv_v4i32_to_i128:243; CHECK: vrev64.32244 %v = load <4 x i32>, ptr %load245 %w = load <4 x i32>, ptr @v4i32246 %a = add <4 x i32> %v, %w247 %f = bitcast <4 x i32> %a to i128248 call void @conv_i128_to_v4i32( i128 %f, ptr %store )249 ret void250}251 252define void @conv_i128_to_v4f32( i128 %val, ptr %store ) {253; CHECK-LABEL: conv_i128_to_v4f32:254; CHECK: vrev64.32255 %v = bitcast i128 %val to <4 x float>256 %w = load <4 x float>, ptr @v4f32257 %a = fadd <4 x float> %v, %w258 store <4 x float> %a, ptr %store259 ret void260}261 262define void @conv_v4f32_to_i128( ptr %load, ptr %store ) {263; CHECK-LABEL: conv_v4f32_to_i128:264; CHECK: vrev64.32265 %v = load <4 x float>, ptr %load266 %w = load <4 x float>, ptr @v4f32267 %a = fadd <4 x float> %v, %w268 %f = bitcast <4 x float> %a to i128269 call void @conv_i128_to_v4f32( i128 %f, ptr %store )270 ret void271}272 273define void @conv_f128_to_v2f64( fp128 %val, ptr %store ) {274; CHECK-LABEL: conv_f128_to_v2f64:275; CHECK: vrev64.32276 %v = bitcast fp128 %val to <2 x double>277 %w = load <2 x double>, ptr @v2f64278 %a = fadd <2 x double> %v, %w279 store <2 x double> %a, ptr %store280 ret void281}282 283define void @conv_v2f64_to_f128( ptr %load, ptr %store ) {284; CHECK-LABEL: conv_v2f64_to_f128:285; CHECK: vrev64.32286 %v = load <2 x double>, ptr %load287 %w = load <2 x double>, ptr @v2f64288 %a = fadd <2 x double> %v, %w289 %f = bitcast <2 x double> %a to fp128290 call void @conv_f128_to_v2f64( fp128 %f, ptr %store )291 ret void292}293 294define void @conv_f128_to_v16i8( fp128 %val, ptr %store ) {295; CHECK-LABEL: conv_f128_to_v16i8:296; CHECK: vrev32.8297 %v = bitcast fp128 %val to <16 x i8>298 %w = load <16 x i8>, ptr @v16i8299 %a = add <16 x i8> %v, %w300 store <16 x i8> %a, ptr %store301 ret void302}303 304define void @conv_v16i8_to_f128( ptr %load, ptr %store ) {305; CHECK-LABEL: conv_v16i8_to_f128:306; CHECK: vrev32.8307 %v = load <16 x i8>, ptr %load308 %w = load <16 x i8>, ptr @v16i8309 %a = add <16 x i8> %v, %w310 %f = bitcast <16 x i8> %a to fp128311 call void @conv_f128_to_v16i8( fp128 %f, ptr %store )312 ret void313}314 315define void @conv_f128_to_v8i16( fp128 %val, ptr %store ) {316; CHECK-LABEL: conv_f128_to_v8i16:317; CHECK: vrev32.16318 %v = bitcast fp128 %val to <8 x i16>319 %w = load <8 x i16>, ptr @v8i16320 %a = add <8 x i16> %v, %w321 store <8 x i16> %a, ptr %store322 ret void323}324 325define void @conv_v8i16_to_f128( ptr %load, ptr %store ) {326; CHECK-LABEL: conv_v8i16_to_f128:327; CHECK: vrev32.16328 %v = load <8 x i16>, ptr %load329 %w = load <8 x i16>, ptr @v8i16330 %a = add <8 x i16> %v, %w331 %f = bitcast <8 x i16> %a to fp128332 call void @conv_f128_to_v8i16( fp128 %f, ptr %store )333 ret void334}335 336define void @conv_f128_to_v4f32( fp128 %val, ptr %store ) {337; CHECK-LABEL: conv_f128_to_v4f32:338; CHECK: vrev64.32339 %v = bitcast fp128 %val to <4 x float>340 %w = load <4 x float>, ptr @v4f32341 %a = fadd <4 x float> %v, %w342 store <4 x float> %a, ptr %store343 ret void344}345 346define void @conv_v4f32_to_f128( ptr %load, ptr %store ) {347; CHECK-LABEL: conv_v4f32_to_f128:348; CHECK: vrev64.32349 %v = load <4 x float>, ptr %load350 %w = load <4 x float>, ptr @v4f32351 %a = fadd <4 x float> %v, %w352 %f = bitcast <4 x float> %a to fp128353 call void @conv_f128_to_v4f32( fp128 %f, ptr %store )354 ret void355}356 357define void @arg_v4i32( <4 x i32> %var, ptr %store ) {358; CHECK-LABEL: arg_v4i32:359; CHECK: vmov [[REG2:d[0-9]+]], r3, r2360; CHECK: vmov [[REG1:d[0-9]+]], r1, r0361; CHECK: vst1.64 {[[REG1]], [[REG2]]},362; CHECK-HARD-LABEL: arg_v4i32:363; CHECK-HARD-NOT: vmov364; CHECK-HARD: vst1.64 {d0, d1}365 store <4 x i32> %var, ptr %store366 ret void367}368 369define void @arg_v8i16( <8 x i16> %var, ptr %store ) {370; CHECK-LABEL: arg_v8i16:371; CHECK: vmov [[REG2:d[0-9]+]], r3, r2372; CHECK: vmov [[REG1:d[0-9]+]], r1, r0373; CHECK: vst1.64 {[[REG1]], [[REG2]]},374; CHECK-HARD-LABEL: arg_v8i16:375; CHECK-HARD-NOT: vmov376; CHECK-HARD: vst1.64 {d0, d1}377 store <8 x i16> %var, ptr %store378 ret void379}380 381define void @arg_v16i8( <16 x i8> %var, ptr %store ) {382; CHECK-LABEL: arg_v16i8:383; CHECK: vmov [[REG2:d[0-9]+]], r3, r2384; CHECK: vmov [[REG1:d[0-9]+]], r1, r0385; CHECK: vst1.64 {[[REG1]], [[REG2]]},386; CHECK-HARD-LABEL: arg_v16i8:387; CHECK-HARD-NOT: vmov388; CHECK-HARD: vst1.64 {d0, d1}389 store <16 x i8> %var, ptr %store390 ret void391}392 393