1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py 2; RUN: llc -mattr=+sve -force-streaming-compatible < %s | FileCheck %s 3; RUN: llc -mattr=+sme -force-streaming < %s | FileCheck %s 4; RUN: llc -force-streaming-compatible < %s | FileCheck %s --check-prefix=NONEON-NOSVE 5 6 7target triple = "aarch64-unknown-linux-gnu" 8 9; 10; RBIT 11; 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, vl4 17; CHECK-NEXT: // kill: def $d0 killed $d0 def $z0 18; CHECK-NEXT: rbit z0.h, p0/m, z0.h 19; CHECK-NEXT: lsr z0.h, z0.h, #8 20; CHECK-NEXT: // kill: def $d0 killed $d0 killed $z0 21; CHECK-NEXT: ret 22; 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 16 27; NONEON-NOSVE-NEXT: ldrh w8, [sp, #6] 28; NONEON-NOSVE-NEXT: rbit w8, w8 29; NONEON-NOSVE-NEXT: lsr w8, w8, #24 30; NONEON-NOSVE-NEXT: strh w8, [sp, #14] 31; NONEON-NOSVE-NEXT: ldrh w8, [sp, #4] 32; NONEON-NOSVE-NEXT: rbit w8, w8 33; NONEON-NOSVE-NEXT: lsr w8, w8, #24 34; NONEON-NOSVE-NEXT: strh w8, [sp, #12] 35; NONEON-NOSVE-NEXT: ldrh w8, [sp, #2] 36; NONEON-NOSVE-NEXT: rbit w8, w8 37; NONEON-NOSVE-NEXT: lsr w8, w8, #24 38; NONEON-NOSVE-NEXT: strh w8, [sp, #10] 39; NONEON-NOSVE-NEXT: ldrh w8, [sp] 40; NONEON-NOSVE-NEXT: rbit w8, w8 41; NONEON-NOSVE-NEXT: lsr w8, w8, #24 42; NONEON-NOSVE-NEXT: strh w8, [sp, #8] 43; NONEON-NOSVE-NEXT: ldr d0, [sp, #8] 44; NONEON-NOSVE-NEXT: add sp, sp, #16 45; NONEON-NOSVE-NEXT: ret 46 %res = call <4 x i8> @llvm.bitreverse.v4i8(<4 x i8> %op) 47 ret <4 x i8> %res 48} 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, vl8 54; CHECK-NEXT: // kill: def $d0 killed $d0 def $z0 55; CHECK-NEXT: rbit z0.b, p0/m, z0.b 56; CHECK-NEXT: // kill: def $d0 killed $d0 killed $z0 57; CHECK-NEXT: ret 58; 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 16 63; NONEON-NOSVE-NEXT: ldrb w8, [sp, #7] 64; NONEON-NOSVE-NEXT: rbit w8, w8 65; NONEON-NOSVE-NEXT: lsr w8, w8, #24 66; NONEON-NOSVE-NEXT: strb w8, [sp, #15] 67; NONEON-NOSVE-NEXT: ldrb w8, [sp, #6] 68; NONEON-NOSVE-NEXT: rbit w8, w8 69; NONEON-NOSVE-NEXT: lsr w8, w8, #24 70; NONEON-NOSVE-NEXT: strb w8, [sp, #14] 71; NONEON-NOSVE-NEXT: ldrb w8, [sp, #5] 72; NONEON-NOSVE-NEXT: rbit w8, w8 73; NONEON-NOSVE-NEXT: lsr w8, w8, #24 74; NONEON-NOSVE-NEXT: strb w8, [sp, #13] 75; NONEON-NOSVE-NEXT: ldrb w8, [sp, #4] 76; NONEON-NOSVE-NEXT: rbit w8, w8 77; NONEON-NOSVE-NEXT: lsr w8, w8, #24 78; NONEON-NOSVE-NEXT: strb w8, [sp, #12] 79; NONEON-NOSVE-NEXT: ldrb w8, [sp, #3] 80; NONEON-NOSVE-NEXT: rbit w8, w8 81; NONEON-NOSVE-NEXT: lsr w8, w8, #24 82; NONEON-NOSVE-NEXT: strb w8, [sp, #11] 83; NONEON-NOSVE-NEXT: ldrb w8, [sp, #2] 84; NONEON-NOSVE-NEXT: rbit w8, w8 85; NONEON-NOSVE-NEXT: lsr w8, w8, #24 86; NONEON-NOSVE-NEXT: strb w8, [sp, #10] 87; NONEON-NOSVE-NEXT: ldrb w8, [sp, #1] 88; NONEON-NOSVE-NEXT: rbit w8, w8 89; NONEON-NOSVE-NEXT: lsr w8, w8, #24 90; NONEON-NOSVE-NEXT: strb w8, [sp, #9] 91; NONEON-NOSVE-NEXT: ldrb w8, [sp] 92; NONEON-NOSVE-NEXT: rbit w8, w8 93; NONEON-NOSVE-NEXT: lsr w8, w8, #24 94; NONEON-NOSVE-NEXT: strb w8, [sp, #8] 95; NONEON-NOSVE-NEXT: ldr d0, [sp, #8] 96; NONEON-NOSVE-NEXT: add sp, sp, #16 97; NONEON-NOSVE-NEXT: ret 98 %res = call <8 x i8> @llvm.bitreverse.v8i8(<8 x i8> %op) 99 ret <8 x i8> %res 100} 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, vl16 106; CHECK-NEXT: // kill: def $q0 killed $q0 def $z0 107; CHECK-NEXT: rbit z0.b, p0/m, z0.b 108; CHECK-NEXT: // kill: def $q0 killed $q0 killed $z0 109; CHECK-NEXT: ret 110; 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 32 115; NONEON-NOSVE-NEXT: ldrb w8, [sp, #15] 116; NONEON-NOSVE-NEXT: rbit w8, w8 117; NONEON-NOSVE-NEXT: lsr w8, w8, #24 118; NONEON-NOSVE-NEXT: strb w8, [sp, #31] 119; NONEON-NOSVE-NEXT: ldrb w8, [sp, #14] 120; NONEON-NOSVE-NEXT: rbit w8, w8 121; NONEON-NOSVE-NEXT: lsr w8, w8, #24 122; NONEON-NOSVE-NEXT: strb w8, [sp, #30] 123; NONEON-NOSVE-NEXT: ldrb w8, [sp, #13] 124; NONEON-NOSVE-NEXT: rbit w8, w8 125; NONEON-NOSVE-NEXT: lsr w8, w8, #24 126; NONEON-NOSVE-NEXT: strb w8, [sp, #29] 127; NONEON-NOSVE-NEXT: ldrb w8, [sp, #12] 128; NONEON-NOSVE-NEXT: rbit w8, w8 129; NONEON-NOSVE-NEXT: lsr w8, w8, #24 130; NONEON-NOSVE-NEXT: strb w8, [sp, #28] 131; NONEON-NOSVE-NEXT: ldrb w8, [sp, #11] 132; NONEON-NOSVE-NEXT: rbit w8, w8 133; NONEON-NOSVE-NEXT: lsr w8, w8, #24 134; NONEON-NOSVE-NEXT: strb w8, [sp, #27] 135; NONEON-NOSVE-NEXT: ldrb w8, [sp, #10] 136; NONEON-NOSVE-NEXT: rbit w8, w8 137; NONEON-NOSVE-NEXT: lsr w8, w8, #24 138; NONEON-NOSVE-NEXT: strb w8, [sp, #26] 139; NONEON-NOSVE-NEXT: ldrb w8, [sp, #9] 140; NONEON-NOSVE-NEXT: rbit w8, w8 141; NONEON-NOSVE-NEXT: lsr w8, w8, #24 142; NONEON-NOSVE-NEXT: strb w8, [sp, #25] 143; NONEON-NOSVE-NEXT: ldrb w8, [sp, #8] 144; NONEON-NOSVE-NEXT: rbit w8, w8 145; NONEON-NOSVE-NEXT: lsr w8, w8, #24 146; NONEON-NOSVE-NEXT: strb w8, [sp, #24] 147; NONEON-NOSVE-NEXT: ldrb w8, [sp, #7] 148; NONEON-NOSVE-NEXT: rbit w8, w8 149; NONEON-NOSVE-NEXT: lsr w8, w8, #24 150; NONEON-NOSVE-NEXT: strb w8, [sp, #23] 151; NONEON-NOSVE-NEXT: ldrb w8, [sp, #6] 152; NONEON-NOSVE-NEXT: rbit w8, w8 153; NONEON-NOSVE-NEXT: lsr w8, w8, #24 154; NONEON-NOSVE-NEXT: strb w8, [sp, #22] 155; NONEON-NOSVE-NEXT: ldrb w8, [sp, #5] 156; NONEON-NOSVE-NEXT: rbit w8, w8 157; NONEON-NOSVE-NEXT: lsr w8, w8, #24 158; NONEON-NOSVE-NEXT: strb w8, [sp, #21] 159; NONEON-NOSVE-NEXT: ldrb w8, [sp, #4] 160; NONEON-NOSVE-NEXT: rbit w8, w8 161; NONEON-NOSVE-NEXT: lsr w8, w8, #24 162; NONEON-NOSVE-NEXT: strb w8, [sp, #20] 163; NONEON-NOSVE-NEXT: ldrb w8, [sp, #3] 164; NONEON-NOSVE-NEXT: rbit w8, w8 165; NONEON-NOSVE-NEXT: lsr w8, w8, #24 166; NONEON-NOSVE-NEXT: strb w8, [sp, #19] 167; NONEON-NOSVE-NEXT: ldrb w8, [sp, #2] 168; NONEON-NOSVE-NEXT: rbit w8, w8 169; NONEON-NOSVE-NEXT: lsr w8, w8, #24 170; NONEON-NOSVE-NEXT: strb w8, [sp, #18] 171; NONEON-NOSVE-NEXT: ldrb w8, [sp, #1] 172; NONEON-NOSVE-NEXT: rbit w8, w8 173; NONEON-NOSVE-NEXT: lsr w8, w8, #24 174; NONEON-NOSVE-NEXT: strb w8, [sp, #17] 175; NONEON-NOSVE-NEXT: ldrb w8, [sp] 176; NONEON-NOSVE-NEXT: rbit w8, w8 177; NONEON-NOSVE-NEXT: lsr w8, w8, #24 178; NONEON-NOSVE-NEXT: strb w8, [sp, #16] 179; NONEON-NOSVE-NEXT: ldr q0, [sp, #16] 180; NONEON-NOSVE-NEXT: add sp, sp, #32 181; NONEON-NOSVE-NEXT: ret 182 %res = call <16 x i8> @llvm.bitreverse.v16i8(<16 x i8> %op) 183 ret <16 x i8> %res 184} 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, vl16 191; CHECK-NEXT: rbit z0.b, p0/m, z0.b 192; CHECK-NEXT: rbit z1.b, p0/m, z1.b 193; CHECK-NEXT: stp q0, q1, [x0] 194; CHECK-NEXT: ret 195; 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 64 201; NONEON-NOSVE-NEXT: ldrb w8, [sp, #31] 202; NONEON-NOSVE-NEXT: rbit w8, w8 203; NONEON-NOSVE-NEXT: lsr w8, w8, #24 204; NONEON-NOSVE-NEXT: strb w8, [sp, #63] 205; NONEON-NOSVE-NEXT: ldrb w8, [sp, #30] 206; NONEON-NOSVE-NEXT: rbit w8, w8 207; NONEON-NOSVE-NEXT: lsr w8, w8, #24 208; NONEON-NOSVE-NEXT: strb w8, [sp, #62] 209; NONEON-NOSVE-NEXT: ldrb w8, [sp, #29] 210; NONEON-NOSVE-NEXT: rbit w8, w8 211; NONEON-NOSVE-NEXT: lsr w8, w8, #24 212; NONEON-NOSVE-NEXT: strb w8, [sp, #61] 213; NONEON-NOSVE-NEXT: ldrb w8, [sp, #28] 214; NONEON-NOSVE-NEXT: rbit w8, w8 215; NONEON-NOSVE-NEXT: lsr w8, w8, #24 216; NONEON-NOSVE-NEXT: strb w8, [sp, #60] 217; NONEON-NOSVE-NEXT: ldrb w8, [sp, #27] 218; NONEON-NOSVE-NEXT: rbit w8, w8 219; NONEON-NOSVE-NEXT: lsr w8, w8, #24 220; NONEON-NOSVE-NEXT: strb w8, [sp, #59] 221; NONEON-NOSVE-NEXT: ldrb w8, [sp, #26] 222; NONEON-NOSVE-NEXT: rbit w8, w8 223; NONEON-NOSVE-NEXT: lsr w8, w8, #24 224; NONEON-NOSVE-NEXT: strb w8, [sp, #58] 225; NONEON-NOSVE-NEXT: ldrb w8, [sp, #25] 226; NONEON-NOSVE-NEXT: rbit w8, w8 227; NONEON-NOSVE-NEXT: lsr w8, w8, #24 228; NONEON-NOSVE-NEXT: strb w8, [sp, #57] 229; NONEON-NOSVE-NEXT: ldrb w8, [sp, #24] 230; NONEON-NOSVE-NEXT: rbit w8, w8 231; NONEON-NOSVE-NEXT: lsr w8, w8, #24 232; NONEON-NOSVE-NEXT: strb w8, [sp, #56] 233; NONEON-NOSVE-NEXT: ldrb w8, [sp, #23] 234; NONEON-NOSVE-NEXT: rbit w8, w8 235; NONEON-NOSVE-NEXT: lsr w8, w8, #24 236; NONEON-NOSVE-NEXT: strb w8, [sp, #55] 237; NONEON-NOSVE-NEXT: ldrb w8, [sp, #22] 238; NONEON-NOSVE-NEXT: rbit w8, w8 239; NONEON-NOSVE-NEXT: lsr w8, w8, #24 240; NONEON-NOSVE-NEXT: strb w8, [sp, #54] 241; NONEON-NOSVE-NEXT: ldrb w8, [sp, #21] 242; NONEON-NOSVE-NEXT: rbit w8, w8 243; NONEON-NOSVE-NEXT: lsr w8, w8, #24 244; NONEON-NOSVE-NEXT: strb w8, [sp, #53] 245; NONEON-NOSVE-NEXT: ldrb w8, [sp, #20] 246; NONEON-NOSVE-NEXT: rbit w8, w8 247; NONEON-NOSVE-NEXT: lsr w8, w8, #24 248; NONEON-NOSVE-NEXT: strb w8, [sp, #52] 249; NONEON-NOSVE-NEXT: ldrb w8, [sp, #19] 250; NONEON-NOSVE-NEXT: rbit w8, w8 251; NONEON-NOSVE-NEXT: lsr w8, w8, #24 252; NONEON-NOSVE-NEXT: strb w8, [sp, #51] 253; NONEON-NOSVE-NEXT: ldrb w8, [sp, #18] 254; NONEON-NOSVE-NEXT: rbit w8, w8 255; NONEON-NOSVE-NEXT: lsr w8, w8, #24 256; NONEON-NOSVE-NEXT: strb w8, [sp, #50] 257; NONEON-NOSVE-NEXT: ldrb w8, [sp, #17] 258; NONEON-NOSVE-NEXT: rbit w8, w8 259; NONEON-NOSVE-NEXT: lsr w8, w8, #24 260; NONEON-NOSVE-NEXT: strb w8, [sp, #49] 261; NONEON-NOSVE-NEXT: ldrb w8, [sp, #16] 262; NONEON-NOSVE-NEXT: rbit w8, w8 263; NONEON-NOSVE-NEXT: lsr w8, w8, #24 264; NONEON-NOSVE-NEXT: strb w8, [sp, #48] 265; NONEON-NOSVE-NEXT: ldrb w8, [sp, #15] 266; NONEON-NOSVE-NEXT: rbit w8, w8 267; NONEON-NOSVE-NEXT: lsr w8, w8, #24 268; NONEON-NOSVE-NEXT: strb w8, [sp, #47] 269; NONEON-NOSVE-NEXT: ldrb w8, [sp, #14] 270; NONEON-NOSVE-NEXT: rbit w8, w8 271; NONEON-NOSVE-NEXT: lsr w8, w8, #24 272; NONEON-NOSVE-NEXT: strb w8, [sp, #46] 273; NONEON-NOSVE-NEXT: ldrb w8, [sp, #13] 274; NONEON-NOSVE-NEXT: rbit w8, w8 275; NONEON-NOSVE-NEXT: lsr w8, w8, #24 276; NONEON-NOSVE-NEXT: strb w8, [sp, #45] 277; NONEON-NOSVE-NEXT: ldrb w8, [sp, #12] 278; NONEON-NOSVE-NEXT: rbit w8, w8 279; NONEON-NOSVE-NEXT: lsr w8, w8, #24 280; NONEON-NOSVE-NEXT: strb w8, [sp, #44] 281; NONEON-NOSVE-NEXT: ldrb w8, [sp, #11] 282; NONEON-NOSVE-NEXT: rbit w8, w8 283; NONEON-NOSVE-NEXT: lsr w8, w8, #24 284; NONEON-NOSVE-NEXT: strb w8, [sp, #43] 285; NONEON-NOSVE-NEXT: ldrb w8, [sp, #10] 286; NONEON-NOSVE-NEXT: rbit w8, w8 287; NONEON-NOSVE-NEXT: lsr w8, w8, #24 288; NONEON-NOSVE-NEXT: strb w8, [sp, #42] 289; NONEON-NOSVE-NEXT: ldrb w8, [sp, #9] 290; NONEON-NOSVE-NEXT: rbit w8, w8 291; NONEON-NOSVE-NEXT: lsr w8, w8, #24 292; NONEON-NOSVE-NEXT: strb w8, [sp, #41] 293; NONEON-NOSVE-NEXT: ldrb w8, [sp, #8] 294; NONEON-NOSVE-NEXT: rbit w8, w8 295; NONEON-NOSVE-NEXT: lsr w8, w8, #24 296; NONEON-NOSVE-NEXT: strb w8, [sp, #40] 297; NONEON-NOSVE-NEXT: ldrb w8, [sp, #7] 298; NONEON-NOSVE-NEXT: rbit w8, w8 299; NONEON-NOSVE-NEXT: lsr w8, w8, #24 300; NONEON-NOSVE-NEXT: strb w8, [sp, #39] 301; NONEON-NOSVE-NEXT: ldrb w8, [sp, #6] 302; NONEON-NOSVE-NEXT: rbit w8, w8 303; NONEON-NOSVE-NEXT: lsr w8, w8, #24 304; NONEON-NOSVE-NEXT: strb w8, [sp, #38] 305; NONEON-NOSVE-NEXT: ldrb w8, [sp, #5] 306; NONEON-NOSVE-NEXT: rbit w8, w8 307; NONEON-NOSVE-NEXT: lsr w8, w8, #24 308; NONEON-NOSVE-NEXT: strb w8, [sp, #37] 309; NONEON-NOSVE-NEXT: ldrb w8, [sp, #4] 310; NONEON-NOSVE-NEXT: rbit w8, w8 311; NONEON-NOSVE-NEXT: lsr w8, w8, #24 312; NONEON-NOSVE-NEXT: strb w8, [sp, #36] 313; NONEON-NOSVE-NEXT: ldrb w8, [sp, #3] 314; NONEON-NOSVE-NEXT: rbit w8, w8 315; NONEON-NOSVE-NEXT: lsr w8, w8, #24 316; NONEON-NOSVE-NEXT: strb w8, [sp, #35] 317; NONEON-NOSVE-NEXT: ldrb w8, [sp, #2] 318; NONEON-NOSVE-NEXT: rbit w8, w8 319; NONEON-NOSVE-NEXT: lsr w8, w8, #24 320; NONEON-NOSVE-NEXT: strb w8, [sp, #34] 321; NONEON-NOSVE-NEXT: ldrb w8, [sp, #1] 322; NONEON-NOSVE-NEXT: rbit w8, w8 323; NONEON-NOSVE-NEXT: lsr w8, w8, #24 324; NONEON-NOSVE-NEXT: strb w8, [sp, #33] 325; NONEON-NOSVE-NEXT: ldrb w8, [sp] 326; NONEON-NOSVE-NEXT: rbit w8, w8 327; NONEON-NOSVE-NEXT: lsr w8, w8, #24 328; 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, #64 332; NONEON-NOSVE-NEXT: ret 333 %op = load <32 x i8>, ptr %a 334 %res = call <32 x i8> @llvm.bitreverse.v32i8(<32 x i8> %op) 335 store <32 x i8> %res, ptr %a 336 ret void 337} 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, vl2 343; CHECK-NEXT: // kill: def $d0 killed $d0 def $z0 344; CHECK-NEXT: rbit z0.s, p0/m, z0.s 345; CHECK-NEXT: lsr z0.s, z0.s, #16 346; CHECK-NEXT: // kill: def $d0 killed $d0 killed $z0 347; CHECK-NEXT: ret 348; 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 16 353; NONEON-NOSVE-NEXT: ldr w8, [sp, #4] 354; NONEON-NOSVE-NEXT: rbit w8, w8 355; NONEON-NOSVE-NEXT: lsr w9, w8, #16 356; NONEON-NOSVE-NEXT: ldr w8, [sp] 357; NONEON-NOSVE-NEXT: rbit w8, w8 358; NONEON-NOSVE-NEXT: lsr w8, w8, #16 359; NONEON-NOSVE-NEXT: stp w8, w9, [sp, #8] 360; NONEON-NOSVE-NEXT: ldr d0, [sp, #8] 361; NONEON-NOSVE-NEXT: add sp, sp, #16 362; NONEON-NOSVE-NEXT: ret 363 %res = call <2 x i16> @llvm.bitreverse.v2i16(<2 x i16> %op) 364 ret <2 x i16> %res 365} 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, vl4 371; CHECK-NEXT: // kill: def $d0 killed $d0 def $z0 372; CHECK-NEXT: rbit z0.h, p0/m, z0.h 373; CHECK-NEXT: // kill: def $d0 killed $d0 killed $z0 374; CHECK-NEXT: ret 375; 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 16 380; NONEON-NOSVE-NEXT: ldrh w8, [sp, #6] 381; NONEON-NOSVE-NEXT: rbit w8, w8 382; NONEON-NOSVE-NEXT: lsr w8, w8, #16 383; NONEON-NOSVE-NEXT: strh w8, [sp, #14] 384; NONEON-NOSVE-NEXT: ldrh w8, [sp, #4] 385; NONEON-NOSVE-NEXT: rbit w8, w8 386; NONEON-NOSVE-NEXT: lsr w8, w8, #16 387; NONEON-NOSVE-NEXT: strh w8, [sp, #12] 388; NONEON-NOSVE-NEXT: ldrh w8, [sp, #2] 389; NONEON-NOSVE-NEXT: rbit w8, w8 390; NONEON-NOSVE-NEXT: lsr w8, w8, #16 391; NONEON-NOSVE-NEXT: strh w8, [sp, #10] 392; NONEON-NOSVE-NEXT: ldrh w8, [sp] 393; NONEON-NOSVE-NEXT: rbit w8, w8 394; NONEON-NOSVE-NEXT: lsr w8, w8, #16 395; NONEON-NOSVE-NEXT: strh w8, [sp, #8] 396; NONEON-NOSVE-NEXT: ldr d0, [sp, #8] 397; NONEON-NOSVE-NEXT: add sp, sp, #16 398; NONEON-NOSVE-NEXT: ret 399 %res = call <4 x i16> @llvm.bitreverse.v4i16(<4 x i16> %op) 400 ret <4 x i16> %res 401} 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, vl8 407; CHECK-NEXT: // kill: def $q0 killed $q0 def $z0 408; CHECK-NEXT: rbit z0.h, p0/m, z0.h 409; CHECK-NEXT: // kill: def $q0 killed $q0 killed $z0 410; CHECK-NEXT: ret 411; 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 32 416; NONEON-NOSVE-NEXT: ldrh w8, [sp, #14] 417; NONEON-NOSVE-NEXT: rbit w8, w8 418; NONEON-NOSVE-NEXT: lsr w8, w8, #16 419; NONEON-NOSVE-NEXT: strh w8, [sp, #30] 420; NONEON-NOSVE-NEXT: ldrh w8, [sp, #12] 421; NONEON-NOSVE-NEXT: rbit w8, w8 422; NONEON-NOSVE-NEXT: lsr w8, w8, #16 423; NONEON-NOSVE-NEXT: strh w8, [sp, #28] 424; NONEON-NOSVE-NEXT: ldrh w8, [sp, #10] 425; NONEON-NOSVE-NEXT: rbit w8, w8 426; NONEON-NOSVE-NEXT: lsr w8, w8, #16 427; NONEON-NOSVE-NEXT: strh w8, [sp, #26] 428; NONEON-NOSVE-NEXT: ldrh w8, [sp, #8] 429; NONEON-NOSVE-NEXT: rbit w8, w8 430; NONEON-NOSVE-NEXT: lsr w8, w8, #16 431; NONEON-NOSVE-NEXT: strh w8, [sp, #24] 432; NONEON-NOSVE-NEXT: ldrh w8, [sp, #6] 433; NONEON-NOSVE-NEXT: rbit w8, w8 434; NONEON-NOSVE-NEXT: lsr w8, w8, #16 435; NONEON-NOSVE-NEXT: strh w8, [sp, #22] 436; NONEON-NOSVE-NEXT: ldrh w8, [sp, #4] 437; NONEON-NOSVE-NEXT: rbit w8, w8 438; NONEON-NOSVE-NEXT: lsr w8, w8, #16 439; NONEON-NOSVE-NEXT: strh w8, [sp, #20] 440; NONEON-NOSVE-NEXT: ldrh w8, [sp, #2] 441; NONEON-NOSVE-NEXT: rbit w8, w8 442; NONEON-NOSVE-NEXT: lsr w8, w8, #16 443; NONEON-NOSVE-NEXT: strh w8, [sp, #18] 444; NONEON-NOSVE-NEXT: ldrh w8, [sp] 445; NONEON-NOSVE-NEXT: rbit w8, w8 446; NONEON-NOSVE-NEXT: lsr w8, w8, #16 447; NONEON-NOSVE-NEXT: strh w8, [sp, #16] 448; NONEON-NOSVE-NEXT: ldr q0, [sp, #16] 449; NONEON-NOSVE-NEXT: add sp, sp, #32 450; NONEON-NOSVE-NEXT: ret 451 %res = call <8 x i16> @llvm.bitreverse.v8i16(<8 x i16> %op) 452 ret <8 x i16> %res 453} 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, vl8 460; CHECK-NEXT: rbit z0.h, p0/m, z0.h 461; CHECK-NEXT: rbit z1.h, p0/m, z1.h 462; CHECK-NEXT: stp q0, q1, [x0] 463; CHECK-NEXT: ret 464; 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 64 470; NONEON-NOSVE-NEXT: ldrh w8, [sp, #30] 471; NONEON-NOSVE-NEXT: rbit w8, w8 472; NONEON-NOSVE-NEXT: lsr w8, w8, #16 473; NONEON-NOSVE-NEXT: strh w8, [sp, #62] 474; NONEON-NOSVE-NEXT: ldrh w8, [sp, #28] 475; NONEON-NOSVE-NEXT: rbit w8, w8 476; NONEON-NOSVE-NEXT: lsr w8, w8, #16 477; NONEON-NOSVE-NEXT: strh w8, [sp, #60] 478; NONEON-NOSVE-NEXT: ldrh w8, [sp, #26] 479; NONEON-NOSVE-NEXT: rbit w8, w8 480; NONEON-NOSVE-NEXT: lsr w8, w8, #16 481; NONEON-NOSVE-NEXT: strh w8, [sp, #58] 482; NONEON-NOSVE-NEXT: ldrh w8, [sp, #24] 483; NONEON-NOSVE-NEXT: rbit w8, w8 484; NONEON-NOSVE-NEXT: lsr w8, w8, #16 485; NONEON-NOSVE-NEXT: strh w8, [sp, #56] 486; NONEON-NOSVE-NEXT: ldrh w8, [sp, #22] 487; NONEON-NOSVE-NEXT: rbit w8, w8 488; NONEON-NOSVE-NEXT: lsr w8, w8, #16 489; NONEON-NOSVE-NEXT: strh w8, [sp, #54] 490; NONEON-NOSVE-NEXT: ldrh w8, [sp, #20] 491; NONEON-NOSVE-NEXT: rbit w8, w8 492; NONEON-NOSVE-NEXT: lsr w8, w8, #16 493; NONEON-NOSVE-NEXT: strh w8, [sp, #52] 494; NONEON-NOSVE-NEXT: ldrh w8, [sp, #18] 495; NONEON-NOSVE-NEXT: rbit w8, w8 496; NONEON-NOSVE-NEXT: lsr w8, w8, #16 497; NONEON-NOSVE-NEXT: strh w8, [sp, #50] 498; NONEON-NOSVE-NEXT: ldrh w8, [sp, #16] 499; NONEON-NOSVE-NEXT: rbit w8, w8 500; NONEON-NOSVE-NEXT: lsr w8, w8, #16 501; NONEON-NOSVE-NEXT: strh w8, [sp, #48] 502; NONEON-NOSVE-NEXT: ldrh w8, [sp, #14] 503; NONEON-NOSVE-NEXT: rbit w8, w8 504; NONEON-NOSVE-NEXT: lsr w8, w8, #16 505; NONEON-NOSVE-NEXT: strh w8, [sp, #46] 506; NONEON-NOSVE-NEXT: ldrh w8, [sp, #12] 507; NONEON-NOSVE-NEXT: rbit w8, w8 508; NONEON-NOSVE-NEXT: lsr w8, w8, #16 509; NONEON-NOSVE-NEXT: strh w8, [sp, #44] 510; NONEON-NOSVE-NEXT: ldrh w8, [sp, #10] 511; NONEON-NOSVE-NEXT: rbit w8, w8 512; NONEON-NOSVE-NEXT: lsr w8, w8, #16 513; NONEON-NOSVE-NEXT: strh w8, [sp, #42] 514; NONEON-NOSVE-NEXT: ldrh w8, [sp, #8] 515; NONEON-NOSVE-NEXT: rbit w8, w8 516; NONEON-NOSVE-NEXT: lsr w8, w8, #16 517; NONEON-NOSVE-NEXT: strh w8, [sp, #40] 518; NONEON-NOSVE-NEXT: ldrh w8, [sp, #6] 519; NONEON-NOSVE-NEXT: rbit w8, w8 520; NONEON-NOSVE-NEXT: lsr w8, w8, #16 521; NONEON-NOSVE-NEXT: strh w8, [sp, #38] 522; NONEON-NOSVE-NEXT: ldrh w8, [sp, #4] 523; NONEON-NOSVE-NEXT: rbit w8, w8 524; NONEON-NOSVE-NEXT: lsr w8, w8, #16 525; NONEON-NOSVE-NEXT: strh w8, [sp, #36] 526; NONEON-NOSVE-NEXT: ldrh w8, [sp, #2] 527; NONEON-NOSVE-NEXT: rbit w8, w8 528; NONEON-NOSVE-NEXT: lsr w8, w8, #16 529; NONEON-NOSVE-NEXT: strh w8, [sp, #34] 530; NONEON-NOSVE-NEXT: ldrh w8, [sp] 531; NONEON-NOSVE-NEXT: rbit w8, w8 532; NONEON-NOSVE-NEXT: lsr w8, w8, #16 533; 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, #64 537; NONEON-NOSVE-NEXT: ret 538 %op = load <16 x i16>, ptr %a 539 %res = call <16 x i16> @llvm.bitreverse.v16i16(<16 x i16> %op) 540 store <16 x i16> %res, ptr %a 541 ret void 542} 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, vl2 548; CHECK-NEXT: // kill: def $d0 killed $d0 def $z0 549; CHECK-NEXT: rbit z0.s, p0/m, z0.s 550; CHECK-NEXT: // kill: def $d0 killed $d0 killed $z0 551; CHECK-NEXT: ret 552; 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 16 557; NONEON-NOSVE-NEXT: ldr w8, [sp, #4] 558; NONEON-NOSVE-NEXT: rbit w9, w8 559; NONEON-NOSVE-NEXT: ldr w8, [sp] 560; NONEON-NOSVE-NEXT: rbit w8, w8 561; NONEON-NOSVE-NEXT: stp w8, w9, [sp, #8] 562; NONEON-NOSVE-NEXT: ldr d0, [sp, #8] 563; NONEON-NOSVE-NEXT: add sp, sp, #16 564; NONEON-NOSVE-NEXT: ret 565 %res = call <2 x i32> @llvm.bitreverse.v2i32(<2 x i32> %op) 566 ret <2 x i32> %res 567} 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, vl4 573; CHECK-NEXT: // kill: def $q0 killed $q0 def $z0 574; CHECK-NEXT: rbit z0.s, p0/m, z0.s 575; CHECK-NEXT: // kill: def $q0 killed $q0 killed $z0 576; CHECK-NEXT: ret 577; 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 32 582; NONEON-NOSVE-NEXT: ldr w8, [sp, #12] 583; NONEON-NOSVE-NEXT: rbit w9, w8 584; NONEON-NOSVE-NEXT: ldr w8, [sp, #8] 585; NONEON-NOSVE-NEXT: rbit w8, w8 586; NONEON-NOSVE-NEXT: stp w8, w9, [sp, #24] 587; NONEON-NOSVE-NEXT: ldr w8, [sp, #4] 588; NONEON-NOSVE-NEXT: rbit w9, w8 589; NONEON-NOSVE-NEXT: ldr w8, [sp] 590; NONEON-NOSVE-NEXT: rbit w8, w8 591; NONEON-NOSVE-NEXT: stp w8, w9, [sp, #16] 592; NONEON-NOSVE-NEXT: ldr q0, [sp, #16] 593; NONEON-NOSVE-NEXT: add sp, sp, #32 594; NONEON-NOSVE-NEXT: ret 595 %res = call <4 x i32> @llvm.bitreverse.v4i32(<4 x i32> %op) 596 ret <4 x i32> %res 597} 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, vl4 604; CHECK-NEXT: rbit z0.s, p0/m, z0.s 605; CHECK-NEXT: rbit z1.s, p0/m, z1.s 606; CHECK-NEXT: stp q0, q1, [x0] 607; CHECK-NEXT: ret 608; 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 64 614; NONEON-NOSVE-NEXT: ldr w8, [sp, #28] 615; NONEON-NOSVE-NEXT: rbit w9, w8 616; NONEON-NOSVE-NEXT: ldr w8, [sp, #24] 617; NONEON-NOSVE-NEXT: rbit w8, w8 618; NONEON-NOSVE-NEXT: stp w8, w9, [sp, #56] 619; NONEON-NOSVE-NEXT: ldr w8, [sp, #20] 620; NONEON-NOSVE-NEXT: rbit w9, w8 621; NONEON-NOSVE-NEXT: ldr w8, [sp, #16] 622; NONEON-NOSVE-NEXT: rbit w8, w8 623; NONEON-NOSVE-NEXT: stp w8, w9, [sp, #48] 624; NONEON-NOSVE-NEXT: ldr w8, [sp, #12] 625; NONEON-NOSVE-NEXT: rbit w9, w8 626; NONEON-NOSVE-NEXT: ldr w8, [sp, #8] 627; NONEON-NOSVE-NEXT: rbit w8, w8 628; NONEON-NOSVE-NEXT: stp w8, w9, [sp, #40] 629; NONEON-NOSVE-NEXT: ldr w8, [sp, #4] 630; NONEON-NOSVE-NEXT: rbit w9, w8 631; NONEON-NOSVE-NEXT: ldr w8, [sp] 632; NONEON-NOSVE-NEXT: rbit w8, w8 633; 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, #64 637; NONEON-NOSVE-NEXT: ret 638 %op = load <8 x i32>, ptr %a 639 %res = call <8 x i32> @llvm.bitreverse.v8i32(<8 x i32> %op) 640 store <8 x i32> %res, ptr %a 641 ret void 642} 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, vl1 648; CHECK-NEXT: // kill: def $d0 killed $d0 def $z0 649; CHECK-NEXT: rbit z0.d, p0/m, z0.d 650; CHECK-NEXT: // kill: def $d0 killed $d0 killed $z0 651; CHECK-NEXT: ret 652; 653; NONEON-NOSVE-LABEL: bitreverse_v1i64: 654; NONEON-NOSVE: // %bb.0: 655; NONEON-NOSVE-NEXT: sub sp, sp, #16 656; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 16 657; NONEON-NOSVE-NEXT: fmov x8, d0 658; NONEON-NOSVE-NEXT: rbit x8, x8 659; NONEON-NOSVE-NEXT: str x8, [sp, #8] 660; NONEON-NOSVE-NEXT: ldr d0, [sp, #8] 661; NONEON-NOSVE-NEXT: add sp, sp, #16 662; NONEON-NOSVE-NEXT: ret 663 %res = call <1 x i64> @llvm.bitreverse.v1i64(<1 x i64> %op) 664 ret <1 x i64> %res 665} 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, vl2 671; CHECK-NEXT: // kill: def $q0 killed $q0 def $z0 672; CHECK-NEXT: rbit z0.d, p0/m, z0.d 673; CHECK-NEXT: // kill: def $q0 killed $q0 killed $z0 674; CHECK-NEXT: ret 675; 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 32 680; NONEON-NOSVE-NEXT: ldr x8, [sp, #8] 681; NONEON-NOSVE-NEXT: rbit x9, x8 682; NONEON-NOSVE-NEXT: ldr x8, [sp] 683; NONEON-NOSVE-NEXT: rbit x8, x8 684; NONEON-NOSVE-NEXT: stp x8, x9, [sp, #16] 685; NONEON-NOSVE-NEXT: ldr q0, [sp, #16] 686; NONEON-NOSVE-NEXT: add sp, sp, #32 687; NONEON-NOSVE-NEXT: ret 688 %res = call <2 x i64> @llvm.bitreverse.v2i64(<2 x i64> %op) 689 ret <2 x i64> %res 690} 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, vl2 697; CHECK-NEXT: rbit z0.d, p0/m, z0.d 698; CHECK-NEXT: rbit z1.d, p0/m, z1.d 699; CHECK-NEXT: stp q0, q1, [x0] 700; CHECK-NEXT: ret 701; 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 64 707; NONEON-NOSVE-NEXT: ldr x8, [sp, #24] 708; NONEON-NOSVE-NEXT: rbit x9, x8 709; NONEON-NOSVE-NEXT: ldr x8, [sp, #16] 710; NONEON-NOSVE-NEXT: rbit x8, x8 711; NONEON-NOSVE-NEXT: stp x8, x9, [sp, #48] 712; NONEON-NOSVE-NEXT: ldr x8, [sp, #8] 713; NONEON-NOSVE-NEXT: rbit x9, x8 714; NONEON-NOSVE-NEXT: ldr x8, [sp] 715; NONEON-NOSVE-NEXT: rbit x8, x8 716; 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, #64 720; NONEON-NOSVE-NEXT: ret 721 %op = load <4 x i64>, ptr %a 722 %res = call <4 x i64> @llvm.bitreverse.v4i64(<4 x i64> %op) 723 store <4 x i64> %res, ptr %a 724 ret void 725} 726 727; 728; REVB 729; 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, vl2 735; CHECK-NEXT: // kill: def $d0 killed $d0 def $z0 736; CHECK-NEXT: revb z0.s, p0/m, z0.s 737; CHECK-NEXT: lsr z0.s, z0.s, #16 738; CHECK-NEXT: // kill: def $d0 killed $d0 killed $z0 739; CHECK-NEXT: ret 740; 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 32 745; 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, #32 768; NONEON-NOSVE-NEXT: ret 769 %res = call <2 x i16> @llvm.bswap.v2i16(<2 x i16> %op) 770 ret <2 x i16> %res 771} 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, vl4 777; CHECK-NEXT: // kill: def $d0 killed $d0 def $z0 778; CHECK-NEXT: revb z0.h, p0/m, z0.h 779; CHECK-NEXT: // kill: def $d0 killed $d0 killed $z0 780; CHECK-NEXT: ret 781; 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 16 786; 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, #16 804; NONEON-NOSVE-NEXT: ret 805 %res = call <4 x i16> @llvm.bswap.v4i16(<4 x i16> %op) 806 ret <4 x i16> %res 807} 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, vl8 813; CHECK-NEXT: // kill: def $q0 killed $q0 def $z0 814; CHECK-NEXT: revb z0.h, p0/m, z0.h 815; CHECK-NEXT: // kill: def $q0 killed $q0 killed $z0 816; CHECK-NEXT: ret 817; 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 32 822; 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, #32 856; NONEON-NOSVE-NEXT: ret 857 %res = call <8 x i16> @llvm.bswap.v8i16(<8 x i16> %op) 858 ret <8 x i16> %res 859} 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, vl8 866; CHECK-NEXT: revb z0.h, p0/m, z0.h 867; CHECK-NEXT: revb z1.h, p0/m, z1.h 868; CHECK-NEXT: stp q0, q1, [x0] 869; CHECK-NEXT: ret 870; 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 64 876; 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, #64 946; NONEON-NOSVE-NEXT: ret 947 %op = load <16 x i16>, ptr %a 948 %res = call <16 x i16> @llvm.bswap.v16i16(<16 x i16> %op) 949 store <16 x i16> %res, ptr %a 950 ret void 951} 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, vl2 957; CHECK-NEXT: // kill: def $d0 killed $d0 def $z0 958; CHECK-NEXT: revb z0.s, p0/m, z0.s 959; CHECK-NEXT: // kill: def $d0 killed $d0 killed $z0 960; CHECK-NEXT: ret 961; 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 16 966; 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, #16 984; NONEON-NOSVE-NEXT: ret 985 %res = call <2 x i32> @llvm.bswap.v2i32(<2 x i32> %op) 986 ret <2 x i32> %res 987} 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, vl4 993; CHECK-NEXT: // kill: def $q0 killed $q0 def $z0 994; CHECK-NEXT: revb z0.s, p0/m, z0.s 995; CHECK-NEXT: // kill: def $q0 killed $q0 killed $z0 996; CHECK-NEXT: ret 997; 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 32 1002; 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, #32 1036; NONEON-NOSVE-NEXT: ret 1037 %res = call <4 x i32> @llvm.bswap.v4i32(<4 x i32> %op) 1038 ret <4 x i32> %res 1039} 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, vl4 1046; CHECK-NEXT: revb z0.s, p0/m, z0.s 1047; CHECK-NEXT: revb z1.s, p0/m, z1.s 1048; CHECK-NEXT: stp q0, q1, [x0] 1049; CHECK-NEXT: ret 1050; 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 64 1056; 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, #64 1126; NONEON-NOSVE-NEXT: ret 1127 %op = load <8 x i32>, ptr %a 1128 %res = call <8 x i32> @llvm.bswap.v8i32(<8 x i32> %op) 1129 store <8 x i32> %res, ptr %a 1130 ret void 1131} 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, vl1 1137; CHECK-NEXT: // kill: def $d0 killed $d0 def $z0 1138; CHECK-NEXT: revb z0.d, p0/m, z0.d 1139; CHECK-NEXT: // kill: def $d0 killed $d0 killed $z0 1140; CHECK-NEXT: ret 1141; 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 16 1146; 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, #16 1164; NONEON-NOSVE-NEXT: ret 1165 %res = call <1 x i64> @llvm.bswap.v1i64(<1 x i64> %op) 1166 ret <1 x i64> %res 1167} 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, vl2 1173; CHECK-NEXT: // kill: def $q0 killed $q0 def $z0 1174; CHECK-NEXT: revb z0.d, p0/m, z0.d 1175; CHECK-NEXT: // kill: def $q0 killed $q0 killed $z0 1176; CHECK-NEXT: ret 1177; 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 32 1182; 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, #32 1216; NONEON-NOSVE-NEXT: ret 1217 %res = call <2 x i64> @llvm.bswap.v2i64(<2 x i64> %op) 1218 ret <2 x i64> %res 1219} 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, vl2 1226; CHECK-NEXT: revb z0.d, p0/m, z0.d 1227; CHECK-NEXT: revb z1.d, p0/m, z1.d 1228; CHECK-NEXT: stp q0, q1, [x0] 1229; CHECK-NEXT: ret 1230; 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 64 1236; 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, #64 1306; NONEON-NOSVE-NEXT: ret 1307 %op = load <4 x i64>, ptr %a 1308 %res = call <4 x i64> @llvm.bswap.v4i64(<4 x i64> %op) 1309 store <4 x i64> %res, ptr %a 1310 ret void 1311} 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