1240 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc -mattr=+sve -force-streaming-compatible < %s | FileCheck %s3; RUN: llc -force-streaming-compatible < %s | FileCheck %s --check-prefix=NONEON-NOSVE4 5 6target triple = "aarch64-unknown-linux-gnu"7 8;9; Masked Store10;11 12define void @masked_store_v4i8(ptr %dst, <4 x i1> %mask) {13; CHECK-LABEL: masked_store_v4i8:14; CHECK: // %bb.0:15; CHECK-NEXT: // kill: def $d0 killed $d0 def $z016; CHECK-NEXT: ptrue p0.h, vl417; CHECK-NEXT: lsl z0.h, z0.h, #1518; CHECK-NEXT: asr z0.h, z0.h, #1519; CHECK-NEXT: cmpne p0.h, p0/z, z0.h, #020; CHECK-NEXT: mov z0.h, #0 // =0x021; CHECK-NEXT: st1b { z0.h }, p0, [x0]22; CHECK-NEXT: ret23;24; NONEON-NOSVE-LABEL: masked_store_v4i8:25; NONEON-NOSVE: // %bb.0:26; NONEON-NOSVE-NEXT: str d0, [sp, #-16]!27; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 1628; NONEON-NOSVE-NEXT: ldrh w8, [sp, #2]29; NONEON-NOSVE-NEXT: ldrh w9, [sp, #4]30; NONEON-NOSVE-NEXT: ldrh w10, [sp, #6]31; NONEON-NOSVE-NEXT: ldrh w11, [sp]32; NONEON-NOSVE-NEXT: sbfx w8, w8, #0, #133; NONEON-NOSVE-NEXT: sbfx w9, w9, #0, #134; NONEON-NOSVE-NEXT: sbfx w10, w10, #0, #135; NONEON-NOSVE-NEXT: and w8, w8, #0x236; NONEON-NOSVE-NEXT: and w9, w9, #0x437; NONEON-NOSVE-NEXT: and w10, w10, #0x838; NONEON-NOSVE-NEXT: bfxil w8, w11, #0, #139; NONEON-NOSVE-NEXT: orr w9, w9, w1040; NONEON-NOSVE-NEXT: orr w8, w8, w941; NONEON-NOSVE-NEXT: tbnz w8, #0, .LBB0_542; NONEON-NOSVE-NEXT: // %bb.1: // %else43; NONEON-NOSVE-NEXT: tbnz w8, #1, .LBB0_644; NONEON-NOSVE-NEXT: .LBB0_2: // %else245; NONEON-NOSVE-NEXT: tbnz w8, #2, .LBB0_746; NONEON-NOSVE-NEXT: .LBB0_3: // %else447; NONEON-NOSVE-NEXT: tbnz w8, #3, .LBB0_848; NONEON-NOSVE-NEXT: .LBB0_4: // %else649; NONEON-NOSVE-NEXT: add sp, sp, #1650; NONEON-NOSVE-NEXT: ret51; NONEON-NOSVE-NEXT: .LBB0_5: // %cond.store52; NONEON-NOSVE-NEXT: strb wzr, [x0]53; NONEON-NOSVE-NEXT: tbz w8, #1, .LBB0_254; NONEON-NOSVE-NEXT: .LBB0_6: // %cond.store155; NONEON-NOSVE-NEXT: strb wzr, [x0, #1]56; NONEON-NOSVE-NEXT: tbz w8, #2, .LBB0_357; NONEON-NOSVE-NEXT: .LBB0_7: // %cond.store358; NONEON-NOSVE-NEXT: strb wzr, [x0, #2]59; NONEON-NOSVE-NEXT: tbz w8, #3, .LBB0_460; NONEON-NOSVE-NEXT: .LBB0_8: // %cond.store561; NONEON-NOSVE-NEXT: strb wzr, [x0, #3]62; NONEON-NOSVE-NEXT: add sp, sp, #1663; NONEON-NOSVE-NEXT: ret64 call void @llvm.masked.store.v4i8(<4 x i8> zeroinitializer, ptr %dst, i32 8, <4 x i1> %mask)65 ret void66}67 68define void @masked_store_v8i8(ptr %dst, <8 x i1> %mask) {69; CHECK-LABEL: masked_store_v8i8:70; CHECK: // %bb.0:71; CHECK-NEXT: // kill: def $d0 killed $d0 def $z072; CHECK-NEXT: ptrue p0.b, vl873; CHECK-NEXT: lsl z0.b, z0.b, #774; CHECK-NEXT: asr z0.b, z0.b, #775; CHECK-NEXT: cmpne p0.b, p0/z, z0.b, #076; CHECK-NEXT: mov z0.b, #0 // =0x077; CHECK-NEXT: st1b { z0.b }, p0, [x0]78; CHECK-NEXT: ret79;80; NONEON-NOSVE-LABEL: masked_store_v8i8:81; NONEON-NOSVE: // %bb.0:82; NONEON-NOSVE-NEXT: str d0, [sp, #-16]!83; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 1684; NONEON-NOSVE-NEXT: ldrb w8, [sp, #2]85; NONEON-NOSVE-NEXT: ldrb w9, [sp, #3]86; NONEON-NOSVE-NEXT: ldrb w10, [sp, #1]87; NONEON-NOSVE-NEXT: ldrb w12, [sp, #4]88; NONEON-NOSVE-NEXT: ldrb w13, [sp, #5]89; NONEON-NOSVE-NEXT: ldrb w14, [sp, #6]90; NONEON-NOSVE-NEXT: sbfx w8, w8, #0, #191; NONEON-NOSVE-NEXT: sbfx w9, w9, #0, #192; NONEON-NOSVE-NEXT: sbfx w10, w10, #0, #193; NONEON-NOSVE-NEXT: ldrb w11, [sp]94; NONEON-NOSVE-NEXT: sbfx w12, w12, #0, #195; NONEON-NOSVE-NEXT: sbfx w13, w13, #0, #196; NONEON-NOSVE-NEXT: and w8, w8, #0x497; NONEON-NOSVE-NEXT: and w9, w9, #0x898; NONEON-NOSVE-NEXT: sbfx w14, w14, #0, #199; NONEON-NOSVE-NEXT: orr w8, w8, w9100; NONEON-NOSVE-NEXT: ldrb w9, [sp, #7]101; NONEON-NOSVE-NEXT: and w10, w10, #0x2102; NONEON-NOSVE-NEXT: and w12, w12, #0x10103; NONEON-NOSVE-NEXT: bfxil w10, w11, #0, #1104; NONEON-NOSVE-NEXT: and w11, w13, #0x20105; NONEON-NOSVE-NEXT: orr w8, w8, w12106; NONEON-NOSVE-NEXT: and w12, w14, #0x40107; NONEON-NOSVE-NEXT: sbfx w9, w9, #0, #1108; NONEON-NOSVE-NEXT: orr w8, w10, w8109; NONEON-NOSVE-NEXT: orr w10, w11, w12110; NONEON-NOSVE-NEXT: orr w8, w8, w10111; NONEON-NOSVE-NEXT: and w9, w9, #0x80112; NONEON-NOSVE-NEXT: add w9, w8, w9113; NONEON-NOSVE-NEXT: and w8, w9, #0xff114; NONEON-NOSVE-NEXT: tbnz w9, #0, .LBB1_9115; NONEON-NOSVE-NEXT: // %bb.1: // %else116; NONEON-NOSVE-NEXT: tbnz w8, #1, .LBB1_10117; NONEON-NOSVE-NEXT: .LBB1_2: // %else2118; NONEON-NOSVE-NEXT: tbnz w8, #2, .LBB1_11119; NONEON-NOSVE-NEXT: .LBB1_3: // %else4120; NONEON-NOSVE-NEXT: tbnz w8, #3, .LBB1_12121; NONEON-NOSVE-NEXT: .LBB1_4: // %else6122; NONEON-NOSVE-NEXT: tbnz w8, #4, .LBB1_13123; NONEON-NOSVE-NEXT: .LBB1_5: // %else8124; NONEON-NOSVE-NEXT: tbnz w8, #5, .LBB1_14125; NONEON-NOSVE-NEXT: .LBB1_6: // %else10126; NONEON-NOSVE-NEXT: tbnz w8, #6, .LBB1_15127; NONEON-NOSVE-NEXT: .LBB1_7: // %else12128; NONEON-NOSVE-NEXT: tbnz w8, #7, .LBB1_16129; NONEON-NOSVE-NEXT: .LBB1_8: // %else14130; NONEON-NOSVE-NEXT: add sp, sp, #16131; NONEON-NOSVE-NEXT: ret132; NONEON-NOSVE-NEXT: .LBB1_9: // %cond.store133; NONEON-NOSVE-NEXT: strb wzr, [x0]134; NONEON-NOSVE-NEXT: tbz w8, #1, .LBB1_2135; NONEON-NOSVE-NEXT: .LBB1_10: // %cond.store1136; NONEON-NOSVE-NEXT: strb wzr, [x0, #1]137; NONEON-NOSVE-NEXT: tbz w8, #2, .LBB1_3138; NONEON-NOSVE-NEXT: .LBB1_11: // %cond.store3139; NONEON-NOSVE-NEXT: strb wzr, [x0, #2]140; NONEON-NOSVE-NEXT: tbz w8, #3, .LBB1_4141; NONEON-NOSVE-NEXT: .LBB1_12: // %cond.store5142; NONEON-NOSVE-NEXT: strb wzr, [x0, #3]143; NONEON-NOSVE-NEXT: tbz w8, #4, .LBB1_5144; NONEON-NOSVE-NEXT: .LBB1_13: // %cond.store7145; NONEON-NOSVE-NEXT: strb wzr, [x0, #4]146; NONEON-NOSVE-NEXT: tbz w8, #5, .LBB1_6147; NONEON-NOSVE-NEXT: .LBB1_14: // %cond.store9148; NONEON-NOSVE-NEXT: strb wzr, [x0, #5]149; NONEON-NOSVE-NEXT: tbz w8, #6, .LBB1_7150; NONEON-NOSVE-NEXT: .LBB1_15: // %cond.store11151; NONEON-NOSVE-NEXT: strb wzr, [x0, #6]152; NONEON-NOSVE-NEXT: tbz w8, #7, .LBB1_8153; NONEON-NOSVE-NEXT: .LBB1_16: // %cond.store13154; NONEON-NOSVE-NEXT: strb wzr, [x0, #7]155; NONEON-NOSVE-NEXT: add sp, sp, #16156; NONEON-NOSVE-NEXT: ret157 call void @llvm.masked.store.v8i8(<8 x i8> zeroinitializer, ptr %dst, i32 8, <8 x i1> %mask)158 ret void159}160 161define void @masked_store_v16i8(ptr %dst, <16 x i1> %mask) {162; CHECK-LABEL: masked_store_v16i8:163; CHECK: // %bb.0:164; CHECK-NEXT: // kill: def $q0 killed $q0 def $z0165; CHECK-NEXT: ptrue p0.b, vl16166; CHECK-NEXT: lsl z0.b, z0.b, #7167; CHECK-NEXT: asr z0.b, z0.b, #7168; CHECK-NEXT: cmpne p0.b, p0/z, z0.b, #0169; CHECK-NEXT: mov z0.b, #0 // =0x0170; CHECK-NEXT: st1b { z0.b }, p0, [x0]171; CHECK-NEXT: ret172;173; NONEON-NOSVE-LABEL: masked_store_v16i8:174; NONEON-NOSVE: // %bb.0:175; NONEON-NOSVE-NEXT: str q0, [sp, #-16]!176; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 16177; NONEON-NOSVE-NEXT: ldrb w8, [sp, #2]178; NONEON-NOSVE-NEXT: ldrb w9, [sp, #3]179; NONEON-NOSVE-NEXT: ldrb w10, [sp, #1]180; NONEON-NOSVE-NEXT: ldrb w12, [sp, #4]181; NONEON-NOSVE-NEXT: ldrb w13, [sp, #5]182; NONEON-NOSVE-NEXT: ldrb w14, [sp, #6]183; NONEON-NOSVE-NEXT: sbfx w8, w8, #0, #1184; NONEON-NOSVE-NEXT: sbfx w9, w9, #0, #1185; NONEON-NOSVE-NEXT: sbfx w10, w10, #0, #1186; NONEON-NOSVE-NEXT: ldrb w11, [sp]187; NONEON-NOSVE-NEXT: sbfx w12, w12, #0, #1188; NONEON-NOSVE-NEXT: sbfx w13, w13, #0, #1189; NONEON-NOSVE-NEXT: and w8, w8, #0x4190; NONEON-NOSVE-NEXT: and w9, w9, #0x8191; NONEON-NOSVE-NEXT: sbfx w14, w14, #0, #1192; NONEON-NOSVE-NEXT: orr w8, w8, w9193; NONEON-NOSVE-NEXT: ldrb w9, [sp, #7]194; NONEON-NOSVE-NEXT: and w10, w10, #0x2195; NONEON-NOSVE-NEXT: and w12, w12, #0x10196; NONEON-NOSVE-NEXT: bfxil w10, w11, #0, #1197; NONEON-NOSVE-NEXT: and w11, w13, #0x20198; NONEON-NOSVE-NEXT: orr w8, w8, w12199; NONEON-NOSVE-NEXT: and w12, w14, #0x40200; NONEON-NOSVE-NEXT: sbfx w9, w9, #0, #1201; NONEON-NOSVE-NEXT: orr w8, w10, w8202; NONEON-NOSVE-NEXT: orr w10, w11, w12203; NONEON-NOSVE-NEXT: orr w8, w8, w10204; NONEON-NOSVE-NEXT: and w9, w9, #0xffffff80205; NONEON-NOSVE-NEXT: add w8, w8, w9206; NONEON-NOSVE-NEXT: tbnz w8, #0, .LBB2_17207; NONEON-NOSVE-NEXT: // %bb.1: // %else208; NONEON-NOSVE-NEXT: tbnz w8, #1, .LBB2_18209; NONEON-NOSVE-NEXT: .LBB2_2: // %else2210; NONEON-NOSVE-NEXT: tbnz w8, #2, .LBB2_19211; NONEON-NOSVE-NEXT: .LBB2_3: // %else4212; NONEON-NOSVE-NEXT: tbnz w8, #3, .LBB2_20213; NONEON-NOSVE-NEXT: .LBB2_4: // %else6214; NONEON-NOSVE-NEXT: tbnz w8, #4, .LBB2_21215; NONEON-NOSVE-NEXT: .LBB2_5: // %else8216; NONEON-NOSVE-NEXT: tbnz w8, #5, .LBB2_22217; NONEON-NOSVE-NEXT: .LBB2_6: // %else10218; NONEON-NOSVE-NEXT: tbnz w8, #6, .LBB2_23219; NONEON-NOSVE-NEXT: .LBB2_7: // %else12220; NONEON-NOSVE-NEXT: tbnz w8, #7, .LBB2_24221; NONEON-NOSVE-NEXT: .LBB2_8: // %else14222; NONEON-NOSVE-NEXT: tbnz w8, #8, .LBB2_25223; NONEON-NOSVE-NEXT: .LBB2_9: // %else16224; NONEON-NOSVE-NEXT: tbnz w8, #9, .LBB2_26225; NONEON-NOSVE-NEXT: .LBB2_10: // %else18226; NONEON-NOSVE-NEXT: tbnz w8, #10, .LBB2_27227; NONEON-NOSVE-NEXT: .LBB2_11: // %else20228; NONEON-NOSVE-NEXT: tbnz w8, #11, .LBB2_28229; NONEON-NOSVE-NEXT: .LBB2_12: // %else22230; NONEON-NOSVE-NEXT: tbnz w8, #12, .LBB2_29231; NONEON-NOSVE-NEXT: .LBB2_13: // %else24232; NONEON-NOSVE-NEXT: tbnz w8, #13, .LBB2_30233; NONEON-NOSVE-NEXT: .LBB2_14: // %else26234; NONEON-NOSVE-NEXT: tbnz w8, #14, .LBB2_31235; NONEON-NOSVE-NEXT: .LBB2_15: // %else28236; NONEON-NOSVE-NEXT: tbnz w8, #15, .LBB2_32237; NONEON-NOSVE-NEXT: .LBB2_16: // %else30238; NONEON-NOSVE-NEXT: add sp, sp, #16239; NONEON-NOSVE-NEXT: ret240; NONEON-NOSVE-NEXT: .LBB2_17: // %cond.store241; NONEON-NOSVE-NEXT: strb wzr, [x0]242; NONEON-NOSVE-NEXT: tbz w8, #1, .LBB2_2243; NONEON-NOSVE-NEXT: .LBB2_18: // %cond.store1244; NONEON-NOSVE-NEXT: strb wzr, [x0, #1]245; NONEON-NOSVE-NEXT: tbz w8, #2, .LBB2_3246; NONEON-NOSVE-NEXT: .LBB2_19: // %cond.store3247; NONEON-NOSVE-NEXT: strb wzr, [x0, #2]248; NONEON-NOSVE-NEXT: tbz w8, #3, .LBB2_4249; NONEON-NOSVE-NEXT: .LBB2_20: // %cond.store5250; NONEON-NOSVE-NEXT: strb wzr, [x0, #3]251; NONEON-NOSVE-NEXT: tbz w8, #4, .LBB2_5252; NONEON-NOSVE-NEXT: .LBB2_21: // %cond.store7253; NONEON-NOSVE-NEXT: strb wzr, [x0, #4]254; NONEON-NOSVE-NEXT: tbz w8, #5, .LBB2_6255; NONEON-NOSVE-NEXT: .LBB2_22: // %cond.store9256; NONEON-NOSVE-NEXT: strb wzr, [x0, #5]257; NONEON-NOSVE-NEXT: tbz w8, #6, .LBB2_7258; NONEON-NOSVE-NEXT: .LBB2_23: // %cond.store11259; NONEON-NOSVE-NEXT: strb wzr, [x0, #6]260; NONEON-NOSVE-NEXT: tbz w8, #7, .LBB2_8261; NONEON-NOSVE-NEXT: .LBB2_24: // %cond.store13262; NONEON-NOSVE-NEXT: strb wzr, [x0, #7]263; NONEON-NOSVE-NEXT: tbz w8, #8, .LBB2_9264; NONEON-NOSVE-NEXT: .LBB2_25: // %cond.store15265; NONEON-NOSVE-NEXT: strb wzr, [x0, #8]266; NONEON-NOSVE-NEXT: tbz w8, #9, .LBB2_10267; NONEON-NOSVE-NEXT: .LBB2_26: // %cond.store17268; NONEON-NOSVE-NEXT: strb wzr, [x0, #9]269; NONEON-NOSVE-NEXT: tbz w8, #10, .LBB2_11270; NONEON-NOSVE-NEXT: .LBB2_27: // %cond.store19271; NONEON-NOSVE-NEXT: strb wzr, [x0, #10]272; NONEON-NOSVE-NEXT: tbz w8, #11, .LBB2_12273; NONEON-NOSVE-NEXT: .LBB2_28: // %cond.store21274; NONEON-NOSVE-NEXT: strb wzr, [x0, #11]275; NONEON-NOSVE-NEXT: tbz w8, #12, .LBB2_13276; NONEON-NOSVE-NEXT: .LBB2_29: // %cond.store23277; NONEON-NOSVE-NEXT: strb wzr, [x0, #12]278; NONEON-NOSVE-NEXT: tbz w8, #13, .LBB2_14279; NONEON-NOSVE-NEXT: .LBB2_30: // %cond.store25280; NONEON-NOSVE-NEXT: strb wzr, [x0, #13]281; NONEON-NOSVE-NEXT: tbz w8, #14, .LBB2_15282; NONEON-NOSVE-NEXT: .LBB2_31: // %cond.store27283; NONEON-NOSVE-NEXT: strb wzr, [x0, #14]284; NONEON-NOSVE-NEXT: tbz w8, #15, .LBB2_16285; NONEON-NOSVE-NEXT: .LBB2_32: // %cond.store29286; NONEON-NOSVE-NEXT: strb wzr, [x0, #15]287; NONEON-NOSVE-NEXT: add sp, sp, #16288; NONEON-NOSVE-NEXT: ret289 call void @llvm.masked.store.v16i8(<16 x i8> zeroinitializer, ptr %dst, i32 8, <16 x i1> %mask)290 ret void291}292 293define void @masked_store_v32i8(ptr %dst, <32 x i1> %mask) {294; CHECK-LABEL: masked_store_v32i8:295; CHECK: // %bb.0:296; CHECK-NEXT: sub sp, sp, #32297; CHECK-NEXT: .cfi_def_cfa_offset 32298; CHECK-NEXT: ldr w8, [sp, #96]299; CHECK-NEXT: ldr w9, [sp, #88]300; CHECK-NEXT: ptrue p0.b, vl16301; CHECK-NEXT: ldr w10, [sp, #120]302; CHECK-NEXT: strb w7, [sp, #6]303; CHECK-NEXT: strb w8, [sp, #15]304; CHECK-NEXT: ldr w8, [sp, #80]305; CHECK-NEXT: strb w9, [sp, #14]306; CHECK-NEXT: ldr w9, [sp, #72]307; CHECK-NEXT: strb w8, [sp, #13]308; CHECK-NEXT: ldr w8, [sp, #64]309; CHECK-NEXT: strb w9, [sp, #12]310; CHECK-NEXT: ldr w9, [sp, #56]311; CHECK-NEXT: strb w8, [sp, #11]312; CHECK-NEXT: ldr w8, [sp, #48]313; CHECK-NEXT: strb w9, [sp, #10]314; CHECK-NEXT: ldr w9, [sp, #40]315; CHECK-NEXT: strb w8, [sp, #9]316; CHECK-NEXT: ldr w8, [sp, #32]317; CHECK-NEXT: strb w9, [sp, #8]318; CHECK-NEXT: ldr w9, [sp, #216]319; CHECK-NEXT: strb w8, [sp, #7]320; CHECK-NEXT: ldr w8, [sp, #224]321; CHECK-NEXT: strb w9, [sp, #30]322; CHECK-NEXT: ldr w9, [sp, #200]323; CHECK-NEXT: strb w8, [sp, #31]324; CHECK-NEXT: ldr w8, [sp, #208]325; CHECK-NEXT: strb w9, [sp, #28]326; CHECK-NEXT: ldr w9, [sp, #184]327; CHECK-NEXT: strb w8, [sp, #29]328; CHECK-NEXT: ldr w8, [sp, #192]329; CHECK-NEXT: strb w9, [sp, #26]330; CHECK-NEXT: ldr w9, [sp, #168]331; CHECK-NEXT: strb w8, [sp, #27]332; CHECK-NEXT: ldr w8, [sp, #176]333; CHECK-NEXT: strb w9, [sp, #24]334; CHECK-NEXT: ldr w9, [sp, #152]335; CHECK-NEXT: strb w8, [sp, #25]336; CHECK-NEXT: ldr w8, [sp, #160]337; CHECK-NEXT: strb w9, [sp, #22]338; CHECK-NEXT: ldr w9, [sp, #136]339; CHECK-NEXT: strb w8, [sp, #23]340; CHECK-NEXT: ldr w8, [sp, #144]341; CHECK-NEXT: strb w9, [sp, #20]342; CHECK-NEXT: ldr w9, [sp, #112]343; CHECK-NEXT: strb w8, [sp, #21]344; CHECK-NEXT: ldr w8, [sp, #128]345; CHECK-NEXT: strb w6, [sp, #5]346; CHECK-NEXT: strb w8, [sp, #19]347; CHECK-NEXT: ldr w8, [sp, #104]348; CHECK-NEXT: strb w5, [sp, #4]349; CHECK-NEXT: strb w4, [sp, #3]350; CHECK-NEXT: strb w3, [sp, #2]351; CHECK-NEXT: strb w2, [sp, #1]352; CHECK-NEXT: strb w1, [sp]353; CHECK-NEXT: strb w10, [sp, #18]354; CHECK-NEXT: strb w9, [sp, #17]355; CHECK-NEXT: strb w8, [sp, #16]356; CHECK-NEXT: mov w8, #16 // =0x10357; CHECK-NEXT: ldp q1, q0, [sp]358; CHECK-NEXT: lsl z0.b, z0.b, #7359; CHECK-NEXT: lsl z1.b, z1.b, #7360; CHECK-NEXT: asr z0.b, z0.b, #7361; CHECK-NEXT: asr z1.b, z1.b, #7362; CHECK-NEXT: cmpne p1.b, p0/z, z0.b, #0363; CHECK-NEXT: cmpne p0.b, p0/z, z1.b, #0364; CHECK-NEXT: mov z0.b, #0 // =0x0365; CHECK-NEXT: st1b { z0.b }, p1, [x0, x8]366; CHECK-NEXT: st1b { z0.b }, p0, [x0]367; CHECK-NEXT: add sp, sp, #32368; CHECK-NEXT: ret369;370; NONEON-NOSVE-LABEL: masked_store_v32i8:371; NONEON-NOSVE: // %bb.0:372; NONEON-NOSVE-NEXT: ldr w8, [sp, #80]373; NONEON-NOSVE-NEXT: ldr w9, [sp, #88]374; NONEON-NOSVE-NEXT: sbfx w15, w7, #0, #1375; NONEON-NOSVE-NEXT: ldr w10, [sp, #96]376; NONEON-NOSVE-NEXT: ldr w12, [sp, #104]377; NONEON-NOSVE-NEXT: ldr w11, [sp, #72]378; NONEON-NOSVE-NEXT: sbfx w8, w8, #0, #1379; NONEON-NOSVE-NEXT: sbfx w9, w9, #0, #1380; NONEON-NOSVE-NEXT: ldr w13, [sp, #120]381; NONEON-NOSVE-NEXT: sbfx w10, w10, #0, #1382; NONEON-NOSVE-NEXT: sbfx w12, w12, #0, #1383; NONEON-NOSVE-NEXT: ldr w14, [sp, #128]384; NONEON-NOSVE-NEXT: and w8, w8, #0x2385; NONEON-NOSVE-NEXT: and w9, w9, #0x4386; NONEON-NOSVE-NEXT: ldr w16, [sp]387; NONEON-NOSVE-NEXT: bfxil w8, w11, #0, #1388; NONEON-NOSVE-NEXT: ldr w11, [sp, #112]389; NONEON-NOSVE-NEXT: and w10, w10, #0x8390; NONEON-NOSVE-NEXT: orr w9, w9, w10391; NONEON-NOSVE-NEXT: and w10, w12, #0x10392; NONEON-NOSVE-NEXT: sbfx w12, w4, #0, #1393; NONEON-NOSVE-NEXT: sbfx w11, w11, #0, #1394; NONEON-NOSVE-NEXT: orr w9, w9, w10395; NONEON-NOSVE-NEXT: sbfx w10, w13, #0, #1396; NONEON-NOSVE-NEXT: orr w8, w8, w9397; NONEON-NOSVE-NEXT: sbfx w13, w5, #0, #1398; NONEON-NOSVE-NEXT: and w12, w12, #0x8399; NONEON-NOSVE-NEXT: and w9, w11, #0x20400; NONEON-NOSVE-NEXT: and w10, w10, #0x40401; NONEON-NOSVE-NEXT: sbfx w11, w3, #0, #1402; NONEON-NOSVE-NEXT: orr w9, w9, w10403; NONEON-NOSVE-NEXT: sbfx w10, w2, #0, #1404; NONEON-NOSVE-NEXT: sbfx w14, w14, #0, #1405; NONEON-NOSVE-NEXT: and w11, w11, #0x4406; NONEON-NOSVE-NEXT: orr w8, w8, w9407; NONEON-NOSVE-NEXT: and w10, w10, #0x2408; NONEON-NOSVE-NEXT: orr w11, w11, w12409; NONEON-NOSVE-NEXT: and w12, w13, #0x10410; NONEON-NOSVE-NEXT: sbfx w13, w6, #0, #1411; NONEON-NOSVE-NEXT: bfxil w10, w1, #0, #1412; NONEON-NOSVE-NEXT: orr w11, w11, w12413; NONEON-NOSVE-NEXT: and w12, w13, #0x20414; NONEON-NOSVE-NEXT: and w13, w15, #0x40415; NONEON-NOSVE-NEXT: sbfx w15, w16, #0, #1416; NONEON-NOSVE-NEXT: orr w9, w10, w11417; NONEON-NOSVE-NEXT: orr w10, w12, w13418; NONEON-NOSVE-NEXT: and w11, w14, #0xff80419; NONEON-NOSVE-NEXT: orr w9, w9, w10420; NONEON-NOSVE-NEXT: and w10, w15, #0xff80421; NONEON-NOSVE-NEXT: add w11, w8, w11422; NONEON-NOSVE-NEXT: add w8, w9, w10423; NONEON-NOSVE-NEXT: bfi w8, w11, #16, #16424; NONEON-NOSVE-NEXT: tbnz w8, #0, .LBB3_33425; NONEON-NOSVE-NEXT: // %bb.1: // %else426; NONEON-NOSVE-NEXT: tbnz w8, #1, .LBB3_34427; NONEON-NOSVE-NEXT: .LBB3_2: // %else2428; NONEON-NOSVE-NEXT: tbnz w8, #2, .LBB3_35429; NONEON-NOSVE-NEXT: .LBB3_3: // %else4430; NONEON-NOSVE-NEXT: tbnz w8, #3, .LBB3_36431; NONEON-NOSVE-NEXT: .LBB3_4: // %else6432; NONEON-NOSVE-NEXT: tbnz w8, #4, .LBB3_37433; NONEON-NOSVE-NEXT: .LBB3_5: // %else8434; NONEON-NOSVE-NEXT: tbnz w8, #5, .LBB3_38435; NONEON-NOSVE-NEXT: .LBB3_6: // %else10436; NONEON-NOSVE-NEXT: tbnz w8, #6, .LBB3_39437; NONEON-NOSVE-NEXT: .LBB3_7: // %else12438; NONEON-NOSVE-NEXT: tbnz w8, #7, .LBB3_40439; NONEON-NOSVE-NEXT: .LBB3_8: // %else14440; NONEON-NOSVE-NEXT: tbnz w8, #8, .LBB3_41441; NONEON-NOSVE-NEXT: .LBB3_9: // %else16442; NONEON-NOSVE-NEXT: tbnz w8, #9, .LBB3_42443; NONEON-NOSVE-NEXT: .LBB3_10: // %else18444; NONEON-NOSVE-NEXT: tbnz w8, #10, .LBB3_43445; NONEON-NOSVE-NEXT: .LBB3_11: // %else20446; NONEON-NOSVE-NEXT: tbnz w8, #11, .LBB3_44447; NONEON-NOSVE-NEXT: .LBB3_12: // %else22448; NONEON-NOSVE-NEXT: tbnz w8, #12, .LBB3_45449; NONEON-NOSVE-NEXT: .LBB3_13: // %else24450; NONEON-NOSVE-NEXT: tbnz w8, #13, .LBB3_46451; NONEON-NOSVE-NEXT: .LBB3_14: // %else26452; NONEON-NOSVE-NEXT: tbnz w8, #14, .LBB3_47453; NONEON-NOSVE-NEXT: .LBB3_15: // %else28454; NONEON-NOSVE-NEXT: tbnz w8, #15, .LBB3_48455; NONEON-NOSVE-NEXT: .LBB3_16: // %else30456; NONEON-NOSVE-NEXT: tbnz w8, #16, .LBB3_49457; NONEON-NOSVE-NEXT: .LBB3_17: // %else32458; NONEON-NOSVE-NEXT: tbnz w8, #17, .LBB3_50459; NONEON-NOSVE-NEXT: .LBB3_18: // %else34460; NONEON-NOSVE-NEXT: tbnz w8, #18, .LBB3_51461; NONEON-NOSVE-NEXT: .LBB3_19: // %else36462; NONEON-NOSVE-NEXT: tbnz w8, #19, .LBB3_52463; NONEON-NOSVE-NEXT: .LBB3_20: // %else38464; NONEON-NOSVE-NEXT: tbnz w8, #20, .LBB3_53465; NONEON-NOSVE-NEXT: .LBB3_21: // %else40466; NONEON-NOSVE-NEXT: tbnz w8, #21, .LBB3_54467; NONEON-NOSVE-NEXT: .LBB3_22: // %else42468; NONEON-NOSVE-NEXT: tbnz w8, #22, .LBB3_55469; NONEON-NOSVE-NEXT: .LBB3_23: // %else44470; NONEON-NOSVE-NEXT: tbnz w8, #23, .LBB3_56471; NONEON-NOSVE-NEXT: .LBB3_24: // %else46472; NONEON-NOSVE-NEXT: tbnz w8, #24, .LBB3_57473; NONEON-NOSVE-NEXT: .LBB3_25: // %else48474; NONEON-NOSVE-NEXT: tbnz w8, #25, .LBB3_58475; NONEON-NOSVE-NEXT: .LBB3_26: // %else50476; NONEON-NOSVE-NEXT: tbnz w8, #26, .LBB3_59477; NONEON-NOSVE-NEXT: .LBB3_27: // %else52478; NONEON-NOSVE-NEXT: tbnz w8, #27, .LBB3_60479; NONEON-NOSVE-NEXT: .LBB3_28: // %else54480; NONEON-NOSVE-NEXT: tbnz w8, #28, .LBB3_61481; NONEON-NOSVE-NEXT: .LBB3_29: // %else56482; NONEON-NOSVE-NEXT: tbnz w8, #29, .LBB3_62483; NONEON-NOSVE-NEXT: .LBB3_30: // %else58484; NONEON-NOSVE-NEXT: tbnz w8, #30, .LBB3_63485; NONEON-NOSVE-NEXT: .LBB3_31: // %else60486; NONEON-NOSVE-NEXT: tbnz w8, #31, .LBB3_64487; NONEON-NOSVE-NEXT: .LBB3_32: // %else62488; NONEON-NOSVE-NEXT: ret489; NONEON-NOSVE-NEXT: .LBB3_33: // %cond.store490; NONEON-NOSVE-NEXT: strb wzr, [x0]491; NONEON-NOSVE-NEXT: tbz w8, #1, .LBB3_2492; NONEON-NOSVE-NEXT: .LBB3_34: // %cond.store1493; NONEON-NOSVE-NEXT: strb wzr, [x0, #1]494; NONEON-NOSVE-NEXT: tbz w8, #2, .LBB3_3495; NONEON-NOSVE-NEXT: .LBB3_35: // %cond.store3496; NONEON-NOSVE-NEXT: strb wzr, [x0, #2]497; NONEON-NOSVE-NEXT: tbz w8, #3, .LBB3_4498; NONEON-NOSVE-NEXT: .LBB3_36: // %cond.store5499; NONEON-NOSVE-NEXT: strb wzr, [x0, #3]500; NONEON-NOSVE-NEXT: tbz w8, #4, .LBB3_5501; NONEON-NOSVE-NEXT: .LBB3_37: // %cond.store7502; NONEON-NOSVE-NEXT: strb wzr, [x0, #4]503; NONEON-NOSVE-NEXT: tbz w8, #5, .LBB3_6504; NONEON-NOSVE-NEXT: .LBB3_38: // %cond.store9505; NONEON-NOSVE-NEXT: strb wzr, [x0, #5]506; NONEON-NOSVE-NEXT: tbz w8, #6, .LBB3_7507; NONEON-NOSVE-NEXT: .LBB3_39: // %cond.store11508; NONEON-NOSVE-NEXT: strb wzr, [x0, #6]509; NONEON-NOSVE-NEXT: tbz w8, #7, .LBB3_8510; NONEON-NOSVE-NEXT: .LBB3_40: // %cond.store13511; NONEON-NOSVE-NEXT: strb wzr, [x0, #7]512; NONEON-NOSVE-NEXT: tbz w8, #8, .LBB3_9513; NONEON-NOSVE-NEXT: .LBB3_41: // %cond.store15514; NONEON-NOSVE-NEXT: strb wzr, [x0, #8]515; NONEON-NOSVE-NEXT: tbz w8, #9, .LBB3_10516; NONEON-NOSVE-NEXT: .LBB3_42: // %cond.store17517; NONEON-NOSVE-NEXT: strb wzr, [x0, #9]518; NONEON-NOSVE-NEXT: tbz w8, #10, .LBB3_11519; NONEON-NOSVE-NEXT: .LBB3_43: // %cond.store19520; NONEON-NOSVE-NEXT: strb wzr, [x0, #10]521; NONEON-NOSVE-NEXT: tbz w8, #11, .LBB3_12522; NONEON-NOSVE-NEXT: .LBB3_44: // %cond.store21523; NONEON-NOSVE-NEXT: strb wzr, [x0, #11]524; NONEON-NOSVE-NEXT: tbz w8, #12, .LBB3_13525; NONEON-NOSVE-NEXT: .LBB3_45: // %cond.store23526; NONEON-NOSVE-NEXT: strb wzr, [x0, #12]527; NONEON-NOSVE-NEXT: tbz w8, #13, .LBB3_14528; NONEON-NOSVE-NEXT: .LBB3_46: // %cond.store25529; NONEON-NOSVE-NEXT: strb wzr, [x0, #13]530; NONEON-NOSVE-NEXT: tbz w8, #14, .LBB3_15531; NONEON-NOSVE-NEXT: .LBB3_47: // %cond.store27532; NONEON-NOSVE-NEXT: strb wzr, [x0, #14]533; NONEON-NOSVE-NEXT: tbz w8, #15, .LBB3_16534; NONEON-NOSVE-NEXT: .LBB3_48: // %cond.store29535; NONEON-NOSVE-NEXT: strb wzr, [x0, #15]536; NONEON-NOSVE-NEXT: tbz w8, #16, .LBB3_17537; NONEON-NOSVE-NEXT: .LBB3_49: // %cond.store31538; NONEON-NOSVE-NEXT: strb wzr, [x0, #16]539; NONEON-NOSVE-NEXT: tbz w8, #17, .LBB3_18540; NONEON-NOSVE-NEXT: .LBB3_50: // %cond.store33541; NONEON-NOSVE-NEXT: strb wzr, [x0, #17]542; NONEON-NOSVE-NEXT: tbz w8, #18, .LBB3_19543; NONEON-NOSVE-NEXT: .LBB3_51: // %cond.store35544; NONEON-NOSVE-NEXT: strb wzr, [x0, #18]545; NONEON-NOSVE-NEXT: tbz w8, #19, .LBB3_20546; NONEON-NOSVE-NEXT: .LBB3_52: // %cond.store37547; NONEON-NOSVE-NEXT: strb wzr, [x0, #19]548; NONEON-NOSVE-NEXT: tbz w8, #20, .LBB3_21549; NONEON-NOSVE-NEXT: .LBB3_53: // %cond.store39550; NONEON-NOSVE-NEXT: strb wzr, [x0, #20]551; NONEON-NOSVE-NEXT: tbz w8, #21, .LBB3_22552; NONEON-NOSVE-NEXT: .LBB3_54: // %cond.store41553; NONEON-NOSVE-NEXT: strb wzr, [x0, #21]554; NONEON-NOSVE-NEXT: tbz w8, #22, .LBB3_23555; NONEON-NOSVE-NEXT: .LBB3_55: // %cond.store43556; NONEON-NOSVE-NEXT: strb wzr, [x0, #22]557; NONEON-NOSVE-NEXT: tbz w8, #23, .LBB3_24558; NONEON-NOSVE-NEXT: .LBB3_56: // %cond.store45559; NONEON-NOSVE-NEXT: strb wzr, [x0, #23]560; NONEON-NOSVE-NEXT: tbz w8, #24, .LBB3_25561; NONEON-NOSVE-NEXT: .LBB3_57: // %cond.store47562; NONEON-NOSVE-NEXT: strb wzr, [x0, #24]563; NONEON-NOSVE-NEXT: tbz w8, #25, .LBB3_26564; NONEON-NOSVE-NEXT: .LBB3_58: // %cond.store49565; NONEON-NOSVE-NEXT: strb wzr, [x0, #25]566; NONEON-NOSVE-NEXT: tbz w8, #26, .LBB3_27567; NONEON-NOSVE-NEXT: .LBB3_59: // %cond.store51568; NONEON-NOSVE-NEXT: strb wzr, [x0, #26]569; NONEON-NOSVE-NEXT: tbz w8, #27, .LBB3_28570; NONEON-NOSVE-NEXT: .LBB3_60: // %cond.store53571; NONEON-NOSVE-NEXT: strb wzr, [x0, #27]572; NONEON-NOSVE-NEXT: tbz w8, #28, .LBB3_29573; NONEON-NOSVE-NEXT: .LBB3_61: // %cond.store55574; NONEON-NOSVE-NEXT: strb wzr, [x0, #28]575; NONEON-NOSVE-NEXT: tbz w8, #29, .LBB3_30576; NONEON-NOSVE-NEXT: .LBB3_62: // %cond.store57577; NONEON-NOSVE-NEXT: strb wzr, [x0, #29]578; NONEON-NOSVE-NEXT: tbz w8, #30, .LBB3_31579; NONEON-NOSVE-NEXT: .LBB3_63: // %cond.store59580; NONEON-NOSVE-NEXT: strb wzr, [x0, #30]581; NONEON-NOSVE-NEXT: tbz w8, #31, .LBB3_32582; NONEON-NOSVE-NEXT: .LBB3_64: // %cond.store61583; NONEON-NOSVE-NEXT: strb wzr, [x0, #31]584; NONEON-NOSVE-NEXT: ret585 call void @llvm.masked.store.v32i8(<32 x i8> zeroinitializer, ptr %dst, i32 8, <32 x i1> %mask)586 ret void587}588 589define void @masked_store_v2f16(ptr %dst, <2 x i1> %mask) {590; CHECK-LABEL: masked_store_v2f16:591; CHECK: // %bb.0:592; CHECK-NEXT: fmov s1, wzr593; CHECK-NEXT: // kill: def $d0 killed $d0 def $z0594; CHECK-NEXT: mov z2.s, z0.s[1]595; CHECK-NEXT: ptrue p0.h, vl4596; CHECK-NEXT: zip1 z0.h, z0.h, z2.h597; CHECK-NEXT: zip1 z1.h, z1.h, z1.h598; CHECK-NEXT: zip1 z0.s, z0.s, z1.s599; CHECK-NEXT: lsl z0.h, z0.h, #15600; CHECK-NEXT: asr z0.h, z0.h, #15601; CHECK-NEXT: cmpne p0.h, p0/z, z0.h, #0602; CHECK-NEXT: mov z0.h, #0 // =0x0603; CHECK-NEXT: st1h { z0.h }, p0, [x0]604; CHECK-NEXT: ret605;606; NONEON-NOSVE-LABEL: masked_store_v2f16:607; NONEON-NOSVE: // %bb.0:608; NONEON-NOSVE-NEXT: str d0, [sp, #-16]!609; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 16610; NONEON-NOSVE-NEXT: ldr w8, [sp, #4]611; NONEON-NOSVE-NEXT: ldrb w9, [sp]612; NONEON-NOSVE-NEXT: sbfx w8, w8, #0, #1613; NONEON-NOSVE-NEXT: and w8, w8, #0x2614; NONEON-NOSVE-NEXT: bfxil w8, w9, #0, #1615; NONEON-NOSVE-NEXT: tbnz w8, #0, .LBB4_3616; NONEON-NOSVE-NEXT: // %bb.1: // %else617; NONEON-NOSVE-NEXT: tbnz w8, #1, .LBB4_4618; NONEON-NOSVE-NEXT: .LBB4_2: // %else2619; NONEON-NOSVE-NEXT: add sp, sp, #16620; NONEON-NOSVE-NEXT: ret621; NONEON-NOSVE-NEXT: .LBB4_3: // %cond.store622; NONEON-NOSVE-NEXT: fmov s0, wzr623; NONEON-NOSVE-NEXT: str h0, [x0]624; NONEON-NOSVE-NEXT: tbz w8, #1, .LBB4_2625; NONEON-NOSVE-NEXT: .LBB4_4: // %cond.store1626; NONEON-NOSVE-NEXT: fmov s0, wzr627; NONEON-NOSVE-NEXT: str h0, [x0, #2]628; NONEON-NOSVE-NEXT: add sp, sp, #16629; NONEON-NOSVE-NEXT: ret630 call void @llvm.masked.store.v2f16(<2 x half> zeroinitializer, ptr %dst, i32 8, <2 x i1> %mask)631 ret void632}633 634define void @masked_store_v4f16(ptr %dst, <4 x i1> %mask) {635; CHECK-LABEL: masked_store_v4f16:636; CHECK: // %bb.0:637; CHECK-NEXT: // kill: def $d0 killed $d0 def $z0638; CHECK-NEXT: ptrue p0.h, vl4639; CHECK-NEXT: lsl z0.h, z0.h, #15640; CHECK-NEXT: asr z0.h, z0.h, #15641; CHECK-NEXT: cmpne p0.h, p0/z, z0.h, #0642; CHECK-NEXT: mov z0.h, #0 // =0x0643; CHECK-NEXT: st1h { z0.h }, p0, [x0]644; CHECK-NEXT: ret645;646; NONEON-NOSVE-LABEL: masked_store_v4f16:647; NONEON-NOSVE: // %bb.0:648; NONEON-NOSVE-NEXT: str d0, [sp, #-16]!649; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 16650; NONEON-NOSVE-NEXT: ldrh w8, [sp, #2]651; NONEON-NOSVE-NEXT: ldrh w9, [sp, #4]652; NONEON-NOSVE-NEXT: ldrh w10, [sp, #6]653; NONEON-NOSVE-NEXT: ldrh w11, [sp]654; NONEON-NOSVE-NEXT: sbfx w8, w8, #0, #1655; NONEON-NOSVE-NEXT: sbfx w9, w9, #0, #1656; NONEON-NOSVE-NEXT: sbfx w10, w10, #0, #1657; NONEON-NOSVE-NEXT: and w8, w8, #0x2658; NONEON-NOSVE-NEXT: and w9, w9, #0x4659; NONEON-NOSVE-NEXT: and w10, w10, #0x8660; NONEON-NOSVE-NEXT: bfxil w8, w11, #0, #1661; NONEON-NOSVE-NEXT: orr w9, w9, w10662; NONEON-NOSVE-NEXT: orr w8, w8, w9663; NONEON-NOSVE-NEXT: tbnz w8, #0, .LBB5_5664; NONEON-NOSVE-NEXT: // %bb.1: // %else665; NONEON-NOSVE-NEXT: tbnz w8, #1, .LBB5_6666; NONEON-NOSVE-NEXT: .LBB5_2: // %else2667; NONEON-NOSVE-NEXT: tbnz w8, #2, .LBB5_7668; NONEON-NOSVE-NEXT: .LBB5_3: // %else4669; NONEON-NOSVE-NEXT: tbnz w8, #3, .LBB5_8670; NONEON-NOSVE-NEXT: .LBB5_4: // %else6671; NONEON-NOSVE-NEXT: add sp, sp, #16672; NONEON-NOSVE-NEXT: ret673; NONEON-NOSVE-NEXT: .LBB5_5: // %cond.store674; NONEON-NOSVE-NEXT: fmov s0, wzr675; NONEON-NOSVE-NEXT: str h0, [x0]676; NONEON-NOSVE-NEXT: tbz w8, #1, .LBB5_2677; NONEON-NOSVE-NEXT: .LBB5_6: // %cond.store1678; NONEON-NOSVE-NEXT: fmov s0, wzr679; NONEON-NOSVE-NEXT: str h0, [x0, #2]680; NONEON-NOSVE-NEXT: tbz w8, #2, .LBB5_3681; NONEON-NOSVE-NEXT: .LBB5_7: // %cond.store3682; NONEON-NOSVE-NEXT: fmov s0, wzr683; NONEON-NOSVE-NEXT: str h0, [x0, #4]684; NONEON-NOSVE-NEXT: tbz w8, #3, .LBB5_4685; NONEON-NOSVE-NEXT: .LBB5_8: // %cond.store5686; NONEON-NOSVE-NEXT: fmov s0, wzr687; NONEON-NOSVE-NEXT: str h0, [x0, #6]688; NONEON-NOSVE-NEXT: add sp, sp, #16689; NONEON-NOSVE-NEXT: ret690 call void @llvm.masked.store.v4f16(<4 x half> zeroinitializer, ptr %dst, i32 8, <4 x i1> %mask)691 ret void692}693 694define void @masked_store_v8f16(ptr %dst, <8 x i1> %mask) {695; CHECK-LABEL: masked_store_v8f16:696; CHECK: // %bb.0:697; CHECK-NEXT: // kill: def $d0 killed $d0 def $z0698; CHECK-NEXT: ptrue p0.h, vl8699; CHECK-NEXT: uunpklo z0.h, z0.b700; CHECK-NEXT: lsl z0.h, z0.h, #15701; CHECK-NEXT: asr z0.h, z0.h, #15702; CHECK-NEXT: cmpne p0.h, p0/z, z0.h, #0703; CHECK-NEXT: mov z0.h, #0 // =0x0704; CHECK-NEXT: st1h { z0.h }, p0, [x0]705; CHECK-NEXT: ret706;707; NONEON-NOSVE-LABEL: masked_store_v8f16:708; NONEON-NOSVE: // %bb.0:709; NONEON-NOSVE-NEXT: str d0, [sp, #-16]!710; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 16711; NONEON-NOSVE-NEXT: ldrb w8, [sp, #2]712; NONEON-NOSVE-NEXT: ldrb w9, [sp, #3]713; NONEON-NOSVE-NEXT: ldrb w10, [sp, #1]714; NONEON-NOSVE-NEXT: ldrb w12, [sp, #4]715; NONEON-NOSVE-NEXT: ldrb w13, [sp, #5]716; NONEON-NOSVE-NEXT: ldrb w14, [sp, #6]717; NONEON-NOSVE-NEXT: sbfx w8, w8, #0, #1718; NONEON-NOSVE-NEXT: sbfx w9, w9, #0, #1719; NONEON-NOSVE-NEXT: sbfx w10, w10, #0, #1720; NONEON-NOSVE-NEXT: ldrb w11, [sp]721; NONEON-NOSVE-NEXT: sbfx w12, w12, #0, #1722; NONEON-NOSVE-NEXT: sbfx w13, w13, #0, #1723; NONEON-NOSVE-NEXT: and w8, w8, #0x4724; NONEON-NOSVE-NEXT: and w9, w9, #0x8725; NONEON-NOSVE-NEXT: sbfx w14, w14, #0, #1726; NONEON-NOSVE-NEXT: orr w8, w8, w9727; NONEON-NOSVE-NEXT: ldrb w9, [sp, #7]728; NONEON-NOSVE-NEXT: and w10, w10, #0x2729; NONEON-NOSVE-NEXT: and w12, w12, #0x10730; NONEON-NOSVE-NEXT: bfxil w10, w11, #0, #1731; NONEON-NOSVE-NEXT: and w11, w13, #0x20732; NONEON-NOSVE-NEXT: orr w8, w8, w12733; NONEON-NOSVE-NEXT: and w12, w14, #0x40734; NONEON-NOSVE-NEXT: sbfx w9, w9, #0, #1735; NONEON-NOSVE-NEXT: orr w8, w10, w8736; NONEON-NOSVE-NEXT: orr w10, w11, w12737; NONEON-NOSVE-NEXT: orr w8, w8, w10738; NONEON-NOSVE-NEXT: and w9, w9, #0x80739; NONEON-NOSVE-NEXT: add w9, w8, w9740; NONEON-NOSVE-NEXT: and w8, w9, #0xff741; NONEON-NOSVE-NEXT: tbnz w9, #0, .LBB6_9742; NONEON-NOSVE-NEXT: // %bb.1: // %else743; NONEON-NOSVE-NEXT: tbnz w8, #1, .LBB6_10744; NONEON-NOSVE-NEXT: .LBB6_2: // %else2745; NONEON-NOSVE-NEXT: tbnz w8, #2, .LBB6_11746; NONEON-NOSVE-NEXT: .LBB6_3: // %else4747; NONEON-NOSVE-NEXT: tbnz w8, #3, .LBB6_12748; NONEON-NOSVE-NEXT: .LBB6_4: // %else6749; NONEON-NOSVE-NEXT: tbnz w8, #4, .LBB6_13750; NONEON-NOSVE-NEXT: .LBB6_5: // %else8751; NONEON-NOSVE-NEXT: tbnz w8, #5, .LBB6_14752; NONEON-NOSVE-NEXT: .LBB6_6: // %else10753; NONEON-NOSVE-NEXT: tbnz w8, #6, .LBB6_15754; NONEON-NOSVE-NEXT: .LBB6_7: // %else12755; NONEON-NOSVE-NEXT: tbnz w8, #7, .LBB6_16756; NONEON-NOSVE-NEXT: .LBB6_8: // %else14757; NONEON-NOSVE-NEXT: add sp, sp, #16758; NONEON-NOSVE-NEXT: ret759; NONEON-NOSVE-NEXT: .LBB6_9: // %cond.store760; NONEON-NOSVE-NEXT: fmov s0, wzr761; NONEON-NOSVE-NEXT: str h0, [x0]762; NONEON-NOSVE-NEXT: tbz w8, #1, .LBB6_2763; NONEON-NOSVE-NEXT: .LBB6_10: // %cond.store1764; NONEON-NOSVE-NEXT: fmov s0, wzr765; NONEON-NOSVE-NEXT: str h0, [x0, #2]766; NONEON-NOSVE-NEXT: tbz w8, #2, .LBB6_3767; NONEON-NOSVE-NEXT: .LBB6_11: // %cond.store3768; NONEON-NOSVE-NEXT: fmov s0, wzr769; NONEON-NOSVE-NEXT: str h0, [x0, #4]770; NONEON-NOSVE-NEXT: tbz w8, #3, .LBB6_4771; NONEON-NOSVE-NEXT: .LBB6_12: // %cond.store5772; NONEON-NOSVE-NEXT: fmov s0, wzr773; NONEON-NOSVE-NEXT: str h0, [x0, #6]774; NONEON-NOSVE-NEXT: tbz w8, #4, .LBB6_5775; NONEON-NOSVE-NEXT: .LBB6_13: // %cond.store7776; NONEON-NOSVE-NEXT: fmov s0, wzr777; NONEON-NOSVE-NEXT: str h0, [x0, #8]778; NONEON-NOSVE-NEXT: tbz w8, #5, .LBB6_6779; NONEON-NOSVE-NEXT: .LBB6_14: // %cond.store9780; NONEON-NOSVE-NEXT: fmov s0, wzr781; NONEON-NOSVE-NEXT: str h0, [x0, #10]782; NONEON-NOSVE-NEXT: tbz w8, #6, .LBB6_7783; NONEON-NOSVE-NEXT: .LBB6_15: // %cond.store11784; NONEON-NOSVE-NEXT: fmov s0, wzr785; NONEON-NOSVE-NEXT: str h0, [x0, #12]786; NONEON-NOSVE-NEXT: tbz w8, #7, .LBB6_8787; NONEON-NOSVE-NEXT: .LBB6_16: // %cond.store13788; NONEON-NOSVE-NEXT: fmov s0, wzr789; NONEON-NOSVE-NEXT: str h0, [x0, #14]790; NONEON-NOSVE-NEXT: add sp, sp, #16791; NONEON-NOSVE-NEXT: ret792 call void @llvm.masked.store.v8f16(<8 x half> zeroinitializer, ptr %dst, i32 8, <8 x i1> %mask)793 ret void794}795 796define void @masked_store_v16f16(ptr %dst, <16 x i1> %mask) {797; CHECK-LABEL: masked_store_v16f16:798; CHECK: // %bb.0:799; CHECK-NEXT: // kill: def $q0 killed $q0 def $z0800; CHECK-NEXT: movprfx z1, z0801; CHECK-NEXT: ext z1.b, z1.b, z0.b, #8802; CHECK-NEXT: ptrue p0.h, vl8803; CHECK-NEXT: mov x8, #8 // =0x8804; CHECK-NEXT: uunpklo z0.h, z0.b805; CHECK-NEXT: uunpklo z1.h, z1.b806; CHECK-NEXT: lsl z0.h, z0.h, #15807; CHECK-NEXT: lsl z1.h, z1.h, #15808; CHECK-NEXT: asr z0.h, z0.h, #15809; CHECK-NEXT: asr z1.h, z1.h, #15810; CHECK-NEXT: cmpne p1.h, p0/z, z1.h, #0811; CHECK-NEXT: cmpne p0.h, p0/z, z0.h, #0812; CHECK-NEXT: mov z1.h, #0 // =0x0813; CHECK-NEXT: st1h { z1.h }, p1, [x0, x8, lsl #1]814; CHECK-NEXT: st1h { z1.h }, p0, [x0]815; CHECK-NEXT: ret816;817; NONEON-NOSVE-LABEL: masked_store_v16f16:818; NONEON-NOSVE: // %bb.0:819; NONEON-NOSVE-NEXT: str q0, [sp, #-16]!820; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 16821; NONEON-NOSVE-NEXT: ldrb w8, [sp, #2]822; NONEON-NOSVE-NEXT: ldrb w9, [sp, #3]823; NONEON-NOSVE-NEXT: ldrb w10, [sp, #1]824; NONEON-NOSVE-NEXT: ldrb w12, [sp, #4]825; NONEON-NOSVE-NEXT: ldrb w13, [sp, #5]826; NONEON-NOSVE-NEXT: ldrb w14, [sp, #6]827; NONEON-NOSVE-NEXT: sbfx w8, w8, #0, #1828; NONEON-NOSVE-NEXT: sbfx w9, w9, #0, #1829; NONEON-NOSVE-NEXT: sbfx w10, w10, #0, #1830; NONEON-NOSVE-NEXT: ldrb w11, [sp]831; NONEON-NOSVE-NEXT: sbfx w12, w12, #0, #1832; NONEON-NOSVE-NEXT: sbfx w13, w13, #0, #1833; NONEON-NOSVE-NEXT: and w8, w8, #0x4834; NONEON-NOSVE-NEXT: and w9, w9, #0x8835; NONEON-NOSVE-NEXT: sbfx w14, w14, #0, #1836; NONEON-NOSVE-NEXT: orr w8, w8, w9837; NONEON-NOSVE-NEXT: ldrb w9, [sp, #7]838; NONEON-NOSVE-NEXT: and w10, w10, #0x2839; NONEON-NOSVE-NEXT: and w12, w12, #0x10840; NONEON-NOSVE-NEXT: bfxil w10, w11, #0, #1841; NONEON-NOSVE-NEXT: and w11, w13, #0x20842; NONEON-NOSVE-NEXT: orr w8, w8, w12843; NONEON-NOSVE-NEXT: and w12, w14, #0x40844; NONEON-NOSVE-NEXT: sbfx w9, w9, #0, #1845; NONEON-NOSVE-NEXT: orr w8, w10, w8846; NONEON-NOSVE-NEXT: orr w10, w11, w12847; NONEON-NOSVE-NEXT: orr w8, w8, w10848; NONEON-NOSVE-NEXT: and w9, w9, #0xffffff80849; NONEON-NOSVE-NEXT: add w8, w8, w9850; NONEON-NOSVE-NEXT: tbnz w8, #0, .LBB7_17851; NONEON-NOSVE-NEXT: // %bb.1: // %else852; NONEON-NOSVE-NEXT: tbnz w8, #1, .LBB7_18853; NONEON-NOSVE-NEXT: .LBB7_2: // %else2854; NONEON-NOSVE-NEXT: tbnz w8, #2, .LBB7_19855; NONEON-NOSVE-NEXT: .LBB7_3: // %else4856; NONEON-NOSVE-NEXT: tbnz w8, #3, .LBB7_20857; NONEON-NOSVE-NEXT: .LBB7_4: // %else6858; NONEON-NOSVE-NEXT: tbnz w8, #4, .LBB7_21859; NONEON-NOSVE-NEXT: .LBB7_5: // %else8860; NONEON-NOSVE-NEXT: tbnz w8, #5, .LBB7_22861; NONEON-NOSVE-NEXT: .LBB7_6: // %else10862; NONEON-NOSVE-NEXT: tbnz w8, #6, .LBB7_23863; NONEON-NOSVE-NEXT: .LBB7_7: // %else12864; NONEON-NOSVE-NEXT: tbnz w8, #7, .LBB7_24865; NONEON-NOSVE-NEXT: .LBB7_8: // %else14866; NONEON-NOSVE-NEXT: tbnz w8, #8, .LBB7_25867; NONEON-NOSVE-NEXT: .LBB7_9: // %else16868; NONEON-NOSVE-NEXT: tbnz w8, #9, .LBB7_26869; NONEON-NOSVE-NEXT: .LBB7_10: // %else18870; NONEON-NOSVE-NEXT: tbnz w8, #10, .LBB7_27871; NONEON-NOSVE-NEXT: .LBB7_11: // %else20872; NONEON-NOSVE-NEXT: tbnz w8, #11, .LBB7_28873; NONEON-NOSVE-NEXT: .LBB7_12: // %else22874; NONEON-NOSVE-NEXT: tbnz w8, #12, .LBB7_29875; NONEON-NOSVE-NEXT: .LBB7_13: // %else24876; NONEON-NOSVE-NEXT: tbnz w8, #13, .LBB7_30877; NONEON-NOSVE-NEXT: .LBB7_14: // %else26878; NONEON-NOSVE-NEXT: tbnz w8, #14, .LBB7_31879; NONEON-NOSVE-NEXT: .LBB7_15: // %else28880; NONEON-NOSVE-NEXT: tbnz w8, #15, .LBB7_32881; NONEON-NOSVE-NEXT: .LBB7_16: // %else30882; NONEON-NOSVE-NEXT: add sp, sp, #16883; NONEON-NOSVE-NEXT: ret884; NONEON-NOSVE-NEXT: .LBB7_17: // %cond.store885; NONEON-NOSVE-NEXT: fmov s0, wzr886; NONEON-NOSVE-NEXT: str h0, [x0]887; NONEON-NOSVE-NEXT: tbz w8, #1, .LBB7_2888; NONEON-NOSVE-NEXT: .LBB7_18: // %cond.store1889; NONEON-NOSVE-NEXT: fmov s0, wzr890; NONEON-NOSVE-NEXT: str h0, [x0, #2]891; NONEON-NOSVE-NEXT: tbz w8, #2, .LBB7_3892; NONEON-NOSVE-NEXT: .LBB7_19: // %cond.store3893; NONEON-NOSVE-NEXT: fmov s0, wzr894; NONEON-NOSVE-NEXT: str h0, [x0, #4]895; NONEON-NOSVE-NEXT: tbz w8, #3, .LBB7_4896; NONEON-NOSVE-NEXT: .LBB7_20: // %cond.store5897; NONEON-NOSVE-NEXT: fmov s0, wzr898; NONEON-NOSVE-NEXT: str h0, [x0, #6]899; NONEON-NOSVE-NEXT: tbz w8, #4, .LBB7_5900; NONEON-NOSVE-NEXT: .LBB7_21: // %cond.store7901; NONEON-NOSVE-NEXT: fmov s0, wzr902; NONEON-NOSVE-NEXT: str h0, [x0, #8]903; NONEON-NOSVE-NEXT: tbz w8, #5, .LBB7_6904; NONEON-NOSVE-NEXT: .LBB7_22: // %cond.store9905; NONEON-NOSVE-NEXT: fmov s0, wzr906; NONEON-NOSVE-NEXT: str h0, [x0, #10]907; NONEON-NOSVE-NEXT: tbz w8, #6, .LBB7_7908; NONEON-NOSVE-NEXT: .LBB7_23: // %cond.store11909; NONEON-NOSVE-NEXT: fmov s0, wzr910; NONEON-NOSVE-NEXT: str h0, [x0, #12]911; NONEON-NOSVE-NEXT: tbz w8, #7, .LBB7_8912; NONEON-NOSVE-NEXT: .LBB7_24: // %cond.store13913; NONEON-NOSVE-NEXT: fmov s0, wzr914; NONEON-NOSVE-NEXT: str h0, [x0, #14]915; NONEON-NOSVE-NEXT: tbz w8, #8, .LBB7_9916; NONEON-NOSVE-NEXT: .LBB7_25: // %cond.store15917; NONEON-NOSVE-NEXT: fmov s0, wzr918; NONEON-NOSVE-NEXT: str h0, [x0, #16]919; NONEON-NOSVE-NEXT: tbz w8, #9, .LBB7_10920; NONEON-NOSVE-NEXT: .LBB7_26: // %cond.store17921; NONEON-NOSVE-NEXT: fmov s0, wzr922; NONEON-NOSVE-NEXT: str h0, [x0, #18]923; NONEON-NOSVE-NEXT: tbz w8, #10, .LBB7_11924; NONEON-NOSVE-NEXT: .LBB7_27: // %cond.store19925; NONEON-NOSVE-NEXT: fmov s0, wzr926; NONEON-NOSVE-NEXT: str h0, [x0, #20]927; NONEON-NOSVE-NEXT: tbz w8, #11, .LBB7_12928; NONEON-NOSVE-NEXT: .LBB7_28: // %cond.store21929; NONEON-NOSVE-NEXT: fmov s0, wzr930; NONEON-NOSVE-NEXT: str h0, [x0, #22]931; NONEON-NOSVE-NEXT: tbz w8, #12, .LBB7_13932; NONEON-NOSVE-NEXT: .LBB7_29: // %cond.store23933; NONEON-NOSVE-NEXT: fmov s0, wzr934; NONEON-NOSVE-NEXT: str h0, [x0, #24]935; NONEON-NOSVE-NEXT: tbz w8, #13, .LBB7_14936; NONEON-NOSVE-NEXT: .LBB7_30: // %cond.store25937; NONEON-NOSVE-NEXT: fmov s0, wzr938; NONEON-NOSVE-NEXT: str h0, [x0, #26]939; NONEON-NOSVE-NEXT: tbz w8, #14, .LBB7_15940; NONEON-NOSVE-NEXT: .LBB7_31: // %cond.store27941; NONEON-NOSVE-NEXT: fmov s0, wzr942; NONEON-NOSVE-NEXT: str h0, [x0, #28]943; NONEON-NOSVE-NEXT: tbz w8, #15, .LBB7_16944; NONEON-NOSVE-NEXT: .LBB7_32: // %cond.store29945; NONEON-NOSVE-NEXT: fmov s0, wzr946; NONEON-NOSVE-NEXT: str h0, [x0, #30]947; NONEON-NOSVE-NEXT: add sp, sp, #16948; NONEON-NOSVE-NEXT: ret949 call void @llvm.masked.store.v16f16(<16 x half> zeroinitializer, ptr %dst, i32 8, <16 x i1> %mask)950 ret void951}952 953define void @masked_store_v4f32(ptr %dst, <4 x i1> %mask) {954; CHECK-LABEL: masked_store_v4f32:955; CHECK: // %bb.0:956; CHECK-NEXT: // kill: def $d0 killed $d0 def $z0957; CHECK-NEXT: ptrue p0.s, vl4958; CHECK-NEXT: uunpklo z0.s, z0.h959; CHECK-NEXT: lsl z0.s, z0.s, #31960; CHECK-NEXT: asr z0.s, z0.s, #31961; CHECK-NEXT: cmpne p0.s, p0/z, z0.s, #0962; CHECK-NEXT: mov z0.s, #0 // =0x0963; CHECK-NEXT: st1w { z0.s }, p0, [x0]964; CHECK-NEXT: ret965;966; NONEON-NOSVE-LABEL: masked_store_v4f32:967; NONEON-NOSVE: // %bb.0:968; NONEON-NOSVE-NEXT: str d0, [sp, #-16]!969; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 16970; NONEON-NOSVE-NEXT: ldrh w8, [sp, #2]971; NONEON-NOSVE-NEXT: ldrh w9, [sp, #4]972; NONEON-NOSVE-NEXT: ldrh w10, [sp, #6]973; NONEON-NOSVE-NEXT: ldrh w11, [sp]974; NONEON-NOSVE-NEXT: sbfx w8, w8, #0, #1975; NONEON-NOSVE-NEXT: sbfx w9, w9, #0, #1976; NONEON-NOSVE-NEXT: sbfx w10, w10, #0, #1977; NONEON-NOSVE-NEXT: and w8, w8, #0x2978; NONEON-NOSVE-NEXT: and w9, w9, #0x4979; NONEON-NOSVE-NEXT: and w10, w10, #0x8980; NONEON-NOSVE-NEXT: bfxil w8, w11, #0, #1981; NONEON-NOSVE-NEXT: orr w9, w9, w10982; NONEON-NOSVE-NEXT: orr w8, w8, w9983; NONEON-NOSVE-NEXT: tbnz w8, #0, .LBB8_5984; NONEON-NOSVE-NEXT: // %bb.1: // %else985; NONEON-NOSVE-NEXT: tbnz w8, #1, .LBB8_6986; NONEON-NOSVE-NEXT: .LBB8_2: // %else2987; NONEON-NOSVE-NEXT: tbnz w8, #2, .LBB8_7988; NONEON-NOSVE-NEXT: .LBB8_3: // %else4989; NONEON-NOSVE-NEXT: tbnz w8, #3, .LBB8_8990; NONEON-NOSVE-NEXT: .LBB8_4: // %else6991; NONEON-NOSVE-NEXT: add sp, sp, #16992; NONEON-NOSVE-NEXT: ret993; NONEON-NOSVE-NEXT: .LBB8_5: // %cond.store994; NONEON-NOSVE-NEXT: str wzr, [x0]995; NONEON-NOSVE-NEXT: tbz w8, #1, .LBB8_2996; NONEON-NOSVE-NEXT: .LBB8_6: // %cond.store1997; NONEON-NOSVE-NEXT: str wzr, [x0, #4]998; NONEON-NOSVE-NEXT: tbz w8, #2, .LBB8_3999; NONEON-NOSVE-NEXT: .LBB8_7: // %cond.store31000; NONEON-NOSVE-NEXT: str wzr, [x0, #8]1001; NONEON-NOSVE-NEXT: tbz w8, #3, .LBB8_41002; NONEON-NOSVE-NEXT: .LBB8_8: // %cond.store51003; NONEON-NOSVE-NEXT: str wzr, [x0, #12]1004; NONEON-NOSVE-NEXT: add sp, sp, #161005; NONEON-NOSVE-NEXT: ret1006 call void @llvm.masked.store.v4f32(<4 x float> zeroinitializer, ptr %dst, i32 8, <4 x i1> %mask)1007 ret void1008}1009 1010define void @masked_store_v8f32(ptr %dst, <8 x i1> %mask) {1011; CHECK-LABEL: masked_store_v8f32:1012; CHECK: // %bb.0:1013; CHECK-NEXT: // kill: def $d0 killed $d0 def $z01014; CHECK-NEXT: mov z1.b, z0.b[7]1015; CHECK-NEXT: mov z2.b, z0.b[6]1016; CHECK-NEXT: mov x8, #4 // =0x41017; CHECK-NEXT: mov z3.b, z0.b[5]1018; CHECK-NEXT: mov z4.b, z0.b[4]1019; CHECK-NEXT: mov z5.b, z0.b[3]1020; CHECK-NEXT: mov z6.b, z0.b[2]1021; CHECK-NEXT: mov z7.b, z0.b[1]1022; CHECK-NEXT: ptrue p0.s, vl41023; CHECK-NEXT: zip1 z1.h, z2.h, z1.h1024; CHECK-NEXT: zip1 z2.h, z4.h, z3.h1025; CHECK-NEXT: zip1 z3.h, z6.h, z5.h1026; CHECK-NEXT: zip1 z0.h, z0.h, z7.h1027; CHECK-NEXT: zip1 z1.s, z2.s, z1.s1028; CHECK-NEXT: zip1 z0.s, z0.s, z3.s1029; CHECK-NEXT: uunpklo z1.s, z1.h1030; CHECK-NEXT: uunpklo z0.s, z0.h1031; CHECK-NEXT: lsl z1.s, z1.s, #311032; CHECK-NEXT: lsl z0.s, z0.s, #311033; CHECK-NEXT: asr z1.s, z1.s, #311034; CHECK-NEXT: asr z0.s, z0.s, #311035; CHECK-NEXT: cmpne p1.s, p0/z, z1.s, #01036; CHECK-NEXT: mov z1.s, #0 // =0x01037; CHECK-NEXT: cmpne p0.s, p0/z, z0.s, #01038; CHECK-NEXT: st1w { z1.s }, p1, [x0, x8, lsl #2]1039; CHECK-NEXT: st1w { z1.s }, p0, [x0]1040; CHECK-NEXT: ret1041;1042; NONEON-NOSVE-LABEL: masked_store_v8f32:1043; NONEON-NOSVE: // %bb.0:1044; NONEON-NOSVE-NEXT: str d0, [sp, #-16]!1045; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 161046; NONEON-NOSVE-NEXT: ldrb w8, [sp, #2]1047; NONEON-NOSVE-NEXT: ldrb w9, [sp, #3]1048; NONEON-NOSVE-NEXT: ldrb w10, [sp, #1]1049; NONEON-NOSVE-NEXT: ldrb w12, [sp, #4]1050; NONEON-NOSVE-NEXT: ldrb w13, [sp, #5]1051; NONEON-NOSVE-NEXT: ldrb w14, [sp, #6]1052; NONEON-NOSVE-NEXT: sbfx w8, w8, #0, #11053; NONEON-NOSVE-NEXT: sbfx w9, w9, #0, #11054; NONEON-NOSVE-NEXT: sbfx w10, w10, #0, #11055; NONEON-NOSVE-NEXT: ldrb w11, [sp]1056; NONEON-NOSVE-NEXT: sbfx w12, w12, #0, #11057; NONEON-NOSVE-NEXT: sbfx w13, w13, #0, #11058; NONEON-NOSVE-NEXT: and w8, w8, #0x41059; NONEON-NOSVE-NEXT: and w9, w9, #0x81060; NONEON-NOSVE-NEXT: sbfx w14, w14, #0, #11061; NONEON-NOSVE-NEXT: orr w8, w8, w91062; NONEON-NOSVE-NEXT: ldrb w9, [sp, #7]1063; NONEON-NOSVE-NEXT: and w10, w10, #0x21064; NONEON-NOSVE-NEXT: and w12, w12, #0x101065; NONEON-NOSVE-NEXT: bfxil w10, w11, #0, #11066; NONEON-NOSVE-NEXT: and w11, w13, #0x201067; NONEON-NOSVE-NEXT: orr w8, w8, w121068; NONEON-NOSVE-NEXT: and w12, w14, #0x401069; NONEON-NOSVE-NEXT: sbfx w9, w9, #0, #11070; NONEON-NOSVE-NEXT: orr w8, w10, w81071; NONEON-NOSVE-NEXT: orr w10, w11, w121072; NONEON-NOSVE-NEXT: orr w8, w8, w101073; NONEON-NOSVE-NEXT: and w9, w9, #0x801074; NONEON-NOSVE-NEXT: add w9, w8, w91075; NONEON-NOSVE-NEXT: and w8, w9, #0xff1076; NONEON-NOSVE-NEXT: tbnz w9, #0, .LBB9_91077; NONEON-NOSVE-NEXT: // %bb.1: // %else1078; NONEON-NOSVE-NEXT: tbnz w8, #1, .LBB9_101079; NONEON-NOSVE-NEXT: .LBB9_2: // %else21080; NONEON-NOSVE-NEXT: tbnz w8, #2, .LBB9_111081; NONEON-NOSVE-NEXT: .LBB9_3: // %else41082; NONEON-NOSVE-NEXT: tbnz w8, #3, .LBB9_121083; NONEON-NOSVE-NEXT: .LBB9_4: // %else61084; NONEON-NOSVE-NEXT: tbnz w8, #4, .LBB9_131085; NONEON-NOSVE-NEXT: .LBB9_5: // %else81086; NONEON-NOSVE-NEXT: tbnz w8, #5, .LBB9_141087; NONEON-NOSVE-NEXT: .LBB9_6: // %else101088; NONEON-NOSVE-NEXT: tbnz w8, #6, .LBB9_151089; NONEON-NOSVE-NEXT: .LBB9_7: // %else121090; NONEON-NOSVE-NEXT: tbnz w8, #7, .LBB9_161091; NONEON-NOSVE-NEXT: .LBB9_8: // %else141092; NONEON-NOSVE-NEXT: add sp, sp, #161093; NONEON-NOSVE-NEXT: ret1094; NONEON-NOSVE-NEXT: .LBB9_9: // %cond.store1095; NONEON-NOSVE-NEXT: str wzr, [x0]1096; NONEON-NOSVE-NEXT: tbz w8, #1, .LBB9_21097; NONEON-NOSVE-NEXT: .LBB9_10: // %cond.store11098; NONEON-NOSVE-NEXT: str wzr, [x0, #4]1099; NONEON-NOSVE-NEXT: tbz w8, #2, .LBB9_31100; NONEON-NOSVE-NEXT: .LBB9_11: // %cond.store31101; NONEON-NOSVE-NEXT: str wzr, [x0, #8]1102; NONEON-NOSVE-NEXT: tbz w8, #3, .LBB9_41103; NONEON-NOSVE-NEXT: .LBB9_12: // %cond.store51104; NONEON-NOSVE-NEXT: str wzr, [x0, #12]1105; NONEON-NOSVE-NEXT: tbz w8, #4, .LBB9_51106; NONEON-NOSVE-NEXT: .LBB9_13: // %cond.store71107; NONEON-NOSVE-NEXT: str wzr, [x0, #16]1108; NONEON-NOSVE-NEXT: tbz w8, #5, .LBB9_61109; NONEON-NOSVE-NEXT: .LBB9_14: // %cond.store91110; NONEON-NOSVE-NEXT: str wzr, [x0, #20]1111; NONEON-NOSVE-NEXT: tbz w8, #6, .LBB9_71112; NONEON-NOSVE-NEXT: .LBB9_15: // %cond.store111113; NONEON-NOSVE-NEXT: str wzr, [x0, #24]1114; NONEON-NOSVE-NEXT: tbz w8, #7, .LBB9_81115; NONEON-NOSVE-NEXT: .LBB9_16: // %cond.store131116; NONEON-NOSVE-NEXT: str wzr, [x0, #28]1117; NONEON-NOSVE-NEXT: add sp, sp, #161118; NONEON-NOSVE-NEXT: ret1119 call void @llvm.masked.store.v8f32(<8 x float> zeroinitializer, ptr %dst, i32 8, <8 x i1> %mask)1120 ret void1121}1122 1123define void @masked_store_v2f64(ptr %dst, <2 x i1> %mask) {1124; CHECK-LABEL: masked_store_v2f64:1125; CHECK: // %bb.0:1126; CHECK-NEXT: // kill: def $d0 killed $d0 def $z01127; CHECK-NEXT: ptrue p0.d, vl21128; CHECK-NEXT: uunpklo z0.d, z0.s1129; CHECK-NEXT: lsl z0.d, z0.d, #631130; CHECK-NEXT: asr z0.d, z0.d, #631131; CHECK-NEXT: cmpne p0.d, p0/z, z0.d, #01132; CHECK-NEXT: mov z0.d, #0 // =0x01133; CHECK-NEXT: st1d { z0.d }, p0, [x0]1134; CHECK-NEXT: ret1135;1136; NONEON-NOSVE-LABEL: masked_store_v2f64:1137; NONEON-NOSVE: // %bb.0:1138; NONEON-NOSVE-NEXT: str d0, [sp, #-16]!1139; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 161140; NONEON-NOSVE-NEXT: ldr w8, [sp, #4]1141; NONEON-NOSVE-NEXT: ldrb w9, [sp]1142; NONEON-NOSVE-NEXT: sbfx w8, w8, #0, #11143; NONEON-NOSVE-NEXT: and w8, w8, #0x21144; NONEON-NOSVE-NEXT: bfxil w8, w9, #0, #11145; NONEON-NOSVE-NEXT: tbnz w8, #0, .LBB10_31146; NONEON-NOSVE-NEXT: // %bb.1: // %else1147; NONEON-NOSVE-NEXT: tbnz w8, #1, .LBB10_41148; NONEON-NOSVE-NEXT: .LBB10_2: // %else21149; NONEON-NOSVE-NEXT: add sp, sp, #161150; NONEON-NOSVE-NEXT: ret1151; NONEON-NOSVE-NEXT: .LBB10_3: // %cond.store1152; NONEON-NOSVE-NEXT: str xzr, [x0]1153; NONEON-NOSVE-NEXT: tbz w8, #1, .LBB10_21154; NONEON-NOSVE-NEXT: .LBB10_4: // %cond.store11155; NONEON-NOSVE-NEXT: str xzr, [x0, #8]1156; NONEON-NOSVE-NEXT: add sp, sp, #161157; NONEON-NOSVE-NEXT: ret1158 call void @llvm.masked.store.v2f64(<2 x double> zeroinitializer, ptr %dst, i32 8, <2 x i1> %mask)1159 ret void1160}1161 1162define void @masked_store_v4f64(ptr %dst, <4 x i1> %mask) {1163; CHECK-LABEL: masked_store_v4f64:1164; CHECK: // %bb.0:1165; CHECK-NEXT: // kill: def $d0 killed $d0 def $z01166; CHECK-NEXT: ptrue p0.d, vl21167; CHECK-NEXT: mov x8, #2 // =0x21168; CHECK-NEXT: uunpklo z0.s, z0.h1169; CHECK-NEXT: movprfx z1, z01170; CHECK-NEXT: ext z1.b, z1.b, z0.b, #81171; CHECK-NEXT: uunpklo z0.d, z0.s1172; CHECK-NEXT: uunpklo z1.d, z1.s1173; CHECK-NEXT: lsl z0.d, z0.d, #631174; CHECK-NEXT: lsl z1.d, z1.d, #631175; CHECK-NEXT: asr z0.d, z0.d, #631176; CHECK-NEXT: asr z1.d, z1.d, #631177; CHECK-NEXT: cmpne p1.d, p0/z, z1.d, #01178; CHECK-NEXT: cmpne p0.d, p0/z, z0.d, #01179; CHECK-NEXT: mov z1.d, #0 // =0x01180; CHECK-NEXT: st1d { z1.d }, p1, [x0, x8, lsl #3]1181; CHECK-NEXT: st1d { z1.d }, p0, [x0]1182; CHECK-NEXT: ret1183;1184; NONEON-NOSVE-LABEL: masked_store_v4f64:1185; NONEON-NOSVE: // %bb.0:1186; NONEON-NOSVE-NEXT: str d0, [sp, #-16]!1187; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 161188; NONEON-NOSVE-NEXT: ldrh w8, [sp, #2]1189; NONEON-NOSVE-NEXT: ldrh w9, [sp, #4]1190; NONEON-NOSVE-NEXT: ldrh w10, [sp, #6]1191; NONEON-NOSVE-NEXT: ldrh w11, [sp]1192; NONEON-NOSVE-NEXT: sbfx w8, w8, #0, #11193; NONEON-NOSVE-NEXT: sbfx w9, w9, #0, #11194; NONEON-NOSVE-NEXT: sbfx w10, w10, #0, #11195; NONEON-NOSVE-NEXT: and w8, w8, #0x21196; NONEON-NOSVE-NEXT: and w9, w9, #0x41197; NONEON-NOSVE-NEXT: and w10, w10, #0x81198; NONEON-NOSVE-NEXT: bfxil w8, w11, #0, #11199; NONEON-NOSVE-NEXT: orr w9, w9, w101200; NONEON-NOSVE-NEXT: orr w8, w8, w91201; NONEON-NOSVE-NEXT: tbnz w8, #0, .LBB11_51202; NONEON-NOSVE-NEXT: // %bb.1: // %else1203; NONEON-NOSVE-NEXT: tbnz w8, #1, .LBB11_61204; NONEON-NOSVE-NEXT: .LBB11_2: // %else21205; NONEON-NOSVE-NEXT: tbnz w8, #2, .LBB11_71206; NONEON-NOSVE-NEXT: .LBB11_3: // %else41207; NONEON-NOSVE-NEXT: tbnz w8, #3, .LBB11_81208; NONEON-NOSVE-NEXT: .LBB11_4: // %else61209; NONEON-NOSVE-NEXT: add sp, sp, #161210; NONEON-NOSVE-NEXT: ret1211; NONEON-NOSVE-NEXT: .LBB11_5: // %cond.store1212; NONEON-NOSVE-NEXT: str xzr, [x0]1213; NONEON-NOSVE-NEXT: tbz w8, #1, .LBB11_21214; NONEON-NOSVE-NEXT: .LBB11_6: // %cond.store11215; NONEON-NOSVE-NEXT: str xzr, [x0, #8]1216; NONEON-NOSVE-NEXT: tbz w8, #2, .LBB11_31217; NONEON-NOSVE-NEXT: .LBB11_7: // %cond.store31218; NONEON-NOSVE-NEXT: str xzr, [x0, #16]1219; NONEON-NOSVE-NEXT: tbz w8, #3, .LBB11_41220; NONEON-NOSVE-NEXT: .LBB11_8: // %cond.store51221; NONEON-NOSVE-NEXT: str xzr, [x0, #24]1222; NONEON-NOSVE-NEXT: add sp, sp, #161223; NONEON-NOSVE-NEXT: ret1224 call void @llvm.masked.store.v4f64(<4 x double> zeroinitializer, ptr %dst, i32 8, <4 x i1> %mask)1225 ret void1226}1227 1228declare void @llvm.masked.store.v4i8(<4 x i8>, ptr, i32, <4 x i1>)1229declare void @llvm.masked.store.v8i8(<8 x i8>, ptr, i32, <8 x i1>)1230declare void @llvm.masked.store.v16i8(<16 x i8>, ptr, i32, <16 x i1>)1231declare void @llvm.masked.store.v32i8(<32 x i8>, ptr, i32, <32 x i1>)1232declare void @llvm.masked.store.v2f16(<2 x half>, ptr, i32, <2 x i1>)1233declare void @llvm.masked.store.v4f16(<4 x half>, ptr, i32, <4 x i1>)1234declare void @llvm.masked.store.v8f16(<8 x half>, ptr, i32, <8 x i1>)1235declare void @llvm.masked.store.v16f16(<16 x half>, ptr, i32, <16 x i1>)1236declare void @llvm.masked.store.v4f32(<4 x float>, ptr, i32, <4 x i1>)1237declare void @llvm.masked.store.v8f32(<8 x float>, ptr, i32, <8 x i1>)1238declare void @llvm.masked.store.v2f64(<2 x double>, ptr, i32, <2 x i1>)1239declare void @llvm.masked.store.v4f64(<4 x double>, ptr, i32, <4 x i1>)1240