634 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 52; RUN: llc -mattr=+sve,+bf16 < %s | FileCheck %s -check-prefixes=CHECK,SVE3; RUN: llc -mattr=+sve2p2,+bf16 < %s | FileCheck %s -check-prefix CHECK-2p24; RUN: llc -mattr=+sve,+sme2p2,+bf16 < %s | FileCheck %s -check-prefix CHECK-2p25 6; RUN: llc -mattr=+sme,+bf16 -force-streaming < %s | FileCheck %s -check-prefixes=CHECK,STREAMING-SVE7; RUN: llc -mattr=+sme2p2,+bf16 -force-streaming < %s | FileCheck %s -check-prefix CHECK-2p28; RUN: llc -mattr=+sme,+sve2p2,+bf16 -force-streaming < %s | FileCheck %s -check-prefix CHECK-2p29 10target triple = "aarch64-linux"11 12define <vscale x 8 x half> @test_svcvt_f16_f32_x_1(<vscale x 4 x i1> %pg, <vscale x 4 x float> %x) {13; CHECK-LABEL: test_svcvt_f16_f32_x_1:14; CHECK: // %bb.0: // %entry15; CHECK-NEXT: fcvt z0.h, p0/m, z0.s16; CHECK-NEXT: ret17;18; CHECK-2p2-LABEL: test_svcvt_f16_f32_x_1:19; CHECK-2p2: // %bb.0: // %entry20; CHECK-2p2-NEXT: fcvt z0.h, p0/z, z0.s21; CHECK-2p2-NEXT: ret22entry:23 %0 = tail call <vscale x 8 x half> @llvm.aarch64.sve.fcvt.f16f32(<vscale x 8 x half> poison, <vscale x 4 x i1> %pg, <vscale x 4 x float> %x)24 ret <vscale x 8 x half> %025}26 27define <vscale x 8 x half> @test_svcvt_f16_f32_x_2(<vscale x 4 x i1> %pg, double %z0, <vscale x 4 x float> %x) {28; CHECK-LABEL: test_svcvt_f16_f32_x_2:29; CHECK: // %bb.0: // %entry30; CHECK-NEXT: fcvt z0.h, p0/m, z1.s31; CHECK-NEXT: ret32;33; CHECK-2p2-LABEL: test_svcvt_f16_f32_x_2:34; CHECK-2p2: // %bb.0: // %entry35; CHECK-2p2-NEXT: fcvt z0.h, p0/z, z1.s36; CHECK-2p2-NEXT: ret37entry:38 %0 = tail call <vscale x 8 x half> @llvm.aarch64.sve.fcvt.f16f32(<vscale x 8 x half> poison, <vscale x 4 x i1> %pg, <vscale x 4 x float> %x)39 ret <vscale x 8 x half> %040}41 42define <vscale x 8 x half> @test_svcvt_f16_f32_z(<vscale x 4 x i1> %pg, double %z0, <vscale x 4 x float> %x) {43; SVE-LABEL: test_svcvt_f16_f32_z:44; SVE: // %bb.0: // %entry45; SVE-NEXT: movi v0.2d, #000000000000000046; SVE-NEXT: fcvt z0.h, p0/m, z1.s47; SVE-NEXT: ret48;49; CHECK-2p2-LABEL: test_svcvt_f16_f32_z:50; CHECK-2p2: // %bb.0: // %entry51; CHECK-2p2-NEXT: fcvt z0.h, p0/z, z1.s52; CHECK-2p2-NEXT: ret53;54; STREAMING-SVE-LABEL: test_svcvt_f16_f32_z:55; STREAMING-SVE: // %bb.0: // %entry56; STREAMING-SVE-NEXT: mov z0.h, #0 // =0x057; STREAMING-SVE-NEXT: fcvt z0.h, p0/m, z1.s58; STREAMING-SVE-NEXT: ret59entry:60 %0 = tail call <vscale x 8 x half> @llvm.aarch64.sve.fcvt.f16f32(<vscale x 8 x half> zeroinitializer, <vscale x 4 x i1> %pg, <vscale x 4 x float> %x)61 ret <vscale x 8 x half> %062}63 64define <vscale x 8 x bfloat> @test_svcvt_bf16_f32_x_1(<vscale x 4 x i1> %pg, <vscale x 4 x float> %x) {65; CHECK-LABEL: test_svcvt_bf16_f32_x_1:66; CHECK: // %bb.0: // %entry67; CHECK-NEXT: bfcvt z0.h, p0/m, z0.s68; CHECK-NEXT: ret69;70; CHECK-2p2-LABEL: test_svcvt_bf16_f32_x_1:71; CHECK-2p2: // %bb.0: // %entry72; CHECK-2p2-NEXT: bfcvt z0.h, p0/z, z0.s73; CHECK-2p2-NEXT: ret74entry:75 %0 = tail call <vscale x 8 x bfloat> @llvm.aarch64.sve.fcvt.bf16f32.v2(<vscale x 8 x bfloat> poison, <vscale x 4 x i1> %pg, <vscale x 4 x float> %x)76 ret <vscale x 8 x bfloat> %077}78 79define <vscale x 8 x bfloat> @test_svcvt_bf16_f32_x_2(<vscale x 4 x i1> %pg, double %z0, <vscale x 4 x float> %x) {80; CHECK-LABEL: test_svcvt_bf16_f32_x_2:81; CHECK: // %bb.0: // %entry82; CHECK-NEXT: bfcvt z0.h, p0/m, z1.s83; CHECK-NEXT: ret84;85; CHECK-2p2-LABEL: test_svcvt_bf16_f32_x_2:86; CHECK-2p2: // %bb.0: // %entry87; CHECK-2p2-NEXT: bfcvt z0.h, p0/z, z1.s88; CHECK-2p2-NEXT: ret89entry:90 %0 = tail call <vscale x 8 x bfloat> @llvm.aarch64.sve.fcvt.bf16f32.v2(<vscale x 8 x bfloat> poison, <vscale x 4 x i1> %pg, <vscale x 4 x float> %x)91 ret <vscale x 8 x bfloat> %092}93 94define <vscale x 8 x bfloat> @test_svcvt_bf16_f32_z(<vscale x 4 x i1> %pg, double %z0, <vscale x 4 x float> %x) {95; SVE-LABEL: test_svcvt_bf16_f32_z:96; SVE: // %bb.0: // %entry97; SVE-NEXT: movi v0.2d, #000000000000000098; SVE-NEXT: bfcvt z0.h, p0/m, z1.s99; SVE-NEXT: ret100;101; CHECK-2p2-LABEL: test_svcvt_bf16_f32_z:102; CHECK-2p2: // %bb.0: // %entry103; CHECK-2p2-NEXT: bfcvt z0.h, p0/z, z1.s104; CHECK-2p2-NEXT: ret105;106; STREAMING-SVE-LABEL: test_svcvt_bf16_f32_z:107; STREAMING-SVE: // %bb.0: // %entry108; STREAMING-SVE-NEXT: mov z0.h, #0 // =0x0109; STREAMING-SVE-NEXT: bfcvt z0.h, p0/m, z1.s110; STREAMING-SVE-NEXT: ret111entry:112 %0 = tail call <vscale x 8 x bfloat> @llvm.aarch64.sve.fcvt.bf16f32.v2(<vscale x 8 x bfloat> zeroinitializer, <vscale x 4 x i1> %pg, <vscale x 4 x float> %x)113 ret <vscale x 8 x bfloat> %0114}115 116define <vscale x 8 x half> @test_svcvt_f16_f64_x_1(<vscale x 2 x i1> %pg, <vscale x 2 x double> %x) {117; CHECK-LABEL: test_svcvt_f16_f64_x_1:118; CHECK: // %bb.0: // %entry119; CHECK-NEXT: fcvt z0.h, p0/m, z0.d120; CHECK-NEXT: ret121;122; CHECK-2p2-LABEL: test_svcvt_f16_f64_x_1:123; CHECK-2p2: // %bb.0: // %entry124; CHECK-2p2-NEXT: fcvt z0.h, p0/z, z0.d125; CHECK-2p2-NEXT: ret126entry:127 %0 = tail call <vscale x 8 x half> @llvm.aarch64.sve.fcvt.f16f64(<vscale x 8 x half> poison, <vscale x 2 x i1> %pg, <vscale x 2 x double> %x)128 ret <vscale x 8 x half> %0129}130 131define <vscale x 8 x half> @test_svcvt_f16_f64_x_2(<vscale x 2 x i1> %pg, double %z0, <vscale x 2 x double> %x) {132; CHECK-LABEL: test_svcvt_f16_f64_x_2:133; CHECK: // %bb.0: // %entry134; CHECK-NEXT: fcvt z0.h, p0/m, z1.d135; CHECK-NEXT: ret136;137; CHECK-2p2-LABEL: test_svcvt_f16_f64_x_2:138; CHECK-2p2: // %bb.0: // %entry139; CHECK-2p2-NEXT: fcvt z0.h, p0/z, z1.d140; CHECK-2p2-NEXT: ret141entry:142 %0 = tail call <vscale x 8 x half> @llvm.aarch64.sve.fcvt.f16f64(<vscale x 8 x half> poison, <vscale x 2 x i1> %pg, <vscale x 2 x double> %x)143 ret <vscale x 8 x half> %0144}145 146define <vscale x 8 x half> @test_svcvt_f16_f64_z(<vscale x 2 x i1> %pg, double %z0, <vscale x 2 x double> %x) {147; SVE-LABEL: test_svcvt_f16_f64_z:148; SVE: // %bb.0: // %entry149; SVE-NEXT: movi v0.2d, #0000000000000000150; SVE-NEXT: fcvt z0.h, p0/m, z1.d151; SVE-NEXT: ret152;153; CHECK-2p2-LABEL: test_svcvt_f16_f64_z:154; CHECK-2p2: // %bb.0: // %entry155; CHECK-2p2-NEXT: fcvt z0.h, p0/z, z1.d156; CHECK-2p2-NEXT: ret157;158; STREAMING-SVE-LABEL: test_svcvt_f16_f64_z:159; STREAMING-SVE: // %bb.0: // %entry160; STREAMING-SVE-NEXT: mov z0.h, #0 // =0x0161; STREAMING-SVE-NEXT: fcvt z0.h, p0/m, z1.d162; STREAMING-SVE-NEXT: ret163entry:164 %0 = tail call <vscale x 8 x half> @llvm.aarch64.sve.fcvt.f16f64(<vscale x 8 x half> zeroinitializer, <vscale x 2 x i1> %pg, <vscale x 2 x double> %x)165 ret <vscale x 8 x half> %0166}167 168define <vscale x 4 x float> @test_svcvt_f32_f64_x_1(<vscale x 2 x i1> %pg, <vscale x 2 x double> %x) {169; CHECK-LABEL: test_svcvt_f32_f64_x_1:170; CHECK: // %bb.0: // %entry171; CHECK-NEXT: fcvt z0.s, p0/m, z0.d172; CHECK-NEXT: ret173;174; CHECK-2p2-LABEL: test_svcvt_f32_f64_x_1:175; CHECK-2p2: // %bb.0: // %entry176; CHECK-2p2-NEXT: fcvt z0.s, p0/z, z0.d177; CHECK-2p2-NEXT: ret178entry:179 %0 = tail call <vscale x 4 x float> @llvm.aarch64.sve.fcvt.f32f64(<vscale x 4 x float> poison, <vscale x 2 x i1> %pg, <vscale x 2 x double> %x)180 ret <vscale x 4 x float> %0181}182 183define <vscale x 4 x float> @test_svcvt_f32_f64_x_2(<vscale x 2 x i1> %pg, double %z0, <vscale x 2 x double> %x) {184; CHECK-LABEL: test_svcvt_f32_f64_x_2:185; CHECK: // %bb.0: // %entry186; CHECK-NEXT: fcvt z0.s, p0/m, z1.d187; CHECK-NEXT: ret188;189; CHECK-2p2-LABEL: test_svcvt_f32_f64_x_2:190; CHECK-2p2: // %bb.0: // %entry191; CHECK-2p2-NEXT: fcvt z0.s, p0/z, z1.d192; CHECK-2p2-NEXT: ret193entry:194 %0 = tail call <vscale x 4 x float> @llvm.aarch64.sve.fcvt.f32f64(<vscale x 4 x float> poison, <vscale x 2 x i1> %pg, <vscale x 2 x double> %x)195 ret <vscale x 4 x float> %0196}197 198define <vscale x 4 x float> @test_svcvt_f32_f64_z(<vscale x 2 x i1> %pg, double %z0, <vscale x 2 x double> %x) {199; SVE-LABEL: test_svcvt_f32_f64_z:200; SVE: // %bb.0: // %entry201; SVE-NEXT: movi v0.2d, #0000000000000000202; SVE-NEXT: fcvt z0.s, p0/m, z1.d203; SVE-NEXT: ret204;205; CHECK-2p2-LABEL: test_svcvt_f32_f64_z:206; CHECK-2p2: // %bb.0: // %entry207; CHECK-2p2-NEXT: fcvt z0.s, p0/z, z1.d208; CHECK-2p2-NEXT: ret209;210; STREAMING-SVE-LABEL: test_svcvt_f32_f64_z:211; STREAMING-SVE: // %bb.0: // %entry212; STREAMING-SVE-NEXT: mov z0.s, #0 // =0x0213; STREAMING-SVE-NEXT: fcvt z0.s, p0/m, z1.d214; STREAMING-SVE-NEXT: ret215entry:216 %0 = tail call <vscale x 4 x float> @llvm.aarch64.sve.fcvt.f32f64(<vscale x 4 x float> zeroinitializer, <vscale x 2 x i1> %pg, <vscale x 2 x double> %x)217 ret <vscale x 4 x float> %0218}219 220define <vscale x 4 x float> @test_svcvt_f32_f16_x_1(<vscale x 4 x i1> %pg, <vscale x 8 x half> %x) {221; CHECK-LABEL: test_svcvt_f32_f16_x_1:222; CHECK: // %bb.0: // %entry223; CHECK-NEXT: fcvt z0.s, p0/m, z0.h224; CHECK-NEXT: ret225;226; CHECK-2p2-LABEL: test_svcvt_f32_f16_x_1:227; CHECK-2p2: // %bb.0: // %entry228; CHECK-2p2-NEXT: fcvt z0.s, p0/z, z0.h229; CHECK-2p2-NEXT: ret230entry:231 %0 = tail call <vscale x 4 x float> @llvm.aarch64.sve.fcvt.f32f16(<vscale x 4 x float> poison, <vscale x 4 x i1> %pg, <vscale x 8 x half> %x)232 ret <vscale x 4 x float> %0233}234 235define <vscale x 4 x float> @test_svcvt_f32_f16_x_2(<vscale x 4 x i1> %pg, double %z0, <vscale x 8 x half> %x) {236; CHECK-LABEL: test_svcvt_f32_f16_x_2:237; CHECK: // %bb.0: // %entry238; CHECK-NEXT: fcvt z0.s, p0/m, z1.h239; CHECK-NEXT: ret240;241; CHECK-2p2-LABEL: test_svcvt_f32_f16_x_2:242; CHECK-2p2: // %bb.0: // %entry243; CHECK-2p2-NEXT: fcvt z0.s, p0/z, z1.h244; CHECK-2p2-NEXT: ret245entry:246 %0 = tail call <vscale x 4 x float> @llvm.aarch64.sve.fcvt.f32f16(<vscale x 4 x float> poison, <vscale x 4 x i1> %pg, <vscale x 8 x half> %x)247 ret <vscale x 4 x float> %0248}249 250define <vscale x 4 x float> @test_svcvt_f32_f16_z(<vscale x 4 x i1> %pg, double %z0, <vscale x 8 x half> %x) {251; SVE-LABEL: test_svcvt_f32_f16_z:252; SVE: // %bb.0: // %entry253; SVE-NEXT: movi v0.2d, #0000000000000000254; SVE-NEXT: fcvt z0.s, p0/m, z1.h255; SVE-NEXT: ret256;257; CHECK-2p2-LABEL: test_svcvt_f32_f16_z:258; CHECK-2p2: // %bb.0: // %entry259; CHECK-2p2-NEXT: fcvt z0.s, p0/z, z1.h260; CHECK-2p2-NEXT: ret261;262; STREAMING-SVE-LABEL: test_svcvt_f32_f16_z:263; STREAMING-SVE: // %bb.0: // %entry264; STREAMING-SVE-NEXT: mov z0.s, #0 // =0x0265; STREAMING-SVE-NEXT: fcvt z0.s, p0/m, z1.h266; STREAMING-SVE-NEXT: ret267entry:268 %0 = tail call <vscale x 4 x float> @llvm.aarch64.sve.fcvt.f32f16(<vscale x 4 x float> zeroinitializer, <vscale x 4 x i1> %pg, <vscale x 8 x half> %x)269 ret <vscale x 4 x float> %0270}271 272define <vscale x 2 x double> @test_svcvt_f64_f16_x_1(<vscale x 2 x i1> %pg, <vscale x 8 x half> %x) {273; CHECK-LABEL: test_svcvt_f64_f16_x_1:274; CHECK: // %bb.0: // %entry275; CHECK-NEXT: fcvt z0.d, p0/m, z0.h276; CHECK-NEXT: ret277;278; CHECK-2p2-LABEL: test_svcvt_f64_f16_x_1:279; CHECK-2p2: // %bb.0: // %entry280; CHECK-2p2-NEXT: fcvt z0.d, p0/z, z0.h281; CHECK-2p2-NEXT: ret282entry:283 %0 = tail call <vscale x 2 x double> @llvm.aarch64.sve.fcvt.f64f16(<vscale x 2 x double> poison, <vscale x 2 x i1> %pg, <vscale x 8 x half> %x)284 ret <vscale x 2 x double> %0285}286 287define <vscale x 2 x double> @test_svcvt_f64_f16_x_2(<vscale x 2 x i1> %pg, double %z0, <vscale x 8 x half> %x) {288; CHECK-LABEL: test_svcvt_f64_f16_x_2:289; CHECK: // %bb.0: // %entry290; CHECK-NEXT: fcvt z0.d, p0/m, z1.h291; CHECK-NEXT: ret292;293; CHECK-2p2-LABEL: test_svcvt_f64_f16_x_2:294; CHECK-2p2: // %bb.0: // %entry295; CHECK-2p2-NEXT: fcvt z0.d, p0/z, z1.h296; CHECK-2p2-NEXT: ret297entry:298 %0 = tail call <vscale x 2 x double> @llvm.aarch64.sve.fcvt.f64f16(<vscale x 2 x double> poison, <vscale x 2 x i1> %pg, <vscale x 8 x half> %x)299 ret <vscale x 2 x double> %0300}301 302define <vscale x 2 x double> @test_svcvt_f64_f16_z(<vscale x 2 x i1> %pg, double %z0, <vscale x 8 x half> %x) {303; SVE-LABEL: test_svcvt_f64_f16_z:304; SVE: // %bb.0: // %entry305; SVE-NEXT: movi v0.2d, #0000000000000000306; SVE-NEXT: fcvt z0.d, p0/m, z1.h307; SVE-NEXT: ret308;309; CHECK-2p2-LABEL: test_svcvt_f64_f16_z:310; CHECK-2p2: // %bb.0: // %entry311; CHECK-2p2-NEXT: fcvt z0.d, p0/z, z1.h312; CHECK-2p2-NEXT: ret313;314; STREAMING-SVE-LABEL: test_svcvt_f64_f16_z:315; STREAMING-SVE: // %bb.0: // %entry316; STREAMING-SVE-NEXT: mov z0.d, #0 // =0x0317; STREAMING-SVE-NEXT: fcvt z0.d, p0/m, z1.h318; STREAMING-SVE-NEXT: ret319entry:320 %0 = tail call <vscale x 2 x double> @llvm.aarch64.sve.fcvt.f64f16(<vscale x 2 x double> zeroinitializer, <vscale x 2 x i1> %pg, <vscale x 8 x half> %x)321 ret <vscale x 2 x double> %0322}323 324define <vscale x 2 x double> @test_svcvt_f64_f32_x_1(<vscale x 2 x i1> %pg, <vscale x 4 x float> %x) {325; CHECK-LABEL: test_svcvt_f64_f32_x_1:326; CHECK: // %bb.0: // %entry327; CHECK-NEXT: fcvt z0.d, p0/m, z0.s328; CHECK-NEXT: ret329;330; CHECK-2p2-LABEL: test_svcvt_f64_f32_x_1:331; CHECK-2p2: // %bb.0: // %entry332; CHECK-2p2-NEXT: fcvt z0.d, p0/z, z0.s333; CHECK-2p2-NEXT: ret334entry:335 %0 = tail call <vscale x 2 x double> @llvm.aarch64.sve.fcvt.f64f32(<vscale x 2 x double> poison, <vscale x 2 x i1> %pg, <vscale x 4 x float> %x)336 ret <vscale x 2 x double> %0337}338 339define <vscale x 2 x double> @test_svcvt_f64_f32_x_2(<vscale x 2 x i1> %pg, double %z0, <vscale x 4 x float> %x) {340; CHECK-LABEL: test_svcvt_f64_f32_x_2:341; CHECK: // %bb.0: // %entry342; CHECK-NEXT: fcvt z0.d, p0/m, z1.s343; CHECK-NEXT: ret344;345; CHECK-2p2-LABEL: test_svcvt_f64_f32_x_2:346; CHECK-2p2: // %bb.0: // %entry347; CHECK-2p2-NEXT: fcvt z0.d, p0/z, z1.s348; CHECK-2p2-NEXT: ret349entry:350 %0 = tail call <vscale x 2 x double> @llvm.aarch64.sve.fcvt.f64f32(<vscale x 2 x double> poison, <vscale x 2 x i1> %pg, <vscale x 4 x float> %x)351 ret <vscale x 2 x double> %0352}353 354define <vscale x 2 x double> @test_svcvt_f64_f32_z(<vscale x 2 x i1> %pg, double %z0, <vscale x 4 x float> %x) {355; SVE-LABEL: test_svcvt_f64_f32_z:356; SVE: // %bb.0: // %entry357; SVE-NEXT: movi v0.2d, #0000000000000000358; SVE-NEXT: fcvt z0.d, p0/m, z1.s359; SVE-NEXT: ret360;361; CHECK-2p2-LABEL: test_svcvt_f64_f32_z:362; CHECK-2p2: // %bb.0: // %entry363; CHECK-2p2-NEXT: fcvt z0.d, p0/z, z1.s364; CHECK-2p2-NEXT: ret365;366; STREAMING-SVE-LABEL: test_svcvt_f64_f32_z:367; STREAMING-SVE: // %bb.0: // %entry368; STREAMING-SVE-NEXT: mov z0.d, #0 // =0x0369; STREAMING-SVE-NEXT: fcvt z0.d, p0/m, z1.s370; STREAMING-SVE-NEXT: ret371entry:372 %0 = tail call <vscale x 2 x double> @llvm.aarch64.sve.fcvt.f64f32(<vscale x 2 x double> zeroinitializer, <vscale x 2 x i1> %pg, <vscale x 4 x float> %x)373 ret <vscale x 2 x double> %0374}375 376define <vscale x 8 x half> @test_svcvt_f16_f32_ptrue_u(double %z0, <vscale x 4 x float> %x) {377; CHECK-LABEL: test_svcvt_f16_f32_ptrue_u:378; CHECK: // %bb.0: // %entry379; CHECK-NEXT: ptrue p0.s380; CHECK-NEXT: fcvt z0.h, p0/m, z1.s381; CHECK-NEXT: ret382;383; CHECK-2p2-LABEL: test_svcvt_f16_f32_ptrue_u:384; CHECK-2p2: // %bb.0: // %entry385; CHECK-2p2-NEXT: ptrue p0.s386; CHECK-2p2-NEXT: fcvt z0.h, p0/z, z1.s387; CHECK-2p2-NEXT: ret388entry:389 %pg = call <vscale x 4 x i1> @llvm.aarch64.sve.ptrue.nxv4i1(i32 31)390 %0 = tail call <vscale x 8 x half> @llvm.aarch64.sve.fcvt.f16f32(<vscale x 8 x half> poison, <vscale x 4 x i1> %pg, <vscale x 4 x float> %x)391 ret <vscale x 8 x half> %0392}393 394define <vscale x 8 x half> @test_svcvt_f16_f32_ptrue(double %z0, <vscale x 8 x half> %x, <vscale x 4 x float> %y ) {395; CHECK-LABEL: test_svcvt_f16_f32_ptrue:396; CHECK: // %bb.0: // %entry397; CHECK-NEXT: mov z0.d, z1.d398; CHECK-NEXT: ptrue p0.s399; CHECK-NEXT: fcvt z0.h, p0/m, z2.s400; CHECK-NEXT: ret401;402; CHECK-2p2-LABEL: test_svcvt_f16_f32_ptrue:403; CHECK-2p2: // %bb.0: // %entry404; CHECK-2p2-NEXT: ptrue p0.s405; CHECK-2p2-NEXT: fcvt z0.h, p0/z, z2.s406; CHECK-2p2-NEXT: ret407entry:408 %pg = call <vscale x 4 x i1> @llvm.aarch64.sve.ptrue.nxv4i1(i32 31)409 %0 = tail call <vscale x 8 x half> @llvm.aarch64.sve.fcvt.f16f32(<vscale x 8 x half> %x, <vscale x 4 x i1> %pg, <vscale x 4 x float> %y)410 ret <vscale x 8 x half> %0411}412 413define <vscale x 8 x bfloat> @test_svcvt_bf16_f32_ptrue_u(double %z0, <vscale x 4 x float> %x) {414; CHECK-LABEL: test_svcvt_bf16_f32_ptrue_u:415; CHECK: // %bb.0: // %entry416; CHECK-NEXT: ptrue p0.s417; CHECK-NEXT: bfcvt z0.h, p0/m, z1.s418; CHECK-NEXT: ret419;420; CHECK-2p2-LABEL: test_svcvt_bf16_f32_ptrue_u:421; CHECK-2p2: // %bb.0: // %entry422; CHECK-2p2-NEXT: ptrue p0.s423; CHECK-2p2-NEXT: bfcvt z0.h, p0/z, z1.s424; CHECK-2p2-NEXT: ret425entry:426 %pg = call <vscale x 4 x i1> @llvm.aarch64.sve.ptrue.nxv4i1(i32 31)427 %0 = tail call <vscale x 8 x bfloat> @llvm.aarch64.sve.fcvt.bf16f32.v2(<vscale x 8 x bfloat> poison, <vscale x 4 x i1> %pg, <vscale x 4 x float> %x)428 ret <vscale x 8 x bfloat> %0429}430 431define <vscale x 8 x bfloat> @test_svcvt_bf16_f32_ptrue(double %z0, <vscale x 8 x bfloat> %x, <vscale x 4 x float> %y ) {432; CHECK-LABEL: test_svcvt_bf16_f32_ptrue:433; CHECK: // %bb.0: // %entry434; CHECK-NEXT: mov z0.d, z1.d435; CHECK-NEXT: ptrue p0.s436; CHECK-NEXT: bfcvt z0.h, p0/m, z2.s437; CHECK-NEXT: ret438;439; CHECK-2p2-LABEL: test_svcvt_bf16_f32_ptrue:440; CHECK-2p2: // %bb.0: // %entry441; CHECK-2p2-NEXT: ptrue p0.s442; CHECK-2p2-NEXT: bfcvt z0.h, p0/z, z2.s443; CHECK-2p2-NEXT: ret444entry:445 %pg = call <vscale x 4 x i1> @llvm.aarch64.sve.ptrue.nxv4i1(i32 31)446 %0 = tail call <vscale x 8 x bfloat> @llvm.aarch64.sve.fcvt.bf16f32.v2(<vscale x 8 x bfloat> %x, <vscale x 4 x i1> %pg, <vscale x 4 x float> %y)447 ret <vscale x 8 x bfloat> %0448}449 450define <vscale x 8 x half> @test_svcvt_f16_f64_ptrue_u(double %z0, <vscale x 2 x double> %x) {451; CHECK-LABEL: test_svcvt_f16_f64_ptrue_u:452; CHECK: // %bb.0: // %entry453; CHECK-NEXT: ptrue p0.d454; CHECK-NEXT: fcvt z0.h, p0/m, z1.d455; CHECK-NEXT: ret456;457; CHECK-2p2-LABEL: test_svcvt_f16_f64_ptrue_u:458; CHECK-2p2: // %bb.0: // %entry459; CHECK-2p2-NEXT: ptrue p0.d460; CHECK-2p2-NEXT: fcvt z0.h, p0/z, z1.d461; CHECK-2p2-NEXT: ret462entry:463 %pg = call <vscale x 2 x i1> @llvm.aarch64.sve.ptrue.nxv2i1(i32 31)464 %0 = tail call <vscale x 8 x half> @llvm.aarch64.sve.fcvt.f16f64(<vscale x 8 x half> poison, <vscale x 2 x i1> %pg, <vscale x 2 x double> %x)465 ret <vscale x 8 x half> %0466}467 468define <vscale x 8 x half> @test_svcvt_f16_f64_ptrue(double %z0, <vscale x 8 x half> %x, <vscale x 2 x double> %y ) {469; CHECK-LABEL: test_svcvt_f16_f64_ptrue:470; CHECK: // %bb.0: // %entry471; CHECK-NEXT: mov z0.d, z1.d472; CHECK-NEXT: ptrue p0.d473; CHECK-NEXT: fcvt z0.h, p0/m, z2.d474; CHECK-NEXT: ret475;476; CHECK-2p2-LABEL: test_svcvt_f16_f64_ptrue:477; CHECK-2p2: // %bb.0: // %entry478; CHECK-2p2-NEXT: ptrue p0.d479; CHECK-2p2-NEXT: fcvt z0.h, p0/z, z2.d480; CHECK-2p2-NEXT: ret481entry:482 %pg = call <vscale x 2 x i1> @llvm.aarch64.sve.ptrue.nxv2i1(i32 31)483 %0 = tail call <vscale x 8 x half> @llvm.aarch64.sve.fcvt.f16f64(<vscale x 8 x half> %x, <vscale x 2 x i1> %pg, <vscale x 2 x double> %y)484 ret <vscale x 8 x half> %0485}486 487define <vscale x 4 x float> @test_svcvt_f32_f64_ptrue_u(double %z0, <vscale x 2 x double> %x) {488; CHECK-LABEL: test_svcvt_f32_f64_ptrue_u:489; CHECK: // %bb.0: // %entry490; CHECK-NEXT: ptrue p0.d491; CHECK-NEXT: fcvt z0.s, p0/m, z1.d492; CHECK-NEXT: ret493;494; CHECK-2p2-LABEL: test_svcvt_f32_f64_ptrue_u:495; CHECK-2p2: // %bb.0: // %entry496; CHECK-2p2-NEXT: ptrue p0.d497; CHECK-2p2-NEXT: fcvt z0.s, p0/z, z1.d498; CHECK-2p2-NEXT: ret499entry:500 %pg = call <vscale x 2 x i1> @llvm.aarch64.sve.ptrue.nxv2i1(i32 31)501 %0 = tail call <vscale x 4 x float> @llvm.aarch64.sve.fcvt.f32f64(<vscale x 4 x float> poison, <vscale x 2 x i1> %pg, <vscale x 2 x double> %x)502 ret <vscale x 4 x float> %0503}504 505define <vscale x 4 x float> @test_svcvt_f32_f64_ptrue(double %z0, <vscale x 4 x float> %x, <vscale x 2 x double> %y ) {506; CHECK-LABEL: test_svcvt_f32_f64_ptrue:507; CHECK: // %bb.0: // %entry508; CHECK-NEXT: mov z0.d, z1.d509; CHECK-NEXT: ptrue p0.d510; CHECK-NEXT: fcvt z0.s, p0/m, z2.d511; CHECK-NEXT: ret512;513; CHECK-2p2-LABEL: test_svcvt_f32_f64_ptrue:514; CHECK-2p2: // %bb.0: // %entry515; CHECK-2p2-NEXT: ptrue p0.d516; CHECK-2p2-NEXT: fcvt z0.s, p0/z, z2.d517; CHECK-2p2-NEXT: ret518entry:519 %pg = call <vscale x 2 x i1> @llvm.aarch64.sve.ptrue.nxv2i1(i32 31)520 %0 = tail call <vscale x 4 x float> @llvm.aarch64.sve.fcvt.f32f64(<vscale x 4 x float> %x, <vscale x 2 x i1> %pg, <vscale x 2 x double> %y)521 ret <vscale x 4 x float> %0522}523 524define <vscale x 4 x float> @test_svcvt_f32_f16_ptrue_u(double %z0, <vscale x 8 x half> %x) {525; CHECK-LABEL: test_svcvt_f32_f16_ptrue_u:526; CHECK: // %bb.0: // %entry527; CHECK-NEXT: ptrue p0.s528; CHECK-NEXT: fcvt z0.s, p0/m, z1.h529; CHECK-NEXT: ret530;531; CHECK-2p2-LABEL: test_svcvt_f32_f16_ptrue_u:532; CHECK-2p2: // %bb.0: // %entry533; CHECK-2p2-NEXT: ptrue p0.s534; CHECK-2p2-NEXT: fcvt z0.s, p0/z, z1.h535; CHECK-2p2-NEXT: ret536entry:537 %pg = call <vscale x 4 x i1> @llvm.aarch64.sve.ptrue.nxv4i1(i32 31)538 %0 = tail call <vscale x 4 x float> @llvm.aarch64.sve.fcvt.f32f16(<vscale x 4 x float> poison, <vscale x 4 x i1> %pg, <vscale x 8 x half> %x)539 ret <vscale x 4 x float> %0540}541 542define <vscale x 4 x float> @test_svcvt_f32_f16_ptrue(double %z0, <vscale x 4 x float> %x, <vscale x 8 x half> %y ) {543; CHECK-LABEL: test_svcvt_f32_f16_ptrue:544; CHECK: // %bb.0: // %entry545; CHECK-NEXT: mov z0.d, z1.d546; CHECK-NEXT: ptrue p0.s547; CHECK-NEXT: fcvt z0.s, p0/m, z2.h548; CHECK-NEXT: ret549;550; CHECK-2p2-LABEL: test_svcvt_f32_f16_ptrue:551; CHECK-2p2: // %bb.0: // %entry552; CHECK-2p2-NEXT: ptrue p0.s553; CHECK-2p2-NEXT: fcvt z0.s, p0/z, z2.h554; CHECK-2p2-NEXT: ret555entry:556 %pg = call <vscale x 4 x i1> @llvm.aarch64.sve.ptrue.nxv4i1(i32 31)557 %0 = tail call <vscale x 4 x float> @llvm.aarch64.sve.fcvt.f32f16(<vscale x 4 x float> %x, <vscale x 4 x i1> %pg, <vscale x 8 x half> %y)558 ret <vscale x 4 x float> %0559}560 561define <vscale x 2 x double> @test_svcvt_f64_f16_ptrue_u(double %z0, <vscale x 8 x half> %x) {562; CHECK-LABEL: test_svcvt_f64_f16_ptrue_u:563; CHECK: // %bb.0: // %entry564; CHECK-NEXT: ptrue p0.d565; CHECK-NEXT: fcvt z0.d, p0/m, z1.h566; CHECK-NEXT: ret567;568; CHECK-2p2-LABEL: test_svcvt_f64_f16_ptrue_u:569; CHECK-2p2: // %bb.0: // %entry570; CHECK-2p2-NEXT: ptrue p0.d571; CHECK-2p2-NEXT: fcvt z0.d, p0/z, z1.h572; CHECK-2p2-NEXT: ret573entry:574 %pg = call <vscale x 2 x i1> @llvm.aarch64.sve.ptrue.nxv2i1(i32 31)575 %0 = tail call <vscale x 2 x double> @llvm.aarch64.sve.fcvt.f64f16(<vscale x 2 x double> poison, <vscale x 2 x i1> %pg, <vscale x 8 x half> %x)576 ret <vscale x 2 x double> %0577}578 579define <vscale x 2 x double> @test_svcvt_f64_f16_ptrue(double %z0, <vscale x 2 x double> %x, <vscale x 8 x half> %y ) {580; CHECK-LABEL: test_svcvt_f64_f16_ptrue:581; CHECK: // %bb.0: // %entry582; CHECK-NEXT: mov z0.d, z1.d583; CHECK-NEXT: ptrue p0.d584; CHECK-NEXT: fcvt z0.d, p0/m, z2.h585; CHECK-NEXT: ret586;587; CHECK-2p2-LABEL: test_svcvt_f64_f16_ptrue:588; CHECK-2p2: // %bb.0: // %entry589; CHECK-2p2-NEXT: ptrue p0.d590; CHECK-2p2-NEXT: fcvt z0.d, p0/z, z2.h591; CHECK-2p2-NEXT: ret592entry:593 %pg = call <vscale x 2 x i1> @llvm.aarch64.sve.ptrue.nxv2i1(i32 31)594 %0 = tail call <vscale x 2 x double> @llvm.aarch64.sve.fcvt.f64f16(<vscale x 2 x double> %x, <vscale x 2 x i1> %pg, <vscale x 8 x half> %y)595 ret <vscale x 2 x double> %0596}597 598define <vscale x 2 x double> @test_svcvt_f64_f32_ptrue_u(double %z0, <vscale x 4 x float> %x) {599; CHECK-LABEL: test_svcvt_f64_f32_ptrue_u:600; CHECK: // %bb.0: // %entry601; CHECK-NEXT: ptrue p0.d602; CHECK-NEXT: fcvt z0.d, p0/m, z1.s603; CHECK-NEXT: ret604;605; CHECK-2p2-LABEL: test_svcvt_f64_f32_ptrue_u:606; CHECK-2p2: // %bb.0: // %entry607; CHECK-2p2-NEXT: ptrue p0.d608; CHECK-2p2-NEXT: fcvt z0.d, p0/z, z1.s609; CHECK-2p2-NEXT: ret610entry:611 %pg = call <vscale x 2 x i1> @llvm.aarch64.sve.ptrue.nxv2i1(i32 31)612 %0 = tail call <vscale x 2 x double> @llvm.aarch64.sve.fcvt.f64f32(<vscale x 2 x double> poison, <vscale x 2 x i1> %pg, <vscale x 4 x float> %x)613 ret <vscale x 2 x double> %0614}615 616define <vscale x 2 x double> @test_svcvt_f64_f32_ptrue(double %z0, <vscale x 2 x double> %x, <vscale x 4 x float> %y ) {617; CHECK-LABEL: test_svcvt_f64_f32_ptrue:618; CHECK: // %bb.0: // %entry619; CHECK-NEXT: mov z0.d, z1.d620; CHECK-NEXT: ptrue p0.d621; CHECK-NEXT: fcvt z0.d, p0/m, z2.s622; CHECK-NEXT: ret623;624; CHECK-2p2-LABEL: test_svcvt_f64_f32_ptrue:625; CHECK-2p2: // %bb.0: // %entry626; CHECK-2p2-NEXT: ptrue p0.d627; CHECK-2p2-NEXT: fcvt z0.d, p0/z, z2.s628; CHECK-2p2-NEXT: ret629entry:630 %pg = call <vscale x 2 x i1> @llvm.aarch64.sve.ptrue.nxv2i1(i32 31)631 %0 = tail call <vscale x 2 x double> @llvm.aarch64.sve.fcvt.f64f32(<vscale x 2 x double> %x, <vscale x 2 x i1> %pg, <vscale x 4 x float> %y)632 ret <vscale x 2 x double> %0633}634