1323 lines · plain
1; RUN: llc -mtriple aarch64_be < %s -aarch64-enable-ldst-opt=false -O1 -o - | FileCheck %s2; RUN: llc -mtriple aarch64_be < %s -aarch64-enable-ldst-opt=false -O0 -fast-isel=true -o - | FileCheck %s3 4; CHECK-LABEL: test_i64_f64:5define void @test_i64_f64(ptr %p, ptr %q) {6; CHECK: ldr7; CHECK: str8 %1 = load double, ptr %p9 %2 = fadd double %1, %110 %3 = bitcast double %2 to i6411 %4 = add i64 %3, %312 store i64 %4, ptr %q13 ret void14}15 16; CHECK-LABEL: test_i64_v1i64:17define void @test_i64_v1i64(ptr %p, ptr %q) {18; CHECK: ldr19; CHECK: str20 %1 = load <1 x i64>, ptr %p21 %2 = add <1 x i64> %1, %122 %3 = bitcast <1 x i64> %2 to i6423 %4 = add i64 %3, %324 store i64 %4, ptr %q25 ret void26}27 28; CHECK-LABEL: test_i64_v2f32:29define void @test_i64_v2f32(ptr %p, ptr %q) {30; CHECK: ld1 { v{{[0-9]+}}.2s }31; CHECK: rev64 v{{[0-9]+}}.2s32; CHECK: str33 %1 = load <2 x float>, ptr %p34 %2 = fadd <2 x float> %1, %135 %3 = bitcast <2 x float> %2 to i6436 %4 = add i64 %3, %337 store i64 %4, ptr %q38 ret void39}40 41; CHECK-LABEL: test_i64_v2i32:42define void @test_i64_v2i32(ptr %p, ptr %q) {43; CHECK: ld1 { v{{[0-9]+}}.2s }44; CHECK: rev64 v{{[0-9]+}}.2s45; CHECK: str46 %1 = load <2 x i32>, ptr %p47 %2 = add <2 x i32> %1, %148 %3 = bitcast <2 x i32> %2 to i6449 %4 = add i64 %3, %350 store i64 %4, ptr %q51 ret void52}53 54; CHECK-LABEL: test_i64_v4f16:55define void @test_i64_v4f16(ptr %p, ptr %q) {56; CHECK: ld1 { v{{[0-9]+}}.4h }57; CHECK-NOT: rev58; CHECK: fadd59; CHECK: rev64 v{{[0-9]+}}.4h60; CHECK: str61 %1 = load <4 x half>, ptr %p62 %2 = fadd <4 x half> %1, %163 %3 = bitcast <4 x half> %2 to i6464 %4 = add i64 %3, %365 store i64 %4, ptr %q66 ret void67}68 69; CHECK-LABEL: test_i64_v4i16:70define void @test_i64_v4i16(ptr %p, ptr %q) {71; CHECK: ld1 { v{{[0-9]+}}.4h }72; CHECK: rev64 v{{[0-9]+}}.4h73; CHECK: str74 %1 = load <4 x i16>, ptr %p75 %2 = add <4 x i16> %1, %176 %3 = bitcast <4 x i16> %2 to i6477 %4 = add i64 %3, %378 store i64 %4, ptr %q79 ret void80}81 82; CHECK-LABEL: test_i64_v8i8:83define void @test_i64_v8i8(ptr %p, ptr %q) {84; CHECK: ld1 { v{{[0-9]+}}.8b }85; CHECK: rev64 v{{[0-9]+}}.8b86; CHECK: str87 %1 = load <8 x i8>, ptr %p88 %2 = add <8 x i8> %1, %189 %3 = bitcast <8 x i8> %2 to i6490 %4 = add i64 %3, %391 store i64 %4, ptr %q92 ret void93}94 95; CHECK-LABEL: test_f64_i64:96define void @test_f64_i64(ptr %p, ptr %q) {97; CHECK: ldr98; CHECK: str99 %1 = load i64, ptr %p100 %2 = add i64 %1, %1101 %3 = bitcast i64 %2 to double102 %4 = fadd double %3, %3103 store double %4, ptr %q104 ret void105}106 107; CHECK-LABEL: test_f64_v1i64:108define void @test_f64_v1i64(ptr %p, ptr %q) {109; CHECK: ldr110; CHECK: str111 %1 = load <1 x i64>, ptr %p112 %2 = add <1 x i64> %1, %1113 %3 = bitcast <1 x i64> %2 to double114 %4 = fadd double %3, %3115 store double %4, ptr %q116 ret void117}118 119; CHECK-LABEL: test_f64_v2f32:120define void @test_f64_v2f32(ptr %p, ptr %q) {121; CHECK: ld1 { v{{[0-9]+}}.2s }122; CHECK: rev64 v{{[0-9]+}}.2s123; CHECK: str124 %1 = load <2 x float>, ptr %p125 %2 = fadd <2 x float> %1, %1126 %3 = bitcast <2 x float> %2 to double127 %4 = fadd double %3, %3128 store double %4, ptr %q129 ret void130}131 132; CHECK-LABEL: test_f64_v2i32:133define void @test_f64_v2i32(ptr %p, ptr %q) {134; CHECK: ld1 { v{{[0-9]+}}.2s }135; CHECK: rev64 v{{[0-9]+}}.2s136; CHECK: str137 %1 = load <2 x i32>, ptr %p138 %2 = add <2 x i32> %1, %1139 %3 = bitcast <2 x i32> %2 to double140 %4 = fadd double %3, %3141 store double %4, ptr %q142 ret void143}144 145; CHECK-LABEL: test_f64_v4i16:146define void @test_f64_v4i16(ptr %p, ptr %q) {147; CHECK: ld1 { v{{[0-9]+}}.4h }148; CHECK: rev64 v{{[0-9]+}}.4h149; CHECK: str150 %1 = load <4 x i16>, ptr %p151 %2 = add <4 x i16> %1, %1152 %3 = bitcast <4 x i16> %2 to double153 %4 = fadd double %3, %3154 store double %4, ptr %q155 ret void156}157 158; CHECK-LABEL: test_f64_v4f16:159define void @test_f64_v4f16(ptr %p, ptr %q) {160; CHECK: ld1 { v{{[0-9]+}}.4h }161; CHECK-NOT: rev162; CHECK: fadd163; CHECK: rev64 v{{[0-9]+}}.4h164; CHECK: fadd165; CHECK: str166 %1 = load <4 x half>, ptr %p167 %2 = fadd <4 x half> %1, %1168 %3 = bitcast <4 x half> %2 to double169 %4 = fadd double %3, %3170 store double %4, ptr %q171 ret void172}173 174; CHECK-LABEL: test_f64_v8i8:175define void @test_f64_v8i8(ptr %p, ptr %q) {176; CHECK: ld1 { v{{[0-9]+}}.8b }177; CHECK: rev64 v{{[0-9]+}}.8b178; CHECK: str179 %1 = load <8 x i8>, ptr %p180 %2 = add <8 x i8> %1, %1181 %3 = bitcast <8 x i8> %2 to double182 %4 = fadd double %3, %3183 store double %4, ptr %q184 ret void185}186 187; CHECK-LABEL: test_v1i64_i64:188define void @test_v1i64_i64(ptr %p, ptr %q) {189; CHECK: ldr190; CHECK: str191 %1 = load i64, ptr %p192 %2 = add i64 %1, %1193 %3 = bitcast i64 %2 to <1 x i64>194 %4 = add <1 x i64> %3, %3195 store <1 x i64> %4, ptr %q196 ret void197}198 199; CHECK-LABEL: test_v1i64_f64:200define void @test_v1i64_f64(ptr %p, ptr %q) {201; CHECK: ldr202; CHECK: str203 %1 = load double, ptr %p204 %2 = fadd double %1, %1205 %3 = bitcast double %2 to <1 x i64>206 %4 = add <1 x i64> %3, %3207 store <1 x i64> %4, ptr %q208 ret void209}210 211; CHECK-LABEL: test_v1i64_v2f32:212define void @test_v1i64_v2f32(ptr %p, ptr %q) {213; CHECK: ld1 { v{{[0-9]+}}.2s }214; CHECK: rev64 v{{[0-9]+}}.2s215; CHECK: str216 %1 = load <2 x float>, ptr %p217 %2 = fadd <2 x float> %1, %1218 %3 = bitcast <2 x float> %2 to <1 x i64>219 %4 = add <1 x i64> %3, %3220 store <1 x i64> %4, ptr %q221 ret void222}223 224; CHECK-LABEL: test_v1i64_v2i32:225define void @test_v1i64_v2i32(ptr %p, ptr %q) {226; CHECK: ld1 { v{{[0-9]+}}.2s }227; CHECK: rev64 v{{[0-9]+}}.2s228; CHECK: str229 %1 = load <2 x i32>, ptr %p230 %2 = add <2 x i32> %1, %1231 %3 = bitcast <2 x i32> %2 to <1 x i64>232 %4 = add <1 x i64> %3, %3233 store <1 x i64> %4, ptr %q234 ret void235}236 237; CHECK-LABEL: test_v1i64_v4f16:238define void @test_v1i64_v4f16(ptr %p, ptr %q) {239; CHECK: ld1 { v{{[0-9]+}}.4h }240; CHECK-NOT: rev241; CHECK: fadd242; CHECK: rev64 v{{[0-9]+}}.4h243; CHECK: str244 %1 = load <4 x half>, ptr %p245 %2 = fadd <4 x half> %1, %1246 %3 = bitcast <4 x half> %2 to <1 x i64>247 %4 = add <1 x i64> %3, %3248 store <1 x i64> %4, ptr %q249 ret void250}251 252; CHECK-LABEL: test_v1i64_v4i16:253define void @test_v1i64_v4i16(ptr %p, ptr %q) {254; CHECK: ld1 { v{{[0-9]+}}.4h }255; CHECK: rev64 v{{[0-9]+}}.4h256; CHECK: str257 %1 = load <4 x i16>, ptr %p258 %2 = add <4 x i16> %1, %1259 %3 = bitcast <4 x i16> %2 to <1 x i64>260 %4 = add <1 x i64> %3, %3261 store <1 x i64> %4, ptr %q262 ret void263}264 265; CHECK-LABEL: test_v1i64_v8i8:266define void @test_v1i64_v8i8(ptr %p, ptr %q) {267; CHECK: ld1 { v{{[0-9]+}}.8b }268; CHECK: rev64 v{{[0-9]+}}.8b269; CHECK: str270 %1 = load <8 x i8>, ptr %p271 %2 = add <8 x i8> %1, %1272 %3 = bitcast <8 x i8> %2 to <1 x i64>273 %4 = add <1 x i64> %3, %3274 store <1 x i64> %4, ptr %q275 ret void276}277 278; CHECK-LABEL: test_v2f32_i64:279define void @test_v2f32_i64(ptr %p, ptr %q) {280; CHECK: ldr281; CHECK: rev64 v{{[0-9]+}}.2s282; CHECK: st1 { v{{[0-9]+}}.2s }283 %1 = load i64, ptr %p284 %2 = add i64 %1, %1285 %3 = bitcast i64 %2 to <2 x float>286 %4 = fadd <2 x float> %3, %3287 store <2 x float> %4, ptr %q288 ret void289}290 291; CHECK-LABEL: test_v2f32_f64:292define void @test_v2f32_f64(ptr %p, ptr %q) {293; CHECK: ldr294; CHECK: rev64 v{{[0-9]+}}.2s295; CHECK: st1 { v{{[0-9]+}}.2s }296 %1 = load double, ptr %p297 %2 = fadd double %1, %1298 %3 = bitcast double %2 to <2 x float>299 %4 = fadd <2 x float> %3, %3300 store <2 x float> %4, ptr %q301 ret void302}303 304; CHECK-LABEL: test_v2f32_v1i64:305define void @test_v2f32_v1i64(ptr %p, ptr %q) {306; CHECK: ldr307; CHECK: rev64 v{{[0-9]+}}.2s308; CHECK: st1 { v{{[0-9]+}}.2s }309 %1 = load <1 x i64>, ptr %p310 %2 = add <1 x i64> %1, %1311 %3 = bitcast <1 x i64> %2 to <2 x float>312 %4 = fadd <2 x float> %3, %3313 store <2 x float> %4, ptr %q314 ret void315}316 317; CHECK-LABEL: test_v2f32_v2i32:318define void @test_v2f32_v2i32(ptr %p, ptr %q) {319; CHECK: ld1 { v{{[0-9]+}}.2s }320; CHECK: st1 { v{{[0-9]+}}.2s }321 %1 = load <2 x i32>, ptr %p322 %2 = add <2 x i32> %1, %1323 %3 = bitcast <2 x i32> %2 to <2 x float>324 %4 = fadd <2 x float> %3, %3325 store <2 x float> %4, ptr %q326 ret void327}328 329; CHECK-LABEL: test_v2f32_v4i16:330define void @test_v2f32_v4i16(ptr %p, ptr %q) {331; CHECK: ld1 { v{{[0-9]+}}.4h }332; CHECK: rev32 v{{[0-9]+}}.4h333; CHECK: st1 { v{{[0-9]+}}.2s }334 %1 = load <4 x i16>, ptr %p335 %2 = add <4 x i16> %1, %1336 %3 = bitcast <4 x i16> %2 to <2 x float>337 %4 = fadd <2 x float> %3, %3338 store <2 x float> %4, ptr %q339 ret void340}341 342; CHECK-LABEL: test_v2f32_v4f16:343define void @test_v2f32_v4f16(ptr %p, ptr %q) {344; CHECK: ld1 { v{{[0-9]+}}.4h }345; CHECK-NOT: rev346; CHECK: fadd347; CHECK: rev32 v{{[0-9]+}}.4h348; CHECK: st1 { v{{[0-9]+}}.2s }349 %1 = load <4 x half>, ptr %p350 %2 = fadd <4 x half> %1, %1351 %3 = bitcast <4 x half> %2 to <2 x float>352 %4 = fadd <2 x float> %3, %3353 store <2 x float> %4, ptr %q354 ret void355}356 357; CHECK-LABEL: test_v2f32_v8i8:358define void @test_v2f32_v8i8(ptr %p, ptr %q) {359; CHECK: ld1 { v{{[0-9]+}}.8b }360; CHECK: rev32 v{{[0-9]+}}.8b361; CHECK: st1 { v{{[0-9]+}}.2s }362 %1 = load <8 x i8>, ptr %p363 %2 = add <8 x i8> %1, %1364 %3 = bitcast <8 x i8> %2 to <2 x float>365 %4 = fadd <2 x float> %3, %3366 store <2 x float> %4, ptr %q367 ret void368}369 370; CHECK-LABEL: test_v2i32_i64:371define void @test_v2i32_i64(ptr %p, ptr %q) {372; CHECK: ldr373; CHECK: rev64 v{{[0-9]+}}.2s374; CHECK: st1 { v{{[0-9]+}}.2s }375 %1 = load i64, ptr %p376 %2 = add i64 %1, %1377 %3 = bitcast i64 %2 to <2 x i32>378 %4 = add <2 x i32> %3, %3379 store <2 x i32> %4, ptr %q380 ret void381}382 383; CHECK-LABEL: test_v2i32_f64:384define void @test_v2i32_f64(ptr %p, ptr %q) {385; CHECK: ldr386; CHECK: rev64 v{{[0-9]+}}.2s387; CHECK: st1 { v{{[0-9]+}}.2s }388 %1 = load double, ptr %p389 %2 = fadd double %1, %1390 %3 = bitcast double %2 to <2 x i32>391 %4 = add <2 x i32> %3, %3392 store <2 x i32> %4, ptr %q393 ret void394}395 396; CHECK-LABEL: test_v2i32_v1i64:397define void @test_v2i32_v1i64(ptr %p, ptr %q) {398; CHECK: ldr399; CHECK: rev64 v{{[0-9]+}}.2s400; CHECK: st1 { v{{[0-9]+}}.2s }401 %1 = load <1 x i64>, ptr %p402 %2 = add <1 x i64> %1, %1403 %3 = bitcast <1 x i64> %2 to <2 x i32>404 %4 = add <2 x i32> %3, %3405 store <2 x i32> %4, ptr %q406 ret void407}408 409; CHECK-LABEL: test_v2i32_v2f32:410define void @test_v2i32_v2f32(ptr %p, ptr %q) {411; CHECK: ld1 { v{{[0-9]+}}.2s }412; CHECK: st1 { v{{[0-9]+}}.2s }413 %1 = load <2 x float>, ptr %p414 %2 = fadd <2 x float> %1, %1415 %3 = bitcast <2 x float> %2 to <2 x i32>416 %4 = add <2 x i32> %3, %3417 store <2 x i32> %4, ptr %q418 ret void419}420 421; CHECK-LABEL: test_v2i32_v4i16:422define void @test_v2i32_v4i16(ptr %p, ptr %q) {423; CHECK: ld1 { v{{[0-9]+}}.4h }424; CHECK: rev32 v{{[0-9]+}}.4h425; CHECK: st1 { v{{[0-9]+}}.2s }426 %1 = load <4 x i16>, ptr %p427 %2 = add <4 x i16> %1, %1428 %3 = bitcast <4 x i16> %2 to <2 x i32>429 %4 = add <2 x i32> %3, %3430 store <2 x i32> %4, ptr %q431 ret void432}433 434; CHECK-LABEL: test_v2i32_v8i8:435define void @test_v2i32_v8i8(ptr %p, ptr %q) {436; CHECK: ld1 { v{{[0-9]+}}.8b }437; CHECK: rev32 v{{[0-9]+}}.8b438; CHECK: st1 { v{{[0-9]+}}.2s }439 %1 = load <8 x i8>, ptr %p440 %2 = add <8 x i8> %1, %1441 %3 = bitcast <8 x i8> %2 to <2 x i32>442 %4 = add <2 x i32> %3, %3443 store <2 x i32> %4, ptr %q444 ret void445}446 447; CHECK-LABEL: test_v4i16_i64:448define void @test_v4i16_i64(ptr %p, ptr %q) {449; CHECK: ldr450; CHECK: rev64 v{{[0-9]+}}.4h451; CHECK: st1 { v{{[0-9]+}}.4h }452 %1 = load i64, ptr %p453 %2 = add i64 %1, %1454 %3 = bitcast i64 %2 to <4 x i16>455 %4 = add <4 x i16> %3, %3456 store <4 x i16> %4, ptr %q457 ret void458}459 460; CHECK-LABEL: test_v4i16_f64:461define void @test_v4i16_f64(ptr %p, ptr %q) {462; CHECK: ldr463; CHECK: rev64 v{{[0-9]+}}.4h464; CHECK: st1 { v{{[0-9]+}}.4h }465 %1 = load double, ptr %p466 %2 = fadd double %1, %1467 %3 = bitcast double %2 to <4 x i16>468 %4 = add <4 x i16> %3, %3469 store <4 x i16> %4, ptr %q470 ret void471}472 473; CHECK-LABEL: test_v4i16_v1i64:474define void @test_v4i16_v1i64(ptr %p, ptr %q) {475; CHECK: ldr476; CHECK: rev64 v{{[0-9]+}}.4h477; CHECK: st1 { v{{[0-9]+}}.4h }478 %1 = load <1 x i64>, ptr %p479 %2 = add <1 x i64> %1, %1480 %3 = bitcast <1 x i64> %2 to <4 x i16>481 %4 = add <4 x i16> %3, %3482 store <4 x i16> %4, ptr %q483 ret void484}485 486; CHECK-LABEL: test_v4i16_v2f32:487define void @test_v4i16_v2f32(ptr %p, ptr %q) {488; CHECK: ld1 { v{{[0-9]+}}.2s }489; CHECK: rev32 v{{[0-9]+}}.4h490; CHECK: st1 { v{{[0-9]+}}.4h }491 %1 = load <2 x float>, ptr %p492 %2 = fadd <2 x float> %1, %1493 %3 = bitcast <2 x float> %2 to <4 x i16>494 %4 = add <4 x i16> %3, %3495 store <4 x i16> %4, ptr %q496 ret void497}498 499; CHECK-LABEL: test_v4i16_v2i32:500define void @test_v4i16_v2i32(ptr %p, ptr %q) {501; CHECK: ld1 { v{{[0-9]+}}.2s }502; CHECK: rev32 v{{[0-9]+}}.4h503; CHECK: st1 { v{{[0-9]+}}.4h }504 %1 = load <2 x i32>, ptr %p505 %2 = add <2 x i32> %1, %1506 %3 = bitcast <2 x i32> %2 to <4 x i16>507 %4 = add <4 x i16> %3, %3508 store <4 x i16> %4, ptr %q509 ret void510}511 512; CHECK-LABEL: test_v4i16_v4f16:513define void @test_v4i16_v4f16(ptr %p, ptr %q) {514; CHECK: ld1 { v{{[0-9]+}}.4h }515; CHECK-NOT: rev516; CHECK: st1 { v{{[0-9]+}}.4h }517 %1 = load <4 x half>, ptr %p518 %2 = fadd <4 x half> %1, %1519 %3 = bitcast <4 x half> %2 to <4 x i16>520 %4 = add <4 x i16> %3, %3521 store <4 x i16> %4, ptr %q522 ret void523}524 525; CHECK-LABEL: test_v4i16_v8i8:526define void @test_v4i16_v8i8(ptr %p, ptr %q) {527; CHECK: ld1 { v{{[0-9]+}}.8b }528; CHECK: rev16 v{{[0-9]+}}.8b529; CHECK: st1 { v{{[0-9]+}}.4h }530 %1 = load <8 x i8>, ptr %p531 %2 = add <8 x i8> %1, %1532 %3 = bitcast <8 x i8> %2 to <4 x i16>533 %4 = add <4 x i16> %3, %3534 store <4 x i16> %4, ptr %q535 ret void536}537 538; CHECK-LABEL: test_v4f16_i64:539define void @test_v4f16_i64(ptr %p, ptr %q) {540; CHECK: ldr541; CHECK: rev64 v{{[0-9]+}}.4h542; CHECK: fadd543; CHECK-NOT: rev544; CHECK: st1 { v{{[0-9]+}}.4h }545 %1 = load i64, ptr %p546 %2 = add i64 %1, %1547 %3 = bitcast i64 %2 to <4 x half>548 %4 = fadd <4 x half> %3, %3549 store <4 x half> %4, ptr %q550 ret void551}552 553; CHECK-LABEL: test_v4f16_f64:554define void @test_v4f16_f64(ptr %p, ptr %q) {555; CHECK: ldr556; CHECK: rev64 v{{[0-9]+}}.4h557; CHECK: fadd558; CHECK-NOT: rev559; CHECK: st1 { v{{[0-9]+}}.4h }560 %1 = load double, ptr %p561 %2 = fadd double %1, %1562 %3 = bitcast double %2 to <4 x half>563 %4 = fadd <4 x half> %3, %3564 store <4 x half> %4, ptr %q565 ret void566}567 568; CHECK-LABEL: test_v4f16_v1i64:569define void @test_v4f16_v1i64(ptr %p, ptr %q) {570; CHECK: ldr571; CHECK: rev64 v{{[0-9]+}}.4h572; CHECK: fadd573; CHECK-NOT: rev574; CHECK: st1 { v{{[0-9]+}}.4h }575 %1 = load <1 x i64>, ptr %p576 %2 = add <1 x i64> %1, %1577 %3 = bitcast <1 x i64> %2 to <4 x half>578 %4 = fadd <4 x half> %3, %3579 store <4 x half> %4, ptr %q580 ret void581}582 583; CHECK-LABEL: test_v4f16_v2f32:584define void @test_v4f16_v2f32(ptr %p, ptr %q) {585; CHECK: ld1 { v{{[0-9]+}}.2s }586; CHECK: rev32 v{{[0-9]+}}.4h587; CHECK: fadd588; CHECK-NOT: rev589; CHECK: st1 { v{{[0-9]+}}.4h }590 %1 = load <2 x float>, ptr %p591 %2 = fadd <2 x float> %1, %1592 %3 = bitcast <2 x float> %2 to <4 x half>593 %4 = fadd <4 x half> %3, %3594 store <4 x half> %4, ptr %q595 ret void596}597 598; CHECK-LABEL: test_v4f16_v2i32:599define void @test_v4f16_v2i32(ptr %p, ptr %q) {600; CHECK: ld1 { v{{[0-9]+}}.2s }601; CHECK: rev32 v{{[0-9]+}}.4h602; CHECK: fadd603; CHECK-NOT: rev604; CHECK: st1 { v{{[0-9]+}}.4h }605 %1 = load <2 x i32>, ptr %p606 %2 = add <2 x i32> %1, %1607 %3 = bitcast <2 x i32> %2 to <4 x half>608 %4 = fadd <4 x half> %3, %3609 store <4 x half> %4, ptr %q610 ret void611}612 613; CHECK-LABEL: test_v4f16_v4i16:614define void @test_v4f16_v4i16(ptr %p, ptr %q) {615; CHECK: ld1 { v{{[0-9]+}}.4h }616; CHECK-NOT: rev617; CHECK: st1 { v{{[0-9]+}}.4h }618 %1 = load <4 x i16>, ptr %p619 %2 = add <4 x i16> %1, %1620 %3 = bitcast <4 x i16> %2 to <4 x half>621 %4 = fadd <4 x half> %3, %3622 store <4 x half> %4, ptr %q623 ret void624}625 626; CHECK-LABEL: test_v4f16_v8i8:627define void @test_v4f16_v8i8(ptr %p, ptr %q) {628; CHECK: ld1 { v{{[0-9]+}}.8b }629; CHECK: rev16 v{{[0-9]+}}.8b630; CHECK: fadd631; CHECK-NOT: rev632; CHECK: st1 { v{{[0-9]+}}.4h }633 %1 = load <8 x i8>, ptr %p634 %2 = add <8 x i8> %1, %1635 %3 = bitcast <8 x i8> %2 to <4 x half>636 %4 = fadd <4 x half> %3, %3637 store <4 x half> %4, ptr %q638 ret void639}640 641; CHECK-LABEL: test_v8i8_i64:642define void @test_v8i8_i64(ptr %p, ptr %q) {643; CHECK: ldr644; CHECK: rev64 v{{[0-9]+}}.8b645; CHECK: st1 { v{{[0-9]+}}.8b }646 %1 = load i64, ptr %p647 %2 = add i64 %1, %1648 %3 = bitcast i64 %2 to <8 x i8>649 %4 = add <8 x i8> %3, %3650 store <8 x i8> %4, ptr %q651 ret void652}653 654; CHECK-LABEL: test_v8i8_f64:655define void @test_v8i8_f64(ptr %p, ptr %q) {656; CHECK: ldr657; CHECK: rev64 v{{[0-9]+}}.8b658; CHECK: st1 { v{{[0-9]+}}.8b }659 %1 = load double, ptr %p660 %2 = fadd double %1, %1661 %3 = bitcast double %2 to <8 x i8>662 %4 = add <8 x i8> %3, %3663 store <8 x i8> %4, ptr %q664 ret void665}666 667; CHECK-LABEL: test_v8i8_v1i64:668define void @test_v8i8_v1i64(ptr %p, ptr %q) {669; CHECK: ldr670; CHECK: rev64 v{{[0-9]+}}.8b671; CHECK: st1 { v{{[0-9]+}}.8b }672 %1 = load <1 x i64>, ptr %p673 %2 = add <1 x i64> %1, %1674 %3 = bitcast <1 x i64> %2 to <8 x i8>675 %4 = add <8 x i8> %3, %3676 store <8 x i8> %4, ptr %q677 ret void678}679 680; CHECK-LABEL: test_v8i8_v2f32:681define void @test_v8i8_v2f32(ptr %p, ptr %q) {682; CHECK: ld1 { v{{[0-9]+}}.2s }683; CHECK: rev32 v{{[0-9]+}}.8b684; CHECK: st1 { v{{[0-9]+}}.8b }685 %1 = load <2 x float>, ptr %p686 %2 = fadd <2 x float> %1, %1687 %3 = bitcast <2 x float> %2 to <8 x i8>688 %4 = add <8 x i8> %3, %3689 store <8 x i8> %4, ptr %q690 ret void691}692 693; CHECK-LABEL: test_v8i8_v2i32:694define void @test_v8i8_v2i32(ptr %p, ptr %q) {695; CHECK: ld1 { v{{[0-9]+}}.2s }696; CHECK: rev32 v{{[0-9]+}}.8b697; CHECK: st1 { v{{[0-9]+}}.8b }698 %1 = load <2 x i32>, ptr %p699 %2 = add <2 x i32> %1, %1700 %3 = bitcast <2 x i32> %2 to <8 x i8>701 %4 = add <8 x i8> %3, %3702 store <8 x i8> %4, ptr %q703 ret void704}705 706; CHECK-LABEL: test_v8i8_v4i16:707define void @test_v8i8_v4i16(ptr %p, ptr %q) {708; CHECK: ld1 { v{{[0-9]+}}.4h }709; CHECK: rev16 v{{[0-9]+}}.8b710; CHECK: st1 { v{{[0-9]+}}.8b }711 %1 = load <4 x i16>, ptr %p712 %2 = add <4 x i16> %1, %1713 %3 = bitcast <4 x i16> %2 to <8 x i8>714 %4 = add <8 x i8> %3, %3715 store <8 x i8> %4, ptr %q716 ret void717}718 719; CHECK-LABEL: test_f128_v2f64:720define void @test_f128_v2f64(ptr %p, ptr %q) {721; CHECK: ld1 { v{{[0-9]+}}.2d }722; CHECK: ext723; CHECK: str724 %1 = load <2 x double>, ptr %p725 %2 = fadd <2 x double> %1, %1726 %3 = bitcast <2 x double> %2 to fp128727 %4 = fadd fp128 %3, %3728 store fp128 %4, ptr %q729 ret void730}731 732; CHECK-LABEL: test_f128_v2i64:733define void @test_f128_v2i64(ptr %p, ptr %q) {734; CHECK: ld1 { v{{[0-9]+}}.2d }735; CHECK: ext736; CHECK: str737 %1 = load <2 x i64>, ptr %p738 %2 = add <2 x i64> %1, %1739 %3 = bitcast <2 x i64> %2 to fp128740 %4 = fadd fp128 %3, %3741 store fp128 %4, ptr %q742 ret void743}744 745; CHECK-LABEL: test_f128_v4f32:746define void @test_f128_v4f32(ptr %p, ptr %q) {747; CHECK: ld1 { v{{[0-9]+}}.4s }748; CHECK-NOT: rev749; CHECK: fadd750; CHECK: rev64 v{{[0-9]+}}.4s751; CHECK: ext752; CHECK: str q753 %1 = load <4 x float>, ptr %p754 %2 = fadd <4 x float> %1, %1755 %3 = bitcast <4 x float> %2 to fp128756 %4 = fadd fp128 %3, %3757 store fp128 %4, ptr %q758 ret void759}760 761; CHECK-LABEL: test_f128_v4i32:762define void @test_f128_v4i32(ptr %p, ptr %q) {763; CHECK: ld1 { v{{[0-9]+}}.4s }764; CHECK: rev64 v{{[0-9]+}}.4s765; CHECK: ext766; CHECK: str767 %1 = load <4 x i32>, ptr %p768 %2 = add <4 x i32> %1, %1769 %3 = bitcast <4 x i32> %2 to fp128770 %4 = fadd fp128 %3, %3771 store fp128 %4, ptr %q772 ret void773}774 775; CHECK-LABEL: test_f128_v8i16:776define void @test_f128_v8i16(ptr %p, ptr %q) {777; CHECK: ld1 { v{{[0-9]+}}.8h }778; CHECK: rev64 v{{[0-9]+}}.8h779; CHECK: ext780; CHECK: str781 %1 = load <8 x i16>, ptr %p782 %2 = add <8 x i16> %1, %1783 %3 = bitcast <8 x i16> %2 to fp128784 %4 = fadd fp128 %3, %3785 store fp128 %4, ptr %q786 ret void787}788 789; CHECK-LABEL: test_f128_v16i8:790define void @test_f128_v16i8(ptr %p, ptr %q) {791; CHECK: ld1 { v{{[0-9]+}}.16b }792; CHECK: ext793; CHECK: str q794 %1 = load <16 x i8>, ptr %p795 %2 = add <16 x i8> %1, %1796 %3 = bitcast <16 x i8> %2 to fp128797 %4 = fadd fp128 %3, %3798 store fp128 %4, ptr %q799 ret void800}801 802; CHECK-LABEL: test_v2f64_f128:803define void @test_v2f64_f128(ptr %p, ptr %q) {804; CHECK: ldr805; CHECK: ext806; CHECK: st1 { v{{[0-9]+}}.2d }807 %1 = load fp128, ptr %p808 %2 = fadd fp128 %1, %1809 %3 = bitcast fp128 %2 to <2 x double>810 %4 = fadd <2 x double> %3, %3811 store <2 x double> %4, ptr %q812 ret void813}814 815; CHECK-LABEL: test_v2f64_v2i64:816define void @test_v2f64_v2i64(ptr %p, ptr %q) {817; CHECK: ld1 { v{{[0-9]+}}.2d }818; CHECK: st1 { v{{[0-9]+}}.2d }819 %1 = load <2 x i64>, ptr %p820 %2 = add <2 x i64> %1, %1821 %3 = bitcast <2 x i64> %2 to <2 x double>822 %4 = fadd <2 x double> %3, %3823 store <2 x double> %4, ptr %q824 ret void825}826 827; CHECK-LABEL: test_v2f64_v4f32:828define void @test_v2f64_v4f32(ptr %p, ptr %q) {829; CHECK: ld1 { v{{[0-9]+}}.4s }830; CHECK-NOT: rev831; CHECK: fadd832; CHECK: rev64 v{{[0-9]+}}.4s833; CHECK: st1 { v{{[0-9]+}}.2d }834 %1 = load <4 x float>, ptr %p835 %2 = fadd <4 x float> %1, %1836 %3 = bitcast <4 x float> %2 to <2 x double>837 %4 = fadd <2 x double> %3, %3838 store <2 x double> %4, ptr %q839 ret void840}841 842; CHECK-LABEL: test_v2f64_v4i32:843define void @test_v2f64_v4i32(ptr %p, ptr %q) {844; CHECK: ld1 { v{{[0-9]+}}.4s }845; CHECK: rev64 v{{[0-9]+}}.4s846; CHECK: st1 { v{{[0-9]+}}.2d }847 %1 = load <4 x i32>, ptr %p848 %2 = add <4 x i32> %1, %1849 %3 = bitcast <4 x i32> %2 to <2 x double>850 %4 = fadd <2 x double> %3, %3851 store <2 x double> %4, ptr %q852 ret void853}854 855; CHECK-LABEL: test_v2f64_v8i16:856define void @test_v2f64_v8i16(ptr %p, ptr %q) {857; CHECK: ld1 { v{{[0-9]+}}.8h }858; CHECK: rev64 v{{[0-9]+}}.8h859; CHECK: st1 { v{{[0-9]+}}.2d }860 %1 = load <8 x i16>, ptr %p861 %2 = add <8 x i16> %1, %1862 %3 = bitcast <8 x i16> %2 to <2 x double>863 %4 = fadd <2 x double> %3, %3864 store <2 x double> %4, ptr %q865 ret void866}867 868; CHECK-LABEL: test_v2f64_v16i8:869define void @test_v2f64_v16i8(ptr %p, ptr %q) {870; CHECK: ld1 { v{{[0-9]+}}.16b }871; CHECK: rev64 v{{[0-9]+}}.16b872; CHECK: st1 { v{{[0-9]+}}.2d }873 %1 = load <16 x i8>, ptr %p874 %2 = add <16 x i8> %1, %1875 %3 = bitcast <16 x i8> %2 to <2 x double>876 %4 = fadd <2 x double> %3, %3877 store <2 x double> %4, ptr %q878 ret void879}880 881; CHECK-LABEL: test_v2i64_f128:882define void @test_v2i64_f128(ptr %p, ptr %q) {883; CHECK: ldr884; CHECK: ext885; CHECK: st1 { v{{[0-9]+}}.2d }886 %1 = load fp128, ptr %p887 %2 = fadd fp128 %1, %1888 %3 = bitcast fp128 %2 to <2 x i64>889 %4 = add <2 x i64> %3, %3890 store <2 x i64> %4, ptr %q891 ret void892}893 894; CHECK-LABEL: test_v2i64_v2f64:895define void @test_v2i64_v2f64(ptr %p, ptr %q) {896; CHECK: ld1 { v{{[0-9]+}}.2d }897; CHECK: st1 { v{{[0-9]+}}.2d }898 %1 = load <2 x double>, ptr %p899 %2 = fadd <2 x double> %1, %1900 %3 = bitcast <2 x double> %2 to <2 x i64>901 %4 = add <2 x i64> %3, %3902 store <2 x i64> %4, ptr %q903 ret void904}905 906; CHECK-LABEL: test_v2i64_v4f32:907define void @test_v2i64_v4f32(ptr %p, ptr %q) {908; CHECK: ld1 { v{{[0-9]+}}.4s }909; CHECK-NOT: rev910; CHECK: fadd911; CHECK: rev64 v{{[0-9]+}}.4s912; CHECK: add913; CHECK: st1 { v{{[0-9]+}}.2d }914 %1 = load <4 x float>, ptr %p915 %2 = fadd <4 x float> %1, %1916 %3 = bitcast <4 x float> %2 to <2 x i64>917 %4 = add <2 x i64> %3, %3918 store <2 x i64> %4, ptr %q919 ret void920}921 922; CHECK-LABEL: test_v2i64_v4i32:923define void @test_v2i64_v4i32(ptr %p, ptr %q) {924; CHECK: ld1 { v{{[0-9]+}}.4s }925; CHECK: rev64 v{{[0-9]+}}.4s926; CHECK: st1 { v{{[0-9]+}}.2d }927 %1 = load <4 x i32>, ptr %p928 %2 = add <4 x i32> %1, %1929 %3 = bitcast <4 x i32> %2 to <2 x i64>930 %4 = add <2 x i64> %3, %3931 store <2 x i64> %4, ptr %q932 ret void933}934 935; CHECK-LABEL: test_v2i64_v8i16:936define void @test_v2i64_v8i16(ptr %p, ptr %q) {937; CHECK: ld1 { v{{[0-9]+}}.8h }938; CHECK: rev64 v{{[0-9]+}}.8h939; CHECK: st1 { v{{[0-9]+}}.2d }940 %1 = load <8 x i16>, ptr %p941 %2 = add <8 x i16> %1, %1942 %3 = bitcast <8 x i16> %2 to <2 x i64>943 %4 = add <2 x i64> %3, %3944 store <2 x i64> %4, ptr %q945 ret void946}947 948; CHECK-LABEL: test_v2i64_v16i8:949define void @test_v2i64_v16i8(ptr %p, ptr %q) {950; CHECK: ld1 { v{{[0-9]+}}.16b }951; CHECK: rev64 v{{[0-9]+}}.16b952; CHECK: st1 { v{{[0-9]+}}.2d }953 %1 = load <16 x i8>, ptr %p954 %2 = add <16 x i8> %1, %1955 %3 = bitcast <16 x i8> %2 to <2 x i64>956 %4 = add <2 x i64> %3, %3957 store <2 x i64> %4, ptr %q958 ret void959}960 961; CHECK-LABEL: test_v4f32_f128:962define void @test_v4f32_f128(ptr %p, ptr %q) {963; CHECK: ldr q964; CHECK: rev64 v{{[0-9]+}}.4s965; CHECK: ext966; CHECK-NOT: rev967; CHECK: st1 { v{{[0-9]+}}.4s }968 %1 = load fp128, ptr %p969 %2 = fadd fp128 %1, %1970 %3 = bitcast fp128 %2 to <4 x float>971 %4 = fadd <4 x float> %3, %3972 store <4 x float> %4, ptr %q973 ret void974}975 976; CHECK-LABEL: test_v4f32_v2f64:977define void @test_v4f32_v2f64(ptr %p, ptr %q) {978; CHECK: ld1 { v{{[0-9]+}}.2d }979; CHECK: rev64 v{{[0-9]+}}.4s980; CHECK-NOT: rev981; CHECK: st1 { v{{[0-9]+}}.4s }982 %1 = load <2 x double>, ptr %p983 %2 = fadd <2 x double> %1, %1984 %3 = bitcast <2 x double> %2 to <4 x float>985 %4 = fadd <4 x float> %3, %3986 store <4 x float> %4, ptr %q987 ret void988}989 990; CHECK-LABEL: test_v4f32_v2i64:991define void @test_v4f32_v2i64(ptr %p, ptr %q) {992; CHECK: ld1 { v{{[0-9]+}}.2d }993; CHECK: rev64 v{{[0-9]+}}.4s994; CHECK: fadd995; CHECK-NOT: rev996; CHECK: st1 { v{{[0-9]+}}.4s }997 %1 = load <2 x i64>, ptr %p998 %2 = add <2 x i64> %1, %1999 %3 = bitcast <2 x i64> %2 to <4 x float>1000 %4 = fadd <4 x float> %3, %31001 store <4 x float> %4, ptr %q1002 ret void1003}1004 1005; CHECK-LABEL: test_v4f32_v4i32:1006define void @test_v4f32_v4i32(ptr %p, ptr %q) {1007; CHECK: ld1 { v{{[0-9]+}}.4s }1008; CHECK-NOT: rev1009; CHECK: st1 { v{{[0-9]+}}.4s }1010 %1 = load <4 x i32>, ptr %p1011 %2 = add <4 x i32> %1, %11012 %3 = bitcast <4 x i32> %2 to <4 x float>1013 %4 = fadd <4 x float> %3, %31014 store <4 x float> %4, ptr %q1015 ret void1016}1017 1018; CHECK-LABEL: test_v4f32_v8i16:1019define void @test_v4f32_v8i16(ptr %p, ptr %q) {1020; CHECK: ld1 { v{{[0-9]+}}.8h }1021; CHECK: rev32 v{{[0-9]+}}.8h1022; CHECK-NOT: rev1023; CHECK: st1 { v{{[0-9]+}}.4s }1024 %1 = load <8 x i16>, ptr %p1025 %2 = add <8 x i16> %1, %11026 %3 = bitcast <8 x i16> %2 to <4 x float>1027 %4 = fadd <4 x float> %3, %31028 store <4 x float> %4, ptr %q1029 ret void1030}1031 1032; CHECK-LABEL: test_v4f32_v16i8:1033define void @test_v4f32_v16i8(ptr %p, ptr %q) {1034; CHECK: ld1 { v{{[0-9]+}}.16b }1035; CHECK: rev32 v{{[0-9]+}}.16b1036; CHECK-NOT: rev1037; CHECK: st1 { v{{[0-9]+}}.4s }1038 %1 = load <16 x i8>, ptr %p1039 %2 = add <16 x i8> %1, %11040 %3 = bitcast <16 x i8> %2 to <4 x float>1041 %4 = fadd <4 x float> %3, %31042 store <4 x float> %4, ptr %q1043 ret void1044}1045 1046; CHECK-LABEL: test_v4i32_f128:1047define void @test_v4i32_f128(ptr %p, ptr %q) {1048; CHECK: ldr1049; CHECK: rev64 v{{[0-9]+}}.4s1050; CHECK: ext1051; CHECK: st1 { v{{[0-9]+}}.4s }1052 %1 = load fp128, ptr %p1053 %2 = fadd fp128 %1, %11054 %3 = bitcast fp128 %2 to <4 x i32>1055 %4 = add <4 x i32> %3, %31056 store <4 x i32> %4, ptr %q1057 ret void1058}1059 1060; CHECK-LABEL: test_v4i32_v2f64:1061define void @test_v4i32_v2f64(ptr %p, ptr %q) {1062; CHECK: ld1 { v{{[0-9]+}}.2d }1063; CHECK: rev64 v{{[0-9]+}}.4s1064; CHECK: st1 { v{{[0-9]+}}.4s }1065 %1 = load <2 x double>, ptr %p1066 %2 = fadd <2 x double> %1, %11067 %3 = bitcast <2 x double> %2 to <4 x i32>1068 %4 = add <4 x i32> %3, %31069 store <4 x i32> %4, ptr %q1070 ret void1071}1072 1073; CHECK-LABEL: test_v4i32_v2i64:1074define void @test_v4i32_v2i64(ptr %p, ptr %q) {1075; CHECK: ld1 { v{{[0-9]+}}.2d }1076; CHECK: rev64 v{{[0-9]+}}.4s1077; CHECK: st1 { v{{[0-9]+}}.4s }1078 %1 = load <2 x i64>, ptr %p1079 %2 = add <2 x i64> %1, %11080 %3 = bitcast <2 x i64> %2 to <4 x i32>1081 %4 = add <4 x i32> %3, %31082 store <4 x i32> %4, ptr %q1083 ret void1084}1085 1086; CHECK-LABEL: test_v4i32_v4f32:1087define void @test_v4i32_v4f32(ptr %p, ptr %q) {1088; CHECK: ld1 { v{{[0-9]+}}.4s }1089; CHECK-NOT: rev1090; CHECK: st1 { v{{[0-9]+}}.4s }1091 %1 = load <4 x float>, ptr %p1092 %2 = fadd <4 x float> %1, %11093 %3 = bitcast <4 x float> %2 to <4 x i32>1094 %4 = add <4 x i32> %3, %31095 store <4 x i32> %4, ptr %q1096 ret void1097}1098 1099; CHECK-LABEL: test_v4i32_v8i16:1100define void @test_v4i32_v8i16(ptr %p, ptr %q) {1101; CHECK: ld1 { v{{[0-9]+}}.8h }1102; CHECK: rev32 v{{[0-9]+}}.8h1103; CHECK: st1 { v{{[0-9]+}}.4s }1104 %1 = load <8 x i16>, ptr %p1105 %2 = add <8 x i16> %1, %11106 %3 = bitcast <8 x i16> %2 to <4 x i32>1107 %4 = add <4 x i32> %3, %31108 store <4 x i32> %4, ptr %q1109 ret void1110}1111 1112; CHECK-LABEL: test_v4i32_v16i8:1113define void @test_v4i32_v16i8(ptr %p, ptr %q) {1114; CHECK: ld1 { v{{[0-9]+}}.16b }1115; CHECK: rev32 v{{[0-9]+}}.16b1116; CHECK: st1 { v{{[0-9]+}}.4s }1117 %1 = load <16 x i8>, ptr %p1118 %2 = add <16 x i8> %1, %11119 %3 = bitcast <16 x i8> %2 to <4 x i32>1120 %4 = add <4 x i32> %3, %31121 store <4 x i32> %4, ptr %q1122 ret void1123}1124 1125; CHECK-LABEL: test_v8i16_f128:1126define void @test_v8i16_f128(ptr %p, ptr %q) {1127; CHECK: ldr1128; CHECK: rev64 v{{[0-9]+}}.8h1129; CHECK: ext1130; CHECK: st1 { v{{[0-9]+}}.8h }1131 %1 = load fp128, ptr %p1132 %2 = fadd fp128 %1, %11133 %3 = bitcast fp128 %2 to <8 x i16>1134 %4 = add <8 x i16> %3, %31135 store <8 x i16> %4, ptr %q1136 ret void1137}1138 1139; CHECK-LABEL: test_v8i16_v2f64:1140define void @test_v8i16_v2f64(ptr %p, ptr %q) {1141; CHECK: ld1 { v{{[0-9]+}}.2d }1142; CHECK: rev64 v{{[0-9]+}}.8h1143; CHECK: st1 { v{{[0-9]+}}.8h }1144 %1 = load <2 x double>, ptr %p1145 %2 = fadd <2 x double> %1, %11146 %3 = bitcast <2 x double> %2 to <8 x i16>1147 %4 = add <8 x i16> %3, %31148 store <8 x i16> %4, ptr %q1149 ret void1150}1151 1152; CHECK-LABEL: test_v8i16_v2i64:1153define void @test_v8i16_v2i64(ptr %p, ptr %q) {1154; CHECK: ld1 { v{{[0-9]+}}.2d }1155; CHECK: rev64 v{{[0-9]+}}.8h1156; CHECK: st1 { v{{[0-9]+}}.8h }1157 %1 = load <2 x i64>, ptr %p1158 %2 = add <2 x i64> %1, %11159 %3 = bitcast <2 x i64> %2 to <8 x i16>1160 %4 = add <8 x i16> %3, %31161 store <8 x i16> %4, ptr %q1162 ret void1163}1164 1165; CHECK-LABEL: test_v8i16_v4f32:1166define void @test_v8i16_v4f32(ptr %p, ptr %q) {1167; CHECK: ld1 { v{{[0-9]+}}.4s }1168; CHECK: rev32 v{{[0-9]+}}.8h1169; CHECK-NOT: rev1170; CHECK: st1 { v{{[0-9]+}}.8h }1171 %1 = load <4 x float>, ptr %p1172 %2 = fadd <4 x float> %1, %11173 %3 = bitcast <4 x float> %2 to <8 x i16>1174 %4 = add <8 x i16> %3, %31175 store <8 x i16> %4, ptr %q1176 ret void1177}1178 1179; CHECK-LABEL: test_v8i16_v4i32:1180define void @test_v8i16_v4i32(ptr %p, ptr %q) {1181; CHECK: ld1 { v{{[0-9]+}}.4s }1182; CHECK: rev32 v{{[0-9]+}}.8h1183; CHECK: st1 { v{{[0-9]+}}.8h }1184 %1 = load <4 x i32>, ptr %p1185 %2 = add <4 x i32> %1, %11186 %3 = bitcast <4 x i32> %2 to <8 x i16>1187 %4 = add <8 x i16> %3, %31188 store <8 x i16> %4, ptr %q1189 ret void1190}1191 1192; CHECK-LABEL: test_v8i16_v8f16:1193define void @test_v8i16_v8f16(ptr %p, ptr %q) {1194; CHECK: ld1 { v{{[0-9]+}}.8h }1195; CHECK-NOT: rev1196; CHECK: st1 { v{{[0-9]+}}.8h }1197 %1 = load <8 x half>, ptr %p1198 %2 = fadd <8 x half> %1, %11199 %3 = bitcast <8 x half> %2 to <8 x i16>1200 %4 = add <8 x i16> %3, %31201 store <8 x i16> %4, ptr %q1202 ret void1203}1204 1205; CHECK-LABEL: test_v8i16_v16i8:1206define void @test_v8i16_v16i8(ptr %p, ptr %q) {1207; CHECK: ld1 { v{{[0-9]+}}.16b }1208; CHECK: rev16 v{{[0-9]+}}.16b1209; CHECK: st1 { v{{[0-9]+}}.8h }1210 %1 = load <16 x i8>, ptr %p1211 %2 = add <16 x i8> %1, %11212 %3 = bitcast <16 x i8> %2 to <8 x i16>1213 %4 = add <8 x i16> %3, %31214 store <8 x i16> %4, ptr %q1215 ret void1216}1217 1218; CHECK-LABEL: test_v16i8_f128:1219define void @test_v16i8_f128(ptr %p, ptr %q) {1220; CHECK: ldr q1221; CHECK: rev64 v{{[0-9]+}}.16b1222; CHECK: ext1223; CHECK: st1 { v{{[0-9]+}}.16b }1224 %1 = load fp128, ptr %p1225 %2 = fadd fp128 %1, %11226 %3 = bitcast fp128 %2 to <16 x i8>1227 %4 = add <16 x i8> %3, %31228 store <16 x i8> %4, ptr %q1229 ret void1230}1231 1232; CHECK-LABEL: test_v16i8_v2f64:1233define void @test_v16i8_v2f64(ptr %p, ptr %q) {1234; CHECK: ld1 { v{{[0-9]+}}.2d }1235; CHECK: rev64 v{{[0-9]+}}.16b1236; CHECK: st1 { v{{[0-9]+}}.16b }1237 %1 = load <2 x double>, ptr %p1238 %2 = fadd <2 x double> %1, %11239 %3 = bitcast <2 x double> %2 to <16 x i8>1240 %4 = add <16 x i8> %3, %31241 store <16 x i8> %4, ptr %q1242 ret void1243}1244 1245; CHECK-LABEL: test_v16i8_v2i64:1246define void @test_v16i8_v2i64(ptr %p, ptr %q) {1247; CHECK: ld1 { v{{[0-9]+}}.2d }1248; CHECK: rev64 v{{[0-9]+}}.16b1249; CHECK: st1 { v{{[0-9]+}}.16b }1250 %1 = load <2 x i64>, ptr %p1251 %2 = add <2 x i64> %1, %11252 %3 = bitcast <2 x i64> %2 to <16 x i8>1253 %4 = add <16 x i8> %3, %31254 store <16 x i8> %4, ptr %q1255 ret void1256}1257 1258; CHECK-LABEL: test_v16i8_v4f32:1259define void @test_v16i8_v4f32(ptr %p, ptr %q) {1260; CHECK: ld1 { v{{[0-9]+}}.4s }1261; CHECK: rev32 v{{[0-9]+}}.16b1262; CHECK-NOT: rev1263; CHECK: st1 { v{{[0-9]+}}.16b }1264 %1 = load <4 x float>, ptr %p1265 %2 = fadd <4 x float> %1, %11266 %3 = bitcast <4 x float> %2 to <16 x i8>1267 %4 = add <16 x i8> %3, %31268 store <16 x i8> %4, ptr %q1269 ret void1270}1271 1272; CHECK-LABEL: test_v16i8_v4i32:1273define void @test_v16i8_v4i32(ptr %p, ptr %q) {1274; CHECK: ld1 { v{{[0-9]+}}.4s }1275; CHECK: rev32 v{{[0-9]+}}.16b1276; CHECK: st1 { v{{[0-9]+}}.16b }1277 %1 = load <4 x i32>, ptr %p1278 %2 = add <4 x i32> %1, %11279 %3 = bitcast <4 x i32> %2 to <16 x i8>1280 %4 = add <16 x i8> %3, %31281 store <16 x i8> %4, ptr %q1282 ret void1283}1284 1285; CHECK-LABEL: test_v16i8_v8f16:1286define void @test_v16i8_v8f16(ptr %p, ptr %q) {1287; CHECK: ld1 { v{{[0-9]+}}.8h }1288; CHECK: rev16 v{{[0-9]+}}.16b1289; CHECK-NOT: rev1290; CHECK: st1 { v{{[0-9]+}}.16b }1291 %1 = load <8 x half>, ptr %p1292 %2 = fadd <8 x half> %1, %11293 %3 = bitcast <8 x half> %2 to <16 x i8>1294 %4 = add <16 x i8> %3, %31295 store <16 x i8> %4, ptr %q1296 ret void1297}1298 1299; CHECK-LABEL: test_v16i8_v8i16:1300define void @test_v16i8_v8i16(ptr %p, ptr %q) {1301; CHECK: ld1 { v{{[0-9]+}}.8h }1302; CHECK: rev16 v{{[0-9]+}}.16b1303; CHECK: st1 { v{{[0-9]+}}.16b }1304 %1 = load <8 x i16>, ptr %p1305 %2 = add <8 x i16> %1, %11306 %3 = bitcast <8 x i16> %2 to <16 x i8>1307 %4 = add <16 x i8> %3, %31308 store <16 x i8> %4, ptr %q1309 ret void1310}1311 1312; CHECK-LABEL: test_v4f16_struct:1313%struct.struct1 = type { half, half, half, half }1314define %struct.struct1 @test_v4f16_struct(ptr %ret) {1315entry:1316; CHECK: ld1 { {{v[0-9]+}}.4h }1317; CHECK-NOT: rev1318 %0 = load <4 x half>, ptr %ret, align 21319 %1 = extractelement <4 x half> %0, i32 01320 %.fca.0.insert = insertvalue %struct.struct1 undef, half %1, 01321 ret %struct.struct1 %.fca.0.insert1322}1323