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 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, vl4 12; CHECK-NEXT: ld1b { z0.h }, p0/z, [x0] 13; CHECK-NEXT: st1b { z0.h }, p0, [x1] 14; CHECK-NEXT: ret 15; 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: ret 27 %load = load volatile <4 x i8>, ptr %a 28 %cast = bitcast <4 x i8> %load to <4 x i8> 29 store volatile <4 x i8> %cast, ptr %b 30 ret void 31} 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: ret 39; 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: ret 45 %load = load volatile <8 x i8>, ptr %a 46 %cast = bitcast <8 x i8> %load to <8 x i8> 47 store volatile <8 x i8> %cast, ptr %b 48 ret void 49} 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: ret 57; 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: ret 63 %load = load volatile <16 x i8>, ptr %a 64 %cast = bitcast <16 x i8> %load to <16 x i8> 65 store volatile <16 x i8> %cast, ptr %b 66 ret void 67} 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: ret 77; 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: ret 85 %load = load volatile <32 x i8>, ptr %a 86 %cast = bitcast <32 x i8> %load to <32 x i8> 87 store volatile <32 x i8> %cast, ptr %b 88 ret void 89} 90 91define void @bitcast_v2i16(ptr %a, ptr %b) { 92; CHECK-LABEL: bitcast_v2i16: 93; CHECK: // %bb.0: 94; CHECK-NEXT: ptrue p0.s, vl2 95; 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.h 98; CHECK-NEXT: fmov w8, s0 99; CHECK-NEXT: str w8, [x1] 100; CHECK-NEXT: ret 101; 102; NONEON-NOSVE-LABEL: bitcast_v2i16: 103; NONEON-NOSVE: // %bb.0: 104; NONEON-NOSVE-NEXT: sub sp, sp, #32 105; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 32 106; NONEON-NOSVE-NEXT: ldrh w8, [x0, #2] 107; NONEON-NOSVE-NEXT: str w8, [sp, #4] 108; NONEON-NOSVE-NEXT: ldrh w8, [x0] 109; NONEON-NOSVE-NEXT: str w8, [sp] 110; NONEON-NOSVE-NEXT: ldr d0, [sp] 111; NONEON-NOSVE-NEXT: str d0, [sp, #8] 112; NONEON-NOSVE-NEXT: ldp w8, w9, [sp, #8] 113; NONEON-NOSVE-NEXT: strh w9, [sp, #18] 114; NONEON-NOSVE-NEXT: strh w8, [sp, #16] 115; NONEON-NOSVE-NEXT: ldr d0, [sp, #16] 116; NONEON-NOSVE-NEXT: str d0, [sp, #24] 117; NONEON-NOSVE-NEXT: ldr w8, [sp, #24] 118; NONEON-NOSVE-NEXT: str w8, [x1] 119; NONEON-NOSVE-NEXT: add sp, sp, #32 120; NONEON-NOSVE-NEXT: ret 121 %load = load volatile <2 x i16>, ptr %a 122 %cast = bitcast <2 x i16> %load to <2 x half> 123 store volatile <2 x half> %cast, ptr %b 124 ret void 125} 126 127define void @bitcast_v4i16(ptr %a, ptr %b) { 128; CHECK-LABEL: bitcast_v4i16: 129; CHECK: // %bb.0: 130; CHECK-NEXT: ldr d0, [x0] 131; CHECK-NEXT: str d0, [x1] 132; CHECK-NEXT: ret 133; 134; NONEON-NOSVE-LABEL: bitcast_v4i16: 135; NONEON-NOSVE: // %bb.0: 136; NONEON-NOSVE-NEXT: ldr d0, [x0] 137; NONEON-NOSVE-NEXT: str d0, [x1] 138; NONEON-NOSVE-NEXT: ret 139 %load = load volatile <4 x i16>, ptr %a 140 %cast = bitcast <4 x i16> %load to <4 x half> 141 store volatile <4 x half> %cast, ptr %b 142 ret void 143} 144 145define void @bitcast_v8i16(ptr %a, ptr %b) { 146; CHECK-LABEL: bitcast_v8i16: 147; CHECK: // %bb.0: 148; CHECK-NEXT: ldr q0, [x0] 149; CHECK-NEXT: str q0, [x1] 150; CHECK-NEXT: ret 151; 152; NONEON-NOSVE-LABEL: bitcast_v8i16: 153; NONEON-NOSVE: // %bb.0: 154; NONEON-NOSVE-NEXT: ldr q0, [x0] 155; NONEON-NOSVE-NEXT: str q0, [x1] 156; NONEON-NOSVE-NEXT: ret 157 %load = load volatile <8 x i16>, ptr %a 158 %cast = bitcast <8 x i16> %load to <8 x half> 159 store volatile <8 x half> %cast, ptr %b 160 ret void 161} 162 163define void @bitcast_v16i16(ptr %a, ptr %b) { 164; CHECK-LABEL: bitcast_v16i16: 165; CHECK: // %bb.0: 166; CHECK-NEXT: ldr q0, [x0] 167; CHECK-NEXT: ldr q1, [x0, #16] 168; CHECK-NEXT: str q1, [x1, #16] 169; CHECK-NEXT: str q0, [x1] 170; CHECK-NEXT: ret 171; 172; NONEON-NOSVE-LABEL: bitcast_v16i16: 173; NONEON-NOSVE: // %bb.0: 174; NONEON-NOSVE-NEXT: ldr q0, [x0] 175; NONEON-NOSVE-NEXT: ldr q1, [x0, #16] 176; NONEON-NOSVE-NEXT: str q1, [x1, #16] 177; NONEON-NOSVE-NEXT: str q0, [x1] 178; NONEON-NOSVE-NEXT: ret 179 %load = load volatile <16 x i16>, ptr %a 180 %cast = bitcast <16 x i16> %load to <16 x half> 181 store volatile <16 x half> %cast, ptr %b 182 ret void 183} 184 185define void @bitcast_v2i32(ptr %a, ptr %b) { 186; CHECK-LABEL: bitcast_v2i32: 187; CHECK: // %bb.0: 188; CHECK-NEXT: ldr d0, [x0] 189; CHECK-NEXT: str d0, [x1] 190; CHECK-NEXT: ret 191; 192; NONEON-NOSVE-LABEL: bitcast_v2i32: 193; NONEON-NOSVE: // %bb.0: 194; NONEON-NOSVE-NEXT: ldr d0, [x0] 195; NONEON-NOSVE-NEXT: str d0, [x1] 196; NONEON-NOSVE-NEXT: ret 197 %load = load volatile <2 x i32>, ptr %a 198 %cast = bitcast <2 x i32> %load to <2 x float> 199 store volatile <2 x float> %cast, ptr %b 200 ret void 201} 202 203define void @bitcast_v4i32(ptr %a, ptr %b) { 204; CHECK-LABEL: bitcast_v4i32: 205; CHECK: // %bb.0: 206; CHECK-NEXT: ldr q0, [x0] 207; CHECK-NEXT: str q0, [x1] 208; CHECK-NEXT: ret 209; 210; NONEON-NOSVE-LABEL: bitcast_v4i32: 211; NONEON-NOSVE: // %bb.0: 212; NONEON-NOSVE-NEXT: ldr q0, [x0] 213; NONEON-NOSVE-NEXT: str q0, [x1] 214; NONEON-NOSVE-NEXT: ret 215 %load = load volatile <4 x i32>, ptr %a 216 %cast = bitcast <4 x i32> %load to <4 x float> 217 store volatile <4 x float> %cast, ptr %b 218 ret void 219} 220 221define void @bitcast_v8i32(ptr %a, ptr %b) { 222; CHECK-LABEL: bitcast_v8i32: 223; CHECK: // %bb.0: 224; CHECK-NEXT: ldr q0, [x0] 225; CHECK-NEXT: ldr q1, [x0, #16] 226; CHECK-NEXT: str q1, [x1, #16] 227; CHECK-NEXT: str q0, [x1] 228; CHECK-NEXT: ret 229; 230; NONEON-NOSVE-LABEL: bitcast_v8i32: 231; NONEON-NOSVE: // %bb.0: 232; NONEON-NOSVE-NEXT: ldr q0, [x0] 233; NONEON-NOSVE-NEXT: ldr q1, [x0, #16] 234; NONEON-NOSVE-NEXT: str q1, [x1, #16] 235; NONEON-NOSVE-NEXT: str q0, [x1] 236; NONEON-NOSVE-NEXT: ret 237 %load = load volatile <8 x i32>, ptr %a 238 %cast = bitcast <8 x i32> %load to <8 x float> 239 store volatile <8 x float> %cast, ptr %b 240 ret void 241} 242 243define void @bitcast_v1i64(ptr %a, ptr %b) { 244; CHECK-LABEL: bitcast_v1i64: 245; CHECK: // %bb.0: 246; CHECK-NEXT: ldr d0, [x0] 247; CHECK-NEXT: str d0, [x1] 248; CHECK-NEXT: ret 249; 250; NONEON-NOSVE-LABEL: bitcast_v1i64: 251; NONEON-NOSVE: // %bb.0: 252; NONEON-NOSVE-NEXT: ldr d0, [x0] 253; NONEON-NOSVE-NEXT: str d0, [x1] 254; NONEON-NOSVE-NEXT: ret 255 %load = load volatile <1 x i64>, ptr %a 256 %cast = bitcast <1 x i64> %load to <1 x double> 257 store volatile <1 x double> %cast, ptr %b 258 ret void 259} 260 261define void @bitcast_v2i64(ptr %a, ptr %b) { 262; CHECK-LABEL: bitcast_v2i64: 263; CHECK: // %bb.0: 264; CHECK-NEXT: ldr q0, [x0] 265; CHECK-NEXT: str q0, [x1] 266; CHECK-NEXT: ret 267; 268; NONEON-NOSVE-LABEL: bitcast_v2i64: 269; NONEON-NOSVE: // %bb.0: 270; NONEON-NOSVE-NEXT: ldr q0, [x0] 271; NONEON-NOSVE-NEXT: str q0, [x1] 272; NONEON-NOSVE-NEXT: ret 273 %load = load volatile <2 x i64>, ptr %a 274 %cast = bitcast <2 x i64> %load to <2 x double> 275 store volatile <2 x double> %cast, ptr %b 276 ret void 277} 278 279define void @bitcast_v4i64(ptr %a, ptr %b) { 280; CHECK-LABEL: bitcast_v4i64: 281; CHECK: // %bb.0: 282; CHECK-NEXT: ldr q0, [x0] 283; CHECK-NEXT: ldr q1, [x0, #16] 284; CHECK-NEXT: str q1, [x1, #16] 285; CHECK-NEXT: str q0, [x1] 286; CHECK-NEXT: ret 287; 288; NONEON-NOSVE-LABEL: bitcast_v4i64: 289; NONEON-NOSVE: // %bb.0: 290; NONEON-NOSVE-NEXT: ldr q0, [x0] 291; NONEON-NOSVE-NEXT: ldr q1, [x0, #16] 292; NONEON-NOSVE-NEXT: str q1, [x1, #16] 293; NONEON-NOSVE-NEXT: str q0, [x1] 294; NONEON-NOSVE-NEXT: ret 295 %load = load volatile <4 x i64>, ptr %a 296 %cast = bitcast <4 x i64> %load to <4 x double> 297 store volatile <4 x double> %cast, ptr %b 298 ret void 299} 300 301