840 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 -mattr=+sme -force-streaming < %s | FileCheck %s4; RUN: llc -force-streaming-compatible < %s | FileCheck %s --check-prefix=NONEON-NOSVE5 6target triple = "aarch64-unknown-linux-gnu"7 8define <4 x i8> @select_v4i8(<4 x i8> %op1, <4 x i8> %op2, i1 %mask) {9; CHECK-LABEL: select_v4i8:10; CHECK: // %bb.0:11; CHECK-NEXT: mov z2.h, w012; CHECK-NEXT: ptrue p0.h13; CHECK-NEXT: // kill: def $d0 killed $d0 def $z014; CHECK-NEXT: // kill: def $d1 killed $d1 def $z115; CHECK-NEXT: and z2.h, z2.h, #0x116; CHECK-NEXT: cmpne p0.h, p0/z, z2.h, #017; CHECK-NEXT: sel z0.h, p0, z0.h, z1.h18; CHECK-NEXT: // kill: def $d0 killed $d0 killed $z019; CHECK-NEXT: ret20;21; NONEON-NOSVE-LABEL: select_v4i8:22; NONEON-NOSVE: // %bb.0:23; NONEON-NOSVE-NEXT: sub sp, sp, #3224; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 3225; NONEON-NOSVE-NEXT: stp d0, d1, [sp, #8]26; NONEON-NOSVE-NEXT: tst w0, #0x127; NONEON-NOSVE-NEXT: ldrh w8, [sp, #22]28; NONEON-NOSVE-NEXT: ldrh w9, [sp, #14]29; NONEON-NOSVE-NEXT: csel w8, w9, w8, ne30; NONEON-NOSVE-NEXT: ldrh w9, [sp, #12]31; NONEON-NOSVE-NEXT: strh w8, [sp, #30]32; NONEON-NOSVE-NEXT: ldrh w8, [sp, #20]33; NONEON-NOSVE-NEXT: csel w8, w9, w8, ne34; NONEON-NOSVE-NEXT: ldrh w9, [sp, #10]35; NONEON-NOSVE-NEXT: strh w8, [sp, #28]36; NONEON-NOSVE-NEXT: ldrh w8, [sp, #18]37; NONEON-NOSVE-NEXT: csel w8, w9, w8, ne38; NONEON-NOSVE-NEXT: ldrh w9, [sp, #8]39; NONEON-NOSVE-NEXT: strh w8, [sp, #26]40; NONEON-NOSVE-NEXT: ldrh w8, [sp, #16]41; NONEON-NOSVE-NEXT: csel w8, w9, w8, ne42; NONEON-NOSVE-NEXT: strh w8, [sp, #24]43; NONEON-NOSVE-NEXT: ldr d0, [sp, #24]44; NONEON-NOSVE-NEXT: add sp, sp, #3245; NONEON-NOSVE-NEXT: ret46 %sel = select i1 %mask, <4 x i8> %op1, <4 x i8> %op247 ret <4 x i8> %sel48}49 50define <8 x i8> @select_v8i8(<8 x i8> %op1, <8 x i8> %op2, i1 %mask) {51; CHECK-LABEL: select_v8i8:52; CHECK: // %bb.0:53; CHECK-NEXT: mov z2.b, w054; CHECK-NEXT: ptrue p0.b55; CHECK-NEXT: // kill: def $d0 killed $d0 def $z056; CHECK-NEXT: // kill: def $d1 killed $d1 def $z157; CHECK-NEXT: cmpne p0.b, p0/z, z2.b, #058; CHECK-NEXT: sel z0.b, p0, z0.b, z1.b59; CHECK-NEXT: // kill: def $d0 killed $d0 killed $z060; CHECK-NEXT: ret61;62; NONEON-NOSVE-LABEL: select_v8i8:63; NONEON-NOSVE: // %bb.0:64; NONEON-NOSVE-NEXT: sub sp, sp, #3265; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 3266; NONEON-NOSVE-NEXT: stp d0, d1, [sp, #8]67; NONEON-NOSVE-NEXT: tst w0, #0x168; NONEON-NOSVE-NEXT: ldrb w8, [sp, #23]69; NONEON-NOSVE-NEXT: ldrb w9, [sp, #15]70; NONEON-NOSVE-NEXT: csel w8, w9, w8, ne71; NONEON-NOSVE-NEXT: ldrb w9, [sp, #14]72; NONEON-NOSVE-NEXT: strb w8, [sp, #31]73; NONEON-NOSVE-NEXT: ldrb w8, [sp, #22]74; NONEON-NOSVE-NEXT: csel w8, w9, w8, ne75; NONEON-NOSVE-NEXT: ldrb w9, [sp, #13]76; NONEON-NOSVE-NEXT: strb w8, [sp, #30]77; NONEON-NOSVE-NEXT: ldrb w8, [sp, #21]78; NONEON-NOSVE-NEXT: csel w8, w9, w8, ne79; NONEON-NOSVE-NEXT: ldrb w9, [sp, #12]80; NONEON-NOSVE-NEXT: strb w8, [sp, #29]81; NONEON-NOSVE-NEXT: ldrb w8, [sp, #20]82; NONEON-NOSVE-NEXT: csel w8, w9, w8, ne83; NONEON-NOSVE-NEXT: ldrb w9, [sp, #11]84; NONEON-NOSVE-NEXT: strb w8, [sp, #28]85; NONEON-NOSVE-NEXT: ldrb w8, [sp, #19]86; NONEON-NOSVE-NEXT: csel w8, w9, w8, ne87; NONEON-NOSVE-NEXT: ldrb w9, [sp, #10]88; NONEON-NOSVE-NEXT: strb w8, [sp, #27]89; NONEON-NOSVE-NEXT: ldrb w8, [sp, #18]90; NONEON-NOSVE-NEXT: csel w8, w9, w8, ne91; NONEON-NOSVE-NEXT: ldrb w9, [sp, #9]92; NONEON-NOSVE-NEXT: strb w8, [sp, #26]93; NONEON-NOSVE-NEXT: ldrb w8, [sp, #17]94; NONEON-NOSVE-NEXT: csel w8, w9, w8, ne95; NONEON-NOSVE-NEXT: ldrb w9, [sp, #8]96; NONEON-NOSVE-NEXT: strb w8, [sp, #25]97; NONEON-NOSVE-NEXT: ldrb w8, [sp, #16]98; NONEON-NOSVE-NEXT: csel w8, w9, w8, ne99; NONEON-NOSVE-NEXT: strb w8, [sp, #24]100; NONEON-NOSVE-NEXT: ldr d0, [sp, #24]101; NONEON-NOSVE-NEXT: add sp, sp, #32102; NONEON-NOSVE-NEXT: ret103 %sel = select i1 %mask, <8 x i8> %op1, <8 x i8> %op2104 ret <8 x i8> %sel105}106 107define <16 x i8> @select_v16i8(<16 x i8> %op1, <16 x i8> %op2, i1 %mask) {108; CHECK-LABEL: select_v16i8:109; CHECK: // %bb.0:110; CHECK-NEXT: mov z2.b, w0111; CHECK-NEXT: ptrue p0.b112; CHECK-NEXT: // kill: def $q0 killed $q0 def $z0113; CHECK-NEXT: // kill: def $q1 killed $q1 def $z1114; CHECK-NEXT: cmpne p0.b, p0/z, z2.b, #0115; CHECK-NEXT: sel z0.b, p0, z0.b, z1.b116; CHECK-NEXT: // kill: def $q0 killed $q0 killed $z0117; CHECK-NEXT: ret118;119; NONEON-NOSVE-LABEL: select_v16i8:120; NONEON-NOSVE: // %bb.0:121; NONEON-NOSVE-NEXT: stp q0, q1, [sp, #-48]!122; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 48123; NONEON-NOSVE-NEXT: ldrb w8, [sp, #31]124; NONEON-NOSVE-NEXT: ldrb w9, [sp, #15]125; NONEON-NOSVE-NEXT: tst w0, #0x1126; NONEON-NOSVE-NEXT: csel w8, w9, w8, ne127; NONEON-NOSVE-NEXT: ldrb w9, [sp, #14]128; NONEON-NOSVE-NEXT: strb w8, [sp, #47]129; NONEON-NOSVE-NEXT: ldrb w8, [sp, #30]130; NONEON-NOSVE-NEXT: csel w8, w9, w8, ne131; NONEON-NOSVE-NEXT: ldrb w9, [sp, #13]132; NONEON-NOSVE-NEXT: strb w8, [sp, #46]133; NONEON-NOSVE-NEXT: ldrb w8, [sp, #29]134; NONEON-NOSVE-NEXT: csel w8, w9, w8, ne135; NONEON-NOSVE-NEXT: ldrb w9, [sp, #12]136; NONEON-NOSVE-NEXT: strb w8, [sp, #45]137; NONEON-NOSVE-NEXT: ldrb w8, [sp, #28]138; NONEON-NOSVE-NEXT: csel w8, w9, w8, ne139; NONEON-NOSVE-NEXT: ldrb w9, [sp, #11]140; NONEON-NOSVE-NEXT: strb w8, [sp, #44]141; NONEON-NOSVE-NEXT: ldrb w8, [sp, #27]142; NONEON-NOSVE-NEXT: csel w8, w9, w8, ne143; NONEON-NOSVE-NEXT: ldrb w9, [sp, #10]144; NONEON-NOSVE-NEXT: strb w8, [sp, #43]145; NONEON-NOSVE-NEXT: ldrb w8, [sp, #26]146; NONEON-NOSVE-NEXT: csel w8, w9, w8, ne147; NONEON-NOSVE-NEXT: ldrb w9, [sp, #9]148; NONEON-NOSVE-NEXT: strb w8, [sp, #42]149; NONEON-NOSVE-NEXT: ldrb w8, [sp, #25]150; NONEON-NOSVE-NEXT: csel w8, w9, w8, ne151; NONEON-NOSVE-NEXT: ldrb w9, [sp, #8]152; NONEON-NOSVE-NEXT: strb w8, [sp, #41]153; NONEON-NOSVE-NEXT: ldrb w8, [sp, #24]154; NONEON-NOSVE-NEXT: csel w8, w9, w8, ne155; NONEON-NOSVE-NEXT: ldrb w9, [sp, #7]156; NONEON-NOSVE-NEXT: strb w8, [sp, #40]157; NONEON-NOSVE-NEXT: ldrb w8, [sp, #23]158; NONEON-NOSVE-NEXT: csel w8, w9, w8, ne159; NONEON-NOSVE-NEXT: ldrb w9, [sp, #6]160; NONEON-NOSVE-NEXT: strb w8, [sp, #39]161; NONEON-NOSVE-NEXT: ldrb w8, [sp, #22]162; NONEON-NOSVE-NEXT: csel w8, w9, w8, ne163; NONEON-NOSVE-NEXT: ldrb w9, [sp, #5]164; NONEON-NOSVE-NEXT: strb w8, [sp, #38]165; NONEON-NOSVE-NEXT: ldrb w8, [sp, #21]166; NONEON-NOSVE-NEXT: csel w8, w9, w8, ne167; NONEON-NOSVE-NEXT: ldrb w9, [sp, #4]168; NONEON-NOSVE-NEXT: strb w8, [sp, #37]169; NONEON-NOSVE-NEXT: ldrb w8, [sp, #20]170; NONEON-NOSVE-NEXT: csel w8, w9, w8, ne171; NONEON-NOSVE-NEXT: ldrb w9, [sp, #3]172; NONEON-NOSVE-NEXT: strb w8, [sp, #36]173; NONEON-NOSVE-NEXT: ldrb w8, [sp, #19]174; NONEON-NOSVE-NEXT: csel w8, w9, w8, ne175; NONEON-NOSVE-NEXT: ldrb w9, [sp, #2]176; NONEON-NOSVE-NEXT: strb w8, [sp, #35]177; NONEON-NOSVE-NEXT: ldrb w8, [sp, #18]178; NONEON-NOSVE-NEXT: csel w8, w9, w8, ne179; NONEON-NOSVE-NEXT: ldrb w9, [sp, #1]180; NONEON-NOSVE-NEXT: strb w8, [sp, #34]181; NONEON-NOSVE-NEXT: ldrb w8, [sp, #17]182; NONEON-NOSVE-NEXT: csel w8, w9, w8, ne183; NONEON-NOSVE-NEXT: ldrb w9, [sp]184; NONEON-NOSVE-NEXT: strb w8, [sp, #33]185; NONEON-NOSVE-NEXT: ldrb w8, [sp, #16]186; NONEON-NOSVE-NEXT: csel w8, w9, w8, ne187; NONEON-NOSVE-NEXT: strb w8, [sp, #32]188; NONEON-NOSVE-NEXT: ldr q0, [sp, #32]189; NONEON-NOSVE-NEXT: add sp, sp, #48190; NONEON-NOSVE-NEXT: ret191 %sel = select i1 %mask, <16 x i8> %op1, <16 x i8> %op2192 ret <16 x i8> %sel193}194 195define void @select_v32i8(ptr %a, ptr %b, i1 %mask) {196; CHECK-LABEL: select_v32i8:197; CHECK: // %bb.0:198; CHECK-NEXT: mov z0.b, w2199; CHECK-NEXT: ptrue p0.b200; CHECK-NEXT: cmpne p0.b, p0/z, z0.b, #0201; CHECK-NEXT: ldr q0, [x0]202; CHECK-NEXT: ldr q1, [x0, #16]203; CHECK-NEXT: ldr q2, [x1]204; CHECK-NEXT: ldr q3, [x1, #16]205; CHECK-NEXT: sel z0.b, p0, z0.b, z2.b206; CHECK-NEXT: sel z1.b, p0, z1.b, z3.b207; CHECK-NEXT: stp q0, q1, [x0]208; CHECK-NEXT: ret209;210; NONEON-NOSVE-LABEL: select_v32i8:211; NONEON-NOSVE: // %bb.0:212; NONEON-NOSVE-NEXT: sub sp, sp, #96213; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 96214; NONEON-NOSVE-NEXT: ldr q0, [x0]215; NONEON-NOSVE-NEXT: ldr q1, [x0, #16]216; NONEON-NOSVE-NEXT: tst w2, #0x1217; NONEON-NOSVE-NEXT: ldr q2, [x1]218; NONEON-NOSVE-NEXT: ldr q3, [x1, #16]219; NONEON-NOSVE-NEXT: str q0, [sp]220; NONEON-NOSVE-NEXT: stp q1, q3, [sp, #16]221; NONEON-NOSVE-NEXT: ldrb w8, [sp, #31]222; NONEON-NOSVE-NEXT: ldrb w9, [sp, #47]223; NONEON-NOSVE-NEXT: str q2, [sp, #48]224; NONEON-NOSVE-NEXT: csel w8, w8, w9, ne225; NONEON-NOSVE-NEXT: ldrb w9, [sp, #46]226; NONEON-NOSVE-NEXT: strb w8, [sp, #79]227; NONEON-NOSVE-NEXT: ldrb w8, [sp, #30]228; NONEON-NOSVE-NEXT: csel w8, w8, w9, ne229; NONEON-NOSVE-NEXT: ldrb w9, [sp, #45]230; NONEON-NOSVE-NEXT: strb w8, [sp, #78]231; NONEON-NOSVE-NEXT: ldrb w8, [sp, #29]232; NONEON-NOSVE-NEXT: csel w8, w8, w9, ne233; NONEON-NOSVE-NEXT: ldrb w9, [sp, #44]234; NONEON-NOSVE-NEXT: strb w8, [sp, #77]235; NONEON-NOSVE-NEXT: ldrb w8, [sp, #28]236; NONEON-NOSVE-NEXT: csel w8, w8, w9, ne237; NONEON-NOSVE-NEXT: ldrb w9, [sp, #43]238; NONEON-NOSVE-NEXT: strb w8, [sp, #76]239; NONEON-NOSVE-NEXT: ldrb w8, [sp, #27]240; NONEON-NOSVE-NEXT: csel w8, w8, w9, ne241; NONEON-NOSVE-NEXT: ldrb w9, [sp, #42]242; NONEON-NOSVE-NEXT: strb w8, [sp, #75]243; NONEON-NOSVE-NEXT: ldrb w8, [sp, #26]244; NONEON-NOSVE-NEXT: csel w8, w8, w9, ne245; NONEON-NOSVE-NEXT: ldrb w9, [sp, #41]246; NONEON-NOSVE-NEXT: strb w8, [sp, #74]247; NONEON-NOSVE-NEXT: ldrb w8, [sp, #25]248; NONEON-NOSVE-NEXT: csel w8, w8, w9, ne249; NONEON-NOSVE-NEXT: ldrb w9, [sp, #40]250; NONEON-NOSVE-NEXT: strb w8, [sp, #73]251; NONEON-NOSVE-NEXT: ldrb w8, [sp, #24]252; NONEON-NOSVE-NEXT: csel w8, w8, w9, ne253; NONEON-NOSVE-NEXT: ldrb w9, [sp, #39]254; NONEON-NOSVE-NEXT: strb w8, [sp, #72]255; NONEON-NOSVE-NEXT: ldrb w8, [sp, #23]256; NONEON-NOSVE-NEXT: csel w8, w8, w9, ne257; NONEON-NOSVE-NEXT: ldrb w9, [sp, #38]258; NONEON-NOSVE-NEXT: strb w8, [sp, #71]259; NONEON-NOSVE-NEXT: ldrb w8, [sp, #22]260; NONEON-NOSVE-NEXT: csel w8, w8, w9, ne261; NONEON-NOSVE-NEXT: ldrb w9, [sp, #37]262; NONEON-NOSVE-NEXT: strb w8, [sp, #70]263; NONEON-NOSVE-NEXT: ldrb w8, [sp, #21]264; NONEON-NOSVE-NEXT: csel w8, w8, w9, ne265; NONEON-NOSVE-NEXT: ldrb w9, [sp, #36]266; NONEON-NOSVE-NEXT: strb w8, [sp, #69]267; NONEON-NOSVE-NEXT: ldrb w8, [sp, #20]268; NONEON-NOSVE-NEXT: csel w8, w8, w9, ne269; NONEON-NOSVE-NEXT: ldrb w9, [sp, #35]270; NONEON-NOSVE-NEXT: strb w8, [sp, #68]271; NONEON-NOSVE-NEXT: ldrb w8, [sp, #19]272; NONEON-NOSVE-NEXT: csel w8, w8, w9, ne273; NONEON-NOSVE-NEXT: ldrb w9, [sp, #34]274; NONEON-NOSVE-NEXT: strb w8, [sp, #67]275; NONEON-NOSVE-NEXT: ldrb w8, [sp, #18]276; NONEON-NOSVE-NEXT: csel w8, w8, w9, ne277; NONEON-NOSVE-NEXT: ldrb w9, [sp, #33]278; NONEON-NOSVE-NEXT: strb w8, [sp, #66]279; NONEON-NOSVE-NEXT: ldrb w8, [sp, #17]280; NONEON-NOSVE-NEXT: csel w8, w8, w9, ne281; NONEON-NOSVE-NEXT: ldrb w9, [sp, #32]282; NONEON-NOSVE-NEXT: strb w8, [sp, #65]283; NONEON-NOSVE-NEXT: ldrb w8, [sp, #16]284; NONEON-NOSVE-NEXT: csel w8, w8, w9, ne285; NONEON-NOSVE-NEXT: ldrb w9, [sp, #63]286; NONEON-NOSVE-NEXT: strb w8, [sp, #64]287; NONEON-NOSVE-NEXT: ldrb w8, [sp, #15]288; NONEON-NOSVE-NEXT: csel w8, w8, w9, ne289; NONEON-NOSVE-NEXT: ldrb w9, [sp, #62]290; NONEON-NOSVE-NEXT: strb w8, [sp, #95]291; NONEON-NOSVE-NEXT: ldrb w8, [sp, #14]292; NONEON-NOSVE-NEXT: csel w8, w8, w9, ne293; NONEON-NOSVE-NEXT: ldrb w9, [sp, #61]294; NONEON-NOSVE-NEXT: strb w8, [sp, #94]295; NONEON-NOSVE-NEXT: ldrb w8, [sp, #13]296; NONEON-NOSVE-NEXT: csel w8, w8, w9, ne297; NONEON-NOSVE-NEXT: ldrb w9, [sp, #60]298; NONEON-NOSVE-NEXT: strb w8, [sp, #93]299; NONEON-NOSVE-NEXT: ldrb w8, [sp, #12]300; NONEON-NOSVE-NEXT: csel w8, w8, w9, ne301; NONEON-NOSVE-NEXT: ldrb w9, [sp, #59]302; NONEON-NOSVE-NEXT: strb w8, [sp, #92]303; NONEON-NOSVE-NEXT: ldrb w8, [sp, #11]304; NONEON-NOSVE-NEXT: csel w8, w8, w9, ne305; NONEON-NOSVE-NEXT: ldrb w9, [sp, #58]306; NONEON-NOSVE-NEXT: strb w8, [sp, #91]307; NONEON-NOSVE-NEXT: ldrb w8, [sp, #10]308; NONEON-NOSVE-NEXT: csel w8, w8, w9, ne309; NONEON-NOSVE-NEXT: ldrb w9, [sp, #57]310; NONEON-NOSVE-NEXT: strb w8, [sp, #90]311; NONEON-NOSVE-NEXT: ldrb w8, [sp, #9]312; NONEON-NOSVE-NEXT: csel w8, w8, w9, ne313; NONEON-NOSVE-NEXT: ldrb w9, [sp, #56]314; NONEON-NOSVE-NEXT: strb w8, [sp, #89]315; NONEON-NOSVE-NEXT: ldrb w8, [sp, #8]316; NONEON-NOSVE-NEXT: csel w8, w8, w9, ne317; NONEON-NOSVE-NEXT: ldrb w9, [sp, #55]318; NONEON-NOSVE-NEXT: strb w8, [sp, #88]319; NONEON-NOSVE-NEXT: ldrb w8, [sp, #7]320; NONEON-NOSVE-NEXT: csel w8, w8, w9, ne321; NONEON-NOSVE-NEXT: ldrb w9, [sp, #54]322; NONEON-NOSVE-NEXT: strb w8, [sp, #87]323; NONEON-NOSVE-NEXT: ldrb w8, [sp, #6]324; NONEON-NOSVE-NEXT: csel w8, w8, w9, ne325; NONEON-NOSVE-NEXT: ldrb w9, [sp, #53]326; NONEON-NOSVE-NEXT: strb w8, [sp, #86]327; NONEON-NOSVE-NEXT: ldrb w8, [sp, #5]328; NONEON-NOSVE-NEXT: csel w8, w8, w9, ne329; NONEON-NOSVE-NEXT: ldrb w9, [sp, #52]330; NONEON-NOSVE-NEXT: strb w8, [sp, #85]331; NONEON-NOSVE-NEXT: ldrb w8, [sp, #4]332; NONEON-NOSVE-NEXT: csel w8, w8, w9, ne333; NONEON-NOSVE-NEXT: ldrb w9, [sp, #51]334; NONEON-NOSVE-NEXT: strb w8, [sp, #84]335; NONEON-NOSVE-NEXT: ldrb w8, [sp, #3]336; NONEON-NOSVE-NEXT: csel w8, w8, w9, ne337; NONEON-NOSVE-NEXT: ldrb w9, [sp, #50]338; NONEON-NOSVE-NEXT: strb w8, [sp, #83]339; NONEON-NOSVE-NEXT: ldrb w8, [sp, #2]340; NONEON-NOSVE-NEXT: csel w8, w8, w9, ne341; NONEON-NOSVE-NEXT: ldrb w9, [sp, #49]342; NONEON-NOSVE-NEXT: strb w8, [sp, #82]343; NONEON-NOSVE-NEXT: ldrb w8, [sp, #1]344; NONEON-NOSVE-NEXT: csel w8, w8, w9, ne345; NONEON-NOSVE-NEXT: ldrb w9, [sp, #48]346; NONEON-NOSVE-NEXT: strb w8, [sp, #81]347; NONEON-NOSVE-NEXT: ldrb w8, [sp]348; NONEON-NOSVE-NEXT: csel w8, w8, w9, ne349; NONEON-NOSVE-NEXT: strb w8, [sp, #80]350; NONEON-NOSVE-NEXT: ldp q1, q0, [sp, #64]351; NONEON-NOSVE-NEXT: stp q0, q1, [x0]352; NONEON-NOSVE-NEXT: add sp, sp, #96353; NONEON-NOSVE-NEXT: ret354 %op1 = load volatile <32 x i8>, ptr %a355 %op2 = load volatile <32 x i8>, ptr %b356 %sel = select i1 %mask, <32 x i8> %op1, <32 x i8> %op2357 store <32 x i8> %sel, ptr %a358 ret void359}360 361define <2 x i16> @select_v2i16(<2 x i16> %op1, <2 x i16> %op2, i1 %mask) {362; CHECK-LABEL: select_v2i16:363; CHECK: // %bb.0:364; CHECK-NEXT: and w8, w0, #0x1365; CHECK-NEXT: ptrue p0.s366; CHECK-NEXT: // kill: def $d0 killed $d0 def $z0367; CHECK-NEXT: // kill: def $d1 killed $d1 def $z1368; CHECK-NEXT: mov z2.s, w8369; CHECK-NEXT: cmpne p0.s, p0/z, z2.s, #0370; CHECK-NEXT: sel z0.s, p0, z0.s, z1.s371; CHECK-NEXT: // kill: def $d0 killed $d0 killed $z0372; CHECK-NEXT: ret373;374; NONEON-NOSVE-LABEL: select_v2i16:375; NONEON-NOSVE: // %bb.0:376; NONEON-NOSVE-NEXT: sub sp, sp, #32377; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 32378; NONEON-NOSVE-NEXT: stp d0, d1, [sp, #8]379; NONEON-NOSVE-NEXT: tst w0, #0x1380; NONEON-NOSVE-NEXT: ldp w9, w10, [sp, #8]381; NONEON-NOSVE-NEXT: ldr w8, [sp, #20]382; NONEON-NOSVE-NEXT: csel w11, w10, w8, ne383; NONEON-NOSVE-NEXT: ldr w8, [sp, #16]384; NONEON-NOSVE-NEXT: csel w8, w9, w8, ne385; NONEON-NOSVE-NEXT: stp w8, w11, [sp, #24]386; NONEON-NOSVE-NEXT: ldr d0, [sp, #24]387; NONEON-NOSVE-NEXT: add sp, sp, #32388; NONEON-NOSVE-NEXT: ret389 %sel = select i1 %mask, <2 x i16> %op1, <2 x i16> %op2390 ret <2 x i16> %sel391}392 393define <4 x i16> @select_v4i16(<4 x i16> %op1, <4 x i16> %op2, i1 %mask) {394; CHECK-LABEL: select_v4i16:395; CHECK: // %bb.0:396; CHECK-NEXT: mov z2.h, w0397; CHECK-NEXT: ptrue p0.h398; CHECK-NEXT: // kill: def $d0 killed $d0 def $z0399; CHECK-NEXT: // kill: def $d1 killed $d1 def $z1400; CHECK-NEXT: and z2.h, z2.h, #0x1401; CHECK-NEXT: cmpne p0.h, p0/z, z2.h, #0402; CHECK-NEXT: sel z0.h, p0, z0.h, z1.h403; CHECK-NEXT: // kill: def $d0 killed $d0 killed $z0404; CHECK-NEXT: ret405;406; NONEON-NOSVE-LABEL: select_v4i16:407; NONEON-NOSVE: // %bb.0:408; NONEON-NOSVE-NEXT: sub sp, sp, #32409; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 32410; NONEON-NOSVE-NEXT: stp d0, d1, [sp, #8]411; NONEON-NOSVE-NEXT: tst w0, #0x1412; NONEON-NOSVE-NEXT: ldrh w8, [sp, #22]413; NONEON-NOSVE-NEXT: ldrh w9, [sp, #14]414; NONEON-NOSVE-NEXT: csel w8, w9, w8, ne415; NONEON-NOSVE-NEXT: ldrh w9, [sp, #12]416; NONEON-NOSVE-NEXT: strh w8, [sp, #30]417; NONEON-NOSVE-NEXT: ldrh w8, [sp, #20]418; NONEON-NOSVE-NEXT: csel w8, w9, w8, ne419; NONEON-NOSVE-NEXT: ldrh w9, [sp, #10]420; NONEON-NOSVE-NEXT: strh w8, [sp, #28]421; NONEON-NOSVE-NEXT: ldrh w8, [sp, #18]422; NONEON-NOSVE-NEXT: csel w8, w9, w8, ne423; NONEON-NOSVE-NEXT: ldrh w9, [sp, #8]424; NONEON-NOSVE-NEXT: strh w8, [sp, #26]425; NONEON-NOSVE-NEXT: ldrh w8, [sp, #16]426; NONEON-NOSVE-NEXT: csel w8, w9, w8, ne427; NONEON-NOSVE-NEXT: strh w8, [sp, #24]428; NONEON-NOSVE-NEXT: ldr d0, [sp, #24]429; NONEON-NOSVE-NEXT: add sp, sp, #32430; NONEON-NOSVE-NEXT: ret431 %sel = select i1 %mask, <4 x i16> %op1, <4 x i16> %op2432 ret <4 x i16> %sel433}434 435define <8 x i16> @select_v8i16(<8 x i16> %op1, <8 x i16> %op2, i1 %mask) {436; CHECK-LABEL: select_v8i16:437; CHECK: // %bb.0:438; CHECK-NEXT: mov z2.h, w0439; CHECK-NEXT: ptrue p0.h440; CHECK-NEXT: // kill: def $q0 killed $q0 def $z0441; CHECK-NEXT: // kill: def $q1 killed $q1 def $z1442; CHECK-NEXT: and z2.h, z2.h, #0x1443; CHECK-NEXT: cmpne p0.h, p0/z, z2.h, #0444; CHECK-NEXT: sel z0.h, p0, z0.h, z1.h445; CHECK-NEXT: // kill: def $q0 killed $q0 killed $z0446; CHECK-NEXT: ret447;448; NONEON-NOSVE-LABEL: select_v8i16:449; NONEON-NOSVE: // %bb.0:450; NONEON-NOSVE-NEXT: stp q0, q1, [sp, #-48]!451; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 48452; NONEON-NOSVE-NEXT: ldrh w8, [sp, #30]453; NONEON-NOSVE-NEXT: ldrh w9, [sp, #14]454; NONEON-NOSVE-NEXT: tst w0, #0x1455; NONEON-NOSVE-NEXT: csel w8, w9, w8, ne456; NONEON-NOSVE-NEXT: ldrh w9, [sp, #12]457; NONEON-NOSVE-NEXT: strh w8, [sp, #46]458; NONEON-NOSVE-NEXT: ldrh w8, [sp, #28]459; NONEON-NOSVE-NEXT: csel w8, w9, w8, ne460; NONEON-NOSVE-NEXT: ldrh w9, [sp, #10]461; NONEON-NOSVE-NEXT: strh w8, [sp, #44]462; NONEON-NOSVE-NEXT: ldrh w8, [sp, #26]463; NONEON-NOSVE-NEXT: csel w8, w9, w8, ne464; NONEON-NOSVE-NEXT: ldrh w9, [sp, #8]465; NONEON-NOSVE-NEXT: strh w8, [sp, #42]466; NONEON-NOSVE-NEXT: ldrh w8, [sp, #24]467; NONEON-NOSVE-NEXT: csel w8, w9, w8, ne468; NONEON-NOSVE-NEXT: ldrh w9, [sp, #6]469; NONEON-NOSVE-NEXT: strh w8, [sp, #40]470; NONEON-NOSVE-NEXT: ldrh w8, [sp, #22]471; NONEON-NOSVE-NEXT: csel w8, w9, w8, ne472; NONEON-NOSVE-NEXT: ldrh w9, [sp, #4]473; NONEON-NOSVE-NEXT: strh w8, [sp, #38]474; NONEON-NOSVE-NEXT: ldrh w8, [sp, #20]475; NONEON-NOSVE-NEXT: csel w8, w9, w8, ne476; NONEON-NOSVE-NEXT: ldrh w9, [sp, #2]477; NONEON-NOSVE-NEXT: strh w8, [sp, #36]478; NONEON-NOSVE-NEXT: ldrh w8, [sp, #18]479; NONEON-NOSVE-NEXT: csel w8, w9, w8, ne480; NONEON-NOSVE-NEXT: ldrh w9, [sp]481; NONEON-NOSVE-NEXT: strh w8, [sp, #34]482; NONEON-NOSVE-NEXT: ldrh w8, [sp, #16]483; NONEON-NOSVE-NEXT: csel w8, w9, w8, ne484; NONEON-NOSVE-NEXT: strh w8, [sp, #32]485; NONEON-NOSVE-NEXT: ldr q0, [sp, #32]486; NONEON-NOSVE-NEXT: add sp, sp, #48487; NONEON-NOSVE-NEXT: ret488 %sel = select i1 %mask, <8 x i16> %op1, <8 x i16> %op2489 ret <8 x i16> %sel490}491 492define void @select_v16i16(ptr %a, ptr %b, i1 %mask) {493; CHECK-LABEL: select_v16i16:494; CHECK: // %bb.0:495; CHECK-NEXT: mov z0.h, w2496; CHECK-NEXT: ptrue p0.h497; CHECK-NEXT: and z0.h, z0.h, #0x1498; CHECK-NEXT: cmpne p0.h, p0/z, z0.h, #0499; CHECK-NEXT: ldr q0, [x0]500; CHECK-NEXT: ldr q1, [x0, #16]501; CHECK-NEXT: ldr q2, [x1]502; CHECK-NEXT: ldr q3, [x1, #16]503; CHECK-NEXT: sel z0.h, p0, z0.h, z2.h504; CHECK-NEXT: sel z1.h, p0, z1.h, z3.h505; CHECK-NEXT: stp q0, q1, [x0]506; CHECK-NEXT: ret507;508; NONEON-NOSVE-LABEL: select_v16i16:509; NONEON-NOSVE: // %bb.0:510; NONEON-NOSVE-NEXT: sub sp, sp, #96511; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 96512; NONEON-NOSVE-NEXT: ldr q0, [x0]513; NONEON-NOSVE-NEXT: ldr q1, [x0, #16]514; NONEON-NOSVE-NEXT: tst w2, #0x1515; NONEON-NOSVE-NEXT: ldr q2, [x1]516; NONEON-NOSVE-NEXT: ldr q3, [x1, #16]517; NONEON-NOSVE-NEXT: str q0, [sp]518; NONEON-NOSVE-NEXT: stp q1, q3, [sp, #16]519; NONEON-NOSVE-NEXT: ldrh w8, [sp, #30]520; NONEON-NOSVE-NEXT: ldrh w9, [sp, #46]521; NONEON-NOSVE-NEXT: str q2, [sp, #48]522; NONEON-NOSVE-NEXT: csel w8, w8, w9, ne523; NONEON-NOSVE-NEXT: ldrh w9, [sp, #44]524; NONEON-NOSVE-NEXT: strh w8, [sp, #78]525; NONEON-NOSVE-NEXT: ldrh w8, [sp, #28]526; NONEON-NOSVE-NEXT: csel w8, w8, w9, ne527; NONEON-NOSVE-NEXT: ldrh w9, [sp, #42]528; NONEON-NOSVE-NEXT: strh w8, [sp, #76]529; NONEON-NOSVE-NEXT: ldrh w8, [sp, #26]530; NONEON-NOSVE-NEXT: csel w8, w8, w9, ne531; NONEON-NOSVE-NEXT: ldrh w9, [sp, #40]532; NONEON-NOSVE-NEXT: strh w8, [sp, #74]533; NONEON-NOSVE-NEXT: ldrh w8, [sp, #24]534; NONEON-NOSVE-NEXT: csel w8, w8, w9, ne535; NONEON-NOSVE-NEXT: ldrh w9, [sp, #38]536; NONEON-NOSVE-NEXT: strh w8, [sp, #72]537; NONEON-NOSVE-NEXT: ldrh w8, [sp, #22]538; NONEON-NOSVE-NEXT: csel w8, w8, w9, ne539; NONEON-NOSVE-NEXT: ldrh w9, [sp, #36]540; NONEON-NOSVE-NEXT: strh w8, [sp, #70]541; NONEON-NOSVE-NEXT: ldrh w8, [sp, #20]542; NONEON-NOSVE-NEXT: csel w8, w8, w9, ne543; NONEON-NOSVE-NEXT: ldrh w9, [sp, #34]544; NONEON-NOSVE-NEXT: strh w8, [sp, #68]545; NONEON-NOSVE-NEXT: ldrh w8, [sp, #18]546; NONEON-NOSVE-NEXT: csel w8, w8, w9, ne547; NONEON-NOSVE-NEXT: ldrh w9, [sp, #32]548; NONEON-NOSVE-NEXT: strh w8, [sp, #66]549; NONEON-NOSVE-NEXT: ldrh w8, [sp, #16]550; NONEON-NOSVE-NEXT: csel w8, w8, w9, ne551; NONEON-NOSVE-NEXT: ldrh w9, [sp, #62]552; NONEON-NOSVE-NEXT: strh w8, [sp, #64]553; NONEON-NOSVE-NEXT: ldrh w8, [sp, #14]554; NONEON-NOSVE-NEXT: csel w8, w8, w9, ne555; NONEON-NOSVE-NEXT: ldrh w9, [sp, #60]556; NONEON-NOSVE-NEXT: strh w8, [sp, #94]557; NONEON-NOSVE-NEXT: ldrh w8, [sp, #12]558; NONEON-NOSVE-NEXT: csel w8, w8, w9, ne559; NONEON-NOSVE-NEXT: ldrh w9, [sp, #58]560; NONEON-NOSVE-NEXT: strh w8, [sp, #92]561; NONEON-NOSVE-NEXT: ldrh w8, [sp, #10]562; NONEON-NOSVE-NEXT: csel w8, w8, w9, ne563; NONEON-NOSVE-NEXT: ldrh w9, [sp, #56]564; NONEON-NOSVE-NEXT: strh w8, [sp, #90]565; NONEON-NOSVE-NEXT: ldrh w8, [sp, #8]566; NONEON-NOSVE-NEXT: csel w8, w8, w9, ne567; NONEON-NOSVE-NEXT: ldrh w9, [sp, #54]568; NONEON-NOSVE-NEXT: strh w8, [sp, #88]569; NONEON-NOSVE-NEXT: ldrh w8, [sp, #6]570; NONEON-NOSVE-NEXT: csel w8, w8, w9, ne571; NONEON-NOSVE-NEXT: ldrh w9, [sp, #52]572; NONEON-NOSVE-NEXT: strh w8, [sp, #86]573; NONEON-NOSVE-NEXT: ldrh w8, [sp, #4]574; NONEON-NOSVE-NEXT: csel w8, w8, w9, ne575; NONEON-NOSVE-NEXT: ldrh w9, [sp, #50]576; NONEON-NOSVE-NEXT: strh w8, [sp, #84]577; NONEON-NOSVE-NEXT: ldrh w8, [sp, #2]578; NONEON-NOSVE-NEXT: csel w8, w8, w9, ne579; NONEON-NOSVE-NEXT: ldrh w9, [sp, #48]580; NONEON-NOSVE-NEXT: strh w8, [sp, #82]581; NONEON-NOSVE-NEXT: ldrh w8, [sp]582; NONEON-NOSVE-NEXT: csel w8, w8, w9, ne583; NONEON-NOSVE-NEXT: strh w8, [sp, #80]584; NONEON-NOSVE-NEXT: ldp q1, q0, [sp, #64]585; NONEON-NOSVE-NEXT: stp q0, q1, [x0]586; NONEON-NOSVE-NEXT: add sp, sp, #96587; NONEON-NOSVE-NEXT: ret588 %op1 = load volatile <16 x i16>, ptr %a589 %op2 = load volatile <16 x i16>, ptr %b590 %sel = select i1 %mask, <16 x i16> %op1, <16 x i16> %op2591 store <16 x i16> %sel, ptr %a592 ret void593}594 595define <2 x i32> @select_v2i32(<2 x i32> %op1, <2 x i32> %op2, i1 %mask) {596; CHECK-LABEL: select_v2i32:597; CHECK: // %bb.0:598; CHECK-NEXT: and w8, w0, #0x1599; CHECK-NEXT: ptrue p0.s600; CHECK-NEXT: // kill: def $d0 killed $d0 def $z0601; CHECK-NEXT: // kill: def $d1 killed $d1 def $z1602; CHECK-NEXT: mov z2.s, w8603; CHECK-NEXT: cmpne p0.s, p0/z, z2.s, #0604; CHECK-NEXT: sel z0.s, p0, z0.s, z1.s605; CHECK-NEXT: // kill: def $d0 killed $d0 killed $z0606; CHECK-NEXT: ret607;608; NONEON-NOSVE-LABEL: select_v2i32:609; NONEON-NOSVE: // %bb.0:610; NONEON-NOSVE-NEXT: sub sp, sp, #32611; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 32612; NONEON-NOSVE-NEXT: stp d0, d1, [sp, #8]613; NONEON-NOSVE-NEXT: tst w0, #0x1614; NONEON-NOSVE-NEXT: ldp w9, w10, [sp, #8]615; NONEON-NOSVE-NEXT: ldr w8, [sp, #20]616; NONEON-NOSVE-NEXT: csel w11, w10, w8, ne617; NONEON-NOSVE-NEXT: ldr w8, [sp, #16]618; NONEON-NOSVE-NEXT: csel w8, w9, w8, ne619; NONEON-NOSVE-NEXT: stp w8, w11, [sp, #24]620; NONEON-NOSVE-NEXT: ldr d0, [sp, #24]621; NONEON-NOSVE-NEXT: add sp, sp, #32622; NONEON-NOSVE-NEXT: ret623 %sel = select i1 %mask, <2 x i32> %op1, <2 x i32> %op2624 ret <2 x i32> %sel625}626 627define <4 x i32> @select_v4i32(<4 x i32> %op1, <4 x i32> %op2, i1 %mask) {628; CHECK-LABEL: select_v4i32:629; CHECK: // %bb.0:630; CHECK-NEXT: and w8, w0, #0x1631; CHECK-NEXT: ptrue p0.s632; CHECK-NEXT: // kill: def $q0 killed $q0 def $z0633; CHECK-NEXT: // kill: def $q1 killed $q1 def $z1634; CHECK-NEXT: mov z2.s, w8635; CHECK-NEXT: cmpne p0.s, p0/z, z2.s, #0636; CHECK-NEXT: sel z0.s, p0, z0.s, z1.s637; CHECK-NEXT: // kill: def $q0 killed $q0 killed $z0638; CHECK-NEXT: ret639;640; NONEON-NOSVE-LABEL: select_v4i32:641; NONEON-NOSVE: // %bb.0:642; NONEON-NOSVE-NEXT: stp q0, q1, [sp, #-48]!643; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 48644; NONEON-NOSVE-NEXT: ldp w9, w10, [sp, #8]645; NONEON-NOSVE-NEXT: ldr w8, [sp, #28]646; NONEON-NOSVE-NEXT: tst w0, #0x1647; NONEON-NOSVE-NEXT: csel w11, w10, w8, ne648; NONEON-NOSVE-NEXT: ldr w8, [sp, #24]649; NONEON-NOSVE-NEXT: csel w8, w9, w8, ne650; NONEON-NOSVE-NEXT: ldp w9, w10, [sp]651; NONEON-NOSVE-NEXT: stp w8, w11, [sp, #40]652; NONEON-NOSVE-NEXT: ldr w8, [sp, #20]653; NONEON-NOSVE-NEXT: csel w11, w10, w8, ne654; NONEON-NOSVE-NEXT: ldr w8, [sp, #16]655; NONEON-NOSVE-NEXT: csel w8, w9, w8, ne656; NONEON-NOSVE-NEXT: stp w8, w11, [sp, #32]657; NONEON-NOSVE-NEXT: ldr q0, [sp, #32]658; NONEON-NOSVE-NEXT: add sp, sp, #48659; NONEON-NOSVE-NEXT: ret660 %sel = select i1 %mask, <4 x i32> %op1, <4 x i32> %op2661 ret <4 x i32> %sel662}663 664define void @select_v8i32(ptr %a, ptr %b, i1 %mask) {665; CHECK-LABEL: select_v8i32:666; CHECK: // %bb.0:667; CHECK-NEXT: and w8, w2, #0x1668; CHECK-NEXT: ptrue p0.s669; CHECK-NEXT: mov z0.s, w8670; CHECK-NEXT: cmpne p0.s, p0/z, z0.s, #0671; CHECK-NEXT: ldr q0, [x0]672; CHECK-NEXT: ldr q1, [x0, #16]673; CHECK-NEXT: ldr q2, [x1]674; CHECK-NEXT: ldr q3, [x1, #16]675; CHECK-NEXT: sel z0.s, p0, z0.s, z2.s676; CHECK-NEXT: sel z1.s, p0, z1.s, z3.s677; CHECK-NEXT: stp q0, q1, [x0]678; CHECK-NEXT: ret679;680; NONEON-NOSVE-LABEL: select_v8i32:681; NONEON-NOSVE: // %bb.0:682; NONEON-NOSVE-NEXT: sub sp, sp, #96683; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 96684; NONEON-NOSVE-NEXT: ldr q0, [x0]685; NONEON-NOSVE-NEXT: ldr q1, [x0, #16]686; NONEON-NOSVE-NEXT: tst w2, #0x1687; NONEON-NOSVE-NEXT: ldr q2, [x1]688; NONEON-NOSVE-NEXT: ldr q3, [x1, #16]689; NONEON-NOSVE-NEXT: str q0, [sp]690; NONEON-NOSVE-NEXT: stp q1, q3, [sp, #16]691; NONEON-NOSVE-NEXT: ldp w9, w10, [sp, #40]692; NONEON-NOSVE-NEXT: ldr w8, [sp, #28]693; NONEON-NOSVE-NEXT: str q2, [sp, #48]694; NONEON-NOSVE-NEXT: csel w11, w8, w10, ne695; NONEON-NOSVE-NEXT: ldr w8, [sp, #24]696; NONEON-NOSVE-NEXT: csel w8, w8, w9, ne697; NONEON-NOSVE-NEXT: ldp w9, w10, [sp, #32]698; NONEON-NOSVE-NEXT: stp w8, w11, [sp, #72]699; NONEON-NOSVE-NEXT: ldr w8, [sp, #20]700; NONEON-NOSVE-NEXT: csel w11, w8, w10, ne701; NONEON-NOSVE-NEXT: ldr w8, [sp, #16]702; NONEON-NOSVE-NEXT: csel w8, w8, w9, ne703; NONEON-NOSVE-NEXT: ldp w9, w10, [sp, #56]704; NONEON-NOSVE-NEXT: stp w8, w11, [sp, #64]705; NONEON-NOSVE-NEXT: ldr w8, [sp, #12]706; NONEON-NOSVE-NEXT: csel w11, w8, w10, ne707; NONEON-NOSVE-NEXT: ldr w8, [sp, #8]708; NONEON-NOSVE-NEXT: csel w8, w8, w9, ne709; NONEON-NOSVE-NEXT: ldp w9, w10, [sp, #48]710; NONEON-NOSVE-NEXT: stp w8, w11, [sp, #88]711; NONEON-NOSVE-NEXT: ldr w8, [sp, #4]712; NONEON-NOSVE-NEXT: csel w11, w8, w10, ne713; NONEON-NOSVE-NEXT: ldr w8, [sp]714; NONEON-NOSVE-NEXT: csel w8, w8, w9, ne715; NONEON-NOSVE-NEXT: stp w8, w11, [sp, #80]716; NONEON-NOSVE-NEXT: ldp q1, q0, [sp, #64]717; NONEON-NOSVE-NEXT: stp q0, q1, [x0]718; NONEON-NOSVE-NEXT: add sp, sp, #96719; NONEON-NOSVE-NEXT: ret720 %op1 = load volatile <8 x i32>, ptr %a721 %op2 = load volatile <8 x i32>, ptr %b722 %sel = select i1 %mask, <8 x i32> %op1, <8 x i32> %op2723 store <8 x i32> %sel, ptr %a724 ret void725}726 727define <1 x i64> @select_v1i64(<1 x i64> %op1, <1 x i64> %op2, i1 %mask) {728; CHECK-LABEL: select_v1i64:729; CHECK: // %bb.0:730; CHECK-NEXT: // kill: def $w0 killed $w0 def $x0731; CHECK-NEXT: and x8, x0, #0x1732; CHECK-NEXT: ptrue p0.d733; CHECK-NEXT: // kill: def $d0 killed $d0 def $z0734; CHECK-NEXT: // kill: def $d1 killed $d1 def $z1735; CHECK-NEXT: mov z2.d, x8736; CHECK-NEXT: cmpne p0.d, p0/z, z2.d, #0737; CHECK-NEXT: sel z0.d, p0, z0.d, z1.d738; CHECK-NEXT: // kill: def $d0 killed $d0 killed $z0739; CHECK-NEXT: ret740;741; NONEON-NOSVE-LABEL: select_v1i64:742; NONEON-NOSVE: // %bb.0:743; NONEON-NOSVE-NEXT: sub sp, sp, #16744; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 16745; NONEON-NOSVE-NEXT: fmov x8, d1746; NONEON-NOSVE-NEXT: fmov x9, d0747; NONEON-NOSVE-NEXT: tst w0, #0x1748; NONEON-NOSVE-NEXT: csel x8, x9, x8, ne749; NONEON-NOSVE-NEXT: str x8, [sp, #8]750; NONEON-NOSVE-NEXT: ldr d0, [sp, #8]751; NONEON-NOSVE-NEXT: add sp, sp, #16752; NONEON-NOSVE-NEXT: ret753 %sel = select i1 %mask, <1 x i64> %op1, <1 x i64> %op2754 ret <1 x i64> %sel755}756 757define <2 x i64> @select_v2i64(<2 x i64> %op1, <2 x i64> %op2, i1 %mask) {758; CHECK-LABEL: select_v2i64:759; CHECK: // %bb.0:760; CHECK-NEXT: // kill: def $w0 killed $w0 def $x0761; CHECK-NEXT: and x8, x0, #0x1762; CHECK-NEXT: ptrue p0.d763; CHECK-NEXT: // kill: def $q0 killed $q0 def $z0764; CHECK-NEXT: // kill: def $q1 killed $q1 def $z1765; CHECK-NEXT: mov z2.d, x8766; CHECK-NEXT: cmpne p0.d, p0/z, z2.d, #0767; CHECK-NEXT: sel z0.d, p0, z0.d, z1.d768; CHECK-NEXT: // kill: def $q0 killed $q0 killed $z0769; CHECK-NEXT: ret770;771; NONEON-NOSVE-LABEL: select_v2i64:772; NONEON-NOSVE: // %bb.0:773; NONEON-NOSVE-NEXT: stp q0, q1, [sp, #-48]!774; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 48775; NONEON-NOSVE-NEXT: ldp x9, x10, [sp]776; NONEON-NOSVE-NEXT: tst w0, #0x1777; NONEON-NOSVE-NEXT: ldr x8, [sp, #24]778; NONEON-NOSVE-NEXT: csel x11, x10, x8, ne779; NONEON-NOSVE-NEXT: ldr x8, [sp, #16]780; NONEON-NOSVE-NEXT: csel x8, x9, x8, ne781; NONEON-NOSVE-NEXT: stp x8, x11, [sp, #32]782; NONEON-NOSVE-NEXT: ldr q0, [sp, #32]783; NONEON-NOSVE-NEXT: add sp, sp, #48784; NONEON-NOSVE-NEXT: ret785 %sel = select i1 %mask, <2 x i64> %op1, <2 x i64> %op2786 ret <2 x i64> %sel787}788 789define void @select_v4i64(ptr %a, ptr %b, i1 %mask) {790; CHECK-LABEL: select_v4i64:791; CHECK: // %bb.0:792; CHECK-NEXT: // kill: def $w2 killed $w2 def $x2793; CHECK-NEXT: and x8, x2, #0x1794; CHECK-NEXT: ptrue p0.d795; CHECK-NEXT: mov z0.d, x8796; CHECK-NEXT: cmpne p0.d, p0/z, z0.d, #0797; CHECK-NEXT: ldr q0, [x0]798; CHECK-NEXT: ldr q1, [x0, #16]799; CHECK-NEXT: ldr q2, [x1]800; CHECK-NEXT: ldr q3, [x1, #16]801; CHECK-NEXT: sel z0.d, p0, z0.d, z2.d802; CHECK-NEXT: sel z1.d, p0, z1.d, z3.d803; CHECK-NEXT: stp q0, q1, [x0]804; CHECK-NEXT: ret805;806; NONEON-NOSVE-LABEL: select_v4i64:807; NONEON-NOSVE: // %bb.0:808; NONEON-NOSVE-NEXT: sub sp, sp, #96809; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 96810; NONEON-NOSVE-NEXT: ldr q0, [x0]811; NONEON-NOSVE-NEXT: ldr q1, [x0, #16]812; NONEON-NOSVE-NEXT: tst w2, #0x1813; NONEON-NOSVE-NEXT: ldr q2, [x1]814; NONEON-NOSVE-NEXT: ldr q3, [x1, #16]815; NONEON-NOSVE-NEXT: str q0, [sp]816; NONEON-NOSVE-NEXT: stp q1, q3, [sp, #16]817; NONEON-NOSVE-NEXT: ldp x9, x10, [sp, #32]818; NONEON-NOSVE-NEXT: ldr x8, [sp, #24]819; NONEON-NOSVE-NEXT: str q2, [sp, #48]820; NONEON-NOSVE-NEXT: csel x11, x8, x10, ne821; NONEON-NOSVE-NEXT: ldr x8, [sp, #16]822; NONEON-NOSVE-NEXT: csel x8, x8, x9, ne823; NONEON-NOSVE-NEXT: ldp x9, x10, [sp, #48]824; NONEON-NOSVE-NEXT: stp x8, x11, [sp, #64]825; NONEON-NOSVE-NEXT: ldr x8, [sp, #8]826; NONEON-NOSVE-NEXT: csel x11, x8, x10, ne827; NONEON-NOSVE-NEXT: ldr x8, [sp]828; NONEON-NOSVE-NEXT: csel x8, x8, x9, ne829; NONEON-NOSVE-NEXT: stp x8, x11, [sp, #80]830; NONEON-NOSVE-NEXT: ldp q1, q0, [sp, #64]831; NONEON-NOSVE-NEXT: stp q0, q1, [x0]832; NONEON-NOSVE-NEXT: add sp, sp, #96833; NONEON-NOSVE-NEXT: ret834 %op1 = load volatile <4 x i64>, ptr %a835 %op2 = load volatile <4 x i64>, ptr %b836 %sel = select i1 %mask, <4 x i64> %op1, <4 x i64> %op2837 store <4 x i64> %sel, ptr %a838 ret void839}840