295 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc -mattr=+sve -force-streaming-compatible < %s | FileCheck %s3; RUN: llc -mattr=+sme -force-streaming < %s | FileCheck %s4; RUN: llc -force-streaming-compatible < %s | FileCheck %s --check-prefix=NONEON-NOSVE5 6target triple = "aarch64-unknown-linux-gnu"7 8define void @bitcast_v4i8(ptr %a, ptr %b) {9; CHECK-LABEL: bitcast_v4i8:10; CHECK: // %bb.0:11; CHECK-NEXT: ptrue p0.h, vl412; CHECK-NEXT: ld1b { z0.h }, p0/z, [x0]13; CHECK-NEXT: st1b { z0.h }, p0, [x1]14; CHECK-NEXT: ret15;16; NONEON-NOSVE-LABEL: bitcast_v4i8:17; NONEON-NOSVE: // %bb.0:18; NONEON-NOSVE-NEXT: ldrb w8, [x0]19; NONEON-NOSVE-NEXT: ldrb w9, [x0, #1]20; NONEON-NOSVE-NEXT: ldrb w10, [x0, #2]21; NONEON-NOSVE-NEXT: ldrb w11, [x0, #3]22; NONEON-NOSVE-NEXT: strb w11, [x1, #3]23; NONEON-NOSVE-NEXT: strb w10, [x1, #2]24; NONEON-NOSVE-NEXT: strb w9, [x1, #1]25; NONEON-NOSVE-NEXT: strb w8, [x1]26; NONEON-NOSVE-NEXT: ret27 %load = load volatile <4 x i8>, ptr %a28 %cast = bitcast <4 x i8> %load to <4 x i8>29 store volatile <4 x i8> %cast, ptr %b30 ret void31}32 33define void @bitcast_v8i8(ptr %a, ptr %b) {34; CHECK-LABEL: bitcast_v8i8:35; CHECK: // %bb.0:36; CHECK-NEXT: ldr d0, [x0]37; CHECK-NEXT: str d0, [x1]38; CHECK-NEXT: ret39;40; NONEON-NOSVE-LABEL: bitcast_v8i8:41; NONEON-NOSVE: // %bb.0:42; NONEON-NOSVE-NEXT: ldr d0, [x0]43; NONEON-NOSVE-NEXT: str d0, [x1]44; NONEON-NOSVE-NEXT: ret45 %load = load volatile <8 x i8>, ptr %a46 %cast = bitcast <8 x i8> %load to <8 x i8>47 store volatile <8 x i8> %cast, ptr %b48 ret void49}50 51define void @bitcast_v16i8(ptr %a, ptr %b) {52; CHECK-LABEL: bitcast_v16i8:53; CHECK: // %bb.0:54; CHECK-NEXT: ldr q0, [x0]55; CHECK-NEXT: str q0, [x1]56; CHECK-NEXT: ret57;58; NONEON-NOSVE-LABEL: bitcast_v16i8:59; NONEON-NOSVE: // %bb.0:60; NONEON-NOSVE-NEXT: ldr q0, [x0]61; NONEON-NOSVE-NEXT: str q0, [x1]62; NONEON-NOSVE-NEXT: ret63 %load = load volatile <16 x i8>, ptr %a64 %cast = bitcast <16 x i8> %load to <16 x i8>65 store volatile <16 x i8> %cast, ptr %b66 ret void67}68 69define void @bitcast_v32i8(ptr %a, ptr %b) {70; CHECK-LABEL: bitcast_v32i8:71; CHECK: // %bb.0:72; CHECK-NEXT: ldr q0, [x0]73; CHECK-NEXT: ldr q1, [x0, #16]74; CHECK-NEXT: str q1, [x1, #16]75; CHECK-NEXT: str q0, [x1]76; CHECK-NEXT: ret77;78; NONEON-NOSVE-LABEL: bitcast_v32i8:79; NONEON-NOSVE: // %bb.0:80; NONEON-NOSVE-NEXT: ldr q0, [x0]81; NONEON-NOSVE-NEXT: ldr q1, [x0, #16]82; NONEON-NOSVE-NEXT: str q1, [x1, #16]83; NONEON-NOSVE-NEXT: str q0, [x1]84; NONEON-NOSVE-NEXT: ret85 %load = load volatile <32 x i8>, ptr %a86 %cast = bitcast <32 x i8> %load to <32 x i8>87 store volatile <32 x i8> %cast, ptr %b88 ret void89}90 91define void @bitcast_v2i16(ptr %a, ptr %b) {92; CHECK-LABEL: bitcast_v2i16:93; CHECK: // %bb.0:94; CHECK-NEXT: ptrue p0.s, vl295; CHECK-NEXT: ld1h { z0.s }, p0/z, [x0]96; CHECK-NEXT: mov z1.s, z0.s[1]97; CHECK-NEXT: zip1 z0.h, z0.h, z1.h98; CHECK-NEXT: str s0, [x1]99; CHECK-NEXT: ret100;101; NONEON-NOSVE-LABEL: bitcast_v2i16:102; NONEON-NOSVE: // %bb.0:103; NONEON-NOSVE-NEXT: sub sp, sp, #16104; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 16105; NONEON-NOSVE-NEXT: ldrh w8, [x0]106; NONEON-NOSVE-NEXT: ldrh w9, [x0, #2]107; NONEON-NOSVE-NEXT: strh w9, [sp, #2]108; NONEON-NOSVE-NEXT: strh w8, [sp]109; NONEON-NOSVE-NEXT: ldr d0, [sp]110; NONEON-NOSVE-NEXT: str d0, [sp, #8]111; NONEON-NOSVE-NEXT: ldr w8, [sp, #8]112; NONEON-NOSVE-NEXT: str w8, [x1]113; NONEON-NOSVE-NEXT: add sp, sp, #16114; NONEON-NOSVE-NEXT: ret115 %load = load volatile <2 x i16>, ptr %a116 %cast = bitcast <2 x i16> %load to <2 x half>117 store volatile <2 x half> %cast, ptr %b118 ret void119}120 121define void @bitcast_v4i16(ptr %a, ptr %b) {122; CHECK-LABEL: bitcast_v4i16:123; CHECK: // %bb.0:124; CHECK-NEXT: ldr d0, [x0]125; CHECK-NEXT: str d0, [x1]126; CHECK-NEXT: ret127;128; NONEON-NOSVE-LABEL: bitcast_v4i16:129; NONEON-NOSVE: // %bb.0:130; NONEON-NOSVE-NEXT: ldr d0, [x0]131; NONEON-NOSVE-NEXT: str d0, [x1]132; NONEON-NOSVE-NEXT: ret133 %load = load volatile <4 x i16>, ptr %a134 %cast = bitcast <4 x i16> %load to <4 x half>135 store volatile <4 x half> %cast, ptr %b136 ret void137}138 139define void @bitcast_v8i16(ptr %a, ptr %b) {140; CHECK-LABEL: bitcast_v8i16:141; CHECK: // %bb.0:142; CHECK-NEXT: ldr q0, [x0]143; CHECK-NEXT: str q0, [x1]144; CHECK-NEXT: ret145;146; NONEON-NOSVE-LABEL: bitcast_v8i16:147; NONEON-NOSVE: // %bb.0:148; NONEON-NOSVE-NEXT: ldr q0, [x0]149; NONEON-NOSVE-NEXT: str q0, [x1]150; NONEON-NOSVE-NEXT: ret151 %load = load volatile <8 x i16>, ptr %a152 %cast = bitcast <8 x i16> %load to <8 x half>153 store volatile <8 x half> %cast, ptr %b154 ret void155}156 157define void @bitcast_v16i16(ptr %a, ptr %b) {158; CHECK-LABEL: bitcast_v16i16:159; CHECK: // %bb.0:160; CHECK-NEXT: ldr q0, [x0]161; CHECK-NEXT: ldr q1, [x0, #16]162; CHECK-NEXT: str q1, [x1, #16]163; CHECK-NEXT: str q0, [x1]164; CHECK-NEXT: ret165;166; NONEON-NOSVE-LABEL: bitcast_v16i16:167; NONEON-NOSVE: // %bb.0:168; NONEON-NOSVE-NEXT: ldr q0, [x0]169; NONEON-NOSVE-NEXT: ldr q1, [x0, #16]170; NONEON-NOSVE-NEXT: str q1, [x1, #16]171; NONEON-NOSVE-NEXT: str q0, [x1]172; NONEON-NOSVE-NEXT: ret173 %load = load volatile <16 x i16>, ptr %a174 %cast = bitcast <16 x i16> %load to <16 x half>175 store volatile <16 x half> %cast, ptr %b176 ret void177}178 179define void @bitcast_v2i32(ptr %a, ptr %b) {180; CHECK-LABEL: bitcast_v2i32:181; CHECK: // %bb.0:182; CHECK-NEXT: ldr d0, [x0]183; CHECK-NEXT: str d0, [x1]184; CHECK-NEXT: ret185;186; NONEON-NOSVE-LABEL: bitcast_v2i32:187; NONEON-NOSVE: // %bb.0:188; NONEON-NOSVE-NEXT: ldr d0, [x0]189; NONEON-NOSVE-NEXT: str d0, [x1]190; NONEON-NOSVE-NEXT: ret191 %load = load volatile <2 x i32>, ptr %a192 %cast = bitcast <2 x i32> %load to <2 x float>193 store volatile <2 x float> %cast, ptr %b194 ret void195}196 197define void @bitcast_v4i32(ptr %a, ptr %b) {198; CHECK-LABEL: bitcast_v4i32:199; CHECK: // %bb.0:200; CHECK-NEXT: ldr q0, [x0]201; CHECK-NEXT: str q0, [x1]202; CHECK-NEXT: ret203;204; NONEON-NOSVE-LABEL: bitcast_v4i32:205; NONEON-NOSVE: // %bb.0:206; NONEON-NOSVE-NEXT: ldr q0, [x0]207; NONEON-NOSVE-NEXT: str q0, [x1]208; NONEON-NOSVE-NEXT: ret209 %load = load volatile <4 x i32>, ptr %a210 %cast = bitcast <4 x i32> %load to <4 x float>211 store volatile <4 x float> %cast, ptr %b212 ret void213}214 215define void @bitcast_v8i32(ptr %a, ptr %b) {216; CHECK-LABEL: bitcast_v8i32:217; CHECK: // %bb.0:218; CHECK-NEXT: ldr q0, [x0]219; CHECK-NEXT: ldr q1, [x0, #16]220; CHECK-NEXT: str q1, [x1, #16]221; CHECK-NEXT: str q0, [x1]222; CHECK-NEXT: ret223;224; NONEON-NOSVE-LABEL: bitcast_v8i32:225; NONEON-NOSVE: // %bb.0:226; NONEON-NOSVE-NEXT: ldr q0, [x0]227; NONEON-NOSVE-NEXT: ldr q1, [x0, #16]228; NONEON-NOSVE-NEXT: str q1, [x1, #16]229; NONEON-NOSVE-NEXT: str q0, [x1]230; NONEON-NOSVE-NEXT: ret231 %load = load volatile <8 x i32>, ptr %a232 %cast = bitcast <8 x i32> %load to <8 x float>233 store volatile <8 x float> %cast, ptr %b234 ret void235}236 237define void @bitcast_v1i64(ptr %a, ptr %b) {238; CHECK-LABEL: bitcast_v1i64:239; CHECK: // %bb.0:240; CHECK-NEXT: ldr d0, [x0]241; CHECK-NEXT: str d0, [x1]242; CHECK-NEXT: ret243;244; NONEON-NOSVE-LABEL: bitcast_v1i64:245; NONEON-NOSVE: // %bb.0:246; NONEON-NOSVE-NEXT: ldr d0, [x0]247; NONEON-NOSVE-NEXT: str d0, [x1]248; NONEON-NOSVE-NEXT: ret249 %load = load volatile <1 x i64>, ptr %a250 %cast = bitcast <1 x i64> %load to <1 x double>251 store volatile <1 x double> %cast, ptr %b252 ret void253}254 255define void @bitcast_v2i64(ptr %a, ptr %b) {256; CHECK-LABEL: bitcast_v2i64:257; CHECK: // %bb.0:258; CHECK-NEXT: ldr q0, [x0]259; CHECK-NEXT: str q0, [x1]260; CHECK-NEXT: ret261;262; NONEON-NOSVE-LABEL: bitcast_v2i64:263; NONEON-NOSVE: // %bb.0:264; NONEON-NOSVE-NEXT: ldr q0, [x0]265; NONEON-NOSVE-NEXT: str q0, [x1]266; NONEON-NOSVE-NEXT: ret267 %load = load volatile <2 x i64>, ptr %a268 %cast = bitcast <2 x i64> %load to <2 x double>269 store volatile <2 x double> %cast, ptr %b270 ret void271}272 273define void @bitcast_v4i64(ptr %a, ptr %b) {274; CHECK-LABEL: bitcast_v4i64:275; CHECK: // %bb.0:276; CHECK-NEXT: ldr q0, [x0]277; CHECK-NEXT: ldr q1, [x0, #16]278; CHECK-NEXT: str q1, [x1, #16]279; CHECK-NEXT: str q0, [x1]280; CHECK-NEXT: ret281;282; NONEON-NOSVE-LABEL: bitcast_v4i64:283; NONEON-NOSVE: // %bb.0:284; NONEON-NOSVE-NEXT: ldr q0, [x0]285; NONEON-NOSVE-NEXT: ldr q1, [x0, #16]286; NONEON-NOSVE-NEXT: str q1, [x1, #16]287; NONEON-NOSVE-NEXT: str q0, [x1]288; NONEON-NOSVE-NEXT: ret289 %load = load volatile <4 x i64>, ptr %a290 %cast = bitcast <4 x i64> %load to <4 x double>291 store volatile <4 x double> %cast, ptr %b292 ret void293}294 295