3061 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc -mattr=+sve -force-streaming-compatible < %s | FileCheck %s3; RUN: llc -force-streaming-compatible < %s | FileCheck %s --check-prefix=NONEON-NOSVE4 5target triple = "aarch64-unknown-linux-gnu"6 7;8; UCVTF H -> H9;10 11define <4 x half> @ucvtf_v4i16_v4f16(<4 x i16> %op1) {12; CHECK-LABEL: ucvtf_v4i16_v4f16:13; CHECK: // %bb.0:14; CHECK-NEXT: ptrue p0.h, vl415; CHECK-NEXT: // kill: def $d0 killed $d0 def $z016; CHECK-NEXT: ucvtf z0.h, p0/m, z0.h17; CHECK-NEXT: // kill: def $d0 killed $d0 killed $z018; CHECK-NEXT: ret19;20; NONEON-NOSVE-LABEL: ucvtf_v4i16_v4f16:21; NONEON-NOSVE: // %bb.0:22; NONEON-NOSVE-NEXT: str d0, [sp, #-16]!23; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 1624; NONEON-NOSVE-NEXT: ldrh w8, [sp, #6]25; NONEON-NOSVE-NEXT: ucvtf s0, w826; NONEON-NOSVE-NEXT: ldrh w8, [sp, #4]27; NONEON-NOSVE-NEXT: fcvt h0, s028; NONEON-NOSVE-NEXT: str h0, [sp, #14]29; NONEON-NOSVE-NEXT: ucvtf s0, w830; NONEON-NOSVE-NEXT: ldrh w8, [sp, #2]31; NONEON-NOSVE-NEXT: fcvt h0, s032; NONEON-NOSVE-NEXT: str h0, [sp, #12]33; NONEON-NOSVE-NEXT: ucvtf s0, w834; NONEON-NOSVE-NEXT: ldrh w8, [sp]35; NONEON-NOSVE-NEXT: fcvt h0, s036; NONEON-NOSVE-NEXT: str h0, [sp, #10]37; NONEON-NOSVE-NEXT: ucvtf s0, w838; NONEON-NOSVE-NEXT: fcvt h0, s039; NONEON-NOSVE-NEXT: str h0, [sp, #8]40; NONEON-NOSVE-NEXT: ldr d0, [sp, #8]41; NONEON-NOSVE-NEXT: add sp, sp, #1642; NONEON-NOSVE-NEXT: ret43 %res = uitofp <4 x i16> %op1 to <4 x half>44 ret <4 x half> %res45}46 47define void @ucvtf_v8i16_v8f16(ptr %a, ptr %b) {48; CHECK-LABEL: ucvtf_v8i16_v8f16:49; CHECK: // %bb.0:50; CHECK-NEXT: ptrue p0.h, vl851; CHECK-NEXT: ldr q0, [x0]52; CHECK-NEXT: ucvtf z0.h, p0/m, z0.h53; CHECK-NEXT: str q0, [x1]54; CHECK-NEXT: ret55;56; NONEON-NOSVE-LABEL: ucvtf_v8i16_v8f16:57; NONEON-NOSVE: // %bb.0:58; NONEON-NOSVE-NEXT: ldr q0, [x0]59; NONEON-NOSVE-NEXT: str q0, [sp, #-32]!60; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 3261; NONEON-NOSVE-NEXT: ldrh w8, [sp, #14]62; NONEON-NOSVE-NEXT: ucvtf s0, w863; NONEON-NOSVE-NEXT: ldrh w8, [sp, #12]64; NONEON-NOSVE-NEXT: fcvt h0, s065; NONEON-NOSVE-NEXT: str h0, [sp, #30]66; NONEON-NOSVE-NEXT: ucvtf s0, w867; NONEON-NOSVE-NEXT: ldrh w8, [sp, #10]68; NONEON-NOSVE-NEXT: fcvt h0, s069; NONEON-NOSVE-NEXT: str h0, [sp, #28]70; NONEON-NOSVE-NEXT: ucvtf s0, w871; NONEON-NOSVE-NEXT: ldrh w8, [sp, #8]72; NONEON-NOSVE-NEXT: fcvt h0, s073; NONEON-NOSVE-NEXT: str h0, [sp, #26]74; NONEON-NOSVE-NEXT: ucvtf s0, w875; NONEON-NOSVE-NEXT: ldrh w8, [sp, #6]76; NONEON-NOSVE-NEXT: fcvt h0, s077; NONEON-NOSVE-NEXT: str h0, [sp, #24]78; NONEON-NOSVE-NEXT: ucvtf s0, w879; NONEON-NOSVE-NEXT: ldrh w8, [sp, #4]80; NONEON-NOSVE-NEXT: fcvt h0, s081; NONEON-NOSVE-NEXT: str h0, [sp, #22]82; NONEON-NOSVE-NEXT: ucvtf s0, w883; NONEON-NOSVE-NEXT: ldrh w8, [sp, #2]84; NONEON-NOSVE-NEXT: fcvt h0, s085; NONEON-NOSVE-NEXT: str h0, [sp, #20]86; NONEON-NOSVE-NEXT: ucvtf s0, w887; NONEON-NOSVE-NEXT: ldrh w8, [sp]88; NONEON-NOSVE-NEXT: fcvt h0, s089; NONEON-NOSVE-NEXT: str h0, [sp, #18]90; NONEON-NOSVE-NEXT: ucvtf s0, w891; NONEON-NOSVE-NEXT: fcvt h0, s092; NONEON-NOSVE-NEXT: str h0, [sp, #16]93; NONEON-NOSVE-NEXT: ldr q0, [sp, #16]94; NONEON-NOSVE-NEXT: str q0, [x1]95; NONEON-NOSVE-NEXT: add sp, sp, #3296; NONEON-NOSVE-NEXT: ret97 %op1 = load <8 x i16>, ptr %a98 %res = uitofp <8 x i16> %op1 to <8 x half>99 store <8 x half> %res, ptr %b100 ret void101}102 103define void @ucvtf_v16i16_v16f16(ptr %a, ptr %b) {104; CHECK-LABEL: ucvtf_v16i16_v16f16:105; CHECK: // %bb.0:106; CHECK-NEXT: ldp q0, q1, [x0]107; CHECK-NEXT: ptrue p0.h, vl8108; CHECK-NEXT: ucvtf z0.h, p0/m, z0.h109; CHECK-NEXT: ucvtf z1.h, p0/m, z1.h110; CHECK-NEXT: stp q0, q1, [x1]111; CHECK-NEXT: ret112;113; NONEON-NOSVE-LABEL: ucvtf_v16i16_v16f16:114; NONEON-NOSVE: // %bb.0:115; NONEON-NOSVE-NEXT: ldp q1, q0, [x0]116; NONEON-NOSVE-NEXT: stp q1, q0, [sp, #-64]!117; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 64118; NONEON-NOSVE-NEXT: ldrh w8, [sp, #30]119; NONEON-NOSVE-NEXT: ucvtf s0, w8120; NONEON-NOSVE-NEXT: ldrh w8, [sp, #28]121; NONEON-NOSVE-NEXT: fcvt h0, s0122; NONEON-NOSVE-NEXT: str h0, [sp, #62]123; NONEON-NOSVE-NEXT: ucvtf s0, w8124; NONEON-NOSVE-NEXT: ldrh w8, [sp, #26]125; NONEON-NOSVE-NEXT: fcvt h0, s0126; NONEON-NOSVE-NEXT: str h0, [sp, #60]127; NONEON-NOSVE-NEXT: ucvtf s0, w8128; NONEON-NOSVE-NEXT: ldrh w8, [sp, #24]129; NONEON-NOSVE-NEXT: fcvt h0, s0130; NONEON-NOSVE-NEXT: str h0, [sp, #58]131; NONEON-NOSVE-NEXT: ucvtf s0, w8132; NONEON-NOSVE-NEXT: ldrh w8, [sp, #22]133; NONEON-NOSVE-NEXT: fcvt h0, s0134; NONEON-NOSVE-NEXT: str h0, [sp, #56]135; NONEON-NOSVE-NEXT: ucvtf s0, w8136; NONEON-NOSVE-NEXT: ldrh w8, [sp, #20]137; NONEON-NOSVE-NEXT: fcvt h0, s0138; NONEON-NOSVE-NEXT: str h0, [sp, #54]139; NONEON-NOSVE-NEXT: ucvtf s0, w8140; NONEON-NOSVE-NEXT: ldrh w8, [sp, #18]141; NONEON-NOSVE-NEXT: fcvt h0, s0142; NONEON-NOSVE-NEXT: str h0, [sp, #52]143; NONEON-NOSVE-NEXT: ucvtf s0, w8144; NONEON-NOSVE-NEXT: ldrh w8, [sp, #16]145; NONEON-NOSVE-NEXT: fcvt h0, s0146; NONEON-NOSVE-NEXT: str h0, [sp, #50]147; NONEON-NOSVE-NEXT: ucvtf s0, w8148; NONEON-NOSVE-NEXT: ldrh w8, [sp, #14]149; NONEON-NOSVE-NEXT: fcvt h0, s0150; NONEON-NOSVE-NEXT: str h0, [sp, #48]151; NONEON-NOSVE-NEXT: ucvtf s0, w8152; NONEON-NOSVE-NEXT: ldrh w8, [sp, #12]153; NONEON-NOSVE-NEXT: fcvt h0, s0154; NONEON-NOSVE-NEXT: str h0, [sp, #46]155; NONEON-NOSVE-NEXT: ucvtf s0, w8156; NONEON-NOSVE-NEXT: ldrh w8, [sp, #10]157; NONEON-NOSVE-NEXT: fcvt h0, s0158; NONEON-NOSVE-NEXT: str h0, [sp, #44]159; NONEON-NOSVE-NEXT: ucvtf s0, w8160; NONEON-NOSVE-NEXT: ldrh w8, [sp, #8]161; NONEON-NOSVE-NEXT: fcvt h0, s0162; NONEON-NOSVE-NEXT: str h0, [sp, #42]163; NONEON-NOSVE-NEXT: ucvtf s0, w8164; NONEON-NOSVE-NEXT: ldrh w8, [sp, #6]165; NONEON-NOSVE-NEXT: fcvt h0, s0166; NONEON-NOSVE-NEXT: str h0, [sp, #40]167; NONEON-NOSVE-NEXT: ucvtf s0, w8168; NONEON-NOSVE-NEXT: ldrh w8, [sp, #4]169; NONEON-NOSVE-NEXT: fcvt h0, s0170; NONEON-NOSVE-NEXT: str h0, [sp, #38]171; NONEON-NOSVE-NEXT: ucvtf s0, w8172; NONEON-NOSVE-NEXT: ldrh w8, [sp, #2]173; NONEON-NOSVE-NEXT: fcvt h0, s0174; NONEON-NOSVE-NEXT: str h0, [sp, #36]175; NONEON-NOSVE-NEXT: ucvtf s0, w8176; NONEON-NOSVE-NEXT: ldrh w8, [sp]177; NONEON-NOSVE-NEXT: fcvt h0, s0178; NONEON-NOSVE-NEXT: str h0, [sp, #34]179; NONEON-NOSVE-NEXT: ucvtf s0, w8180; NONEON-NOSVE-NEXT: fcvt h0, s0181; NONEON-NOSVE-NEXT: str h0, [sp, #32]182; NONEON-NOSVE-NEXT: ldp q0, q1, [sp, #32]183; NONEON-NOSVE-NEXT: stp q0, q1, [x1]184; NONEON-NOSVE-NEXT: add sp, sp, #64185; NONEON-NOSVE-NEXT: ret186 %op1 = load <16 x i16>, ptr %a187 %res = uitofp <16 x i16> %op1 to <16 x half>188 store <16 x half> %res, ptr %b189 ret void190}191 192;193; UCVTF H -> S194;195 196define <2 x float> @ucvtf_v2i16_v2f32(<2 x i16> %op1) {197; CHECK-LABEL: ucvtf_v2i16_v2f32:198; CHECK: // %bb.0:199; CHECK-NEXT: // kill: def $d0 killed $d0 def $z0200; CHECK-NEXT: ptrue p0.s, vl2201; CHECK-NEXT: and z0.s, z0.s, #0xffff202; CHECK-NEXT: ucvtf z0.s, p0/m, z0.s203; CHECK-NEXT: // kill: def $d0 killed $d0 killed $z0204; CHECK-NEXT: ret205;206; NONEON-NOSVE-LABEL: ucvtf_v2i16_v2f32:207; NONEON-NOSVE: // %bb.0:208; NONEON-NOSVE-NEXT: str d0, [sp, #-16]!209; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 16210; NONEON-NOSVE-NEXT: ldrh w8, [sp, #4]211; NONEON-NOSVE-NEXT: ldrh w9, [sp]212; NONEON-NOSVE-NEXT: ucvtf s0, w8213; NONEON-NOSVE-NEXT: ucvtf s1, w9214; NONEON-NOSVE-NEXT: stp s1, s0, [sp, #8]215; NONEON-NOSVE-NEXT: ldr d0, [sp, #8]216; NONEON-NOSVE-NEXT: add sp, sp, #16217; NONEON-NOSVE-NEXT: ret218 %res = uitofp <2 x i16> %op1 to <2 x float>219 ret <2 x float> %res220}221 222define <4 x float> @ucvtf_v4i16_v4f32(<4 x i16> %op1) {223; CHECK-LABEL: ucvtf_v4i16_v4f32:224; CHECK: // %bb.0:225; CHECK-NEXT: // kill: def $d0 killed $d0 def $z0226; CHECK-NEXT: ptrue p0.s, vl4227; CHECK-NEXT: uunpklo z0.s, z0.h228; CHECK-NEXT: ucvtf z0.s, p0/m, z0.s229; CHECK-NEXT: // kill: def $q0 killed $q0 killed $z0230; CHECK-NEXT: ret231;232; NONEON-NOSVE-LABEL: ucvtf_v4i16_v4f32:233; NONEON-NOSVE: // %bb.0:234; NONEON-NOSVE-NEXT: sub sp, sp, #32235; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 32236; NONEON-NOSVE-NEXT: str d0, [sp, #8]237; NONEON-NOSVE-NEXT: ldrh w8, [sp, #14]238; NONEON-NOSVE-NEXT: ucvtf s1, w8239; NONEON-NOSVE-NEXT: ldrh w8, [sp, #12]240; NONEON-NOSVE-NEXT: ucvtf s0, w8241; NONEON-NOSVE-NEXT: ldrh w8, [sp, #10]242; NONEON-NOSVE-NEXT: stp s0, s1, [sp, #24]243; NONEON-NOSVE-NEXT: ucvtf s1, w8244; NONEON-NOSVE-NEXT: ldrh w8, [sp, #8]245; NONEON-NOSVE-NEXT: ucvtf s0, w8246; NONEON-NOSVE-NEXT: stp s0, s1, [sp, #16]247; NONEON-NOSVE-NEXT: ldr q0, [sp, #16]248; NONEON-NOSVE-NEXT: add sp, sp, #32249; NONEON-NOSVE-NEXT: ret250 %res = uitofp <4 x i16> %op1 to <4 x float>251 ret <4 x float> %res252}253 254define void @ucvtf_v8i16_v8f32(ptr %a, ptr %b) {255; CHECK-LABEL: ucvtf_v8i16_v8f32:256; CHECK: // %bb.0:257; CHECK-NEXT: ldr q0, [x0]258; CHECK-NEXT: ptrue p0.s, vl4259; CHECK-NEXT: movprfx z1, z0260; CHECK-NEXT: ext z1.b, z1.b, z0.b, #8261; CHECK-NEXT: uunpklo z0.s, z0.h262; CHECK-NEXT: uunpklo z1.s, z1.h263; CHECK-NEXT: ucvtf z0.s, p0/m, z0.s264; CHECK-NEXT: ucvtf z1.s, p0/m, z1.s265; CHECK-NEXT: stp q0, q1, [x1]266; CHECK-NEXT: ret267;268; NONEON-NOSVE-LABEL: ucvtf_v8i16_v8f32:269; NONEON-NOSVE: // %bb.0:270; NONEON-NOSVE-NEXT: ldr q0, [x0]271; NONEON-NOSVE-NEXT: str q0, [sp, #-64]!272; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 64273; NONEON-NOSVE-NEXT: ldp d1, d0, [sp]274; NONEON-NOSVE-NEXT: stp d0, d1, [sp, #16]275; NONEON-NOSVE-NEXT: ldrh w8, [sp, #30]276; NONEON-NOSVE-NEXT: ucvtf s1, w8277; NONEON-NOSVE-NEXT: ldrh w8, [sp, #28]278; NONEON-NOSVE-NEXT: ucvtf s0, w8279; NONEON-NOSVE-NEXT: ldrh w8, [sp, #26]280; NONEON-NOSVE-NEXT: stp s0, s1, [sp, #56]281; NONEON-NOSVE-NEXT: ucvtf s1, w8282; NONEON-NOSVE-NEXT: ldrh w8, [sp, #24]283; NONEON-NOSVE-NEXT: ucvtf s0, w8284; NONEON-NOSVE-NEXT: ldrh w8, [sp, #22]285; NONEON-NOSVE-NEXT: stp s0, s1, [sp, #48]286; NONEON-NOSVE-NEXT: ucvtf s1, w8287; NONEON-NOSVE-NEXT: ldrh w8, [sp, #20]288; NONEON-NOSVE-NEXT: ucvtf s0, w8289; NONEON-NOSVE-NEXT: ldrh w8, [sp, #18]290; NONEON-NOSVE-NEXT: stp s0, s1, [sp, #40]291; NONEON-NOSVE-NEXT: ucvtf s1, w8292; NONEON-NOSVE-NEXT: ldrh w8, [sp, #16]293; NONEON-NOSVE-NEXT: ucvtf s0, w8294; NONEON-NOSVE-NEXT: stp s0, s1, [sp, #32]295; NONEON-NOSVE-NEXT: ldp q0, q1, [sp, #32]296; NONEON-NOSVE-NEXT: stp q1, q0, [x1]297; NONEON-NOSVE-NEXT: add sp, sp, #64298; NONEON-NOSVE-NEXT: ret299 %op1 = load <8 x i16>, ptr %a300 %res = uitofp <8 x i16> %op1 to <8 x float>301 store <8 x float> %res, ptr %b302 ret void303}304 305define void @ucvtf_v16i16_v16f32(ptr %a, ptr %b) {306; CHECK-LABEL: ucvtf_v16i16_v16f32:307; CHECK: // %bb.0:308; CHECK-NEXT: ldp q1, q0, [x0]309; CHECK-NEXT: ptrue p0.s, vl4310; CHECK-NEXT: movprfx z2, z0311; CHECK-NEXT: ext z2.b, z2.b, z0.b, #8312; CHECK-NEXT: movprfx z3, z1313; CHECK-NEXT: ext z3.b, z3.b, z1.b, #8314; CHECK-NEXT: uunpklo z0.s, z0.h315; CHECK-NEXT: uunpklo z1.s, z1.h316; CHECK-NEXT: uunpklo z2.s, z2.h317; CHECK-NEXT: uunpklo z3.s, z3.h318; CHECK-NEXT: ucvtf z0.s, p0/m, z0.s319; CHECK-NEXT: ucvtf z1.s, p0/m, z1.s320; CHECK-NEXT: ucvtf z2.s, p0/m, z2.s321; CHECK-NEXT: ucvtf z3.s, p0/m, z3.s322; CHECK-NEXT: stp q1, q3, [x1]323; CHECK-NEXT: stp q0, q2, [x1, #32]324; CHECK-NEXT: ret325;326; NONEON-NOSVE-LABEL: ucvtf_v16i16_v16f32:327; NONEON-NOSVE: // %bb.0:328; NONEON-NOSVE-NEXT: ldp q0, q1, [x0]329; NONEON-NOSVE-NEXT: stp q0, q1, [sp, #-128]!330; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 128331; NONEON-NOSVE-NEXT: ldp d1, d0, [sp]332; NONEON-NOSVE-NEXT: stp d0, d1, [sp, #32]333; NONEON-NOSVE-NEXT: ldp d1, d0, [sp, #16]334; NONEON-NOSVE-NEXT: ldrh w8, [sp, #46]335; NONEON-NOSVE-NEXT: stp d0, d1, [sp, #48]336; NONEON-NOSVE-NEXT: ucvtf s1, w8337; NONEON-NOSVE-NEXT: ldrh w8, [sp, #44]338; NONEON-NOSVE-NEXT: ucvtf s0, w8339; NONEON-NOSVE-NEXT: ldrh w8, [sp, #42]340; NONEON-NOSVE-NEXT: stp s0, s1, [sp, #88]341; NONEON-NOSVE-NEXT: ucvtf s1, w8342; NONEON-NOSVE-NEXT: ldrh w8, [sp, #40]343; NONEON-NOSVE-NEXT: ucvtf s0, w8344; NONEON-NOSVE-NEXT: ldrh w8, [sp, #38]345; NONEON-NOSVE-NEXT: stp s0, s1, [sp, #80]346; NONEON-NOSVE-NEXT: ucvtf s1, w8347; NONEON-NOSVE-NEXT: ldrh w8, [sp, #36]348; NONEON-NOSVE-NEXT: ucvtf s0, w8349; NONEON-NOSVE-NEXT: ldrh w8, [sp, #34]350; NONEON-NOSVE-NEXT: stp s0, s1, [sp, #72]351; NONEON-NOSVE-NEXT: ucvtf s1, w8352; NONEON-NOSVE-NEXT: ldrh w8, [sp, #32]353; NONEON-NOSVE-NEXT: ucvtf s0, w8354; NONEON-NOSVE-NEXT: ldrh w8, [sp, #62]355; NONEON-NOSVE-NEXT: stp s0, s1, [sp, #64]356; NONEON-NOSVE-NEXT: ucvtf s1, w8357; NONEON-NOSVE-NEXT: ldrh w8, [sp, #60]358; NONEON-NOSVE-NEXT: ldp q3, q2, [sp, #64]359; NONEON-NOSVE-NEXT: ucvtf s0, w8360; NONEON-NOSVE-NEXT: ldrh w8, [sp, #58]361; NONEON-NOSVE-NEXT: stp s0, s1, [sp, #120]362; NONEON-NOSVE-NEXT: ucvtf s1, w8363; NONEON-NOSVE-NEXT: ldrh w8, [sp, #56]364; NONEON-NOSVE-NEXT: ucvtf s0, w8365; NONEON-NOSVE-NEXT: ldrh w8, [sp, #54]366; NONEON-NOSVE-NEXT: stp s0, s1, [sp, #112]367; NONEON-NOSVE-NEXT: ucvtf s1, w8368; NONEON-NOSVE-NEXT: ldrh w8, [sp, #52]369; NONEON-NOSVE-NEXT: ucvtf s0, w8370; NONEON-NOSVE-NEXT: ldrh w8, [sp, #50]371; NONEON-NOSVE-NEXT: stp s0, s1, [sp, #104]372; NONEON-NOSVE-NEXT: ucvtf s1, w8373; NONEON-NOSVE-NEXT: ldrh w8, [sp, #48]374; NONEON-NOSVE-NEXT: ucvtf s0, w8375; NONEON-NOSVE-NEXT: stp s0, s1, [sp, #96]376; NONEON-NOSVE-NEXT: ldp q0, q1, [sp, #96]377; NONEON-NOSVE-NEXT: stp q2, q3, [x1]378; NONEON-NOSVE-NEXT: stp q1, q0, [x1, #32]379; NONEON-NOSVE-NEXT: add sp, sp, #128380; NONEON-NOSVE-NEXT: ret381 %op1 = load <16 x i16>, ptr %a382 %res = uitofp <16 x i16> %op1 to <16 x float>383 store <16 x float> %res, ptr %b384 ret void385}386 387;388; UCVTF H -> D389;390 391define <1 x double> @ucvtf_v1i16_v1f64(<1 x i16> %op1) {392; CHECK-LABEL: ucvtf_v1i16_v1f64:393; CHECK: // %bb.0:394; CHECK-NEXT: // kill: def $d0 killed $d0 def $z0395; CHECK-NEXT: fmov w8, s0396; CHECK-NEXT: and w8, w8, #0xffff397; CHECK-NEXT: ucvtf d0, w8398; CHECK-NEXT: ret399;400; NONEON-NOSVE-LABEL: ucvtf_v1i16_v1f64:401; NONEON-NOSVE: // %bb.0:402; NONEON-NOSVE-NEXT: sub sp, sp, #16403; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 16404; NONEON-NOSVE-NEXT: str d0, [sp, #8]405; NONEON-NOSVE-NEXT: ldrh w8, [sp, #8]406; NONEON-NOSVE-NEXT: ucvtf d0, w8407; NONEON-NOSVE-NEXT: str d0, [sp]408; NONEON-NOSVE-NEXT: ldr d0, [sp], #16409; NONEON-NOSVE-NEXT: ret410 %res = uitofp <1 x i16> %op1 to <1 x double>411 ret <1 x double> %res412}413 414define <2 x double> @ucvtf_v2i16_v2f64(<2 x i16> %op1) {415; CHECK-LABEL: ucvtf_v2i16_v2f64:416; CHECK: // %bb.0:417; CHECK-NEXT: // kill: def $d0 killed $d0 def $z0418; CHECK-NEXT: ptrue p0.d, vl2419; CHECK-NEXT: and z0.s, z0.s, #0xffff420; CHECK-NEXT: uunpklo z0.d, z0.s421; CHECK-NEXT: ucvtf z0.d, p0/m, z0.d422; CHECK-NEXT: // kill: def $q0 killed $q0 killed $z0423; CHECK-NEXT: ret424;425; NONEON-NOSVE-LABEL: ucvtf_v2i16_v2f64:426; NONEON-NOSVE: // %bb.0:427; NONEON-NOSVE-NEXT: sub sp, sp, #32428; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 32429; NONEON-NOSVE-NEXT: str d0, [sp, #8]430; NONEON-NOSVE-NEXT: ldrh w8, [sp, #12]431; NONEON-NOSVE-NEXT: ldrh w9, [sp, #8]432; NONEON-NOSVE-NEXT: ucvtf d0, w8433; NONEON-NOSVE-NEXT: ucvtf d1, w9434; NONEON-NOSVE-NEXT: stp d1, d0, [sp, #16]435; NONEON-NOSVE-NEXT: ldr q0, [sp, #16]436; NONEON-NOSVE-NEXT: add sp, sp, #32437; NONEON-NOSVE-NEXT: ret438 %res = uitofp <2 x i16> %op1 to <2 x double>439 ret <2 x double> %res440}441 442define void @ucvtf_v4i16_v4f64(ptr %a, ptr %b) {443; CHECK-LABEL: ucvtf_v4i16_v4f64:444; CHECK: // %bb.0:445; CHECK-NEXT: ldr d0, [x0]446; CHECK-NEXT: ptrue p0.d, vl2447; CHECK-NEXT: uunpklo z0.s, z0.h448; CHECK-NEXT: movprfx z1, z0449; CHECK-NEXT: ext z1.b, z1.b, z0.b, #8450; CHECK-NEXT: uunpklo z0.d, z0.s451; CHECK-NEXT: uunpklo z1.d, z1.s452; CHECK-NEXT: ucvtf z0.d, p0/m, z0.d453; CHECK-NEXT: ucvtf z1.d, p0/m, z1.d454; CHECK-NEXT: stp q0, q1, [x1]455; CHECK-NEXT: ret456;457; NONEON-NOSVE-LABEL: ucvtf_v4i16_v4f64:458; NONEON-NOSVE: // %bb.0:459; NONEON-NOSVE-NEXT: sub sp, sp, #48460; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 48461; NONEON-NOSVE-NEXT: ldr d0, [x0]462; NONEON-NOSVE-NEXT: str d0, [sp, #8]463; NONEON-NOSVE-NEXT: ldrh w8, [sp, #10]464; NONEON-NOSVE-NEXT: ucvtf d1, w8465; NONEON-NOSVE-NEXT: ldrh w8, [sp, #8]466; NONEON-NOSVE-NEXT: ucvtf d0, w8467; NONEON-NOSVE-NEXT: ldrh w8, [sp, #14]468; NONEON-NOSVE-NEXT: stp d0, d1, [sp, #32]469; NONEON-NOSVE-NEXT: ucvtf d1, w8470; NONEON-NOSVE-NEXT: ldrh w8, [sp, #12]471; NONEON-NOSVE-NEXT: ucvtf d0, w8472; NONEON-NOSVE-NEXT: stp d0, d1, [sp, #16]473; NONEON-NOSVE-NEXT: ldp q0, q1, [sp, #16]474; NONEON-NOSVE-NEXT: stp q1, q0, [x1]475; NONEON-NOSVE-NEXT: add sp, sp, #48476; NONEON-NOSVE-NEXT: ret477 %op1 = load <4 x i16>, ptr %a478 %res = uitofp <4 x i16> %op1 to <4 x double>479 store <4 x double> %res, ptr %b480 ret void481}482 483define void @ucvtf_v8i16_v8f64(ptr %a, ptr %b) {484; CHECK-LABEL: ucvtf_v8i16_v8f64:485; CHECK: // %bb.0:486; CHECK-NEXT: ldr q0, [x0]487; CHECK-NEXT: ptrue p0.d, vl2488; CHECK-NEXT: movprfx z1, z0489; CHECK-NEXT: ext z1.b, z1.b, z0.b, #8490; CHECK-NEXT: uunpklo z0.s, z0.h491; CHECK-NEXT: uunpklo z1.s, z1.h492; CHECK-NEXT: movprfx z2, z0493; CHECK-NEXT: ext z2.b, z2.b, z0.b, #8494; CHECK-NEXT: uunpklo z0.d, z0.s495; CHECK-NEXT: movprfx z3, z1496; CHECK-NEXT: ext z3.b, z3.b, z1.b, #8497; CHECK-NEXT: uunpklo z2.d, z2.s498; CHECK-NEXT: uunpklo z1.d, z1.s499; CHECK-NEXT: ucvtf z0.d, p0/m, z0.d500; CHECK-NEXT: uunpklo z3.d, z3.s501; CHECK-NEXT: ucvtf z2.d, p0/m, z2.d502; CHECK-NEXT: ucvtf z1.d, p0/m, z1.d503; CHECK-NEXT: ucvtf z3.d, p0/m, z3.d504; CHECK-NEXT: stp q0, q2, [x1]505; CHECK-NEXT: stp q1, q3, [x1, #32]506; CHECK-NEXT: ret507;508; NONEON-NOSVE-LABEL: ucvtf_v8i16_v8f64:509; NONEON-NOSVE: // %bb.0:510; NONEON-NOSVE-NEXT: ldr q0, [x0]511; NONEON-NOSVE-NEXT: str q0, [sp, #-96]!512; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 96513; NONEON-NOSVE-NEXT: ldp d1, d0, [sp]514; NONEON-NOSVE-NEXT: stp d0, d1, [sp, #16]515; NONEON-NOSVE-NEXT: ldrh w8, [sp, #26]516; NONEON-NOSVE-NEXT: ucvtf d1, w8517; NONEON-NOSVE-NEXT: ldrh w8, [sp, #24]518; NONEON-NOSVE-NEXT: ucvtf d0, w8519; NONEON-NOSVE-NEXT: ldrh w8, [sp, #30]520; NONEON-NOSVE-NEXT: stp d0, d1, [sp, #80]521; NONEON-NOSVE-NEXT: ucvtf d1, w8522; NONEON-NOSVE-NEXT: ldrh w8, [sp, #28]523; NONEON-NOSVE-NEXT: ucvtf d0, w8524; NONEON-NOSVE-NEXT: ldrh w8, [sp, #18]525; NONEON-NOSVE-NEXT: stp d0, d1, [sp, #64]526; NONEON-NOSVE-NEXT: ucvtf d1, w8527; NONEON-NOSVE-NEXT: ldrh w8, [sp, #16]528; NONEON-NOSVE-NEXT: ldp q3, q2, [sp, #64]529; NONEON-NOSVE-NEXT: ucvtf d0, w8530; NONEON-NOSVE-NEXT: ldrh w8, [sp, #22]531; NONEON-NOSVE-NEXT: stp d0, d1, [sp, #48]532; NONEON-NOSVE-NEXT: ucvtf d1, w8533; NONEON-NOSVE-NEXT: ldrh w8, [sp, #20]534; NONEON-NOSVE-NEXT: ucvtf d0, w8535; NONEON-NOSVE-NEXT: stp d0, d1, [sp, #32]536; NONEON-NOSVE-NEXT: ldp q0, q1, [sp, #32]537; NONEON-NOSVE-NEXT: stp q2, q3, [x1]538; NONEON-NOSVE-NEXT: stp q1, q0, [x1, #32]539; NONEON-NOSVE-NEXT: add sp, sp, #96540; NONEON-NOSVE-NEXT: ret541 %op1 = load <8 x i16>, ptr %a542 %res = uitofp <8 x i16> %op1 to <8 x double>543 store <8 x double> %res, ptr %b544 ret void545}546 547define void @ucvtf_v16i16_v16f64(ptr %a, ptr %b) {548; CHECK-LABEL: ucvtf_v16i16_v16f64:549; CHECK: // %bb.0:550; CHECK-NEXT: ldp q1, q0, [x0]551; CHECK-NEXT: ptrue p0.d, vl2552; CHECK-NEXT: movprfx z2, z0553; CHECK-NEXT: ext z2.b, z2.b, z0.b, #8554; CHECK-NEXT: uunpklo z0.s, z0.h555; CHECK-NEXT: uunpklo z3.s, z1.h556; CHECK-NEXT: ext z1.b, z1.b, z1.b, #8557; CHECK-NEXT: uunpklo z2.s, z2.h558; CHECK-NEXT: movprfx z4, z0559; CHECK-NEXT: ext z4.b, z4.b, z0.b, #8560; CHECK-NEXT: uunpklo z1.s, z1.h561; CHECK-NEXT: movprfx z5, z3562; CHECK-NEXT: ext z5.b, z5.b, z3.b, #8563; CHECK-NEXT: uunpklo z0.d, z0.s564; CHECK-NEXT: uunpklo z3.d, z3.s565; CHECK-NEXT: uunpklo z4.d, z4.s566; CHECK-NEXT: uunpklo z5.d, z5.s567; CHECK-NEXT: movprfx z6, z2568; CHECK-NEXT: ext z6.b, z6.b, z2.b, #8569; CHECK-NEXT: movprfx z7, z1570; CHECK-NEXT: ext z7.b, z7.b, z1.b, #8571; CHECK-NEXT: uunpklo z2.d, z2.s572; CHECK-NEXT: uunpklo z1.d, z1.s573; CHECK-NEXT: ucvtf z0.d, p0/m, z0.d574; CHECK-NEXT: ucvtf z3.d, p0/m, z3.d575; CHECK-NEXT: uunpklo z6.d, z6.s576; CHECK-NEXT: ucvtf z4.d, p0/m, z4.d577; CHECK-NEXT: uunpklo z7.d, z7.s578; CHECK-NEXT: ucvtf z5.d, p0/m, z5.d579; CHECK-NEXT: ucvtf z2.d, p0/m, z2.d580; CHECK-NEXT: ucvtf z1.d, p0/m, z1.d581; CHECK-NEXT: stp q3, q5, [x1]582; CHECK-NEXT: movprfx z3, z7583; CHECK-NEXT: ucvtf z3.d, p0/m, z7.d584; CHECK-NEXT: stp q0, q4, [x1, #64]585; CHECK-NEXT: movprfx z0, z6586; CHECK-NEXT: ucvtf z0.d, p0/m, z6.d587; CHECK-NEXT: stp q1, q3, [x1, #32]588; CHECK-NEXT: stp q2, q0, [x1, #96]589; CHECK-NEXT: ret590;591; NONEON-NOSVE-LABEL: ucvtf_v16i16_v16f64:592; NONEON-NOSVE: // %bb.0:593; NONEON-NOSVE-NEXT: sub sp, sp, #192594; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 192595; NONEON-NOSVE-NEXT: ldp q0, q1, [x0]596; NONEON-NOSVE-NEXT: stp q0, q1, [sp]597; NONEON-NOSVE-NEXT: ldp d1, d0, [sp]598; NONEON-NOSVE-NEXT: stp d0, d1, [sp, #32]599; NONEON-NOSVE-NEXT: ldp d1, d0, [sp, #16]600; NONEON-NOSVE-NEXT: ldrh w8, [sp, #42]601; NONEON-NOSVE-NEXT: stp d0, d1, [sp, #48]602; NONEON-NOSVE-NEXT: ucvtf d1, w8603; NONEON-NOSVE-NEXT: ldrh w8, [sp, #40]604; NONEON-NOSVE-NEXT: ucvtf d0, w8605; NONEON-NOSVE-NEXT: ldrh w8, [sp, #46]606; NONEON-NOSVE-NEXT: stp d0, d1, [sp, #112]607; NONEON-NOSVE-NEXT: ucvtf d1, w8608; NONEON-NOSVE-NEXT: ldrh w8, [sp, #44]609; NONEON-NOSVE-NEXT: ucvtf d0, w8610; NONEON-NOSVE-NEXT: ldrh w8, [sp, #34]611; NONEON-NOSVE-NEXT: stp d0, d1, [sp, #96]612; NONEON-NOSVE-NEXT: ucvtf d1, w8613; NONEON-NOSVE-NEXT: ldrh w8, [sp, #32]614; NONEON-NOSVE-NEXT: ucvtf d0, w8615; NONEON-NOSVE-NEXT: ldrh w8, [sp, #38]616; NONEON-NOSVE-NEXT: stp d0, d1, [sp, #80]617; NONEON-NOSVE-NEXT: ucvtf d1, w8618; NONEON-NOSVE-NEXT: ldrh w8, [sp, #36]619; NONEON-NOSVE-NEXT: ucvtf d0, w8620; NONEON-NOSVE-NEXT: ldrh w8, [sp, #58]621; NONEON-NOSVE-NEXT: stp d0, d1, [sp, #64]622; NONEON-NOSVE-NEXT: ucvtf d1, w8623; NONEON-NOSVE-NEXT: ldrh w8, [sp, #56]624; NONEON-NOSVE-NEXT: ldp q4, q3, [sp, #64]625; NONEON-NOSVE-NEXT: ucvtf d0, w8626; NONEON-NOSVE-NEXT: ldrh w8, [sp, #62]627; NONEON-NOSVE-NEXT: stp d0, d1, [sp, #176]628; NONEON-NOSVE-NEXT: ucvtf d1, w8629; NONEON-NOSVE-NEXT: ldrh w8, [sp, #60]630; NONEON-NOSVE-NEXT: ucvtf d0, w8631; NONEON-NOSVE-NEXT: ldrh w8, [sp, #50]632; NONEON-NOSVE-NEXT: stp d0, d1, [sp, #160]633; NONEON-NOSVE-NEXT: ucvtf d1, w8634; NONEON-NOSVE-NEXT: ldrh w8, [sp, #48]635; NONEON-NOSVE-NEXT: ldp q7, q6, [sp, #160]636; NONEON-NOSVE-NEXT: ucvtf d0, w8637; NONEON-NOSVE-NEXT: ldrh w8, [sp, #54]638; NONEON-NOSVE-NEXT: stp d0, d1, [sp, #144]639; NONEON-NOSVE-NEXT: ucvtf d1, w8640; NONEON-NOSVE-NEXT: ldrh w8, [sp, #52]641; NONEON-NOSVE-NEXT: ucvtf d0, w8642; NONEON-NOSVE-NEXT: stp d0, d1, [sp, #128]643; NONEON-NOSVE-NEXT: ldp q1, q0, [sp, #96]644; NONEON-NOSVE-NEXT: ldp q2, q5, [sp, #128]645; NONEON-NOSVE-NEXT: stp q3, q4, [x1, #32]646; NONEON-NOSVE-NEXT: stp q6, q7, [x1, #64]647; NONEON-NOSVE-NEXT: stp q0, q1, [x1]648; NONEON-NOSVE-NEXT: stp q5, q2, [x1, #96]649; NONEON-NOSVE-NEXT: add sp, sp, #192650; NONEON-NOSVE-NEXT: ret651 %op1 = load <16 x i16>, ptr %a652 %res = uitofp <16 x i16> %op1 to <16 x double>653 store <16 x double> %res, ptr %b654 ret void655}656 657;658; UCVTF S -> H659;660 661define <2 x half> @ucvtf_v2i32_v2f16(<2 x i32> %op1) {662; CHECK-LABEL: ucvtf_v2i32_v2f16:663; CHECK: // %bb.0:664; CHECK-NEXT: ptrue p0.s, vl4665; CHECK-NEXT: // kill: def $d0 killed $d0 def $z0666; CHECK-NEXT: ucvtf z0.h, p0/m, z0.s667; CHECK-NEXT: uzp1 z0.h, z0.h, z0.h668; CHECK-NEXT: // kill: def $d0 killed $d0 killed $z0669; CHECK-NEXT: ret670;671; NONEON-NOSVE-LABEL: ucvtf_v2i32_v2f16:672; NONEON-NOSVE: // %bb.0:673; NONEON-NOSVE-NEXT: str d0, [sp, #-16]!674; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 16675; NONEON-NOSVE-NEXT: ldp w8, w9, [sp]676; NONEON-NOSVE-NEXT: str wzr, [sp, #12]677; NONEON-NOSVE-NEXT: ucvtf s0, w9678; NONEON-NOSVE-NEXT: fcvt h0, s0679; NONEON-NOSVE-NEXT: str h0, [sp, #10]680; NONEON-NOSVE-NEXT: ucvtf s0, w8681; NONEON-NOSVE-NEXT: fcvt h0, s0682; NONEON-NOSVE-NEXT: str h0, [sp, #8]683; NONEON-NOSVE-NEXT: ldr d0, [sp, #8]684; NONEON-NOSVE-NEXT: add sp, sp, #16685; NONEON-NOSVE-NEXT: ret686 %res = uitofp <2 x i32> %op1 to <2 x half>687 ret <2 x half> %res688}689 690define <4 x half> @ucvtf_v4i32_v4f16(<4 x i32> %op1) {691; CHECK-LABEL: ucvtf_v4i32_v4f16:692; CHECK: // %bb.0:693; CHECK-NEXT: ptrue p0.s, vl4694; CHECK-NEXT: // kill: def $q0 killed $q0 def $z0695; CHECK-NEXT: ucvtf z0.h, p0/m, z0.s696; CHECK-NEXT: uzp1 z0.h, z0.h, z0.h697; CHECK-NEXT: // kill: def $d0 killed $d0 killed $z0698; CHECK-NEXT: ret699;700; NONEON-NOSVE-LABEL: ucvtf_v4i32_v4f16:701; NONEON-NOSVE: // %bb.0:702; NONEON-NOSVE-NEXT: str q0, [sp, #-32]!703; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 32704; NONEON-NOSVE-NEXT: ldp w8, w9, [sp, #8]705; NONEON-NOSVE-NEXT: ucvtf s0, w9706; NONEON-NOSVE-NEXT: fcvt h0, s0707; NONEON-NOSVE-NEXT: str h0, [sp, #30]708; NONEON-NOSVE-NEXT: ucvtf s0, w8709; NONEON-NOSVE-NEXT: ldp w8, w9, [sp]710; NONEON-NOSVE-NEXT: fcvt h0, s0711; NONEON-NOSVE-NEXT: str h0, [sp, #28]712; NONEON-NOSVE-NEXT: ucvtf s0, w9713; NONEON-NOSVE-NEXT: fcvt h0, s0714; NONEON-NOSVE-NEXT: str h0, [sp, #26]715; NONEON-NOSVE-NEXT: ucvtf s0, w8716; NONEON-NOSVE-NEXT: fcvt h0, s0717; NONEON-NOSVE-NEXT: str h0, [sp, #24]718; NONEON-NOSVE-NEXT: ldr d0, [sp, #24]719; NONEON-NOSVE-NEXT: add sp, sp, #32720; NONEON-NOSVE-NEXT: ret721 %res = uitofp <4 x i32> %op1 to <4 x half>722 ret <4 x half> %res723}724 725define <8 x half> @ucvtf_v8i32_v8f16(ptr %a) {726; CHECK-LABEL: ucvtf_v8i32_v8f16:727; CHECK: // %bb.0:728; CHECK-NEXT: ldp q0, q1, [x0]729; CHECK-NEXT: ptrue p0.s, vl4730; CHECK-NEXT: ucvtf z1.h, p0/m, z1.s731; CHECK-NEXT: ucvtf z0.h, p0/m, z0.s732; CHECK-NEXT: ptrue p0.h, vl4733; CHECK-NEXT: uzp1 z1.h, z1.h, z1.h734; CHECK-NEXT: uzp1 z0.h, z0.h, z0.h735; CHECK-NEXT: splice z0.h, p0, z0.h, z1.h736; CHECK-NEXT: // kill: def $q0 killed $q0 killed $z0737; CHECK-NEXT: ret738;739; NONEON-NOSVE-LABEL: ucvtf_v8i32_v8f16:740; NONEON-NOSVE: // %bb.0:741; NONEON-NOSVE-NEXT: ldp q1, q0, [x0]742; NONEON-NOSVE-NEXT: stp q1, q0, [sp, #-48]!743; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 48744; NONEON-NOSVE-NEXT: ldp w8, w9, [sp, #24]745; NONEON-NOSVE-NEXT: ucvtf s0, w9746; NONEON-NOSVE-NEXT: fcvt h0, s0747; NONEON-NOSVE-NEXT: str h0, [sp, #46]748; NONEON-NOSVE-NEXT: ucvtf s0, w8749; NONEON-NOSVE-NEXT: ldp w8, w9, [sp, #16]750; NONEON-NOSVE-NEXT: fcvt h0, s0751; NONEON-NOSVE-NEXT: str h0, [sp, #44]752; NONEON-NOSVE-NEXT: ucvtf s0, w9753; NONEON-NOSVE-NEXT: fcvt h0, s0754; NONEON-NOSVE-NEXT: str h0, [sp, #42]755; NONEON-NOSVE-NEXT: ucvtf s0, w8756; NONEON-NOSVE-NEXT: ldp w8, w9, [sp, #8]757; NONEON-NOSVE-NEXT: fcvt h0, s0758; NONEON-NOSVE-NEXT: str h0, [sp, #40]759; NONEON-NOSVE-NEXT: ucvtf s0, w9760; NONEON-NOSVE-NEXT: fcvt h0, s0761; NONEON-NOSVE-NEXT: str h0, [sp, #38]762; NONEON-NOSVE-NEXT: ucvtf s0, w8763; NONEON-NOSVE-NEXT: ldp w8, w9, [sp]764; NONEON-NOSVE-NEXT: fcvt h0, s0765; NONEON-NOSVE-NEXT: str h0, [sp, #36]766; NONEON-NOSVE-NEXT: ucvtf s0, w9767; NONEON-NOSVE-NEXT: fcvt h0, s0768; NONEON-NOSVE-NEXT: str h0, [sp, #34]769; NONEON-NOSVE-NEXT: ucvtf s0, w8770; NONEON-NOSVE-NEXT: fcvt h0, s0771; NONEON-NOSVE-NEXT: str h0, [sp, #32]772; NONEON-NOSVE-NEXT: ldr q0, [sp, #32]773; NONEON-NOSVE-NEXT: add sp, sp, #48774; NONEON-NOSVE-NEXT: ret775 %op1 = load <8 x i32>, ptr %a776 %res = uitofp <8 x i32> %op1 to <8 x half>777 ret <8 x half> %res778}779 780define void @ucvtf_v16i32_v16f16(ptr %a, ptr %b) {781; CHECK-LABEL: ucvtf_v16i32_v16f16:782; CHECK: // %bb.0:783; CHECK-NEXT: ldp q0, q1, [x0, #32]784; CHECK-NEXT: ptrue p0.s, vl4785; CHECK-NEXT: ldp q2, q3, [x0]786; CHECK-NEXT: ucvtf z1.h, p0/m, z1.s787; CHECK-NEXT: ucvtf z0.h, p0/m, z0.s788; CHECK-NEXT: ucvtf z3.h, p0/m, z3.s789; CHECK-NEXT: ucvtf z2.h, p0/m, z2.s790; CHECK-NEXT: ptrue p0.h, vl4791; CHECK-NEXT: uzp1 z1.h, z1.h, z1.h792; CHECK-NEXT: uzp1 z0.h, z0.h, z0.h793; CHECK-NEXT: uzp1 z3.h, z3.h, z3.h794; CHECK-NEXT: uzp1 z2.h, z2.h, z2.h795; CHECK-NEXT: splice z0.h, p0, z0.h, z1.h796; CHECK-NEXT: splice z2.h, p0, z2.h, z3.h797; CHECK-NEXT: stp q2, q0, [x1]798; CHECK-NEXT: ret799;800; NONEON-NOSVE-LABEL: ucvtf_v16i32_v16f16:801; NONEON-NOSVE: // %bb.0:802; NONEON-NOSVE-NEXT: sub sp, sp, #96803; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 96804; NONEON-NOSVE-NEXT: ldp q1, q0, [x0]805; NONEON-NOSVE-NEXT: ldp q2, q3, [x0, #32]806; NONEON-NOSVE-NEXT: str q1, [sp]807; NONEON-NOSVE-NEXT: stp q3, q0, [sp, #16]808; NONEON-NOSVE-NEXT: ldp w8, w9, [sp, #40]809; NONEON-NOSVE-NEXT: str q2, [sp, #48]810; NONEON-NOSVE-NEXT: ucvtf s0, w9811; NONEON-NOSVE-NEXT: fcvt h0, s0812; NONEON-NOSVE-NEXT: str h0, [sp, #78]813; NONEON-NOSVE-NEXT: ucvtf s0, w8814; NONEON-NOSVE-NEXT: ldp w8, w9, [sp, #32]815; NONEON-NOSVE-NEXT: fcvt h0, s0816; NONEON-NOSVE-NEXT: str h0, [sp, #76]817; NONEON-NOSVE-NEXT: ucvtf s0, w9818; NONEON-NOSVE-NEXT: fcvt h0, s0819; NONEON-NOSVE-NEXT: str h0, [sp, #74]820; NONEON-NOSVE-NEXT: ucvtf s0, w8821; NONEON-NOSVE-NEXT: ldp w8, w9, [sp, #8]822; NONEON-NOSVE-NEXT: fcvt h0, s0823; NONEON-NOSVE-NEXT: str h0, [sp, #72]824; NONEON-NOSVE-NEXT: ucvtf s0, w9825; NONEON-NOSVE-NEXT: fcvt h0, s0826; NONEON-NOSVE-NEXT: str h0, [sp, #70]827; NONEON-NOSVE-NEXT: ucvtf s0, w8828; NONEON-NOSVE-NEXT: ldp w8, w9, [sp]829; NONEON-NOSVE-NEXT: fcvt h0, s0830; NONEON-NOSVE-NEXT: str h0, [sp, #68]831; NONEON-NOSVE-NEXT: ucvtf s0, w9832; NONEON-NOSVE-NEXT: fcvt h0, s0833; NONEON-NOSVE-NEXT: str h0, [sp, #66]834; NONEON-NOSVE-NEXT: ucvtf s0, w8835; NONEON-NOSVE-NEXT: ldp w8, w9, [sp, #24]836; NONEON-NOSVE-NEXT: fcvt h0, s0837; NONEON-NOSVE-NEXT: str h0, [sp, #64]838; NONEON-NOSVE-NEXT: ucvtf s0, w9839; NONEON-NOSVE-NEXT: fcvt h0, s0840; NONEON-NOSVE-NEXT: str h0, [sp, #94]841; NONEON-NOSVE-NEXT: ucvtf s0, w8842; NONEON-NOSVE-NEXT: ldp w8, w9, [sp, #16]843; NONEON-NOSVE-NEXT: fcvt h0, s0844; NONEON-NOSVE-NEXT: str h0, [sp, #92]845; NONEON-NOSVE-NEXT: ucvtf s0, w9846; NONEON-NOSVE-NEXT: fcvt h0, s0847; NONEON-NOSVE-NEXT: str h0, [sp, #90]848; NONEON-NOSVE-NEXT: ucvtf s0, w8849; NONEON-NOSVE-NEXT: ldp w8, w9, [sp, #56]850; NONEON-NOSVE-NEXT: fcvt h0, s0851; NONEON-NOSVE-NEXT: str h0, [sp, #88]852; NONEON-NOSVE-NEXT: ucvtf s0, w9853; NONEON-NOSVE-NEXT: fcvt h0, s0854; NONEON-NOSVE-NEXT: str h0, [sp, #86]855; NONEON-NOSVE-NEXT: ucvtf s0, w8856; NONEON-NOSVE-NEXT: ldp w8, w9, [sp, #48]857; NONEON-NOSVE-NEXT: fcvt h0, s0858; NONEON-NOSVE-NEXT: str h0, [sp, #84]859; NONEON-NOSVE-NEXT: ucvtf s0, w9860; NONEON-NOSVE-NEXT: fcvt h0, s0861; NONEON-NOSVE-NEXT: str h0, [sp, #82]862; NONEON-NOSVE-NEXT: ucvtf s0, w8863; NONEON-NOSVE-NEXT: fcvt h0, s0864; NONEON-NOSVE-NEXT: str h0, [sp, #80]865; NONEON-NOSVE-NEXT: ldp q1, q0, [sp, #64]866; NONEON-NOSVE-NEXT: stp q1, q0, [x1]867; NONEON-NOSVE-NEXT: add sp, sp, #96868; NONEON-NOSVE-NEXT: ret869 %op1 = load <16 x i32>, ptr %a870 %res = uitofp <16 x i32> %op1 to <16 x half>871 store <16 x half> %res, ptr %b872 ret void873}874 875;876; UCVTF S -> S877;878 879define <2 x float> @ucvtf_v2i32_v2f32(<2 x i32> %op1) {880; CHECK-LABEL: ucvtf_v2i32_v2f32:881; CHECK: // %bb.0:882; CHECK-NEXT: ptrue p0.s, vl2883; CHECK-NEXT: // kill: def $d0 killed $d0 def $z0884; CHECK-NEXT: ucvtf z0.s, p0/m, z0.s885; CHECK-NEXT: // kill: def $d0 killed $d0 killed $z0886; CHECK-NEXT: ret887;888; NONEON-NOSVE-LABEL: ucvtf_v2i32_v2f32:889; NONEON-NOSVE: // %bb.0:890; NONEON-NOSVE-NEXT: str d0, [sp, #-16]!891; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 16892; NONEON-NOSVE-NEXT: ldp w8, w9, [sp]893; NONEON-NOSVE-NEXT: ucvtf s1, w9894; NONEON-NOSVE-NEXT: ucvtf s0, w8895; NONEON-NOSVE-NEXT: stp s0, s1, [sp, #8]896; NONEON-NOSVE-NEXT: ldr d0, [sp, #8]897; NONEON-NOSVE-NEXT: add sp, sp, #16898; NONEON-NOSVE-NEXT: ret899 %res = uitofp <2 x i32> %op1 to <2 x float>900 ret <2 x float> %res901}902 903define <4 x float> @ucvtf_v4i32_v4f32(<4 x i32> %op1) {904; CHECK-LABEL: ucvtf_v4i32_v4f32:905; CHECK: // %bb.0:906; CHECK-NEXT: ptrue p0.s, vl4907; CHECK-NEXT: // kill: def $q0 killed $q0 def $z0908; CHECK-NEXT: ucvtf z0.s, p0/m, z0.s909; CHECK-NEXT: // kill: def $q0 killed $q0 killed $z0910; CHECK-NEXT: ret911;912; NONEON-NOSVE-LABEL: ucvtf_v4i32_v4f32:913; NONEON-NOSVE: // %bb.0:914; NONEON-NOSVE-NEXT: str q0, [sp, #-32]!915; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 32916; NONEON-NOSVE-NEXT: ldp w8, w9, [sp, #8]917; NONEON-NOSVE-NEXT: ucvtf s1, w9918; NONEON-NOSVE-NEXT: ucvtf s0, w8919; NONEON-NOSVE-NEXT: ldp w8, w9, [sp]920; NONEON-NOSVE-NEXT: stp s0, s1, [sp, #24]921; NONEON-NOSVE-NEXT: ucvtf s1, w9922; NONEON-NOSVE-NEXT: ucvtf s0, w8923; NONEON-NOSVE-NEXT: stp s0, s1, [sp, #16]924; NONEON-NOSVE-NEXT: ldr q0, [sp, #16]925; NONEON-NOSVE-NEXT: add sp, sp, #32926; NONEON-NOSVE-NEXT: ret927 %res = uitofp <4 x i32> %op1 to <4 x float>928 ret <4 x float> %res929}930 931define void @ucvtf_v8i32_v8f32(ptr %a, ptr %b) {932; CHECK-LABEL: ucvtf_v8i32_v8f32:933; CHECK: // %bb.0:934; CHECK-NEXT: ldp q0, q1, [x0]935; CHECK-NEXT: ptrue p0.s, vl4936; CHECK-NEXT: ucvtf z0.s, p0/m, z0.s937; CHECK-NEXT: ucvtf z1.s, p0/m, z1.s938; CHECK-NEXT: stp q0, q1, [x1]939; CHECK-NEXT: ret940;941; NONEON-NOSVE-LABEL: ucvtf_v8i32_v8f32:942; NONEON-NOSVE: // %bb.0:943; NONEON-NOSVE-NEXT: ldp q1, q0, [x0]944; NONEON-NOSVE-NEXT: stp q1, q0, [sp, #-64]!945; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 64946; NONEON-NOSVE-NEXT: ldp w8, w9, [sp, #24]947; NONEON-NOSVE-NEXT: ucvtf s1, w9948; NONEON-NOSVE-NEXT: ucvtf s0, w8949; NONEON-NOSVE-NEXT: ldp w8, w9, [sp, #16]950; NONEON-NOSVE-NEXT: stp s0, s1, [sp, #56]951; NONEON-NOSVE-NEXT: ucvtf s1, w9952; NONEON-NOSVE-NEXT: ucvtf s0, w8953; NONEON-NOSVE-NEXT: ldp w8, w9, [sp, #8]954; NONEON-NOSVE-NEXT: stp s0, s1, [sp, #48]955; NONEON-NOSVE-NEXT: ucvtf s1, w9956; NONEON-NOSVE-NEXT: ucvtf s0, w8957; NONEON-NOSVE-NEXT: ldp w8, w9, [sp]958; NONEON-NOSVE-NEXT: stp s0, s1, [sp, #40]959; NONEON-NOSVE-NEXT: ucvtf s1, w9960; NONEON-NOSVE-NEXT: ucvtf s0, w8961; NONEON-NOSVE-NEXT: stp s0, s1, [sp, #32]962; NONEON-NOSVE-NEXT: ldp q0, q1, [sp, #32]963; NONEON-NOSVE-NEXT: stp q0, q1, [x1]964; NONEON-NOSVE-NEXT: add sp, sp, #64965; NONEON-NOSVE-NEXT: ret966 %op1 = load <8 x i32>, ptr %a967 %res = uitofp <8 x i32> %op1 to <8 x float>968 store <8 x float> %res, ptr %b969 ret void970}971 972;973; UCVTF S -> D974;975 976define <2 x double> @ucvtf_v2i32_v2f64(<2 x i32> %op1) {977; CHECK-LABEL: ucvtf_v2i32_v2f64:978; CHECK: // %bb.0:979; CHECK-NEXT: // kill: def $d0 killed $d0 def $z0980; CHECK-NEXT: ptrue p0.d, vl2981; CHECK-NEXT: uunpklo z0.d, z0.s982; CHECK-NEXT: ucvtf z0.d, p0/m, z0.d983; CHECK-NEXT: // kill: def $q0 killed $q0 killed $z0984; CHECK-NEXT: ret985;986; NONEON-NOSVE-LABEL: ucvtf_v2i32_v2f64:987; NONEON-NOSVE: // %bb.0:988; NONEON-NOSVE-NEXT: sub sp, sp, #32989; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 32990; NONEON-NOSVE-NEXT: str d0, [sp, #8]991; NONEON-NOSVE-NEXT: ldp w8, w9, [sp, #8]992; NONEON-NOSVE-NEXT: ucvtf d1, w9993; NONEON-NOSVE-NEXT: ucvtf d0, w8994; NONEON-NOSVE-NEXT: stp d0, d1, [sp, #16]995; NONEON-NOSVE-NEXT: ldr q0, [sp, #16]996; NONEON-NOSVE-NEXT: add sp, sp, #32997; NONEON-NOSVE-NEXT: ret998 %res = uitofp <2 x i32> %op1 to <2 x double>999 ret <2 x double> %res1000}1001 1002define void @ucvtf_v4i32_v4f64(ptr %a, ptr %b) {1003; CHECK-LABEL: ucvtf_v4i32_v4f64:1004; CHECK: // %bb.0:1005; CHECK-NEXT: ldr q0, [x0]1006; CHECK-NEXT: ptrue p0.d, vl21007; CHECK-NEXT: movprfx z1, z01008; CHECK-NEXT: ext z1.b, z1.b, z0.b, #81009; CHECK-NEXT: uunpklo z0.d, z0.s1010; CHECK-NEXT: uunpklo z1.d, z1.s1011; CHECK-NEXT: ucvtf z0.d, p0/m, z0.d1012; CHECK-NEXT: ucvtf z1.d, p0/m, z1.d1013; CHECK-NEXT: stp q0, q1, [x1]1014; CHECK-NEXT: ret1015;1016; NONEON-NOSVE-LABEL: ucvtf_v4i32_v4f64:1017; NONEON-NOSVE: // %bb.0:1018; NONEON-NOSVE-NEXT: ldr q0, [x0]1019; NONEON-NOSVE-NEXT: str q0, [sp, #-64]!1020; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 641021; NONEON-NOSVE-NEXT: ldp d1, d0, [sp]1022; NONEON-NOSVE-NEXT: stp d0, d1, [sp, #16]1023; NONEON-NOSVE-NEXT: ldp w8, w9, [sp, #24]1024; NONEON-NOSVE-NEXT: ucvtf d1, w91025; NONEON-NOSVE-NEXT: ucvtf d0, w81026; NONEON-NOSVE-NEXT: ldp w8, w9, [sp, #16]1027; NONEON-NOSVE-NEXT: stp d0, d1, [sp, #48]1028; NONEON-NOSVE-NEXT: ucvtf d1, w91029; NONEON-NOSVE-NEXT: ucvtf d0, w81030; NONEON-NOSVE-NEXT: stp d0, d1, [sp, #32]1031; NONEON-NOSVE-NEXT: ldp q0, q1, [sp, #32]1032; NONEON-NOSVE-NEXT: stp q1, q0, [x1]1033; NONEON-NOSVE-NEXT: add sp, sp, #641034; NONEON-NOSVE-NEXT: ret1035 %op1 = load <4 x i32>, ptr %a1036 %res = uitofp <4 x i32> %op1 to <4 x double>1037 store <4 x double> %res, ptr %b1038 ret void1039}1040 1041define void @ucvtf_v8i32_v8f64(ptr %a, ptr %b) {1042; CHECK-LABEL: ucvtf_v8i32_v8f64:1043; CHECK: // %bb.0:1044; CHECK-NEXT: ldp q1, q0, [x0]1045; CHECK-NEXT: ptrue p0.d, vl21046; CHECK-NEXT: movprfx z2, z01047; CHECK-NEXT: ext z2.b, z2.b, z0.b, #81048; CHECK-NEXT: movprfx z3, z11049; CHECK-NEXT: ext z3.b, z3.b, z1.b, #81050; CHECK-NEXT: uunpklo z0.d, z0.s1051; CHECK-NEXT: uunpklo z1.d, z1.s1052; CHECK-NEXT: uunpklo z2.d, z2.s1053; CHECK-NEXT: uunpklo z3.d, z3.s1054; CHECK-NEXT: ucvtf z0.d, p0/m, z0.d1055; CHECK-NEXT: ucvtf z1.d, p0/m, z1.d1056; CHECK-NEXT: ucvtf z2.d, p0/m, z2.d1057; CHECK-NEXT: ucvtf z3.d, p0/m, z3.d1058; CHECK-NEXT: stp q1, q3, [x1]1059; CHECK-NEXT: stp q0, q2, [x1, #32]1060; CHECK-NEXT: ret1061;1062; NONEON-NOSVE-LABEL: ucvtf_v8i32_v8f64:1063; NONEON-NOSVE: // %bb.0:1064; NONEON-NOSVE-NEXT: ldp q0, q1, [x0]1065; NONEON-NOSVE-NEXT: stp q0, q1, [sp, #-128]!1066; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 1281067; NONEON-NOSVE-NEXT: ldp d1, d0, [sp]1068; NONEON-NOSVE-NEXT: stp d0, d1, [sp, #32]1069; NONEON-NOSVE-NEXT: ldp d1, d0, [sp, #16]1070; NONEON-NOSVE-NEXT: ldp w8, w9, [sp, #40]1071; NONEON-NOSVE-NEXT: stp d0, d1, [sp, #48]1072; NONEON-NOSVE-NEXT: ucvtf d1, w91073; NONEON-NOSVE-NEXT: ucvtf d0, w81074; NONEON-NOSVE-NEXT: ldp w8, w9, [sp, #32]1075; NONEON-NOSVE-NEXT: stp d0, d1, [sp, #80]1076; NONEON-NOSVE-NEXT: ucvtf d1, w91077; NONEON-NOSVE-NEXT: ucvtf d0, w81078; NONEON-NOSVE-NEXT: ldp w8, w9, [sp, #56]1079; NONEON-NOSVE-NEXT: stp d0, d1, [sp, #64]1080; NONEON-NOSVE-NEXT: ucvtf d1, w91081; NONEON-NOSVE-NEXT: ucvtf d0, w81082; NONEON-NOSVE-NEXT: ldp w8, w9, [sp, #48]1083; NONEON-NOSVE-NEXT: ldp q3, q2, [sp, #64]1084; NONEON-NOSVE-NEXT: stp d0, d1, [sp, #112]1085; NONEON-NOSVE-NEXT: ucvtf d1, w91086; NONEON-NOSVE-NEXT: ucvtf d0, w81087; NONEON-NOSVE-NEXT: stp d0, d1, [sp, #96]1088; NONEON-NOSVE-NEXT: ldp q0, q1, [sp, #96]1089; NONEON-NOSVE-NEXT: stp q2, q3, [x1]1090; NONEON-NOSVE-NEXT: stp q1, q0, [x1, #32]1091; NONEON-NOSVE-NEXT: add sp, sp, #1281092; NONEON-NOSVE-NEXT: ret1093 %op1 = load <8 x i32>, ptr %a1094 %res = uitofp <8 x i32> %op1 to <8 x double>1095 store <8 x double> %res, ptr %b1096 ret void1097}1098 1099;1100; UCVTF D -> H1101;1102 1103define <2 x half> @ucvtf_v2i64_v2f16(<2 x i64> %op1) {1104; CHECK-LABEL: ucvtf_v2i64_v2f16:1105; CHECK: // %bb.0:1106; CHECK-NEXT: // kill: def $q0 killed $q0 def $z01107; CHECK-NEXT: mov z1.d, z0.d[1]1108; CHECK-NEXT: ptrue p0.d1109; CHECK-NEXT: ucvtf z0.h, p0/m, z0.d1110; CHECK-NEXT: ucvtf z1.h, p0/m, z1.d1111; CHECK-NEXT: zip1 z0.h, z0.h, z1.h1112; CHECK-NEXT: // kill: def $d0 killed $d0 killed $z01113; CHECK-NEXT: ret1114;1115; NONEON-NOSVE-LABEL: ucvtf_v2i64_v2f16:1116; NONEON-NOSVE: // %bb.0:1117; NONEON-NOSVE-NEXT: str q0, [sp, #-32]!1118; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 321119; NONEON-NOSVE-NEXT: ldp x8, x9, [sp]1120; NONEON-NOSVE-NEXT: ucvtf s0, x91121; NONEON-NOSVE-NEXT: fcvt h0, s01122; NONEON-NOSVE-NEXT: str h0, [sp, #26]1123; NONEON-NOSVE-NEXT: ucvtf s0, x81124; NONEON-NOSVE-NEXT: fcvt h0, s01125; NONEON-NOSVE-NEXT: str h0, [sp, #24]1126; NONEON-NOSVE-NEXT: ldr d0, [sp, #24]1127; NONEON-NOSVE-NEXT: add sp, sp, #321128; NONEON-NOSVE-NEXT: ret1129 %res = uitofp <2 x i64> %op1 to <2 x half>1130 ret <2 x half> %res1131}1132 1133define <4 x half> @ucvtf_v4i64_v4f16(ptr %a) {1134; CHECK-LABEL: ucvtf_v4i64_v4f16:1135; CHECK: // %bb.0:1136; CHECK-NEXT: ldp q0, q1, [x0]1137; CHECK-NEXT: ptrue p0.d, vl21138; CHECK-NEXT: ucvtf z1.s, p0/m, z1.d1139; CHECK-NEXT: ucvtf z0.s, p0/m, z0.d1140; CHECK-NEXT: ptrue p0.s, vl21141; CHECK-NEXT: uzp1 z1.s, z1.s, z1.s1142; CHECK-NEXT: uzp1 z0.s, z0.s, z0.s1143; CHECK-NEXT: splice z0.s, p0, z0.s, z1.s1144; CHECK-NEXT: ptrue p0.s1145; CHECK-NEXT: fcvt z0.h, p0/m, z0.s1146; CHECK-NEXT: uzp1 z0.h, z0.h, z0.h1147; CHECK-NEXT: // kill: def $d0 killed $d0 killed $z01148; CHECK-NEXT: ret1149;1150; NONEON-NOSVE-LABEL: ucvtf_v4i64_v4f16:1151; NONEON-NOSVE: // %bb.0:1152; NONEON-NOSVE-NEXT: ldp q1, q0, [x0]1153; NONEON-NOSVE-NEXT: stp q1, q0, [sp, #-48]!1154; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 481155; NONEON-NOSVE-NEXT: ldp x8, x9, [sp, #16]1156; NONEON-NOSVE-NEXT: ucvtf s0, x91157; NONEON-NOSVE-NEXT: fcvt h0, s01158; NONEON-NOSVE-NEXT: str h0, [sp, #46]1159; NONEON-NOSVE-NEXT: ucvtf s0, x81160; NONEON-NOSVE-NEXT: ldp x8, x9, [sp]1161; NONEON-NOSVE-NEXT: fcvt h0, s01162; NONEON-NOSVE-NEXT: str h0, [sp, #44]1163; NONEON-NOSVE-NEXT: ucvtf s0, x91164; NONEON-NOSVE-NEXT: fcvt h0, s01165; NONEON-NOSVE-NEXT: str h0, [sp, #42]1166; NONEON-NOSVE-NEXT: ucvtf s0, x81167; NONEON-NOSVE-NEXT: fcvt h0, s01168; NONEON-NOSVE-NEXT: str h0, [sp, #40]1169; NONEON-NOSVE-NEXT: ldr d0, [sp, #40]1170; NONEON-NOSVE-NEXT: add sp, sp, #481171; NONEON-NOSVE-NEXT: ret1172 %op1 = load <4 x i64>, ptr %a1173 %res = uitofp <4 x i64> %op1 to <4 x half>1174 ret <4 x half> %res1175}1176 1177define <8 x half> @ucvtf_v8i64_v8f16(ptr %a) {1178; CHECK-LABEL: ucvtf_v8i64_v8f16:1179; CHECK: // %bb.0:1180; CHECK-NEXT: ldp q1, q0, [x0, #32]1181; CHECK-NEXT: ptrue p0.d, vl21182; CHECK-NEXT: ldp q2, q3, [x0]1183; CHECK-NEXT: ucvtf z0.s, p0/m, z0.d1184; CHECK-NEXT: ucvtf z1.s, p0/m, z1.d1185; CHECK-NEXT: ucvtf z3.s, p0/m, z3.d1186; CHECK-NEXT: ucvtf z2.s, p0/m, z2.d1187; CHECK-NEXT: ptrue p0.s, vl21188; CHECK-NEXT: uzp1 z0.s, z0.s, z0.s1189; CHECK-NEXT: uzp1 z1.s, z1.s, z1.s1190; CHECK-NEXT: uzp1 z3.s, z3.s, z3.s1191; CHECK-NEXT: uzp1 z2.s, z2.s, z2.s1192; CHECK-NEXT: splice z1.s, p0, z1.s, z0.s1193; CHECK-NEXT: splice z2.s, p0, z2.s, z3.s1194; CHECK-NEXT: ptrue p0.s1195; CHECK-NEXT: movprfx z0, z11196; CHECK-NEXT: fcvt z0.h, p0/m, z1.s1197; CHECK-NEXT: movprfx z1, z21198; CHECK-NEXT: fcvt z1.h, p0/m, z2.s1199; CHECK-NEXT: ptrue p0.h, vl41200; CHECK-NEXT: uzp1 z2.h, z0.h, z0.h1201; CHECK-NEXT: uzp1 z0.h, z1.h, z1.h1202; CHECK-NEXT: splice z0.h, p0, z0.h, z2.h1203; CHECK-NEXT: // kill: def $q0 killed $q0 killed $z01204; CHECK-NEXT: ret1205;1206; NONEON-NOSVE-LABEL: ucvtf_v8i64_v8f16:1207; NONEON-NOSVE: // %bb.0:1208; NONEON-NOSVE-NEXT: sub sp, sp, #801209; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 801210; NONEON-NOSVE-NEXT: ldp q1, q0, [x0, #32]1211; NONEON-NOSVE-NEXT: ldp q2, q3, [x0]1212; NONEON-NOSVE-NEXT: str q1, [sp, #48]1213; NONEON-NOSVE-NEXT: stp q0, q3, [sp, #16]1214; NONEON-NOSVE-NEXT: ldp x8, x9, [sp, #16]1215; NONEON-NOSVE-NEXT: str q2, [sp]1216; NONEON-NOSVE-NEXT: ucvtf s0, x91217; NONEON-NOSVE-NEXT: fcvt h0, s01218; NONEON-NOSVE-NEXT: str h0, [sp, #78]1219; NONEON-NOSVE-NEXT: ucvtf s0, x81220; NONEON-NOSVE-NEXT: ldp x8, x9, [sp, #48]1221; NONEON-NOSVE-NEXT: fcvt h0, s01222; NONEON-NOSVE-NEXT: str h0, [sp, #76]1223; NONEON-NOSVE-NEXT: ucvtf s0, x91224; NONEON-NOSVE-NEXT: fcvt h0, s01225; NONEON-NOSVE-NEXT: str h0, [sp, #74]1226; NONEON-NOSVE-NEXT: ucvtf s0, x81227; NONEON-NOSVE-NEXT: ldp x8, x9, [sp, #32]1228; NONEON-NOSVE-NEXT: fcvt h0, s01229; NONEON-NOSVE-NEXT: str h0, [sp, #72]1230; NONEON-NOSVE-NEXT: ucvtf s0, x91231; NONEON-NOSVE-NEXT: fcvt h0, s01232; NONEON-NOSVE-NEXT: str h0, [sp, #70]1233; NONEON-NOSVE-NEXT: ucvtf s0, x81234; NONEON-NOSVE-NEXT: ldp x8, x9, [sp]1235; NONEON-NOSVE-NEXT: fcvt h0, s01236; NONEON-NOSVE-NEXT: str h0, [sp, #68]1237; NONEON-NOSVE-NEXT: ucvtf s0, x91238; NONEON-NOSVE-NEXT: fcvt h0, s01239; NONEON-NOSVE-NEXT: str h0, [sp, #66]1240; NONEON-NOSVE-NEXT: ucvtf s0, x81241; NONEON-NOSVE-NEXT: fcvt h0, s01242; NONEON-NOSVE-NEXT: str h0, [sp, #64]1243; NONEON-NOSVE-NEXT: ldr q0, [sp, #64]1244; NONEON-NOSVE-NEXT: add sp, sp, #801245; NONEON-NOSVE-NEXT: ret1246 %op1 = load <8 x i64>, ptr %a1247 %res = uitofp <8 x i64> %op1 to <8 x half>1248 ret <8 x half> %res1249}1250 1251;1252; UCVTF D -> S1253;1254 1255define <2 x float> @ucvtf_v2i64_v2f32(<2 x i64> %op1) {1256; CHECK-LABEL: ucvtf_v2i64_v2f32:1257; CHECK: // %bb.0:1258; CHECK-NEXT: ptrue p0.d, vl21259; CHECK-NEXT: // kill: def $q0 killed $q0 def $z01260; CHECK-NEXT: ucvtf z0.s, p0/m, z0.d1261; CHECK-NEXT: uzp1 z0.s, z0.s, z0.s1262; CHECK-NEXT: // kill: def $d0 killed $d0 killed $z01263; CHECK-NEXT: ret1264;1265; NONEON-NOSVE-LABEL: ucvtf_v2i64_v2f32:1266; NONEON-NOSVE: // %bb.0:1267; NONEON-NOSVE-NEXT: str q0, [sp, #-32]!1268; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 321269; NONEON-NOSVE-NEXT: ldp x8, x9, [sp]1270; NONEON-NOSVE-NEXT: ucvtf s1, x91271; NONEON-NOSVE-NEXT: ucvtf s0, x81272; NONEON-NOSVE-NEXT: stp s0, s1, [sp, #24]1273; NONEON-NOSVE-NEXT: ldr d0, [sp, #24]1274; NONEON-NOSVE-NEXT: add sp, sp, #321275; NONEON-NOSVE-NEXT: ret1276 %res = uitofp <2 x i64> %op1 to <2 x float>1277 ret <2 x float> %res1278}1279 1280define <4 x float> @ucvtf_v4i64_v4f32(ptr %a) {1281; CHECK-LABEL: ucvtf_v4i64_v4f32:1282; CHECK: // %bb.0:1283; CHECK-NEXT: ldp q0, q1, [x0]1284; CHECK-NEXT: ptrue p0.d, vl21285; CHECK-NEXT: ucvtf z1.s, p0/m, z1.d1286; CHECK-NEXT: ucvtf z0.s, p0/m, z0.d1287; CHECK-NEXT: ptrue p0.s, vl21288; CHECK-NEXT: uzp1 z1.s, z1.s, z1.s1289; CHECK-NEXT: uzp1 z0.s, z0.s, z0.s1290; CHECK-NEXT: splice z0.s, p0, z0.s, z1.s1291; CHECK-NEXT: // kill: def $q0 killed $q0 killed $z01292; CHECK-NEXT: ret1293;1294; NONEON-NOSVE-LABEL: ucvtf_v4i64_v4f32:1295; NONEON-NOSVE: // %bb.0:1296; NONEON-NOSVE-NEXT: ldp q1, q0, [x0]1297; NONEON-NOSVE-NEXT: stp q1, q0, [sp, #-48]!1298; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 481299; NONEON-NOSVE-NEXT: ldp x8, x9, [sp, #16]1300; NONEON-NOSVE-NEXT: ucvtf s1, x91301; NONEON-NOSVE-NEXT: ucvtf s0, x81302; NONEON-NOSVE-NEXT: ldp x8, x9, [sp]1303; NONEON-NOSVE-NEXT: stp s0, s1, [sp, #40]1304; NONEON-NOSVE-NEXT: ucvtf s1, x91305; NONEON-NOSVE-NEXT: ucvtf s0, x81306; NONEON-NOSVE-NEXT: stp s0, s1, [sp, #32]1307; NONEON-NOSVE-NEXT: ldr q0, [sp, #32]1308; NONEON-NOSVE-NEXT: add sp, sp, #481309; NONEON-NOSVE-NEXT: ret1310 %op1 = load <4 x i64>, ptr %a1311 %res = uitofp <4 x i64> %op1 to <4 x float>1312 ret <4 x float> %res1313}1314 1315define void @ucvtf_v8i64_v8f32(ptr %a, ptr %b) {1316; CHECK-LABEL: ucvtf_v8i64_v8f32:1317; CHECK: // %bb.0:1318; CHECK-NEXT: ldp q0, q1, [x0, #32]1319; CHECK-NEXT: ptrue p0.d, vl21320; CHECK-NEXT: ldp q2, q3, [x0]1321; CHECK-NEXT: ucvtf z1.s, p0/m, z1.d1322; CHECK-NEXT: ucvtf z0.s, p0/m, z0.d1323; CHECK-NEXT: ucvtf z3.s, p0/m, z3.d1324; CHECK-NEXT: ucvtf z2.s, p0/m, z2.d1325; CHECK-NEXT: ptrue p0.s, vl21326; CHECK-NEXT: uzp1 z1.s, z1.s, z1.s1327; CHECK-NEXT: uzp1 z0.s, z0.s, z0.s1328; CHECK-NEXT: uzp1 z3.s, z3.s, z3.s1329; CHECK-NEXT: uzp1 z2.s, z2.s, z2.s1330; CHECK-NEXT: splice z0.s, p0, z0.s, z1.s1331; CHECK-NEXT: splice z2.s, p0, z2.s, z3.s1332; CHECK-NEXT: stp q2, q0, [x1]1333; CHECK-NEXT: ret1334;1335; NONEON-NOSVE-LABEL: ucvtf_v8i64_v8f32:1336; NONEON-NOSVE: // %bb.0:1337; NONEON-NOSVE-NEXT: sub sp, sp, #961338; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 961339; NONEON-NOSVE-NEXT: ldp q1, q0, [x0]1340; NONEON-NOSVE-NEXT: ldp q2, q3, [x0, #32]1341; NONEON-NOSVE-NEXT: str q1, [sp]1342; NONEON-NOSVE-NEXT: stp q3, q0, [sp, #16]1343; NONEON-NOSVE-NEXT: ldp x8, x9, [sp, #32]1344; NONEON-NOSVE-NEXT: str q2, [sp, #48]1345; NONEON-NOSVE-NEXT: ucvtf s1, x91346; NONEON-NOSVE-NEXT: ucvtf s0, x81347; NONEON-NOSVE-NEXT: ldp x8, x9, [sp]1348; NONEON-NOSVE-NEXT: stp s0, s1, [sp, #72]1349; NONEON-NOSVE-NEXT: ucvtf s1, x91350; NONEON-NOSVE-NEXT: ucvtf s0, x81351; NONEON-NOSVE-NEXT: ldp x8, x9, [sp, #16]1352; NONEON-NOSVE-NEXT: stp s0, s1, [sp, #64]1353; NONEON-NOSVE-NEXT: ucvtf s1, x91354; NONEON-NOSVE-NEXT: ucvtf s0, x81355; NONEON-NOSVE-NEXT: ldp x8, x9, [sp, #48]1356; NONEON-NOSVE-NEXT: stp s0, s1, [sp, #88]1357; NONEON-NOSVE-NEXT: ucvtf s1, x91358; NONEON-NOSVE-NEXT: ucvtf s0, x81359; NONEON-NOSVE-NEXT: stp s0, s1, [sp, #80]1360; NONEON-NOSVE-NEXT: ldp q1, q0, [sp, #64]1361; NONEON-NOSVE-NEXT: stp q1, q0, [x1]1362; NONEON-NOSVE-NEXT: add sp, sp, #961363; NONEON-NOSVE-NEXT: ret1364 %op1 = load <8 x i64>, ptr %a1365 %res = uitofp <8 x i64> %op1 to <8 x float>1366 store <8 x float> %res, ptr %b1367 ret void1368}1369 1370;1371; UCVTF D -> D1372;1373 1374define <2 x double> @ucvtf_v2i64_v2f64(<2 x i64> %op1) {1375; CHECK-LABEL: ucvtf_v2i64_v2f64:1376; CHECK: // %bb.0:1377; CHECK-NEXT: ptrue p0.d, vl21378; CHECK-NEXT: // kill: def $q0 killed $q0 def $z01379; CHECK-NEXT: ucvtf z0.d, p0/m, z0.d1380; CHECK-NEXT: // kill: def $q0 killed $q0 killed $z01381; CHECK-NEXT: ret1382;1383; NONEON-NOSVE-LABEL: ucvtf_v2i64_v2f64:1384; NONEON-NOSVE: // %bb.0:1385; NONEON-NOSVE-NEXT: str q0, [sp, #-32]!1386; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 321387; NONEON-NOSVE-NEXT: ldp x8, x9, [sp]1388; NONEON-NOSVE-NEXT: ucvtf d1, x91389; NONEON-NOSVE-NEXT: ucvtf d0, x81390; NONEON-NOSVE-NEXT: stp d0, d1, [sp, #16]1391; NONEON-NOSVE-NEXT: ldr q0, [sp, #16]1392; NONEON-NOSVE-NEXT: add sp, sp, #321393; NONEON-NOSVE-NEXT: ret1394 %res = uitofp <2 x i64> %op1 to <2 x double>1395 ret <2 x double> %res1396}1397 1398define void @ucvtf_v4i64_v4f64(ptr %a, ptr %b) {1399; CHECK-LABEL: ucvtf_v4i64_v4f64:1400; CHECK: // %bb.0:1401; CHECK-NEXT: ldp q0, q1, [x0]1402; CHECK-NEXT: ptrue p0.d, vl21403; CHECK-NEXT: ucvtf z0.d, p0/m, z0.d1404; CHECK-NEXT: ucvtf z1.d, p0/m, z1.d1405; CHECK-NEXT: stp q0, q1, [x1]1406; CHECK-NEXT: ret1407;1408; NONEON-NOSVE-LABEL: ucvtf_v4i64_v4f64:1409; NONEON-NOSVE: // %bb.0:1410; NONEON-NOSVE-NEXT: ldp q1, q0, [x0]1411; NONEON-NOSVE-NEXT: stp q1, q0, [sp, #-64]!1412; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 641413; NONEON-NOSVE-NEXT: ldp x8, x9, [sp, #16]1414; NONEON-NOSVE-NEXT: ucvtf d1, x91415; NONEON-NOSVE-NEXT: ucvtf d0, x81416; NONEON-NOSVE-NEXT: ldp x8, x9, [sp]1417; NONEON-NOSVE-NEXT: stp d0, d1, [sp, #48]1418; NONEON-NOSVE-NEXT: ucvtf d1, x91419; NONEON-NOSVE-NEXT: ucvtf d0, x81420; NONEON-NOSVE-NEXT: stp d0, d1, [sp, #32]1421; NONEON-NOSVE-NEXT: ldp q0, q1, [sp, #32]1422; NONEON-NOSVE-NEXT: stp q0, q1, [x1]1423; NONEON-NOSVE-NEXT: add sp, sp, #641424; NONEON-NOSVE-NEXT: ret1425 %op1 = load <4 x i64>, ptr %a1426 %res = uitofp <4 x i64> %op1 to <4 x double>1427 store <4 x double> %res, ptr %b1428 ret void1429}1430 1431;1432; SCVTF H -> H1433;1434 1435define <4 x half> @scvtf_v4i16_v4f16(<4 x i16> %op1) {1436; CHECK-LABEL: scvtf_v4i16_v4f16:1437; CHECK: // %bb.0:1438; CHECK-NEXT: ptrue p0.h, vl41439; CHECK-NEXT: // kill: def $d0 killed $d0 def $z01440; CHECK-NEXT: scvtf z0.h, p0/m, z0.h1441; CHECK-NEXT: // kill: def $d0 killed $d0 killed $z01442; CHECK-NEXT: ret1443;1444; NONEON-NOSVE-LABEL: scvtf_v4i16_v4f16:1445; NONEON-NOSVE: // %bb.0:1446; NONEON-NOSVE-NEXT: str d0, [sp, #-16]!1447; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 161448; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #6]1449; NONEON-NOSVE-NEXT: scvtf s0, w81450; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #4]1451; NONEON-NOSVE-NEXT: fcvt h0, s01452; NONEON-NOSVE-NEXT: str h0, [sp, #14]1453; NONEON-NOSVE-NEXT: scvtf s0, w81454; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #2]1455; NONEON-NOSVE-NEXT: fcvt h0, s01456; NONEON-NOSVE-NEXT: str h0, [sp, #12]1457; NONEON-NOSVE-NEXT: scvtf s0, w81458; NONEON-NOSVE-NEXT: ldrsh w8, [sp]1459; NONEON-NOSVE-NEXT: fcvt h0, s01460; NONEON-NOSVE-NEXT: str h0, [sp, #10]1461; NONEON-NOSVE-NEXT: scvtf s0, w81462; NONEON-NOSVE-NEXT: fcvt h0, s01463; NONEON-NOSVE-NEXT: str h0, [sp, #8]1464; NONEON-NOSVE-NEXT: ldr d0, [sp, #8]1465; NONEON-NOSVE-NEXT: add sp, sp, #161466; NONEON-NOSVE-NEXT: ret1467 %res = sitofp <4 x i16> %op1 to <4 x half>1468 ret <4 x half> %res1469}1470 1471define void @scvtf_v8i16_v8f16(ptr %a, ptr %b) {1472; CHECK-LABEL: scvtf_v8i16_v8f16:1473; CHECK: // %bb.0:1474; CHECK-NEXT: ptrue p0.h, vl81475; CHECK-NEXT: ldr q0, [x0]1476; CHECK-NEXT: scvtf z0.h, p0/m, z0.h1477; CHECK-NEXT: str q0, [x1]1478; CHECK-NEXT: ret1479;1480; NONEON-NOSVE-LABEL: scvtf_v8i16_v8f16:1481; NONEON-NOSVE: // %bb.0:1482; NONEON-NOSVE-NEXT: ldr q0, [x0]1483; NONEON-NOSVE-NEXT: str q0, [sp, #-32]!1484; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 321485; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #14]1486; NONEON-NOSVE-NEXT: scvtf s0, w81487; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #12]1488; NONEON-NOSVE-NEXT: fcvt h0, s01489; NONEON-NOSVE-NEXT: str h0, [sp, #30]1490; NONEON-NOSVE-NEXT: scvtf s0, w81491; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #10]1492; NONEON-NOSVE-NEXT: fcvt h0, s01493; NONEON-NOSVE-NEXT: str h0, [sp, #28]1494; NONEON-NOSVE-NEXT: scvtf s0, w81495; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #8]1496; NONEON-NOSVE-NEXT: fcvt h0, s01497; NONEON-NOSVE-NEXT: str h0, [sp, #26]1498; NONEON-NOSVE-NEXT: scvtf s0, w81499; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #6]1500; NONEON-NOSVE-NEXT: fcvt h0, s01501; NONEON-NOSVE-NEXT: str h0, [sp, #24]1502; NONEON-NOSVE-NEXT: scvtf s0, w81503; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #4]1504; NONEON-NOSVE-NEXT: fcvt h0, s01505; NONEON-NOSVE-NEXT: str h0, [sp, #22]1506; NONEON-NOSVE-NEXT: scvtf s0, w81507; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #2]1508; NONEON-NOSVE-NEXT: fcvt h0, s01509; NONEON-NOSVE-NEXT: str h0, [sp, #20]1510; NONEON-NOSVE-NEXT: scvtf s0, w81511; NONEON-NOSVE-NEXT: ldrsh w8, [sp]1512; NONEON-NOSVE-NEXT: fcvt h0, s01513; NONEON-NOSVE-NEXT: str h0, [sp, #18]1514; NONEON-NOSVE-NEXT: scvtf s0, w81515; NONEON-NOSVE-NEXT: fcvt h0, s01516; NONEON-NOSVE-NEXT: str h0, [sp, #16]1517; NONEON-NOSVE-NEXT: ldr q0, [sp, #16]1518; NONEON-NOSVE-NEXT: str q0, [x1]1519; NONEON-NOSVE-NEXT: add sp, sp, #321520; NONEON-NOSVE-NEXT: ret1521 %op1 = load <8 x i16>, ptr %a1522 %res = sitofp <8 x i16> %op1 to <8 x half>1523 store <8 x half> %res, ptr %b1524 ret void1525}1526 1527define void @scvtf_v16i16_v16f16(ptr %a, ptr %b) {1528; CHECK-LABEL: scvtf_v16i16_v16f16:1529; CHECK: // %bb.0:1530; CHECK-NEXT: ldp q0, q1, [x0]1531; CHECK-NEXT: ptrue p0.h, vl81532; CHECK-NEXT: scvtf z0.h, p0/m, z0.h1533; CHECK-NEXT: scvtf z1.h, p0/m, z1.h1534; CHECK-NEXT: stp q0, q1, [x1]1535; CHECK-NEXT: ret1536;1537; NONEON-NOSVE-LABEL: scvtf_v16i16_v16f16:1538; NONEON-NOSVE: // %bb.0:1539; NONEON-NOSVE-NEXT: ldp q1, q0, [x0]1540; NONEON-NOSVE-NEXT: stp q1, q0, [sp, #-64]!1541; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 641542; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #30]1543; NONEON-NOSVE-NEXT: scvtf s0, w81544; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #28]1545; NONEON-NOSVE-NEXT: fcvt h0, s01546; NONEON-NOSVE-NEXT: str h0, [sp, #62]1547; NONEON-NOSVE-NEXT: scvtf s0, w81548; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #26]1549; NONEON-NOSVE-NEXT: fcvt h0, s01550; NONEON-NOSVE-NEXT: str h0, [sp, #60]1551; NONEON-NOSVE-NEXT: scvtf s0, w81552; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #24]1553; NONEON-NOSVE-NEXT: fcvt h0, s01554; NONEON-NOSVE-NEXT: str h0, [sp, #58]1555; NONEON-NOSVE-NEXT: scvtf s0, w81556; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #22]1557; NONEON-NOSVE-NEXT: fcvt h0, s01558; NONEON-NOSVE-NEXT: str h0, [sp, #56]1559; NONEON-NOSVE-NEXT: scvtf s0, w81560; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #20]1561; NONEON-NOSVE-NEXT: fcvt h0, s01562; NONEON-NOSVE-NEXT: str h0, [sp, #54]1563; NONEON-NOSVE-NEXT: scvtf s0, w81564; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #18]1565; NONEON-NOSVE-NEXT: fcvt h0, s01566; NONEON-NOSVE-NEXT: str h0, [sp, #52]1567; NONEON-NOSVE-NEXT: scvtf s0, w81568; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #16]1569; NONEON-NOSVE-NEXT: fcvt h0, s01570; NONEON-NOSVE-NEXT: str h0, [sp, #50]1571; NONEON-NOSVE-NEXT: scvtf s0, w81572; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #14]1573; NONEON-NOSVE-NEXT: fcvt h0, s01574; NONEON-NOSVE-NEXT: str h0, [sp, #48]1575; NONEON-NOSVE-NEXT: scvtf s0, w81576; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #12]1577; NONEON-NOSVE-NEXT: fcvt h0, s01578; NONEON-NOSVE-NEXT: str h0, [sp, #46]1579; NONEON-NOSVE-NEXT: scvtf s0, w81580; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #10]1581; NONEON-NOSVE-NEXT: fcvt h0, s01582; NONEON-NOSVE-NEXT: str h0, [sp, #44]1583; NONEON-NOSVE-NEXT: scvtf s0, w81584; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #8]1585; NONEON-NOSVE-NEXT: fcvt h0, s01586; NONEON-NOSVE-NEXT: str h0, [sp, #42]1587; NONEON-NOSVE-NEXT: scvtf s0, w81588; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #6]1589; NONEON-NOSVE-NEXT: fcvt h0, s01590; NONEON-NOSVE-NEXT: str h0, [sp, #40]1591; NONEON-NOSVE-NEXT: scvtf s0, w81592; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #4]1593; NONEON-NOSVE-NEXT: fcvt h0, s01594; NONEON-NOSVE-NEXT: str h0, [sp, #38]1595; NONEON-NOSVE-NEXT: scvtf s0, w81596; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #2]1597; NONEON-NOSVE-NEXT: fcvt h0, s01598; NONEON-NOSVE-NEXT: str h0, [sp, #36]1599; NONEON-NOSVE-NEXT: scvtf s0, w81600; NONEON-NOSVE-NEXT: ldrsh w8, [sp]1601; NONEON-NOSVE-NEXT: fcvt h0, s01602; NONEON-NOSVE-NEXT: str h0, [sp, #34]1603; NONEON-NOSVE-NEXT: scvtf s0, w81604; NONEON-NOSVE-NEXT: fcvt h0, s01605; NONEON-NOSVE-NEXT: str h0, [sp, #32]1606; NONEON-NOSVE-NEXT: ldp q0, q1, [sp, #32]1607; NONEON-NOSVE-NEXT: stp q0, q1, [x1]1608; NONEON-NOSVE-NEXT: add sp, sp, #641609; NONEON-NOSVE-NEXT: ret1610 %op1 = load <16 x i16>, ptr %a1611 %res = sitofp <16 x i16> %op1 to <16 x half>1612 store <16 x half> %res, ptr %b1613 ret void1614}1615 1616; SCVTF H -> S1617;1618 1619define <2 x float> @scvtf_v2i16_v2f32(<2 x i16> %op1) {1620; CHECK-LABEL: scvtf_v2i16_v2f32:1621; CHECK: // %bb.0:1622; CHECK-NEXT: ptrue p0.s, vl21623; CHECK-NEXT: // kill: def $d0 killed $d0 def $z01624; CHECK-NEXT: sxth z0.s, p0/m, z0.s1625; CHECK-NEXT: scvtf z0.s, p0/m, z0.s1626; CHECK-NEXT: // kill: def $d0 killed $d0 killed $z01627; CHECK-NEXT: ret1628;1629; NONEON-NOSVE-LABEL: scvtf_v2i16_v2f32:1630; NONEON-NOSVE: // %bb.0:1631; NONEON-NOSVE-NEXT: str d0, [sp, #-16]!1632; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 161633; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #4]1634; NONEON-NOSVE-NEXT: ldrsh w9, [sp]1635; NONEON-NOSVE-NEXT: scvtf s0, w81636; NONEON-NOSVE-NEXT: scvtf s1, w91637; NONEON-NOSVE-NEXT: stp s1, s0, [sp, #8]1638; NONEON-NOSVE-NEXT: ldr d0, [sp, #8]1639; NONEON-NOSVE-NEXT: add sp, sp, #161640; NONEON-NOSVE-NEXT: ret1641 %res = sitofp <2 x i16> %op1 to <2 x float>1642 ret <2 x float> %res1643}1644 1645define <4 x float> @scvtf_v4i16_v4f32(<4 x i16> %op1) {1646; CHECK-LABEL: scvtf_v4i16_v4f32:1647; CHECK: // %bb.0:1648; CHECK-NEXT: // kill: def $d0 killed $d0 def $z01649; CHECK-NEXT: ptrue p0.s, vl41650; CHECK-NEXT: sunpklo z0.s, z0.h1651; CHECK-NEXT: scvtf z0.s, p0/m, z0.s1652; CHECK-NEXT: // kill: def $q0 killed $q0 killed $z01653; CHECK-NEXT: ret1654;1655; NONEON-NOSVE-LABEL: scvtf_v4i16_v4f32:1656; NONEON-NOSVE: // %bb.0:1657; NONEON-NOSVE-NEXT: sub sp, sp, #321658; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 321659; NONEON-NOSVE-NEXT: str d0, [sp, #8]1660; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #14]1661; NONEON-NOSVE-NEXT: scvtf s1, w81662; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #12]1663; NONEON-NOSVE-NEXT: scvtf s0, w81664; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #10]1665; NONEON-NOSVE-NEXT: stp s0, s1, [sp, #24]1666; NONEON-NOSVE-NEXT: scvtf s1, w81667; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #8]1668; NONEON-NOSVE-NEXT: scvtf s0, w81669; NONEON-NOSVE-NEXT: stp s0, s1, [sp, #16]1670; NONEON-NOSVE-NEXT: ldr q0, [sp, #16]1671; NONEON-NOSVE-NEXT: add sp, sp, #321672; NONEON-NOSVE-NEXT: ret1673 %res = sitofp <4 x i16> %op1 to <4 x float>1674 ret <4 x float> %res1675}1676 1677define void @scvtf_v8i16_v8f32(ptr %a, ptr %b) {1678; CHECK-LABEL: scvtf_v8i16_v8f32:1679; CHECK: // %bb.0:1680; CHECK-NEXT: ldr q0, [x0]1681; CHECK-NEXT: ptrue p0.s, vl41682; CHECK-NEXT: movprfx z1, z01683; CHECK-NEXT: ext z1.b, z1.b, z0.b, #81684; CHECK-NEXT: sunpklo z0.s, z0.h1685; CHECK-NEXT: sunpklo z1.s, z1.h1686; CHECK-NEXT: scvtf z0.s, p0/m, z0.s1687; CHECK-NEXT: scvtf z1.s, p0/m, z1.s1688; CHECK-NEXT: stp q0, q1, [x1]1689; CHECK-NEXT: ret1690;1691; NONEON-NOSVE-LABEL: scvtf_v8i16_v8f32:1692; NONEON-NOSVE: // %bb.0:1693; NONEON-NOSVE-NEXT: ldr q0, [x0]1694; NONEON-NOSVE-NEXT: str q0, [sp, #-64]!1695; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 641696; NONEON-NOSVE-NEXT: ldp d1, d0, [sp]1697; NONEON-NOSVE-NEXT: stp d0, d1, [sp, #16]1698; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #30]1699; NONEON-NOSVE-NEXT: scvtf s1, w81700; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #28]1701; NONEON-NOSVE-NEXT: scvtf s0, w81702; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #26]1703; NONEON-NOSVE-NEXT: stp s0, s1, [sp, #56]1704; NONEON-NOSVE-NEXT: scvtf s1, w81705; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #24]1706; NONEON-NOSVE-NEXT: scvtf s0, w81707; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #22]1708; NONEON-NOSVE-NEXT: stp s0, s1, [sp, #48]1709; NONEON-NOSVE-NEXT: scvtf s1, w81710; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #20]1711; NONEON-NOSVE-NEXT: scvtf s0, w81712; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #18]1713; NONEON-NOSVE-NEXT: stp s0, s1, [sp, #40]1714; NONEON-NOSVE-NEXT: scvtf s1, w81715; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #16]1716; NONEON-NOSVE-NEXT: scvtf s0, w81717; NONEON-NOSVE-NEXT: stp s0, s1, [sp, #32]1718; NONEON-NOSVE-NEXT: ldp q0, q1, [sp, #32]1719; NONEON-NOSVE-NEXT: stp q1, q0, [x1]1720; NONEON-NOSVE-NEXT: add sp, sp, #641721; NONEON-NOSVE-NEXT: ret1722 %op1 = load <8 x i16>, ptr %a1723 %res = sitofp <8 x i16> %op1 to <8 x float>1724 store <8 x float> %res, ptr %b1725 ret void1726}1727 1728define void @scvtf_v16i16_v16f32(ptr %a, ptr %b) {1729; CHECK-LABEL: scvtf_v16i16_v16f32:1730; CHECK: // %bb.0:1731; CHECK-NEXT: ldp q1, q0, [x0]1732; CHECK-NEXT: ptrue p0.s, vl41733; CHECK-NEXT: movprfx z2, z01734; CHECK-NEXT: ext z2.b, z2.b, z0.b, #81735; CHECK-NEXT: movprfx z3, z11736; CHECK-NEXT: ext z3.b, z3.b, z1.b, #81737; CHECK-NEXT: sunpklo z0.s, z0.h1738; CHECK-NEXT: sunpklo z1.s, z1.h1739; CHECK-NEXT: sunpklo z2.s, z2.h1740; CHECK-NEXT: sunpklo z3.s, z3.h1741; CHECK-NEXT: scvtf z0.s, p0/m, z0.s1742; CHECK-NEXT: scvtf z1.s, p0/m, z1.s1743; CHECK-NEXT: scvtf z2.s, p0/m, z2.s1744; CHECK-NEXT: scvtf z3.s, p0/m, z3.s1745; CHECK-NEXT: stp q1, q3, [x1]1746; CHECK-NEXT: stp q0, q2, [x1, #32]1747; CHECK-NEXT: ret1748;1749; NONEON-NOSVE-LABEL: scvtf_v16i16_v16f32:1750; NONEON-NOSVE: // %bb.0:1751; NONEON-NOSVE-NEXT: ldp q0, q1, [x0]1752; NONEON-NOSVE-NEXT: stp q0, q1, [sp, #-128]!1753; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 1281754; NONEON-NOSVE-NEXT: ldp d1, d0, [sp]1755; NONEON-NOSVE-NEXT: stp d0, d1, [sp, #32]1756; NONEON-NOSVE-NEXT: ldp d1, d0, [sp, #16]1757; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #46]1758; NONEON-NOSVE-NEXT: stp d0, d1, [sp, #48]1759; NONEON-NOSVE-NEXT: scvtf s1, w81760; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #44]1761; NONEON-NOSVE-NEXT: scvtf s0, w81762; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #42]1763; NONEON-NOSVE-NEXT: stp s0, s1, [sp, #88]1764; NONEON-NOSVE-NEXT: scvtf s1, w81765; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #40]1766; NONEON-NOSVE-NEXT: scvtf s0, w81767; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #38]1768; NONEON-NOSVE-NEXT: stp s0, s1, [sp, #80]1769; NONEON-NOSVE-NEXT: scvtf s1, w81770; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #36]1771; NONEON-NOSVE-NEXT: scvtf s0, w81772; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #34]1773; NONEON-NOSVE-NEXT: stp s0, s1, [sp, #72]1774; NONEON-NOSVE-NEXT: scvtf s1, w81775; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #32]1776; NONEON-NOSVE-NEXT: scvtf s0, w81777; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #62]1778; NONEON-NOSVE-NEXT: stp s0, s1, [sp, #64]1779; NONEON-NOSVE-NEXT: scvtf s1, w81780; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #60]1781; NONEON-NOSVE-NEXT: ldp q3, q2, [sp, #64]1782; NONEON-NOSVE-NEXT: scvtf s0, w81783; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #58]1784; NONEON-NOSVE-NEXT: stp s0, s1, [sp, #120]1785; NONEON-NOSVE-NEXT: scvtf s1, w81786; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #56]1787; NONEON-NOSVE-NEXT: scvtf s0, w81788; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #54]1789; NONEON-NOSVE-NEXT: stp s0, s1, [sp, #112]1790; NONEON-NOSVE-NEXT: scvtf s1, w81791; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #52]1792; NONEON-NOSVE-NEXT: scvtf s0, w81793; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #50]1794; NONEON-NOSVE-NEXT: stp s0, s1, [sp, #104]1795; NONEON-NOSVE-NEXT: scvtf s1, w81796; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #48]1797; NONEON-NOSVE-NEXT: scvtf s0, w81798; NONEON-NOSVE-NEXT: stp s0, s1, [sp, #96]1799; NONEON-NOSVE-NEXT: ldp q0, q1, [sp, #96]1800; NONEON-NOSVE-NEXT: stp q2, q3, [x1]1801; NONEON-NOSVE-NEXT: stp q1, q0, [x1, #32]1802; NONEON-NOSVE-NEXT: add sp, sp, #1281803; NONEON-NOSVE-NEXT: ret1804 %op1 = load <16 x i16>, ptr %a1805 %res = sitofp <16 x i16> %op1 to <16 x float>1806 store <16 x float> %res, ptr %b1807 ret void1808}1809 1810;1811; SCVTF H -> D1812;1813 1814define <2 x double> @scvtf_v2i16_v2f64(<2 x i16> %op1) {1815; CHECK-LABEL: scvtf_v2i16_v2f64:1816; CHECK: // %bb.0:1817; CHECK-NEXT: ptrue p0.s, vl21818; CHECK-NEXT: // kill: def $d0 killed $d0 def $z01819; CHECK-NEXT: sxth z0.s, p0/m, z0.s1820; CHECK-NEXT: ptrue p0.d, vl21821; CHECK-NEXT: sunpklo z0.d, z0.s1822; CHECK-NEXT: scvtf z0.d, p0/m, z0.d1823; CHECK-NEXT: // kill: def $q0 killed $q0 killed $z01824; CHECK-NEXT: ret1825;1826; NONEON-NOSVE-LABEL: scvtf_v2i16_v2f64:1827; NONEON-NOSVE: // %bb.0:1828; NONEON-NOSVE-NEXT: sub sp, sp, #321829; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 321830; NONEON-NOSVE-NEXT: str d0, [sp, #8]1831; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #12]1832; NONEON-NOSVE-NEXT: ldrsh w9, [sp, #8]1833; NONEON-NOSVE-NEXT: scvtf d0, w81834; NONEON-NOSVE-NEXT: scvtf d1, w91835; NONEON-NOSVE-NEXT: stp d1, d0, [sp, #16]1836; NONEON-NOSVE-NEXT: ldr q0, [sp, #16]1837; NONEON-NOSVE-NEXT: add sp, sp, #321838; NONEON-NOSVE-NEXT: ret1839 %res = sitofp <2 x i16> %op1 to <2 x double>1840 ret <2 x double> %res1841}1842 1843define void @scvtf_v4i16_v4f64(ptr %a, ptr %b) {1844; CHECK-LABEL: scvtf_v4i16_v4f64:1845; CHECK: // %bb.0:1846; CHECK-NEXT: ldr d0, [x0]1847; CHECK-NEXT: ptrue p0.d, vl21848; CHECK-NEXT: sunpklo z0.s, z0.h1849; CHECK-NEXT: movprfx z1, z01850; CHECK-NEXT: ext z1.b, z1.b, z0.b, #81851; CHECK-NEXT: sunpklo z0.d, z0.s1852; CHECK-NEXT: sunpklo z1.d, z1.s1853; CHECK-NEXT: scvtf z0.d, p0/m, z0.d1854; CHECK-NEXT: scvtf z1.d, p0/m, z1.d1855; CHECK-NEXT: stp q0, q1, [x1]1856; CHECK-NEXT: ret1857;1858; NONEON-NOSVE-LABEL: scvtf_v4i16_v4f64:1859; NONEON-NOSVE: // %bb.0:1860; NONEON-NOSVE-NEXT: sub sp, sp, #481861; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 481862; NONEON-NOSVE-NEXT: ldr d0, [x0]1863; NONEON-NOSVE-NEXT: str d0, [sp, #8]1864; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #10]1865; NONEON-NOSVE-NEXT: scvtf d1, w81866; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #8]1867; NONEON-NOSVE-NEXT: scvtf d0, w81868; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #14]1869; NONEON-NOSVE-NEXT: stp d0, d1, [sp, #32]1870; NONEON-NOSVE-NEXT: scvtf d1, w81871; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #12]1872; NONEON-NOSVE-NEXT: scvtf d0, w81873; NONEON-NOSVE-NEXT: stp d0, d1, [sp, #16]1874; NONEON-NOSVE-NEXT: ldp q0, q1, [sp, #16]1875; NONEON-NOSVE-NEXT: stp q1, q0, [x1]1876; NONEON-NOSVE-NEXT: add sp, sp, #481877; NONEON-NOSVE-NEXT: ret1878 %op1 = load <4 x i16>, ptr %a1879 %res = sitofp <4 x i16> %op1 to <4 x double>1880 store <4 x double> %res, ptr %b1881 ret void1882}1883 1884define void @scvtf_v8i16_v8f64(ptr %a, ptr %b) {1885; CHECK-LABEL: scvtf_v8i16_v8f64:1886; CHECK: // %bb.0:1887; CHECK-NEXT: ldr q0, [x0]1888; CHECK-NEXT: ptrue p0.d, vl21889; CHECK-NEXT: movprfx z1, z01890; CHECK-NEXT: ext z1.b, z1.b, z0.b, #81891; CHECK-NEXT: sunpklo z0.s, z0.h1892; CHECK-NEXT: sunpklo z1.s, z1.h1893; CHECK-NEXT: movprfx z2, z01894; CHECK-NEXT: ext z2.b, z2.b, z0.b, #81895; CHECK-NEXT: sunpklo z0.d, z0.s1896; CHECK-NEXT: movprfx z3, z11897; CHECK-NEXT: ext z3.b, z3.b, z1.b, #81898; CHECK-NEXT: sunpklo z2.d, z2.s1899; CHECK-NEXT: sunpklo z1.d, z1.s1900; CHECK-NEXT: scvtf z0.d, p0/m, z0.d1901; CHECK-NEXT: sunpklo z3.d, z3.s1902; CHECK-NEXT: scvtf z2.d, p0/m, z2.d1903; CHECK-NEXT: scvtf z1.d, p0/m, z1.d1904; CHECK-NEXT: scvtf z3.d, p0/m, z3.d1905; CHECK-NEXT: stp q0, q2, [x1]1906; CHECK-NEXT: stp q1, q3, [x1, #32]1907; CHECK-NEXT: ret1908;1909; NONEON-NOSVE-LABEL: scvtf_v8i16_v8f64:1910; NONEON-NOSVE: // %bb.0:1911; NONEON-NOSVE-NEXT: ldr q0, [x0]1912; NONEON-NOSVE-NEXT: str q0, [sp, #-96]!1913; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 961914; NONEON-NOSVE-NEXT: ldp d1, d0, [sp]1915; NONEON-NOSVE-NEXT: stp d0, d1, [sp, #16]1916; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #26]1917; NONEON-NOSVE-NEXT: scvtf d1, w81918; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #24]1919; NONEON-NOSVE-NEXT: scvtf d0, w81920; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #30]1921; NONEON-NOSVE-NEXT: stp d0, d1, [sp, #80]1922; NONEON-NOSVE-NEXT: scvtf d1, w81923; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #28]1924; NONEON-NOSVE-NEXT: scvtf d0, w81925; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #18]1926; NONEON-NOSVE-NEXT: stp d0, d1, [sp, #64]1927; NONEON-NOSVE-NEXT: scvtf d1, w81928; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #16]1929; NONEON-NOSVE-NEXT: ldp q3, q2, [sp, #64]1930; NONEON-NOSVE-NEXT: scvtf d0, w81931; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #22]1932; NONEON-NOSVE-NEXT: stp d0, d1, [sp, #48]1933; NONEON-NOSVE-NEXT: scvtf d1, w81934; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #20]1935; NONEON-NOSVE-NEXT: scvtf d0, w81936; NONEON-NOSVE-NEXT: stp d0, d1, [sp, #32]1937; NONEON-NOSVE-NEXT: ldp q0, q1, [sp, #32]1938; NONEON-NOSVE-NEXT: stp q2, q3, [x1]1939; NONEON-NOSVE-NEXT: stp q1, q0, [x1, #32]1940; NONEON-NOSVE-NEXT: add sp, sp, #961941; NONEON-NOSVE-NEXT: ret1942 %op1 = load <8 x i16>, ptr %a1943 %res = sitofp <8 x i16> %op1 to <8 x double>1944 store <8 x double> %res, ptr %b1945 ret void1946}1947 1948define void @scvtf_v16i16_v16f64(ptr %a, ptr %b) {1949; CHECK-LABEL: scvtf_v16i16_v16f64:1950; CHECK: // %bb.0:1951; CHECK-NEXT: ldp q1, q0, [x0]1952; CHECK-NEXT: ptrue p0.d, vl21953; CHECK-NEXT: movprfx z2, z01954; CHECK-NEXT: ext z2.b, z2.b, z0.b, #81955; CHECK-NEXT: sunpklo z0.s, z0.h1956; CHECK-NEXT: sunpklo z3.s, z1.h1957; CHECK-NEXT: ext z1.b, z1.b, z1.b, #81958; CHECK-NEXT: sunpklo z2.s, z2.h1959; CHECK-NEXT: movprfx z4, z01960; CHECK-NEXT: ext z4.b, z4.b, z0.b, #81961; CHECK-NEXT: sunpklo z1.s, z1.h1962; CHECK-NEXT: movprfx z5, z31963; CHECK-NEXT: ext z5.b, z5.b, z3.b, #81964; CHECK-NEXT: sunpklo z0.d, z0.s1965; CHECK-NEXT: sunpklo z3.d, z3.s1966; CHECK-NEXT: sunpklo z4.d, z4.s1967; CHECK-NEXT: sunpklo z5.d, z5.s1968; CHECK-NEXT: movprfx z6, z21969; CHECK-NEXT: ext z6.b, z6.b, z2.b, #81970; CHECK-NEXT: movprfx z7, z11971; CHECK-NEXT: ext z7.b, z7.b, z1.b, #81972; CHECK-NEXT: sunpklo z2.d, z2.s1973; CHECK-NEXT: sunpklo z1.d, z1.s1974; CHECK-NEXT: scvtf z0.d, p0/m, z0.d1975; CHECK-NEXT: scvtf z3.d, p0/m, z3.d1976; CHECK-NEXT: sunpklo z6.d, z6.s1977; CHECK-NEXT: scvtf z4.d, p0/m, z4.d1978; CHECK-NEXT: sunpklo z7.d, z7.s1979; CHECK-NEXT: scvtf z5.d, p0/m, z5.d1980; CHECK-NEXT: scvtf z2.d, p0/m, z2.d1981; CHECK-NEXT: scvtf z1.d, p0/m, z1.d1982; CHECK-NEXT: stp q3, q5, [x1]1983; CHECK-NEXT: movprfx z3, z71984; CHECK-NEXT: scvtf z3.d, p0/m, z7.d1985; CHECK-NEXT: stp q0, q4, [x1, #64]1986; CHECK-NEXT: movprfx z0, z61987; CHECK-NEXT: scvtf z0.d, p0/m, z6.d1988; CHECK-NEXT: stp q1, q3, [x1, #32]1989; CHECK-NEXT: stp q2, q0, [x1, #96]1990; CHECK-NEXT: ret1991;1992; NONEON-NOSVE-LABEL: scvtf_v16i16_v16f64:1993; NONEON-NOSVE: // %bb.0:1994; NONEON-NOSVE-NEXT: sub sp, sp, #1921995; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 1921996; NONEON-NOSVE-NEXT: ldp q0, q1, [x0]1997; NONEON-NOSVE-NEXT: stp q0, q1, [sp]1998; NONEON-NOSVE-NEXT: ldp d1, d0, [sp]1999; NONEON-NOSVE-NEXT: stp d0, d1, [sp, #32]2000; NONEON-NOSVE-NEXT: ldp d1, d0, [sp, #16]2001; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #42]2002; NONEON-NOSVE-NEXT: stp d0, d1, [sp, #48]2003; NONEON-NOSVE-NEXT: scvtf d1, w82004; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #40]2005; NONEON-NOSVE-NEXT: scvtf d0, w82006; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #46]2007; NONEON-NOSVE-NEXT: stp d0, d1, [sp, #112]2008; NONEON-NOSVE-NEXT: scvtf d1, w82009; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #44]2010; NONEON-NOSVE-NEXT: scvtf d0, w82011; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #34]2012; NONEON-NOSVE-NEXT: stp d0, d1, [sp, #96]2013; NONEON-NOSVE-NEXT: scvtf d1, w82014; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #32]2015; NONEON-NOSVE-NEXT: scvtf d0, w82016; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #38]2017; NONEON-NOSVE-NEXT: stp d0, d1, [sp, #80]2018; NONEON-NOSVE-NEXT: scvtf d1, w82019; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #36]2020; NONEON-NOSVE-NEXT: scvtf d0, w82021; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #58]2022; NONEON-NOSVE-NEXT: stp d0, d1, [sp, #64]2023; NONEON-NOSVE-NEXT: scvtf d1, w82024; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #56]2025; NONEON-NOSVE-NEXT: ldp q4, q3, [sp, #64]2026; NONEON-NOSVE-NEXT: scvtf d0, w82027; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #62]2028; NONEON-NOSVE-NEXT: stp d0, d1, [sp, #176]2029; NONEON-NOSVE-NEXT: scvtf d1, w82030; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #60]2031; NONEON-NOSVE-NEXT: scvtf d0, w82032; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #50]2033; NONEON-NOSVE-NEXT: stp d0, d1, [sp, #160]2034; NONEON-NOSVE-NEXT: scvtf d1, w82035; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #48]2036; NONEON-NOSVE-NEXT: ldp q7, q6, [sp, #160]2037; NONEON-NOSVE-NEXT: scvtf d0, w82038; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #54]2039; NONEON-NOSVE-NEXT: stp d0, d1, [sp, #144]2040; NONEON-NOSVE-NEXT: scvtf d1, w82041; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #52]2042; NONEON-NOSVE-NEXT: scvtf d0, w82043; NONEON-NOSVE-NEXT: stp d0, d1, [sp, #128]2044; NONEON-NOSVE-NEXT: ldp q1, q0, [sp, #96]2045; NONEON-NOSVE-NEXT: ldp q2, q5, [sp, #128]2046; NONEON-NOSVE-NEXT: stp q3, q4, [x1, #32]2047; NONEON-NOSVE-NEXT: stp q6, q7, [x1, #64]2048; NONEON-NOSVE-NEXT: stp q0, q1, [x1]2049; NONEON-NOSVE-NEXT: stp q5, q2, [x1, #96]2050; NONEON-NOSVE-NEXT: add sp, sp, #1922051; NONEON-NOSVE-NEXT: ret2052 %op1 = load <16 x i16>, ptr %a2053 %res = sitofp <16 x i16> %op1 to <16 x double>2054 store <16 x double> %res, ptr %b2055 ret void2056}2057 2058;2059; SCVTF S -> H2060;2061 2062define <2 x half> @scvtf_v2i32_v2f16(<2 x i32> %op1) {2063; CHECK-LABEL: scvtf_v2i32_v2f16:2064; CHECK: // %bb.0:2065; CHECK-NEXT: ptrue p0.s, vl42066; CHECK-NEXT: // kill: def $d0 killed $d0 def $z02067; CHECK-NEXT: scvtf z0.h, p0/m, z0.s2068; CHECK-NEXT: uzp1 z0.h, z0.h, z0.h2069; CHECK-NEXT: // kill: def $d0 killed $d0 killed $z02070; CHECK-NEXT: ret2071;2072; NONEON-NOSVE-LABEL: scvtf_v2i32_v2f16:2073; NONEON-NOSVE: // %bb.0:2074; NONEON-NOSVE-NEXT: str d0, [sp, #-16]!2075; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 162076; NONEON-NOSVE-NEXT: ldp w8, w9, [sp]2077; NONEON-NOSVE-NEXT: str wzr, [sp, #12]2078; NONEON-NOSVE-NEXT: scvtf s0, w92079; NONEON-NOSVE-NEXT: fcvt h0, s02080; NONEON-NOSVE-NEXT: str h0, [sp, #10]2081; NONEON-NOSVE-NEXT: scvtf s0, w82082; NONEON-NOSVE-NEXT: fcvt h0, s02083; NONEON-NOSVE-NEXT: str h0, [sp, #8]2084; NONEON-NOSVE-NEXT: ldr d0, [sp, #8]2085; NONEON-NOSVE-NEXT: add sp, sp, #162086; NONEON-NOSVE-NEXT: ret2087 %res = sitofp <2 x i32> %op1 to <2 x half>2088 ret <2 x half> %res2089}2090 2091define <4 x half> @scvtf_v4i32_v4f16(<4 x i32> %op1) {2092; CHECK-LABEL: scvtf_v4i32_v4f16:2093; CHECK: // %bb.0:2094; CHECK-NEXT: ptrue p0.s, vl42095; CHECK-NEXT: // kill: def $q0 killed $q0 def $z02096; CHECK-NEXT: scvtf z0.h, p0/m, z0.s2097; CHECK-NEXT: uzp1 z0.h, z0.h, z0.h2098; CHECK-NEXT: // kill: def $d0 killed $d0 killed $z02099; CHECK-NEXT: ret2100;2101; NONEON-NOSVE-LABEL: scvtf_v4i32_v4f16:2102; NONEON-NOSVE: // %bb.0:2103; NONEON-NOSVE-NEXT: str q0, [sp, #-32]!2104; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 322105; NONEON-NOSVE-NEXT: ldp w8, w9, [sp, #8]2106; NONEON-NOSVE-NEXT: scvtf s0, w92107; NONEON-NOSVE-NEXT: fcvt h0, s02108; NONEON-NOSVE-NEXT: str h0, [sp, #30]2109; NONEON-NOSVE-NEXT: scvtf s0, w82110; NONEON-NOSVE-NEXT: ldp w8, w9, [sp]2111; NONEON-NOSVE-NEXT: fcvt h0, s02112; NONEON-NOSVE-NEXT: str h0, [sp, #28]2113; NONEON-NOSVE-NEXT: scvtf s0, w92114; NONEON-NOSVE-NEXT: fcvt h0, s02115; NONEON-NOSVE-NEXT: str h0, [sp, #26]2116; NONEON-NOSVE-NEXT: scvtf s0, w82117; NONEON-NOSVE-NEXT: fcvt h0, s02118; NONEON-NOSVE-NEXT: str h0, [sp, #24]2119; NONEON-NOSVE-NEXT: ldr d0, [sp, #24]2120; NONEON-NOSVE-NEXT: add sp, sp, #322121; NONEON-NOSVE-NEXT: ret2122 %res = sitofp <4 x i32> %op1 to <4 x half>2123 ret <4 x half> %res2124}2125 2126define <8 x half> @scvtf_v8i32_v8f16(ptr %a) {2127; CHECK-LABEL: scvtf_v8i32_v8f16:2128; CHECK: // %bb.0:2129; CHECK-NEXT: ldp q0, q1, [x0]2130; CHECK-NEXT: ptrue p0.s, vl42131; CHECK-NEXT: scvtf z1.h, p0/m, z1.s2132; CHECK-NEXT: scvtf z0.h, p0/m, z0.s2133; CHECK-NEXT: ptrue p0.h, vl42134; CHECK-NEXT: uzp1 z1.h, z1.h, z1.h2135; CHECK-NEXT: uzp1 z0.h, z0.h, z0.h2136; CHECK-NEXT: splice z0.h, p0, z0.h, z1.h2137; CHECK-NEXT: // kill: def $q0 killed $q0 killed $z02138; CHECK-NEXT: ret2139;2140; NONEON-NOSVE-LABEL: scvtf_v8i32_v8f16:2141; NONEON-NOSVE: // %bb.0:2142; NONEON-NOSVE-NEXT: ldp q1, q0, [x0]2143; NONEON-NOSVE-NEXT: stp q1, q0, [sp, #-48]!2144; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 482145; NONEON-NOSVE-NEXT: ldp w8, w9, [sp, #24]2146; NONEON-NOSVE-NEXT: scvtf s0, w92147; NONEON-NOSVE-NEXT: fcvt h0, s02148; NONEON-NOSVE-NEXT: str h0, [sp, #46]2149; NONEON-NOSVE-NEXT: scvtf s0, w82150; NONEON-NOSVE-NEXT: ldp w8, w9, [sp, #16]2151; NONEON-NOSVE-NEXT: fcvt h0, s02152; NONEON-NOSVE-NEXT: str h0, [sp, #44]2153; NONEON-NOSVE-NEXT: scvtf s0, w92154; NONEON-NOSVE-NEXT: fcvt h0, s02155; NONEON-NOSVE-NEXT: str h0, [sp, #42]2156; NONEON-NOSVE-NEXT: scvtf s0, w82157; NONEON-NOSVE-NEXT: ldp w8, w9, [sp, #8]2158; NONEON-NOSVE-NEXT: fcvt h0, s02159; NONEON-NOSVE-NEXT: str h0, [sp, #40]2160; NONEON-NOSVE-NEXT: scvtf s0, w92161; NONEON-NOSVE-NEXT: fcvt h0, s02162; NONEON-NOSVE-NEXT: str h0, [sp, #38]2163; NONEON-NOSVE-NEXT: scvtf s0, w82164; NONEON-NOSVE-NEXT: ldp w8, w9, [sp]2165; NONEON-NOSVE-NEXT: fcvt h0, s02166; NONEON-NOSVE-NEXT: str h0, [sp, #36]2167; NONEON-NOSVE-NEXT: scvtf s0, w92168; NONEON-NOSVE-NEXT: fcvt h0, s02169; NONEON-NOSVE-NEXT: str h0, [sp, #34]2170; NONEON-NOSVE-NEXT: scvtf s0, w82171; NONEON-NOSVE-NEXT: fcvt h0, s02172; NONEON-NOSVE-NEXT: str h0, [sp, #32]2173; NONEON-NOSVE-NEXT: ldr q0, [sp, #32]2174; NONEON-NOSVE-NEXT: add sp, sp, #482175; NONEON-NOSVE-NEXT: ret2176 %op1 = load <8 x i32>, ptr %a2177 %res = sitofp <8 x i32> %op1 to <8 x half>2178 ret <8 x half> %res2179}2180 2181;2182; SCVTF S -> S2183;2184 2185define <2 x float> @scvtf_v2i32_v2f32(<2 x i32> %op1) {2186; CHECK-LABEL: scvtf_v2i32_v2f32:2187; CHECK: // %bb.0:2188; CHECK-NEXT: ptrue p0.s, vl22189; CHECK-NEXT: // kill: def $d0 killed $d0 def $z02190; CHECK-NEXT: scvtf z0.s, p0/m, z0.s2191; CHECK-NEXT: // kill: def $d0 killed $d0 killed $z02192; CHECK-NEXT: ret2193;2194; NONEON-NOSVE-LABEL: scvtf_v2i32_v2f32:2195; NONEON-NOSVE: // %bb.0:2196; NONEON-NOSVE-NEXT: str d0, [sp, #-16]!2197; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 162198; NONEON-NOSVE-NEXT: ldp w8, w9, [sp]2199; NONEON-NOSVE-NEXT: scvtf s1, w92200; NONEON-NOSVE-NEXT: scvtf s0, w82201; NONEON-NOSVE-NEXT: stp s0, s1, [sp, #8]2202; NONEON-NOSVE-NEXT: ldr d0, [sp, #8]2203; NONEON-NOSVE-NEXT: add sp, sp, #162204; NONEON-NOSVE-NEXT: ret2205 %res = sitofp <2 x i32> %op1 to <2 x float>2206 ret <2 x float> %res2207}2208 2209define <4 x float> @scvtf_v4i32_v4f32(<4 x i32> %op1) {2210; CHECK-LABEL: scvtf_v4i32_v4f32:2211; CHECK: // %bb.0:2212; CHECK-NEXT: ptrue p0.s, vl42213; CHECK-NEXT: // kill: def $q0 killed $q0 def $z02214; CHECK-NEXT: scvtf z0.s, p0/m, z0.s2215; CHECK-NEXT: // kill: def $q0 killed $q0 killed $z02216; CHECK-NEXT: ret2217;2218; NONEON-NOSVE-LABEL: scvtf_v4i32_v4f32:2219; NONEON-NOSVE: // %bb.0:2220; NONEON-NOSVE-NEXT: str q0, [sp, #-32]!2221; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 322222; NONEON-NOSVE-NEXT: ldp w8, w9, [sp, #8]2223; NONEON-NOSVE-NEXT: scvtf s1, w92224; NONEON-NOSVE-NEXT: scvtf s0, w82225; NONEON-NOSVE-NEXT: ldp w8, w9, [sp]2226; NONEON-NOSVE-NEXT: stp s0, s1, [sp, #24]2227; NONEON-NOSVE-NEXT: scvtf s1, w92228; NONEON-NOSVE-NEXT: scvtf s0, w82229; NONEON-NOSVE-NEXT: stp s0, s1, [sp, #16]2230; NONEON-NOSVE-NEXT: ldr q0, [sp, #16]2231; NONEON-NOSVE-NEXT: add sp, sp, #322232; NONEON-NOSVE-NEXT: ret2233 %res = sitofp <4 x i32> %op1 to <4 x float>2234 ret <4 x float> %res2235}2236 2237define void @scvtf_v8i32_v8f32(ptr %a, ptr %b) {2238; CHECK-LABEL: scvtf_v8i32_v8f32:2239; CHECK: // %bb.0:2240; CHECK-NEXT: ldp q0, q1, [x0]2241; CHECK-NEXT: ptrue p0.s, vl42242; CHECK-NEXT: scvtf z0.s, p0/m, z0.s2243; CHECK-NEXT: scvtf z1.s, p0/m, z1.s2244; CHECK-NEXT: stp q0, q1, [x1]2245; CHECK-NEXT: ret2246;2247; NONEON-NOSVE-LABEL: scvtf_v8i32_v8f32:2248; NONEON-NOSVE: // %bb.0:2249; NONEON-NOSVE-NEXT: ldp q1, q0, [x0]2250; NONEON-NOSVE-NEXT: stp q1, q0, [sp, #-64]!2251; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 642252; NONEON-NOSVE-NEXT: ldp w8, w9, [sp, #24]2253; NONEON-NOSVE-NEXT: scvtf s1, w92254; NONEON-NOSVE-NEXT: scvtf s0, w82255; NONEON-NOSVE-NEXT: ldp w8, w9, [sp, #16]2256; NONEON-NOSVE-NEXT: stp s0, s1, [sp, #56]2257; NONEON-NOSVE-NEXT: scvtf s1, w92258; NONEON-NOSVE-NEXT: scvtf s0, w82259; NONEON-NOSVE-NEXT: ldp w8, w9, [sp, #8]2260; NONEON-NOSVE-NEXT: stp s0, s1, [sp, #48]2261; NONEON-NOSVE-NEXT: scvtf s1, w92262; NONEON-NOSVE-NEXT: scvtf s0, w82263; NONEON-NOSVE-NEXT: ldp w8, w9, [sp]2264; NONEON-NOSVE-NEXT: stp s0, s1, [sp, #40]2265; NONEON-NOSVE-NEXT: scvtf s1, w92266; NONEON-NOSVE-NEXT: scvtf s0, w82267; NONEON-NOSVE-NEXT: stp s0, s1, [sp, #32]2268; NONEON-NOSVE-NEXT: ldp q0, q1, [sp, #32]2269; NONEON-NOSVE-NEXT: stp q0, q1, [x1]2270; NONEON-NOSVE-NEXT: add sp, sp, #642271; NONEON-NOSVE-NEXT: ret2272 %op1 = load <8 x i32>, ptr %a2273 %res = sitofp <8 x i32> %op1 to <8 x float>2274 store <8 x float> %res, ptr %b2275 ret void2276}2277 2278;2279; SCVTF S -> D2280;2281 2282define <2 x double> @scvtf_v2i32_v2f64(<2 x i32> %op1) {2283; CHECK-LABEL: scvtf_v2i32_v2f64:2284; CHECK: // %bb.0:2285; CHECK-NEXT: // kill: def $d0 killed $d0 def $z02286; CHECK-NEXT: ptrue p0.d, vl22287; CHECK-NEXT: sunpklo z0.d, z0.s2288; CHECK-NEXT: scvtf z0.d, p0/m, z0.d2289; CHECK-NEXT: // kill: def $q0 killed $q0 killed $z02290; CHECK-NEXT: ret2291;2292; NONEON-NOSVE-LABEL: scvtf_v2i32_v2f64:2293; NONEON-NOSVE: // %bb.0:2294; NONEON-NOSVE-NEXT: sub sp, sp, #322295; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 322296; NONEON-NOSVE-NEXT: str d0, [sp, #8]2297; NONEON-NOSVE-NEXT: ldp w8, w9, [sp, #8]2298; NONEON-NOSVE-NEXT: scvtf d1, w92299; NONEON-NOSVE-NEXT: scvtf d0, w82300; NONEON-NOSVE-NEXT: stp d0, d1, [sp, #16]2301; NONEON-NOSVE-NEXT: ldr q0, [sp, #16]2302; NONEON-NOSVE-NEXT: add sp, sp, #322303; NONEON-NOSVE-NEXT: ret2304 %res = sitofp <2 x i32> %op1 to <2 x double>2305 ret <2 x double> %res2306}2307 2308define void @scvtf_v4i32_v4f64(ptr %a, ptr %b) {2309; CHECK-LABEL: scvtf_v4i32_v4f64:2310; CHECK: // %bb.0:2311; CHECK-NEXT: ldr q0, [x0]2312; CHECK-NEXT: ptrue p0.d, vl22313; CHECK-NEXT: movprfx z1, z02314; CHECK-NEXT: ext z1.b, z1.b, z0.b, #82315; CHECK-NEXT: sunpklo z0.d, z0.s2316; CHECK-NEXT: sunpklo z1.d, z1.s2317; CHECK-NEXT: scvtf z0.d, p0/m, z0.d2318; CHECK-NEXT: scvtf z1.d, p0/m, z1.d2319; CHECK-NEXT: stp q0, q1, [x1]2320; CHECK-NEXT: ret2321;2322; NONEON-NOSVE-LABEL: scvtf_v4i32_v4f64:2323; NONEON-NOSVE: // %bb.0:2324; NONEON-NOSVE-NEXT: ldr q0, [x0]2325; NONEON-NOSVE-NEXT: str q0, [sp, #-64]!2326; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 642327; NONEON-NOSVE-NEXT: ldp d1, d0, [sp]2328; NONEON-NOSVE-NEXT: stp d0, d1, [sp, #16]2329; NONEON-NOSVE-NEXT: ldp w8, w9, [sp, #24]2330; NONEON-NOSVE-NEXT: scvtf d1, w92331; NONEON-NOSVE-NEXT: scvtf d0, w82332; NONEON-NOSVE-NEXT: ldp w8, w9, [sp, #16]2333; NONEON-NOSVE-NEXT: stp d0, d1, [sp, #48]2334; NONEON-NOSVE-NEXT: scvtf d1, w92335; NONEON-NOSVE-NEXT: scvtf d0, w82336; NONEON-NOSVE-NEXT: stp d0, d1, [sp, #32]2337; NONEON-NOSVE-NEXT: ldp q0, q1, [sp, #32]2338; NONEON-NOSVE-NEXT: stp q1, q0, [x1]2339; NONEON-NOSVE-NEXT: add sp, sp, #642340; NONEON-NOSVE-NEXT: ret2341 %op1 = load <4 x i32>, ptr %a2342 %res = sitofp <4 x i32> %op1 to <4 x double>2343 store <4 x double> %res, ptr %b2344 ret void2345}2346 2347define void @scvtf_v8i32_v8f64(ptr %a, ptr %b) {2348; CHECK-LABEL: scvtf_v8i32_v8f64:2349; CHECK: // %bb.0:2350; CHECK-NEXT: ldp q1, q0, [x0]2351; CHECK-NEXT: ptrue p0.d, vl22352; CHECK-NEXT: movprfx z2, z02353; CHECK-NEXT: ext z2.b, z2.b, z0.b, #82354; CHECK-NEXT: movprfx z3, z12355; CHECK-NEXT: ext z3.b, z3.b, z1.b, #82356; CHECK-NEXT: sunpklo z0.d, z0.s2357; CHECK-NEXT: sunpklo z1.d, z1.s2358; CHECK-NEXT: sunpklo z2.d, z2.s2359; CHECK-NEXT: sunpklo z3.d, z3.s2360; CHECK-NEXT: scvtf z0.d, p0/m, z0.d2361; CHECK-NEXT: scvtf z1.d, p0/m, z1.d2362; CHECK-NEXT: scvtf z2.d, p0/m, z2.d2363; CHECK-NEXT: scvtf z3.d, p0/m, z3.d2364; CHECK-NEXT: stp q1, q3, [x1]2365; CHECK-NEXT: stp q0, q2, [x1, #32]2366; CHECK-NEXT: ret2367;2368; NONEON-NOSVE-LABEL: scvtf_v8i32_v8f64:2369; NONEON-NOSVE: // %bb.0:2370; NONEON-NOSVE-NEXT: ldp q0, q1, [x0]2371; NONEON-NOSVE-NEXT: stp q0, q1, [sp, #-128]!2372; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 1282373; NONEON-NOSVE-NEXT: ldp d1, d0, [sp]2374; NONEON-NOSVE-NEXT: stp d0, d1, [sp, #32]2375; NONEON-NOSVE-NEXT: ldp d1, d0, [sp, #16]2376; NONEON-NOSVE-NEXT: ldp w8, w9, [sp, #40]2377; NONEON-NOSVE-NEXT: stp d0, d1, [sp, #48]2378; NONEON-NOSVE-NEXT: scvtf d1, w92379; NONEON-NOSVE-NEXT: scvtf d0, w82380; NONEON-NOSVE-NEXT: ldp w8, w9, [sp, #32]2381; NONEON-NOSVE-NEXT: stp d0, d1, [sp, #80]2382; NONEON-NOSVE-NEXT: scvtf d1, w92383; NONEON-NOSVE-NEXT: scvtf d0, w82384; NONEON-NOSVE-NEXT: ldp w8, w9, [sp, #56]2385; NONEON-NOSVE-NEXT: stp d0, d1, [sp, #64]2386; NONEON-NOSVE-NEXT: scvtf d1, w92387; NONEON-NOSVE-NEXT: scvtf d0, w82388; NONEON-NOSVE-NEXT: ldp w8, w9, [sp, #48]2389; NONEON-NOSVE-NEXT: ldp q3, q2, [sp, #64]2390; NONEON-NOSVE-NEXT: stp d0, d1, [sp, #112]2391; NONEON-NOSVE-NEXT: scvtf d1, w92392; NONEON-NOSVE-NEXT: scvtf d0, w82393; NONEON-NOSVE-NEXT: stp d0, d1, [sp, #96]2394; NONEON-NOSVE-NEXT: ldp q0, q1, [sp, #96]2395; NONEON-NOSVE-NEXT: stp q2, q3, [x1]2396; NONEON-NOSVE-NEXT: stp q1, q0, [x1, #32]2397; NONEON-NOSVE-NEXT: add sp, sp, #1282398; NONEON-NOSVE-NEXT: ret2399 %op1 = load <8 x i32>, ptr %a2400 %res = sitofp <8 x i32> %op1 to <8 x double>2401 store <8 x double> %res, ptr %b2402 ret void2403}2404 2405define void @scvtf_v16i32_v16f64(ptr %a, ptr %b) {2406; CHECK-LABEL: scvtf_v16i32_v16f64:2407; CHECK: // %bb.0:2408; CHECK-NEXT: ldp q1, q0, [x0, #32]2409; CHECK-NEXT: ptrue p0.d, vl22410; CHECK-NEXT: ldp q5, q3, [x0]2411; CHECK-NEXT: movprfx z2, z02412; CHECK-NEXT: ext z2.b, z2.b, z0.b, #82413; CHECK-NEXT: movprfx z4, z12414; CHECK-NEXT: ext z4.b, z4.b, z1.b, #82415; CHECK-NEXT: sunpklo z0.d, z0.s2416; CHECK-NEXT: sunpklo z1.d, z1.s2417; CHECK-NEXT: movprfx z6, z32418; CHECK-NEXT: ext z6.b, z6.b, z3.b, #82419; CHECK-NEXT: movprfx z7, z52420; CHECK-NEXT: ext z7.b, z7.b, z5.b, #82421; CHECK-NEXT: sunpklo z3.d, z3.s2422; CHECK-NEXT: sunpklo z5.d, z5.s2423; CHECK-NEXT: sunpklo z2.d, z2.s2424; CHECK-NEXT: sunpklo z4.d, z4.s2425; CHECK-NEXT: scvtf z0.d, p0/m, z0.d2426; CHECK-NEXT: sunpklo z6.d, z6.s2427; CHECK-NEXT: sunpklo z7.d, z7.s2428; CHECK-NEXT: scvtf z1.d, p0/m, z1.d2429; CHECK-NEXT: scvtf z3.d, p0/m, z3.d2430; CHECK-NEXT: scvtf z2.d, p0/m, z2.d2431; CHECK-NEXT: scvtf z4.d, p0/m, z4.d2432; CHECK-NEXT: stp q1, q4, [x1, #64]2433; CHECK-NEXT: movprfx z1, z52434; CHECK-NEXT: scvtf z1.d, p0/m, z5.d2435; CHECK-NEXT: stp q0, q2, [x1, #96]2436; CHECK-NEXT: movprfx z0, z62437; CHECK-NEXT: scvtf z0.d, p0/m, z6.d2438; CHECK-NEXT: movprfx z2, z72439; CHECK-NEXT: scvtf z2.d, p0/m, z7.d2440; CHECK-NEXT: stp q1, q2, [x1]2441; CHECK-NEXT: stp q3, q0, [x1, #32]2442; CHECK-NEXT: ret2443;2444; NONEON-NOSVE-LABEL: scvtf_v16i32_v16f64:2445; NONEON-NOSVE: // %bb.0:2446; NONEON-NOSVE-NEXT: sub sp, sp, #2722447; NONEON-NOSVE-NEXT: str x29, [sp, #256] // 8-byte Spill2448; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 2722449; NONEON-NOSVE-NEXT: .cfi_offset w29, -162450; NONEON-NOSVE-NEXT: ldp q0, q1, [x0]2451; NONEON-NOSVE-NEXT: ldr x29, [sp, #256] // 8-byte Reload2452; NONEON-NOSVE-NEXT: ldp q3, q2, [x0, #32]2453; NONEON-NOSVE-NEXT: str q1, [sp, #32]2454; NONEON-NOSVE-NEXT: stp q0, q2, [sp]2455; NONEON-NOSVE-NEXT: ldp d0, d1, [sp]2456; NONEON-NOSVE-NEXT: str q3, [sp, #64]2457; NONEON-NOSVE-NEXT: stp d1, d0, [sp, #48]2458; NONEON-NOSVE-NEXT: ldp d0, d1, [sp, #32]2459; NONEON-NOSVE-NEXT: ldp w8, w9, [sp, #48]2460; NONEON-NOSVE-NEXT: stp d1, d0, [sp, #104]2461; NONEON-NOSVE-NEXT: ldp d0, d1, [sp, #64]2462; NONEON-NOSVE-NEXT: str d0, [sp, #264]2463; NONEON-NOSVE-NEXT: ldp d0, d2, [sp, #16]2464; NONEON-NOSVE-NEXT: stp d2, d0, [sp, #88]2465; NONEON-NOSVE-NEXT: scvtf d0, w82466; NONEON-NOSVE-NEXT: scvtf d2, w92467; NONEON-NOSVE-NEXT: ldp w8, w9, [sp, #56]2468; NONEON-NOSVE-NEXT: stp d1, d0, [sp, #120]2469; NONEON-NOSVE-NEXT: scvtf d0, w92470; NONEON-NOSVE-NEXT: str d0, [sp, #152]2471; NONEON-NOSVE-NEXT: scvtf d0, w82472; NONEON-NOSVE-NEXT: ldp w8, w9, [sp, #104]2473; NONEON-NOSVE-NEXT: stp d2, d0, [sp, #136]2474; NONEON-NOSVE-NEXT: scvtf d1, w92475; NONEON-NOSVE-NEXT: scvtf d0, w82476; NONEON-NOSVE-NEXT: ldp w8, w9, [sp, #112]2477; NONEON-NOSVE-NEXT: stp d0, d1, [sp, #192]2478; NONEON-NOSVE-NEXT: scvtf d1, w92479; NONEON-NOSVE-NEXT: scvtf d0, w82480; NONEON-NOSVE-NEXT: ldp w8, w9, [sp, #120]2481; NONEON-NOSVE-NEXT: stp d0, d1, [sp, #208]2482; NONEON-NOSVE-NEXT: scvtf d1, w92483; NONEON-NOSVE-NEXT: scvtf d0, w82484; NONEON-NOSVE-NEXT: ldr w8, [sp, #268]2485; NONEON-NOSVE-NEXT: stp d0, d1, [sp, #224]2486; NONEON-NOSVE-NEXT: scvtf d1, w82487; NONEON-NOSVE-NEXT: ldr w8, [sp, #264]2488; NONEON-NOSVE-NEXT: ldp q4, q6, [sp, #208]2489; NONEON-NOSVE-NEXT: scvtf d0, w82490; NONEON-NOSVE-NEXT: ldp w8, w9, [sp, #88]2491; NONEON-NOSVE-NEXT: stp d0, d1, [sp, #240]2492; NONEON-NOSVE-NEXT: scvtf d1, w92493; NONEON-NOSVE-NEXT: scvtf d0, w82494; NONEON-NOSVE-NEXT: ldp w8, w9, [sp, #96]2495; NONEON-NOSVE-NEXT: ldr q7, [sp, #240]2496; NONEON-NOSVE-NEXT: stp d0, d1, [sp, #160]2497; NONEON-NOSVE-NEXT: scvtf d1, w92498; NONEON-NOSVE-NEXT: scvtf d0, w82499; NONEON-NOSVE-NEXT: ldr q5, [sp, #160]2500; NONEON-NOSVE-NEXT: stp d0, d1, [sp, #176]2501; NONEON-NOSVE-NEXT: ldp q0, q1, [sp, #128]2502; NONEON-NOSVE-NEXT: ldp q2, q3, [sp, #176]2503; NONEON-NOSVE-NEXT: stp q7, q6, [x1, #64]2504; NONEON-NOSVE-NEXT: stp q1, q0, [x1]2505; NONEON-NOSVE-NEXT: stp q4, q3, [x1, #32]2506; NONEON-NOSVE-NEXT: stp q2, q5, [x1, #96]2507; NONEON-NOSVE-NEXT: add sp, sp, #2722508; NONEON-NOSVE-NEXT: ret2509 %op1 = load <16 x i32>, ptr %a2510 %res = sitofp <16 x i32> %op1 to <16 x double>2511 store <16 x double> %res, ptr %b2512 ret void2513}2514 2515;2516; SCVTF D -> H2517;2518 2519define <2 x half> @scvtf_v2i64_v2f16(<2 x i64> %op1) {2520; CHECK-LABEL: scvtf_v2i64_v2f16:2521; CHECK: // %bb.0:2522; CHECK-NEXT: // kill: def $q0 killed $q0 def $z02523; CHECK-NEXT: mov z1.d, z0.d[1]2524; CHECK-NEXT: ptrue p0.d2525; CHECK-NEXT: scvtf z0.h, p0/m, z0.d2526; CHECK-NEXT: scvtf z1.h, p0/m, z1.d2527; CHECK-NEXT: zip1 z0.h, z0.h, z1.h2528; CHECK-NEXT: // kill: def $d0 killed $d0 killed $z02529; CHECK-NEXT: ret2530;2531; NONEON-NOSVE-LABEL: scvtf_v2i64_v2f16:2532; NONEON-NOSVE: // %bb.0:2533; NONEON-NOSVE-NEXT: str q0, [sp, #-32]!2534; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 322535; NONEON-NOSVE-NEXT: ldp x8, x9, [sp]2536; NONEON-NOSVE-NEXT: scvtf s0, x92537; NONEON-NOSVE-NEXT: fcvt h0, s02538; NONEON-NOSVE-NEXT: str h0, [sp, #26]2539; NONEON-NOSVE-NEXT: scvtf s0, x82540; NONEON-NOSVE-NEXT: fcvt h0, s02541; NONEON-NOSVE-NEXT: str h0, [sp, #24]2542; NONEON-NOSVE-NEXT: ldr d0, [sp, #24]2543; NONEON-NOSVE-NEXT: add sp, sp, #322544; NONEON-NOSVE-NEXT: ret2545 %res = sitofp <2 x i64> %op1 to <2 x half>2546 ret <2 x half> %res2547}2548 2549define <4 x half> @scvtf_v4i64_v4f16(ptr %a) {2550; CHECK-LABEL: scvtf_v4i64_v4f16:2551; CHECK: // %bb.0:2552; CHECK-NEXT: ldp q0, q1, [x0]2553; CHECK-NEXT: ptrue p0.d, vl22554; CHECK-NEXT: scvtf z1.s, p0/m, z1.d2555; CHECK-NEXT: scvtf z0.s, p0/m, z0.d2556; CHECK-NEXT: ptrue p0.s, vl22557; CHECK-NEXT: uzp1 z1.s, z1.s, z1.s2558; CHECK-NEXT: uzp1 z0.s, z0.s, z0.s2559; CHECK-NEXT: splice z0.s, p0, z0.s, z1.s2560; CHECK-NEXT: ptrue p0.s2561; CHECK-NEXT: fcvt z0.h, p0/m, z0.s2562; CHECK-NEXT: uzp1 z0.h, z0.h, z0.h2563; CHECK-NEXT: // kill: def $d0 killed $d0 killed $z02564; CHECK-NEXT: ret2565;2566; NONEON-NOSVE-LABEL: scvtf_v4i64_v4f16:2567; NONEON-NOSVE: // %bb.0:2568; NONEON-NOSVE-NEXT: ldp q1, q0, [x0]2569; NONEON-NOSVE-NEXT: stp q1, q0, [sp, #-48]!2570; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 482571; NONEON-NOSVE-NEXT: ldp x8, x9, [sp, #16]2572; NONEON-NOSVE-NEXT: scvtf s0, x92573; NONEON-NOSVE-NEXT: fcvt h0, s02574; NONEON-NOSVE-NEXT: str h0, [sp, #46]2575; NONEON-NOSVE-NEXT: scvtf s0, x82576; NONEON-NOSVE-NEXT: ldp x8, x9, [sp]2577; NONEON-NOSVE-NEXT: fcvt h0, s02578; NONEON-NOSVE-NEXT: str h0, [sp, #44]2579; NONEON-NOSVE-NEXT: scvtf s0, x92580; NONEON-NOSVE-NEXT: fcvt h0, s02581; NONEON-NOSVE-NEXT: str h0, [sp, #42]2582; NONEON-NOSVE-NEXT: scvtf s0, x82583; NONEON-NOSVE-NEXT: fcvt h0, s02584; NONEON-NOSVE-NEXT: str h0, [sp, #40]2585; NONEON-NOSVE-NEXT: ldr d0, [sp, #40]2586; NONEON-NOSVE-NEXT: add sp, sp, #482587; NONEON-NOSVE-NEXT: ret2588 %op1 = load <4 x i64>, ptr %a2589 %res = sitofp <4 x i64> %op1 to <4 x half>2590 ret <4 x half> %res2591}2592 2593;2594; SCVTF D -> S2595;2596 2597define <2 x float> @scvtf_v2i64_v2f32(<2 x i64> %op1) {2598; CHECK-LABEL: scvtf_v2i64_v2f32:2599; CHECK: // %bb.0:2600; CHECK-NEXT: ptrue p0.d, vl22601; CHECK-NEXT: // kill: def $q0 killed $q0 def $z02602; CHECK-NEXT: scvtf z0.s, p0/m, z0.d2603; CHECK-NEXT: uzp1 z0.s, z0.s, z0.s2604; CHECK-NEXT: // kill: def $d0 killed $d0 killed $z02605; CHECK-NEXT: ret2606;2607; NONEON-NOSVE-LABEL: scvtf_v2i64_v2f32:2608; NONEON-NOSVE: // %bb.0:2609; NONEON-NOSVE-NEXT: str q0, [sp, #-32]!2610; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 322611; NONEON-NOSVE-NEXT: ldp x8, x9, [sp]2612; NONEON-NOSVE-NEXT: scvtf s1, x92613; NONEON-NOSVE-NEXT: scvtf s0, x82614; NONEON-NOSVE-NEXT: stp s0, s1, [sp, #24]2615; NONEON-NOSVE-NEXT: ldr d0, [sp, #24]2616; NONEON-NOSVE-NEXT: add sp, sp, #322617; NONEON-NOSVE-NEXT: ret2618 %res = sitofp <2 x i64> %op1 to <2 x float>2619 ret <2 x float> %res2620}2621 2622define <4 x float> @scvtf_v4i64_v4f32(ptr %a) {2623; CHECK-LABEL: scvtf_v4i64_v4f32:2624; CHECK: // %bb.0:2625; CHECK-NEXT: ldp q0, q1, [x0]2626; CHECK-NEXT: ptrue p0.d, vl22627; CHECK-NEXT: scvtf z1.s, p0/m, z1.d2628; CHECK-NEXT: scvtf z0.s, p0/m, z0.d2629; CHECK-NEXT: ptrue p0.s, vl22630; CHECK-NEXT: uzp1 z1.s, z1.s, z1.s2631; CHECK-NEXT: uzp1 z0.s, z0.s, z0.s2632; CHECK-NEXT: splice z0.s, p0, z0.s, z1.s2633; CHECK-NEXT: // kill: def $q0 killed $q0 killed $z02634; CHECK-NEXT: ret2635;2636; NONEON-NOSVE-LABEL: scvtf_v4i64_v4f32:2637; NONEON-NOSVE: // %bb.0:2638; NONEON-NOSVE-NEXT: ldp q1, q0, [x0]2639; NONEON-NOSVE-NEXT: stp q1, q0, [sp, #-48]!2640; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 482641; NONEON-NOSVE-NEXT: ldp x8, x9, [sp, #16]2642; NONEON-NOSVE-NEXT: scvtf s1, x92643; NONEON-NOSVE-NEXT: scvtf s0, x82644; NONEON-NOSVE-NEXT: ldp x8, x9, [sp]2645; NONEON-NOSVE-NEXT: stp s0, s1, [sp, #40]2646; NONEON-NOSVE-NEXT: scvtf s1, x92647; NONEON-NOSVE-NEXT: scvtf s0, x82648; NONEON-NOSVE-NEXT: stp s0, s1, [sp, #32]2649; NONEON-NOSVE-NEXT: ldr q0, [sp, #32]2650; NONEON-NOSVE-NEXT: add sp, sp, #482651; NONEON-NOSVE-NEXT: ret2652 %op1 = load <4 x i64>, ptr %a2653 %res = sitofp <4 x i64> %op1 to <4 x float>2654 ret <4 x float> %res2655}2656 2657;2658; SCVTF D -> D2659;2660 2661define <2 x double> @scvtf_v2i64_v2f64(<2 x i64> %op1) {2662; CHECK-LABEL: scvtf_v2i64_v2f64:2663; CHECK: // %bb.0:2664; CHECK-NEXT: ptrue p0.d, vl22665; CHECK-NEXT: // kill: def $q0 killed $q0 def $z02666; CHECK-NEXT: scvtf z0.d, p0/m, z0.d2667; CHECK-NEXT: // kill: def $q0 killed $q0 killed $z02668; CHECK-NEXT: ret2669;2670; NONEON-NOSVE-LABEL: scvtf_v2i64_v2f64:2671; NONEON-NOSVE: // %bb.0:2672; NONEON-NOSVE-NEXT: str q0, [sp, #-32]!2673; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 322674; NONEON-NOSVE-NEXT: ldp x8, x9, [sp]2675; NONEON-NOSVE-NEXT: scvtf d1, x92676; NONEON-NOSVE-NEXT: scvtf d0, x82677; NONEON-NOSVE-NEXT: stp d0, d1, [sp, #16]2678; NONEON-NOSVE-NEXT: ldr q0, [sp, #16]2679; NONEON-NOSVE-NEXT: add sp, sp, #322680; NONEON-NOSVE-NEXT: ret2681 %res = sitofp <2 x i64> %op1 to <2 x double>2682 ret <2 x double> %res2683}2684 2685define void @scvtf_v4i64_v4f64(ptr %a, ptr %b) {2686; CHECK-LABEL: scvtf_v4i64_v4f64:2687; CHECK: // %bb.0:2688; CHECK-NEXT: ldp q0, q1, [x0]2689; CHECK-NEXT: ptrue p0.d, vl22690; CHECK-NEXT: scvtf z0.d, p0/m, z0.d2691; CHECK-NEXT: scvtf z1.d, p0/m, z1.d2692; CHECK-NEXT: stp q0, q1, [x1]2693; CHECK-NEXT: ret2694;2695; NONEON-NOSVE-LABEL: scvtf_v4i64_v4f64:2696; NONEON-NOSVE: // %bb.0:2697; NONEON-NOSVE-NEXT: ldp q1, q0, [x0]2698; NONEON-NOSVE-NEXT: stp q1, q0, [sp, #-64]!2699; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 642700; NONEON-NOSVE-NEXT: ldp x8, x9, [sp, #16]2701; NONEON-NOSVE-NEXT: scvtf d1, x92702; NONEON-NOSVE-NEXT: scvtf d0, x82703; NONEON-NOSVE-NEXT: ldp x8, x9, [sp]2704; NONEON-NOSVE-NEXT: stp d0, d1, [sp, #48]2705; NONEON-NOSVE-NEXT: scvtf d1, x92706; NONEON-NOSVE-NEXT: scvtf d0, x82707; NONEON-NOSVE-NEXT: stp d0, d1, [sp, #32]2708; NONEON-NOSVE-NEXT: ldp q0, q1, [sp, #32]2709; NONEON-NOSVE-NEXT: stp q0, q1, [x1]2710; NONEON-NOSVE-NEXT: add sp, sp, #642711; NONEON-NOSVE-NEXT: ret2712 %op1 = load <4 x i64>, ptr %a2713 %res = sitofp <4 x i64> %op1 to <4 x double>2714 store <4 x double> %res, ptr %b2715 ret void2716}2717 2718define half @scvtf_i16_f16(ptr %0) {2719; CHECK-LABEL: scvtf_i16_f16:2720; CHECK: // %bb.0:2721; CHECK-NEXT: ldrsh w8, [x0]2722; CHECK-NEXT: ptrue p0.s2723; CHECK-NEXT: fmov s0, w82724; CHECK-NEXT: scvtf z0.h, p0/m, z0.s2725; CHECK-NEXT: // kill: def $h0 killed $h0 killed $z02726; CHECK-NEXT: ret2727;2728; NONEON-NOSVE-LABEL: scvtf_i16_f16:2729; NONEON-NOSVE: // %bb.0:2730; NONEON-NOSVE-NEXT: ldrsh w8, [x0]2731; NONEON-NOSVE-NEXT: scvtf s0, w82732; NONEON-NOSVE-NEXT: fcvt h0, s02733; NONEON-NOSVE-NEXT: ret2734 %2 = load i16, ptr %0, align 642735 %3 = sitofp i16 %2 to half2736 ret half %32737}2738 2739define float @scvtf_i16_f32(ptr %0) {2740; CHECK-LABEL: scvtf_i16_f32:2741; CHECK: // %bb.0:2742; CHECK-NEXT: ldrsh w8, [x0]2743; CHECK-NEXT: ptrue p0.s2744; CHECK-NEXT: fmov s0, w82745; CHECK-NEXT: scvtf z0.s, p0/m, z0.s2746; CHECK-NEXT: // kill: def $s0 killed $s0 killed $z02747; CHECK-NEXT: ret2748;2749; NONEON-NOSVE-LABEL: scvtf_i16_f32:2750; NONEON-NOSVE: // %bb.0:2751; NONEON-NOSVE-NEXT: ldrsh w8, [x0]2752; NONEON-NOSVE-NEXT: scvtf s0, w82753; NONEON-NOSVE-NEXT: ret2754 %2 = load i16, ptr %0, align 642755 %3 = sitofp i16 %2 to float2756 ret float %32757}2758 2759define double @scvtf_i16_f64(ptr %0) {2760; CHECK-LABEL: scvtf_i16_f64:2761; CHECK: // %bb.0:2762; CHECK-NEXT: ldrsh w8, [x0]2763; CHECK-NEXT: scvtf d0, w82764; CHECK-NEXT: ret2765;2766; NONEON-NOSVE-LABEL: scvtf_i16_f64:2767; NONEON-NOSVE: // %bb.0:2768; NONEON-NOSVE-NEXT: ldrsh w8, [x0]2769; NONEON-NOSVE-NEXT: scvtf d0, w82770; NONEON-NOSVE-NEXT: ret2771 %2 = load i16, ptr %0, align 642772 %3 = sitofp i16 %2 to double2773 ret double %32774}2775 2776define half @scvtf_i32_f16(ptr %0) {2777; CHECK-LABEL: scvtf_i32_f16:2778; CHECK: // %bb.0:2779; CHECK-NEXT: ptrue p0.s2780; CHECK-NEXT: ldr s0, [x0]2781; CHECK-NEXT: scvtf z0.h, p0/m, z0.s2782; CHECK-NEXT: // kill: def $h0 killed $h0 killed $z02783; CHECK-NEXT: ret2784;2785; NONEON-NOSVE-LABEL: scvtf_i32_f16:2786; NONEON-NOSVE: // %bb.0:2787; NONEON-NOSVE-NEXT: ldr w8, [x0]2788; NONEON-NOSVE-NEXT: scvtf s0, w82789; NONEON-NOSVE-NEXT: fcvt h0, s02790; NONEON-NOSVE-NEXT: ret2791 %2 = load i32, ptr %0, align 642792 %3 = sitofp i32 %2 to half2793 ret half %32794}2795 2796define float @scvtf_i32_f32(ptr %0) {2797; CHECK-LABEL: scvtf_i32_f32:2798; CHECK: // %bb.0:2799; CHECK-NEXT: ptrue p0.s2800; CHECK-NEXT: ldr s0, [x0]2801; CHECK-NEXT: scvtf z0.s, p0/m, z0.s2802; CHECK-NEXT: // kill: def $s0 killed $s0 killed $z02803; CHECK-NEXT: ret2804;2805; NONEON-NOSVE-LABEL: scvtf_i32_f32:2806; NONEON-NOSVE: // %bb.0:2807; NONEON-NOSVE-NEXT: ldr w8, [x0]2808; NONEON-NOSVE-NEXT: scvtf s0, w82809; NONEON-NOSVE-NEXT: ret2810 %2 = load i32, ptr %0, align 642811 %3 = sitofp i32 %2 to float2812 ret float %32813}2814 2815define double @scvtf_i32_f64(ptr %0) {2816; CHECK-LABEL: scvtf_i32_f64:2817; CHECK: // %bb.0:2818; CHECK-NEXT: ldr w8, [x0]2819; CHECK-NEXT: scvtf d0, w82820; CHECK-NEXT: ret2821;2822; NONEON-NOSVE-LABEL: scvtf_i32_f64:2823; NONEON-NOSVE: // %bb.0:2824; NONEON-NOSVE-NEXT: ldr w8, [x0]2825; NONEON-NOSVE-NEXT: scvtf d0, w82826; NONEON-NOSVE-NEXT: ret2827 %2 = load i32, ptr %0, align 642828 %3 = sitofp i32 %2 to double2829 ret double %32830}2831 2832define half @scvtf_i64_f16(ptr %0) {2833; CHECK-LABEL: scvtf_i64_f16:2834; CHECK: // %bb.0:2835; CHECK-NEXT: ptrue p0.d2836; CHECK-NEXT: ldr d0, [x0]2837; CHECK-NEXT: scvtf z0.h, p0/m, z0.d2838; CHECK-NEXT: // kill: def $h0 killed $h0 killed $z02839; CHECK-NEXT: ret2840;2841; NONEON-NOSVE-LABEL: scvtf_i64_f16:2842; NONEON-NOSVE: // %bb.0:2843; NONEON-NOSVE-NEXT: ldr x8, [x0]2844; NONEON-NOSVE-NEXT: scvtf s0, x82845; NONEON-NOSVE-NEXT: fcvt h0, s02846; NONEON-NOSVE-NEXT: ret2847 %2 = load i64, ptr %0, align 642848 %3 = sitofp i64 %2 to half2849 ret half %32850}2851 2852define float @scvtf_i64_f32(ptr %0) {2853; CHECK-LABEL: scvtf_i64_f32:2854; CHECK: // %bb.0:2855; CHECK-NEXT: ptrue p0.d2856; CHECK-NEXT: ldr d0, [x0]2857; CHECK-NEXT: scvtf z0.s, p0/m, z0.d2858; CHECK-NEXT: // kill: def $s0 killed $s0 killed $z02859; CHECK-NEXT: ret2860;2861; NONEON-NOSVE-LABEL: scvtf_i64_f32:2862; NONEON-NOSVE: // %bb.0:2863; NONEON-NOSVE-NEXT: ldr x8, [x0]2864; NONEON-NOSVE-NEXT: scvtf s0, x82865; NONEON-NOSVE-NEXT: ret2866 %2 = load i64, ptr %0, align 642867 %3 = sitofp i64 %2 to float2868 ret float %32869}2870 2871define double @scvtf_i64_f64(ptr %0) {2872; CHECK-LABEL: scvtf_i64_f64:2873; CHECK: // %bb.0:2874; CHECK-NEXT: ptrue p0.d2875; CHECK-NEXT: ldr d0, [x0]2876; CHECK-NEXT: scvtf z0.d, p0/m, z0.d2877; CHECK-NEXT: // kill: def $d0 killed $d0 killed $z02878; CHECK-NEXT: ret2879;2880; NONEON-NOSVE-LABEL: scvtf_i64_f64:2881; NONEON-NOSVE: // %bb.0:2882; NONEON-NOSVE-NEXT: ldr x8, [x0]2883; NONEON-NOSVE-NEXT: scvtf d0, x82884; NONEON-NOSVE-NEXT: ret2885 %2 = load i64, ptr %0, align 642886 %3 = sitofp i64 %2 to double2887 ret double %32888}2889 2890define half @ucvtf_i16_f16(ptr %0) {2891; CHECK-LABEL: ucvtf_i16_f16:2892; CHECK: // %bb.0:2893; CHECK-NEXT: ldrh w8, [x0]2894; CHECK-NEXT: ptrue p0.s2895; CHECK-NEXT: fmov s0, w82896; CHECK-NEXT: ucvtf z0.h, p0/m, z0.s2897; CHECK-NEXT: // kill: def $h0 killed $h0 killed $z02898; CHECK-NEXT: ret2899;2900; NONEON-NOSVE-LABEL: ucvtf_i16_f16:2901; NONEON-NOSVE: // %bb.0:2902; NONEON-NOSVE-NEXT: ldrh w8, [x0]2903; NONEON-NOSVE-NEXT: ucvtf s0, w82904; NONEON-NOSVE-NEXT: fcvt h0, s02905; NONEON-NOSVE-NEXT: ret2906 %2 = load i16, ptr %0, align 642907 %3 = uitofp i16 %2 to half2908 ret half %32909}2910 2911define float @ucvtf_i16_f32(ptr %0) {2912; CHECK-LABEL: ucvtf_i16_f32:2913; CHECK: // %bb.0:2914; CHECK-NEXT: ldrh w8, [x0]2915; CHECK-NEXT: ptrue p0.s2916; CHECK-NEXT: fmov s0, w82917; CHECK-NEXT: ucvtf z0.s, p0/m, z0.s2918; CHECK-NEXT: // kill: def $s0 killed $s0 killed $z02919; CHECK-NEXT: ret2920;2921; NONEON-NOSVE-LABEL: ucvtf_i16_f32:2922; NONEON-NOSVE: // %bb.0:2923; NONEON-NOSVE-NEXT: ldrh w8, [x0]2924; NONEON-NOSVE-NEXT: ucvtf s0, w82925; NONEON-NOSVE-NEXT: ret2926 %2 = load i16, ptr %0, align 642927 %3 = uitofp i16 %2 to float2928 ret float %32929}2930 2931define double @ucvtf_i16_f64(ptr %0) {2932; CHECK-LABEL: ucvtf_i16_f64:2933; CHECK: // %bb.0:2934; CHECK-NEXT: ldrh w8, [x0]2935; CHECK-NEXT: ucvtf d0, w82936; CHECK-NEXT: ret2937;2938; NONEON-NOSVE-LABEL: ucvtf_i16_f64:2939; NONEON-NOSVE: // %bb.0:2940; NONEON-NOSVE-NEXT: ldrh w8, [x0]2941; NONEON-NOSVE-NEXT: ucvtf d0, w82942; NONEON-NOSVE-NEXT: ret2943 %2 = load i16, ptr %0, align 642944 %3 = uitofp i16 %2 to double2945 ret double %32946}2947 2948define half @ucvtf_i32_f16(ptr %0) {2949; CHECK-LABEL: ucvtf_i32_f16:2950; CHECK: // %bb.0:2951; CHECK-NEXT: ptrue p0.s2952; CHECK-NEXT: ldr s0, [x0]2953; CHECK-NEXT: ucvtf z0.h, p0/m, z0.s2954; CHECK-NEXT: // kill: def $h0 killed $h0 killed $z02955; CHECK-NEXT: ret2956;2957; NONEON-NOSVE-LABEL: ucvtf_i32_f16:2958; NONEON-NOSVE: // %bb.0:2959; NONEON-NOSVE-NEXT: ldr w8, [x0]2960; NONEON-NOSVE-NEXT: ucvtf s0, w82961; NONEON-NOSVE-NEXT: fcvt h0, s02962; NONEON-NOSVE-NEXT: ret2963 %2 = load i32, ptr %0, align 642964 %3 = uitofp i32 %2 to half2965 ret half %32966}2967 2968define float @ucvtf_i32_f32(ptr %0) {2969; CHECK-LABEL: ucvtf_i32_f32:2970; CHECK: // %bb.0:2971; CHECK-NEXT: ptrue p0.s2972; CHECK-NEXT: ldr s0, [x0]2973; CHECK-NEXT: ucvtf z0.s, p0/m, z0.s2974; CHECK-NEXT: // kill: def $s0 killed $s0 killed $z02975; CHECK-NEXT: ret2976;2977; NONEON-NOSVE-LABEL: ucvtf_i32_f32:2978; NONEON-NOSVE: // %bb.0:2979; NONEON-NOSVE-NEXT: ldr w8, [x0]2980; NONEON-NOSVE-NEXT: ucvtf s0, w82981; NONEON-NOSVE-NEXT: ret2982 %2 = load i32, ptr %0, align 642983 %3 = uitofp i32 %2 to float2984 ret float %32985}2986 2987define double @ucvtf_i32_f64(ptr %0) {2988; CHECK-LABEL: ucvtf_i32_f64:2989; CHECK: // %bb.0:2990; CHECK-NEXT: ldr w8, [x0]2991; CHECK-NEXT: ucvtf d0, w82992; CHECK-NEXT: ret2993;2994; NONEON-NOSVE-LABEL: ucvtf_i32_f64:2995; NONEON-NOSVE: // %bb.0:2996; NONEON-NOSVE-NEXT: ldr w8, [x0]2997; NONEON-NOSVE-NEXT: ucvtf d0, w82998; NONEON-NOSVE-NEXT: ret2999 %2 = load i32, ptr %0, align 643000 %3 = uitofp i32 %2 to double3001 ret double %33002}3003 3004define half @ucvtf_i64_f16(ptr %0) {3005; CHECK-LABEL: ucvtf_i64_f16:3006; CHECK: // %bb.0:3007; CHECK-NEXT: ptrue p0.d3008; CHECK-NEXT: ldr d0, [x0]3009; CHECK-NEXT: ucvtf z0.h, p0/m, z0.d3010; CHECK-NEXT: // kill: def $h0 killed $h0 killed $z03011; CHECK-NEXT: ret3012;3013; NONEON-NOSVE-LABEL: ucvtf_i64_f16:3014; NONEON-NOSVE: // %bb.0:3015; NONEON-NOSVE-NEXT: ldr x8, [x0]3016; NONEON-NOSVE-NEXT: ucvtf s0, x83017; NONEON-NOSVE-NEXT: fcvt h0, s03018; NONEON-NOSVE-NEXT: ret3019 %2 = load i64, ptr %0, align 643020 %3 = uitofp i64 %2 to half3021 ret half %33022}3023 3024define float @ucvtf_i64_f32(ptr %0) {3025; CHECK-LABEL: ucvtf_i64_f32:3026; CHECK: // %bb.0:3027; CHECK-NEXT: ptrue p0.d3028; CHECK-NEXT: ldr d0, [x0]3029; CHECK-NEXT: ucvtf z0.s, p0/m, z0.d3030; CHECK-NEXT: // kill: def $s0 killed $s0 killed $z03031; CHECK-NEXT: ret3032;3033; NONEON-NOSVE-LABEL: ucvtf_i64_f32:3034; NONEON-NOSVE: // %bb.0:3035; NONEON-NOSVE-NEXT: ldr x8, [x0]3036; NONEON-NOSVE-NEXT: ucvtf s0, x83037; NONEON-NOSVE-NEXT: ret3038 %2 = load i64, ptr %0, align 643039 %3 = uitofp i64 %2 to float3040 ret float %33041}3042 3043define double @ucvtf_i64_f64(ptr %0) {3044; CHECK-LABEL: ucvtf_i64_f64:3045; CHECK: // %bb.0:3046; CHECK-NEXT: ptrue p0.d3047; CHECK-NEXT: ldr d0, [x0]3048; CHECK-NEXT: ucvtf z0.d, p0/m, z0.d3049; CHECK-NEXT: // kill: def $d0 killed $d0 killed $z03050; CHECK-NEXT: ret3051;3052; NONEON-NOSVE-LABEL: ucvtf_i64_f64:3053; NONEON-NOSVE: // %bb.0:3054; NONEON-NOSVE-NEXT: ldr x8, [x0]3055; NONEON-NOSVE-NEXT: ucvtf d0, x83056; NONEON-NOSVE-NEXT: ret3057 %2 = load i64, ptr %0, align 643058 %3 = uitofp i64 %2 to double3059 ret double %33060}3061