1338 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 6 7target triple = "aarch64-unknown-linux-gnu"8 9;10; RBIT11;12 13define <4 x i8> @bitreverse_v4i8(<4 x i8> %op) {14; CHECK-LABEL: bitreverse_v4i8:15; CHECK: // %bb.0:16; CHECK-NEXT: ptrue p0.h, vl417; CHECK-NEXT: // kill: def $d0 killed $d0 def $z018; CHECK-NEXT: rbit z0.h, p0/m, z0.h19; CHECK-NEXT: lsr z0.h, z0.h, #820; CHECK-NEXT: // kill: def $d0 killed $d0 killed $z021; CHECK-NEXT: ret22;23; NONEON-NOSVE-LABEL: bitreverse_v4i8:24; NONEON-NOSVE: // %bb.0:25; NONEON-NOSVE-NEXT: str d0, [sp, #-16]!26; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 1627; NONEON-NOSVE-NEXT: ldrh w8, [sp, #6]28; NONEON-NOSVE-NEXT: rbit w8, w829; NONEON-NOSVE-NEXT: lsr w8, w8, #2430; NONEON-NOSVE-NEXT: strh w8, [sp, #14]31; NONEON-NOSVE-NEXT: ldrh w8, [sp, #4]32; NONEON-NOSVE-NEXT: rbit w8, w833; NONEON-NOSVE-NEXT: lsr w8, w8, #2434; NONEON-NOSVE-NEXT: strh w8, [sp, #12]35; NONEON-NOSVE-NEXT: ldrh w8, [sp, #2]36; NONEON-NOSVE-NEXT: rbit w8, w837; NONEON-NOSVE-NEXT: lsr w8, w8, #2438; NONEON-NOSVE-NEXT: strh w8, [sp, #10]39; NONEON-NOSVE-NEXT: ldrh w8, [sp]40; NONEON-NOSVE-NEXT: rbit w8, w841; NONEON-NOSVE-NEXT: lsr w8, w8, #2442; NONEON-NOSVE-NEXT: strh w8, [sp, #8]43; NONEON-NOSVE-NEXT: ldr d0, [sp, #8]44; NONEON-NOSVE-NEXT: add sp, sp, #1645; NONEON-NOSVE-NEXT: ret46 %res = call <4 x i8> @llvm.bitreverse.v4i8(<4 x i8> %op)47 ret <4 x i8> %res48}49 50define <8 x i8> @bitreverse_v8i8(<8 x i8> %op) {51; CHECK-LABEL: bitreverse_v8i8:52; CHECK: // %bb.0:53; CHECK-NEXT: ptrue p0.b, vl854; CHECK-NEXT: // kill: def $d0 killed $d0 def $z055; CHECK-NEXT: rbit z0.b, p0/m, z0.b56; CHECK-NEXT: // kill: def $d0 killed $d0 killed $z057; CHECK-NEXT: ret58;59; NONEON-NOSVE-LABEL: bitreverse_v8i8:60; NONEON-NOSVE: // %bb.0:61; NONEON-NOSVE-NEXT: str d0, [sp, #-16]!62; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 1663; NONEON-NOSVE-NEXT: ldrb w8, [sp, #7]64; NONEON-NOSVE-NEXT: rbit w8, w865; NONEON-NOSVE-NEXT: lsr w8, w8, #2466; NONEON-NOSVE-NEXT: strb w8, [sp, #15]67; NONEON-NOSVE-NEXT: ldrb w8, [sp, #6]68; NONEON-NOSVE-NEXT: rbit w8, w869; NONEON-NOSVE-NEXT: lsr w8, w8, #2470; NONEON-NOSVE-NEXT: strb w8, [sp, #14]71; NONEON-NOSVE-NEXT: ldrb w8, [sp, #5]72; NONEON-NOSVE-NEXT: rbit w8, w873; NONEON-NOSVE-NEXT: lsr w8, w8, #2474; NONEON-NOSVE-NEXT: strb w8, [sp, #13]75; NONEON-NOSVE-NEXT: ldrb w8, [sp, #4]76; NONEON-NOSVE-NEXT: rbit w8, w877; NONEON-NOSVE-NEXT: lsr w8, w8, #2478; NONEON-NOSVE-NEXT: strb w8, [sp, #12]79; NONEON-NOSVE-NEXT: ldrb w8, [sp, #3]80; NONEON-NOSVE-NEXT: rbit w8, w881; NONEON-NOSVE-NEXT: lsr w8, w8, #2482; NONEON-NOSVE-NEXT: strb w8, [sp, #11]83; NONEON-NOSVE-NEXT: ldrb w8, [sp, #2]84; NONEON-NOSVE-NEXT: rbit w8, w885; NONEON-NOSVE-NEXT: lsr w8, w8, #2486; NONEON-NOSVE-NEXT: strb w8, [sp, #10]87; NONEON-NOSVE-NEXT: ldrb w8, [sp, #1]88; NONEON-NOSVE-NEXT: rbit w8, w889; NONEON-NOSVE-NEXT: lsr w8, w8, #2490; NONEON-NOSVE-NEXT: strb w8, [sp, #9]91; NONEON-NOSVE-NEXT: ldrb w8, [sp]92; NONEON-NOSVE-NEXT: rbit w8, w893; NONEON-NOSVE-NEXT: lsr w8, w8, #2494; NONEON-NOSVE-NEXT: strb w8, [sp, #8]95; NONEON-NOSVE-NEXT: ldr d0, [sp, #8]96; NONEON-NOSVE-NEXT: add sp, sp, #1697; NONEON-NOSVE-NEXT: ret98 %res = call <8 x i8> @llvm.bitreverse.v8i8(<8 x i8> %op)99 ret <8 x i8> %res100}101 102define <16 x i8> @bitreverse_v16i8(<16 x i8> %op) {103; CHECK-LABEL: bitreverse_v16i8:104; CHECK: // %bb.0:105; CHECK-NEXT: ptrue p0.b, vl16106; CHECK-NEXT: // kill: def $q0 killed $q0 def $z0107; CHECK-NEXT: rbit z0.b, p0/m, z0.b108; CHECK-NEXT: // kill: def $q0 killed $q0 killed $z0109; CHECK-NEXT: ret110;111; NONEON-NOSVE-LABEL: bitreverse_v16i8:112; NONEON-NOSVE: // %bb.0:113; NONEON-NOSVE-NEXT: str q0, [sp, #-32]!114; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 32115; NONEON-NOSVE-NEXT: ldrb w8, [sp, #15]116; NONEON-NOSVE-NEXT: rbit w8, w8117; NONEON-NOSVE-NEXT: lsr w8, w8, #24118; NONEON-NOSVE-NEXT: strb w8, [sp, #31]119; NONEON-NOSVE-NEXT: ldrb w8, [sp, #14]120; NONEON-NOSVE-NEXT: rbit w8, w8121; NONEON-NOSVE-NEXT: lsr w8, w8, #24122; NONEON-NOSVE-NEXT: strb w8, [sp, #30]123; NONEON-NOSVE-NEXT: ldrb w8, [sp, #13]124; NONEON-NOSVE-NEXT: rbit w8, w8125; NONEON-NOSVE-NEXT: lsr w8, w8, #24126; NONEON-NOSVE-NEXT: strb w8, [sp, #29]127; NONEON-NOSVE-NEXT: ldrb w8, [sp, #12]128; NONEON-NOSVE-NEXT: rbit w8, w8129; NONEON-NOSVE-NEXT: lsr w8, w8, #24130; NONEON-NOSVE-NEXT: strb w8, [sp, #28]131; NONEON-NOSVE-NEXT: ldrb w8, [sp, #11]132; NONEON-NOSVE-NEXT: rbit w8, w8133; NONEON-NOSVE-NEXT: lsr w8, w8, #24134; NONEON-NOSVE-NEXT: strb w8, [sp, #27]135; NONEON-NOSVE-NEXT: ldrb w8, [sp, #10]136; NONEON-NOSVE-NEXT: rbit w8, w8137; NONEON-NOSVE-NEXT: lsr w8, w8, #24138; NONEON-NOSVE-NEXT: strb w8, [sp, #26]139; NONEON-NOSVE-NEXT: ldrb w8, [sp, #9]140; NONEON-NOSVE-NEXT: rbit w8, w8141; NONEON-NOSVE-NEXT: lsr w8, w8, #24142; NONEON-NOSVE-NEXT: strb w8, [sp, #25]143; NONEON-NOSVE-NEXT: ldrb w8, [sp, #8]144; NONEON-NOSVE-NEXT: rbit w8, w8145; NONEON-NOSVE-NEXT: lsr w8, w8, #24146; NONEON-NOSVE-NEXT: strb w8, [sp, #24]147; NONEON-NOSVE-NEXT: ldrb w8, [sp, #7]148; NONEON-NOSVE-NEXT: rbit w8, w8149; NONEON-NOSVE-NEXT: lsr w8, w8, #24150; NONEON-NOSVE-NEXT: strb w8, [sp, #23]151; NONEON-NOSVE-NEXT: ldrb w8, [sp, #6]152; NONEON-NOSVE-NEXT: rbit w8, w8153; NONEON-NOSVE-NEXT: lsr w8, w8, #24154; NONEON-NOSVE-NEXT: strb w8, [sp, #22]155; NONEON-NOSVE-NEXT: ldrb w8, [sp, #5]156; NONEON-NOSVE-NEXT: rbit w8, w8157; NONEON-NOSVE-NEXT: lsr w8, w8, #24158; NONEON-NOSVE-NEXT: strb w8, [sp, #21]159; NONEON-NOSVE-NEXT: ldrb w8, [sp, #4]160; NONEON-NOSVE-NEXT: rbit w8, w8161; NONEON-NOSVE-NEXT: lsr w8, w8, #24162; NONEON-NOSVE-NEXT: strb w8, [sp, #20]163; NONEON-NOSVE-NEXT: ldrb w8, [sp, #3]164; NONEON-NOSVE-NEXT: rbit w8, w8165; NONEON-NOSVE-NEXT: lsr w8, w8, #24166; NONEON-NOSVE-NEXT: strb w8, [sp, #19]167; NONEON-NOSVE-NEXT: ldrb w8, [sp, #2]168; NONEON-NOSVE-NEXT: rbit w8, w8169; NONEON-NOSVE-NEXT: lsr w8, w8, #24170; NONEON-NOSVE-NEXT: strb w8, [sp, #18]171; NONEON-NOSVE-NEXT: ldrb w8, [sp, #1]172; NONEON-NOSVE-NEXT: rbit w8, w8173; NONEON-NOSVE-NEXT: lsr w8, w8, #24174; NONEON-NOSVE-NEXT: strb w8, [sp, #17]175; NONEON-NOSVE-NEXT: ldrb w8, [sp]176; NONEON-NOSVE-NEXT: rbit w8, w8177; NONEON-NOSVE-NEXT: lsr w8, w8, #24178; NONEON-NOSVE-NEXT: strb w8, [sp, #16]179; NONEON-NOSVE-NEXT: ldr q0, [sp, #16]180; NONEON-NOSVE-NEXT: add sp, sp, #32181; NONEON-NOSVE-NEXT: ret182 %res = call <16 x i8> @llvm.bitreverse.v16i8(<16 x i8> %op)183 ret <16 x i8> %res184}185 186define void @bitreverse_v32i8(ptr %a) {187; CHECK-LABEL: bitreverse_v32i8:188; CHECK: // %bb.0:189; CHECK-NEXT: ldp q0, q1, [x0]190; CHECK-NEXT: ptrue p0.b, vl16191; CHECK-NEXT: rbit z0.b, p0/m, z0.b192; CHECK-NEXT: rbit z1.b, p0/m, z1.b193; CHECK-NEXT: stp q0, q1, [x0]194; CHECK-NEXT: ret195;196; NONEON-NOSVE-LABEL: bitreverse_v32i8:197; NONEON-NOSVE: // %bb.0:198; NONEON-NOSVE-NEXT: ldp q1, q0, [x0]199; NONEON-NOSVE-NEXT: stp q1, q0, [sp, #-64]!200; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 64201; NONEON-NOSVE-NEXT: ldrb w8, [sp, #31]202; NONEON-NOSVE-NEXT: rbit w8, w8203; NONEON-NOSVE-NEXT: lsr w8, w8, #24204; NONEON-NOSVE-NEXT: strb w8, [sp, #63]205; NONEON-NOSVE-NEXT: ldrb w8, [sp, #30]206; NONEON-NOSVE-NEXT: rbit w8, w8207; NONEON-NOSVE-NEXT: lsr w8, w8, #24208; NONEON-NOSVE-NEXT: strb w8, [sp, #62]209; NONEON-NOSVE-NEXT: ldrb w8, [sp, #29]210; NONEON-NOSVE-NEXT: rbit w8, w8211; NONEON-NOSVE-NEXT: lsr w8, w8, #24212; NONEON-NOSVE-NEXT: strb w8, [sp, #61]213; NONEON-NOSVE-NEXT: ldrb w8, [sp, #28]214; NONEON-NOSVE-NEXT: rbit w8, w8215; NONEON-NOSVE-NEXT: lsr w8, w8, #24216; NONEON-NOSVE-NEXT: strb w8, [sp, #60]217; NONEON-NOSVE-NEXT: ldrb w8, [sp, #27]218; NONEON-NOSVE-NEXT: rbit w8, w8219; NONEON-NOSVE-NEXT: lsr w8, w8, #24220; NONEON-NOSVE-NEXT: strb w8, [sp, #59]221; NONEON-NOSVE-NEXT: ldrb w8, [sp, #26]222; NONEON-NOSVE-NEXT: rbit w8, w8223; NONEON-NOSVE-NEXT: lsr w8, w8, #24224; NONEON-NOSVE-NEXT: strb w8, [sp, #58]225; NONEON-NOSVE-NEXT: ldrb w8, [sp, #25]226; NONEON-NOSVE-NEXT: rbit w8, w8227; NONEON-NOSVE-NEXT: lsr w8, w8, #24228; NONEON-NOSVE-NEXT: strb w8, [sp, #57]229; NONEON-NOSVE-NEXT: ldrb w8, [sp, #24]230; NONEON-NOSVE-NEXT: rbit w8, w8231; NONEON-NOSVE-NEXT: lsr w8, w8, #24232; NONEON-NOSVE-NEXT: strb w8, [sp, #56]233; NONEON-NOSVE-NEXT: ldrb w8, [sp, #23]234; NONEON-NOSVE-NEXT: rbit w8, w8235; NONEON-NOSVE-NEXT: lsr w8, w8, #24236; NONEON-NOSVE-NEXT: strb w8, [sp, #55]237; NONEON-NOSVE-NEXT: ldrb w8, [sp, #22]238; NONEON-NOSVE-NEXT: rbit w8, w8239; NONEON-NOSVE-NEXT: lsr w8, w8, #24240; NONEON-NOSVE-NEXT: strb w8, [sp, #54]241; NONEON-NOSVE-NEXT: ldrb w8, [sp, #21]242; NONEON-NOSVE-NEXT: rbit w8, w8243; NONEON-NOSVE-NEXT: lsr w8, w8, #24244; NONEON-NOSVE-NEXT: strb w8, [sp, #53]245; NONEON-NOSVE-NEXT: ldrb w8, [sp, #20]246; NONEON-NOSVE-NEXT: rbit w8, w8247; NONEON-NOSVE-NEXT: lsr w8, w8, #24248; NONEON-NOSVE-NEXT: strb w8, [sp, #52]249; NONEON-NOSVE-NEXT: ldrb w8, [sp, #19]250; NONEON-NOSVE-NEXT: rbit w8, w8251; NONEON-NOSVE-NEXT: lsr w8, w8, #24252; NONEON-NOSVE-NEXT: strb w8, [sp, #51]253; NONEON-NOSVE-NEXT: ldrb w8, [sp, #18]254; NONEON-NOSVE-NEXT: rbit w8, w8255; NONEON-NOSVE-NEXT: lsr w8, w8, #24256; NONEON-NOSVE-NEXT: strb w8, [sp, #50]257; NONEON-NOSVE-NEXT: ldrb w8, [sp, #17]258; NONEON-NOSVE-NEXT: rbit w8, w8259; NONEON-NOSVE-NEXT: lsr w8, w8, #24260; NONEON-NOSVE-NEXT: strb w8, [sp, #49]261; NONEON-NOSVE-NEXT: ldrb w8, [sp, #16]262; NONEON-NOSVE-NEXT: rbit w8, w8263; NONEON-NOSVE-NEXT: lsr w8, w8, #24264; NONEON-NOSVE-NEXT: strb w8, [sp, #48]265; NONEON-NOSVE-NEXT: ldrb w8, [sp, #15]266; NONEON-NOSVE-NEXT: rbit w8, w8267; NONEON-NOSVE-NEXT: lsr w8, w8, #24268; NONEON-NOSVE-NEXT: strb w8, [sp, #47]269; NONEON-NOSVE-NEXT: ldrb w8, [sp, #14]270; NONEON-NOSVE-NEXT: rbit w8, w8271; NONEON-NOSVE-NEXT: lsr w8, w8, #24272; NONEON-NOSVE-NEXT: strb w8, [sp, #46]273; NONEON-NOSVE-NEXT: ldrb w8, [sp, #13]274; NONEON-NOSVE-NEXT: rbit w8, w8275; NONEON-NOSVE-NEXT: lsr w8, w8, #24276; NONEON-NOSVE-NEXT: strb w8, [sp, #45]277; NONEON-NOSVE-NEXT: ldrb w8, [sp, #12]278; NONEON-NOSVE-NEXT: rbit w8, w8279; NONEON-NOSVE-NEXT: lsr w8, w8, #24280; NONEON-NOSVE-NEXT: strb w8, [sp, #44]281; NONEON-NOSVE-NEXT: ldrb w8, [sp, #11]282; NONEON-NOSVE-NEXT: rbit w8, w8283; NONEON-NOSVE-NEXT: lsr w8, w8, #24284; NONEON-NOSVE-NEXT: strb w8, [sp, #43]285; NONEON-NOSVE-NEXT: ldrb w8, [sp, #10]286; NONEON-NOSVE-NEXT: rbit w8, w8287; NONEON-NOSVE-NEXT: lsr w8, w8, #24288; NONEON-NOSVE-NEXT: strb w8, [sp, #42]289; NONEON-NOSVE-NEXT: ldrb w8, [sp, #9]290; NONEON-NOSVE-NEXT: rbit w8, w8291; NONEON-NOSVE-NEXT: lsr w8, w8, #24292; NONEON-NOSVE-NEXT: strb w8, [sp, #41]293; NONEON-NOSVE-NEXT: ldrb w8, [sp, #8]294; NONEON-NOSVE-NEXT: rbit w8, w8295; NONEON-NOSVE-NEXT: lsr w8, w8, #24296; NONEON-NOSVE-NEXT: strb w8, [sp, #40]297; NONEON-NOSVE-NEXT: ldrb w8, [sp, #7]298; NONEON-NOSVE-NEXT: rbit w8, w8299; NONEON-NOSVE-NEXT: lsr w8, w8, #24300; NONEON-NOSVE-NEXT: strb w8, [sp, #39]301; NONEON-NOSVE-NEXT: ldrb w8, [sp, #6]302; NONEON-NOSVE-NEXT: rbit w8, w8303; NONEON-NOSVE-NEXT: lsr w8, w8, #24304; NONEON-NOSVE-NEXT: strb w8, [sp, #38]305; NONEON-NOSVE-NEXT: ldrb w8, [sp, #5]306; NONEON-NOSVE-NEXT: rbit w8, w8307; NONEON-NOSVE-NEXT: lsr w8, w8, #24308; NONEON-NOSVE-NEXT: strb w8, [sp, #37]309; NONEON-NOSVE-NEXT: ldrb w8, [sp, #4]310; NONEON-NOSVE-NEXT: rbit w8, w8311; NONEON-NOSVE-NEXT: lsr w8, w8, #24312; NONEON-NOSVE-NEXT: strb w8, [sp, #36]313; NONEON-NOSVE-NEXT: ldrb w8, [sp, #3]314; NONEON-NOSVE-NEXT: rbit w8, w8315; NONEON-NOSVE-NEXT: lsr w8, w8, #24316; NONEON-NOSVE-NEXT: strb w8, [sp, #35]317; NONEON-NOSVE-NEXT: ldrb w8, [sp, #2]318; NONEON-NOSVE-NEXT: rbit w8, w8319; NONEON-NOSVE-NEXT: lsr w8, w8, #24320; NONEON-NOSVE-NEXT: strb w8, [sp, #34]321; NONEON-NOSVE-NEXT: ldrb w8, [sp, #1]322; NONEON-NOSVE-NEXT: rbit w8, w8323; NONEON-NOSVE-NEXT: lsr w8, w8, #24324; NONEON-NOSVE-NEXT: strb w8, [sp, #33]325; NONEON-NOSVE-NEXT: ldrb w8, [sp]326; NONEON-NOSVE-NEXT: rbit w8, w8327; NONEON-NOSVE-NEXT: lsr w8, w8, #24328; NONEON-NOSVE-NEXT: strb w8, [sp, #32]329; NONEON-NOSVE-NEXT: ldp q0, q1, [sp, #32]330; NONEON-NOSVE-NEXT: stp q0, q1, [x0]331; NONEON-NOSVE-NEXT: add sp, sp, #64332; NONEON-NOSVE-NEXT: ret333 %op = load <32 x i8>, ptr %a334 %res = call <32 x i8> @llvm.bitreverse.v32i8(<32 x i8> %op)335 store <32 x i8> %res, ptr %a336 ret void337}338 339define <2 x i16> @bitreverse_v2i16(<2 x i16> %op) {340; CHECK-LABEL: bitreverse_v2i16:341; CHECK: // %bb.0:342; CHECK-NEXT: ptrue p0.s, vl2343; CHECK-NEXT: // kill: def $d0 killed $d0 def $z0344; CHECK-NEXT: rbit z0.s, p0/m, z0.s345; CHECK-NEXT: lsr z0.s, z0.s, #16346; CHECK-NEXT: // kill: def $d0 killed $d0 killed $z0347; CHECK-NEXT: ret348;349; NONEON-NOSVE-LABEL: bitreverse_v2i16:350; NONEON-NOSVE: // %bb.0:351; NONEON-NOSVE-NEXT: str d0, [sp, #-16]!352; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 16353; NONEON-NOSVE-NEXT: ldr w8, [sp, #4]354; NONEON-NOSVE-NEXT: rbit w8, w8355; NONEON-NOSVE-NEXT: lsr w9, w8, #16356; NONEON-NOSVE-NEXT: ldr w8, [sp]357; NONEON-NOSVE-NEXT: rbit w8, w8358; NONEON-NOSVE-NEXT: lsr w8, w8, #16359; NONEON-NOSVE-NEXT: stp w8, w9, [sp, #8]360; NONEON-NOSVE-NEXT: ldr d0, [sp, #8]361; NONEON-NOSVE-NEXT: add sp, sp, #16362; NONEON-NOSVE-NEXT: ret363 %res = call <2 x i16> @llvm.bitreverse.v2i16(<2 x i16> %op)364 ret <2 x i16> %res365}366 367define <4 x i16> @bitreverse_v4i16(<4 x i16> %op) {368; CHECK-LABEL: bitreverse_v4i16:369; CHECK: // %bb.0:370; CHECK-NEXT: ptrue p0.h, vl4371; CHECK-NEXT: // kill: def $d0 killed $d0 def $z0372; CHECK-NEXT: rbit z0.h, p0/m, z0.h373; CHECK-NEXT: // kill: def $d0 killed $d0 killed $z0374; CHECK-NEXT: ret375;376; NONEON-NOSVE-LABEL: bitreverse_v4i16:377; NONEON-NOSVE: // %bb.0:378; NONEON-NOSVE-NEXT: str d0, [sp, #-16]!379; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 16380; NONEON-NOSVE-NEXT: ldrh w8, [sp, #6]381; NONEON-NOSVE-NEXT: rbit w8, w8382; NONEON-NOSVE-NEXT: lsr w8, w8, #16383; NONEON-NOSVE-NEXT: strh w8, [sp, #14]384; NONEON-NOSVE-NEXT: ldrh w8, [sp, #4]385; NONEON-NOSVE-NEXT: rbit w8, w8386; NONEON-NOSVE-NEXT: lsr w8, w8, #16387; NONEON-NOSVE-NEXT: strh w8, [sp, #12]388; NONEON-NOSVE-NEXT: ldrh w8, [sp, #2]389; NONEON-NOSVE-NEXT: rbit w8, w8390; NONEON-NOSVE-NEXT: lsr w8, w8, #16391; NONEON-NOSVE-NEXT: strh w8, [sp, #10]392; NONEON-NOSVE-NEXT: ldrh w8, [sp]393; NONEON-NOSVE-NEXT: rbit w8, w8394; NONEON-NOSVE-NEXT: lsr w8, w8, #16395; NONEON-NOSVE-NEXT: strh w8, [sp, #8]396; NONEON-NOSVE-NEXT: ldr d0, [sp, #8]397; NONEON-NOSVE-NEXT: add sp, sp, #16398; NONEON-NOSVE-NEXT: ret399 %res = call <4 x i16> @llvm.bitreverse.v4i16(<4 x i16> %op)400 ret <4 x i16> %res401}402 403define <8 x i16> @bitreverse_v8i16(<8 x i16> %op) {404; CHECK-LABEL: bitreverse_v8i16:405; CHECK: // %bb.0:406; CHECK-NEXT: ptrue p0.h, vl8407; CHECK-NEXT: // kill: def $q0 killed $q0 def $z0408; CHECK-NEXT: rbit z0.h, p0/m, z0.h409; CHECK-NEXT: // kill: def $q0 killed $q0 killed $z0410; CHECK-NEXT: ret411;412; NONEON-NOSVE-LABEL: bitreverse_v8i16:413; NONEON-NOSVE: // %bb.0:414; NONEON-NOSVE-NEXT: str q0, [sp, #-32]!415; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 32416; NONEON-NOSVE-NEXT: ldrh w8, [sp, #14]417; NONEON-NOSVE-NEXT: rbit w8, w8418; NONEON-NOSVE-NEXT: lsr w8, w8, #16419; NONEON-NOSVE-NEXT: strh w8, [sp, #30]420; NONEON-NOSVE-NEXT: ldrh w8, [sp, #12]421; NONEON-NOSVE-NEXT: rbit w8, w8422; NONEON-NOSVE-NEXT: lsr w8, w8, #16423; NONEON-NOSVE-NEXT: strh w8, [sp, #28]424; NONEON-NOSVE-NEXT: ldrh w8, [sp, #10]425; NONEON-NOSVE-NEXT: rbit w8, w8426; NONEON-NOSVE-NEXT: lsr w8, w8, #16427; NONEON-NOSVE-NEXT: strh w8, [sp, #26]428; NONEON-NOSVE-NEXT: ldrh w8, [sp, #8]429; NONEON-NOSVE-NEXT: rbit w8, w8430; NONEON-NOSVE-NEXT: lsr w8, w8, #16431; NONEON-NOSVE-NEXT: strh w8, [sp, #24]432; NONEON-NOSVE-NEXT: ldrh w8, [sp, #6]433; NONEON-NOSVE-NEXT: rbit w8, w8434; NONEON-NOSVE-NEXT: lsr w8, w8, #16435; NONEON-NOSVE-NEXT: strh w8, [sp, #22]436; NONEON-NOSVE-NEXT: ldrh w8, [sp, #4]437; NONEON-NOSVE-NEXT: rbit w8, w8438; NONEON-NOSVE-NEXT: lsr w8, w8, #16439; NONEON-NOSVE-NEXT: strh w8, [sp, #20]440; NONEON-NOSVE-NEXT: ldrh w8, [sp, #2]441; NONEON-NOSVE-NEXT: rbit w8, w8442; NONEON-NOSVE-NEXT: lsr w8, w8, #16443; NONEON-NOSVE-NEXT: strh w8, [sp, #18]444; NONEON-NOSVE-NEXT: ldrh w8, [sp]445; NONEON-NOSVE-NEXT: rbit w8, w8446; NONEON-NOSVE-NEXT: lsr w8, w8, #16447; NONEON-NOSVE-NEXT: strh w8, [sp, #16]448; NONEON-NOSVE-NEXT: ldr q0, [sp, #16]449; NONEON-NOSVE-NEXT: add sp, sp, #32450; NONEON-NOSVE-NEXT: ret451 %res = call <8 x i16> @llvm.bitreverse.v8i16(<8 x i16> %op)452 ret <8 x i16> %res453}454 455define void @bitreverse_v16i16(ptr %a) {456; CHECK-LABEL: bitreverse_v16i16:457; CHECK: // %bb.0:458; CHECK-NEXT: ldp q0, q1, [x0]459; CHECK-NEXT: ptrue p0.h, vl8460; CHECK-NEXT: rbit z0.h, p0/m, z0.h461; CHECK-NEXT: rbit z1.h, p0/m, z1.h462; CHECK-NEXT: stp q0, q1, [x0]463; CHECK-NEXT: ret464;465; NONEON-NOSVE-LABEL: bitreverse_v16i16:466; NONEON-NOSVE: // %bb.0:467; NONEON-NOSVE-NEXT: ldp q1, q0, [x0]468; NONEON-NOSVE-NEXT: stp q1, q0, [sp, #-64]!469; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 64470; NONEON-NOSVE-NEXT: ldrh w8, [sp, #30]471; NONEON-NOSVE-NEXT: rbit w8, w8472; NONEON-NOSVE-NEXT: lsr w8, w8, #16473; NONEON-NOSVE-NEXT: strh w8, [sp, #62]474; NONEON-NOSVE-NEXT: ldrh w8, [sp, #28]475; NONEON-NOSVE-NEXT: rbit w8, w8476; NONEON-NOSVE-NEXT: lsr w8, w8, #16477; NONEON-NOSVE-NEXT: strh w8, [sp, #60]478; NONEON-NOSVE-NEXT: ldrh w8, [sp, #26]479; NONEON-NOSVE-NEXT: rbit w8, w8480; NONEON-NOSVE-NEXT: lsr w8, w8, #16481; NONEON-NOSVE-NEXT: strh w8, [sp, #58]482; NONEON-NOSVE-NEXT: ldrh w8, [sp, #24]483; NONEON-NOSVE-NEXT: rbit w8, w8484; NONEON-NOSVE-NEXT: lsr w8, w8, #16485; NONEON-NOSVE-NEXT: strh w8, [sp, #56]486; NONEON-NOSVE-NEXT: ldrh w8, [sp, #22]487; NONEON-NOSVE-NEXT: rbit w8, w8488; NONEON-NOSVE-NEXT: lsr w8, w8, #16489; NONEON-NOSVE-NEXT: strh w8, [sp, #54]490; NONEON-NOSVE-NEXT: ldrh w8, [sp, #20]491; NONEON-NOSVE-NEXT: rbit w8, w8492; NONEON-NOSVE-NEXT: lsr w8, w8, #16493; NONEON-NOSVE-NEXT: strh w8, [sp, #52]494; NONEON-NOSVE-NEXT: ldrh w8, [sp, #18]495; NONEON-NOSVE-NEXT: rbit w8, w8496; NONEON-NOSVE-NEXT: lsr w8, w8, #16497; NONEON-NOSVE-NEXT: strh w8, [sp, #50]498; NONEON-NOSVE-NEXT: ldrh w8, [sp, #16]499; NONEON-NOSVE-NEXT: rbit w8, w8500; NONEON-NOSVE-NEXT: lsr w8, w8, #16501; NONEON-NOSVE-NEXT: strh w8, [sp, #48]502; NONEON-NOSVE-NEXT: ldrh w8, [sp, #14]503; NONEON-NOSVE-NEXT: rbit w8, w8504; NONEON-NOSVE-NEXT: lsr w8, w8, #16505; NONEON-NOSVE-NEXT: strh w8, [sp, #46]506; NONEON-NOSVE-NEXT: ldrh w8, [sp, #12]507; NONEON-NOSVE-NEXT: rbit w8, w8508; NONEON-NOSVE-NEXT: lsr w8, w8, #16509; NONEON-NOSVE-NEXT: strh w8, [sp, #44]510; NONEON-NOSVE-NEXT: ldrh w8, [sp, #10]511; NONEON-NOSVE-NEXT: rbit w8, w8512; NONEON-NOSVE-NEXT: lsr w8, w8, #16513; NONEON-NOSVE-NEXT: strh w8, [sp, #42]514; NONEON-NOSVE-NEXT: ldrh w8, [sp, #8]515; NONEON-NOSVE-NEXT: rbit w8, w8516; NONEON-NOSVE-NEXT: lsr w8, w8, #16517; NONEON-NOSVE-NEXT: strh w8, [sp, #40]518; NONEON-NOSVE-NEXT: ldrh w8, [sp, #6]519; NONEON-NOSVE-NEXT: rbit w8, w8520; NONEON-NOSVE-NEXT: lsr w8, w8, #16521; NONEON-NOSVE-NEXT: strh w8, [sp, #38]522; NONEON-NOSVE-NEXT: ldrh w8, [sp, #4]523; NONEON-NOSVE-NEXT: rbit w8, w8524; NONEON-NOSVE-NEXT: lsr w8, w8, #16525; NONEON-NOSVE-NEXT: strh w8, [sp, #36]526; NONEON-NOSVE-NEXT: ldrh w8, [sp, #2]527; NONEON-NOSVE-NEXT: rbit w8, w8528; NONEON-NOSVE-NEXT: lsr w8, w8, #16529; NONEON-NOSVE-NEXT: strh w8, [sp, #34]530; NONEON-NOSVE-NEXT: ldrh w8, [sp]531; NONEON-NOSVE-NEXT: rbit w8, w8532; NONEON-NOSVE-NEXT: lsr w8, w8, #16533; NONEON-NOSVE-NEXT: strh w8, [sp, #32]534; NONEON-NOSVE-NEXT: ldp q0, q1, [sp, #32]535; NONEON-NOSVE-NEXT: stp q0, q1, [x0]536; NONEON-NOSVE-NEXT: add sp, sp, #64537; NONEON-NOSVE-NEXT: ret538 %op = load <16 x i16>, ptr %a539 %res = call <16 x i16> @llvm.bitreverse.v16i16(<16 x i16> %op)540 store <16 x i16> %res, ptr %a541 ret void542}543 544define <2 x i32> @bitreverse_v2i32(<2 x i32> %op) {545; CHECK-LABEL: bitreverse_v2i32:546; CHECK: // %bb.0:547; CHECK-NEXT: ptrue p0.s, vl2548; CHECK-NEXT: // kill: def $d0 killed $d0 def $z0549; CHECK-NEXT: rbit z0.s, p0/m, z0.s550; CHECK-NEXT: // kill: def $d0 killed $d0 killed $z0551; CHECK-NEXT: ret552;553; NONEON-NOSVE-LABEL: bitreverse_v2i32:554; NONEON-NOSVE: // %bb.0:555; NONEON-NOSVE-NEXT: str d0, [sp, #-16]!556; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 16557; NONEON-NOSVE-NEXT: ldr w8, [sp, #4]558; NONEON-NOSVE-NEXT: rbit w9, w8559; NONEON-NOSVE-NEXT: ldr w8, [sp]560; NONEON-NOSVE-NEXT: rbit w8, w8561; NONEON-NOSVE-NEXT: stp w8, w9, [sp, #8]562; NONEON-NOSVE-NEXT: ldr d0, [sp, #8]563; NONEON-NOSVE-NEXT: add sp, sp, #16564; NONEON-NOSVE-NEXT: ret565 %res = call <2 x i32> @llvm.bitreverse.v2i32(<2 x i32> %op)566 ret <2 x i32> %res567}568 569define <4 x i32> @bitreverse_v4i32(<4 x i32> %op) {570; CHECK-LABEL: bitreverse_v4i32:571; CHECK: // %bb.0:572; CHECK-NEXT: ptrue p0.s, vl4573; CHECK-NEXT: // kill: def $q0 killed $q0 def $z0574; CHECK-NEXT: rbit z0.s, p0/m, z0.s575; CHECK-NEXT: // kill: def $q0 killed $q0 killed $z0576; CHECK-NEXT: ret577;578; NONEON-NOSVE-LABEL: bitreverse_v4i32:579; NONEON-NOSVE: // %bb.0:580; NONEON-NOSVE-NEXT: str q0, [sp, #-32]!581; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 32582; NONEON-NOSVE-NEXT: ldr w8, [sp, #12]583; NONEON-NOSVE-NEXT: rbit w9, w8584; NONEON-NOSVE-NEXT: ldr w8, [sp, #8]585; NONEON-NOSVE-NEXT: rbit w8, w8586; NONEON-NOSVE-NEXT: stp w8, w9, [sp, #24]587; NONEON-NOSVE-NEXT: ldr w8, [sp, #4]588; NONEON-NOSVE-NEXT: rbit w9, w8589; NONEON-NOSVE-NEXT: ldr w8, [sp]590; NONEON-NOSVE-NEXT: rbit w8, w8591; NONEON-NOSVE-NEXT: stp w8, w9, [sp, #16]592; NONEON-NOSVE-NEXT: ldr q0, [sp, #16]593; NONEON-NOSVE-NEXT: add sp, sp, #32594; NONEON-NOSVE-NEXT: ret595 %res = call <4 x i32> @llvm.bitreverse.v4i32(<4 x i32> %op)596 ret <4 x i32> %res597}598 599define void @bitreverse_v8i32(ptr %a) {600; CHECK-LABEL: bitreverse_v8i32:601; CHECK: // %bb.0:602; CHECK-NEXT: ldp q0, q1, [x0]603; CHECK-NEXT: ptrue p0.s, vl4604; CHECK-NEXT: rbit z0.s, p0/m, z0.s605; CHECK-NEXT: rbit z1.s, p0/m, z1.s606; CHECK-NEXT: stp q0, q1, [x0]607; CHECK-NEXT: ret608;609; NONEON-NOSVE-LABEL: bitreverse_v8i32:610; NONEON-NOSVE: // %bb.0:611; NONEON-NOSVE-NEXT: ldp q1, q0, [x0]612; NONEON-NOSVE-NEXT: stp q1, q0, [sp, #-64]!613; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 64614; NONEON-NOSVE-NEXT: ldr w8, [sp, #28]615; NONEON-NOSVE-NEXT: rbit w9, w8616; NONEON-NOSVE-NEXT: ldr w8, [sp, #24]617; NONEON-NOSVE-NEXT: rbit w8, w8618; NONEON-NOSVE-NEXT: stp w8, w9, [sp, #56]619; NONEON-NOSVE-NEXT: ldr w8, [sp, #20]620; NONEON-NOSVE-NEXT: rbit w9, w8621; NONEON-NOSVE-NEXT: ldr w8, [sp, #16]622; NONEON-NOSVE-NEXT: rbit w8, w8623; NONEON-NOSVE-NEXT: stp w8, w9, [sp, #48]624; NONEON-NOSVE-NEXT: ldr w8, [sp, #12]625; NONEON-NOSVE-NEXT: rbit w9, w8626; NONEON-NOSVE-NEXT: ldr w8, [sp, #8]627; NONEON-NOSVE-NEXT: rbit w8, w8628; NONEON-NOSVE-NEXT: stp w8, w9, [sp, #40]629; NONEON-NOSVE-NEXT: ldr w8, [sp, #4]630; NONEON-NOSVE-NEXT: rbit w9, w8631; NONEON-NOSVE-NEXT: ldr w8, [sp]632; NONEON-NOSVE-NEXT: rbit w8, w8633; NONEON-NOSVE-NEXT: stp w8, w9, [sp, #32]634; NONEON-NOSVE-NEXT: ldp q0, q1, [sp, #32]635; NONEON-NOSVE-NEXT: stp q0, q1, [x0]636; NONEON-NOSVE-NEXT: add sp, sp, #64637; NONEON-NOSVE-NEXT: ret638 %op = load <8 x i32>, ptr %a639 %res = call <8 x i32> @llvm.bitreverse.v8i32(<8 x i32> %op)640 store <8 x i32> %res, ptr %a641 ret void642}643 644define <1 x i64> @bitreverse_v1i64(<1 x i64> %op) {645; CHECK-LABEL: bitreverse_v1i64:646; CHECK: // %bb.0:647; CHECK-NEXT: ptrue p0.d, vl1648; CHECK-NEXT: // kill: def $d0 killed $d0 def $z0649; CHECK-NEXT: rbit z0.d, p0/m, z0.d650; CHECK-NEXT: // kill: def $d0 killed $d0 killed $z0651; CHECK-NEXT: ret652;653; NONEON-NOSVE-LABEL: bitreverse_v1i64:654; NONEON-NOSVE: // %bb.0:655; NONEON-NOSVE-NEXT: sub sp, sp, #16656; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 16657; NONEON-NOSVE-NEXT: fmov x8, d0658; NONEON-NOSVE-NEXT: rbit x8, x8659; NONEON-NOSVE-NEXT: str x8, [sp, #8]660; NONEON-NOSVE-NEXT: ldr d0, [sp, #8]661; NONEON-NOSVE-NEXT: add sp, sp, #16662; NONEON-NOSVE-NEXT: ret663 %res = call <1 x i64> @llvm.bitreverse.v1i64(<1 x i64> %op)664 ret <1 x i64> %res665}666 667define <2 x i64> @bitreverse_v2i64(<2 x i64> %op) {668; CHECK-LABEL: bitreverse_v2i64:669; CHECK: // %bb.0:670; CHECK-NEXT: ptrue p0.d, vl2671; CHECK-NEXT: // kill: def $q0 killed $q0 def $z0672; CHECK-NEXT: rbit z0.d, p0/m, z0.d673; CHECK-NEXT: // kill: def $q0 killed $q0 killed $z0674; CHECK-NEXT: ret675;676; NONEON-NOSVE-LABEL: bitreverse_v2i64:677; NONEON-NOSVE: // %bb.0:678; NONEON-NOSVE-NEXT: str q0, [sp, #-32]!679; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 32680; NONEON-NOSVE-NEXT: ldr x8, [sp, #8]681; NONEON-NOSVE-NEXT: rbit x9, x8682; NONEON-NOSVE-NEXT: ldr x8, [sp]683; NONEON-NOSVE-NEXT: rbit x8, x8684; NONEON-NOSVE-NEXT: stp x8, x9, [sp, #16]685; NONEON-NOSVE-NEXT: ldr q0, [sp, #16]686; NONEON-NOSVE-NEXT: add sp, sp, #32687; NONEON-NOSVE-NEXT: ret688 %res = call <2 x i64> @llvm.bitreverse.v2i64(<2 x i64> %op)689 ret <2 x i64> %res690}691 692define void @bitreverse_v4i64(ptr %a) {693; CHECK-LABEL: bitreverse_v4i64:694; CHECK: // %bb.0:695; CHECK-NEXT: ldp q0, q1, [x0]696; CHECK-NEXT: ptrue p0.d, vl2697; CHECK-NEXT: rbit z0.d, p0/m, z0.d698; CHECK-NEXT: rbit z1.d, p0/m, z1.d699; CHECK-NEXT: stp q0, q1, [x0]700; CHECK-NEXT: ret701;702; NONEON-NOSVE-LABEL: bitreverse_v4i64:703; NONEON-NOSVE: // %bb.0:704; NONEON-NOSVE-NEXT: ldp q1, q0, [x0]705; NONEON-NOSVE-NEXT: stp q1, q0, [sp, #-64]!706; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 64707; NONEON-NOSVE-NEXT: ldr x8, [sp, #24]708; NONEON-NOSVE-NEXT: rbit x9, x8709; NONEON-NOSVE-NEXT: ldr x8, [sp, #16]710; NONEON-NOSVE-NEXT: rbit x8, x8711; NONEON-NOSVE-NEXT: stp x8, x9, [sp, #48]712; NONEON-NOSVE-NEXT: ldr x8, [sp, #8]713; NONEON-NOSVE-NEXT: rbit x9, x8714; NONEON-NOSVE-NEXT: ldr x8, [sp]715; NONEON-NOSVE-NEXT: rbit x8, x8716; NONEON-NOSVE-NEXT: stp x8, x9, [sp, #32]717; NONEON-NOSVE-NEXT: ldp q0, q1, [sp, #32]718; NONEON-NOSVE-NEXT: stp q0, q1, [x0]719; NONEON-NOSVE-NEXT: add sp, sp, #64720; NONEON-NOSVE-NEXT: ret721 %op = load <4 x i64>, ptr %a722 %res = call <4 x i64> @llvm.bitreverse.v4i64(<4 x i64> %op)723 store <4 x i64> %res, ptr %a724 ret void725}726 727;728; REVB729;730 731define <2 x i16> @bswap_v2i16(<2 x i16> %op) {732; CHECK-LABEL: bswap_v2i16:733; CHECK: // %bb.0:734; CHECK-NEXT: ptrue p0.s, vl2735; CHECK-NEXT: // kill: def $d0 killed $d0 def $z0736; CHECK-NEXT: revb z0.s, p0/m, z0.s737; CHECK-NEXT: lsr z0.s, z0.s, #16738; CHECK-NEXT: // kill: def $d0 killed $d0 killed $z0739; CHECK-NEXT: ret740;741; NONEON-NOSVE-LABEL: bswap_v2i16:742; NONEON-NOSVE: // %bb.0:743; NONEON-NOSVE-NEXT: str d0, [sp, #-32]!744; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 32745; NONEON-NOSVE-NEXT: ldrb w8, [sp, #4]746; NONEON-NOSVE-NEXT: strb w8, [sp, #15]747; NONEON-NOSVE-NEXT: ldrb w8, [sp, #5]748; NONEON-NOSVE-NEXT: strb w8, [sp, #14]749; NONEON-NOSVE-NEXT: ldrb w8, [sp, #6]750; NONEON-NOSVE-NEXT: strb w8, [sp, #13]751; NONEON-NOSVE-NEXT: ldrb w8, [sp, #7]752; NONEON-NOSVE-NEXT: strb w8, [sp, #12]753; NONEON-NOSVE-NEXT: ldrb w8, [sp]754; NONEON-NOSVE-NEXT: strb w8, [sp, #11]755; NONEON-NOSVE-NEXT: ldrb w8, [sp, #1]756; NONEON-NOSVE-NEXT: strb w8, [sp, #10]757; NONEON-NOSVE-NEXT: ldrb w8, [sp, #2]758; NONEON-NOSVE-NEXT: strb w8, [sp, #9]759; NONEON-NOSVE-NEXT: ldrb w8, [sp, #3]760; NONEON-NOSVE-NEXT: strb w8, [sp, #8]761; NONEON-NOSVE-NEXT: ldr d0, [sp, #8]762; NONEON-NOSVE-NEXT: str d0, [sp, #16]763; NONEON-NOSVE-NEXT: ldrh w9, [sp, #22]764; NONEON-NOSVE-NEXT: ldrh w8, [sp, #18]765; NONEON-NOSVE-NEXT: stp w8, w9, [sp, #24]766; NONEON-NOSVE-NEXT: ldr d0, [sp, #24]767; NONEON-NOSVE-NEXT: add sp, sp, #32768; NONEON-NOSVE-NEXT: ret769 %res = call <2 x i16> @llvm.bswap.v2i16(<2 x i16> %op)770 ret <2 x i16> %res771}772 773define <4 x i16> @bswap_v4i16(<4 x i16> %op) {774; CHECK-LABEL: bswap_v4i16:775; CHECK: // %bb.0:776; CHECK-NEXT: ptrue p0.h, vl4777; CHECK-NEXT: // kill: def $d0 killed $d0 def $z0778; CHECK-NEXT: revb z0.h, p0/m, z0.h779; CHECK-NEXT: // kill: def $d0 killed $d0 killed $z0780; CHECK-NEXT: ret781;782; NONEON-NOSVE-LABEL: bswap_v4i16:783; NONEON-NOSVE: // %bb.0:784; NONEON-NOSVE-NEXT: str d0, [sp, #-16]!785; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 16786; NONEON-NOSVE-NEXT: ldrb w8, [sp, #6]787; NONEON-NOSVE-NEXT: strb w8, [sp, #15]788; NONEON-NOSVE-NEXT: ldrb w8, [sp, #7]789; NONEON-NOSVE-NEXT: strb w8, [sp, #14]790; NONEON-NOSVE-NEXT: ldrb w8, [sp, #4]791; NONEON-NOSVE-NEXT: strb w8, [sp, #13]792; NONEON-NOSVE-NEXT: ldrb w8, [sp, #5]793; NONEON-NOSVE-NEXT: strb w8, [sp, #12]794; NONEON-NOSVE-NEXT: ldrb w8, [sp, #2]795; NONEON-NOSVE-NEXT: strb w8, [sp, #11]796; NONEON-NOSVE-NEXT: ldrb w8, [sp, #3]797; NONEON-NOSVE-NEXT: strb w8, [sp, #10]798; NONEON-NOSVE-NEXT: ldrb w8, [sp]799; NONEON-NOSVE-NEXT: strb w8, [sp, #9]800; NONEON-NOSVE-NEXT: ldrb w8, [sp, #1]801; NONEON-NOSVE-NEXT: strb w8, [sp, #8]802; NONEON-NOSVE-NEXT: ldr d0, [sp, #8]803; NONEON-NOSVE-NEXT: add sp, sp, #16804; NONEON-NOSVE-NEXT: ret805 %res = call <4 x i16> @llvm.bswap.v4i16(<4 x i16> %op)806 ret <4 x i16> %res807}808 809define <8 x i16> @bswap_v8i16(<8 x i16> %op) {810; CHECK-LABEL: bswap_v8i16:811; CHECK: // %bb.0:812; CHECK-NEXT: ptrue p0.h, vl8813; CHECK-NEXT: // kill: def $q0 killed $q0 def $z0814; CHECK-NEXT: revb z0.h, p0/m, z0.h815; CHECK-NEXT: // kill: def $q0 killed $q0 killed $z0816; CHECK-NEXT: ret817;818; NONEON-NOSVE-LABEL: bswap_v8i16:819; NONEON-NOSVE: // %bb.0:820; NONEON-NOSVE-NEXT: str q0, [sp, #-32]!821; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 32822; NONEON-NOSVE-NEXT: ldrb w8, [sp, #14]823; NONEON-NOSVE-NEXT: strb w8, [sp, #31]824; NONEON-NOSVE-NEXT: ldrb w8, [sp, #15]825; NONEON-NOSVE-NEXT: strb w8, [sp, #30]826; NONEON-NOSVE-NEXT: ldrb w8, [sp, #12]827; NONEON-NOSVE-NEXT: strb w8, [sp, #29]828; NONEON-NOSVE-NEXT: ldrb w8, [sp, #13]829; NONEON-NOSVE-NEXT: strb w8, [sp, #28]830; NONEON-NOSVE-NEXT: ldrb w8, [sp, #10]831; NONEON-NOSVE-NEXT: strb w8, [sp, #27]832; NONEON-NOSVE-NEXT: ldrb w8, [sp, #11]833; NONEON-NOSVE-NEXT: strb w8, [sp, #26]834; NONEON-NOSVE-NEXT: ldrb w8, [sp, #8]835; NONEON-NOSVE-NEXT: strb w8, [sp, #25]836; NONEON-NOSVE-NEXT: ldrb w8, [sp, #9]837; NONEON-NOSVE-NEXT: strb w8, [sp, #24]838; NONEON-NOSVE-NEXT: ldrb w8, [sp, #6]839; NONEON-NOSVE-NEXT: strb w8, [sp, #23]840; NONEON-NOSVE-NEXT: ldrb w8, [sp, #7]841; NONEON-NOSVE-NEXT: strb w8, [sp, #22]842; NONEON-NOSVE-NEXT: ldrb w8, [sp, #4]843; NONEON-NOSVE-NEXT: strb w8, [sp, #21]844; NONEON-NOSVE-NEXT: ldrb w8, [sp, #5]845; NONEON-NOSVE-NEXT: strb w8, [sp, #20]846; NONEON-NOSVE-NEXT: ldrb w8, [sp, #2]847; NONEON-NOSVE-NEXT: strb w8, [sp, #19]848; NONEON-NOSVE-NEXT: ldrb w8, [sp, #3]849; NONEON-NOSVE-NEXT: strb w8, [sp, #18]850; NONEON-NOSVE-NEXT: ldrb w8, [sp]851; NONEON-NOSVE-NEXT: strb w8, [sp, #17]852; NONEON-NOSVE-NEXT: ldrb w8, [sp, #1]853; NONEON-NOSVE-NEXT: strb w8, [sp, #16]854; NONEON-NOSVE-NEXT: ldr q0, [sp, #16]855; NONEON-NOSVE-NEXT: add sp, sp, #32856; NONEON-NOSVE-NEXT: ret857 %res = call <8 x i16> @llvm.bswap.v8i16(<8 x i16> %op)858 ret <8 x i16> %res859}860 861define void @bswap_v16i16(ptr %a) {862; CHECK-LABEL: bswap_v16i16:863; CHECK: // %bb.0:864; CHECK-NEXT: ldp q0, q1, [x0]865; CHECK-NEXT: ptrue p0.h, vl8866; CHECK-NEXT: revb z0.h, p0/m, z0.h867; CHECK-NEXT: revb z1.h, p0/m, z1.h868; CHECK-NEXT: stp q0, q1, [x0]869; CHECK-NEXT: ret870;871; NONEON-NOSVE-LABEL: bswap_v16i16:872; NONEON-NOSVE: // %bb.0:873; NONEON-NOSVE-NEXT: ldr q0, [x0, #16]874; NONEON-NOSVE-NEXT: str q0, [sp, #-64]!875; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 64876; NONEON-NOSVE-NEXT: ldrb w8, [sp, #14]877; NONEON-NOSVE-NEXT: ldr q0, [x0]878; NONEON-NOSVE-NEXT: strb w8, [sp, #31]879; NONEON-NOSVE-NEXT: ldrb w8, [sp, #15]880; NONEON-NOSVE-NEXT: str q0, [sp, #32]881; NONEON-NOSVE-NEXT: strb w8, [sp, #30]882; NONEON-NOSVE-NEXT: ldrb w8, [sp, #12]883; NONEON-NOSVE-NEXT: strb w8, [sp, #29]884; NONEON-NOSVE-NEXT: ldrb w8, [sp, #13]885; NONEON-NOSVE-NEXT: strb w8, [sp, #28]886; NONEON-NOSVE-NEXT: ldrb w8, [sp, #10]887; NONEON-NOSVE-NEXT: strb w8, [sp, #27]888; NONEON-NOSVE-NEXT: ldrb w8, [sp, #11]889; NONEON-NOSVE-NEXT: strb w8, [sp, #26]890; NONEON-NOSVE-NEXT: ldrb w8, [sp, #8]891; NONEON-NOSVE-NEXT: strb w8, [sp, #25]892; NONEON-NOSVE-NEXT: ldrb w8, [sp, #9]893; NONEON-NOSVE-NEXT: strb w8, [sp, #24]894; NONEON-NOSVE-NEXT: ldrb w8, [sp, #6]895; NONEON-NOSVE-NEXT: strb w8, [sp, #23]896; NONEON-NOSVE-NEXT: ldrb w8, [sp, #7]897; NONEON-NOSVE-NEXT: strb w8, [sp, #22]898; NONEON-NOSVE-NEXT: ldrb w8, [sp, #4]899; NONEON-NOSVE-NEXT: strb w8, [sp, #21]900; NONEON-NOSVE-NEXT: ldrb w8, [sp, #5]901; NONEON-NOSVE-NEXT: strb w8, [sp, #20]902; NONEON-NOSVE-NEXT: ldrb w8, [sp, #2]903; NONEON-NOSVE-NEXT: strb w8, [sp, #19]904; NONEON-NOSVE-NEXT: ldrb w8, [sp, #3]905; NONEON-NOSVE-NEXT: strb w8, [sp, #18]906; NONEON-NOSVE-NEXT: ldrb w8, [sp]907; NONEON-NOSVE-NEXT: strb w8, [sp, #17]908; NONEON-NOSVE-NEXT: ldrb w8, [sp, #1]909; NONEON-NOSVE-NEXT: strb w8, [sp, #16]910; NONEON-NOSVE-NEXT: ldrb w8, [sp, #46]911; NONEON-NOSVE-NEXT: ldr q1, [sp, #16]912; NONEON-NOSVE-NEXT: strb w8, [sp, #63]913; NONEON-NOSVE-NEXT: ldrb w8, [sp, #47]914; NONEON-NOSVE-NEXT: strb w8, [sp, #62]915; NONEON-NOSVE-NEXT: ldrb w8, [sp, #44]916; NONEON-NOSVE-NEXT: strb w8, [sp, #61]917; NONEON-NOSVE-NEXT: ldrb w8, [sp, #45]918; NONEON-NOSVE-NEXT: strb w8, [sp, #60]919; NONEON-NOSVE-NEXT: ldrb w8, [sp, #42]920; NONEON-NOSVE-NEXT: strb w8, [sp, #59]921; NONEON-NOSVE-NEXT: ldrb w8, [sp, #43]922; NONEON-NOSVE-NEXT: strb w8, [sp, #58]923; NONEON-NOSVE-NEXT: ldrb w8, [sp, #40]924; NONEON-NOSVE-NEXT: strb w8, [sp, #57]925; NONEON-NOSVE-NEXT: ldrb w8, [sp, #41]926; NONEON-NOSVE-NEXT: strb w8, [sp, #56]927; NONEON-NOSVE-NEXT: ldrb w8, [sp, #38]928; NONEON-NOSVE-NEXT: strb w8, [sp, #55]929; NONEON-NOSVE-NEXT: ldrb w8, [sp, #39]930; NONEON-NOSVE-NEXT: strb w8, [sp, #54]931; NONEON-NOSVE-NEXT: ldrb w8, [sp, #36]932; NONEON-NOSVE-NEXT: strb w8, [sp, #53]933; NONEON-NOSVE-NEXT: ldrb w8, [sp, #37]934; NONEON-NOSVE-NEXT: strb w8, [sp, #52]935; NONEON-NOSVE-NEXT: ldrb w8, [sp, #34]936; NONEON-NOSVE-NEXT: strb w8, [sp, #51]937; NONEON-NOSVE-NEXT: ldrb w8, [sp, #35]938; NONEON-NOSVE-NEXT: strb w8, [sp, #50]939; NONEON-NOSVE-NEXT: ldrb w8, [sp, #32]940; NONEON-NOSVE-NEXT: strb w8, [sp, #49]941; NONEON-NOSVE-NEXT: ldrb w8, [sp, #33]942; NONEON-NOSVE-NEXT: strb w8, [sp, #48]943; NONEON-NOSVE-NEXT: ldr q0, [sp, #48]944; NONEON-NOSVE-NEXT: stp q0, q1, [x0]945; NONEON-NOSVE-NEXT: add sp, sp, #64946; NONEON-NOSVE-NEXT: ret947 %op = load <16 x i16>, ptr %a948 %res = call <16 x i16> @llvm.bswap.v16i16(<16 x i16> %op)949 store <16 x i16> %res, ptr %a950 ret void951}952 953define <2 x i32> @bswap_v2i32(<2 x i32> %op) {954; CHECK-LABEL: bswap_v2i32:955; CHECK: // %bb.0:956; CHECK-NEXT: ptrue p0.s, vl2957; CHECK-NEXT: // kill: def $d0 killed $d0 def $z0958; CHECK-NEXT: revb z0.s, p0/m, z0.s959; CHECK-NEXT: // kill: def $d0 killed $d0 killed $z0960; CHECK-NEXT: ret961;962; NONEON-NOSVE-LABEL: bswap_v2i32:963; NONEON-NOSVE: // %bb.0:964; NONEON-NOSVE-NEXT: str d0, [sp, #-16]!965; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 16966; NONEON-NOSVE-NEXT: ldrb w8, [sp, #4]967; NONEON-NOSVE-NEXT: strb w8, [sp, #15]968; NONEON-NOSVE-NEXT: ldrb w8, [sp, #5]969; NONEON-NOSVE-NEXT: strb w8, [sp, #14]970; NONEON-NOSVE-NEXT: ldrb w8, [sp, #6]971; NONEON-NOSVE-NEXT: strb w8, [sp, #13]972; NONEON-NOSVE-NEXT: ldrb w8, [sp, #7]973; NONEON-NOSVE-NEXT: strb w8, [sp, #12]974; NONEON-NOSVE-NEXT: ldrb w8, [sp]975; NONEON-NOSVE-NEXT: strb w8, [sp, #11]976; NONEON-NOSVE-NEXT: ldrb w8, [sp, #1]977; NONEON-NOSVE-NEXT: strb w8, [sp, #10]978; NONEON-NOSVE-NEXT: ldrb w8, [sp, #2]979; NONEON-NOSVE-NEXT: strb w8, [sp, #9]980; NONEON-NOSVE-NEXT: ldrb w8, [sp, #3]981; NONEON-NOSVE-NEXT: strb w8, [sp, #8]982; NONEON-NOSVE-NEXT: ldr d0, [sp, #8]983; NONEON-NOSVE-NEXT: add sp, sp, #16984; NONEON-NOSVE-NEXT: ret985 %res = call <2 x i32> @llvm.bswap.v2i32(<2 x i32> %op)986 ret <2 x i32> %res987}988 989define <4 x i32> @bswap_v4i32(<4 x i32> %op) {990; CHECK-LABEL: bswap_v4i32:991; CHECK: // %bb.0:992; CHECK-NEXT: ptrue p0.s, vl4993; CHECK-NEXT: // kill: def $q0 killed $q0 def $z0994; CHECK-NEXT: revb z0.s, p0/m, z0.s995; CHECK-NEXT: // kill: def $q0 killed $q0 killed $z0996; CHECK-NEXT: ret997;998; NONEON-NOSVE-LABEL: bswap_v4i32:999; NONEON-NOSVE: // %bb.0:1000; NONEON-NOSVE-NEXT: str q0, [sp, #-32]!1001; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 321002; NONEON-NOSVE-NEXT: ldrb w8, [sp, #12]1003; NONEON-NOSVE-NEXT: strb w8, [sp, #31]1004; NONEON-NOSVE-NEXT: ldrb w8, [sp, #13]1005; NONEON-NOSVE-NEXT: strb w8, [sp, #30]1006; NONEON-NOSVE-NEXT: ldrb w8, [sp, #14]1007; NONEON-NOSVE-NEXT: strb w8, [sp, #29]1008; NONEON-NOSVE-NEXT: ldrb w8, [sp, #15]1009; NONEON-NOSVE-NEXT: strb w8, [sp, #28]1010; NONEON-NOSVE-NEXT: ldrb w8, [sp, #8]1011; NONEON-NOSVE-NEXT: strb w8, [sp, #27]1012; NONEON-NOSVE-NEXT: ldrb w8, [sp, #9]1013; NONEON-NOSVE-NEXT: strb w8, [sp, #26]1014; NONEON-NOSVE-NEXT: ldrb w8, [sp, #10]1015; NONEON-NOSVE-NEXT: strb w8, [sp, #25]1016; NONEON-NOSVE-NEXT: ldrb w8, [sp, #11]1017; NONEON-NOSVE-NEXT: strb w8, [sp, #24]1018; NONEON-NOSVE-NEXT: ldrb w8, [sp, #4]1019; NONEON-NOSVE-NEXT: strb w8, [sp, #23]1020; NONEON-NOSVE-NEXT: ldrb w8, [sp, #5]1021; NONEON-NOSVE-NEXT: strb w8, [sp, #22]1022; NONEON-NOSVE-NEXT: ldrb w8, [sp, #6]1023; NONEON-NOSVE-NEXT: strb w8, [sp, #21]1024; NONEON-NOSVE-NEXT: ldrb w8, [sp, #7]1025; NONEON-NOSVE-NEXT: strb w8, [sp, #20]1026; NONEON-NOSVE-NEXT: ldrb w8, [sp]1027; NONEON-NOSVE-NEXT: strb w8, [sp, #19]1028; NONEON-NOSVE-NEXT: ldrb w8, [sp, #1]1029; NONEON-NOSVE-NEXT: strb w8, [sp, #18]1030; NONEON-NOSVE-NEXT: ldrb w8, [sp, #2]1031; NONEON-NOSVE-NEXT: strb w8, [sp, #17]1032; NONEON-NOSVE-NEXT: ldrb w8, [sp, #3]1033; NONEON-NOSVE-NEXT: strb w8, [sp, #16]1034; NONEON-NOSVE-NEXT: ldr q0, [sp, #16]1035; NONEON-NOSVE-NEXT: add sp, sp, #321036; NONEON-NOSVE-NEXT: ret1037 %res = call <4 x i32> @llvm.bswap.v4i32(<4 x i32> %op)1038 ret <4 x i32> %res1039}1040 1041define void @bswap_v8i32(ptr %a) {1042; CHECK-LABEL: bswap_v8i32:1043; CHECK: // %bb.0:1044; CHECK-NEXT: ldp q0, q1, [x0]1045; CHECK-NEXT: ptrue p0.s, vl41046; CHECK-NEXT: revb z0.s, p0/m, z0.s1047; CHECK-NEXT: revb z1.s, p0/m, z1.s1048; CHECK-NEXT: stp q0, q1, [x0]1049; CHECK-NEXT: ret1050;1051; NONEON-NOSVE-LABEL: bswap_v8i32:1052; NONEON-NOSVE: // %bb.0:1053; NONEON-NOSVE-NEXT: ldr q0, [x0, #16]1054; NONEON-NOSVE-NEXT: str q0, [sp, #-64]!1055; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 641056; NONEON-NOSVE-NEXT: ldrb w8, [sp, #12]1057; NONEON-NOSVE-NEXT: ldr q0, [x0]1058; NONEON-NOSVE-NEXT: strb w8, [sp, #31]1059; NONEON-NOSVE-NEXT: ldrb w8, [sp, #13]1060; NONEON-NOSVE-NEXT: str q0, [sp, #32]1061; NONEON-NOSVE-NEXT: strb w8, [sp, #30]1062; NONEON-NOSVE-NEXT: ldrb w8, [sp, #14]1063; NONEON-NOSVE-NEXT: strb w8, [sp, #29]1064; NONEON-NOSVE-NEXT: ldrb w8, [sp, #15]1065; NONEON-NOSVE-NEXT: strb w8, [sp, #28]1066; NONEON-NOSVE-NEXT: ldrb w8, [sp, #8]1067; NONEON-NOSVE-NEXT: strb w8, [sp, #27]1068; NONEON-NOSVE-NEXT: ldrb w8, [sp, #9]1069; NONEON-NOSVE-NEXT: strb w8, [sp, #26]1070; NONEON-NOSVE-NEXT: ldrb w8, [sp, #10]1071; NONEON-NOSVE-NEXT: strb w8, [sp, #25]1072; NONEON-NOSVE-NEXT: ldrb w8, [sp, #11]1073; NONEON-NOSVE-NEXT: strb w8, [sp, #24]1074; NONEON-NOSVE-NEXT: ldrb w8, [sp, #4]1075; NONEON-NOSVE-NEXT: strb w8, [sp, #23]1076; NONEON-NOSVE-NEXT: ldrb w8, [sp, #5]1077; NONEON-NOSVE-NEXT: strb w8, [sp, #22]1078; NONEON-NOSVE-NEXT: ldrb w8, [sp, #6]1079; NONEON-NOSVE-NEXT: strb w8, [sp, #21]1080; NONEON-NOSVE-NEXT: ldrb w8, [sp, #7]1081; NONEON-NOSVE-NEXT: strb w8, [sp, #20]1082; NONEON-NOSVE-NEXT: ldrb w8, [sp]1083; NONEON-NOSVE-NEXT: strb w8, [sp, #19]1084; NONEON-NOSVE-NEXT: ldrb w8, [sp, #1]1085; NONEON-NOSVE-NEXT: strb w8, [sp, #18]1086; NONEON-NOSVE-NEXT: ldrb w8, [sp, #2]1087; NONEON-NOSVE-NEXT: strb w8, [sp, #17]1088; NONEON-NOSVE-NEXT: ldrb w8, [sp, #3]1089; NONEON-NOSVE-NEXT: strb w8, [sp, #16]1090; NONEON-NOSVE-NEXT: ldrb w8, [sp, #44]1091; NONEON-NOSVE-NEXT: ldr q1, [sp, #16]1092; NONEON-NOSVE-NEXT: strb w8, [sp, #63]1093; NONEON-NOSVE-NEXT: ldrb w8, [sp, #45]1094; NONEON-NOSVE-NEXT: strb w8, [sp, #62]1095; NONEON-NOSVE-NEXT: ldrb w8, [sp, #46]1096; NONEON-NOSVE-NEXT: strb w8, [sp, #61]1097; NONEON-NOSVE-NEXT: ldrb w8, [sp, #47]1098; NONEON-NOSVE-NEXT: strb w8, [sp, #60]1099; NONEON-NOSVE-NEXT: ldrb w8, [sp, #40]1100; NONEON-NOSVE-NEXT: strb w8, [sp, #59]1101; NONEON-NOSVE-NEXT: ldrb w8, [sp, #41]1102; NONEON-NOSVE-NEXT: strb w8, [sp, #58]1103; NONEON-NOSVE-NEXT: ldrb w8, [sp, #42]1104; NONEON-NOSVE-NEXT: strb w8, [sp, #57]1105; NONEON-NOSVE-NEXT: ldrb w8, [sp, #43]1106; NONEON-NOSVE-NEXT: strb w8, [sp, #56]1107; NONEON-NOSVE-NEXT: ldrb w8, [sp, #36]1108; NONEON-NOSVE-NEXT: strb w8, [sp, #55]1109; NONEON-NOSVE-NEXT: ldrb w8, [sp, #37]1110; NONEON-NOSVE-NEXT: strb w8, [sp, #54]1111; NONEON-NOSVE-NEXT: ldrb w8, [sp, #38]1112; NONEON-NOSVE-NEXT: strb w8, [sp, #53]1113; NONEON-NOSVE-NEXT: ldrb w8, [sp, #39]1114; NONEON-NOSVE-NEXT: strb w8, [sp, #52]1115; NONEON-NOSVE-NEXT: ldrb w8, [sp, #32]1116; NONEON-NOSVE-NEXT: strb w8, [sp, #51]1117; NONEON-NOSVE-NEXT: ldrb w8, [sp, #33]1118; NONEON-NOSVE-NEXT: strb w8, [sp, #50]1119; NONEON-NOSVE-NEXT: ldrb w8, [sp, #34]1120; NONEON-NOSVE-NEXT: strb w8, [sp, #49]1121; NONEON-NOSVE-NEXT: ldrb w8, [sp, #35]1122; NONEON-NOSVE-NEXT: strb w8, [sp, #48]1123; NONEON-NOSVE-NEXT: ldr q0, [sp, #48]1124; NONEON-NOSVE-NEXT: stp q0, q1, [x0]1125; NONEON-NOSVE-NEXT: add sp, sp, #641126; NONEON-NOSVE-NEXT: ret1127 %op = load <8 x i32>, ptr %a1128 %res = call <8 x i32> @llvm.bswap.v8i32(<8 x i32> %op)1129 store <8 x i32> %res, ptr %a1130 ret void1131}1132 1133define <1 x i64> @bswap_v1i64(<1 x i64> %op) {1134; CHECK-LABEL: bswap_v1i64:1135; CHECK: // %bb.0:1136; CHECK-NEXT: ptrue p0.d, vl11137; CHECK-NEXT: // kill: def $d0 killed $d0 def $z01138; CHECK-NEXT: revb z0.d, p0/m, z0.d1139; CHECK-NEXT: // kill: def $d0 killed $d0 killed $z01140; CHECK-NEXT: ret1141;1142; NONEON-NOSVE-LABEL: bswap_v1i64:1143; NONEON-NOSVE: // %bb.0:1144; NONEON-NOSVE-NEXT: str d0, [sp, #-16]!1145; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 161146; NONEON-NOSVE-NEXT: ldrb w8, [sp]1147; NONEON-NOSVE-NEXT: strb w8, [sp, #15]1148; NONEON-NOSVE-NEXT: ldrb w8, [sp, #1]1149; NONEON-NOSVE-NEXT: strb w8, [sp, #14]1150; NONEON-NOSVE-NEXT: ldrb w8, [sp, #2]1151; NONEON-NOSVE-NEXT: strb w8, [sp, #13]1152; NONEON-NOSVE-NEXT: ldrb w8, [sp, #3]1153; NONEON-NOSVE-NEXT: strb w8, [sp, #12]1154; NONEON-NOSVE-NEXT: ldrb w8, [sp, #4]1155; NONEON-NOSVE-NEXT: strb w8, [sp, #11]1156; NONEON-NOSVE-NEXT: ldrb w8, [sp, #5]1157; NONEON-NOSVE-NEXT: strb w8, [sp, #10]1158; NONEON-NOSVE-NEXT: ldrb w8, [sp, #6]1159; NONEON-NOSVE-NEXT: strb w8, [sp, #9]1160; NONEON-NOSVE-NEXT: ldrb w8, [sp, #7]1161; NONEON-NOSVE-NEXT: strb w8, [sp, #8]1162; NONEON-NOSVE-NEXT: ldr d0, [sp, #8]1163; NONEON-NOSVE-NEXT: add sp, sp, #161164; NONEON-NOSVE-NEXT: ret1165 %res = call <1 x i64> @llvm.bswap.v1i64(<1 x i64> %op)1166 ret <1 x i64> %res1167}1168 1169define <2 x i64> @bswap_v2i64(<2 x i64> %op) {1170; CHECK-LABEL: bswap_v2i64:1171; CHECK: // %bb.0:1172; CHECK-NEXT: ptrue p0.d, vl21173; CHECK-NEXT: // kill: def $q0 killed $q0 def $z01174; CHECK-NEXT: revb z0.d, p0/m, z0.d1175; CHECK-NEXT: // kill: def $q0 killed $q0 killed $z01176; CHECK-NEXT: ret1177;1178; NONEON-NOSVE-LABEL: bswap_v2i64:1179; NONEON-NOSVE: // %bb.0:1180; NONEON-NOSVE-NEXT: str q0, [sp, #-32]!1181; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 321182; NONEON-NOSVE-NEXT: ldrb w8, [sp, #8]1183; NONEON-NOSVE-NEXT: strb w8, [sp, #31]1184; NONEON-NOSVE-NEXT: ldrb w8, [sp, #9]1185; NONEON-NOSVE-NEXT: strb w8, [sp, #30]1186; NONEON-NOSVE-NEXT: ldrb w8, [sp, #10]1187; NONEON-NOSVE-NEXT: strb w8, [sp, #29]1188; NONEON-NOSVE-NEXT: ldrb w8, [sp, #11]1189; NONEON-NOSVE-NEXT: strb w8, [sp, #28]1190; NONEON-NOSVE-NEXT: ldrb w8, [sp, #12]1191; NONEON-NOSVE-NEXT: strb w8, [sp, #27]1192; NONEON-NOSVE-NEXT: ldrb w8, [sp, #13]1193; NONEON-NOSVE-NEXT: strb w8, [sp, #26]1194; NONEON-NOSVE-NEXT: ldrb w8, [sp, #14]1195; NONEON-NOSVE-NEXT: strb w8, [sp, #25]1196; NONEON-NOSVE-NEXT: ldrb w8, [sp, #15]1197; NONEON-NOSVE-NEXT: strb w8, [sp, #24]1198; NONEON-NOSVE-NEXT: ldrb w8, [sp]1199; NONEON-NOSVE-NEXT: strb w8, [sp, #23]1200; NONEON-NOSVE-NEXT: ldrb w8, [sp, #1]1201; NONEON-NOSVE-NEXT: strb w8, [sp, #22]1202; NONEON-NOSVE-NEXT: ldrb w8, [sp, #2]1203; NONEON-NOSVE-NEXT: strb w8, [sp, #21]1204; NONEON-NOSVE-NEXT: ldrb w8, [sp, #3]1205; NONEON-NOSVE-NEXT: strb w8, [sp, #20]1206; NONEON-NOSVE-NEXT: ldrb w8, [sp, #4]1207; NONEON-NOSVE-NEXT: strb w8, [sp, #19]1208; NONEON-NOSVE-NEXT: ldrb w8, [sp, #5]1209; NONEON-NOSVE-NEXT: strb w8, [sp, #18]1210; NONEON-NOSVE-NEXT: ldrb w8, [sp, #6]1211; NONEON-NOSVE-NEXT: strb w8, [sp, #17]1212; NONEON-NOSVE-NEXT: ldrb w8, [sp, #7]1213; NONEON-NOSVE-NEXT: strb w8, [sp, #16]1214; NONEON-NOSVE-NEXT: ldr q0, [sp, #16]1215; NONEON-NOSVE-NEXT: add sp, sp, #321216; NONEON-NOSVE-NEXT: ret1217 %res = call <2 x i64> @llvm.bswap.v2i64(<2 x i64> %op)1218 ret <2 x i64> %res1219}1220 1221define void @bswap_v4i64(ptr %a) {1222; CHECK-LABEL: bswap_v4i64:1223; CHECK: // %bb.0:1224; CHECK-NEXT: ldp q0, q1, [x0]1225; CHECK-NEXT: ptrue p0.d, vl21226; CHECK-NEXT: revb z0.d, p0/m, z0.d1227; CHECK-NEXT: revb z1.d, p0/m, z1.d1228; CHECK-NEXT: stp q0, q1, [x0]1229; CHECK-NEXT: ret1230;1231; NONEON-NOSVE-LABEL: bswap_v4i64:1232; NONEON-NOSVE: // %bb.0:1233; NONEON-NOSVE-NEXT: ldr q0, [x0, #16]1234; NONEON-NOSVE-NEXT: str q0, [sp, #-64]!1235; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 641236; NONEON-NOSVE-NEXT: ldrb w8, [sp, #8]1237; NONEON-NOSVE-NEXT: ldr q0, [x0]1238; NONEON-NOSVE-NEXT: strb w8, [sp, #31]1239; NONEON-NOSVE-NEXT: ldrb w8, [sp, #9]1240; NONEON-NOSVE-NEXT: str q0, [sp, #32]1241; NONEON-NOSVE-NEXT: strb w8, [sp, #30]1242; NONEON-NOSVE-NEXT: ldrb w8, [sp, #10]1243; NONEON-NOSVE-NEXT: strb w8, [sp, #29]1244; NONEON-NOSVE-NEXT: ldrb w8, [sp, #11]1245; NONEON-NOSVE-NEXT: strb w8, [sp, #28]1246; NONEON-NOSVE-NEXT: ldrb w8, [sp, #12]1247; NONEON-NOSVE-NEXT: strb w8, [sp, #27]1248; NONEON-NOSVE-NEXT: ldrb w8, [sp, #13]1249; NONEON-NOSVE-NEXT: strb w8, [sp, #26]1250; NONEON-NOSVE-NEXT: ldrb w8, [sp, #14]1251; NONEON-NOSVE-NEXT: strb w8, [sp, #25]1252; NONEON-NOSVE-NEXT: ldrb w8, [sp, #15]1253; NONEON-NOSVE-NEXT: strb w8, [sp, #24]1254; NONEON-NOSVE-NEXT: ldrb w8, [sp]1255; NONEON-NOSVE-NEXT: strb w8, [sp, #23]1256; NONEON-NOSVE-NEXT: ldrb w8, [sp, #1]1257; NONEON-NOSVE-NEXT: strb w8, [sp, #22]1258; NONEON-NOSVE-NEXT: ldrb w8, [sp, #2]1259; NONEON-NOSVE-NEXT: strb w8, [sp, #21]1260; NONEON-NOSVE-NEXT: ldrb w8, [sp, #3]1261; NONEON-NOSVE-NEXT: strb w8, [sp, #20]1262; NONEON-NOSVE-NEXT: ldrb w8, [sp, #4]1263; NONEON-NOSVE-NEXT: strb w8, [sp, #19]1264; NONEON-NOSVE-NEXT: ldrb w8, [sp, #5]1265; NONEON-NOSVE-NEXT: strb w8, [sp, #18]1266; NONEON-NOSVE-NEXT: ldrb w8, [sp, #6]1267; NONEON-NOSVE-NEXT: strb w8, [sp, #17]1268; NONEON-NOSVE-NEXT: ldrb w8, [sp, #7]1269; NONEON-NOSVE-NEXT: strb w8, [sp, #16]1270; NONEON-NOSVE-NEXT: ldrb w8, [sp, #40]1271; NONEON-NOSVE-NEXT: ldr q1, [sp, #16]1272; NONEON-NOSVE-NEXT: strb w8, [sp, #63]1273; NONEON-NOSVE-NEXT: ldrb w8, [sp, #41]1274; NONEON-NOSVE-NEXT: strb w8, [sp, #62]1275; NONEON-NOSVE-NEXT: ldrb w8, [sp, #42]1276; NONEON-NOSVE-NEXT: strb w8, [sp, #61]1277; NONEON-NOSVE-NEXT: ldrb w8, [sp, #43]1278; NONEON-NOSVE-NEXT: strb w8, [sp, #60]1279; NONEON-NOSVE-NEXT: ldrb w8, [sp, #44]1280; NONEON-NOSVE-NEXT: strb w8, [sp, #59]1281; NONEON-NOSVE-NEXT: ldrb w8, [sp, #45]1282; NONEON-NOSVE-NEXT: strb w8, [sp, #58]1283; NONEON-NOSVE-NEXT: ldrb w8, [sp, #46]1284; NONEON-NOSVE-NEXT: strb w8, [sp, #57]1285; NONEON-NOSVE-NEXT: ldrb w8, [sp, #47]1286; NONEON-NOSVE-NEXT: strb w8, [sp, #56]1287; NONEON-NOSVE-NEXT: ldrb w8, [sp, #32]1288; NONEON-NOSVE-NEXT: strb w8, [sp, #55]1289; NONEON-NOSVE-NEXT: ldrb w8, [sp, #33]1290; NONEON-NOSVE-NEXT: strb w8, [sp, #54]1291; NONEON-NOSVE-NEXT: ldrb w8, [sp, #34]1292; NONEON-NOSVE-NEXT: strb w8, [sp, #53]1293; NONEON-NOSVE-NEXT: ldrb w8, [sp, #35]1294; NONEON-NOSVE-NEXT: strb w8, [sp, #52]1295; NONEON-NOSVE-NEXT: ldrb w8, [sp, #36]1296; NONEON-NOSVE-NEXT: strb w8, [sp, #51]1297; NONEON-NOSVE-NEXT: ldrb w8, [sp, #37]1298; NONEON-NOSVE-NEXT: strb w8, [sp, #50]1299; NONEON-NOSVE-NEXT: ldrb w8, [sp, #38]1300; NONEON-NOSVE-NEXT: strb w8, [sp, #49]1301; NONEON-NOSVE-NEXT: ldrb w8, [sp, #39]1302; NONEON-NOSVE-NEXT: strb w8, [sp, #48]1303; NONEON-NOSVE-NEXT: ldr q0, [sp, #48]1304; NONEON-NOSVE-NEXT: stp q0, q1, [x0]1305; NONEON-NOSVE-NEXT: add sp, sp, #641306; NONEON-NOSVE-NEXT: ret1307 %op = load <4 x i64>, ptr %a1308 %res = call <4 x i64> @llvm.bswap.v4i64(<4 x i64> %op)1309 store <4 x i64> %res, ptr %a1310 ret void1311}1312 1313declare <4 x i8> @llvm.bitreverse.v4i8(<4 x i8>)1314declare <8 x i8> @llvm.bitreverse.v8i8(<8 x i8>)1315declare <16 x i8> @llvm.bitreverse.v16i8(<16 x i8>)1316declare <32 x i8> @llvm.bitreverse.v32i8(<32 x i8>)1317declare <2 x i16> @llvm.bitreverse.v2i16(<2 x i16>)1318declare <4 x i16> @llvm.bitreverse.v4i16(<4 x i16>)1319declare <8 x i16> @llvm.bitreverse.v8i16(<8 x i16>)1320declare <16 x i16> @llvm.bitreverse.v16i16(<16 x i16>)1321declare <2 x i32> @llvm.bitreverse.v2i32(<2 x i32>)1322declare <4 x i32> @llvm.bitreverse.v4i32(<4 x i32>)1323declare <8 x i32> @llvm.bitreverse.v8i32(<8 x i32>)1324declare <1 x i64> @llvm.bitreverse.v1i64(<1 x i64>)1325declare <2 x i64> @llvm.bitreverse.v2i64(<2 x i64>)1326declare <4 x i64> @llvm.bitreverse.v4i64(<4 x i64>)1327 1328declare <2 x i16> @llvm.bswap.v2i16(<2 x i16>)1329declare <4 x i16> @llvm.bswap.v4i16(<4 x i16>)1330declare <8 x i16> @llvm.bswap.v8i16(<8 x i16>)1331declare <16 x i16> @llvm.bswap.v16i16(<16 x i16>)1332declare <2 x i32> @llvm.bswap.v2i32(<2 x i32>)1333declare <4 x i32> @llvm.bswap.v4i32(<4 x i32>)1334declare <8 x i32> @llvm.bswap.v8i32(<8 x i32>)1335declare <1 x i64> @llvm.bswap.v1i64(<1 x i64>)1336declare <2 x i64> @llvm.bswap.v2i64(<2 x i64>)1337declare <4 x i64> @llvm.bswap.v4i64(<4 x i64>)1338