2644 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc -mtriple=aarch64-linux-gnu < %s | FileCheck %s3; RUN: llc -mtriple=aarch64_be < %s | FileCheck %s --check-prefix=CHECK_BE4 5;6; bitcast to nxv16i87;8 9define <vscale x 16 x i8> @bitcast_nxv8i16_to_nxv16i8(<vscale x 8 x i16> %v) #0 {10; CHECK-LABEL: bitcast_nxv8i16_to_nxv16i8:11; CHECK: // %bb.0:12; CHECK-NEXT: ret13;14; CHECK_BE-LABEL: bitcast_nxv8i16_to_nxv16i8:15; CHECK_BE: // %bb.0:16; CHECK_BE-NEXT: ptrue p0.h17; CHECK_BE-NEXT: revb z0.h, p0/m, z0.h18; CHECK_BE-NEXT: ret19 %bc = bitcast <vscale x 8 x i16> %v to <vscale x 16 x i8>20 ret <vscale x 16 x i8> %bc21}22 23define <vscale x 16 x i8> @bitcast_nxv4i32_to_nxv16i8(<vscale x 4 x i32> %v) #0 {24; CHECK-LABEL: bitcast_nxv4i32_to_nxv16i8:25; CHECK: // %bb.0:26; CHECK-NEXT: ret27;28; CHECK_BE-LABEL: bitcast_nxv4i32_to_nxv16i8:29; CHECK_BE: // %bb.0:30; CHECK_BE-NEXT: ptrue p0.s31; CHECK_BE-NEXT: revb z0.s, p0/m, z0.s32; CHECK_BE-NEXT: ret33 %bc = bitcast <vscale x 4 x i32> %v to <vscale x 16 x i8>34 ret <vscale x 16 x i8> %bc35}36 37define <vscale x 16 x i8> @bitcast_nxv2i64_to_nxv16i8(<vscale x 2 x i64> %v) #0 {38; CHECK-LABEL: bitcast_nxv2i64_to_nxv16i8:39; CHECK: // %bb.0:40; CHECK-NEXT: ret41;42; CHECK_BE-LABEL: bitcast_nxv2i64_to_nxv16i8:43; CHECK_BE: // %bb.0:44; CHECK_BE-NEXT: ptrue p0.d45; CHECK_BE-NEXT: revb z0.d, p0/m, z0.d46; CHECK_BE-NEXT: ret47 %bc = bitcast <vscale x 2 x i64> %v to <vscale x 16 x i8>48 ret <vscale x 16 x i8> %bc49}50 51define <vscale x 16 x i8> @bitcast_nxv8f16_to_nxv16i8(<vscale x 8 x half> %v) #0 {52; CHECK-LABEL: bitcast_nxv8f16_to_nxv16i8:53; CHECK: // %bb.0:54; CHECK-NEXT: ret55;56; CHECK_BE-LABEL: bitcast_nxv8f16_to_nxv16i8:57; CHECK_BE: // %bb.0:58; CHECK_BE-NEXT: ptrue p0.h59; CHECK_BE-NEXT: revb z0.h, p0/m, z0.h60; CHECK_BE-NEXT: ret61 %bc = bitcast <vscale x 8 x half> %v to <vscale x 16 x i8>62 ret <vscale x 16 x i8> %bc63}64 65define <vscale x 16 x i8> @bitcast_nxv4f32_to_nxv16i8(<vscale x 4 x float> %v) #0 {66; CHECK-LABEL: bitcast_nxv4f32_to_nxv16i8:67; CHECK: // %bb.0:68; CHECK-NEXT: ret69;70; CHECK_BE-LABEL: bitcast_nxv4f32_to_nxv16i8:71; CHECK_BE: // %bb.0:72; CHECK_BE-NEXT: ptrue p0.s73; CHECK_BE-NEXT: revb z0.s, p0/m, z0.s74; CHECK_BE-NEXT: ret75 %bc = bitcast <vscale x 4 x float> %v to <vscale x 16 x i8>76 ret <vscale x 16 x i8> %bc77}78 79define <vscale x 16 x i8> @bitcast_nxv2f64_to_nxv16i8(<vscale x 2 x double> %v) #0 {80; CHECK-LABEL: bitcast_nxv2f64_to_nxv16i8:81; CHECK: // %bb.0:82; CHECK-NEXT: ret83;84; CHECK_BE-LABEL: bitcast_nxv2f64_to_nxv16i8:85; CHECK_BE: // %bb.0:86; CHECK_BE-NEXT: ptrue p0.d87; CHECK_BE-NEXT: revb z0.d, p0/m, z0.d88; CHECK_BE-NEXT: ret89 %bc = bitcast <vscale x 2 x double> %v to <vscale x 16 x i8>90 ret <vscale x 16 x i8> %bc91}92 93define <vscale x 16 x i8> @bitcast_nxv8bf16_to_nxv16i8(<vscale x 8 x bfloat> %v) #0 {94; CHECK-LABEL: bitcast_nxv8bf16_to_nxv16i8:95; CHECK: // %bb.0:96; CHECK-NEXT: ret97;98; CHECK_BE-LABEL: bitcast_nxv8bf16_to_nxv16i8:99; CHECK_BE: // %bb.0:100; CHECK_BE-NEXT: ptrue p0.h101; CHECK_BE-NEXT: revb z0.h, p0/m, z0.h102; CHECK_BE-NEXT: ret103 %bc = bitcast <vscale x 8 x bfloat> %v to <vscale x 16 x i8>104 ret <vscale x 16 x i8> %bc105}106 107;108; bitcast to nxv8i16109;110 111define <vscale x 8 x i16> @bitcast_nxv16i8_to_nxv8i16(<vscale x 16 x i8> %v) #0 {112; CHECK-LABEL: bitcast_nxv16i8_to_nxv8i16:113; CHECK: // %bb.0:114; CHECK-NEXT: ret115;116; CHECK_BE-LABEL: bitcast_nxv16i8_to_nxv8i16:117; CHECK_BE: // %bb.0:118; CHECK_BE-NEXT: ptrue p0.h119; CHECK_BE-NEXT: revb z0.h, p0/m, z0.h120; CHECK_BE-NEXT: ret121 %bc = bitcast <vscale x 16 x i8> %v to <vscale x 8 x i16>122 ret <vscale x 8 x i16> %bc123}124 125define <vscale x 8 x i16> @bitcast_nxv4i32_to_nxv8i16(<vscale x 4 x i32> %v) #0 {126; CHECK-LABEL: bitcast_nxv4i32_to_nxv8i16:127; CHECK: // %bb.0:128; CHECK-NEXT: ret129;130; CHECK_BE-LABEL: bitcast_nxv4i32_to_nxv8i16:131; CHECK_BE: // %bb.0:132; CHECK_BE-NEXT: ptrue p0.s133; CHECK_BE-NEXT: revb z0.s, p0/m, z0.s134; CHECK_BE-NEXT: ptrue p0.h135; CHECK_BE-NEXT: revb z0.h, p0/m, z0.h136; CHECK_BE-NEXT: ret137 %bc = bitcast <vscale x 4 x i32> %v to <vscale x 8 x i16>138 ret <vscale x 8 x i16> %bc139}140 141define <vscale x 8 x i16> @bitcast_nxv2i64_to_nxv8i16(<vscale x 2 x i64> %v) #0 {142; CHECK-LABEL: bitcast_nxv2i64_to_nxv8i16:143; CHECK: // %bb.0:144; CHECK-NEXT: ret145;146; CHECK_BE-LABEL: bitcast_nxv2i64_to_nxv8i16:147; CHECK_BE: // %bb.0:148; CHECK_BE-NEXT: ptrue p0.d149; CHECK_BE-NEXT: revb z0.d, p0/m, z0.d150; CHECK_BE-NEXT: ptrue p0.h151; CHECK_BE-NEXT: revb z0.h, p0/m, z0.h152; CHECK_BE-NEXT: ret153 %bc = bitcast <vscale x 2 x i64> %v to <vscale x 8 x i16>154 ret <vscale x 8 x i16> %bc155}156 157define <vscale x 8 x i16> @bitcast_nxv8f16_to_nxv8i16(<vscale x 8 x half> %v) #0 {158; CHECK-LABEL: bitcast_nxv8f16_to_nxv8i16:159; CHECK: // %bb.0:160; CHECK-NEXT: ret161;162; CHECK_BE-LABEL: bitcast_nxv8f16_to_nxv8i16:163; CHECK_BE: // %bb.0:164; CHECK_BE-NEXT: ret165 %bc = bitcast <vscale x 8 x half> %v to <vscale x 8 x i16>166 ret <vscale x 8 x i16> %bc167}168 169define <vscale x 8 x i16> @bitcast_nxv4f32_to_nxv8i16(<vscale x 4 x float> %v) #0 {170; CHECK-LABEL: bitcast_nxv4f32_to_nxv8i16:171; CHECK: // %bb.0:172; CHECK-NEXT: ret173;174; CHECK_BE-LABEL: bitcast_nxv4f32_to_nxv8i16:175; CHECK_BE: // %bb.0:176; CHECK_BE-NEXT: ptrue p0.s177; CHECK_BE-NEXT: revb z0.s, p0/m, z0.s178; CHECK_BE-NEXT: ptrue p0.h179; CHECK_BE-NEXT: revb z0.h, p0/m, z0.h180; CHECK_BE-NEXT: ret181 %bc = bitcast <vscale x 4 x float> %v to <vscale x 8 x i16>182 ret <vscale x 8 x i16> %bc183}184 185define <vscale x 8 x i16> @bitcast_nxv2f64_to_nxv8i16(<vscale x 2 x double> %v) #0 {186; CHECK-LABEL: bitcast_nxv2f64_to_nxv8i16:187; CHECK: // %bb.0:188; CHECK-NEXT: ret189;190; CHECK_BE-LABEL: bitcast_nxv2f64_to_nxv8i16:191; CHECK_BE: // %bb.0:192; CHECK_BE-NEXT: ptrue p0.d193; CHECK_BE-NEXT: revb z0.d, p0/m, z0.d194; CHECK_BE-NEXT: ptrue p0.h195; CHECK_BE-NEXT: revb z0.h, p0/m, z0.h196; CHECK_BE-NEXT: ret197 %bc = bitcast <vscale x 2 x double> %v to <vscale x 8 x i16>198 ret <vscale x 8 x i16> %bc199}200 201define <vscale x 8 x i16> @bitcast_nxv8bf16_to_nxv8i16(<vscale x 8 x bfloat> %v) #0 {202; CHECK-LABEL: bitcast_nxv8bf16_to_nxv8i16:203; CHECK: // %bb.0:204; CHECK-NEXT: ret205;206; CHECK_BE-LABEL: bitcast_nxv8bf16_to_nxv8i16:207; CHECK_BE: // %bb.0:208; CHECK_BE-NEXT: ret209 %bc = bitcast <vscale x 8 x bfloat> %v to <vscale x 8 x i16>210 ret <vscale x 8 x i16> %bc211}212 213;214; bitcast to nxv4i32215;216 217define <vscale x 4 x i32> @bitcast_nxv16i8_to_nxv4i32(<vscale x 16 x i8> %v) #0 {218; CHECK-LABEL: bitcast_nxv16i8_to_nxv4i32:219; CHECK: // %bb.0:220; CHECK-NEXT: ret221;222; CHECK_BE-LABEL: bitcast_nxv16i8_to_nxv4i32:223; CHECK_BE: // %bb.0:224; CHECK_BE-NEXT: ptrue p0.s225; CHECK_BE-NEXT: revb z0.s, p0/m, z0.s226; CHECK_BE-NEXT: ret227 %bc = bitcast <vscale x 16 x i8> %v to <vscale x 4 x i32>228 ret <vscale x 4 x i32> %bc229}230 231define <vscale x 4 x i32> @bitcast_nxv8i16_to_nxv4i32(<vscale x 8 x i16> %v) #0 {232; CHECK-LABEL: bitcast_nxv8i16_to_nxv4i32:233; CHECK: // %bb.0:234; CHECK-NEXT: ret235;236; CHECK_BE-LABEL: bitcast_nxv8i16_to_nxv4i32:237; CHECK_BE: // %bb.0:238; CHECK_BE-NEXT: ptrue p0.h239; CHECK_BE-NEXT: revb z0.h, p0/m, z0.h240; CHECK_BE-NEXT: ptrue p0.s241; CHECK_BE-NEXT: revb z0.s, p0/m, z0.s242; CHECK_BE-NEXT: ret243 %bc = bitcast <vscale x 8 x i16> %v to <vscale x 4 x i32>244 ret <vscale x 4 x i32> %bc245}246 247define <vscale x 4 x i32> @bitcast_nxv2i64_to_nxv4i32(<vscale x 2 x i64> %v) #0 {248; CHECK-LABEL: bitcast_nxv2i64_to_nxv4i32:249; CHECK: // %bb.0:250; CHECK-NEXT: ret251;252; CHECK_BE-LABEL: bitcast_nxv2i64_to_nxv4i32:253; CHECK_BE: // %bb.0:254; CHECK_BE-NEXT: ptrue p0.d255; CHECK_BE-NEXT: revb z0.d, p0/m, z0.d256; CHECK_BE-NEXT: ptrue p0.s257; CHECK_BE-NEXT: revb z0.s, p0/m, z0.s258; CHECK_BE-NEXT: ret259 %bc = bitcast <vscale x 2 x i64> %v to <vscale x 4 x i32>260 ret <vscale x 4 x i32> %bc261}262 263define <vscale x 4 x i32> @bitcast_nxv8f16_to_nxv4i32(<vscale x 8 x half> %v) #0 {264; CHECK-LABEL: bitcast_nxv8f16_to_nxv4i32:265; CHECK: // %bb.0:266; CHECK-NEXT: ret267;268; CHECK_BE-LABEL: bitcast_nxv8f16_to_nxv4i32:269; CHECK_BE: // %bb.0:270; CHECK_BE-NEXT: ptrue p0.h271; CHECK_BE-NEXT: revb z0.h, p0/m, z0.h272; CHECK_BE-NEXT: ptrue p0.s273; CHECK_BE-NEXT: revb z0.s, p0/m, z0.s274; CHECK_BE-NEXT: ret275 %bc = bitcast <vscale x 8 x half> %v to <vscale x 4 x i32>276 ret <vscale x 4 x i32> %bc277}278 279define <vscale x 4 x i32> @bitcast_nxv4f32_to_nxv4i32(<vscale x 4 x float> %v) #0 {280; CHECK-LABEL: bitcast_nxv4f32_to_nxv4i32:281; CHECK: // %bb.0:282; CHECK-NEXT: ret283;284; CHECK_BE-LABEL: bitcast_nxv4f32_to_nxv4i32:285; CHECK_BE: // %bb.0:286; CHECK_BE-NEXT: ret287 %bc = bitcast <vscale x 4 x float> %v to <vscale x 4 x i32>288 ret <vscale x 4 x i32> %bc289}290 291define <vscale x 4 x i32> @bitcast_nxv2f64_to_nxv4i32(<vscale x 2 x double> %v) #0 {292; CHECK-LABEL: bitcast_nxv2f64_to_nxv4i32:293; CHECK: // %bb.0:294; CHECK-NEXT: ret295;296; CHECK_BE-LABEL: bitcast_nxv2f64_to_nxv4i32:297; CHECK_BE: // %bb.0:298; CHECK_BE-NEXT: ptrue p0.d299; CHECK_BE-NEXT: revb z0.d, p0/m, z0.d300; CHECK_BE-NEXT: ptrue p0.s301; CHECK_BE-NEXT: revb z0.s, p0/m, z0.s302; CHECK_BE-NEXT: ret303 %bc = bitcast <vscale x 2 x double> %v to <vscale x 4 x i32>304 ret <vscale x 4 x i32> %bc305}306 307define <vscale x 4 x i32> @bitcast_nxv8bf16_to_nxv4i32(<vscale x 8 x bfloat> %v) #0 {308; CHECK-LABEL: bitcast_nxv8bf16_to_nxv4i32:309; CHECK: // %bb.0:310; CHECK-NEXT: ret311;312; CHECK_BE-LABEL: bitcast_nxv8bf16_to_nxv4i32:313; CHECK_BE: // %bb.0:314; CHECK_BE-NEXT: ptrue p0.h315; CHECK_BE-NEXT: revb z0.h, p0/m, z0.h316; CHECK_BE-NEXT: ptrue p0.s317; CHECK_BE-NEXT: revb z0.s, p0/m, z0.s318; CHECK_BE-NEXT: ret319 %bc = bitcast <vscale x 8 x bfloat> %v to <vscale x 4 x i32>320 ret <vscale x 4 x i32> %bc321}322 323;324; bitcast to nxv2i64325;326 327define <vscale x 2 x i64> @bitcast_nxv16i8_to_nxv2i64(<vscale x 16 x i8> %v) #0 {328; CHECK-LABEL: bitcast_nxv16i8_to_nxv2i64:329; CHECK: // %bb.0:330; CHECK-NEXT: ret331;332; CHECK_BE-LABEL: bitcast_nxv16i8_to_nxv2i64:333; CHECK_BE: // %bb.0:334; CHECK_BE-NEXT: ptrue p0.d335; CHECK_BE-NEXT: revb z0.d, p0/m, z0.d336; CHECK_BE-NEXT: ret337 %bc = bitcast <vscale x 16 x i8> %v to <vscale x 2 x i64>338 ret <vscale x 2 x i64> %bc339}340 341define <vscale x 2 x i64> @bitcast_nxv8i16_to_nxv2i64(<vscale x 8 x i16> %v) #0 {342; CHECK-LABEL: bitcast_nxv8i16_to_nxv2i64:343; CHECK: // %bb.0:344; CHECK-NEXT: ret345;346; CHECK_BE-LABEL: bitcast_nxv8i16_to_nxv2i64:347; CHECK_BE: // %bb.0:348; CHECK_BE-NEXT: ptrue p0.h349; CHECK_BE-NEXT: revb z0.h, p0/m, z0.h350; CHECK_BE-NEXT: ptrue p0.d351; CHECK_BE-NEXT: revb z0.d, p0/m, z0.d352; CHECK_BE-NEXT: ret353 %bc = bitcast <vscale x 8 x i16> %v to <vscale x 2 x i64>354 ret <vscale x 2 x i64> %bc355}356 357define <vscale x 2 x i64> @bitcast_nxv4i32_to_nxv2i64(<vscale x 4 x i32> %v) #0 {358; CHECK-LABEL: bitcast_nxv4i32_to_nxv2i64:359; CHECK: // %bb.0:360; CHECK-NEXT: ret361;362; CHECK_BE-LABEL: bitcast_nxv4i32_to_nxv2i64:363; CHECK_BE: // %bb.0:364; CHECK_BE-NEXT: ptrue p0.s365; CHECK_BE-NEXT: revb z0.s, p0/m, z0.s366; CHECK_BE-NEXT: ptrue p0.d367; CHECK_BE-NEXT: revb z0.d, p0/m, z0.d368; CHECK_BE-NEXT: ret369 %bc = bitcast <vscale x 4 x i32> %v to <vscale x 2 x i64>370 ret <vscale x 2 x i64> %bc371}372 373define <vscale x 2 x i64> @bitcast_nxv8f16_to_nxv2i64(<vscale x 8 x half> %v) #0 {374; CHECK-LABEL: bitcast_nxv8f16_to_nxv2i64:375; CHECK: // %bb.0:376; CHECK-NEXT: ret377;378; CHECK_BE-LABEL: bitcast_nxv8f16_to_nxv2i64:379; CHECK_BE: // %bb.0:380; CHECK_BE-NEXT: ptrue p0.h381; CHECK_BE-NEXT: revb z0.h, p0/m, z0.h382; CHECK_BE-NEXT: ptrue p0.d383; CHECK_BE-NEXT: revb z0.d, p0/m, z0.d384; CHECK_BE-NEXT: ret385 %bc = bitcast <vscale x 8 x half> %v to <vscale x 2 x i64>386 ret <vscale x 2 x i64> %bc387}388 389define <vscale x 2 x i64> @bitcast_nxv4f32_to_nxv2i64(<vscale x 4 x float> %v) #0 {390; CHECK-LABEL: bitcast_nxv4f32_to_nxv2i64:391; CHECK: // %bb.0:392; CHECK-NEXT: ret393;394; CHECK_BE-LABEL: bitcast_nxv4f32_to_nxv2i64:395; CHECK_BE: // %bb.0:396; CHECK_BE-NEXT: ptrue p0.s397; CHECK_BE-NEXT: revb z0.s, p0/m, z0.s398; CHECK_BE-NEXT: ptrue p0.d399; CHECK_BE-NEXT: revb z0.d, p0/m, z0.d400; CHECK_BE-NEXT: ret401 %bc = bitcast <vscale x 4 x float> %v to <vscale x 2 x i64>402 ret <vscale x 2 x i64> %bc403}404 405define <vscale x 2 x i64> @bitcast_nxv2f64_to_nxv2i64(<vscale x 2 x double> %v) #0 {406; CHECK-LABEL: bitcast_nxv2f64_to_nxv2i64:407; CHECK: // %bb.0:408; CHECK-NEXT: ret409;410; CHECK_BE-LABEL: bitcast_nxv2f64_to_nxv2i64:411; CHECK_BE: // %bb.0:412; CHECK_BE-NEXT: ret413 %bc = bitcast <vscale x 2 x double> %v to <vscale x 2 x i64>414 ret <vscale x 2 x i64> %bc415}416 417define <vscale x 2 x i64> @bitcast_nxv8bf16_to_nxv2i64(<vscale x 8 x bfloat> %v) #0 {418; CHECK-LABEL: bitcast_nxv8bf16_to_nxv2i64:419; CHECK: // %bb.0:420; CHECK-NEXT: ret421;422; CHECK_BE-LABEL: bitcast_nxv8bf16_to_nxv2i64:423; CHECK_BE: // %bb.0:424; CHECK_BE-NEXT: ptrue p0.h425; CHECK_BE-NEXT: revb z0.h, p0/m, z0.h426; CHECK_BE-NEXT: ptrue p0.d427; CHECK_BE-NEXT: revb z0.d, p0/m, z0.d428; CHECK_BE-NEXT: ret429 %bc = bitcast <vscale x 8 x bfloat> %v to <vscale x 2 x i64>430 ret <vscale x 2 x i64> %bc431}432 433;434; bitcast to nxv8f16435;436 437define <vscale x 8 x half> @bitcast_nxv16i8_to_nxv8f16(<vscale x 16 x i8> %v) #0 {438; CHECK-LABEL: bitcast_nxv16i8_to_nxv8f16:439; CHECK: // %bb.0:440; CHECK-NEXT: ret441;442; CHECK_BE-LABEL: bitcast_nxv16i8_to_nxv8f16:443; CHECK_BE: // %bb.0:444; CHECK_BE-NEXT: ptrue p0.h445; CHECK_BE-NEXT: revb z0.h, p0/m, z0.h446; CHECK_BE-NEXT: ret447 %bc = bitcast <vscale x 16 x i8> %v to <vscale x 8 x half>448 ret <vscale x 8 x half> %bc449}450 451define <vscale x 8 x half> @bitcast_nxv8i16_to_nxv8f16(<vscale x 8 x i16> %v) #0 {452; CHECK-LABEL: bitcast_nxv8i16_to_nxv8f16:453; CHECK: // %bb.0:454; CHECK-NEXT: ret455;456; CHECK_BE-LABEL: bitcast_nxv8i16_to_nxv8f16:457; CHECK_BE: // %bb.0:458; CHECK_BE-NEXT: ret459 %bc = bitcast <vscale x 8 x i16> %v to <vscale x 8 x half>460 ret <vscale x 8 x half> %bc461}462 463define <vscale x 8 x half> @bitcast_nxv4i32_to_nxv8f16(<vscale x 4 x i32> %v) #0 {464; CHECK-LABEL: bitcast_nxv4i32_to_nxv8f16:465; CHECK: // %bb.0:466; CHECK-NEXT: ret467;468; CHECK_BE-LABEL: bitcast_nxv4i32_to_nxv8f16:469; CHECK_BE: // %bb.0:470; CHECK_BE-NEXT: ptrue p0.s471; CHECK_BE-NEXT: revb z0.s, p0/m, z0.s472; CHECK_BE-NEXT: ptrue p0.h473; CHECK_BE-NEXT: revb z0.h, p0/m, z0.h474; CHECK_BE-NEXT: ret475 %bc = bitcast <vscale x 4 x i32> %v to <vscale x 8 x half>476 ret <vscale x 8 x half> %bc477}478 479define <vscale x 8 x half> @bitcast_nxv2i64_to_nxv8f16(<vscale x 2 x i64> %v) #0 {480; CHECK-LABEL: bitcast_nxv2i64_to_nxv8f16:481; CHECK: // %bb.0:482; CHECK-NEXT: ret483;484; CHECK_BE-LABEL: bitcast_nxv2i64_to_nxv8f16:485; CHECK_BE: // %bb.0:486; CHECK_BE-NEXT: ptrue p0.d487; CHECK_BE-NEXT: revb z0.d, p0/m, z0.d488; CHECK_BE-NEXT: ptrue p0.h489; CHECK_BE-NEXT: revb z0.h, p0/m, z0.h490; CHECK_BE-NEXT: ret491 %bc = bitcast <vscale x 2 x i64> %v to <vscale x 8 x half>492 ret <vscale x 8 x half> %bc493}494 495define <vscale x 8 x half> @bitcast_nxv4f32_to_nxv8f16(<vscale x 4 x float> %v) #0 {496; CHECK-LABEL: bitcast_nxv4f32_to_nxv8f16:497; CHECK: // %bb.0:498; CHECK-NEXT: ret499;500; CHECK_BE-LABEL: bitcast_nxv4f32_to_nxv8f16:501; CHECK_BE: // %bb.0:502; CHECK_BE-NEXT: ptrue p0.s503; CHECK_BE-NEXT: revb z0.s, p0/m, z0.s504; CHECK_BE-NEXT: ptrue p0.h505; CHECK_BE-NEXT: revb z0.h, p0/m, z0.h506; CHECK_BE-NEXT: ret507 %bc = bitcast <vscale x 4 x float> %v to <vscale x 8 x half>508 ret <vscale x 8 x half> %bc509}510 511define <vscale x 8 x half> @bitcast_nxv2f64_to_nxv8f16(<vscale x 2 x double> %v) #0 {512; CHECK-LABEL: bitcast_nxv2f64_to_nxv8f16:513; CHECK: // %bb.0:514; CHECK-NEXT: ret515;516; CHECK_BE-LABEL: bitcast_nxv2f64_to_nxv8f16:517; CHECK_BE: // %bb.0:518; CHECK_BE-NEXT: ptrue p0.d519; CHECK_BE-NEXT: revb z0.d, p0/m, z0.d520; CHECK_BE-NEXT: ptrue p0.h521; CHECK_BE-NEXT: revb z0.h, p0/m, z0.h522; CHECK_BE-NEXT: ret523 %bc = bitcast <vscale x 2 x double> %v to <vscale x 8 x half>524 ret <vscale x 8 x half> %bc525}526 527define <vscale x 8 x half> @bitcast_nxv8bf16_to_nxv8f16(<vscale x 8 x bfloat> %v) #0 {528; CHECK-LABEL: bitcast_nxv8bf16_to_nxv8f16:529; CHECK: // %bb.0:530; CHECK-NEXT: ret531;532; CHECK_BE-LABEL: bitcast_nxv8bf16_to_nxv8f16:533; CHECK_BE: // %bb.0:534; CHECK_BE-NEXT: ret535 %bc = bitcast <vscale x 8 x bfloat> %v to <vscale x 8 x half>536 ret <vscale x 8 x half> %bc537}538 539;540; bitcast to nxv4f32541;542 543define <vscale x 4 x float> @bitcast_nxv16i8_to_nxv4f32(<vscale x 16 x i8> %v) #0 {544; CHECK-LABEL: bitcast_nxv16i8_to_nxv4f32:545; CHECK: // %bb.0:546; CHECK-NEXT: ret547;548; CHECK_BE-LABEL: bitcast_nxv16i8_to_nxv4f32:549; CHECK_BE: // %bb.0:550; CHECK_BE-NEXT: ptrue p0.s551; CHECK_BE-NEXT: revb z0.s, p0/m, z0.s552; CHECK_BE-NEXT: ret553 %bc = bitcast <vscale x 16 x i8> %v to <vscale x 4 x float>554 ret <vscale x 4 x float> %bc555}556 557define <vscale x 4 x float> @bitcast_nxv8i16_to_nxv4f32(<vscale x 8 x i16> %v) #0 {558; CHECK-LABEL: bitcast_nxv8i16_to_nxv4f32:559; CHECK: // %bb.0:560; CHECK-NEXT: ret561;562; CHECK_BE-LABEL: bitcast_nxv8i16_to_nxv4f32:563; CHECK_BE: // %bb.0:564; CHECK_BE-NEXT: ptrue p0.h565; CHECK_BE-NEXT: revb z0.h, p0/m, z0.h566; CHECK_BE-NEXT: ptrue p0.s567; CHECK_BE-NEXT: revb z0.s, p0/m, z0.s568; CHECK_BE-NEXT: ret569 %bc = bitcast <vscale x 8 x i16> %v to <vscale x 4 x float>570 ret <vscale x 4 x float> %bc571}572 573define <vscale x 4 x float> @bitcast_nxv4i32_to_nxv4f32(<vscale x 4 x i32> %v) #0 {574; CHECK-LABEL: bitcast_nxv4i32_to_nxv4f32:575; CHECK: // %bb.0:576; CHECK-NEXT: ret577;578; CHECK_BE-LABEL: bitcast_nxv4i32_to_nxv4f32:579; CHECK_BE: // %bb.0:580; CHECK_BE-NEXT: ret581 %bc = bitcast <vscale x 4 x i32> %v to <vscale x 4 x float>582 ret <vscale x 4 x float> %bc583}584 585define <vscale x 4 x float> @bitcast_nxv2i64_to_nxv4f32(<vscale x 2 x i64> %v) #0 {586; CHECK-LABEL: bitcast_nxv2i64_to_nxv4f32:587; CHECK: // %bb.0:588; CHECK-NEXT: ret589;590; CHECK_BE-LABEL: bitcast_nxv2i64_to_nxv4f32:591; CHECK_BE: // %bb.0:592; CHECK_BE-NEXT: ptrue p0.d593; CHECK_BE-NEXT: revb z0.d, p0/m, z0.d594; CHECK_BE-NEXT: ptrue p0.s595; CHECK_BE-NEXT: revb z0.s, p0/m, z0.s596; CHECK_BE-NEXT: ret597 %bc = bitcast <vscale x 2 x i64> %v to <vscale x 4 x float>598 ret <vscale x 4 x float> %bc599}600 601define <vscale x 4 x float> @bitcast_nxv8f16_to_nxv4f32(<vscale x 8 x half> %v) #0 {602; CHECK-LABEL: bitcast_nxv8f16_to_nxv4f32:603; CHECK: // %bb.0:604; CHECK-NEXT: ret605;606; CHECK_BE-LABEL: bitcast_nxv8f16_to_nxv4f32:607; CHECK_BE: // %bb.0:608; CHECK_BE-NEXT: ptrue p0.h609; CHECK_BE-NEXT: revb z0.h, p0/m, z0.h610; CHECK_BE-NEXT: ptrue p0.s611; CHECK_BE-NEXT: revb z0.s, p0/m, z0.s612; CHECK_BE-NEXT: ret613 %bc = bitcast <vscale x 8 x half> %v to <vscale x 4 x float>614 ret <vscale x 4 x float> %bc615}616 617define <vscale x 4 x float> @bitcast_nxv2f64_to_nxv4f32(<vscale x 2 x double> %v) #0 {618; CHECK-LABEL: bitcast_nxv2f64_to_nxv4f32:619; CHECK: // %bb.0:620; CHECK-NEXT: ret621;622; CHECK_BE-LABEL: bitcast_nxv2f64_to_nxv4f32:623; CHECK_BE: // %bb.0:624; CHECK_BE-NEXT: ptrue p0.d625; CHECK_BE-NEXT: revb z0.d, p0/m, z0.d626; CHECK_BE-NEXT: ptrue p0.s627; CHECK_BE-NEXT: revb z0.s, p0/m, z0.s628; CHECK_BE-NEXT: ret629 %bc = bitcast <vscale x 2 x double> %v to <vscale x 4 x float>630 ret <vscale x 4 x float> %bc631}632 633define <vscale x 4 x float> @bitcast_nxv8bf16_to_nxv4f32(<vscale x 8 x bfloat> %v) #0 {634; CHECK-LABEL: bitcast_nxv8bf16_to_nxv4f32:635; CHECK: // %bb.0:636; CHECK-NEXT: ret637;638; CHECK_BE-LABEL: bitcast_nxv8bf16_to_nxv4f32:639; CHECK_BE: // %bb.0:640; CHECK_BE-NEXT: ptrue p0.h641; CHECK_BE-NEXT: revb z0.h, p0/m, z0.h642; CHECK_BE-NEXT: ptrue p0.s643; CHECK_BE-NEXT: revb z0.s, p0/m, z0.s644; CHECK_BE-NEXT: ret645 %bc = bitcast <vscale x 8 x bfloat> %v to <vscale x 4 x float>646 ret <vscale x 4 x float> %bc647}648 649;650; bitcast to nxv2f64651;652 653define <vscale x 2 x double> @bitcast_nxv16i8_to_nxv2f64(<vscale x 16 x i8> %v) #0 {654; CHECK-LABEL: bitcast_nxv16i8_to_nxv2f64:655; CHECK: // %bb.0:656; CHECK-NEXT: ret657;658; CHECK_BE-LABEL: bitcast_nxv16i8_to_nxv2f64:659; CHECK_BE: // %bb.0:660; CHECK_BE-NEXT: ptrue p0.d661; CHECK_BE-NEXT: revb z0.d, p0/m, z0.d662; CHECK_BE-NEXT: ret663 %bc = bitcast <vscale x 16 x i8> %v to <vscale x 2 x double>664 ret <vscale x 2 x double> %bc665}666 667define <vscale x 2 x double> @bitcast_nxv8i16_to_nxv2f64(<vscale x 8 x i16> %v) #0 {668; CHECK-LABEL: bitcast_nxv8i16_to_nxv2f64:669; CHECK: // %bb.0:670; CHECK-NEXT: ret671;672; CHECK_BE-LABEL: bitcast_nxv8i16_to_nxv2f64:673; CHECK_BE: // %bb.0:674; CHECK_BE-NEXT: ptrue p0.h675; CHECK_BE-NEXT: revb z0.h, p0/m, z0.h676; CHECK_BE-NEXT: ptrue p0.d677; CHECK_BE-NEXT: revb z0.d, p0/m, z0.d678; CHECK_BE-NEXT: ret679 %bc = bitcast <vscale x 8 x i16> %v to <vscale x 2 x double>680 ret <vscale x 2 x double> %bc681}682 683define <vscale x 2 x double> @bitcast_nxv4i32_to_nxv2f64(<vscale x 4 x i32> %v) #0 {684; CHECK-LABEL: bitcast_nxv4i32_to_nxv2f64:685; CHECK: // %bb.0:686; CHECK-NEXT: ret687;688; CHECK_BE-LABEL: bitcast_nxv4i32_to_nxv2f64:689; CHECK_BE: // %bb.0:690; CHECK_BE-NEXT: ptrue p0.s691; CHECK_BE-NEXT: revb z0.s, p0/m, z0.s692; CHECK_BE-NEXT: ptrue p0.d693; CHECK_BE-NEXT: revb z0.d, p0/m, z0.d694; CHECK_BE-NEXT: ret695 %bc = bitcast <vscale x 4 x i32> %v to <vscale x 2 x double>696 ret <vscale x 2 x double> %bc697}698 699define <vscale x 2 x double> @bitcast_nxv2i64_to_nxv2f64(<vscale x 2 x i64> %v) #0 {700; CHECK-LABEL: bitcast_nxv2i64_to_nxv2f64:701; CHECK: // %bb.0:702; CHECK-NEXT: ret703;704; CHECK_BE-LABEL: bitcast_nxv2i64_to_nxv2f64:705; CHECK_BE: // %bb.0:706; CHECK_BE-NEXT: ret707 %bc = bitcast <vscale x 2 x i64> %v to <vscale x 2 x double>708 ret <vscale x 2 x double> %bc709}710 711define <vscale x 2 x double> @bitcast_nxv8f16_to_nxv2f64(<vscale x 8 x half> %v) #0 {712; CHECK-LABEL: bitcast_nxv8f16_to_nxv2f64:713; CHECK: // %bb.0:714; CHECK-NEXT: ret715;716; CHECK_BE-LABEL: bitcast_nxv8f16_to_nxv2f64:717; CHECK_BE: // %bb.0:718; CHECK_BE-NEXT: ptrue p0.h719; CHECK_BE-NEXT: revb z0.h, p0/m, z0.h720; CHECK_BE-NEXT: ptrue p0.d721; CHECK_BE-NEXT: revb z0.d, p0/m, z0.d722; CHECK_BE-NEXT: ret723 %bc = bitcast <vscale x 8 x half> %v to <vscale x 2 x double>724 ret <vscale x 2 x double> %bc725}726 727define <vscale x 2 x double> @bitcast_nxv4f32_to_nxv2f64(<vscale x 4 x float> %v) #0 {728; CHECK-LABEL: bitcast_nxv4f32_to_nxv2f64:729; CHECK: // %bb.0:730; CHECK-NEXT: ret731;732; CHECK_BE-LABEL: bitcast_nxv4f32_to_nxv2f64:733; CHECK_BE: // %bb.0:734; CHECK_BE-NEXT: ptrue p0.s735; CHECK_BE-NEXT: revb z0.s, p0/m, z0.s736; CHECK_BE-NEXT: ptrue p0.d737; CHECK_BE-NEXT: revb z0.d, p0/m, z0.d738; CHECK_BE-NEXT: ret739 %bc = bitcast <vscale x 4 x float> %v to <vscale x 2 x double>740 ret <vscale x 2 x double> %bc741}742 743define <vscale x 2 x double> @bitcast_nxv8bf16_to_nxv2f64(<vscale x 8 x bfloat> %v) #0 {744; CHECK-LABEL: bitcast_nxv8bf16_to_nxv2f64:745; CHECK: // %bb.0:746; CHECK-NEXT: ret747;748; CHECK_BE-LABEL: bitcast_nxv8bf16_to_nxv2f64:749; CHECK_BE: // %bb.0:750; CHECK_BE-NEXT: ptrue p0.h751; CHECK_BE-NEXT: revb z0.h, p0/m, z0.h752; CHECK_BE-NEXT: ptrue p0.d753; CHECK_BE-NEXT: revb z0.d, p0/m, z0.d754; CHECK_BE-NEXT: ret755 %bc = bitcast <vscale x 8 x bfloat> %v to <vscale x 2 x double>756 ret <vscale x 2 x double> %bc757}758 759;760; bitcast to nxv8bf16761;762 763define <vscale x 8 x bfloat> @bitcast_nxv16i8_to_nxv8bf16(<vscale x 16 x i8> %v) #0 {764; CHECK-LABEL: bitcast_nxv16i8_to_nxv8bf16:765; CHECK: // %bb.0:766; CHECK-NEXT: ret767;768; CHECK_BE-LABEL: bitcast_nxv16i8_to_nxv8bf16:769; CHECK_BE: // %bb.0:770; CHECK_BE-NEXT: ptrue p0.h771; CHECK_BE-NEXT: revb z0.h, p0/m, z0.h772; CHECK_BE-NEXT: ret773 %bc = bitcast <vscale x 16 x i8> %v to <vscale x 8 x bfloat>774 ret <vscale x 8 x bfloat> %bc775}776 777define <vscale x 8 x bfloat> @bitcast_nxv8i16_to_nxv8bf16(<vscale x 8 x i16> %v) #0 {778; CHECK-LABEL: bitcast_nxv8i16_to_nxv8bf16:779; CHECK: // %bb.0:780; CHECK-NEXT: ret781;782; CHECK_BE-LABEL: bitcast_nxv8i16_to_nxv8bf16:783; CHECK_BE: // %bb.0:784; CHECK_BE-NEXT: ret785 %bc = bitcast <vscale x 8 x i16> %v to <vscale x 8 x bfloat>786 ret <vscale x 8 x bfloat> %bc787}788 789define <vscale x 8 x bfloat> @bitcast_nxv4i32_to_nxv8bf16(<vscale x 4 x i32> %v) #0 {790; CHECK-LABEL: bitcast_nxv4i32_to_nxv8bf16:791; CHECK: // %bb.0:792; CHECK-NEXT: ret793;794; CHECK_BE-LABEL: bitcast_nxv4i32_to_nxv8bf16:795; CHECK_BE: // %bb.0:796; CHECK_BE-NEXT: ptrue p0.s797; CHECK_BE-NEXT: revb z0.s, p0/m, z0.s798; CHECK_BE-NEXT: ptrue p0.h799; CHECK_BE-NEXT: revb z0.h, p0/m, z0.h800; CHECK_BE-NEXT: ret801 %bc = bitcast <vscale x 4 x i32> %v to <vscale x 8 x bfloat>802 ret <vscale x 8 x bfloat> %bc803}804 805define <vscale x 8 x bfloat> @bitcast_nxv2i64_to_nxv8bf16(<vscale x 2 x i64> %v) #0 {806; CHECK-LABEL: bitcast_nxv2i64_to_nxv8bf16:807; CHECK: // %bb.0:808; CHECK-NEXT: ret809;810; CHECK_BE-LABEL: bitcast_nxv2i64_to_nxv8bf16:811; CHECK_BE: // %bb.0:812; CHECK_BE-NEXT: ptrue p0.d813; CHECK_BE-NEXT: revb z0.d, p0/m, z0.d814; CHECK_BE-NEXT: ptrue p0.h815; CHECK_BE-NEXT: revb z0.h, p0/m, z0.h816; CHECK_BE-NEXT: ret817 %bc = bitcast <vscale x 2 x i64> %v to <vscale x 8 x bfloat>818 ret <vscale x 8 x bfloat> %bc819}820 821define <vscale x 8 x bfloat> @bitcast_nxv8f16_to_nxv8bf16(<vscale x 8 x half> %v) #0 {822; CHECK-LABEL: bitcast_nxv8f16_to_nxv8bf16:823; CHECK: // %bb.0:824; CHECK-NEXT: ret825;826; CHECK_BE-LABEL: bitcast_nxv8f16_to_nxv8bf16:827; CHECK_BE: // %bb.0:828; CHECK_BE-NEXT: ret829 %bc = bitcast <vscale x 8 x half> %v to <vscale x 8 x bfloat>830 ret <vscale x 8 x bfloat> %bc831}832 833define <vscale x 8 x bfloat> @bitcast_nxv4f32_to_nxv8bf16(<vscale x 4 x float> %v) #0 {834; CHECK-LABEL: bitcast_nxv4f32_to_nxv8bf16:835; CHECK: // %bb.0:836; CHECK-NEXT: ret837;838; CHECK_BE-LABEL: bitcast_nxv4f32_to_nxv8bf16:839; CHECK_BE: // %bb.0:840; CHECK_BE-NEXT: ptrue p0.s841; CHECK_BE-NEXT: revb z0.s, p0/m, z0.s842; CHECK_BE-NEXT: ptrue p0.h843; CHECK_BE-NEXT: revb z0.h, p0/m, z0.h844; CHECK_BE-NEXT: ret845 %bc = bitcast <vscale x 4 x float> %v to <vscale x 8 x bfloat>846 ret <vscale x 8 x bfloat> %bc847}848 849define <vscale x 8 x bfloat> @bitcast_nxv2f64_to_nxv8bf16(<vscale x 2 x double> %v) #0 {850; CHECK-LABEL: bitcast_nxv2f64_to_nxv8bf16:851; CHECK: // %bb.0:852; CHECK-NEXT: ret853;854; CHECK_BE-LABEL: bitcast_nxv2f64_to_nxv8bf16:855; CHECK_BE: // %bb.0:856; CHECK_BE-NEXT: ptrue p0.d857; CHECK_BE-NEXT: revb z0.d, p0/m, z0.d858; CHECK_BE-NEXT: ptrue p0.h859; CHECK_BE-NEXT: revb z0.h, p0/m, z0.h860; CHECK_BE-NEXT: ret861 %bc = bitcast <vscale x 2 x double> %v to <vscale x 8 x bfloat>862 ret <vscale x 8 x bfloat> %bc863}864 865;866; bitcast to nxv8i8867;868 869define <vscale x 8 x i8> @bitcast_nxv4i16_to_nxv8i8(<vscale x 4 x i16> %v) #0 {870; CHECK-LABEL: bitcast_nxv4i16_to_nxv8i8:871; CHECK: // %bb.0:872; CHECK-NEXT: str x29, [sp, #-16]! // 8-byte Folded Spill873; CHECK-NEXT: addvl sp, sp, #-1874; CHECK-NEXT: ptrue p0.s875; CHECK-NEXT: ptrue p1.h876; CHECK-NEXT: st1h { z0.s }, p0, [sp, #1, mul vl]877; CHECK-NEXT: ld1b { z0.h }, p1/z, [sp, #1, mul vl]878; CHECK-NEXT: addvl sp, sp, #1879; CHECK-NEXT: ldr x29, [sp], #16 // 8-byte Folded Reload880; CHECK-NEXT: ret881;882; CHECK_BE-LABEL: bitcast_nxv4i16_to_nxv8i8:883; CHECK_BE: // %bb.0:884; CHECK_BE-NEXT: str x29, [sp, #-16]! // 8-byte Folded Spill885; CHECK_BE-NEXT: addvl sp, sp, #-1886; CHECK_BE-NEXT: ptrue p0.s887; CHECK_BE-NEXT: ptrue p1.h888; CHECK_BE-NEXT: st1h { z0.s }, p0, [sp, #1, mul vl]889; CHECK_BE-NEXT: ld1b { z0.h }, p1/z, [sp, #1, mul vl]890; CHECK_BE-NEXT: addvl sp, sp, #1891; CHECK_BE-NEXT: ldr x29, [sp], #16 // 8-byte Folded Reload892; CHECK_BE-NEXT: ret893 %bc = bitcast <vscale x 4 x i16> %v to <vscale x 8 x i8>894 ret <vscale x 8 x i8> %bc895}896 897define <vscale x 8 x i8> @bitcast_nxv2i32_to_nxv8i8(<vscale x 2 x i32> %v) #0 {898; CHECK-LABEL: bitcast_nxv2i32_to_nxv8i8:899; CHECK: // %bb.0:900; CHECK-NEXT: str x29, [sp, #-16]! // 8-byte Folded Spill901; CHECK-NEXT: addvl sp, sp, #-1902; CHECK-NEXT: ptrue p0.d903; CHECK-NEXT: ptrue p1.h904; CHECK-NEXT: st1w { z0.d }, p0, [sp, #1, mul vl]905; CHECK-NEXT: ld1b { z0.h }, p1/z, [sp, #1, mul vl]906; CHECK-NEXT: addvl sp, sp, #1907; CHECK-NEXT: ldr x29, [sp], #16 // 8-byte Folded Reload908; CHECK-NEXT: ret909;910; CHECK_BE-LABEL: bitcast_nxv2i32_to_nxv8i8:911; CHECK_BE: // %bb.0:912; CHECK_BE-NEXT: str x29, [sp, #-16]! // 8-byte Folded Spill913; CHECK_BE-NEXT: addvl sp, sp, #-1914; CHECK_BE-NEXT: ptrue p0.d915; CHECK_BE-NEXT: ptrue p1.h916; CHECK_BE-NEXT: st1w { z0.d }, p0, [sp, #1, mul vl]917; CHECK_BE-NEXT: ld1b { z0.h }, p1/z, [sp, #1, mul vl]918; CHECK_BE-NEXT: addvl sp, sp, #1919; CHECK_BE-NEXT: ldr x29, [sp], #16 // 8-byte Folded Reload920; CHECK_BE-NEXT: ret921 %bc = bitcast <vscale x 2 x i32> %v to <vscale x 8 x i8>922 ret <vscale x 8 x i8> %bc923}924 925define <vscale x 8 x i8> @bitcast_nxv1i64_to_nxv8i8(<vscale x 1 x i64> %v) #0 {926; CHECK-LABEL: bitcast_nxv1i64_to_nxv8i8:927; CHECK: // %bb.0:928; CHECK-NEXT: uunpklo z0.h, z0.b929; CHECK-NEXT: ret930;931; CHECK_BE-LABEL: bitcast_nxv1i64_to_nxv8i8:932; CHECK_BE: // %bb.0:933; CHECK_BE-NEXT: ptrue p0.d934; CHECK_BE-NEXT: revb z0.d, p0/m, z0.d935; CHECK_BE-NEXT: uunpklo z0.h, z0.b936; CHECK_BE-NEXT: ret937 %bc = bitcast <vscale x 1 x i64> %v to <vscale x 8 x i8>938 ret <vscale x 8 x i8> %bc939}940 941define <vscale x 8 x i8> @bitcast_nxv4f16_to_nxv8i8(<vscale x 4 x half> %v) #0 {942; CHECK-LABEL: bitcast_nxv4f16_to_nxv8i8:943; CHECK: // %bb.0:944; CHECK-NEXT: str x29, [sp, #-16]! // 8-byte Folded Spill945; CHECK-NEXT: addvl sp, sp, #-1946; CHECK-NEXT: ptrue p0.s947; CHECK-NEXT: ptrue p1.h948; CHECK-NEXT: st1h { z0.s }, p0, [sp, #1, mul vl]949; CHECK-NEXT: ld1b { z0.h }, p1/z, [sp, #1, mul vl]950; CHECK-NEXT: addvl sp, sp, #1951; CHECK-NEXT: ldr x29, [sp], #16 // 8-byte Folded Reload952; CHECK-NEXT: ret953;954; CHECK_BE-LABEL: bitcast_nxv4f16_to_nxv8i8:955; CHECK_BE: // %bb.0:956; CHECK_BE-NEXT: str x29, [sp, #-16]! // 8-byte Folded Spill957; CHECK_BE-NEXT: addvl sp, sp, #-1958; CHECK_BE-NEXT: ptrue p0.s959; CHECK_BE-NEXT: ptrue p1.h960; CHECK_BE-NEXT: st1h { z0.s }, p0, [sp, #1, mul vl]961; CHECK_BE-NEXT: ld1b { z0.h }, p1/z, [sp, #1, mul vl]962; CHECK_BE-NEXT: addvl sp, sp, #1963; CHECK_BE-NEXT: ldr x29, [sp], #16 // 8-byte Folded Reload964; CHECK_BE-NEXT: ret965 %bc = bitcast <vscale x 4 x half> %v to <vscale x 8 x i8>966 ret <vscale x 8 x i8> %bc967}968 969define <vscale x 8 x i8> @bitcast_nxv2f32_to_nxv8i8(<vscale x 2 x float> %v) #0 {970; CHECK-LABEL: bitcast_nxv2f32_to_nxv8i8:971; CHECK: // %bb.0:972; CHECK-NEXT: str x29, [sp, #-16]! // 8-byte Folded Spill973; CHECK-NEXT: addvl sp, sp, #-1974; CHECK-NEXT: ptrue p0.d975; CHECK-NEXT: ptrue p1.h976; CHECK-NEXT: st1w { z0.d }, p0, [sp, #1, mul vl]977; CHECK-NEXT: ld1b { z0.h }, p1/z, [sp, #1, mul vl]978; CHECK-NEXT: addvl sp, sp, #1979; CHECK-NEXT: ldr x29, [sp], #16 // 8-byte Folded Reload980; CHECK-NEXT: ret981;982; CHECK_BE-LABEL: bitcast_nxv2f32_to_nxv8i8:983; CHECK_BE: // %bb.0:984; CHECK_BE-NEXT: str x29, [sp, #-16]! // 8-byte Folded Spill985; CHECK_BE-NEXT: addvl sp, sp, #-1986; CHECK_BE-NEXT: ptrue p0.d987; CHECK_BE-NEXT: ptrue p1.h988; CHECK_BE-NEXT: st1w { z0.d }, p0, [sp, #1, mul vl]989; CHECK_BE-NEXT: ld1b { z0.h }, p1/z, [sp, #1, mul vl]990; CHECK_BE-NEXT: addvl sp, sp, #1991; CHECK_BE-NEXT: ldr x29, [sp], #16 // 8-byte Folded Reload992; CHECK_BE-NEXT: ret993 %bc = bitcast <vscale x 2 x float> %v to <vscale x 8 x i8>994 ret <vscale x 8 x i8> %bc995}996 997define <vscale x 8 x i8> @bitcast_nxv1f64_to_nxv8i8(<vscale x 1 x double> %v) #0 {998; CHECK-LABEL: bitcast_nxv1f64_to_nxv8i8:999; CHECK: // %bb.0:1000; CHECK-NEXT: uunpklo z0.h, z0.b1001; CHECK-NEXT: ret1002;1003; CHECK_BE-LABEL: bitcast_nxv1f64_to_nxv8i8:1004; CHECK_BE: // %bb.0:1005; CHECK_BE-NEXT: ptrue p0.d1006; CHECK_BE-NEXT: revb z0.d, p0/m, z0.d1007; CHECK_BE-NEXT: uunpklo z0.h, z0.b1008; CHECK_BE-NEXT: ret1009 %bc = bitcast <vscale x 1 x double> %v to <vscale x 8 x i8>1010 ret <vscale x 8 x i8> %bc1011}1012 1013define <vscale x 8 x i8> @bitcast_nxv4bf16_to_nxv8i8(<vscale x 4 x bfloat> %v) #0 {1014; CHECK-LABEL: bitcast_nxv4bf16_to_nxv8i8:1015; CHECK: // %bb.0:1016; CHECK-NEXT: str x29, [sp, #-16]! // 8-byte Folded Spill1017; CHECK-NEXT: addvl sp, sp, #-11018; CHECK-NEXT: ptrue p0.s1019; CHECK-NEXT: ptrue p1.h1020; CHECK-NEXT: st1h { z0.s }, p0, [sp, #1, mul vl]1021; CHECK-NEXT: ld1b { z0.h }, p1/z, [sp, #1, mul vl]1022; CHECK-NEXT: addvl sp, sp, #11023; CHECK-NEXT: ldr x29, [sp], #16 // 8-byte Folded Reload1024; CHECK-NEXT: ret1025;1026; CHECK_BE-LABEL: bitcast_nxv4bf16_to_nxv8i8:1027; CHECK_BE: // %bb.0:1028; CHECK_BE-NEXT: str x29, [sp, #-16]! // 8-byte Folded Spill1029; CHECK_BE-NEXT: addvl sp, sp, #-11030; CHECK_BE-NEXT: ptrue p0.s1031; CHECK_BE-NEXT: ptrue p1.h1032; CHECK_BE-NEXT: st1h { z0.s }, p0, [sp, #1, mul vl]1033; CHECK_BE-NEXT: ld1b { z0.h }, p1/z, [sp, #1, mul vl]1034; CHECK_BE-NEXT: addvl sp, sp, #11035; CHECK_BE-NEXT: ldr x29, [sp], #16 // 8-byte Folded Reload1036; CHECK_BE-NEXT: ret1037 %bc = bitcast <vscale x 4 x bfloat> %v to <vscale x 8 x i8>1038 ret <vscale x 8 x i8> %bc1039}1040 1041;1042; bitcast to nxv4i161043;1044 1045define <vscale x 4 x i16> @bitcast_nxv8i8_to_nxv4i16(<vscale x 8 x i8> %v) #0 {1046; CHECK-LABEL: bitcast_nxv8i8_to_nxv4i16:1047; CHECK: // %bb.0:1048; CHECK-NEXT: str x29, [sp, #-16]! // 8-byte Folded Spill1049; CHECK-NEXT: addvl sp, sp, #-11050; CHECK-NEXT: ptrue p0.h1051; CHECK-NEXT: ptrue p1.s1052; CHECK-NEXT: st1b { z0.h }, p0, [sp, #1, mul vl]1053; CHECK-NEXT: ld1h { z0.s }, p1/z, [sp, #1, mul vl]1054; CHECK-NEXT: addvl sp, sp, #11055; CHECK-NEXT: ldr x29, [sp], #16 // 8-byte Folded Reload1056; CHECK-NEXT: ret1057;1058; CHECK_BE-LABEL: bitcast_nxv8i8_to_nxv4i16:1059; CHECK_BE: // %bb.0:1060; CHECK_BE-NEXT: str x29, [sp, #-16]! // 8-byte Folded Spill1061; CHECK_BE-NEXT: addvl sp, sp, #-11062; CHECK_BE-NEXT: ptrue p0.h1063; CHECK_BE-NEXT: ptrue p1.s1064; CHECK_BE-NEXT: st1b { z0.h }, p0, [sp, #1, mul vl]1065; CHECK_BE-NEXT: ld1h { z0.s }, p1/z, [sp, #1, mul vl]1066; CHECK_BE-NEXT: addvl sp, sp, #11067; CHECK_BE-NEXT: ldr x29, [sp], #16 // 8-byte Folded Reload1068; CHECK_BE-NEXT: ret1069 %bc = bitcast <vscale x 8 x i8> %v to <vscale x 4 x i16>1070 ret <vscale x 4 x i16> %bc1071}1072 1073define <vscale x 4 x i16> @bitcast_nxv2i32_to_nxv4i16(<vscale x 2 x i32> %v) #0 {1074; CHECK-LABEL: bitcast_nxv2i32_to_nxv4i16:1075; CHECK: // %bb.0:1076; CHECK-NEXT: str x29, [sp, #-16]! // 8-byte Folded Spill1077; CHECK-NEXT: addvl sp, sp, #-11078; CHECK-NEXT: ptrue p0.d1079; CHECK-NEXT: ptrue p1.s1080; CHECK-NEXT: st1w { z0.d }, p0, [sp, #1, mul vl]1081; CHECK-NEXT: ld1h { z0.s }, p1/z, [sp, #1, mul vl]1082; CHECK-NEXT: addvl sp, sp, #11083; CHECK-NEXT: ldr x29, [sp], #16 // 8-byte Folded Reload1084; CHECK-NEXT: ret1085;1086; CHECK_BE-LABEL: bitcast_nxv2i32_to_nxv4i16:1087; CHECK_BE: // %bb.0:1088; CHECK_BE-NEXT: str x29, [sp, #-16]! // 8-byte Folded Spill1089; CHECK_BE-NEXT: addvl sp, sp, #-11090; CHECK_BE-NEXT: ptrue p0.d1091; CHECK_BE-NEXT: ptrue p1.s1092; CHECK_BE-NEXT: st1w { z0.d }, p0, [sp, #1, mul vl]1093; CHECK_BE-NEXT: ld1h { z0.s }, p1/z, [sp, #1, mul vl]1094; CHECK_BE-NEXT: addvl sp, sp, #11095; CHECK_BE-NEXT: ldr x29, [sp], #16 // 8-byte Folded Reload1096; CHECK_BE-NEXT: ret1097 %bc = bitcast <vscale x 2 x i32> %v to <vscale x 4 x i16>1098 ret <vscale x 4 x i16> %bc1099}1100 1101define <vscale x 4 x i16> @bitcast_nxv1i64_to_nxv4i16(<vscale x 1 x i64> %v) #0 {1102; CHECK-LABEL: bitcast_nxv1i64_to_nxv4i16:1103; CHECK: // %bb.0:1104; CHECK-NEXT: uunpklo z0.s, z0.h1105; CHECK-NEXT: ret1106;1107; CHECK_BE-LABEL: bitcast_nxv1i64_to_nxv4i16:1108; CHECK_BE: // %bb.0:1109; CHECK_BE-NEXT: ptrue p0.d1110; CHECK_BE-NEXT: revb z0.d, p0/m, z0.d1111; CHECK_BE-NEXT: ptrue p0.h1112; CHECK_BE-NEXT: revb z0.h, p0/m, z0.h1113; CHECK_BE-NEXT: uunpklo z0.s, z0.h1114; CHECK_BE-NEXT: ret1115 %bc = bitcast <vscale x 1 x i64> %v to <vscale x 4 x i16>1116 ret <vscale x 4 x i16> %bc1117}1118 1119define <vscale x 4 x i16> @bitcast_nxv4f16_to_nxv4i16(<vscale x 4 x half> %v) #0 {1120; CHECK-LABEL: bitcast_nxv4f16_to_nxv4i16:1121; CHECK: // %bb.0:1122; CHECK-NEXT: ret1123;1124; CHECK_BE-LABEL: bitcast_nxv4f16_to_nxv4i16:1125; CHECK_BE: // %bb.0:1126; CHECK_BE-NEXT: ptrue p0.h1127; CHECK_BE-NEXT: revb z0.h, p0/m, z0.h1128; CHECK_BE-NEXT: ptrue p0.s1129; CHECK_BE-NEXT: revb z0.s, p0/m, z0.s1130; CHECK_BE-NEXT: ret1131 %bc = bitcast <vscale x 4 x half> %v to <vscale x 4 x i16>1132 ret <vscale x 4 x i16> %bc1133}1134 1135define <vscale x 4 x i16> @bitcast_nxv2f32_to_nxv4i16(<vscale x 2 x float> %v) #0 {1136; CHECK-LABEL: bitcast_nxv2f32_to_nxv4i16:1137; CHECK: // %bb.0:1138; CHECK-NEXT: str x29, [sp, #-16]! // 8-byte Folded Spill1139; CHECK-NEXT: addvl sp, sp, #-11140; CHECK-NEXT: ptrue p0.d1141; CHECK-NEXT: ptrue p1.s1142; CHECK-NEXT: st1w { z0.d }, p0, [sp, #1, mul vl]1143; CHECK-NEXT: ld1h { z0.s }, p1/z, [sp, #1, mul vl]1144; CHECK-NEXT: addvl sp, sp, #11145; CHECK-NEXT: ldr x29, [sp], #16 // 8-byte Folded Reload1146; CHECK-NEXT: ret1147;1148; CHECK_BE-LABEL: bitcast_nxv2f32_to_nxv4i16:1149; CHECK_BE: // %bb.0:1150; CHECK_BE-NEXT: str x29, [sp, #-16]! // 8-byte Folded Spill1151; CHECK_BE-NEXT: addvl sp, sp, #-11152; CHECK_BE-NEXT: ptrue p0.d1153; CHECK_BE-NEXT: ptrue p1.s1154; CHECK_BE-NEXT: st1w { z0.d }, p0, [sp, #1, mul vl]1155; CHECK_BE-NEXT: ld1h { z0.s }, p1/z, [sp, #1, mul vl]1156; CHECK_BE-NEXT: addvl sp, sp, #11157; CHECK_BE-NEXT: ldr x29, [sp], #16 // 8-byte Folded Reload1158; CHECK_BE-NEXT: ret1159 %bc = bitcast <vscale x 2 x float> %v to <vscale x 4 x i16>1160 ret <vscale x 4 x i16> %bc1161}1162 1163define <vscale x 4 x i16> @bitcast_nxv1f64_to_nxv4i16(<vscale x 1 x double> %v) #0 {1164; CHECK-LABEL: bitcast_nxv1f64_to_nxv4i16:1165; CHECK: // %bb.0:1166; CHECK-NEXT: uunpklo z0.s, z0.h1167; CHECK-NEXT: ret1168;1169; CHECK_BE-LABEL: bitcast_nxv1f64_to_nxv4i16:1170; CHECK_BE: // %bb.0:1171; CHECK_BE-NEXT: ptrue p0.d1172; CHECK_BE-NEXT: revb z0.d, p0/m, z0.d1173; CHECK_BE-NEXT: ptrue p0.h1174; CHECK_BE-NEXT: revb z0.h, p0/m, z0.h1175; CHECK_BE-NEXT: uunpklo z0.s, z0.h1176; CHECK_BE-NEXT: ret1177 %bc = bitcast <vscale x 1 x double> %v to <vscale x 4 x i16>1178 ret <vscale x 4 x i16> %bc1179}1180 1181define <vscale x 4 x i16> @bitcast_nxv4bf16_to_nxv4i16(<vscale x 4 x bfloat> %v) #0 {1182; CHECK-LABEL: bitcast_nxv4bf16_to_nxv4i16:1183; CHECK: // %bb.0:1184; CHECK-NEXT: ret1185;1186; CHECK_BE-LABEL: bitcast_nxv4bf16_to_nxv4i16:1187; CHECK_BE: // %bb.0:1188; CHECK_BE-NEXT: ptrue p0.h1189; CHECK_BE-NEXT: revb z0.h, p0/m, z0.h1190; CHECK_BE-NEXT: ptrue p0.s1191; CHECK_BE-NEXT: revb z0.s, p0/m, z0.s1192; CHECK_BE-NEXT: ret1193 %bc = bitcast <vscale x 4 x bfloat> %v to <vscale x 4 x i16>1194 ret <vscale x 4 x i16> %bc1195}1196 1197;1198; bitcast to nxv2i321199;1200 1201define <vscale x 2 x i32> @bitcast_nxv8i8_to_nxv2i32(<vscale x 8 x i8> %v) #0 {1202; CHECK-LABEL: bitcast_nxv8i8_to_nxv2i32:1203; CHECK: // %bb.0:1204; CHECK-NEXT: str x29, [sp, #-16]! // 8-byte Folded Spill1205; CHECK-NEXT: addvl sp, sp, #-11206; CHECK-NEXT: ptrue p0.h1207; CHECK-NEXT: ptrue p1.d1208; CHECK-NEXT: st1b { z0.h }, p0, [sp, #1, mul vl]1209; CHECK-NEXT: ld1w { z0.d }, p1/z, [sp, #1, mul vl]1210; CHECK-NEXT: addvl sp, sp, #11211; CHECK-NEXT: ldr x29, [sp], #16 // 8-byte Folded Reload1212; CHECK-NEXT: ret1213;1214; CHECK_BE-LABEL: bitcast_nxv8i8_to_nxv2i32:1215; CHECK_BE: // %bb.0:1216; CHECK_BE-NEXT: str x29, [sp, #-16]! // 8-byte Folded Spill1217; CHECK_BE-NEXT: addvl sp, sp, #-11218; CHECK_BE-NEXT: ptrue p0.h1219; CHECK_BE-NEXT: ptrue p1.d1220; CHECK_BE-NEXT: st1b { z0.h }, p0, [sp, #1, mul vl]1221; CHECK_BE-NEXT: ld1w { z0.d }, p1/z, [sp, #1, mul vl]1222; CHECK_BE-NEXT: addvl sp, sp, #11223; CHECK_BE-NEXT: ldr x29, [sp], #16 // 8-byte Folded Reload1224; CHECK_BE-NEXT: ret1225 %bc = bitcast <vscale x 8 x i8> %v to <vscale x 2 x i32>1226 ret <vscale x 2 x i32> %bc1227}1228 1229define <vscale x 2 x i32> @bitcast_nxv4i16_to_nxv2i32(<vscale x 4 x i16> %v) #0 {1230; CHECK-LABEL: bitcast_nxv4i16_to_nxv2i32:1231; CHECK: // %bb.0:1232; CHECK-NEXT: str x29, [sp, #-16]! // 8-byte Folded Spill1233; CHECK-NEXT: addvl sp, sp, #-11234; CHECK-NEXT: ptrue p0.s1235; CHECK-NEXT: ptrue p1.d1236; CHECK-NEXT: st1h { z0.s }, p0, [sp, #1, mul vl]1237; CHECK-NEXT: ld1w { z0.d }, p1/z, [sp, #1, mul vl]1238; CHECK-NEXT: addvl sp, sp, #11239; CHECK-NEXT: ldr x29, [sp], #16 // 8-byte Folded Reload1240; CHECK-NEXT: ret1241;1242; CHECK_BE-LABEL: bitcast_nxv4i16_to_nxv2i32:1243; CHECK_BE: // %bb.0:1244; CHECK_BE-NEXT: str x29, [sp, #-16]! // 8-byte Folded Spill1245; CHECK_BE-NEXT: addvl sp, sp, #-11246; CHECK_BE-NEXT: ptrue p0.s1247; CHECK_BE-NEXT: ptrue p1.d1248; CHECK_BE-NEXT: st1h { z0.s }, p0, [sp, #1, mul vl]1249; CHECK_BE-NEXT: ld1w { z0.d }, p1/z, [sp, #1, mul vl]1250; CHECK_BE-NEXT: addvl sp, sp, #11251; CHECK_BE-NEXT: ldr x29, [sp], #16 // 8-byte Folded Reload1252; CHECK_BE-NEXT: ret1253 %bc = bitcast <vscale x 4 x i16> %v to <vscale x 2 x i32>1254 ret <vscale x 2 x i32> %bc1255}1256 1257define <vscale x 2 x i32> @bitcast_nxv1i64_to_nxv2i32(<vscale x 1 x i64> %v) #0 {1258; CHECK-LABEL: bitcast_nxv1i64_to_nxv2i32:1259; CHECK: // %bb.0:1260; CHECK-NEXT: uunpklo z0.d, z0.s1261; CHECK-NEXT: ret1262;1263; CHECK_BE-LABEL: bitcast_nxv1i64_to_nxv2i32:1264; CHECK_BE: // %bb.0:1265; CHECK_BE-NEXT: ptrue p0.d1266; CHECK_BE-NEXT: revb z0.d, p0/m, z0.d1267; CHECK_BE-NEXT: ptrue p0.s1268; CHECK_BE-NEXT: revb z0.s, p0/m, z0.s1269; CHECK_BE-NEXT: uunpklo z0.d, z0.s1270; CHECK_BE-NEXT: ret1271 %bc = bitcast <vscale x 1 x i64> %v to <vscale x 2 x i32>1272 ret <vscale x 2 x i32> %bc1273}1274 1275define <vscale x 2 x i32> @bitcast_nxv4f16_to_nxv2i32(<vscale x 4 x half> %v) #0 {1276; CHECK-LABEL: bitcast_nxv4f16_to_nxv2i32:1277; CHECK: // %bb.0:1278; CHECK-NEXT: str x29, [sp, #-16]! // 8-byte Folded Spill1279; CHECK-NEXT: addvl sp, sp, #-11280; CHECK-NEXT: ptrue p0.s1281; CHECK-NEXT: ptrue p1.d1282; CHECK-NEXT: st1h { z0.s }, p0, [sp, #1, mul vl]1283; CHECK-NEXT: ld1w { z0.d }, p1/z, [sp, #1, mul vl]1284; CHECK-NEXT: addvl sp, sp, #11285; CHECK-NEXT: ldr x29, [sp], #16 // 8-byte Folded Reload1286; CHECK-NEXT: ret1287;1288; CHECK_BE-LABEL: bitcast_nxv4f16_to_nxv2i32:1289; CHECK_BE: // %bb.0:1290; CHECK_BE-NEXT: str x29, [sp, #-16]! // 8-byte Folded Spill1291; CHECK_BE-NEXT: addvl sp, sp, #-11292; CHECK_BE-NEXT: ptrue p0.s1293; CHECK_BE-NEXT: ptrue p1.d1294; CHECK_BE-NEXT: st1h { z0.s }, p0, [sp, #1, mul vl]1295; CHECK_BE-NEXT: ld1w { z0.d }, p1/z, [sp, #1, mul vl]1296; CHECK_BE-NEXT: addvl sp, sp, #11297; CHECK_BE-NEXT: ldr x29, [sp], #16 // 8-byte Folded Reload1298; CHECK_BE-NEXT: ret1299 %bc = bitcast <vscale x 4 x half> %v to <vscale x 2 x i32>1300 ret <vscale x 2 x i32> %bc1301}1302 1303define <vscale x 2 x i32> @bitcast_nxv2f32_to_nxv2i32(<vscale x 2 x float> %v) #0 {1304; CHECK-LABEL: bitcast_nxv2f32_to_nxv2i32:1305; CHECK: // %bb.0:1306; CHECK-NEXT: ret1307;1308; CHECK_BE-LABEL: bitcast_nxv2f32_to_nxv2i32:1309; CHECK_BE: // %bb.0:1310; CHECK_BE-NEXT: ptrue p0.s1311; CHECK_BE-NEXT: revb z0.s, p0/m, z0.s1312; CHECK_BE-NEXT: ptrue p0.d1313; CHECK_BE-NEXT: revb z0.d, p0/m, z0.d1314; CHECK_BE-NEXT: ret1315 %bc = bitcast <vscale x 2 x float> %v to <vscale x 2 x i32>1316 ret <vscale x 2 x i32> %bc1317}1318 1319define <vscale x 2 x i32> @bitcast_nxv1f64_to_nxv2i32(<vscale x 1 x double> %v) #0 {1320; CHECK-LABEL: bitcast_nxv1f64_to_nxv2i32:1321; CHECK: // %bb.0:1322; CHECK-NEXT: uunpklo z0.d, z0.s1323; CHECK-NEXT: ret1324;1325; CHECK_BE-LABEL: bitcast_nxv1f64_to_nxv2i32:1326; CHECK_BE: // %bb.0:1327; CHECK_BE-NEXT: ptrue p0.d1328; CHECK_BE-NEXT: revb z0.d, p0/m, z0.d1329; CHECK_BE-NEXT: ptrue p0.s1330; CHECK_BE-NEXT: revb z0.s, p0/m, z0.s1331; CHECK_BE-NEXT: uunpklo z0.d, z0.s1332; CHECK_BE-NEXT: ret1333 %bc = bitcast <vscale x 1 x double> %v to <vscale x 2 x i32>1334 ret <vscale x 2 x i32> %bc1335}1336 1337define <vscale x 2 x i32> @bitcast_nxv4bf16_to_nxv2i32(<vscale x 4 x bfloat> %v) #0 {1338; CHECK-LABEL: bitcast_nxv4bf16_to_nxv2i32:1339; CHECK: // %bb.0:1340; CHECK-NEXT: str x29, [sp, #-16]! // 8-byte Folded Spill1341; CHECK-NEXT: addvl sp, sp, #-11342; CHECK-NEXT: ptrue p0.s1343; CHECK-NEXT: ptrue p1.d1344; CHECK-NEXT: st1h { z0.s }, p0, [sp, #1, mul vl]1345; CHECK-NEXT: ld1w { z0.d }, p1/z, [sp, #1, mul vl]1346; CHECK-NEXT: addvl sp, sp, #11347; CHECK-NEXT: ldr x29, [sp], #16 // 8-byte Folded Reload1348; CHECK-NEXT: ret1349;1350; CHECK_BE-LABEL: bitcast_nxv4bf16_to_nxv2i32:1351; CHECK_BE: // %bb.0:1352; CHECK_BE-NEXT: str x29, [sp, #-16]! // 8-byte Folded Spill1353; CHECK_BE-NEXT: addvl sp, sp, #-11354; CHECK_BE-NEXT: ptrue p0.s1355; CHECK_BE-NEXT: ptrue p1.d1356; CHECK_BE-NEXT: st1h { z0.s }, p0, [sp, #1, mul vl]1357; CHECK_BE-NEXT: ld1w { z0.d }, p1/z, [sp, #1, mul vl]1358; CHECK_BE-NEXT: addvl sp, sp, #11359; CHECK_BE-NEXT: ldr x29, [sp], #16 // 8-byte Folded Reload1360; CHECK_BE-NEXT: ret1361 %bc = bitcast <vscale x 4 x bfloat> %v to <vscale x 2 x i32>1362 ret <vscale x 2 x i32> %bc1363}1364 1365;1366; bitcast to nxv1i641367;1368 1369define <vscale x 1 x i64> @bitcast_nxv8i8_to_nxv1i64(<vscale x 8 x i8> %v) #0 {1370; CHECK-LABEL: bitcast_nxv8i8_to_nxv1i64:1371; CHECK: // %bb.0:1372; CHECK-NEXT: uzp1 z0.b, z0.b, z0.b1373; CHECK-NEXT: ret1374;1375; CHECK_BE-LABEL: bitcast_nxv8i8_to_nxv1i64:1376; CHECK_BE: // %bb.0:1377; CHECK_BE-NEXT: uzp1 z0.b, z0.b, z0.b1378; CHECK_BE-NEXT: ptrue p0.d1379; CHECK_BE-NEXT: revb z0.d, p0/m, z0.d1380; CHECK_BE-NEXT: ret1381 %bc = bitcast <vscale x 8 x i8> %v to <vscale x 1 x i64>1382 ret <vscale x 1 x i64> %bc1383}1384 1385define <vscale x 1 x i64> @bitcast_nxv4i16_to_nxv1i64(<vscale x 4 x i16> %v) #0 {1386; CHECK-LABEL: bitcast_nxv4i16_to_nxv1i64:1387; CHECK: // %bb.0:1388; CHECK-NEXT: uzp1 z0.h, z0.h, z0.h1389; CHECK-NEXT: ret1390;1391; CHECK_BE-LABEL: bitcast_nxv4i16_to_nxv1i64:1392; CHECK_BE: // %bb.0:1393; CHECK_BE-NEXT: uzp1 z0.h, z0.h, z0.h1394; CHECK_BE-NEXT: ptrue p0.h1395; CHECK_BE-NEXT: revb z0.h, p0/m, z0.h1396; CHECK_BE-NEXT: ptrue p0.d1397; CHECK_BE-NEXT: revb z0.d, p0/m, z0.d1398; CHECK_BE-NEXT: ret1399 %bc = bitcast <vscale x 4 x i16> %v to <vscale x 1 x i64>1400 ret <vscale x 1 x i64> %bc1401}1402 1403define <vscale x 1 x i64> @bitcast_nxv2i32_to_nxv1i64(<vscale x 2 x i32> %v) #0 {1404; CHECK-LABEL: bitcast_nxv2i32_to_nxv1i64:1405; CHECK: // %bb.0:1406; CHECK-NEXT: uzp1 z0.s, z0.s, z0.s1407; CHECK-NEXT: ret1408;1409; CHECK_BE-LABEL: bitcast_nxv2i32_to_nxv1i64:1410; CHECK_BE: // %bb.0:1411; CHECK_BE-NEXT: uzp1 z0.s, z0.s, z0.s1412; CHECK_BE-NEXT: ptrue p0.s1413; CHECK_BE-NEXT: revb z0.s, p0/m, z0.s1414; CHECK_BE-NEXT: ptrue p0.d1415; CHECK_BE-NEXT: revb z0.d, p0/m, z0.d1416; CHECK_BE-NEXT: ret1417 %bc = bitcast <vscale x 2 x i32> %v to <vscale x 1 x i64>1418 ret <vscale x 1 x i64> %bc1419}1420 1421define <vscale x 1 x i64> @bitcast_nxv4f16_to_nxv1i64(<vscale x 4 x half> %v) #0 {1422; CHECK-LABEL: bitcast_nxv4f16_to_nxv1i64:1423; CHECK: // %bb.0:1424; CHECK-NEXT: uzp1 z0.h, z0.h, z0.h1425; CHECK-NEXT: ret1426;1427; CHECK_BE-LABEL: bitcast_nxv4f16_to_nxv1i64:1428; CHECK_BE: // %bb.0:1429; CHECK_BE-NEXT: uzp1 z0.h, z0.h, z0.h1430; CHECK_BE-NEXT: ptrue p0.h1431; CHECK_BE-NEXT: revb z0.h, p0/m, z0.h1432; CHECK_BE-NEXT: ptrue p0.d1433; CHECK_BE-NEXT: revb z0.d, p0/m, z0.d1434; CHECK_BE-NEXT: ret1435 %bc = bitcast <vscale x 4 x half> %v to <vscale x 1 x i64>1436 ret <vscale x 1 x i64> %bc1437}1438 1439define <vscale x 1 x i64> @bitcast_nxv2f32_to_nxv1i64(<vscale x 2 x float> %v) #0 {1440; CHECK-LABEL: bitcast_nxv2f32_to_nxv1i64:1441; CHECK: // %bb.0:1442; CHECK-NEXT: uzp1 z0.s, z0.s, z0.s1443; CHECK-NEXT: ret1444;1445; CHECK_BE-LABEL: bitcast_nxv2f32_to_nxv1i64:1446; CHECK_BE: // %bb.0:1447; CHECK_BE-NEXT: uzp1 z0.s, z0.s, z0.s1448; CHECK_BE-NEXT: ptrue p0.s1449; CHECK_BE-NEXT: revb z0.s, p0/m, z0.s1450; CHECK_BE-NEXT: ptrue p0.d1451; CHECK_BE-NEXT: revb z0.d, p0/m, z0.d1452; CHECK_BE-NEXT: ret1453 %bc = bitcast <vscale x 2 x float> %v to <vscale x 1 x i64>1454 ret <vscale x 1 x i64> %bc1455}1456 1457define <vscale x 1 x i64> @bitcast_nxv1f64_to_nxv1i64(<vscale x 1 x double> %v) #0 {1458; CHECK-LABEL: bitcast_nxv1f64_to_nxv1i64:1459; CHECK: // %bb.0:1460; CHECK-NEXT: ret1461;1462; CHECK_BE-LABEL: bitcast_nxv1f64_to_nxv1i64:1463; CHECK_BE: // %bb.0:1464; CHECK_BE-NEXT: ret1465 %bc = bitcast <vscale x 1 x double> %v to <vscale x 1 x i64>1466 ret <vscale x 1 x i64> %bc1467}1468 1469define <vscale x 1 x i64> @bitcast_nxv4bf16_to_nxv1i64(<vscale x 4 x bfloat> %v) #0 {1470; CHECK-LABEL: bitcast_nxv4bf16_to_nxv1i64:1471; CHECK: // %bb.0:1472; CHECK-NEXT: uzp1 z0.h, z0.h, z0.h1473; CHECK-NEXT: ret1474;1475; CHECK_BE-LABEL: bitcast_nxv4bf16_to_nxv1i64:1476; CHECK_BE: // %bb.0:1477; CHECK_BE-NEXT: uzp1 z0.h, z0.h, z0.h1478; CHECK_BE-NEXT: ptrue p0.h1479; CHECK_BE-NEXT: revb z0.h, p0/m, z0.h1480; CHECK_BE-NEXT: ptrue p0.d1481; CHECK_BE-NEXT: revb z0.d, p0/m, z0.d1482; CHECK_BE-NEXT: ret1483 %bc = bitcast <vscale x 4 x bfloat> %v to <vscale x 1 x i64>1484 ret <vscale x 1 x i64> %bc1485}1486 1487;1488; bitcast to nxv4f161489;1490 1491define <vscale x 4 x half> @bitcast_nxv8i8_to_nxv4f16(<vscale x 8 x i8> %v) #0 {1492; CHECK-LABEL: bitcast_nxv8i8_to_nxv4f16:1493; CHECK: // %bb.0:1494; CHECK-NEXT: str x29, [sp, #-16]! // 8-byte Folded Spill1495; CHECK-NEXT: addvl sp, sp, #-11496; CHECK-NEXT: ptrue p0.h1497; CHECK-NEXT: ptrue p1.s1498; CHECK-NEXT: st1b { z0.h }, p0, [sp, #1, mul vl]1499; CHECK-NEXT: ld1h { z0.s }, p1/z, [sp, #1, mul vl]1500; CHECK-NEXT: addvl sp, sp, #11501; CHECK-NEXT: ldr x29, [sp], #16 // 8-byte Folded Reload1502; CHECK-NEXT: ret1503;1504; CHECK_BE-LABEL: bitcast_nxv8i8_to_nxv4f16:1505; CHECK_BE: // %bb.0:1506; CHECK_BE-NEXT: str x29, [sp, #-16]! // 8-byte Folded Spill1507; CHECK_BE-NEXT: addvl sp, sp, #-11508; CHECK_BE-NEXT: ptrue p0.h1509; CHECK_BE-NEXT: ptrue p1.s1510; CHECK_BE-NEXT: st1b { z0.h }, p0, [sp, #1, mul vl]1511; CHECK_BE-NEXT: ld1h { z0.s }, p1/z, [sp, #1, mul vl]1512; CHECK_BE-NEXT: addvl sp, sp, #11513; CHECK_BE-NEXT: ldr x29, [sp], #16 // 8-byte Folded Reload1514; CHECK_BE-NEXT: ret1515 %bc = bitcast <vscale x 8 x i8> %v to <vscale x 4 x half>1516 ret <vscale x 4 x half> %bc1517}1518 1519define <vscale x 4 x half> @bitcast_nxv4i16_to_nxv4f16(<vscale x 4 x i16> %v) #0 {1520; CHECK-LABEL: bitcast_nxv4i16_to_nxv4f16:1521; CHECK: // %bb.0:1522; CHECK-NEXT: ret1523;1524; CHECK_BE-LABEL: bitcast_nxv4i16_to_nxv4f16:1525; CHECK_BE: // %bb.0:1526; CHECK_BE-NEXT: ptrue p0.s1527; CHECK_BE-NEXT: revb z0.s, p0/m, z0.s1528; CHECK_BE-NEXT: ptrue p0.h1529; CHECK_BE-NEXT: revb z0.h, p0/m, z0.h1530; CHECK_BE-NEXT: ret1531 %bc = bitcast <vscale x 4 x i16> %v to <vscale x 4 x half>1532 ret <vscale x 4 x half> %bc1533}1534 1535define <vscale x 4 x half> @bitcast_nxv2i32_to_nxv4f16(<vscale x 2 x i32> %v) #0 {1536; CHECK-LABEL: bitcast_nxv2i32_to_nxv4f16:1537; CHECK: // %bb.0:1538; CHECK-NEXT: str x29, [sp, #-16]! // 8-byte Folded Spill1539; CHECK-NEXT: addvl sp, sp, #-11540; CHECK-NEXT: ptrue p0.d1541; CHECK-NEXT: ptrue p1.s1542; CHECK-NEXT: st1w { z0.d }, p0, [sp, #1, mul vl]1543; CHECK-NEXT: ld1h { z0.s }, p1/z, [sp, #1, mul vl]1544; CHECK-NEXT: addvl sp, sp, #11545; CHECK-NEXT: ldr x29, [sp], #16 // 8-byte Folded Reload1546; CHECK-NEXT: ret1547;1548; CHECK_BE-LABEL: bitcast_nxv2i32_to_nxv4f16:1549; CHECK_BE: // %bb.0:1550; CHECK_BE-NEXT: str x29, [sp, #-16]! // 8-byte Folded Spill1551; CHECK_BE-NEXT: addvl sp, sp, #-11552; CHECK_BE-NEXT: ptrue p0.d1553; CHECK_BE-NEXT: ptrue p1.s1554; CHECK_BE-NEXT: st1w { z0.d }, p0, [sp, #1, mul vl]1555; CHECK_BE-NEXT: ld1h { z0.s }, p1/z, [sp, #1, mul vl]1556; CHECK_BE-NEXT: addvl sp, sp, #11557; CHECK_BE-NEXT: ldr x29, [sp], #16 // 8-byte Folded Reload1558; CHECK_BE-NEXT: ret1559 %bc = bitcast <vscale x 2 x i32> %v to <vscale x 4 x half>1560 ret <vscale x 4 x half> %bc1561}1562 1563define <vscale x 4 x half> @bitcast_nxv1i64_to_nxv4f16(<vscale x 1 x i64> %v) #0 {1564; CHECK-LABEL: bitcast_nxv1i64_to_nxv4f16:1565; CHECK: // %bb.0:1566; CHECK-NEXT: uunpklo z0.s, z0.h1567; CHECK-NEXT: ret1568;1569; CHECK_BE-LABEL: bitcast_nxv1i64_to_nxv4f16:1570; CHECK_BE: // %bb.0:1571; CHECK_BE-NEXT: ptrue p0.d1572; CHECK_BE-NEXT: revb z0.d, p0/m, z0.d1573; CHECK_BE-NEXT: ptrue p0.h1574; CHECK_BE-NEXT: revb z0.h, p0/m, z0.h1575; CHECK_BE-NEXT: uunpklo z0.s, z0.h1576; CHECK_BE-NEXT: ret1577 %bc = bitcast <vscale x 1 x i64> %v to <vscale x 4 x half>1578 ret <vscale x 4 x half> %bc1579}1580 1581define <vscale x 4 x half> @bitcast_nxv2f32_to_nxv4f16(<vscale x 2 x float> %v) #0 {1582; CHECK-LABEL: bitcast_nxv2f32_to_nxv4f16:1583; CHECK: // %bb.0:1584; CHECK-NEXT: str x29, [sp, #-16]! // 8-byte Folded Spill1585; CHECK-NEXT: addvl sp, sp, #-11586; CHECK-NEXT: ptrue p0.d1587; CHECK-NEXT: ptrue p1.s1588; CHECK-NEXT: st1w { z0.d }, p0, [sp, #1, mul vl]1589; CHECK-NEXT: ld1h { z0.s }, p1/z, [sp, #1, mul vl]1590; CHECK-NEXT: addvl sp, sp, #11591; CHECK-NEXT: ldr x29, [sp], #16 // 8-byte Folded Reload1592; CHECK-NEXT: ret1593;1594; CHECK_BE-LABEL: bitcast_nxv2f32_to_nxv4f16:1595; CHECK_BE: // %bb.0:1596; CHECK_BE-NEXT: str x29, [sp, #-16]! // 8-byte Folded Spill1597; CHECK_BE-NEXT: addvl sp, sp, #-11598; CHECK_BE-NEXT: ptrue p0.d1599; CHECK_BE-NEXT: ptrue p1.s1600; CHECK_BE-NEXT: st1w { z0.d }, p0, [sp, #1, mul vl]1601; CHECK_BE-NEXT: ld1h { z0.s }, p1/z, [sp, #1, mul vl]1602; CHECK_BE-NEXT: addvl sp, sp, #11603; CHECK_BE-NEXT: ldr x29, [sp], #16 // 8-byte Folded Reload1604; CHECK_BE-NEXT: ret1605 %bc = bitcast <vscale x 2 x float> %v to <vscale x 4 x half>1606 ret <vscale x 4 x half> %bc1607}1608 1609define <vscale x 4 x half> @bitcast_nxv1f64_to_nxv4f16(<vscale x 1 x double> %v) #0 {1610; CHECK-LABEL: bitcast_nxv1f64_to_nxv4f16:1611; CHECK: // %bb.0:1612; CHECK-NEXT: uunpklo z0.s, z0.h1613; CHECK-NEXT: ret1614;1615; CHECK_BE-LABEL: bitcast_nxv1f64_to_nxv4f16:1616; CHECK_BE: // %bb.0:1617; CHECK_BE-NEXT: ptrue p0.d1618; CHECK_BE-NEXT: revb z0.d, p0/m, z0.d1619; CHECK_BE-NEXT: ptrue p0.h1620; CHECK_BE-NEXT: revb z0.h, p0/m, z0.h1621; CHECK_BE-NEXT: uunpklo z0.s, z0.h1622; CHECK_BE-NEXT: ret1623 %bc = bitcast <vscale x 1 x double> %v to <vscale x 4 x half>1624 ret <vscale x 4 x half> %bc1625}1626 1627define <vscale x 4 x half> @bitcast_nxv4bf16_to_nxv4f16(<vscale x 4 x bfloat> %v) #0 {1628; CHECK-LABEL: bitcast_nxv4bf16_to_nxv4f16:1629; CHECK: // %bb.0:1630; CHECK-NEXT: ret1631;1632; CHECK_BE-LABEL: bitcast_nxv4bf16_to_nxv4f16:1633; CHECK_BE: // %bb.0:1634; CHECK_BE-NEXT: ret1635 %bc = bitcast <vscale x 4 x bfloat> %v to <vscale x 4 x half>1636 ret <vscale x 4 x half> %bc1637}1638 1639;1640; bitcast to nxv2f321641;1642 1643define <vscale x 2 x float> @bitcast_nxv8i8_to_nxv2f32(<vscale x 8 x i8> %v) #0 {1644; CHECK-LABEL: bitcast_nxv8i8_to_nxv2f32:1645; CHECK: // %bb.0:1646; CHECK-NEXT: str x29, [sp, #-16]! // 8-byte Folded Spill1647; CHECK-NEXT: addvl sp, sp, #-11648; CHECK-NEXT: ptrue p0.h1649; CHECK-NEXT: ptrue p1.d1650; CHECK-NEXT: st1b { z0.h }, p0, [sp, #1, mul vl]1651; CHECK-NEXT: ld1w { z0.d }, p1/z, [sp, #1, mul vl]1652; CHECK-NEXT: addvl sp, sp, #11653; CHECK-NEXT: ldr x29, [sp], #16 // 8-byte Folded Reload1654; CHECK-NEXT: ret1655;1656; CHECK_BE-LABEL: bitcast_nxv8i8_to_nxv2f32:1657; CHECK_BE: // %bb.0:1658; CHECK_BE-NEXT: str x29, [sp, #-16]! // 8-byte Folded Spill1659; CHECK_BE-NEXT: addvl sp, sp, #-11660; CHECK_BE-NEXT: ptrue p0.h1661; CHECK_BE-NEXT: ptrue p1.d1662; CHECK_BE-NEXT: st1b { z0.h }, p0, [sp, #1, mul vl]1663; CHECK_BE-NEXT: ld1w { z0.d }, p1/z, [sp, #1, mul vl]1664; CHECK_BE-NEXT: addvl sp, sp, #11665; CHECK_BE-NEXT: ldr x29, [sp], #16 // 8-byte Folded Reload1666; CHECK_BE-NEXT: ret1667 %bc = bitcast <vscale x 8 x i8> %v to <vscale x 2 x float>1668 ret <vscale x 2 x float> %bc1669}1670 1671define <vscale x 2 x float> @bitcast_nxv4i16_to_nxv2f32(<vscale x 4 x i16> %v) #0 {1672; CHECK-LABEL: bitcast_nxv4i16_to_nxv2f32:1673; CHECK: // %bb.0:1674; CHECK-NEXT: str x29, [sp, #-16]! // 8-byte Folded Spill1675; CHECK-NEXT: addvl sp, sp, #-11676; CHECK-NEXT: ptrue p0.s1677; CHECK-NEXT: ptrue p1.d1678; CHECK-NEXT: st1h { z0.s }, p0, [sp, #1, mul vl]1679; CHECK-NEXT: ld1w { z0.d }, p1/z, [sp, #1, mul vl]1680; CHECK-NEXT: addvl sp, sp, #11681; CHECK-NEXT: ldr x29, [sp], #16 // 8-byte Folded Reload1682; CHECK-NEXT: ret1683;1684; CHECK_BE-LABEL: bitcast_nxv4i16_to_nxv2f32:1685; CHECK_BE: // %bb.0:1686; CHECK_BE-NEXT: str x29, [sp, #-16]! // 8-byte Folded Spill1687; CHECK_BE-NEXT: addvl sp, sp, #-11688; CHECK_BE-NEXT: ptrue p0.s1689; CHECK_BE-NEXT: ptrue p1.d1690; CHECK_BE-NEXT: st1h { z0.s }, p0, [sp, #1, mul vl]1691; CHECK_BE-NEXT: ld1w { z0.d }, p1/z, [sp, #1, mul vl]1692; CHECK_BE-NEXT: addvl sp, sp, #11693; CHECK_BE-NEXT: ldr x29, [sp], #16 // 8-byte Folded Reload1694; CHECK_BE-NEXT: ret1695 %bc = bitcast <vscale x 4 x i16> %v to <vscale x 2 x float>1696 ret <vscale x 2 x float> %bc1697}1698 1699define <vscale x 2 x float> @bitcast_nxv2i32_to_nxv2f32(<vscale x 2 x i32> %v) #0 {1700; CHECK-LABEL: bitcast_nxv2i32_to_nxv2f32:1701; CHECK: // %bb.0:1702; CHECK-NEXT: ret1703;1704; CHECK_BE-LABEL: bitcast_nxv2i32_to_nxv2f32:1705; CHECK_BE: // %bb.0:1706; CHECK_BE-NEXT: ptrue p0.d1707; CHECK_BE-NEXT: revb z0.d, p0/m, z0.d1708; CHECK_BE-NEXT: ptrue p0.s1709; CHECK_BE-NEXT: revb z0.s, p0/m, z0.s1710; CHECK_BE-NEXT: ret1711 %bc = bitcast <vscale x 2 x i32> %v to <vscale x 2 x float>1712 ret <vscale x 2 x float> %bc1713}1714 1715define <vscale x 2 x float> @bitcast_nxv1i64_to_nxv2f32(<vscale x 1 x i64> %v) #0 {1716; CHECK-LABEL: bitcast_nxv1i64_to_nxv2f32:1717; CHECK: // %bb.0:1718; CHECK-NEXT: uunpklo z0.d, z0.s1719; CHECK-NEXT: ret1720;1721; CHECK_BE-LABEL: bitcast_nxv1i64_to_nxv2f32:1722; CHECK_BE: // %bb.0:1723; CHECK_BE-NEXT: ptrue p0.d1724; CHECK_BE-NEXT: revb z0.d, p0/m, z0.d1725; CHECK_BE-NEXT: ptrue p0.s1726; CHECK_BE-NEXT: revb z0.s, p0/m, z0.s1727; CHECK_BE-NEXT: uunpklo z0.d, z0.s1728; CHECK_BE-NEXT: ret1729 %bc = bitcast <vscale x 1 x i64> %v to <vscale x 2 x float>1730 ret <vscale x 2 x float> %bc1731}1732 1733define <vscale x 2 x float> @bitcast_nxv4f16_to_nxv2f32(<vscale x 4 x half> %v) #0 {1734; CHECK-LABEL: bitcast_nxv4f16_to_nxv2f32:1735; CHECK: // %bb.0:1736; CHECK-NEXT: str x29, [sp, #-16]! // 8-byte Folded Spill1737; CHECK-NEXT: addvl sp, sp, #-11738; CHECK-NEXT: ptrue p0.s1739; CHECK-NEXT: ptrue p1.d1740; CHECK-NEXT: st1h { z0.s }, p0, [sp, #1, mul vl]1741; CHECK-NEXT: ld1w { z0.d }, p1/z, [sp, #1, mul vl]1742; CHECK-NEXT: addvl sp, sp, #11743; CHECK-NEXT: ldr x29, [sp], #16 // 8-byte Folded Reload1744; CHECK-NEXT: ret1745;1746; CHECK_BE-LABEL: bitcast_nxv4f16_to_nxv2f32:1747; CHECK_BE: // %bb.0:1748; CHECK_BE-NEXT: str x29, [sp, #-16]! // 8-byte Folded Spill1749; CHECK_BE-NEXT: addvl sp, sp, #-11750; CHECK_BE-NEXT: ptrue p0.s1751; CHECK_BE-NEXT: ptrue p1.d1752; CHECK_BE-NEXT: st1h { z0.s }, p0, [sp, #1, mul vl]1753; CHECK_BE-NEXT: ld1w { z0.d }, p1/z, [sp, #1, mul vl]1754; CHECK_BE-NEXT: addvl sp, sp, #11755; CHECK_BE-NEXT: ldr x29, [sp], #16 // 8-byte Folded Reload1756; CHECK_BE-NEXT: ret1757 %bc = bitcast <vscale x 4 x half> %v to <vscale x 2 x float>1758 ret <vscale x 2 x float> %bc1759}1760 1761define <vscale x 2 x float> @bitcast_nxv1f64_to_nxv2f32(<vscale x 1 x double> %v) #0 {1762; CHECK-LABEL: bitcast_nxv1f64_to_nxv2f32:1763; CHECK: // %bb.0:1764; CHECK-NEXT: uunpklo z0.d, z0.s1765; CHECK-NEXT: ret1766;1767; CHECK_BE-LABEL: bitcast_nxv1f64_to_nxv2f32:1768; CHECK_BE: // %bb.0:1769; CHECK_BE-NEXT: ptrue p0.d1770; CHECK_BE-NEXT: revb z0.d, p0/m, z0.d1771; CHECK_BE-NEXT: ptrue p0.s1772; CHECK_BE-NEXT: revb z0.s, p0/m, z0.s1773; CHECK_BE-NEXT: uunpklo z0.d, z0.s1774; CHECK_BE-NEXT: ret1775 %bc = bitcast <vscale x 1 x double> %v to <vscale x 2 x float>1776 ret <vscale x 2 x float> %bc1777}1778 1779define <vscale x 2 x float> @bitcast_nxv4bf16_to_nxv2f32(<vscale x 4 x bfloat> %v) #0 {1780; CHECK-LABEL: bitcast_nxv4bf16_to_nxv2f32:1781; CHECK: // %bb.0:1782; CHECK-NEXT: str x29, [sp, #-16]! // 8-byte Folded Spill1783; CHECK-NEXT: addvl sp, sp, #-11784; CHECK-NEXT: ptrue p0.s1785; CHECK-NEXT: ptrue p1.d1786; CHECK-NEXT: st1h { z0.s }, p0, [sp, #1, mul vl]1787; CHECK-NEXT: ld1w { z0.d }, p1/z, [sp, #1, mul vl]1788; CHECK-NEXT: addvl sp, sp, #11789; CHECK-NEXT: ldr x29, [sp], #16 // 8-byte Folded Reload1790; CHECK-NEXT: ret1791;1792; CHECK_BE-LABEL: bitcast_nxv4bf16_to_nxv2f32:1793; CHECK_BE: // %bb.0:1794; CHECK_BE-NEXT: str x29, [sp, #-16]! // 8-byte Folded Spill1795; CHECK_BE-NEXT: addvl sp, sp, #-11796; CHECK_BE-NEXT: ptrue p0.s1797; CHECK_BE-NEXT: ptrue p1.d1798; CHECK_BE-NEXT: st1h { z0.s }, p0, [sp, #1, mul vl]1799; CHECK_BE-NEXT: ld1w { z0.d }, p1/z, [sp, #1, mul vl]1800; CHECK_BE-NEXT: addvl sp, sp, #11801; CHECK_BE-NEXT: ldr x29, [sp], #16 // 8-byte Folded Reload1802; CHECK_BE-NEXT: ret1803 %bc = bitcast <vscale x 4 x bfloat> %v to <vscale x 2 x float>1804 ret <vscale x 2 x float> %bc1805}1806 1807;1808; bitcast to nxv1f641809;1810 1811define <vscale x 1 x double> @bitcast_nxv8i8_to_nxv1f64(<vscale x 8 x i8> %v) #0 {1812; CHECK-LABEL: bitcast_nxv8i8_to_nxv1f64:1813; CHECK: // %bb.0:1814; CHECK-NEXT: uzp1 z0.b, z0.b, z0.b1815; CHECK-NEXT: ret1816;1817; CHECK_BE-LABEL: bitcast_nxv8i8_to_nxv1f64:1818; CHECK_BE: // %bb.0:1819; CHECK_BE-NEXT: uzp1 z0.b, z0.b, z0.b1820; CHECK_BE-NEXT: ptrue p0.d1821; CHECK_BE-NEXT: revb z0.d, p0/m, z0.d1822; CHECK_BE-NEXT: ret1823 %bc = bitcast <vscale x 8 x i8> %v to <vscale x 1 x double>1824 ret <vscale x 1 x double> %bc1825}1826 1827define <vscale x 1 x double> @bitcast_nxv4i16_to_nxv1f64(<vscale x 4 x i16> %v) #0 {1828; CHECK-LABEL: bitcast_nxv4i16_to_nxv1f64:1829; CHECK: // %bb.0:1830; CHECK-NEXT: uzp1 z0.h, z0.h, z0.h1831; CHECK-NEXT: ret1832;1833; CHECK_BE-LABEL: bitcast_nxv4i16_to_nxv1f64:1834; CHECK_BE: // %bb.0:1835; CHECK_BE-NEXT: uzp1 z0.h, z0.h, z0.h1836; CHECK_BE-NEXT: ptrue p0.h1837; CHECK_BE-NEXT: revb z0.h, p0/m, z0.h1838; CHECK_BE-NEXT: ptrue p0.d1839; CHECK_BE-NEXT: revb z0.d, p0/m, z0.d1840; CHECK_BE-NEXT: ret1841 %bc = bitcast <vscale x 4 x i16> %v to <vscale x 1 x double>1842 ret <vscale x 1 x double> %bc1843}1844 1845define <vscale x 1 x double> @bitcast_nxv2i32_to_nxv1f64(<vscale x 2 x i32> %v) #0 {1846; CHECK-LABEL: bitcast_nxv2i32_to_nxv1f64:1847; CHECK: // %bb.0:1848; CHECK-NEXT: uzp1 z0.s, z0.s, z0.s1849; CHECK-NEXT: ret1850;1851; CHECK_BE-LABEL: bitcast_nxv2i32_to_nxv1f64:1852; CHECK_BE: // %bb.0:1853; CHECK_BE-NEXT: uzp1 z0.s, z0.s, z0.s1854; CHECK_BE-NEXT: ptrue p0.s1855; CHECK_BE-NEXT: revb z0.s, p0/m, z0.s1856; CHECK_BE-NEXT: ptrue p0.d1857; CHECK_BE-NEXT: revb z0.d, p0/m, z0.d1858; CHECK_BE-NEXT: ret1859 %bc = bitcast <vscale x 2 x i32> %v to <vscale x 1 x double>1860 ret <vscale x 1 x double> %bc1861}1862 1863define <vscale x 1 x double> @bitcast_nxv1i64_to_nxv1f64(<vscale x 1 x i64> %v) #0 {1864; CHECK-LABEL: bitcast_nxv1i64_to_nxv1f64:1865; CHECK: // %bb.0:1866; CHECK-NEXT: ret1867;1868; CHECK_BE-LABEL: bitcast_nxv1i64_to_nxv1f64:1869; CHECK_BE: // %bb.0:1870; CHECK_BE-NEXT: ret1871 %bc = bitcast <vscale x 1 x i64> %v to <vscale x 1 x double>1872 ret <vscale x 1 x double> %bc1873}1874 1875define <vscale x 1 x double> @bitcast_nxv4f16_to_nxv1f64(<vscale x 4 x half> %v) #0 {1876; CHECK-LABEL: bitcast_nxv4f16_to_nxv1f64:1877; CHECK: // %bb.0:1878; CHECK-NEXT: uzp1 z0.h, z0.h, z0.h1879; CHECK-NEXT: ret1880;1881; CHECK_BE-LABEL: bitcast_nxv4f16_to_nxv1f64:1882; CHECK_BE: // %bb.0:1883; CHECK_BE-NEXT: uzp1 z0.h, z0.h, z0.h1884; CHECK_BE-NEXT: ptrue p0.h1885; CHECK_BE-NEXT: revb z0.h, p0/m, z0.h1886; CHECK_BE-NEXT: ptrue p0.d1887; CHECK_BE-NEXT: revb z0.d, p0/m, z0.d1888; CHECK_BE-NEXT: ret1889 %bc = bitcast <vscale x 4 x half> %v to <vscale x 1 x double>1890 ret <vscale x 1 x double> %bc1891}1892 1893define <vscale x 1 x double> @bitcast_nxv2f32_to_nxv1f64(<vscale x 2 x float> %v) #0 {1894; CHECK-LABEL: bitcast_nxv2f32_to_nxv1f64:1895; CHECK: // %bb.0:1896; CHECK-NEXT: uzp1 z0.s, z0.s, z0.s1897; CHECK-NEXT: ret1898;1899; CHECK_BE-LABEL: bitcast_nxv2f32_to_nxv1f64:1900; CHECK_BE: // %bb.0:1901; CHECK_BE-NEXT: uzp1 z0.s, z0.s, z0.s1902; CHECK_BE-NEXT: ptrue p0.s1903; CHECK_BE-NEXT: revb z0.s, p0/m, z0.s1904; CHECK_BE-NEXT: ptrue p0.d1905; CHECK_BE-NEXT: revb z0.d, p0/m, z0.d1906; CHECK_BE-NEXT: ret1907 %bc = bitcast <vscale x 2 x float> %v to <vscale x 1 x double>1908 ret <vscale x 1 x double> %bc1909}1910 1911define <vscale x 1 x double> @bitcast_nxv4bf16_to_nxv1f64(<vscale x 4 x bfloat> %v) #0 {1912; CHECK-LABEL: bitcast_nxv4bf16_to_nxv1f64:1913; CHECK: // %bb.0:1914; CHECK-NEXT: uzp1 z0.h, z0.h, z0.h1915; CHECK-NEXT: ret1916;1917; CHECK_BE-LABEL: bitcast_nxv4bf16_to_nxv1f64:1918; CHECK_BE: // %bb.0:1919; CHECK_BE-NEXT: uzp1 z0.h, z0.h, z0.h1920; CHECK_BE-NEXT: ptrue p0.h1921; CHECK_BE-NEXT: revb z0.h, p0/m, z0.h1922; CHECK_BE-NEXT: ptrue p0.d1923; CHECK_BE-NEXT: revb z0.d, p0/m, z0.d1924; CHECK_BE-NEXT: ret1925 %bc = bitcast <vscale x 4 x bfloat> %v to <vscale x 1 x double>1926 ret <vscale x 1 x double> %bc1927}1928 1929;1930; bitcast to nxv4bf161931;1932 1933define <vscale x 4 x bfloat> @bitcast_nxv8i8_to_nxv4bf16(<vscale x 8 x i8> %v) #0 {1934; CHECK-LABEL: bitcast_nxv8i8_to_nxv4bf16:1935; CHECK: // %bb.0:1936; CHECK-NEXT: str x29, [sp, #-16]! // 8-byte Folded Spill1937; CHECK-NEXT: addvl sp, sp, #-11938; CHECK-NEXT: ptrue p0.h1939; CHECK-NEXT: ptrue p1.s1940; CHECK-NEXT: st1b { z0.h }, p0, [sp, #1, mul vl]1941; CHECK-NEXT: ld1h { z0.s }, p1/z, [sp, #1, mul vl]1942; CHECK-NEXT: addvl sp, sp, #11943; CHECK-NEXT: ldr x29, [sp], #16 // 8-byte Folded Reload1944; CHECK-NEXT: ret1945;1946; CHECK_BE-LABEL: bitcast_nxv8i8_to_nxv4bf16:1947; CHECK_BE: // %bb.0:1948; CHECK_BE-NEXT: str x29, [sp, #-16]! // 8-byte Folded Spill1949; CHECK_BE-NEXT: addvl sp, sp, #-11950; CHECK_BE-NEXT: ptrue p0.h1951; CHECK_BE-NEXT: ptrue p1.s1952; CHECK_BE-NEXT: st1b { z0.h }, p0, [sp, #1, mul vl]1953; CHECK_BE-NEXT: ld1h { z0.s }, p1/z, [sp, #1, mul vl]1954; CHECK_BE-NEXT: addvl sp, sp, #11955; CHECK_BE-NEXT: ldr x29, [sp], #16 // 8-byte Folded Reload1956; CHECK_BE-NEXT: ret1957 %bc = bitcast <vscale x 8 x i8> %v to <vscale x 4 x bfloat>1958 ret <vscale x 4 x bfloat> %bc1959}1960 1961define <vscale x 4 x bfloat> @bitcast_nxv4i16_to_nxv4bf16(<vscale x 4 x i16> %v) #0 {1962; CHECK-LABEL: bitcast_nxv4i16_to_nxv4bf16:1963; CHECK: // %bb.0:1964; CHECK-NEXT: ret1965;1966; CHECK_BE-LABEL: bitcast_nxv4i16_to_nxv4bf16:1967; CHECK_BE: // %bb.0:1968; CHECK_BE-NEXT: ptrue p0.s1969; CHECK_BE-NEXT: revb z0.s, p0/m, z0.s1970; CHECK_BE-NEXT: ptrue p0.h1971; CHECK_BE-NEXT: revb z0.h, p0/m, z0.h1972; CHECK_BE-NEXT: ret1973 %bc = bitcast <vscale x 4 x i16> %v to <vscale x 4 x bfloat>1974 ret <vscale x 4 x bfloat> %bc1975}1976 1977define <vscale x 4 x bfloat> @bitcast_nxv2i32_to_nxv4bf16(<vscale x 2 x i32> %v) #0 {1978; CHECK-LABEL: bitcast_nxv2i32_to_nxv4bf16:1979; CHECK: // %bb.0:1980; CHECK-NEXT: str x29, [sp, #-16]! // 8-byte Folded Spill1981; CHECK-NEXT: addvl sp, sp, #-11982; CHECK-NEXT: ptrue p0.d1983; CHECK-NEXT: ptrue p1.s1984; CHECK-NEXT: st1w { z0.d }, p0, [sp, #1, mul vl]1985; CHECK-NEXT: ld1h { z0.s }, p1/z, [sp, #1, mul vl]1986; CHECK-NEXT: addvl sp, sp, #11987; CHECK-NEXT: ldr x29, [sp], #16 // 8-byte Folded Reload1988; CHECK-NEXT: ret1989;1990; CHECK_BE-LABEL: bitcast_nxv2i32_to_nxv4bf16:1991; CHECK_BE: // %bb.0:1992; CHECK_BE-NEXT: str x29, [sp, #-16]! // 8-byte Folded Spill1993; CHECK_BE-NEXT: addvl sp, sp, #-11994; CHECK_BE-NEXT: ptrue p0.d1995; CHECK_BE-NEXT: ptrue p1.s1996; CHECK_BE-NEXT: st1w { z0.d }, p0, [sp, #1, mul vl]1997; CHECK_BE-NEXT: ld1h { z0.s }, p1/z, [sp, #1, mul vl]1998; CHECK_BE-NEXT: addvl sp, sp, #11999; CHECK_BE-NEXT: ldr x29, [sp], #16 // 8-byte Folded Reload2000; CHECK_BE-NEXT: ret2001 %bc = bitcast <vscale x 2 x i32> %v to <vscale x 4 x bfloat>2002 ret <vscale x 4 x bfloat> %bc2003}2004 2005define <vscale x 4 x bfloat> @bitcast_nxv1i64_to_nxv4bf16(<vscale x 1 x i64> %v) #0 {2006; CHECK-LABEL: bitcast_nxv1i64_to_nxv4bf16:2007; CHECK: // %bb.0:2008; CHECK-NEXT: uunpklo z0.s, z0.h2009; CHECK-NEXT: ret2010;2011; CHECK_BE-LABEL: bitcast_nxv1i64_to_nxv4bf16:2012; CHECK_BE: // %bb.0:2013; CHECK_BE-NEXT: ptrue p0.d2014; CHECK_BE-NEXT: revb z0.d, p0/m, z0.d2015; CHECK_BE-NEXT: ptrue p0.h2016; CHECK_BE-NEXT: revb z0.h, p0/m, z0.h2017; CHECK_BE-NEXT: uunpklo z0.s, z0.h2018; CHECK_BE-NEXT: ret2019 %bc = bitcast <vscale x 1 x i64> %v to <vscale x 4 x bfloat>2020 ret <vscale x 4 x bfloat> %bc2021}2022 2023define <vscale x 4 x bfloat> @bitcast_nxv4f16_to_nxv4bf16(<vscale x 4 x half> %v) #0 {2024; CHECK-LABEL: bitcast_nxv4f16_to_nxv4bf16:2025; CHECK: // %bb.0:2026; CHECK-NEXT: ret2027;2028; CHECK_BE-LABEL: bitcast_nxv4f16_to_nxv4bf16:2029; CHECK_BE: // %bb.0:2030; CHECK_BE-NEXT: ret2031 %bc = bitcast <vscale x 4 x half> %v to <vscale x 4 x bfloat>2032 ret <vscale x 4 x bfloat> %bc2033}2034 2035define <vscale x 4 x bfloat> @bitcast_nxv2f32_to_nxv4bf16(<vscale x 2 x float> %v) #0 {2036; CHECK-LABEL: bitcast_nxv2f32_to_nxv4bf16:2037; CHECK: // %bb.0:2038; CHECK-NEXT: str x29, [sp, #-16]! // 8-byte Folded Spill2039; CHECK-NEXT: addvl sp, sp, #-12040; CHECK-NEXT: ptrue p0.d2041; CHECK-NEXT: ptrue p1.s2042; CHECK-NEXT: st1w { z0.d }, p0, [sp, #1, mul vl]2043; CHECK-NEXT: ld1h { z0.s }, p1/z, [sp, #1, mul vl]2044; CHECK-NEXT: addvl sp, sp, #12045; CHECK-NEXT: ldr x29, [sp], #16 // 8-byte Folded Reload2046; CHECK-NEXT: ret2047;2048; CHECK_BE-LABEL: bitcast_nxv2f32_to_nxv4bf16:2049; CHECK_BE: // %bb.0:2050; CHECK_BE-NEXT: str x29, [sp, #-16]! // 8-byte Folded Spill2051; CHECK_BE-NEXT: addvl sp, sp, #-12052; CHECK_BE-NEXT: ptrue p0.d2053; CHECK_BE-NEXT: ptrue p1.s2054; CHECK_BE-NEXT: st1w { z0.d }, p0, [sp, #1, mul vl]2055; CHECK_BE-NEXT: ld1h { z0.s }, p1/z, [sp, #1, mul vl]2056; CHECK_BE-NEXT: addvl sp, sp, #12057; CHECK_BE-NEXT: ldr x29, [sp], #16 // 8-byte Folded Reload2058; CHECK_BE-NEXT: ret2059 %bc = bitcast <vscale x 2 x float> %v to <vscale x 4 x bfloat>2060 ret <vscale x 4 x bfloat> %bc2061}2062 2063define <vscale x 4 x bfloat> @bitcast_nxv1f64_to_nxv4bf16(<vscale x 1 x double> %v) #0 {2064; CHECK-LABEL: bitcast_nxv1f64_to_nxv4bf16:2065; CHECK: // %bb.0:2066; CHECK-NEXT: uunpklo z0.s, z0.h2067; CHECK-NEXT: ret2068;2069; CHECK_BE-LABEL: bitcast_nxv1f64_to_nxv4bf16:2070; CHECK_BE: // %bb.0:2071; CHECK_BE-NEXT: ptrue p0.d2072; CHECK_BE-NEXT: revb z0.d, p0/m, z0.d2073; CHECK_BE-NEXT: ptrue p0.h2074; CHECK_BE-NEXT: revb z0.h, p0/m, z0.h2075; CHECK_BE-NEXT: uunpklo z0.s, z0.h2076; CHECK_BE-NEXT: ret2077 %bc = bitcast <vscale x 1 x double> %v to <vscale x 4 x bfloat>2078 ret <vscale x 4 x bfloat> %bc2079}2080 2081;2082; bitcast to nxv4i82083;2084 2085define <vscale x 4 x i8> @bitcast_nxv2i16_to_nxv4i8(<vscale x 2 x i16> %v) #0 {2086; CHECK-LABEL: bitcast_nxv2i16_to_nxv4i8:2087; CHECK: // %bb.0:2088; CHECK-NEXT: str x29, [sp, #-16]! // 8-byte Folded Spill2089; CHECK-NEXT: addvl sp, sp, #-12090; CHECK-NEXT: ptrue p0.d2091; CHECK-NEXT: ptrue p1.s2092; CHECK-NEXT: st1h { z0.d }, p0, [sp, #3, mul vl]2093; CHECK-NEXT: ld1b { z0.s }, p1/z, [sp, #3, mul vl]2094; CHECK-NEXT: addvl sp, sp, #12095; CHECK-NEXT: ldr x29, [sp], #16 // 8-byte Folded Reload2096; CHECK-NEXT: ret2097;2098; CHECK_BE-LABEL: bitcast_nxv2i16_to_nxv4i8:2099; CHECK_BE: // %bb.0:2100; CHECK_BE-NEXT: str x29, [sp, #-16]! // 8-byte Folded Spill2101; CHECK_BE-NEXT: addvl sp, sp, #-12102; CHECK_BE-NEXT: ptrue p0.d2103; CHECK_BE-NEXT: ptrue p1.s2104; CHECK_BE-NEXT: st1h { z0.d }, p0, [sp, #3, mul vl]2105; CHECK_BE-NEXT: ld1b { z0.s }, p1/z, [sp, #3, mul vl]2106; CHECK_BE-NEXT: addvl sp, sp, #12107; CHECK_BE-NEXT: ldr x29, [sp], #16 // 8-byte Folded Reload2108; CHECK_BE-NEXT: ret2109 %bc = bitcast <vscale x 2 x i16> %v to <vscale x 4 x i8>2110 ret <vscale x 4 x i8> %bc2111}2112 2113define <vscale x 4 x i8> @bitcast_nxv1i32_to_nxv4i8(<vscale x 1 x i32> %v) #0 {2114; CHECK-LABEL: bitcast_nxv1i32_to_nxv4i8:2115; CHECK: // %bb.0:2116; CHECK-NEXT: uunpklo z0.h, z0.b2117; CHECK-NEXT: uunpklo z0.s, z0.h2118; CHECK-NEXT: ret2119;2120; CHECK_BE-LABEL: bitcast_nxv1i32_to_nxv4i8:2121; CHECK_BE: // %bb.0:2122; CHECK_BE-NEXT: ptrue p0.s2123; CHECK_BE-NEXT: revb z0.s, p0/m, z0.s2124; CHECK_BE-NEXT: uunpklo z0.h, z0.b2125; CHECK_BE-NEXT: uunpklo z0.s, z0.h2126; CHECK_BE-NEXT: ret2127 %bc = bitcast <vscale x 1 x i32> %v to <vscale x 4 x i8>2128 ret <vscale x 4 x i8> %bc2129}2130 2131define <vscale x 4 x i8> @bitcast_nxv2f16_to_nxv4i8(<vscale x 2 x half> %v) #0 {2132; CHECK-LABEL: bitcast_nxv2f16_to_nxv4i8:2133; CHECK: // %bb.0:2134; CHECK-NEXT: str x29, [sp, #-16]! // 8-byte Folded Spill2135; CHECK-NEXT: addvl sp, sp, #-12136; CHECK-NEXT: ptrue p0.d2137; CHECK-NEXT: ptrue p1.s2138; CHECK-NEXT: st1h { z0.d }, p0, [sp, #3, mul vl]2139; CHECK-NEXT: ld1b { z0.s }, p1/z, [sp, #3, mul vl]2140; CHECK-NEXT: addvl sp, sp, #12141; CHECK-NEXT: ldr x29, [sp], #16 // 8-byte Folded Reload2142; CHECK-NEXT: ret2143;2144; CHECK_BE-LABEL: bitcast_nxv2f16_to_nxv4i8:2145; CHECK_BE: // %bb.0:2146; CHECK_BE-NEXT: str x29, [sp, #-16]! // 8-byte Folded Spill2147; CHECK_BE-NEXT: addvl sp, sp, #-12148; CHECK_BE-NEXT: ptrue p0.d2149; CHECK_BE-NEXT: ptrue p1.s2150; CHECK_BE-NEXT: st1h { z0.d }, p0, [sp, #3, mul vl]2151; CHECK_BE-NEXT: ld1b { z0.s }, p1/z, [sp, #3, mul vl]2152; CHECK_BE-NEXT: addvl sp, sp, #12153; CHECK_BE-NEXT: ldr x29, [sp], #16 // 8-byte Folded Reload2154; CHECK_BE-NEXT: ret2155 %bc = bitcast <vscale x 2 x half> %v to <vscale x 4 x i8>2156 ret <vscale x 4 x i8> %bc2157}2158 2159; @bitcast_nxv1f32_to_nxv4i8 is missing2160 2161define <vscale x 4 x i8> @bitcast_nxv2bf16_to_nxv4i8(<vscale x 2 x bfloat> %v) #0 {2162; CHECK-LABEL: bitcast_nxv2bf16_to_nxv4i8:2163; CHECK: // %bb.0:2164; CHECK-NEXT: str x29, [sp, #-16]! // 8-byte Folded Spill2165; CHECK-NEXT: addvl sp, sp, #-12166; CHECK-NEXT: ptrue p0.d2167; CHECK-NEXT: ptrue p1.s2168; CHECK-NEXT: st1h { z0.d }, p0, [sp, #3, mul vl]2169; CHECK-NEXT: ld1b { z0.s }, p1/z, [sp, #3, mul vl]2170; CHECK-NEXT: addvl sp, sp, #12171; CHECK-NEXT: ldr x29, [sp], #16 // 8-byte Folded Reload2172; CHECK-NEXT: ret2173;2174; CHECK_BE-LABEL: bitcast_nxv2bf16_to_nxv4i8:2175; CHECK_BE: // %bb.0:2176; CHECK_BE-NEXT: str x29, [sp, #-16]! // 8-byte Folded Spill2177; CHECK_BE-NEXT: addvl sp, sp, #-12178; CHECK_BE-NEXT: ptrue p0.d2179; CHECK_BE-NEXT: ptrue p1.s2180; CHECK_BE-NEXT: st1h { z0.d }, p0, [sp, #3, mul vl]2181; CHECK_BE-NEXT: ld1b { z0.s }, p1/z, [sp, #3, mul vl]2182; CHECK_BE-NEXT: addvl sp, sp, #12183; CHECK_BE-NEXT: ldr x29, [sp], #16 // 8-byte Folded Reload2184; CHECK_BE-NEXT: ret2185 %bc = bitcast <vscale x 2 x bfloat> %v to <vscale x 4 x i8>2186 ret <vscale x 4 x i8> %bc2187}2188 2189;2190; bitcast to nxv2i162191;2192 2193define <vscale x 2 x i16> @bitcast_nxv4i8_to_nxv2i16(<vscale x 4 x i8> %v) #0 {2194; CHECK-LABEL: bitcast_nxv4i8_to_nxv2i16:2195; CHECK: // %bb.0:2196; CHECK-NEXT: str x29, [sp, #-16]! // 8-byte Folded Spill2197; CHECK-NEXT: addvl sp, sp, #-12198; CHECK-NEXT: ptrue p0.s2199; CHECK-NEXT: ptrue p1.d2200; CHECK-NEXT: st1b { z0.s }, p0, [sp, #3, mul vl]2201; CHECK-NEXT: ld1h { z0.d }, p1/z, [sp, #3, mul vl]2202; CHECK-NEXT: addvl sp, sp, #12203; CHECK-NEXT: ldr x29, [sp], #16 // 8-byte Folded Reload2204; CHECK-NEXT: ret2205;2206; CHECK_BE-LABEL: bitcast_nxv4i8_to_nxv2i16:2207; CHECK_BE: // %bb.0:2208; CHECK_BE-NEXT: str x29, [sp, #-16]! // 8-byte Folded Spill2209; CHECK_BE-NEXT: addvl sp, sp, #-12210; CHECK_BE-NEXT: ptrue p0.s2211; CHECK_BE-NEXT: ptrue p1.d2212; CHECK_BE-NEXT: st1b { z0.s }, p0, [sp, #3, mul vl]2213; CHECK_BE-NEXT: ld1h { z0.d }, p1/z, [sp, #3, mul vl]2214; CHECK_BE-NEXT: addvl sp, sp, #12215; CHECK_BE-NEXT: ldr x29, [sp], #16 // 8-byte Folded Reload2216; CHECK_BE-NEXT: ret2217 %bc = bitcast <vscale x 4 x i8> %v to <vscale x 2 x i16>2218 ret <vscale x 2 x i16> %bc2219}2220 2221define <vscale x 2 x i16> @bitcast_nxv1i32_to_nxv2i16(<vscale x 1 x i32> %v) #0 {2222; CHECK-LABEL: bitcast_nxv1i32_to_nxv2i16:2223; CHECK: // %bb.0:2224; CHECK-NEXT: uunpklo z0.s, z0.h2225; CHECK-NEXT: uunpklo z0.d, z0.s2226; CHECK-NEXT: ret2227;2228; CHECK_BE-LABEL: bitcast_nxv1i32_to_nxv2i16:2229; CHECK_BE: // %bb.0:2230; CHECK_BE-NEXT: ptrue p0.s2231; CHECK_BE-NEXT: revb z0.s, p0/m, z0.s2232; CHECK_BE-NEXT: ptrue p0.h2233; CHECK_BE-NEXT: revb z0.h, p0/m, z0.h2234; CHECK_BE-NEXT: uunpklo z0.s, z0.h2235; CHECK_BE-NEXT: uunpklo z0.d, z0.s2236; CHECK_BE-NEXT: ret2237 %bc = bitcast <vscale x 1 x i32> %v to <vscale x 2 x i16>2238 ret <vscale x 2 x i16> %bc2239}2240 2241define <vscale x 2 x i16> @bitcast_nxv2f16_to_nxv2i16(<vscale x 2 x half> %v) #0 {2242; CHECK-LABEL: bitcast_nxv2f16_to_nxv2i16:2243; CHECK: // %bb.0:2244; CHECK-NEXT: ret2245;2246; CHECK_BE-LABEL: bitcast_nxv2f16_to_nxv2i16:2247; CHECK_BE: // %bb.0:2248; CHECK_BE-NEXT: ptrue p0.h2249; CHECK_BE-NEXT: revb z0.h, p0/m, z0.h2250; CHECK_BE-NEXT: ptrue p0.d2251; CHECK_BE-NEXT: revb z0.d, p0/m, z0.d2252; CHECK_BE-NEXT: ret2253 %bc = bitcast <vscale x 2 x half> %v to <vscale x 2 x i16>2254 ret <vscale x 2 x i16> %bc2255}2256 2257; @bitcast_nxv1f32_to_nxv2i16 is missing2258 2259define <vscale x 2 x i16> @bitcast_nxv2bf16_to_nxv2i16(<vscale x 2 x bfloat> %v) #0 {2260; CHECK-LABEL: bitcast_nxv2bf16_to_nxv2i16:2261; CHECK: // %bb.0:2262; CHECK-NEXT: ret2263;2264; CHECK_BE-LABEL: bitcast_nxv2bf16_to_nxv2i16:2265; CHECK_BE: // %bb.0:2266; CHECK_BE-NEXT: ptrue p0.h2267; CHECK_BE-NEXT: revb z0.h, p0/m, z0.h2268; CHECK_BE-NEXT: ptrue p0.d2269; CHECK_BE-NEXT: revb z0.d, p0/m, z0.d2270; CHECK_BE-NEXT: ret2271 %bc = bitcast <vscale x 2 x bfloat> %v to <vscale x 2 x i16>2272 ret <vscale x 2 x i16> %bc2273}2274 2275;2276; bitcast to nxv1i322277;2278 2279define <vscale x 1 x i32> @bitcast_nxv4i8_to_nxv1i32(<vscale x 4 x i8> %v) #0 {2280; CHECK-LABEL: bitcast_nxv4i8_to_nxv1i32:2281; CHECK: // %bb.0:2282; CHECK-NEXT: uzp1 z0.h, z0.h, z0.h2283; CHECK-NEXT: uzp1 z0.b, z0.b, z0.b2284; CHECK-NEXT: ret2285;2286; CHECK_BE-LABEL: bitcast_nxv4i8_to_nxv1i32:2287; CHECK_BE: // %bb.0:2288; CHECK_BE-NEXT: uzp1 z0.h, z0.h, z0.h2289; CHECK_BE-NEXT: ptrue p0.s2290; CHECK_BE-NEXT: uzp1 z0.b, z0.b, z0.b2291; CHECK_BE-NEXT: revb z0.s, p0/m, z0.s2292; CHECK_BE-NEXT: ret2293 %bc = bitcast <vscale x 4 x i8> %v to <vscale x 1 x i32>2294 ret <vscale x 1 x i32> %bc2295}2296 2297define <vscale x 1 x i32> @bitcast_nxv2i16_to_nxv1i32(<vscale x 2 x i16> %v) #0 {2298; CHECK-LABEL: bitcast_nxv2i16_to_nxv1i32:2299; CHECK: // %bb.0:2300; CHECK-NEXT: uzp1 z0.s, z0.s, z0.s2301; CHECK-NEXT: uzp1 z0.h, z0.h, z0.h2302; CHECK-NEXT: ret2303;2304; CHECK_BE-LABEL: bitcast_nxv2i16_to_nxv1i32:2305; CHECK_BE: // %bb.0:2306; CHECK_BE-NEXT: uzp1 z0.s, z0.s, z0.s2307; CHECK_BE-NEXT: ptrue p0.h2308; CHECK_BE-NEXT: uzp1 z0.h, z0.h, z0.h2309; CHECK_BE-NEXT: revb z0.h, p0/m, z0.h2310; CHECK_BE-NEXT: ptrue p0.s2311; CHECK_BE-NEXT: revb z0.s, p0/m, z0.s2312; CHECK_BE-NEXT: ret2313 %bc = bitcast <vscale x 2 x i16> %v to <vscale x 1 x i32>2314 ret <vscale x 1 x i32> %bc2315}2316 2317define <vscale x 1 x i32> @bitcast_nxv2f16_to_nxv1i32(<vscale x 2 x half> %v) #0 {2318; CHECK-LABEL: bitcast_nxv2f16_to_nxv1i32:2319; CHECK: // %bb.0:2320; CHECK-NEXT: uzp1 z0.h, z0.h, z0.h2321; CHECK-NEXT: uzp1 z0.h, z0.h, z0.h2322; CHECK-NEXT: ret2323;2324; CHECK_BE-LABEL: bitcast_nxv2f16_to_nxv1i32:2325; CHECK_BE: // %bb.0:2326; CHECK_BE-NEXT: uzp1 z0.h, z0.h, z0.h2327; CHECK_BE-NEXT: ptrue p0.h2328; CHECK_BE-NEXT: uzp1 z0.h, z0.h, z0.h2329; CHECK_BE-NEXT: revb z0.h, p0/m, z0.h2330; CHECK_BE-NEXT: ptrue p0.s2331; CHECK_BE-NEXT: revb z0.s, p0/m, z0.s2332; CHECK_BE-NEXT: ret2333 %bc = bitcast <vscale x 2 x half> %v to <vscale x 1 x i32>2334 ret <vscale x 1 x i32> %bc2335}2336 2337; @bitcast_nxv1f32_to_nxv1i32 is missing2338 2339define <vscale x 1 x i32> @bitcast_nxv2bf16_to_nxv1i32(<vscale x 2 x bfloat> %v) #0 {2340; CHECK-LABEL: bitcast_nxv2bf16_to_nxv1i32:2341; CHECK: // %bb.0:2342; CHECK-NEXT: uzp1 z0.h, z0.h, z0.h2343; CHECK-NEXT: uzp1 z0.h, z0.h, z0.h2344; CHECK-NEXT: ret2345;2346; CHECK_BE-LABEL: bitcast_nxv2bf16_to_nxv1i32:2347; CHECK_BE: // %bb.0:2348; CHECK_BE-NEXT: uzp1 z0.h, z0.h, z0.h2349; CHECK_BE-NEXT: ptrue p0.h2350; CHECK_BE-NEXT: uzp1 z0.h, z0.h, z0.h2351; CHECK_BE-NEXT: revb z0.h, p0/m, z0.h2352; CHECK_BE-NEXT: ptrue p0.s2353; CHECK_BE-NEXT: revb z0.s, p0/m, z0.s2354; CHECK_BE-NEXT: ret2355 %bc = bitcast <vscale x 2 x bfloat> %v to <vscale x 1 x i32>2356 ret <vscale x 1 x i32> %bc2357}2358 2359;2360; bitcast to nxv2f162361;2362 2363define <vscale x 2 x half> @bitcast_nxv4i8_to_nxv2f16(<vscale x 4 x i8> %v) #0 {2364; CHECK-LABEL: bitcast_nxv4i8_to_nxv2f16:2365; CHECK: // %bb.0:2366; CHECK-NEXT: str x29, [sp, #-16]! // 8-byte Folded Spill2367; CHECK-NEXT: addvl sp, sp, #-12368; CHECK-NEXT: ptrue p0.s2369; CHECK-NEXT: ptrue p1.d2370; CHECK-NEXT: st1b { z0.s }, p0, [sp, #3, mul vl]2371; CHECK-NEXT: ld1h { z0.d }, p1/z, [sp, #3, mul vl]2372; CHECK-NEXT: addvl sp, sp, #12373; CHECK-NEXT: ldr x29, [sp], #16 // 8-byte Folded Reload2374; CHECK-NEXT: ret2375;2376; CHECK_BE-LABEL: bitcast_nxv4i8_to_nxv2f16:2377; CHECK_BE: // %bb.0:2378; CHECK_BE-NEXT: str x29, [sp, #-16]! // 8-byte Folded Spill2379; CHECK_BE-NEXT: addvl sp, sp, #-12380; CHECK_BE-NEXT: ptrue p0.s2381; CHECK_BE-NEXT: ptrue p1.d2382; CHECK_BE-NEXT: st1b { z0.s }, p0, [sp, #3, mul vl]2383; CHECK_BE-NEXT: ld1h { z0.d }, p1/z, [sp, #3, mul vl]2384; CHECK_BE-NEXT: addvl sp, sp, #12385; CHECK_BE-NEXT: ldr x29, [sp], #16 // 8-byte Folded Reload2386; CHECK_BE-NEXT: ret2387 %bc = bitcast <vscale x 4 x i8> %v to <vscale x 2 x half>2388 ret <vscale x 2 x half> %bc2389}2390 2391define <vscale x 2 x half> @bitcast_nxv2i16_to_nxv2f16(<vscale x 2 x i16> %v) #0 {2392; CHECK-LABEL: bitcast_nxv2i16_to_nxv2f16:2393; CHECK: // %bb.0:2394; CHECK-NEXT: ret2395;2396; CHECK_BE-LABEL: bitcast_nxv2i16_to_nxv2f16:2397; CHECK_BE: // %bb.0:2398; CHECK_BE-NEXT: ptrue p0.d2399; CHECK_BE-NEXT: revb z0.d, p0/m, z0.d2400; CHECK_BE-NEXT: ptrue p0.h2401; CHECK_BE-NEXT: revb z0.h, p0/m, z0.h2402; CHECK_BE-NEXT: ret2403 %bc = bitcast <vscale x 2 x i16> %v to <vscale x 2 x half>2404 ret <vscale x 2 x half> %bc2405}2406 2407; @bitcast_nxv1i32_to_nxv2f16 is missing2408; @bitcast_nxv1f32_to_nxv2f16 is missing2409 2410define <vscale x 2 x half> @bitcast_nxv2bf16_to_nxv2f16(<vscale x 2 x bfloat> %v) #0 {2411; CHECK-LABEL: bitcast_nxv2bf16_to_nxv2f16:2412; CHECK: // %bb.0:2413; CHECK-NEXT: ret2414;2415; CHECK_BE-LABEL: bitcast_nxv2bf16_to_nxv2f16:2416; CHECK_BE: // %bb.0:2417; CHECK_BE-NEXT: ret2418 %bc = bitcast <vscale x 2 x bfloat> %v to <vscale x 2 x half>2419 ret <vscale x 2 x half> %bc2420}2421 2422;2423; bitcast to nxv1f322424;2425 2426; @bitcast_nxv4i8_to_nxv1f32 is missing2427; @bitcast_nxv2i16_to_nxv1f32 is missing2428; @bitcast_nxv1i32_to_nxv1f32 is missing2429; @bitcast_nxv2f16_to_nxv1f32 is missing2430; @bitcast_nxv2bf16_to_nxv1f32 is missing2431 2432;2433; bitcast to nxv2bf162434;2435 2436define <vscale x 2 x bfloat> @bitcast_nxv4i8_to_nxv2bf16(<vscale x 4 x i8> %v) #0 {2437; CHECK-LABEL: bitcast_nxv4i8_to_nxv2bf16:2438; CHECK: // %bb.0:2439; CHECK-NEXT: str x29, [sp, #-16]! // 8-byte Folded Spill2440; CHECK-NEXT: addvl sp, sp, #-12441; CHECK-NEXT: ptrue p0.s2442; CHECK-NEXT: ptrue p1.d2443; CHECK-NEXT: st1b { z0.s }, p0, [sp, #3, mul vl]2444; CHECK-NEXT: ld1h { z0.d }, p1/z, [sp, #3, mul vl]2445; CHECK-NEXT: addvl sp, sp, #12446; CHECK-NEXT: ldr x29, [sp], #16 // 8-byte Folded Reload2447; CHECK-NEXT: ret2448;2449; CHECK_BE-LABEL: bitcast_nxv4i8_to_nxv2bf16:2450; CHECK_BE: // %bb.0:2451; CHECK_BE-NEXT: str x29, [sp, #-16]! // 8-byte Folded Spill2452; CHECK_BE-NEXT: addvl sp, sp, #-12453; CHECK_BE-NEXT: ptrue p0.s2454; CHECK_BE-NEXT: ptrue p1.d2455; CHECK_BE-NEXT: st1b { z0.s }, p0, [sp, #3, mul vl]2456; CHECK_BE-NEXT: ld1h { z0.d }, p1/z, [sp, #3, mul vl]2457; CHECK_BE-NEXT: addvl sp, sp, #12458; CHECK_BE-NEXT: ldr x29, [sp], #16 // 8-byte Folded Reload2459; CHECK_BE-NEXT: ret2460 %bc = bitcast <vscale x 4 x i8> %v to <vscale x 2 x bfloat>2461 ret <vscale x 2 x bfloat> %bc2462}2463 2464define <vscale x 2 x bfloat> @bitcast_nxv2i16_to_nxv2bf16(<vscale x 2 x i16> %v) #0 {2465; CHECK-LABEL: bitcast_nxv2i16_to_nxv2bf16:2466; CHECK: // %bb.0:2467; CHECK-NEXT: ret2468;2469; CHECK_BE-LABEL: bitcast_nxv2i16_to_nxv2bf16:2470; CHECK_BE: // %bb.0:2471; CHECK_BE-NEXT: ptrue p0.d2472; CHECK_BE-NEXT: revb z0.d, p0/m, z0.d2473; CHECK_BE-NEXT: ptrue p0.h2474; CHECK_BE-NEXT: revb z0.h, p0/m, z0.h2475; CHECK_BE-NEXT: ret2476 %bc = bitcast <vscale x 2 x i16> %v to <vscale x 2 x bfloat>2477 ret <vscale x 2 x bfloat> %bc2478}2479 2480; @bitcast_nxv1i32_to_nxv2bf16 is missing2481 2482define <vscale x 2 x bfloat> @bitcast_nxv2f16_to_nxv2bf16(<vscale x 2 x half> %v) #0 {2483; CHECK-LABEL: bitcast_nxv2f16_to_nxv2bf16:2484; CHECK: // %bb.0:2485; CHECK-NEXT: ret2486;2487; CHECK_BE-LABEL: bitcast_nxv2f16_to_nxv2bf16:2488; CHECK_BE: // %bb.0:2489; CHECK_BE-NEXT: ret2490 %bc = bitcast <vscale x 2 x half> %v to <vscale x 2 x bfloat>2491 ret <vscale x 2 x bfloat> %bc2492}2493 2494; @bitcast_nxv1f32_to_nxv2bf16 is missing2495 2496;2497; bitcast to nxv2i82498;2499 2500define <vscale x 2 x i8> @bitcast_nxv1i16_to_nxv2i8(<vscale x 1 x i16> %v) #0 {2501; CHECK-LABEL: bitcast_nxv1i16_to_nxv2i8:2502; CHECK: // %bb.0:2503; CHECK-NEXT: uunpklo z0.h, z0.b2504; CHECK-NEXT: uunpklo z0.s, z0.h2505; CHECK-NEXT: uunpklo z0.d, z0.s2506; CHECK-NEXT: ret2507;2508; CHECK_BE-LABEL: bitcast_nxv1i16_to_nxv2i8:2509; CHECK_BE: // %bb.0:2510; CHECK_BE-NEXT: ptrue p0.h2511; CHECK_BE-NEXT: revb z0.h, p0/m, z0.h2512; CHECK_BE-NEXT: uunpklo z0.h, z0.b2513; CHECK_BE-NEXT: uunpklo z0.s, z0.h2514; CHECK_BE-NEXT: uunpklo z0.d, z0.s2515; CHECK_BE-NEXT: ret2516 %bc = bitcast <vscale x 1 x i16> %v to <vscale x 2 x i8>2517 ret <vscale x 2 x i8> %bc2518}2519 2520; @bitcast_nxv1f16_to_nxv2i8 is missing2521; @bitcast_nxv1bf16_to_nxv2i8 is missing2522 2523;2524; bitcast to nxv1i162525;2526 2527define <vscale x 1 x i16> @bitcast_nxv2i8_to_nxv1i16(<vscale x 2 x i8> %v) #0 {2528; CHECK-LABEL: bitcast_nxv2i8_to_nxv1i16:2529; CHECK: // %bb.0:2530; CHECK-NEXT: uzp1 z0.s, z0.s, z0.s2531; CHECK-NEXT: uzp1 z0.h, z0.h, z0.h2532; CHECK-NEXT: uzp1 z0.b, z0.b, z0.b2533; CHECK-NEXT: ret2534;2535; CHECK_BE-LABEL: bitcast_nxv2i8_to_nxv1i16:2536; CHECK_BE: // %bb.0:2537; CHECK_BE-NEXT: uzp1 z0.s, z0.s, z0.s2538; CHECK_BE-NEXT: ptrue p0.h2539; CHECK_BE-NEXT: uzp1 z0.h, z0.h, z0.h2540; CHECK_BE-NEXT: uzp1 z0.b, z0.b, z0.b2541; CHECK_BE-NEXT: revb z0.h, p0/m, z0.h2542; CHECK_BE-NEXT: ret2543 %bc = bitcast <vscale x 2 x i8> %v to <vscale x 1 x i16>2544 ret <vscale x 1 x i16> %bc2545}2546 2547; @bitcast_nxv1f16_to_nxv1i16 is missing2548; @bitcast_nxv1bf16_to_nxv1i16 is missing2549 2550;2551; bitcast to nxv1f162552;2553 2554; @bitcast_nxv2i8_to_nxv1f16 is missing2555; @bitcast_nxv1i16_to_nxv1f16 is missing2556; @bitcast_nxv1bf16_to_nxv1f16 is missing2557 2558;2559; bitcast to nxv1bf162560;2561 2562; @bitcast_nxv2i8_to_nxv1bf16 is missing2563; @bitcast_nxv1i16_to_nxv1bf16 is missing2564; @bitcast_nxv1f16_to_nxv1bf16 is missing2565 2566;2567; Other2568;2569 2570define <vscale x 2 x i32> @bitcast_short_float_to_i32(<vscale x 2 x double> %v) #0 {2571; CHECK-LABEL: bitcast_short_float_to_i32:2572; CHECK: // %bb.0:2573; CHECK-NEXT: ptrue p0.d2574; CHECK-NEXT: fcvt z0.s, p0/m, z0.d2575; CHECK-NEXT: ret2576;2577; CHECK_BE-LABEL: bitcast_short_float_to_i32:2578; CHECK_BE: // %bb.0:2579; CHECK_BE-NEXT: ptrue p0.d2580; CHECK_BE-NEXT: ptrue p1.s2581; CHECK_BE-NEXT: fcvt z0.s, p0/m, z0.d2582; CHECK_BE-NEXT: revb z0.s, p1/m, z0.s2583; CHECK_BE-NEXT: revb z0.d, p0/m, z0.d2584; CHECK_BE-NEXT: ret2585 %trunc = fptrunc <vscale x 2 x double> %v to <vscale x 2 x float>2586 %bitcast = bitcast <vscale x 2 x float> %trunc to <vscale x 2 x i32>2587 ret <vscale x 2 x i32> %bitcast2588}2589 2590define <vscale x 2 x double> @bitcast_short_i32_to_float(<vscale x 2 x i64> %v) #0 {2591; CHECK-LABEL: bitcast_short_i32_to_float:2592; CHECK: // %bb.0:2593; CHECK-NEXT: ptrue p0.d2594; CHECK-NEXT: fcvt z0.d, p0/m, z0.s2595; CHECK-NEXT: ret2596;2597; CHECK_BE-LABEL: bitcast_short_i32_to_float:2598; CHECK_BE: // %bb.0:2599; CHECK_BE-NEXT: ptrue p0.d2600; CHECK_BE-NEXT: ptrue p1.s2601; CHECK_BE-NEXT: revb z0.d, p0/m, z0.d2602; CHECK_BE-NEXT: revb z0.s, p1/m, z0.s2603; CHECK_BE-NEXT: fcvt z0.d, p0/m, z0.s2604; CHECK_BE-NEXT: ret2605 %trunc = trunc <vscale x 2 x i64> %v to <vscale x 2 x i32>2606 %bitcast = bitcast <vscale x 2 x i32> %trunc to <vscale x 2 x float>2607 %extended = fpext <vscale x 2 x float> %bitcast to <vscale x 2 x double>2608 ret <vscale x 2 x double> %extended2609}2610 2611define <vscale x 2 x float> @bitcast_short_half_to_float(<vscale x 4 x half> %v) #0 {2612; CHECK-LABEL: bitcast_short_half_to_float:2613; CHECK: // %bb.0:2614; CHECK-NEXT: str x29, [sp, #-16]! // 8-byte Folded Spill2615; CHECK-NEXT: addvl sp, sp, #-12616; CHECK-NEXT: ptrue p0.s2617; CHECK-NEXT: ptrue p1.d2618; CHECK-NEXT: fadd z0.h, p0/m, z0.h, z0.h2619; CHECK-NEXT: st1h { z0.s }, p0, [sp, #1, mul vl]2620; CHECK-NEXT: ld1w { z0.d }, p1/z, [sp, #1, mul vl]2621; CHECK-NEXT: addvl sp, sp, #12622; CHECK-NEXT: ldr x29, [sp], #16 // 8-byte Folded Reload2623; CHECK-NEXT: ret2624;2625; CHECK_BE-LABEL: bitcast_short_half_to_float:2626; CHECK_BE: // %bb.0:2627; CHECK_BE-NEXT: str x29, [sp, #-16]! // 8-byte Folded Spill2628; CHECK_BE-NEXT: addvl sp, sp, #-12629; CHECK_BE-NEXT: ptrue p0.s2630; CHECK_BE-NEXT: ptrue p1.d2631; CHECK_BE-NEXT: fadd z0.h, p0/m, z0.h, z0.h2632; CHECK_BE-NEXT: st1h { z0.s }, p0, [sp, #1, mul vl]2633; CHECK_BE-NEXT: ld1w { z0.d }, p1/z, [sp, #1, mul vl]2634; CHECK_BE-NEXT: addvl sp, sp, #12635; CHECK_BE-NEXT: ldr x29, [sp], #16 // 8-byte Folded Reload2636; CHECK_BE-NEXT: ret2637 %add = fadd <vscale x 4 x half> %v, %v2638 %bitcast = bitcast <vscale x 4 x half> %add to <vscale x 2 x float>2639 ret <vscale x 2 x float> %bitcast2640}2641 2642; +bf16 is required for the bfloat version.2643attributes #0 = { nounwind "target-features"="+sve,+bf16" }2644