brintos

brintos / llvm-project-archived public Read only

0
0
Text · 103.6 KiB · 200e462 Raw
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