1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py 2; RUN: llc -mattr=+sve -force-streaming-compatible < %s | FileCheck %s 3; RUN: llc -force-streaming-compatible < %s | FileCheck %s --check-prefix=NONEON-NOSVE 4 5target triple = "aarch64-unknown-linux-gnu" 6 7; 8; UCVTF H -> H 9; 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, vl4 15; CHECK-NEXT: // kill: def $d0 killed $d0 def $z0 16; CHECK-NEXT: ucvtf z0.h, p0/m, z0.h 17; CHECK-NEXT: // kill: def $d0 killed $d0 killed $z0 18; CHECK-NEXT: ret 19; 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 16 24; NONEON-NOSVE-NEXT: ldrh w8, [sp, #6] 25; NONEON-NOSVE-NEXT: ucvtf s0, w8 26; NONEON-NOSVE-NEXT: ldrh w8, [sp, #4] 27; NONEON-NOSVE-NEXT: fcvt h0, s0 28; NONEON-NOSVE-NEXT: str h0, [sp, #14] 29; NONEON-NOSVE-NEXT: ucvtf s0, w8 30; NONEON-NOSVE-NEXT: ldrh w8, [sp, #2] 31; NONEON-NOSVE-NEXT: fcvt h0, s0 32; NONEON-NOSVE-NEXT: str h0, [sp, #12] 33; NONEON-NOSVE-NEXT: ucvtf s0, w8 34; NONEON-NOSVE-NEXT: ldrh w8, [sp] 35; NONEON-NOSVE-NEXT: fcvt h0, s0 36; NONEON-NOSVE-NEXT: str h0, [sp, #10] 37; NONEON-NOSVE-NEXT: ucvtf s0, w8 38; NONEON-NOSVE-NEXT: fcvt h0, s0 39; NONEON-NOSVE-NEXT: str h0, [sp, #8] 40; NONEON-NOSVE-NEXT: ldr d0, [sp, #8] 41; NONEON-NOSVE-NEXT: add sp, sp, #16 42; NONEON-NOSVE-NEXT: ret 43 %res = uitofp <4 x i16> %op1 to <4 x half> 44 ret <4 x half> %res 45} 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, vl8 51; CHECK-NEXT: ldr q0, [x0] 52; CHECK-NEXT: ucvtf z0.h, p0/m, z0.h 53; CHECK-NEXT: str q0, [x1] 54; CHECK-NEXT: ret 55; 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 32 61; NONEON-NOSVE-NEXT: ldrh w8, [sp, #14] 62; NONEON-NOSVE-NEXT: ucvtf s0, w8 63; NONEON-NOSVE-NEXT: ldrh w8, [sp, #12] 64; NONEON-NOSVE-NEXT: fcvt h0, s0 65; NONEON-NOSVE-NEXT: str h0, [sp, #30] 66; NONEON-NOSVE-NEXT: ucvtf s0, w8 67; NONEON-NOSVE-NEXT: ldrh w8, [sp, #10] 68; NONEON-NOSVE-NEXT: fcvt h0, s0 69; NONEON-NOSVE-NEXT: str h0, [sp, #28] 70; NONEON-NOSVE-NEXT: ucvtf s0, w8 71; NONEON-NOSVE-NEXT: ldrh w8, [sp, #8] 72; NONEON-NOSVE-NEXT: fcvt h0, s0 73; NONEON-NOSVE-NEXT: str h0, [sp, #26] 74; NONEON-NOSVE-NEXT: ucvtf s0, w8 75; NONEON-NOSVE-NEXT: ldrh w8, [sp, #6] 76; NONEON-NOSVE-NEXT: fcvt h0, s0 77; NONEON-NOSVE-NEXT: str h0, [sp, #24] 78; NONEON-NOSVE-NEXT: ucvtf s0, w8 79; NONEON-NOSVE-NEXT: ldrh w8, [sp, #4] 80; NONEON-NOSVE-NEXT: fcvt h0, s0 81; NONEON-NOSVE-NEXT: str h0, [sp, #22] 82; NONEON-NOSVE-NEXT: ucvtf s0, w8 83; NONEON-NOSVE-NEXT: ldrh w8, [sp, #2] 84; NONEON-NOSVE-NEXT: fcvt h0, s0 85; NONEON-NOSVE-NEXT: str h0, [sp, #20] 86; NONEON-NOSVE-NEXT: ucvtf s0, w8 87; NONEON-NOSVE-NEXT: ldrh w8, [sp] 88; NONEON-NOSVE-NEXT: fcvt h0, s0 89; NONEON-NOSVE-NEXT: str h0, [sp, #18] 90; NONEON-NOSVE-NEXT: ucvtf s0, w8 91; NONEON-NOSVE-NEXT: fcvt h0, s0 92; 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, #32 96; NONEON-NOSVE-NEXT: ret 97 %op1 = load <8 x i16>, ptr %a 98 %res = uitofp <8 x i16> %op1 to <8 x half> 99 store <8 x half> %res, ptr %b 100 ret void 101} 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, vl8 108; CHECK-NEXT: ucvtf z0.h, p0/m, z0.h 109; CHECK-NEXT: ucvtf z1.h, p0/m, z1.h 110; CHECK-NEXT: stp q0, q1, [x1] 111; CHECK-NEXT: ret 112; 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 64 118; NONEON-NOSVE-NEXT: ldrh w8, [sp, #30] 119; NONEON-NOSVE-NEXT: ucvtf s0, w8 120; NONEON-NOSVE-NEXT: ldrh w8, [sp, #28] 121; NONEON-NOSVE-NEXT: fcvt h0, s0 122; NONEON-NOSVE-NEXT: str h0, [sp, #62] 123; NONEON-NOSVE-NEXT: ucvtf s0, w8 124; NONEON-NOSVE-NEXT: ldrh w8, [sp, #26] 125; NONEON-NOSVE-NEXT: fcvt h0, s0 126; NONEON-NOSVE-NEXT: str h0, [sp, #60] 127; NONEON-NOSVE-NEXT: ucvtf s0, w8 128; NONEON-NOSVE-NEXT: ldrh w8, [sp, #24] 129; NONEON-NOSVE-NEXT: fcvt h0, s0 130; NONEON-NOSVE-NEXT: str h0, [sp, #58] 131; NONEON-NOSVE-NEXT: ucvtf s0, w8 132; NONEON-NOSVE-NEXT: ldrh w8, [sp, #22] 133; NONEON-NOSVE-NEXT: fcvt h0, s0 134; NONEON-NOSVE-NEXT: str h0, [sp, #56] 135; NONEON-NOSVE-NEXT: ucvtf s0, w8 136; NONEON-NOSVE-NEXT: ldrh w8, [sp, #20] 137; NONEON-NOSVE-NEXT: fcvt h0, s0 138; NONEON-NOSVE-NEXT: str h0, [sp, #54] 139; NONEON-NOSVE-NEXT: ucvtf s0, w8 140; NONEON-NOSVE-NEXT: ldrh w8, [sp, #18] 141; NONEON-NOSVE-NEXT: fcvt h0, s0 142; NONEON-NOSVE-NEXT: str h0, [sp, #52] 143; NONEON-NOSVE-NEXT: ucvtf s0, w8 144; NONEON-NOSVE-NEXT: ldrh w8, [sp, #16] 145; NONEON-NOSVE-NEXT: fcvt h0, s0 146; NONEON-NOSVE-NEXT: str h0, [sp, #50] 147; NONEON-NOSVE-NEXT: ucvtf s0, w8 148; NONEON-NOSVE-NEXT: ldrh w8, [sp, #14] 149; NONEON-NOSVE-NEXT: fcvt h0, s0 150; NONEON-NOSVE-NEXT: str h0, [sp, #48] 151; NONEON-NOSVE-NEXT: ucvtf s0, w8 152; NONEON-NOSVE-NEXT: ldrh w8, [sp, #12] 153; NONEON-NOSVE-NEXT: fcvt h0, s0 154; NONEON-NOSVE-NEXT: str h0, [sp, #46] 155; NONEON-NOSVE-NEXT: ucvtf s0, w8 156; NONEON-NOSVE-NEXT: ldrh w8, [sp, #10] 157; NONEON-NOSVE-NEXT: fcvt h0, s0 158; NONEON-NOSVE-NEXT: str h0, [sp, #44] 159; NONEON-NOSVE-NEXT: ucvtf s0, w8 160; NONEON-NOSVE-NEXT: ldrh w8, [sp, #8] 161; NONEON-NOSVE-NEXT: fcvt h0, s0 162; NONEON-NOSVE-NEXT: str h0, [sp, #42] 163; NONEON-NOSVE-NEXT: ucvtf s0, w8 164; NONEON-NOSVE-NEXT: ldrh w8, [sp, #6] 165; NONEON-NOSVE-NEXT: fcvt h0, s0 166; NONEON-NOSVE-NEXT: str h0, [sp, #40] 167; NONEON-NOSVE-NEXT: ucvtf s0, w8 168; NONEON-NOSVE-NEXT: ldrh w8, [sp, #4] 169; NONEON-NOSVE-NEXT: fcvt h0, s0 170; NONEON-NOSVE-NEXT: str h0, [sp, #38] 171; NONEON-NOSVE-NEXT: ucvtf s0, w8 172; NONEON-NOSVE-NEXT: ldrh w8, [sp, #2] 173; NONEON-NOSVE-NEXT: fcvt h0, s0 174; NONEON-NOSVE-NEXT: str h0, [sp, #36] 175; NONEON-NOSVE-NEXT: ucvtf s0, w8 176; NONEON-NOSVE-NEXT: ldrh w8, [sp] 177; NONEON-NOSVE-NEXT: fcvt h0, s0 178; NONEON-NOSVE-NEXT: str h0, [sp, #34] 179; NONEON-NOSVE-NEXT: ucvtf s0, w8 180; NONEON-NOSVE-NEXT: fcvt h0, s0 181; 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, #64 185; NONEON-NOSVE-NEXT: ret 186 %op1 = load <16 x i16>, ptr %a 187 %res = uitofp <16 x i16> %op1 to <16 x half> 188 store <16 x half> %res, ptr %b 189 ret void 190} 191 192; 193; UCVTF H -> S 194; 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 $z0 200; CHECK-NEXT: ptrue p0.s, vl2 201; CHECK-NEXT: and z0.s, z0.s, #0xffff 202; CHECK-NEXT: ucvtf z0.s, p0/m, z0.s 203; CHECK-NEXT: // kill: def $d0 killed $d0 killed $z0 204; CHECK-NEXT: ret 205; 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 16 210; NONEON-NOSVE-NEXT: ldrh w8, [sp, #4] 211; NONEON-NOSVE-NEXT: ldrh w9, [sp] 212; NONEON-NOSVE-NEXT: ucvtf s0, w8 213; NONEON-NOSVE-NEXT: ucvtf s1, w9 214; NONEON-NOSVE-NEXT: stp s1, s0, [sp, #8] 215; NONEON-NOSVE-NEXT: ldr d0, [sp, #8] 216; NONEON-NOSVE-NEXT: add sp, sp, #16 217; NONEON-NOSVE-NEXT: ret 218 %res = uitofp <2 x i16> %op1 to <2 x float> 219 ret <2 x float> %res 220} 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 $z0 226; CHECK-NEXT: ptrue p0.s, vl4 227; CHECK-NEXT: uunpklo z0.s, z0.h 228; CHECK-NEXT: ucvtf z0.s, p0/m, z0.s 229; CHECK-NEXT: // kill: def $q0 killed $q0 killed $z0 230; CHECK-NEXT: ret 231; 232; NONEON-NOSVE-LABEL: ucvtf_v4i16_v4f32: 233; NONEON-NOSVE: // %bb.0: 234; NONEON-NOSVE-NEXT: sub sp, sp, #32 235; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 32 236; NONEON-NOSVE-NEXT: str d0, [sp, #8] 237; NONEON-NOSVE-NEXT: ldrh w8, [sp, #14] 238; NONEON-NOSVE-NEXT: ucvtf s1, w8 239; NONEON-NOSVE-NEXT: ldrh w8, [sp, #12] 240; NONEON-NOSVE-NEXT: ucvtf s0, w8 241; NONEON-NOSVE-NEXT: ldrh w8, [sp, #10] 242; NONEON-NOSVE-NEXT: stp s0, s1, [sp, #24] 243; NONEON-NOSVE-NEXT: ucvtf s1, w8 244; NONEON-NOSVE-NEXT: ldrh w8, [sp, #8] 245; NONEON-NOSVE-NEXT: ucvtf s0, w8 246; NONEON-NOSVE-NEXT: stp s0, s1, [sp, #16] 247; NONEON-NOSVE-NEXT: ldr q0, [sp, #16] 248; NONEON-NOSVE-NEXT: add sp, sp, #32 249; NONEON-NOSVE-NEXT: ret 250 %res = uitofp <4 x i16> %op1 to <4 x float> 251 ret <4 x float> %res 252} 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, vl4 259; CHECK-NEXT: uunpklo z1.s, z0.h 260; CHECK-NEXT: ext z0.b, z0.b, z0.b, #8 261; CHECK-NEXT: uunpklo z0.s, z0.h 262; CHECK-NEXT: ucvtf z1.s, p0/m, z1.s 263; CHECK-NEXT: ucvtf z0.s, p0/m, z0.s 264; CHECK-NEXT: stp q1, q0, [x1] 265; CHECK-NEXT: ret 266; 267; NONEON-NOSVE-LABEL: ucvtf_v8i16_v8f32: 268; NONEON-NOSVE: // %bb.0: 269; NONEON-NOSVE-NEXT: ldr q0, [x0] 270; NONEON-NOSVE-NEXT: str q0, [sp, #-64]! 271; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 64 272; NONEON-NOSVE-NEXT: ldp d1, d0, [sp] 273; NONEON-NOSVE-NEXT: stp d0, d1, [sp, #16] 274; NONEON-NOSVE-NEXT: ldrh w8, [sp, #30] 275; NONEON-NOSVE-NEXT: ucvtf s1, w8 276; NONEON-NOSVE-NEXT: ldrh w8, [sp, #28] 277; NONEON-NOSVE-NEXT: ucvtf s0, w8 278; NONEON-NOSVE-NEXT: ldrh w8, [sp, #26] 279; NONEON-NOSVE-NEXT: stp s0, s1, [sp, #56] 280; NONEON-NOSVE-NEXT: ucvtf s1, w8 281; NONEON-NOSVE-NEXT: ldrh w8, [sp, #24] 282; NONEON-NOSVE-NEXT: ucvtf s0, w8 283; NONEON-NOSVE-NEXT: ldrh w8, [sp, #22] 284; NONEON-NOSVE-NEXT: stp s0, s1, [sp, #48] 285; NONEON-NOSVE-NEXT: ucvtf s1, w8 286; NONEON-NOSVE-NEXT: ldrh w8, [sp, #20] 287; NONEON-NOSVE-NEXT: ucvtf s0, w8 288; NONEON-NOSVE-NEXT: ldrh w8, [sp, #18] 289; NONEON-NOSVE-NEXT: stp s0, s1, [sp, #40] 290; NONEON-NOSVE-NEXT: ucvtf s1, w8 291; NONEON-NOSVE-NEXT: ldrh w8, [sp, #16] 292; NONEON-NOSVE-NEXT: ucvtf s0, w8 293; NONEON-NOSVE-NEXT: stp s0, s1, [sp, #32] 294; NONEON-NOSVE-NEXT: ldp q0, q1, [sp, #32] 295; NONEON-NOSVE-NEXT: stp q1, q0, [x1] 296; NONEON-NOSVE-NEXT: add sp, sp, #64 297; NONEON-NOSVE-NEXT: ret 298 %op1 = load <8 x i16>, ptr %a 299 %res = uitofp <8 x i16> %op1 to <8 x float> 300 store <8 x float> %res, ptr %b 301 ret void 302} 303 304define void @ucvtf_v16i16_v16f32(ptr %a, ptr %b) { 305; CHECK-LABEL: ucvtf_v16i16_v16f32: 306; CHECK: // %bb.0: 307; CHECK-NEXT: ldp q1, q0, [x0] 308; CHECK-NEXT: ptrue p0.s, vl4 309; CHECK-NEXT: uunpklo z2.s, z0.h 310; CHECK-NEXT: ext z0.b, z0.b, z0.b, #8 311; CHECK-NEXT: uunpklo z3.s, z1.h 312; CHECK-NEXT: ext z1.b, z1.b, z1.b, #8 313; CHECK-NEXT: uunpklo z0.s, z0.h 314; CHECK-NEXT: uunpklo z1.s, z1.h 315; CHECK-NEXT: ucvtf z2.s, p0/m, z2.s 316; CHECK-NEXT: ucvtf z3.s, p0/m, z3.s 317; CHECK-NEXT: ucvtf z0.s, p0/m, z0.s 318; CHECK-NEXT: ucvtf z1.s, p0/m, z1.s 319; CHECK-NEXT: stp q2, q0, [x1, #32] 320; CHECK-NEXT: stp q3, q1, [x1] 321; CHECK-NEXT: ret 322; 323; NONEON-NOSVE-LABEL: ucvtf_v16i16_v16f32: 324; NONEON-NOSVE: // %bb.0: 325; NONEON-NOSVE-NEXT: ldp q0, q1, [x0] 326; NONEON-NOSVE-NEXT: stp q0, q1, [sp, #-128]! 327; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 128 328; NONEON-NOSVE-NEXT: ldp d1, d0, [sp] 329; NONEON-NOSVE-NEXT: stp d0, d1, [sp, #32] 330; NONEON-NOSVE-NEXT: ldp d1, d0, [sp, #16] 331; NONEON-NOSVE-NEXT: ldrh w8, [sp, #46] 332; NONEON-NOSVE-NEXT: stp d0, d1, [sp, #48] 333; NONEON-NOSVE-NEXT: ucvtf s1, w8 334; NONEON-NOSVE-NEXT: ldrh w8, [sp, #44] 335; NONEON-NOSVE-NEXT: ucvtf s0, w8 336; NONEON-NOSVE-NEXT: ldrh w8, [sp, #42] 337; NONEON-NOSVE-NEXT: stp s0, s1, [sp, #88] 338; NONEON-NOSVE-NEXT: ucvtf s1, w8 339; NONEON-NOSVE-NEXT: ldrh w8, [sp, #40] 340; NONEON-NOSVE-NEXT: ucvtf s0, w8 341; NONEON-NOSVE-NEXT: ldrh w8, [sp, #38] 342; NONEON-NOSVE-NEXT: stp s0, s1, [sp, #80] 343; NONEON-NOSVE-NEXT: ucvtf s1, w8 344; NONEON-NOSVE-NEXT: ldrh w8, [sp, #36] 345; NONEON-NOSVE-NEXT: ucvtf s0, w8 346; NONEON-NOSVE-NEXT: ldrh w8, [sp, #34] 347; NONEON-NOSVE-NEXT: stp s0, s1, [sp, #72] 348; NONEON-NOSVE-NEXT: ucvtf s1, w8 349; NONEON-NOSVE-NEXT: ldrh w8, [sp, #32] 350; NONEON-NOSVE-NEXT: ucvtf s0, w8 351; NONEON-NOSVE-NEXT: ldrh w8, [sp, #62] 352; NONEON-NOSVE-NEXT: stp s0, s1, [sp, #64] 353; NONEON-NOSVE-NEXT: ucvtf s1, w8 354; NONEON-NOSVE-NEXT: ldrh w8, [sp, #60] 355; NONEON-NOSVE-NEXT: ldp q3, q2, [sp, #64] 356; NONEON-NOSVE-NEXT: ucvtf s0, w8 357; NONEON-NOSVE-NEXT: ldrh w8, [sp, #58] 358; NONEON-NOSVE-NEXT: stp s0, s1, [sp, #120] 359; NONEON-NOSVE-NEXT: ucvtf s1, w8 360; NONEON-NOSVE-NEXT: ldrh w8, [sp, #56] 361; NONEON-NOSVE-NEXT: ucvtf s0, w8 362; NONEON-NOSVE-NEXT: ldrh w8, [sp, #54] 363; NONEON-NOSVE-NEXT: stp s0, s1, [sp, #112] 364; NONEON-NOSVE-NEXT: ucvtf s1, w8 365; NONEON-NOSVE-NEXT: ldrh w8, [sp, #52] 366; NONEON-NOSVE-NEXT: ucvtf s0, w8 367; NONEON-NOSVE-NEXT: ldrh w8, [sp, #50] 368; NONEON-NOSVE-NEXT: stp s0, s1, [sp, #104] 369; NONEON-NOSVE-NEXT: ucvtf s1, w8 370; NONEON-NOSVE-NEXT: ldrh w8, [sp, #48] 371; NONEON-NOSVE-NEXT: ucvtf s0, w8 372; NONEON-NOSVE-NEXT: stp s0, s1, [sp, #96] 373; NONEON-NOSVE-NEXT: ldp q0, q1, [sp, #96] 374; NONEON-NOSVE-NEXT: stp q2, q3, [x1] 375; NONEON-NOSVE-NEXT: stp q1, q0, [x1, #32] 376; NONEON-NOSVE-NEXT: add sp, sp, #128 377; NONEON-NOSVE-NEXT: ret 378 %op1 = load <16 x i16>, ptr %a 379 %res = uitofp <16 x i16> %op1 to <16 x float> 380 store <16 x float> %res, ptr %b 381 ret void 382} 383 384; 385; UCVTF H -> D 386; 387 388define <1 x double> @ucvtf_v1i16_v1f64(<1 x i16> %op1) { 389; CHECK-LABEL: ucvtf_v1i16_v1f64: 390; CHECK: // %bb.0: 391; CHECK-NEXT: // kill: def $d0 killed $d0 def $z0 392; CHECK-NEXT: fmov w8, s0 393; CHECK-NEXT: and w8, w8, #0xffff 394; CHECK-NEXT: ucvtf d0, w8 395; CHECK-NEXT: ret 396; 397; NONEON-NOSVE-LABEL: ucvtf_v1i16_v1f64: 398; NONEON-NOSVE: // %bb.0: 399; NONEON-NOSVE-NEXT: sub sp, sp, #16 400; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 16 401; NONEON-NOSVE-NEXT: str d0, [sp, #8] 402; NONEON-NOSVE-NEXT: ldrh w8, [sp, #8] 403; NONEON-NOSVE-NEXT: ucvtf d0, w8 404; NONEON-NOSVE-NEXT: str d0, [sp] 405; NONEON-NOSVE-NEXT: ldr d0, [sp], #16 406; NONEON-NOSVE-NEXT: ret 407 %res = uitofp <1 x i16> %op1 to <1 x double> 408 ret <1 x double> %res 409} 410 411define <2 x double> @ucvtf_v2i16_v2f64(<2 x i16> %op1) { 412; CHECK-LABEL: ucvtf_v2i16_v2f64: 413; CHECK: // %bb.0: 414; CHECK-NEXT: // kill: def $d0 killed $d0 def $z0 415; CHECK-NEXT: ptrue p0.d, vl2 416; CHECK-NEXT: and z0.s, z0.s, #0xffff 417; CHECK-NEXT: uunpklo z0.d, z0.s 418; CHECK-NEXT: ucvtf z0.d, p0/m, z0.d 419; CHECK-NEXT: // kill: def $q0 killed $q0 killed $z0 420; CHECK-NEXT: ret 421; 422; NONEON-NOSVE-LABEL: ucvtf_v2i16_v2f64: 423; NONEON-NOSVE: // %bb.0: 424; NONEON-NOSVE-NEXT: sub sp, sp, #32 425; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 32 426; NONEON-NOSVE-NEXT: str d0, [sp, #8] 427; NONEON-NOSVE-NEXT: ldrh w8, [sp, #12] 428; NONEON-NOSVE-NEXT: ldrh w9, [sp, #8] 429; NONEON-NOSVE-NEXT: ucvtf d0, w8 430; NONEON-NOSVE-NEXT: ucvtf d1, w9 431; NONEON-NOSVE-NEXT: stp d1, d0, [sp, #16] 432; NONEON-NOSVE-NEXT: ldr q0, [sp, #16] 433; NONEON-NOSVE-NEXT: add sp, sp, #32 434; NONEON-NOSVE-NEXT: ret 435 %res = uitofp <2 x i16> %op1 to <2 x double> 436 ret <2 x double> %res 437} 438 439define void @ucvtf_v4i16_v4f64(ptr %a, ptr %b) { 440; CHECK-LABEL: ucvtf_v4i16_v4f64: 441; CHECK: // %bb.0: 442; CHECK-NEXT: ldr d0, [x0] 443; CHECK-NEXT: ptrue p0.d, vl2 444; CHECK-NEXT: uunpklo z0.s, z0.h 445; CHECK-NEXT: uunpklo z1.d, z0.s 446; CHECK-NEXT: ext z0.b, z0.b, z0.b, #8 447; CHECK-NEXT: uunpklo z0.d, z0.s 448; CHECK-NEXT: ucvtf z1.d, p0/m, z1.d 449; CHECK-NEXT: ucvtf z0.d, p0/m, z0.d 450; CHECK-NEXT: stp q1, q0, [x1] 451; CHECK-NEXT: ret 452; 453; NONEON-NOSVE-LABEL: ucvtf_v4i16_v4f64: 454; NONEON-NOSVE: // %bb.0: 455; NONEON-NOSVE-NEXT: sub sp, sp, #80 456; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 80 457; NONEON-NOSVE-NEXT: ldr d0, [x0] 458; NONEON-NOSVE-NEXT: str d0, [sp, #8] 459; NONEON-NOSVE-NEXT: ldrh w9, [sp, #10] 460; NONEON-NOSVE-NEXT: ldrh w8, [sp, #8] 461; NONEON-NOSVE-NEXT: stp w8, w9, [sp, #24] 462; NONEON-NOSVE-NEXT: ldrh w9, [sp, #14] 463; NONEON-NOSVE-NEXT: ldrh w8, [sp, #12] 464; NONEON-NOSVE-NEXT: stp w8, w9, [sp, #16] 465; NONEON-NOSVE-NEXT: ldp d0, d1, [sp, #16] 466; NONEON-NOSVE-NEXT: stp d0, d1, [sp, #32] 467; NONEON-NOSVE-NEXT: ldp w8, w9, [sp, #40] 468; NONEON-NOSVE-NEXT: ucvtf d1, w9 469; NONEON-NOSVE-NEXT: ucvtf d0, w8 470; NONEON-NOSVE-NEXT: ldp w8, w9, [sp, #32] 471; NONEON-NOSVE-NEXT: stp d0, d1, [sp, #64] 472; NONEON-NOSVE-NEXT: ucvtf d1, w9 473; NONEON-NOSVE-NEXT: ucvtf d0, w8 474; NONEON-NOSVE-NEXT: stp d0, d1, [sp, #48] 475; NONEON-NOSVE-NEXT: ldp q0, q1, [sp, #48] 476; NONEON-NOSVE-NEXT: stp q1, q0, [x1] 477; NONEON-NOSVE-NEXT: add sp, sp, #80 478; NONEON-NOSVE-NEXT: ret 479 %op1 = load <4 x i16>, ptr %a 480 %res = uitofp <4 x i16> %op1 to <4 x double> 481 store <4 x double> %res, ptr %b 482 ret void 483} 484 485define void @ucvtf_v8i16_v8f64(ptr %a, ptr %b) { 486; CHECK-LABEL: ucvtf_v8i16_v8f64: 487; CHECK: // %bb.0: 488; CHECK-NEXT: ldr q0, [x0] 489; CHECK-NEXT: ptrue p0.d, vl2 490; CHECK-NEXT: uunpklo z1.s, z0.h 491; CHECK-NEXT: ext z0.b, z0.b, z0.b, #8 492; CHECK-NEXT: uunpklo z0.s, z0.h 493; CHECK-NEXT: uunpklo z2.d, z1.s 494; CHECK-NEXT: ext z1.b, z1.b, z1.b, #8 495; CHECK-NEXT: uunpklo z3.d, z0.s 496; CHECK-NEXT: ext z0.b, z0.b, z0.b, #8 497; CHECK-NEXT: uunpklo z1.d, z1.s 498; CHECK-NEXT: ucvtf z2.d, p0/m, z2.d 499; CHECK-NEXT: uunpklo z0.d, z0.s 500; CHECK-NEXT: ucvtf z1.d, p0/m, z1.d 501; CHECK-NEXT: ucvtf z3.d, p0/m, z3.d 502; CHECK-NEXT: ucvtf z0.d, p0/m, z0.d 503; CHECK-NEXT: stp q2, q1, [x1] 504; CHECK-NEXT: stp q3, q0, [x1, #32] 505; CHECK-NEXT: ret 506; 507; NONEON-NOSVE-LABEL: ucvtf_v8i16_v8f64: 508; NONEON-NOSVE: // %bb.0: 509; NONEON-NOSVE-NEXT: sub sp, sp, #160 510; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 160 511; NONEON-NOSVE-NEXT: ldr q0, [x0] 512; NONEON-NOSVE-NEXT: str q0, [sp] 513; NONEON-NOSVE-NEXT: ldp d1, d0, [sp] 514; NONEON-NOSVE-NEXT: stp d0, d1, [sp, #16] 515; NONEON-NOSVE-NEXT: ldrh w9, [sp, #26] 516; NONEON-NOSVE-NEXT: ldrh w8, [sp, #24] 517; NONEON-NOSVE-NEXT: stp w8, w9, [sp, #56] 518; NONEON-NOSVE-NEXT: ldrh w9, [sp, #30] 519; NONEON-NOSVE-NEXT: ldrh w8, [sp, #28] 520; NONEON-NOSVE-NEXT: stp w8, w9, [sp, #48] 521; NONEON-NOSVE-NEXT: ldrh w9, [sp, #18] 522; NONEON-NOSVE-NEXT: ldrh w8, [sp, #16] 523; NONEON-NOSVE-NEXT: ldp d0, d1, [sp, #48] 524; NONEON-NOSVE-NEXT: stp w8, w9, [sp, #40] 525; NONEON-NOSVE-NEXT: ldrh w9, [sp, #22] 526; NONEON-NOSVE-NEXT: ldrh w8, [sp, #20] 527; NONEON-NOSVE-NEXT: stp w8, w9, [sp, #32] 528; NONEON-NOSVE-NEXT: stp d0, d1, [sp, #80] 529; NONEON-NOSVE-NEXT: ldp d0, d1, [sp, #32] 530; NONEON-NOSVE-NEXT: ldp w8, w9, [sp, #88] 531; NONEON-NOSVE-NEXT: stp d0, d1, [sp, #64] 532; NONEON-NOSVE-NEXT: ucvtf d1, w9 533; NONEON-NOSVE-NEXT: ucvtf d0, w8 534; NONEON-NOSVE-NEXT: ldp w8, w9, [sp, #80] 535; NONEON-NOSVE-NEXT: stp d0, d1, [sp, #144] 536; NONEON-NOSVE-NEXT: ucvtf d1, w9 537; NONEON-NOSVE-NEXT: ucvtf d0, w8 538; NONEON-NOSVE-NEXT: ldp w8, w9, [sp, #72] 539; NONEON-NOSVE-NEXT: stp d0, d1, [sp, #128] 540; NONEON-NOSVE-NEXT: ucvtf d1, w9 541; NONEON-NOSVE-NEXT: ucvtf d0, w8 542; NONEON-NOSVE-NEXT: ldp w8, w9, [sp, #64] 543; NONEON-NOSVE-NEXT: ldp q3, q2, [sp, #128] 544; NONEON-NOSVE-NEXT: stp d0, d1, [sp, #112] 545; NONEON-NOSVE-NEXT: ucvtf d1, w9 546; NONEON-NOSVE-NEXT: ucvtf d0, w8 547; NONEON-NOSVE-NEXT: stp d0, d1, [sp, #96] 548; NONEON-NOSVE-NEXT: ldp q0, q1, [sp, #96] 549; NONEON-NOSVE-NEXT: stp q2, q3, [x1] 550; NONEON-NOSVE-NEXT: stp q1, q0, [x1, #32] 551; NONEON-NOSVE-NEXT: add sp, sp, #160 552; NONEON-NOSVE-NEXT: ret 553 %op1 = load <8 x i16>, ptr %a 554 %res = uitofp <8 x i16> %op1 to <8 x double> 555 store <8 x double> %res, ptr %b 556 ret void 557} 558 559define void @ucvtf_v16i16_v16f64(ptr %a, ptr %b) { 560; CHECK-LABEL: ucvtf_v16i16_v16f64: 561; CHECK: // %bb.0: 562; CHECK-NEXT: ldp q1, q0, [x0] 563; CHECK-NEXT: ptrue p0.d, vl2 564; CHECK-NEXT: mov z2.d, z0.d 565; CHECK-NEXT: uunpklo z3.s, z1.h 566; CHECK-NEXT: ext z1.b, z1.b, z1.b, #8 567; CHECK-NEXT: uunpklo z0.s, z0.h 568; CHECK-NEXT: ext z2.b, z2.b, z2.b, #8 569; CHECK-NEXT: uunpklo z1.s, z1.h 570; CHECK-NEXT: mov z5.d, z3.d 571; CHECK-NEXT: uunpklo z4.d, z0.s 572; CHECK-NEXT: ext z0.b, z0.b, z0.b, #8 573; CHECK-NEXT: uunpklo z2.s, z2.h 574; CHECK-NEXT: ext z5.b, z5.b, z3.b, #8 575; CHECK-NEXT: mov z7.d, z1.d 576; CHECK-NEXT: uunpklo z3.d, z3.s 577; CHECK-NEXT: uunpklo z0.d, z0.s 578; CHECK-NEXT: ucvtf z4.d, p0/m, z4.d 579; CHECK-NEXT: mov z6.d, z2.d 580; CHECK-NEXT: uunpklo z5.d, z5.s 581; CHECK-NEXT: ext z7.b, z7.b, z1.b, #8 582; CHECK-NEXT: uunpklo z1.d, z1.s 583; CHECK-NEXT: ucvtf z3.d, p0/m, z3.d 584; CHECK-NEXT: ucvtf z0.d, p0/m, z0.d 585; CHECK-NEXT: ext z6.b, z6.b, z2.b, #8 586; CHECK-NEXT: uunpklo z2.d, z2.s 587; CHECK-NEXT: uunpklo z7.d, z7.s 588; CHECK-NEXT: ucvtf z5.d, p0/m, z5.d 589; CHECK-NEXT: ucvtf z1.d, p0/m, z1.d 590; CHECK-NEXT: uunpklo z6.d, z6.s 591; CHECK-NEXT: stp q4, q0, [x1, #64] 592; CHECK-NEXT: ucvtf z2.d, p0/m, z2.d 593; CHECK-NEXT: stp q3, q5, [x1] 594; CHECK-NEXT: movprfx z3, z7 595; CHECK-NEXT: ucvtf z3.d, p0/m, z7.d 596; CHECK-NEXT: movprfx z0, z6 597; CHECK-NEXT: ucvtf z0.d, p0/m, z6.d 598; CHECK-NEXT: stp q1, q3, [x1, #32] 599; CHECK-NEXT: stp q2, q0, [x1, #96] 600; CHECK-NEXT: ret 601; 602; NONEON-NOSVE-LABEL: ucvtf_v16i16_v16f64: 603; NONEON-NOSVE: // %bb.0: 604; NONEON-NOSVE-NEXT: sub sp, sp, #336 605; NONEON-NOSVE-NEXT: str x29, [sp, #320] // 8-byte Folded Spill 606; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 336 607; NONEON-NOSVE-NEXT: .cfi_offset w29, -16 608; NONEON-NOSVE-NEXT: ldp q0, q1, [x0] 609; NONEON-NOSVE-NEXT: ldr x29, [sp, #320] // 8-byte Folded Reload 610; NONEON-NOSVE-NEXT: stp q0, q1, [sp] 611; NONEON-NOSVE-NEXT: ldp d1, d0, [sp] 612; NONEON-NOSVE-NEXT: stp d0, d1, [sp, #40] 613; NONEON-NOSVE-NEXT: ldp d1, d0, [sp, #16] 614; NONEON-NOSVE-NEXT: ldrh w9, [sp, #50] 615; NONEON-NOSVE-NEXT: ldrh w8, [sp, #48] 616; NONEON-NOSVE-NEXT: stp w8, w9, [sp, #96] 617; NONEON-NOSVE-NEXT: ldrh w9, [sp, #54] 618; NONEON-NOSVE-NEXT: ldrh w8, [sp, #52] 619; NONEON-NOSVE-NEXT: stp d0, d1, [sp, #56] 620; NONEON-NOSVE-NEXT: stp w8, w9, [sp, #88] 621; NONEON-NOSVE-NEXT: ldrh w9, [sp, #42] 622; NONEON-NOSVE-NEXT: ldrh w8, [sp, #40] 623; NONEON-NOSVE-NEXT: ldp d0, d1, [sp, #88] 624; NONEON-NOSVE-NEXT: stp w8, w9, [sp, #80] 625; NONEON-NOSVE-NEXT: ldrh w9, [sp, #46] 626; NONEON-NOSVE-NEXT: ldrh w8, [sp, #44] 627; NONEON-NOSVE-NEXT: stp w8, w9, [sp, #72] 628; NONEON-NOSVE-NEXT: ldrh w9, [sp, #66] 629; NONEON-NOSVE-NEXT: ldrh w8, [sp, #64] 630; NONEON-NOSVE-NEXT: stp d0, d1, [sp, #152] 631; NONEON-NOSVE-NEXT: ldp d0, d1, [sp, #72] 632; NONEON-NOSVE-NEXT: stp w8, w9, [sp, #128] 633; NONEON-NOSVE-NEXT: ldrh w9, [sp, #70] 634; NONEON-NOSVE-NEXT: ldrh w8, [sp, #68] 635; NONEON-NOSVE-NEXT: stp w8, w9, [sp, #120] 636; NONEON-NOSVE-NEXT: ldrh w9, [sp, #58] 637; NONEON-NOSVE-NEXT: ldrh w8, [sp, #56] 638; NONEON-NOSVE-NEXT: stp d0, d1, [sp, #136] 639; NONEON-NOSVE-NEXT: ldp d2, d1, [sp, #120] 640; NONEON-NOSVE-NEXT: stp w8, w9, [sp, #112] 641; NONEON-NOSVE-NEXT: ldrh w9, [sp, #62] 642; NONEON-NOSVE-NEXT: ldrh w8, [sp, #60] 643; NONEON-NOSVE-NEXT: stp w8, w9, [sp, #104] 644; NONEON-NOSVE-NEXT: str d1, [sp, #328] 645; NONEON-NOSVE-NEXT: ldp d0, d1, [sp, #104] 646; NONEON-NOSVE-NEXT: ldp w8, w9, [sp, #160] 647; NONEON-NOSVE-NEXT: stp d1, d2, [sp, #176] 648; NONEON-NOSVE-NEXT: str d0, [sp, #168] 649; NONEON-NOSVE-NEXT: ucvtf d1, w9 650; NONEON-NOSVE-NEXT: ucvtf d0, w8 651; NONEON-NOSVE-NEXT: ldp w8, w9, [sp, #152] 652; NONEON-NOSVE-NEXT: stp d0, d1, [sp, #240] 653; NONEON-NOSVE-NEXT: ucvtf d1, w9 654; NONEON-NOSVE-NEXT: ucvtf d0, w8 655; NONEON-NOSVE-NEXT: ldp w8, w9, [sp, #144] 656; NONEON-NOSVE-NEXT: stp d0, d1, [sp, #224] 657; NONEON-NOSVE-NEXT: ucvtf d1, w9 658; NONEON-NOSVE-NEXT: ucvtf d0, w8 659; NONEON-NOSVE-NEXT: ldp w8, w9, [sp, #136] 660; NONEON-NOSVE-NEXT: stp d0, d1, [sp, #208] 661; NONEON-NOSVE-NEXT: ucvtf d1, w9 662; NONEON-NOSVE-NEXT: ucvtf d0, w8 663; NONEON-NOSVE-NEXT: ldr w8, [sp, #332] 664; NONEON-NOSVE-NEXT: stp d0, d1, [sp, #192] 665; NONEON-NOSVE-NEXT: ucvtf d1, w8 666; NONEON-NOSVE-NEXT: ldr w8, [sp, #328] 667; NONEON-NOSVE-NEXT: ldp q4, q3, [sp, #192] 668; NONEON-NOSVE-NEXT: ucvtf d0, w8 669; NONEON-NOSVE-NEXT: ldp w8, w9, [sp, #184] 670; NONEON-NOSVE-NEXT: stp d0, d1, [sp, #304] 671; NONEON-NOSVE-NEXT: ucvtf d1, w9 672; NONEON-NOSVE-NEXT: ucvtf d0, w8 673; NONEON-NOSVE-NEXT: ldp w8, w9, [sp, #176] 674; NONEON-NOSVE-NEXT: stp d0, d1, [sp, #288] 675; NONEON-NOSVE-NEXT: ucvtf d1, w9 676; NONEON-NOSVE-NEXT: ucvtf d0, w8 677; NONEON-NOSVE-NEXT: ldp w8, w9, [sp, #168] 678; NONEON-NOSVE-NEXT: ldp q7, q6, [sp, #288] 679; NONEON-NOSVE-NEXT: stp d0, d1, [sp, #272] 680; NONEON-NOSVE-NEXT: ucvtf d1, w9 681; NONEON-NOSVE-NEXT: ucvtf d0, w8 682; NONEON-NOSVE-NEXT: stp d0, d1, [sp, #256] 683; NONEON-NOSVE-NEXT: ldp q1, q0, [sp, #224] 684; NONEON-NOSVE-NEXT: ldp q2, q5, [sp, #256] 685; NONEON-NOSVE-NEXT: stp q3, q4, [x1, #32] 686; NONEON-NOSVE-NEXT: stp q6, q7, [x1, #64] 687; NONEON-NOSVE-NEXT: stp q0, q1, [x1] 688; NONEON-NOSVE-NEXT: stp q5, q2, [x1, #96] 689; NONEON-NOSVE-NEXT: add sp, sp, #336 690; NONEON-NOSVE-NEXT: ret 691 %op1 = load <16 x i16>, ptr %a 692 %res = uitofp <16 x i16> %op1 to <16 x double> 693 store <16 x double> %res, ptr %b 694 ret void 695} 696 697; 698; UCVTF S -> H 699; 700 701define <2 x half> @ucvtf_v2i32_v2f16(<2 x i32> %op1) { 702; CHECK-LABEL: ucvtf_v2i32_v2f16: 703; CHECK: // %bb.0: 704; CHECK-NEXT: ptrue p0.s, vl4 705; CHECK-NEXT: // kill: def $d0 killed $d0 def $z0 706; CHECK-NEXT: ucvtf z0.h, p0/m, z0.s 707; CHECK-NEXT: uzp1 z0.h, z0.h, z0.h 708; CHECK-NEXT: // kill: def $d0 killed $d0 killed $z0 709; CHECK-NEXT: ret 710; 711; NONEON-NOSVE-LABEL: ucvtf_v2i32_v2f16: 712; NONEON-NOSVE: // %bb.0: 713; NONEON-NOSVE-NEXT: str d0, [sp, #-16]! 714; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 16 715; NONEON-NOSVE-NEXT: ldp w8, w9, [sp] 716; NONEON-NOSVE-NEXT: str wzr, [sp, #12] 717; NONEON-NOSVE-NEXT: ucvtf s0, w9 718; NONEON-NOSVE-NEXT: fcvt h0, s0 719; NONEON-NOSVE-NEXT: str h0, [sp, #10] 720; NONEON-NOSVE-NEXT: ucvtf s0, w8 721; NONEON-NOSVE-NEXT: fcvt h0, s0 722; NONEON-NOSVE-NEXT: str h0, [sp, #8] 723; NONEON-NOSVE-NEXT: ldr d0, [sp, #8] 724; NONEON-NOSVE-NEXT: add sp, sp, #16 725; NONEON-NOSVE-NEXT: ret 726 %res = uitofp <2 x i32> %op1 to <2 x half> 727 ret <2 x half> %res 728} 729 730define <4 x half> @ucvtf_v4i32_v4f16(<4 x i32> %op1) { 731; CHECK-LABEL: ucvtf_v4i32_v4f16: 732; CHECK: // %bb.0: 733; CHECK-NEXT: ptrue p0.s, vl4 734; CHECK-NEXT: // kill: def $q0 killed $q0 def $z0 735; CHECK-NEXT: ucvtf z0.h, p0/m, z0.s 736; CHECK-NEXT: uzp1 z0.h, z0.h, z0.h 737; CHECK-NEXT: // kill: def $d0 killed $d0 killed $z0 738; CHECK-NEXT: ret 739; 740; NONEON-NOSVE-LABEL: ucvtf_v4i32_v4f16: 741; NONEON-NOSVE: // %bb.0: 742; NONEON-NOSVE-NEXT: str q0, [sp, #-32]! 743; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 32 744; NONEON-NOSVE-NEXT: ldp w8, w9, [sp, #8] 745; NONEON-NOSVE-NEXT: ucvtf s0, w9 746; NONEON-NOSVE-NEXT: fcvt h0, s0 747; NONEON-NOSVE-NEXT: str h0, [sp, #30] 748; NONEON-NOSVE-NEXT: ucvtf s0, w8 749; NONEON-NOSVE-NEXT: ldp w8, w9, [sp] 750; NONEON-NOSVE-NEXT: fcvt h0, s0 751; NONEON-NOSVE-NEXT: str h0, [sp, #28] 752; NONEON-NOSVE-NEXT: ucvtf s0, w9 753; NONEON-NOSVE-NEXT: fcvt h0, s0 754; NONEON-NOSVE-NEXT: str h0, [sp, #26] 755; NONEON-NOSVE-NEXT: ucvtf s0, w8 756; NONEON-NOSVE-NEXT: fcvt h0, s0 757; NONEON-NOSVE-NEXT: str h0, [sp, #24] 758; NONEON-NOSVE-NEXT: ldr d0, [sp, #24] 759; NONEON-NOSVE-NEXT: add sp, sp, #32 760; NONEON-NOSVE-NEXT: ret 761 %res = uitofp <4 x i32> %op1 to <4 x half> 762 ret <4 x half> %res 763} 764 765define <8 x half> @ucvtf_v8i32_v8f16(ptr %a) { 766; CHECK-LABEL: ucvtf_v8i32_v8f16: 767; CHECK: // %bb.0: 768; CHECK-NEXT: ldp q0, q1, [x0] 769; CHECK-NEXT: ptrue p0.s, vl4 770; CHECK-NEXT: ucvtf z1.h, p0/m, z1.s 771; CHECK-NEXT: ucvtf z0.h, p0/m, z0.s 772; CHECK-NEXT: ptrue p0.h, vl4 773; CHECK-NEXT: uzp1 z1.h, z1.h, z1.h 774; CHECK-NEXT: uzp1 z0.h, z0.h, z0.h 775; CHECK-NEXT: splice z0.h, p0, z0.h, z1.h 776; CHECK-NEXT: // kill: def $q0 killed $q0 killed $z0 777; CHECK-NEXT: ret 778; 779; NONEON-NOSVE-LABEL: ucvtf_v8i32_v8f16: 780; NONEON-NOSVE: // %bb.0: 781; NONEON-NOSVE-NEXT: ldp q1, q0, [x0] 782; NONEON-NOSVE-NEXT: stp q1, q0, [sp, #-48]! 783; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 48 784; NONEON-NOSVE-NEXT: ldp w8, w9, [sp, #24] 785; NONEON-NOSVE-NEXT: ucvtf s0, w9 786; NONEON-NOSVE-NEXT: fcvt h0, s0 787; NONEON-NOSVE-NEXT: str h0, [sp, #46] 788; NONEON-NOSVE-NEXT: ucvtf s0, w8 789; NONEON-NOSVE-NEXT: ldp w8, w9, [sp, #16] 790; NONEON-NOSVE-NEXT: fcvt h0, s0 791; NONEON-NOSVE-NEXT: str h0, [sp, #44] 792; NONEON-NOSVE-NEXT: ucvtf s0, w9 793; NONEON-NOSVE-NEXT: fcvt h0, s0 794; NONEON-NOSVE-NEXT: str h0, [sp, #42] 795; NONEON-NOSVE-NEXT: ucvtf s0, w8 796; NONEON-NOSVE-NEXT: ldp w8, w9, [sp, #8] 797; NONEON-NOSVE-NEXT: fcvt h0, s0 798; NONEON-NOSVE-NEXT: str h0, [sp, #40] 799; NONEON-NOSVE-NEXT: ucvtf s0, w9 800; NONEON-NOSVE-NEXT: fcvt h0, s0 801; NONEON-NOSVE-NEXT: str h0, [sp, #38] 802; NONEON-NOSVE-NEXT: ucvtf s0, w8 803; NONEON-NOSVE-NEXT: ldp w8, w9, [sp] 804; NONEON-NOSVE-NEXT: fcvt h0, s0 805; NONEON-NOSVE-NEXT: str h0, [sp, #36] 806; NONEON-NOSVE-NEXT: ucvtf s0, w9 807; NONEON-NOSVE-NEXT: fcvt h0, s0 808; NONEON-NOSVE-NEXT: str h0, [sp, #34] 809; NONEON-NOSVE-NEXT: ucvtf s0, w8 810; NONEON-NOSVE-NEXT: fcvt h0, s0 811; NONEON-NOSVE-NEXT: str h0, [sp, #32] 812; NONEON-NOSVE-NEXT: ldr q0, [sp, #32] 813; NONEON-NOSVE-NEXT: add sp, sp, #48 814; NONEON-NOSVE-NEXT: ret 815 %op1 = load <8 x i32>, ptr %a 816 %res = uitofp <8 x i32> %op1 to <8 x half> 817 ret <8 x half> %res 818} 819 820define void @ucvtf_v16i32_v16f16(ptr %a, ptr %b) { 821; CHECK-LABEL: ucvtf_v16i32_v16f16: 822; CHECK: // %bb.0: 823; CHECK-NEXT: ldp q0, q1, [x0, #32] 824; CHECK-NEXT: ptrue p0.s, vl4 825; CHECK-NEXT: ldp q2, q3, [x0] 826; CHECK-NEXT: ucvtf z1.h, p0/m, z1.s 827; CHECK-NEXT: ucvtf z0.h, p0/m, z0.s 828; CHECK-NEXT: ucvtf z3.h, p0/m, z3.s 829; CHECK-NEXT: ucvtf z2.h, p0/m, z2.s 830; CHECK-NEXT: ptrue p0.h, vl4 831; CHECK-NEXT: uzp1 z1.h, z1.h, z1.h 832; CHECK-NEXT: uzp1 z0.h, z0.h, z0.h 833; CHECK-NEXT: uzp1 z3.h, z3.h, z3.h 834; CHECK-NEXT: uzp1 z2.h, z2.h, z2.h 835; CHECK-NEXT: splice z0.h, p0, z0.h, z1.h 836; CHECK-NEXT: splice z2.h, p0, z2.h, z3.h 837; CHECK-NEXT: stp q2, q0, [x1] 838; CHECK-NEXT: ret 839; 840; NONEON-NOSVE-LABEL: ucvtf_v16i32_v16f16: 841; NONEON-NOSVE: // %bb.0: 842; NONEON-NOSVE-NEXT: sub sp, sp, #96 843; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 96 844; NONEON-NOSVE-NEXT: ldp q1, q0, [x0] 845; NONEON-NOSVE-NEXT: ldp q2, q3, [x0, #32] 846; NONEON-NOSVE-NEXT: str q1, [sp] 847; NONEON-NOSVE-NEXT: stp q3, q0, [sp, #16] 848; NONEON-NOSVE-NEXT: ldp w8, w9, [sp, #40] 849; NONEON-NOSVE-NEXT: str q2, [sp, #48] 850; NONEON-NOSVE-NEXT: ucvtf s0, w9 851; NONEON-NOSVE-NEXT: fcvt h0, s0 852; NONEON-NOSVE-NEXT: str h0, [sp, #78] 853; NONEON-NOSVE-NEXT: ucvtf s0, w8 854; NONEON-NOSVE-NEXT: ldp w8, w9, [sp, #32] 855; NONEON-NOSVE-NEXT: fcvt h0, s0 856; NONEON-NOSVE-NEXT: str h0, [sp, #76] 857; NONEON-NOSVE-NEXT: ucvtf s0, w9 858; NONEON-NOSVE-NEXT: fcvt h0, s0 859; NONEON-NOSVE-NEXT: str h0, [sp, #74] 860; NONEON-NOSVE-NEXT: ucvtf s0, w8 861; NONEON-NOSVE-NEXT: ldp w8, w9, [sp, #8] 862; NONEON-NOSVE-NEXT: fcvt h0, s0 863; NONEON-NOSVE-NEXT: str h0, [sp, #72] 864; NONEON-NOSVE-NEXT: ucvtf s0, w9 865; NONEON-NOSVE-NEXT: fcvt h0, s0 866; NONEON-NOSVE-NEXT: str h0, [sp, #70] 867; NONEON-NOSVE-NEXT: ucvtf s0, w8 868; NONEON-NOSVE-NEXT: ldp w8, w9, [sp] 869; NONEON-NOSVE-NEXT: fcvt h0, s0 870; NONEON-NOSVE-NEXT: str h0, [sp, #68] 871; NONEON-NOSVE-NEXT: ucvtf s0, w9 872; NONEON-NOSVE-NEXT: fcvt h0, s0 873; NONEON-NOSVE-NEXT: str h0, [sp, #66] 874; NONEON-NOSVE-NEXT: ucvtf s0, w8 875; NONEON-NOSVE-NEXT: ldp w8, w9, [sp, #24] 876; NONEON-NOSVE-NEXT: fcvt h0, s0 877; NONEON-NOSVE-NEXT: str h0, [sp, #64] 878; NONEON-NOSVE-NEXT: ucvtf s0, w9 879; NONEON-NOSVE-NEXT: fcvt h0, s0 880; NONEON-NOSVE-NEXT: str h0, [sp, #94] 881; NONEON-NOSVE-NEXT: ucvtf s0, w8 882; NONEON-NOSVE-NEXT: ldp w8, w9, [sp, #16] 883; NONEON-NOSVE-NEXT: fcvt h0, s0 884; NONEON-NOSVE-NEXT: str h0, [sp, #92] 885; NONEON-NOSVE-NEXT: ucvtf s0, w9 886; NONEON-NOSVE-NEXT: fcvt h0, s0 887; NONEON-NOSVE-NEXT: str h0, [sp, #90] 888; NONEON-NOSVE-NEXT: ucvtf s0, w8 889; NONEON-NOSVE-NEXT: ldp w8, w9, [sp, #56] 890; NONEON-NOSVE-NEXT: fcvt h0, s0 891; NONEON-NOSVE-NEXT: str h0, [sp, #88] 892; NONEON-NOSVE-NEXT: ucvtf s0, w9 893; NONEON-NOSVE-NEXT: fcvt h0, s0 894; NONEON-NOSVE-NEXT: str h0, [sp, #86] 895; NONEON-NOSVE-NEXT: ucvtf s0, w8 896; NONEON-NOSVE-NEXT: ldp w8, w9, [sp, #48] 897; NONEON-NOSVE-NEXT: fcvt h0, s0 898; NONEON-NOSVE-NEXT: str h0, [sp, #84] 899; NONEON-NOSVE-NEXT: ucvtf s0, w9 900; NONEON-NOSVE-NEXT: fcvt h0, s0 901; NONEON-NOSVE-NEXT: str h0, [sp, #82] 902; NONEON-NOSVE-NEXT: ucvtf s0, w8 903; NONEON-NOSVE-NEXT: fcvt h0, s0 904; NONEON-NOSVE-NEXT: str h0, [sp, #80] 905; NONEON-NOSVE-NEXT: ldp q1, q0, [sp, #64] 906; NONEON-NOSVE-NEXT: stp q1, q0, [x1] 907; NONEON-NOSVE-NEXT: add sp, sp, #96 908; NONEON-NOSVE-NEXT: ret 909 %op1 = load <16 x i32>, ptr %a 910 %res = uitofp <16 x i32> %op1 to <16 x half> 911 store <16 x half> %res, ptr %b 912 ret void 913} 914 915; 916; UCVTF S -> S 917; 918 919define <2 x float> @ucvtf_v2i32_v2f32(<2 x i32> %op1) { 920; CHECK-LABEL: ucvtf_v2i32_v2f32: 921; CHECK: // %bb.0: 922; CHECK-NEXT: ptrue p0.s, vl2 923; CHECK-NEXT: // kill: def $d0 killed $d0 def $z0 924; CHECK-NEXT: ucvtf z0.s, p0/m, z0.s 925; CHECK-NEXT: // kill: def $d0 killed $d0 killed $z0 926; CHECK-NEXT: ret 927; 928; NONEON-NOSVE-LABEL: ucvtf_v2i32_v2f32: 929; NONEON-NOSVE: // %bb.0: 930; NONEON-NOSVE-NEXT: str d0, [sp, #-16]! 931; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 16 932; NONEON-NOSVE-NEXT: ldp w8, w9, [sp] 933; NONEON-NOSVE-NEXT: ucvtf s1, w9 934; NONEON-NOSVE-NEXT: ucvtf s0, w8 935; NONEON-NOSVE-NEXT: stp s0, s1, [sp, #8] 936; NONEON-NOSVE-NEXT: ldr d0, [sp, #8] 937; NONEON-NOSVE-NEXT: add sp, sp, #16 938; NONEON-NOSVE-NEXT: ret 939 %res = uitofp <2 x i32> %op1 to <2 x float> 940 ret <2 x float> %res 941} 942 943define <4 x float> @ucvtf_v4i32_v4f32(<4 x i32> %op1) { 944; CHECK-LABEL: ucvtf_v4i32_v4f32: 945; CHECK: // %bb.0: 946; CHECK-NEXT: ptrue p0.s, vl4 947; CHECK-NEXT: // kill: def $q0 killed $q0 def $z0 948; CHECK-NEXT: ucvtf z0.s, p0/m, z0.s 949; CHECK-NEXT: // kill: def $q0 killed $q0 killed $z0 950; CHECK-NEXT: ret 951; 952; NONEON-NOSVE-LABEL: ucvtf_v4i32_v4f32: 953; NONEON-NOSVE: // %bb.0: 954; NONEON-NOSVE-NEXT: str q0, [sp, #-32]! 955; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 32 956; NONEON-NOSVE-NEXT: ldp w8, w9, [sp, #8] 957; NONEON-NOSVE-NEXT: ucvtf s1, w9 958; NONEON-NOSVE-NEXT: ucvtf s0, w8 959; NONEON-NOSVE-NEXT: ldp w8, w9, [sp] 960; NONEON-NOSVE-NEXT: stp s0, s1, [sp, #24] 961; NONEON-NOSVE-NEXT: ucvtf s1, w9 962; NONEON-NOSVE-NEXT: ucvtf s0, w8 963; NONEON-NOSVE-NEXT: stp s0, s1, [sp, #16] 964; NONEON-NOSVE-NEXT: ldr q0, [sp, #16] 965; NONEON-NOSVE-NEXT: add sp, sp, #32 966; NONEON-NOSVE-NEXT: ret 967 %res = uitofp <4 x i32> %op1 to <4 x float> 968 ret <4 x float> %res 969} 970 971define void @ucvtf_v8i32_v8f32(ptr %a, ptr %b) { 972; CHECK-LABEL: ucvtf_v8i32_v8f32: 973; CHECK: // %bb.0: 974; CHECK-NEXT: ldp q0, q1, [x0] 975; CHECK-NEXT: ptrue p0.s, vl4 976; CHECK-NEXT: ucvtf z0.s, p0/m, z0.s 977; CHECK-NEXT: ucvtf z1.s, p0/m, z1.s 978; CHECK-NEXT: stp q0, q1, [x1] 979; CHECK-NEXT: ret 980; 981; NONEON-NOSVE-LABEL: ucvtf_v8i32_v8f32: 982; NONEON-NOSVE: // %bb.0: 983; NONEON-NOSVE-NEXT: ldp q1, q0, [x0] 984; NONEON-NOSVE-NEXT: stp q1, q0, [sp, #-64]! 985; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 64 986; NONEON-NOSVE-NEXT: ldp w8, w9, [sp, #24] 987; NONEON-NOSVE-NEXT: ucvtf s1, w9 988; NONEON-NOSVE-NEXT: ucvtf s0, w8 989; NONEON-NOSVE-NEXT: ldp w8, w9, [sp, #16] 990; NONEON-NOSVE-NEXT: stp s0, s1, [sp, #56] 991; NONEON-NOSVE-NEXT: ucvtf s1, w9 992; NONEON-NOSVE-NEXT: ucvtf s0, w8 993; NONEON-NOSVE-NEXT: ldp w8, w9, [sp, #8] 994; NONEON-NOSVE-NEXT: stp s0, s1, [sp, #48] 995; NONEON-NOSVE-NEXT: ucvtf s1, w9 996; NONEON-NOSVE-NEXT: ucvtf s0, w8 997; NONEON-NOSVE-NEXT: ldp w8, w9, [sp] 998; NONEON-NOSVE-NEXT: stp s0, s1, [sp, #40] 999; NONEON-NOSVE-NEXT: ucvtf s1, w9 1000; NONEON-NOSVE-NEXT: ucvtf s0, w8 1001; NONEON-NOSVE-NEXT: stp s0, s1, [sp, #32] 1002; NONEON-NOSVE-NEXT: ldp q0, q1, [sp, #32] 1003; NONEON-NOSVE-NEXT: stp q0, q1, [x1] 1004; NONEON-NOSVE-NEXT: add sp, sp, #64 1005; NONEON-NOSVE-NEXT: ret 1006 %op1 = load <8 x i32>, ptr %a 1007 %res = uitofp <8 x i32> %op1 to <8 x float> 1008 store <8 x float> %res, ptr %b 1009 ret void 1010} 1011 1012; 1013; UCVTF S -> D 1014; 1015 1016define <2 x double> @ucvtf_v2i32_v2f64(<2 x i32> %op1) { 1017; CHECK-LABEL: ucvtf_v2i32_v2f64: 1018; CHECK: // %bb.0: 1019; CHECK-NEXT: // kill: def $d0 killed $d0 def $z0 1020; CHECK-NEXT: ptrue p0.d, vl2 1021; CHECK-NEXT: uunpklo z0.d, z0.s 1022; CHECK-NEXT: ucvtf z0.d, p0/m, z0.d 1023; CHECK-NEXT: // kill: def $q0 killed $q0 killed $z0 1024; CHECK-NEXT: ret 1025; 1026; NONEON-NOSVE-LABEL: ucvtf_v2i32_v2f64: 1027; NONEON-NOSVE: // %bb.0: 1028; NONEON-NOSVE-NEXT: sub sp, sp, #32 1029; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 32 1030; NONEON-NOSVE-NEXT: str d0, [sp, #8] 1031; NONEON-NOSVE-NEXT: ldp w8, w9, [sp, #8] 1032; NONEON-NOSVE-NEXT: ucvtf d1, w9 1033; NONEON-NOSVE-NEXT: ucvtf d0, w8 1034; NONEON-NOSVE-NEXT: stp d0, d1, [sp, #16] 1035; NONEON-NOSVE-NEXT: ldr q0, [sp, #16] 1036; NONEON-NOSVE-NEXT: add sp, sp, #32 1037; NONEON-NOSVE-NEXT: ret 1038 %res = uitofp <2 x i32> %op1 to <2 x double> 1039 ret <2 x double> %res 1040} 1041 1042define void @ucvtf_v4i32_v4f64(ptr %a, ptr %b) { 1043; CHECK-LABEL: ucvtf_v4i32_v4f64: 1044; CHECK: // %bb.0: 1045; CHECK-NEXT: ldr q0, [x0] 1046; CHECK-NEXT: ptrue p0.d, vl2 1047; CHECK-NEXT: uunpklo z1.d, z0.s 1048; CHECK-NEXT: ext z0.b, z0.b, z0.b, #8 1049; CHECK-NEXT: uunpklo z0.d, z0.s 1050; CHECK-NEXT: ucvtf z1.d, p0/m, z1.d 1051; CHECK-NEXT: ucvtf z0.d, p0/m, z0.d 1052; CHECK-NEXT: stp q1, q0, [x1] 1053; CHECK-NEXT: ret 1054; 1055; NONEON-NOSVE-LABEL: ucvtf_v4i32_v4f64: 1056; NONEON-NOSVE: // %bb.0: 1057; NONEON-NOSVE-NEXT: ldr q0, [x0] 1058; NONEON-NOSVE-NEXT: str q0, [sp, #-64]! 1059; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 64 1060; NONEON-NOSVE-NEXT: ldp d1, d0, [sp] 1061; NONEON-NOSVE-NEXT: stp d0, d1, [sp, #16] 1062; NONEON-NOSVE-NEXT: ldp w8, w9, [sp, #24] 1063; NONEON-NOSVE-NEXT: ucvtf d1, w9 1064; NONEON-NOSVE-NEXT: ucvtf d0, w8 1065; NONEON-NOSVE-NEXT: ldp w8, w9, [sp, #16] 1066; NONEON-NOSVE-NEXT: stp d0, d1, [sp, #48] 1067; NONEON-NOSVE-NEXT: ucvtf d1, w9 1068; NONEON-NOSVE-NEXT: ucvtf d0, w8 1069; NONEON-NOSVE-NEXT: stp d0, d1, [sp, #32] 1070; NONEON-NOSVE-NEXT: ldp q0, q1, [sp, #32] 1071; NONEON-NOSVE-NEXT: stp q1, q0, [x1] 1072; NONEON-NOSVE-NEXT: add sp, sp, #64 1073; NONEON-NOSVE-NEXT: ret 1074 %op1 = load <4 x i32>, ptr %a 1075 %res = uitofp <4 x i32> %op1 to <4 x double> 1076 store <4 x double> %res, ptr %b 1077 ret void 1078} 1079 1080define void @ucvtf_v8i32_v8f64(ptr %a, ptr %b) { 1081; CHECK-LABEL: ucvtf_v8i32_v8f64: 1082; CHECK: // %bb.0: 1083; CHECK-NEXT: ldp q1, q0, [x0] 1084; CHECK-NEXT: ptrue p0.d, vl2 1085; CHECK-NEXT: uunpklo z2.d, z0.s 1086; CHECK-NEXT: ext z0.b, z0.b, z0.b, #8 1087; CHECK-NEXT: uunpklo z3.d, z1.s 1088; CHECK-NEXT: ext z1.b, z1.b, z1.b, #8 1089; CHECK-NEXT: uunpklo z0.d, z0.s 1090; CHECK-NEXT: uunpklo z1.d, z1.s 1091; CHECK-NEXT: ucvtf z2.d, p0/m, z2.d 1092; CHECK-NEXT: ucvtf z3.d, p0/m, z3.d 1093; CHECK-NEXT: ucvtf z0.d, p0/m, z0.d 1094; CHECK-NEXT: ucvtf z1.d, p0/m, z1.d 1095; CHECK-NEXT: stp q2, q0, [x1, #32] 1096; CHECK-NEXT: stp q3, q1, [x1] 1097; CHECK-NEXT: ret 1098; 1099; NONEON-NOSVE-LABEL: ucvtf_v8i32_v8f64: 1100; NONEON-NOSVE: // %bb.0: 1101; NONEON-NOSVE-NEXT: ldp q0, q1, [x0] 1102; NONEON-NOSVE-NEXT: stp q0, q1, [sp, #-128]! 1103; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 128 1104; NONEON-NOSVE-NEXT: ldp d1, d0, [sp] 1105; NONEON-NOSVE-NEXT: stp d0, d1, [sp, #32] 1106; NONEON-NOSVE-NEXT: ldp d1, d0, [sp, #16] 1107; NONEON-NOSVE-NEXT: ldp w8, w9, [sp, #40] 1108; NONEON-NOSVE-NEXT: stp d0, d1, [sp, #48] 1109; NONEON-NOSVE-NEXT: ucvtf d1, w9 1110; NONEON-NOSVE-NEXT: ucvtf d0, w8 1111; NONEON-NOSVE-NEXT: ldp w8, w9, [sp, #32] 1112; NONEON-NOSVE-NEXT: stp d0, d1, [sp, #80] 1113; NONEON-NOSVE-NEXT: ucvtf d1, w9 1114; NONEON-NOSVE-NEXT: ucvtf d0, w8 1115; NONEON-NOSVE-NEXT: ldp w8, w9, [sp, #56] 1116; NONEON-NOSVE-NEXT: stp d0, d1, [sp, #64] 1117; NONEON-NOSVE-NEXT: ucvtf d1, w9 1118; NONEON-NOSVE-NEXT: ucvtf d0, w8 1119; NONEON-NOSVE-NEXT: ldp w8, w9, [sp, #48] 1120; NONEON-NOSVE-NEXT: ldp q3, q2, [sp, #64] 1121; NONEON-NOSVE-NEXT: stp d0, d1, [sp, #112] 1122; NONEON-NOSVE-NEXT: ucvtf d1, w9 1123; NONEON-NOSVE-NEXT: ucvtf d0, w8 1124; NONEON-NOSVE-NEXT: stp d0, d1, [sp, #96] 1125; NONEON-NOSVE-NEXT: ldp q0, q1, [sp, #96] 1126; NONEON-NOSVE-NEXT: stp q2, q3, [x1] 1127; NONEON-NOSVE-NEXT: stp q1, q0, [x1, #32] 1128; NONEON-NOSVE-NEXT: add sp, sp, #128 1129; NONEON-NOSVE-NEXT: ret 1130 %op1 = load <8 x i32>, ptr %a 1131 %res = uitofp <8 x i32> %op1 to <8 x double> 1132 store <8 x double> %res, ptr %b 1133 ret void 1134} 1135 1136; 1137; UCVTF D -> H 1138; 1139 1140define <2 x half> @ucvtf_v2i64_v2f16(<2 x i64> %op1) { 1141; CHECK-LABEL: ucvtf_v2i64_v2f16: 1142; CHECK: // %bb.0: 1143; CHECK-NEXT: // kill: def $q0 killed $q0 def $z0 1144; CHECK-NEXT: mov z1.d, z0.d[1] 1145; CHECK-NEXT: ptrue p0.d 1146; CHECK-NEXT: ucvtf z0.h, p0/m, z0.d 1147; CHECK-NEXT: ucvtf z1.h, p0/m, z1.d 1148; CHECK-NEXT: zip1 z0.h, z0.h, z1.h 1149; CHECK-NEXT: // kill: def $d0 killed $d0 killed $z0 1150; CHECK-NEXT: ret 1151; 1152; NONEON-NOSVE-LABEL: ucvtf_v2i64_v2f16: 1153; NONEON-NOSVE: // %bb.0: 1154; NONEON-NOSVE-NEXT: str q0, [sp, #-32]! 1155; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 32 1156; NONEON-NOSVE-NEXT: ldp x8, x9, [sp] 1157; NONEON-NOSVE-NEXT: ucvtf s0, x9 1158; NONEON-NOSVE-NEXT: fcvt h0, s0 1159; NONEON-NOSVE-NEXT: str h0, [sp, #26] 1160; NONEON-NOSVE-NEXT: ucvtf s0, x8 1161; NONEON-NOSVE-NEXT: fcvt h0, s0 1162; NONEON-NOSVE-NEXT: str h0, [sp, #24] 1163; NONEON-NOSVE-NEXT: ldr d0, [sp, #24] 1164; NONEON-NOSVE-NEXT: add sp, sp, #32 1165; NONEON-NOSVE-NEXT: ret 1166 %res = uitofp <2 x i64> %op1 to <2 x half> 1167 ret <2 x half> %res 1168} 1169 1170define <4 x half> @ucvtf_v4i64_v4f16(ptr %a) { 1171; CHECK-LABEL: ucvtf_v4i64_v4f16: 1172; CHECK: // %bb.0: 1173; CHECK-NEXT: ldp q0, q1, [x0] 1174; CHECK-NEXT: ptrue p0.d, vl2 1175; CHECK-NEXT: ucvtf z1.s, p0/m, z1.d 1176; CHECK-NEXT: ucvtf z0.s, p0/m, z0.d 1177; CHECK-NEXT: ptrue p0.s, vl2 1178; CHECK-NEXT: uzp1 z1.s, z1.s, z1.s 1179; CHECK-NEXT: uzp1 z0.s, z0.s, z0.s 1180; CHECK-NEXT: splice z0.s, p0, z0.s, z1.s 1181; CHECK-NEXT: ptrue p0.s 1182; CHECK-NEXT: fcvt z0.h, p0/m, z0.s 1183; CHECK-NEXT: uzp1 z0.h, z0.h, z0.h 1184; CHECK-NEXT: // kill: def $d0 killed $d0 killed $z0 1185; CHECK-NEXT: ret 1186; 1187; NONEON-NOSVE-LABEL: ucvtf_v4i64_v4f16: 1188; NONEON-NOSVE: // %bb.0: 1189; NONEON-NOSVE-NEXT: ldp q1, q0, [x0] 1190; NONEON-NOSVE-NEXT: stp q1, q0, [sp, #-48]! 1191; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 48 1192; NONEON-NOSVE-NEXT: ldp x8, x9, [sp, #16] 1193; NONEON-NOSVE-NEXT: ucvtf s0, x9 1194; NONEON-NOSVE-NEXT: fcvt h0, s0 1195; NONEON-NOSVE-NEXT: str h0, [sp, #46] 1196; NONEON-NOSVE-NEXT: ucvtf s0, x8 1197; NONEON-NOSVE-NEXT: ldp x8, x9, [sp] 1198; NONEON-NOSVE-NEXT: fcvt h0, s0 1199; NONEON-NOSVE-NEXT: str h0, [sp, #44] 1200; NONEON-NOSVE-NEXT: ucvtf s0, x9 1201; NONEON-NOSVE-NEXT: fcvt h0, s0 1202; NONEON-NOSVE-NEXT: str h0, [sp, #42] 1203; NONEON-NOSVE-NEXT: ucvtf s0, x8 1204; NONEON-NOSVE-NEXT: fcvt h0, s0 1205; NONEON-NOSVE-NEXT: str h0, [sp, #40] 1206; NONEON-NOSVE-NEXT: ldr d0, [sp, #40] 1207; NONEON-NOSVE-NEXT: add sp, sp, #48 1208; NONEON-NOSVE-NEXT: ret 1209 %op1 = load <4 x i64>, ptr %a 1210 %res = uitofp <4 x i64> %op1 to <4 x half> 1211 ret <4 x half> %res 1212} 1213 1214define <8 x half> @ucvtf_v8i64_v8f16(ptr %a) { 1215; CHECK-LABEL: ucvtf_v8i64_v8f16: 1216; CHECK: // %bb.0: 1217; CHECK-NEXT: ldp q1, q0, [x0, #32] 1218; CHECK-NEXT: ptrue p0.d, vl2 1219; CHECK-NEXT: ldp q2, q3, [x0] 1220; CHECK-NEXT: ucvtf z0.s, p0/m, z0.d 1221; CHECK-NEXT: ucvtf z1.s, p0/m, z1.d 1222; CHECK-NEXT: ucvtf z3.s, p0/m, z3.d 1223; CHECK-NEXT: ucvtf z2.s, p0/m, z2.d 1224; CHECK-NEXT: ptrue p0.s, vl2 1225; CHECK-NEXT: uzp1 z0.s, z0.s, z0.s 1226; CHECK-NEXT: uzp1 z1.s, z1.s, z1.s 1227; CHECK-NEXT: uzp1 z3.s, z3.s, z3.s 1228; CHECK-NEXT: uzp1 z2.s, z2.s, z2.s 1229; CHECK-NEXT: splice z1.s, p0, z1.s, z0.s 1230; CHECK-NEXT: splice z2.s, p0, z2.s, z3.s 1231; CHECK-NEXT: ptrue p0.s 1232; CHECK-NEXT: movprfx z0, z1 1233; CHECK-NEXT: fcvt z0.h, p0/m, z1.s 1234; CHECK-NEXT: movprfx z1, z2 1235; CHECK-NEXT: fcvt z1.h, p0/m, z2.s 1236; CHECK-NEXT: ptrue p0.h, vl4 1237; CHECK-NEXT: uzp1 z2.h, z0.h, z0.h 1238; CHECK-NEXT: uzp1 z0.h, z1.h, z1.h 1239; CHECK-NEXT: splice z0.h, p0, z0.h, z2.h 1240; CHECK-NEXT: // kill: def $q0 killed $q0 killed $z0 1241; CHECK-NEXT: ret 1242; 1243; NONEON-NOSVE-LABEL: ucvtf_v8i64_v8f16: 1244; NONEON-NOSVE: // %bb.0: 1245; NONEON-NOSVE-NEXT: sub sp, sp, #80 1246; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 80 1247; NONEON-NOSVE-NEXT: ldp q1, q0, [x0, #32] 1248; NONEON-NOSVE-NEXT: ldp q2, q3, [x0] 1249; NONEON-NOSVE-NEXT: str q1, [sp, #48] 1250; NONEON-NOSVE-NEXT: stp q0, q3, [sp, #16] 1251; NONEON-NOSVE-NEXT: ldp x8, x9, [sp, #16] 1252; NONEON-NOSVE-NEXT: str q2, [sp] 1253; NONEON-NOSVE-NEXT: ucvtf s0, x9 1254; NONEON-NOSVE-NEXT: fcvt h0, s0 1255; NONEON-NOSVE-NEXT: str h0, [sp, #78] 1256; NONEON-NOSVE-NEXT: ucvtf s0, x8 1257; NONEON-NOSVE-NEXT: ldp x8, x9, [sp, #48] 1258; NONEON-NOSVE-NEXT: fcvt h0, s0 1259; NONEON-NOSVE-NEXT: str h0, [sp, #76] 1260; NONEON-NOSVE-NEXT: ucvtf s0, x9 1261; NONEON-NOSVE-NEXT: fcvt h0, s0 1262; NONEON-NOSVE-NEXT: str h0, [sp, #74] 1263; NONEON-NOSVE-NEXT: ucvtf s0, x8 1264; NONEON-NOSVE-NEXT: ldp x8, x9, [sp, #32] 1265; NONEON-NOSVE-NEXT: fcvt h0, s0 1266; NONEON-NOSVE-NEXT: str h0, [sp, #72] 1267; NONEON-NOSVE-NEXT: ucvtf s0, x9 1268; NONEON-NOSVE-NEXT: fcvt h0, s0 1269; NONEON-NOSVE-NEXT: str h0, [sp, #70] 1270; NONEON-NOSVE-NEXT: ucvtf s0, x8 1271; NONEON-NOSVE-NEXT: ldp x8, x9, [sp] 1272; NONEON-NOSVE-NEXT: fcvt h0, s0 1273; NONEON-NOSVE-NEXT: str h0, [sp, #68] 1274; NONEON-NOSVE-NEXT: ucvtf s0, x9 1275; NONEON-NOSVE-NEXT: fcvt h0, s0 1276; NONEON-NOSVE-NEXT: str h0, [sp, #66] 1277; NONEON-NOSVE-NEXT: ucvtf s0, x8 1278; NONEON-NOSVE-NEXT: fcvt h0, s0 1279; NONEON-NOSVE-NEXT: str h0, [sp, #64] 1280; NONEON-NOSVE-NEXT: ldr q0, [sp, #64] 1281; NONEON-NOSVE-NEXT: add sp, sp, #80 1282; NONEON-NOSVE-NEXT: ret 1283 %op1 = load <8 x i64>, ptr %a 1284 %res = uitofp <8 x i64> %op1 to <8 x half> 1285 ret <8 x half> %res 1286} 1287 1288; 1289; UCVTF D -> S 1290; 1291 1292define <2 x float> @ucvtf_v2i64_v2f32(<2 x i64> %op1) { 1293; CHECK-LABEL: ucvtf_v2i64_v2f32: 1294; CHECK: // %bb.0: 1295; CHECK-NEXT: ptrue p0.d, vl2 1296; CHECK-NEXT: // kill: def $q0 killed $q0 def $z0 1297; CHECK-NEXT: ucvtf z0.s, p0/m, z0.d 1298; CHECK-NEXT: uzp1 z0.s, z0.s, z0.s 1299; CHECK-NEXT: // kill: def $d0 killed $d0 killed $z0 1300; CHECK-NEXT: ret 1301; 1302; NONEON-NOSVE-LABEL: ucvtf_v2i64_v2f32: 1303; NONEON-NOSVE: // %bb.0: 1304; NONEON-NOSVE-NEXT: str q0, [sp, #-32]! 1305; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 32 1306; NONEON-NOSVE-NEXT: ldp x8, x9, [sp] 1307; NONEON-NOSVE-NEXT: ucvtf s1, x9 1308; NONEON-NOSVE-NEXT: ucvtf s0, x8 1309; NONEON-NOSVE-NEXT: stp s0, s1, [sp, #24] 1310; NONEON-NOSVE-NEXT: ldr d0, [sp, #24] 1311; NONEON-NOSVE-NEXT: add sp, sp, #32 1312; NONEON-NOSVE-NEXT: ret 1313 %res = uitofp <2 x i64> %op1 to <2 x float> 1314 ret <2 x float> %res 1315} 1316 1317define <4 x float> @ucvtf_v4i64_v4f32(ptr %a) { 1318; CHECK-LABEL: ucvtf_v4i64_v4f32: 1319; CHECK: // %bb.0: 1320; CHECK-NEXT: ldp q0, q1, [x0] 1321; CHECK-NEXT: ptrue p0.d, vl2 1322; CHECK-NEXT: ucvtf z1.s, p0/m, z1.d 1323; CHECK-NEXT: ucvtf z0.s, p0/m, z0.d 1324; CHECK-NEXT: ptrue p0.s, vl2 1325; CHECK-NEXT: uzp1 z1.s, z1.s, z1.s 1326; CHECK-NEXT: uzp1 z0.s, z0.s, z0.s 1327; CHECK-NEXT: splice z0.s, p0, z0.s, z1.s 1328; CHECK-NEXT: // kill: def $q0 killed $q0 killed $z0 1329; CHECK-NEXT: ret 1330; 1331; NONEON-NOSVE-LABEL: ucvtf_v4i64_v4f32: 1332; NONEON-NOSVE: // %bb.0: 1333; NONEON-NOSVE-NEXT: ldp q1, q0, [x0] 1334; NONEON-NOSVE-NEXT: stp q1, q0, [sp, #-48]! 1335; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 48 1336; NONEON-NOSVE-NEXT: ldp x8, x9, [sp, #16] 1337; NONEON-NOSVE-NEXT: ucvtf s1, x9 1338; NONEON-NOSVE-NEXT: ucvtf s0, x8 1339; NONEON-NOSVE-NEXT: ldp x8, x9, [sp] 1340; NONEON-NOSVE-NEXT: stp s0, s1, [sp, #40] 1341; NONEON-NOSVE-NEXT: ucvtf s1, x9 1342; NONEON-NOSVE-NEXT: ucvtf s0, x8 1343; NONEON-NOSVE-NEXT: stp s0, s1, [sp, #32] 1344; NONEON-NOSVE-NEXT: ldr q0, [sp, #32] 1345; NONEON-NOSVE-NEXT: add sp, sp, #48 1346; NONEON-NOSVE-NEXT: ret 1347 %op1 = load <4 x i64>, ptr %a 1348 %res = uitofp <4 x i64> %op1 to <4 x float> 1349 ret <4 x float> %res 1350} 1351 1352define void @ucvtf_v8i64_v8f32(ptr %a, ptr %b) { 1353; CHECK-LABEL: ucvtf_v8i64_v8f32: 1354; CHECK: // %bb.0: 1355; CHECK-NEXT: ldp q0, q1, [x0, #32] 1356; CHECK-NEXT: ptrue p0.d, vl2 1357; CHECK-NEXT: ldp q2, q3, [x0] 1358; CHECK-NEXT: ucvtf z1.s, p0/m, z1.d 1359; CHECK-NEXT: ucvtf z0.s, p0/m, z0.d 1360; CHECK-NEXT: ucvtf z3.s, p0/m, z3.d 1361; CHECK-NEXT: ucvtf z2.s, p0/m, z2.d 1362; CHECK-NEXT: ptrue p0.s, vl2 1363; CHECK-NEXT: uzp1 z1.s, z1.s, z1.s 1364; CHECK-NEXT: uzp1 z0.s, z0.s, z0.s 1365; CHECK-NEXT: uzp1 z3.s, z3.s, z3.s 1366; CHECK-NEXT: uzp1 z2.s, z2.s, z2.s 1367; CHECK-NEXT: splice z0.s, p0, z0.s, z1.s 1368; CHECK-NEXT: splice z2.s, p0, z2.s, z3.s 1369; CHECK-NEXT: stp q2, q0, [x1] 1370; CHECK-NEXT: ret 1371; 1372; NONEON-NOSVE-LABEL: ucvtf_v8i64_v8f32: 1373; NONEON-NOSVE: // %bb.0: 1374; NONEON-NOSVE-NEXT: sub sp, sp, #96 1375; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 96 1376; NONEON-NOSVE-NEXT: ldp q1, q0, [x0] 1377; NONEON-NOSVE-NEXT: ldp q2, q3, [x0, #32] 1378; NONEON-NOSVE-NEXT: str q1, [sp] 1379; NONEON-NOSVE-NEXT: stp q3, q0, [sp, #16] 1380; NONEON-NOSVE-NEXT: ldp x8, x9, [sp, #32] 1381; NONEON-NOSVE-NEXT: str q2, [sp, #48] 1382; NONEON-NOSVE-NEXT: ucvtf s1, x9 1383; NONEON-NOSVE-NEXT: ucvtf s0, x8 1384; NONEON-NOSVE-NEXT: ldp x8, x9, [sp] 1385; NONEON-NOSVE-NEXT: stp s0, s1, [sp, #72] 1386; NONEON-NOSVE-NEXT: ucvtf s1, x9 1387; NONEON-NOSVE-NEXT: ucvtf s0, x8 1388; NONEON-NOSVE-NEXT: ldp x8, x9, [sp, #16] 1389; NONEON-NOSVE-NEXT: stp s0, s1, [sp, #64] 1390; NONEON-NOSVE-NEXT: ucvtf s1, x9 1391; NONEON-NOSVE-NEXT: ucvtf s0, x8 1392; NONEON-NOSVE-NEXT: ldp x8, x9, [sp, #48] 1393; NONEON-NOSVE-NEXT: stp s0, s1, [sp, #88] 1394; NONEON-NOSVE-NEXT: ucvtf s1, x9 1395; NONEON-NOSVE-NEXT: ucvtf s0, x8 1396; NONEON-NOSVE-NEXT: stp s0, s1, [sp, #80] 1397; NONEON-NOSVE-NEXT: ldp q1, q0, [sp, #64] 1398; NONEON-NOSVE-NEXT: stp q1, q0, [x1] 1399; NONEON-NOSVE-NEXT: add sp, sp, #96 1400; NONEON-NOSVE-NEXT: ret 1401 %op1 = load <8 x i64>, ptr %a 1402 %res = uitofp <8 x i64> %op1 to <8 x float> 1403 store <8 x float> %res, ptr %b 1404 ret void 1405} 1406 1407; 1408; UCVTF D -> D 1409; 1410 1411define <2 x double> @ucvtf_v2i64_v2f64(<2 x i64> %op1) { 1412; CHECK-LABEL: ucvtf_v2i64_v2f64: 1413; CHECK: // %bb.0: 1414; CHECK-NEXT: ptrue p0.d, vl2 1415; CHECK-NEXT: // kill: def $q0 killed $q0 def $z0 1416; CHECK-NEXT: ucvtf z0.d, p0/m, z0.d 1417; CHECK-NEXT: // kill: def $q0 killed $q0 killed $z0 1418; CHECK-NEXT: ret 1419; 1420; NONEON-NOSVE-LABEL: ucvtf_v2i64_v2f64: 1421; NONEON-NOSVE: // %bb.0: 1422; NONEON-NOSVE-NEXT: str q0, [sp, #-32]! 1423; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 32 1424; NONEON-NOSVE-NEXT: ldp x8, x9, [sp] 1425; NONEON-NOSVE-NEXT: ucvtf d1, x9 1426; NONEON-NOSVE-NEXT: ucvtf d0, x8 1427; NONEON-NOSVE-NEXT: stp d0, d1, [sp, #16] 1428; NONEON-NOSVE-NEXT: ldr q0, [sp, #16] 1429; NONEON-NOSVE-NEXT: add sp, sp, #32 1430; NONEON-NOSVE-NEXT: ret 1431 %res = uitofp <2 x i64> %op1 to <2 x double> 1432 ret <2 x double> %res 1433} 1434 1435define void @ucvtf_v4i64_v4f64(ptr %a, ptr %b) { 1436; CHECK-LABEL: ucvtf_v4i64_v4f64: 1437; CHECK: // %bb.0: 1438; CHECK-NEXT: ldp q0, q1, [x0] 1439; CHECK-NEXT: ptrue p0.d, vl2 1440; CHECK-NEXT: ucvtf z0.d, p0/m, z0.d 1441; CHECK-NEXT: ucvtf z1.d, p0/m, z1.d 1442; CHECK-NEXT: stp q0, q1, [x1] 1443; CHECK-NEXT: ret 1444; 1445; NONEON-NOSVE-LABEL: ucvtf_v4i64_v4f64: 1446; NONEON-NOSVE: // %bb.0: 1447; NONEON-NOSVE-NEXT: ldp q1, q0, [x0] 1448; NONEON-NOSVE-NEXT: stp q1, q0, [sp, #-64]! 1449; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 64 1450; NONEON-NOSVE-NEXT: ldp x8, x9, [sp, #16] 1451; NONEON-NOSVE-NEXT: ucvtf d1, x9 1452; NONEON-NOSVE-NEXT: ucvtf d0, x8 1453; NONEON-NOSVE-NEXT: ldp x8, x9, [sp] 1454; NONEON-NOSVE-NEXT: stp d0, d1, [sp, #48] 1455; NONEON-NOSVE-NEXT: ucvtf d1, x9 1456; NONEON-NOSVE-NEXT: ucvtf d0, x8 1457; NONEON-NOSVE-NEXT: stp d0, d1, [sp, #32] 1458; NONEON-NOSVE-NEXT: ldp q0, q1, [sp, #32] 1459; NONEON-NOSVE-NEXT: stp q0, q1, [x1] 1460; NONEON-NOSVE-NEXT: add sp, sp, #64 1461; NONEON-NOSVE-NEXT: ret 1462 %op1 = load <4 x i64>, ptr %a 1463 %res = uitofp <4 x i64> %op1 to <4 x double> 1464 store <4 x double> %res, ptr %b 1465 ret void 1466} 1467 1468; 1469; SCVTF H -> H 1470; 1471 1472define <4 x half> @scvtf_v4i16_v4f16(<4 x i16> %op1) { 1473; CHECK-LABEL: scvtf_v4i16_v4f16: 1474; CHECK: // %bb.0: 1475; CHECK-NEXT: ptrue p0.h, vl4 1476; CHECK-NEXT: // kill: def $d0 killed $d0 def $z0 1477; CHECK-NEXT: scvtf z0.h, p0/m, z0.h 1478; CHECK-NEXT: // kill: def $d0 killed $d0 killed $z0 1479; CHECK-NEXT: ret 1480; 1481; NONEON-NOSVE-LABEL: scvtf_v4i16_v4f16: 1482; NONEON-NOSVE: // %bb.0: 1483; NONEON-NOSVE-NEXT: str d0, [sp, #-16]! 1484; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 16 1485; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #6] 1486; NONEON-NOSVE-NEXT: scvtf s0, w8 1487; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #4] 1488; NONEON-NOSVE-NEXT: fcvt h0, s0 1489; NONEON-NOSVE-NEXT: str h0, [sp, #14] 1490; NONEON-NOSVE-NEXT: scvtf s0, w8 1491; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #2] 1492; NONEON-NOSVE-NEXT: fcvt h0, s0 1493; NONEON-NOSVE-NEXT: str h0, [sp, #12] 1494; NONEON-NOSVE-NEXT: scvtf s0, w8 1495; NONEON-NOSVE-NEXT: ldrsh w8, [sp] 1496; NONEON-NOSVE-NEXT: fcvt h0, s0 1497; NONEON-NOSVE-NEXT: str h0, [sp, #10] 1498; NONEON-NOSVE-NEXT: scvtf s0, w8 1499; NONEON-NOSVE-NEXT: fcvt h0, s0 1500; NONEON-NOSVE-NEXT: str h0, [sp, #8] 1501; NONEON-NOSVE-NEXT: ldr d0, [sp, #8] 1502; NONEON-NOSVE-NEXT: add sp, sp, #16 1503; NONEON-NOSVE-NEXT: ret 1504 %res = sitofp <4 x i16> %op1 to <4 x half> 1505 ret <4 x half> %res 1506} 1507 1508define void @scvtf_v8i16_v8f16(ptr %a, ptr %b) { 1509; CHECK-LABEL: scvtf_v8i16_v8f16: 1510; CHECK: // %bb.0: 1511; CHECK-NEXT: ptrue p0.h, vl8 1512; CHECK-NEXT: ldr q0, [x0] 1513; CHECK-NEXT: scvtf z0.h, p0/m, z0.h 1514; CHECK-NEXT: str q0, [x1] 1515; CHECK-NEXT: ret 1516; 1517; NONEON-NOSVE-LABEL: scvtf_v8i16_v8f16: 1518; NONEON-NOSVE: // %bb.0: 1519; NONEON-NOSVE-NEXT: ldr q0, [x0] 1520; NONEON-NOSVE-NEXT: str q0, [sp, #-32]! 1521; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 32 1522; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #14] 1523; NONEON-NOSVE-NEXT: scvtf s0, w8 1524; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #12] 1525; NONEON-NOSVE-NEXT: fcvt h0, s0 1526; NONEON-NOSVE-NEXT: str h0, [sp, #30] 1527; NONEON-NOSVE-NEXT: scvtf s0, w8 1528; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #10] 1529; NONEON-NOSVE-NEXT: fcvt h0, s0 1530; NONEON-NOSVE-NEXT: str h0, [sp, #28] 1531; NONEON-NOSVE-NEXT: scvtf s0, w8 1532; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #8] 1533; NONEON-NOSVE-NEXT: fcvt h0, s0 1534; NONEON-NOSVE-NEXT: str h0, [sp, #26] 1535; NONEON-NOSVE-NEXT: scvtf s0, w8 1536; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #6] 1537; NONEON-NOSVE-NEXT: fcvt h0, s0 1538; NONEON-NOSVE-NEXT: str h0, [sp, #24] 1539; NONEON-NOSVE-NEXT: scvtf s0, w8 1540; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #4] 1541; NONEON-NOSVE-NEXT: fcvt h0, s0 1542; NONEON-NOSVE-NEXT: str h0, [sp, #22] 1543; NONEON-NOSVE-NEXT: scvtf s0, w8 1544; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #2] 1545; NONEON-NOSVE-NEXT: fcvt h0, s0 1546; NONEON-NOSVE-NEXT: str h0, [sp, #20] 1547; NONEON-NOSVE-NEXT: scvtf s0, w8 1548; NONEON-NOSVE-NEXT: ldrsh w8, [sp] 1549; NONEON-NOSVE-NEXT: fcvt h0, s0 1550; NONEON-NOSVE-NEXT: str h0, [sp, #18] 1551; NONEON-NOSVE-NEXT: scvtf s0, w8 1552; NONEON-NOSVE-NEXT: fcvt h0, s0 1553; NONEON-NOSVE-NEXT: str h0, [sp, #16] 1554; NONEON-NOSVE-NEXT: ldr q0, [sp, #16] 1555; NONEON-NOSVE-NEXT: str q0, [x1] 1556; NONEON-NOSVE-NEXT: add sp, sp, #32 1557; NONEON-NOSVE-NEXT: ret 1558 %op1 = load <8 x i16>, ptr %a 1559 %res = sitofp <8 x i16> %op1 to <8 x half> 1560 store <8 x half> %res, ptr %b 1561 ret void 1562} 1563 1564define void @scvtf_v16i16_v16f16(ptr %a, ptr %b) { 1565; CHECK-LABEL: scvtf_v16i16_v16f16: 1566; CHECK: // %bb.0: 1567; CHECK-NEXT: ldp q0, q1, [x0] 1568; CHECK-NEXT: ptrue p0.h, vl8 1569; CHECK-NEXT: scvtf z0.h, p0/m, z0.h 1570; CHECK-NEXT: scvtf z1.h, p0/m, z1.h 1571; CHECK-NEXT: stp q0, q1, [x1] 1572; CHECK-NEXT: ret 1573; 1574; NONEON-NOSVE-LABEL: scvtf_v16i16_v16f16: 1575; NONEON-NOSVE: // %bb.0: 1576; NONEON-NOSVE-NEXT: ldp q1, q0, [x0] 1577; NONEON-NOSVE-NEXT: stp q1, q0, [sp, #-64]! 1578; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 64 1579; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #30] 1580; NONEON-NOSVE-NEXT: scvtf s0, w8 1581; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #28] 1582; NONEON-NOSVE-NEXT: fcvt h0, s0 1583; NONEON-NOSVE-NEXT: str h0, [sp, #62] 1584; NONEON-NOSVE-NEXT: scvtf s0, w8 1585; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #26] 1586; NONEON-NOSVE-NEXT: fcvt h0, s0 1587; NONEON-NOSVE-NEXT: str h0, [sp, #60] 1588; NONEON-NOSVE-NEXT: scvtf s0, w8 1589; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #24] 1590; NONEON-NOSVE-NEXT: fcvt h0, s0 1591; NONEON-NOSVE-NEXT: str h0, [sp, #58] 1592; NONEON-NOSVE-NEXT: scvtf s0, w8 1593; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #22] 1594; NONEON-NOSVE-NEXT: fcvt h0, s0 1595; NONEON-NOSVE-NEXT: str h0, [sp, #56] 1596; NONEON-NOSVE-NEXT: scvtf s0, w8 1597; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #20] 1598; NONEON-NOSVE-NEXT: fcvt h0, s0 1599; NONEON-NOSVE-NEXT: str h0, [sp, #54] 1600; NONEON-NOSVE-NEXT: scvtf s0, w8 1601; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #18] 1602; NONEON-NOSVE-NEXT: fcvt h0, s0 1603; NONEON-NOSVE-NEXT: str h0, [sp, #52] 1604; NONEON-NOSVE-NEXT: scvtf s0, w8 1605; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #16] 1606; NONEON-NOSVE-NEXT: fcvt h0, s0 1607; NONEON-NOSVE-NEXT: str h0, [sp, #50] 1608; NONEON-NOSVE-NEXT: scvtf s0, w8 1609; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #14] 1610; NONEON-NOSVE-NEXT: fcvt h0, s0 1611; NONEON-NOSVE-NEXT: str h0, [sp, #48] 1612; NONEON-NOSVE-NEXT: scvtf s0, w8 1613; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #12] 1614; NONEON-NOSVE-NEXT: fcvt h0, s0 1615; NONEON-NOSVE-NEXT: str h0, [sp, #46] 1616; NONEON-NOSVE-NEXT: scvtf s0, w8 1617; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #10] 1618; NONEON-NOSVE-NEXT: fcvt h0, s0 1619; NONEON-NOSVE-NEXT: str h0, [sp, #44] 1620; NONEON-NOSVE-NEXT: scvtf s0, w8 1621; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #8] 1622; NONEON-NOSVE-NEXT: fcvt h0, s0 1623; NONEON-NOSVE-NEXT: str h0, [sp, #42] 1624; NONEON-NOSVE-NEXT: scvtf s0, w8 1625; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #6] 1626; NONEON-NOSVE-NEXT: fcvt h0, s0 1627; NONEON-NOSVE-NEXT: str h0, [sp, #40] 1628; NONEON-NOSVE-NEXT: scvtf s0, w8 1629; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #4] 1630; NONEON-NOSVE-NEXT: fcvt h0, s0 1631; NONEON-NOSVE-NEXT: str h0, [sp, #38] 1632; NONEON-NOSVE-NEXT: scvtf s0, w8 1633; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #2] 1634; NONEON-NOSVE-NEXT: fcvt h0, s0 1635; NONEON-NOSVE-NEXT: str h0, [sp, #36] 1636; NONEON-NOSVE-NEXT: scvtf s0, w8 1637; NONEON-NOSVE-NEXT: ldrsh w8, [sp] 1638; NONEON-NOSVE-NEXT: fcvt h0, s0 1639; NONEON-NOSVE-NEXT: str h0, [sp, #34] 1640; NONEON-NOSVE-NEXT: scvtf s0, w8 1641; NONEON-NOSVE-NEXT: fcvt h0, s0 1642; NONEON-NOSVE-NEXT: str h0, [sp, #32] 1643; NONEON-NOSVE-NEXT: ldp q0, q1, [sp, #32] 1644; NONEON-NOSVE-NEXT: stp q0, q1, [x1] 1645; NONEON-NOSVE-NEXT: add sp, sp, #64 1646; NONEON-NOSVE-NEXT: ret 1647 %op1 = load <16 x i16>, ptr %a 1648 %res = sitofp <16 x i16> %op1 to <16 x half> 1649 store <16 x half> %res, ptr %b 1650 ret void 1651} 1652 1653; SCVTF H -> S 1654; 1655 1656define <2 x float> @scvtf_v2i16_v2f32(<2 x i16> %op1) { 1657; CHECK-LABEL: scvtf_v2i16_v2f32: 1658; CHECK: // %bb.0: 1659; CHECK-NEXT: ptrue p0.s, vl2 1660; CHECK-NEXT: // kill: def $d0 killed $d0 def $z0 1661; CHECK-NEXT: sxth z0.s, p0/m, z0.s 1662; CHECK-NEXT: scvtf z0.s, p0/m, z0.s 1663; CHECK-NEXT: // kill: def $d0 killed $d0 killed $z0 1664; CHECK-NEXT: ret 1665; 1666; NONEON-NOSVE-LABEL: scvtf_v2i16_v2f32: 1667; NONEON-NOSVE: // %bb.0: 1668; NONEON-NOSVE-NEXT: str d0, [sp, #-16]! 1669; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 16 1670; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #4] 1671; NONEON-NOSVE-NEXT: ldrsh w9, [sp] 1672; NONEON-NOSVE-NEXT: scvtf s0, w8 1673; NONEON-NOSVE-NEXT: scvtf s1, w9 1674; NONEON-NOSVE-NEXT: stp s1, s0, [sp, #8] 1675; NONEON-NOSVE-NEXT: ldr d0, [sp, #8] 1676; NONEON-NOSVE-NEXT: add sp, sp, #16 1677; NONEON-NOSVE-NEXT: ret 1678 %res = sitofp <2 x i16> %op1 to <2 x float> 1679 ret <2 x float> %res 1680} 1681 1682define <4 x float> @scvtf_v4i16_v4f32(<4 x i16> %op1) { 1683; CHECK-LABEL: scvtf_v4i16_v4f32: 1684; CHECK: // %bb.0: 1685; CHECK-NEXT: // kill: def $d0 killed $d0 def $z0 1686; CHECK-NEXT: ptrue p0.s, vl4 1687; CHECK-NEXT: sunpklo z0.s, z0.h 1688; CHECK-NEXT: scvtf z0.s, p0/m, z0.s 1689; CHECK-NEXT: // kill: def $q0 killed $q0 killed $z0 1690; CHECK-NEXT: ret 1691; 1692; NONEON-NOSVE-LABEL: scvtf_v4i16_v4f32: 1693; NONEON-NOSVE: // %bb.0: 1694; NONEON-NOSVE-NEXT: sub sp, sp, #32 1695; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 32 1696; NONEON-NOSVE-NEXT: str d0, [sp, #8] 1697; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #14] 1698; NONEON-NOSVE-NEXT: scvtf s1, w8 1699; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #12] 1700; NONEON-NOSVE-NEXT: scvtf s0, w8 1701; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #10] 1702; NONEON-NOSVE-NEXT: stp s0, s1, [sp, #24] 1703; NONEON-NOSVE-NEXT: scvtf s1, w8 1704; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #8] 1705; NONEON-NOSVE-NEXT: scvtf s0, w8 1706; NONEON-NOSVE-NEXT: stp s0, s1, [sp, #16] 1707; NONEON-NOSVE-NEXT: ldr q0, [sp, #16] 1708; NONEON-NOSVE-NEXT: add sp, sp, #32 1709; NONEON-NOSVE-NEXT: ret 1710 %res = sitofp <4 x i16> %op1 to <4 x float> 1711 ret <4 x float> %res 1712} 1713 1714define void @scvtf_v8i16_v8f32(ptr %a, ptr %b) { 1715; CHECK-LABEL: scvtf_v8i16_v8f32: 1716; CHECK: // %bb.0: 1717; CHECK-NEXT: ldr q0, [x0] 1718; CHECK-NEXT: ptrue p0.s, vl4 1719; CHECK-NEXT: sunpklo z1.s, z0.h 1720; CHECK-NEXT: ext z0.b, z0.b, z0.b, #8 1721; CHECK-NEXT: sunpklo z0.s, z0.h 1722; CHECK-NEXT: scvtf z1.s, p0/m, z1.s 1723; CHECK-NEXT: scvtf z0.s, p0/m, z0.s 1724; CHECK-NEXT: stp q1, q0, [x1] 1725; CHECK-NEXT: ret 1726; 1727; NONEON-NOSVE-LABEL: scvtf_v8i16_v8f32: 1728; NONEON-NOSVE: // %bb.0: 1729; NONEON-NOSVE-NEXT: ldr q0, [x0] 1730; NONEON-NOSVE-NEXT: str q0, [sp, #-64]! 1731; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 64 1732; NONEON-NOSVE-NEXT: ldp d1, d0, [sp] 1733; NONEON-NOSVE-NEXT: stp d0, d1, [sp, #16] 1734; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #30] 1735; NONEON-NOSVE-NEXT: scvtf s1, w8 1736; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #28] 1737; NONEON-NOSVE-NEXT: scvtf s0, w8 1738; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #26] 1739; NONEON-NOSVE-NEXT: stp s0, s1, [sp, #56] 1740; NONEON-NOSVE-NEXT: scvtf s1, w8 1741; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #24] 1742; NONEON-NOSVE-NEXT: scvtf s0, w8 1743; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #22] 1744; NONEON-NOSVE-NEXT: stp s0, s1, [sp, #48] 1745; NONEON-NOSVE-NEXT: scvtf s1, w8 1746; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #20] 1747; NONEON-NOSVE-NEXT: scvtf s0, w8 1748; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #18] 1749; NONEON-NOSVE-NEXT: stp s0, s1, [sp, #40] 1750; NONEON-NOSVE-NEXT: scvtf s1, w8 1751; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #16] 1752; NONEON-NOSVE-NEXT: scvtf s0, w8 1753; NONEON-NOSVE-NEXT: stp s0, s1, [sp, #32] 1754; NONEON-NOSVE-NEXT: ldp q0, q1, [sp, #32] 1755; NONEON-NOSVE-NEXT: stp q1, q0, [x1] 1756; NONEON-NOSVE-NEXT: add sp, sp, #64 1757; NONEON-NOSVE-NEXT: ret 1758 %op1 = load <8 x i16>, ptr %a 1759 %res = sitofp <8 x i16> %op1 to <8 x float> 1760 store <8 x float> %res, ptr %b 1761 ret void 1762} 1763 1764define void @scvtf_v16i16_v16f32(ptr %a, ptr %b) { 1765; CHECK-LABEL: scvtf_v16i16_v16f32: 1766; CHECK: // %bb.0: 1767; CHECK-NEXT: ldp q1, q0, [x0] 1768; CHECK-NEXT: ptrue p0.s, vl4 1769; CHECK-NEXT: sunpklo z2.s, z0.h 1770; CHECK-NEXT: ext z0.b, z0.b, z0.b, #8 1771; CHECK-NEXT: sunpklo z3.s, z1.h 1772; CHECK-NEXT: ext z1.b, z1.b, z1.b, #8 1773; CHECK-NEXT: sunpklo z0.s, z0.h 1774; CHECK-NEXT: sunpklo z1.s, z1.h 1775; CHECK-NEXT: scvtf z2.s, p0/m, z2.s 1776; CHECK-NEXT: scvtf z3.s, p0/m, z3.s 1777; CHECK-NEXT: scvtf z0.s, p0/m, z0.s 1778; CHECK-NEXT: scvtf z1.s, p0/m, z1.s 1779; CHECK-NEXT: stp q2, q0, [x1, #32] 1780; CHECK-NEXT: stp q3, q1, [x1] 1781; CHECK-NEXT: ret 1782; 1783; NONEON-NOSVE-LABEL: scvtf_v16i16_v16f32: 1784; NONEON-NOSVE: // %bb.0: 1785; NONEON-NOSVE-NEXT: ldp q0, q1, [x0] 1786; NONEON-NOSVE-NEXT: stp q0, q1, [sp, #-128]! 1787; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 128 1788; NONEON-NOSVE-NEXT: ldp d1, d0, [sp] 1789; NONEON-NOSVE-NEXT: stp d0, d1, [sp, #32] 1790; NONEON-NOSVE-NEXT: ldp d1, d0, [sp, #16] 1791; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #46] 1792; NONEON-NOSVE-NEXT: stp d0, d1, [sp, #48] 1793; NONEON-NOSVE-NEXT: scvtf s1, w8 1794; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #44] 1795; NONEON-NOSVE-NEXT: scvtf s0, w8 1796; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #42] 1797; NONEON-NOSVE-NEXT: stp s0, s1, [sp, #88] 1798; NONEON-NOSVE-NEXT: scvtf s1, w8 1799; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #40] 1800; NONEON-NOSVE-NEXT: scvtf s0, w8 1801; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #38] 1802; NONEON-NOSVE-NEXT: stp s0, s1, [sp, #80] 1803; NONEON-NOSVE-NEXT: scvtf s1, w8 1804; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #36] 1805; NONEON-NOSVE-NEXT: scvtf s0, w8 1806; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #34] 1807; NONEON-NOSVE-NEXT: stp s0, s1, [sp, #72] 1808; NONEON-NOSVE-NEXT: scvtf s1, w8 1809; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #32] 1810; NONEON-NOSVE-NEXT: scvtf s0, w8 1811; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #62] 1812; NONEON-NOSVE-NEXT: stp s0, s1, [sp, #64] 1813; NONEON-NOSVE-NEXT: scvtf s1, w8 1814; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #60] 1815; NONEON-NOSVE-NEXT: ldp q3, q2, [sp, #64] 1816; NONEON-NOSVE-NEXT: scvtf s0, w8 1817; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #58] 1818; NONEON-NOSVE-NEXT: stp s0, s1, [sp, #120] 1819; NONEON-NOSVE-NEXT: scvtf s1, w8 1820; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #56] 1821; NONEON-NOSVE-NEXT: scvtf s0, w8 1822; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #54] 1823; NONEON-NOSVE-NEXT: stp s0, s1, [sp, #112] 1824; NONEON-NOSVE-NEXT: scvtf s1, w8 1825; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #52] 1826; NONEON-NOSVE-NEXT: scvtf s0, w8 1827; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #50] 1828; NONEON-NOSVE-NEXT: stp s0, s1, [sp, #104] 1829; NONEON-NOSVE-NEXT: scvtf s1, w8 1830; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #48] 1831; NONEON-NOSVE-NEXT: scvtf s0, w8 1832; NONEON-NOSVE-NEXT: stp s0, s1, [sp, #96] 1833; NONEON-NOSVE-NEXT: ldp q0, q1, [sp, #96] 1834; NONEON-NOSVE-NEXT: stp q2, q3, [x1] 1835; NONEON-NOSVE-NEXT: stp q1, q0, [x1, #32] 1836; NONEON-NOSVE-NEXT: add sp, sp, #128 1837; NONEON-NOSVE-NEXT: ret 1838 %op1 = load <16 x i16>, ptr %a 1839 %res = sitofp <16 x i16> %op1 to <16 x float> 1840 store <16 x float> %res, ptr %b 1841 ret void 1842} 1843 1844; 1845; SCVTF H -> D 1846; 1847 1848define <2 x double> @scvtf_v2i16_v2f64(<2 x i16> %op1) { 1849; CHECK-LABEL: scvtf_v2i16_v2f64: 1850; CHECK: // %bb.0: 1851; CHECK-NEXT: ptrue p0.s, vl2 1852; CHECK-NEXT: // kill: def $d0 killed $d0 def $z0 1853; CHECK-NEXT: sxth z0.s, p0/m, z0.s 1854; CHECK-NEXT: ptrue p0.d, vl2 1855; CHECK-NEXT: sunpklo z0.d, z0.s 1856; CHECK-NEXT: scvtf z0.d, p0/m, z0.d 1857; CHECK-NEXT: // kill: def $q0 killed $q0 killed $z0 1858; CHECK-NEXT: ret 1859; 1860; NONEON-NOSVE-LABEL: scvtf_v2i16_v2f64: 1861; NONEON-NOSVE: // %bb.0: 1862; NONEON-NOSVE-NEXT: sub sp, sp, #32 1863; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 32 1864; NONEON-NOSVE-NEXT: str d0, [sp, #8] 1865; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #12] 1866; NONEON-NOSVE-NEXT: ldrsh w9, [sp, #8] 1867; NONEON-NOSVE-NEXT: scvtf d0, w8 1868; NONEON-NOSVE-NEXT: scvtf d1, w9 1869; NONEON-NOSVE-NEXT: stp d1, d0, [sp, #16] 1870; NONEON-NOSVE-NEXT: ldr q0, [sp, #16] 1871; NONEON-NOSVE-NEXT: add sp, sp, #32 1872; NONEON-NOSVE-NEXT: ret 1873 %res = sitofp <2 x i16> %op1 to <2 x double> 1874 ret <2 x double> %res 1875} 1876 1877define void @scvtf_v4i16_v4f64(ptr %a, ptr %b) { 1878; CHECK-LABEL: scvtf_v4i16_v4f64: 1879; CHECK: // %bb.0: 1880; CHECK-NEXT: ldr d0, [x0] 1881; CHECK-NEXT: ptrue p0.d, vl2 1882; CHECK-NEXT: sunpklo z0.s, z0.h 1883; CHECK-NEXT: sunpklo z1.d, z0.s 1884; CHECK-NEXT: ext z0.b, z0.b, z0.b, #8 1885; CHECK-NEXT: sunpklo z0.d, z0.s 1886; CHECK-NEXT: scvtf z1.d, p0/m, z1.d 1887; CHECK-NEXT: scvtf z0.d, p0/m, z0.d 1888; CHECK-NEXT: stp q1, q0, [x1] 1889; CHECK-NEXT: ret 1890; 1891; NONEON-NOSVE-LABEL: scvtf_v4i16_v4f64: 1892; NONEON-NOSVE: // %bb.0: 1893; NONEON-NOSVE-NEXT: sub sp, sp, #80 1894; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 80 1895; NONEON-NOSVE-NEXT: ldr d0, [x0] 1896; NONEON-NOSVE-NEXT: str d0, [sp, #8] 1897; NONEON-NOSVE-NEXT: ldrsh w9, [sp, #10] 1898; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #8] 1899; NONEON-NOSVE-NEXT: stp w8, w9, [sp, #24] 1900; NONEON-NOSVE-NEXT: ldrsh w9, [sp, #14] 1901; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #12] 1902; NONEON-NOSVE-NEXT: stp w8, w9, [sp, #16] 1903; NONEON-NOSVE-NEXT: ldp d0, d1, [sp, #16] 1904; NONEON-NOSVE-NEXT: stp d0, d1, [sp, #32] 1905; NONEON-NOSVE-NEXT: ldp w8, w9, [sp, #40] 1906; NONEON-NOSVE-NEXT: scvtf d1, w9 1907; NONEON-NOSVE-NEXT: scvtf d0, w8 1908; NONEON-NOSVE-NEXT: ldp w8, w9, [sp, #32] 1909; NONEON-NOSVE-NEXT: stp d0, d1, [sp, #64] 1910; NONEON-NOSVE-NEXT: scvtf d1, w9 1911; NONEON-NOSVE-NEXT: scvtf d0, w8 1912; NONEON-NOSVE-NEXT: stp d0, d1, [sp, #48] 1913; NONEON-NOSVE-NEXT: ldp q0, q1, [sp, #48] 1914; NONEON-NOSVE-NEXT: stp q1, q0, [x1] 1915; NONEON-NOSVE-NEXT: add sp, sp, #80 1916; NONEON-NOSVE-NEXT: ret 1917 %op1 = load <4 x i16>, ptr %a 1918 %res = sitofp <4 x i16> %op1 to <4 x double> 1919 store <4 x double> %res, ptr %b 1920 ret void 1921} 1922 1923define void @scvtf_v8i16_v8f64(ptr %a, ptr %b) { 1924; CHECK-LABEL: scvtf_v8i16_v8f64: 1925; CHECK: // %bb.0: 1926; CHECK-NEXT: ldr q0, [x0] 1927; CHECK-NEXT: ptrue p0.d, vl2 1928; CHECK-NEXT: sunpklo z1.s, z0.h 1929; CHECK-NEXT: ext z0.b, z0.b, z0.b, #8 1930; CHECK-NEXT: sunpklo z0.s, z0.h 1931; CHECK-NEXT: sunpklo z2.d, z1.s 1932; CHECK-NEXT: ext z1.b, z1.b, z1.b, #8 1933; CHECK-NEXT: sunpklo z3.d, z0.s 1934; CHECK-NEXT: ext z0.b, z0.b, z0.b, #8 1935; CHECK-NEXT: sunpklo z1.d, z1.s 1936; CHECK-NEXT: scvtf z2.d, p0/m, z2.d 1937; CHECK-NEXT: sunpklo z0.d, z0.s 1938; CHECK-NEXT: scvtf z1.d, p0/m, z1.d 1939; CHECK-NEXT: scvtf z3.d, p0/m, z3.d 1940; CHECK-NEXT: scvtf z0.d, p0/m, z0.d 1941; CHECK-NEXT: stp q2, q1, [x1] 1942; CHECK-NEXT: stp q3, q0, [x1, #32] 1943; CHECK-NEXT: ret 1944; 1945; NONEON-NOSVE-LABEL: scvtf_v8i16_v8f64: 1946; NONEON-NOSVE: // %bb.0: 1947; NONEON-NOSVE-NEXT: sub sp, sp, #160 1948; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 160 1949; NONEON-NOSVE-NEXT: ldr q0, [x0] 1950; NONEON-NOSVE-NEXT: str q0, [sp] 1951; NONEON-NOSVE-NEXT: ldp d1, d0, [sp] 1952; NONEON-NOSVE-NEXT: stp d0, d1, [sp, #16] 1953; NONEON-NOSVE-NEXT: ldrsh w9, [sp, #26] 1954; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #24] 1955; NONEON-NOSVE-NEXT: stp w8, w9, [sp, #56] 1956; NONEON-NOSVE-NEXT: ldrsh w9, [sp, #30] 1957; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #28] 1958; NONEON-NOSVE-NEXT: stp w8, w9, [sp, #48] 1959; NONEON-NOSVE-NEXT: ldrsh w9, [sp, #18] 1960; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #16] 1961; NONEON-NOSVE-NEXT: ldp d0, d1, [sp, #48] 1962; NONEON-NOSVE-NEXT: stp w8, w9, [sp, #40] 1963; NONEON-NOSVE-NEXT: ldrsh w9, [sp, #22] 1964; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #20] 1965; NONEON-NOSVE-NEXT: stp w8, w9, [sp, #32] 1966; NONEON-NOSVE-NEXT: stp d0, d1, [sp, #80] 1967; NONEON-NOSVE-NEXT: ldp d0, d1, [sp, #32] 1968; NONEON-NOSVE-NEXT: ldp w8, w9, [sp, #88] 1969; NONEON-NOSVE-NEXT: stp d0, d1, [sp, #64] 1970; NONEON-NOSVE-NEXT: scvtf d1, w9 1971; NONEON-NOSVE-NEXT: scvtf d0, w8 1972; NONEON-NOSVE-NEXT: ldp w8, w9, [sp, #80] 1973; NONEON-NOSVE-NEXT: stp d0, d1, [sp, #144] 1974; NONEON-NOSVE-NEXT: scvtf d1, w9 1975; NONEON-NOSVE-NEXT: scvtf d0, w8 1976; NONEON-NOSVE-NEXT: ldp w8, w9, [sp, #72] 1977; NONEON-NOSVE-NEXT: stp d0, d1, [sp, #128] 1978; NONEON-NOSVE-NEXT: scvtf d1, w9 1979; NONEON-NOSVE-NEXT: scvtf d0, w8 1980; NONEON-NOSVE-NEXT: ldp w8, w9, [sp, #64] 1981; NONEON-NOSVE-NEXT: ldp q3, q2, [sp, #128] 1982; NONEON-NOSVE-NEXT: stp d0, d1, [sp, #112] 1983; NONEON-NOSVE-NEXT: scvtf d1, w9 1984; NONEON-NOSVE-NEXT: scvtf d0, w8 1985; NONEON-NOSVE-NEXT: stp d0, d1, [sp, #96] 1986; NONEON-NOSVE-NEXT: ldp q0, q1, [sp, #96] 1987; NONEON-NOSVE-NEXT: stp q2, q3, [x1] 1988; NONEON-NOSVE-NEXT: stp q1, q0, [x1, #32] 1989; NONEON-NOSVE-NEXT: add sp, sp, #160 1990; NONEON-NOSVE-NEXT: ret 1991 %op1 = load <8 x i16>, ptr %a 1992 %res = sitofp <8 x i16> %op1 to <8 x double> 1993 store <8 x double> %res, ptr %b 1994 ret void 1995} 1996 1997define void @scvtf_v16i16_v16f64(ptr %a, ptr %b) { 1998; CHECK-LABEL: scvtf_v16i16_v16f64: 1999; CHECK: // %bb.0: 2000; CHECK-NEXT: ldp q1, q0, [x0] 2001; CHECK-NEXT: ptrue p0.d, vl2 2002; CHECK-NEXT: mov z2.d, z0.d 2003; CHECK-NEXT: sunpklo z3.s, z1.h 2004; CHECK-NEXT: ext z1.b, z1.b, z1.b, #8 2005; CHECK-NEXT: sunpklo z0.s, z0.h 2006; CHECK-NEXT: ext z2.b, z2.b, z2.b, #8 2007; CHECK-NEXT: sunpklo z1.s, z1.h 2008; CHECK-NEXT: mov z5.d, z3.d 2009; CHECK-NEXT: sunpklo z4.d, z0.s 2010; CHECK-NEXT: ext z0.b, z0.b, z0.b, #8 2011; CHECK-NEXT: sunpklo z2.s, z2.h 2012; CHECK-NEXT: ext z5.b, z5.b, z3.b, #8 2013; CHECK-NEXT: mov z7.d, z1.d 2014; CHECK-NEXT: sunpklo z3.d, z3.s 2015; CHECK-NEXT: sunpklo z0.d, z0.s 2016; CHECK-NEXT: scvtf z4.d, p0/m, z4.d 2017; CHECK-NEXT: mov z6.d, z2.d 2018; CHECK-NEXT: sunpklo z5.d, z5.s 2019; CHECK-NEXT: ext z7.b, z7.b, z1.b, #8 2020; CHECK-NEXT: sunpklo z1.d, z1.s 2021; CHECK-NEXT: scvtf z3.d, p0/m, z3.d 2022; CHECK-NEXT: scvtf z0.d, p0/m, z0.d 2023; CHECK-NEXT: ext z6.b, z6.b, z2.b, #8 2024; CHECK-NEXT: sunpklo z2.d, z2.s 2025; CHECK-NEXT: sunpklo z7.d, z7.s 2026; CHECK-NEXT: scvtf z5.d, p0/m, z5.d 2027; CHECK-NEXT: scvtf z1.d, p0/m, z1.d 2028; CHECK-NEXT: sunpklo z6.d, z6.s 2029; CHECK-NEXT: stp q4, q0, [x1, #64] 2030; CHECK-NEXT: scvtf z2.d, p0/m, z2.d 2031; CHECK-NEXT: stp q3, q5, [x1] 2032; CHECK-NEXT: movprfx z3, z7 2033; CHECK-NEXT: scvtf z3.d, p0/m, z7.d 2034; CHECK-NEXT: movprfx z0, z6 2035; CHECK-NEXT: scvtf z0.d, p0/m, z6.d 2036; CHECK-NEXT: stp q1, q3, [x1, #32] 2037; CHECK-NEXT: stp q2, q0, [x1, #96] 2038; CHECK-NEXT: ret 2039; 2040; NONEON-NOSVE-LABEL: scvtf_v16i16_v16f64: 2041; NONEON-NOSVE: // %bb.0: 2042; NONEON-NOSVE-NEXT: sub sp, sp, #336 2043; NONEON-NOSVE-NEXT: str x29, [sp, #320] // 8-byte Folded Spill 2044; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 336 2045; NONEON-NOSVE-NEXT: .cfi_offset w29, -16 2046; NONEON-NOSVE-NEXT: ldp q0, q1, [x0] 2047; NONEON-NOSVE-NEXT: ldr x29, [sp, #320] // 8-byte Folded Reload 2048; NONEON-NOSVE-NEXT: stp q0, q1, [sp] 2049; NONEON-NOSVE-NEXT: ldp d1, d0, [sp] 2050; NONEON-NOSVE-NEXT: stp d0, d1, [sp, #40] 2051; NONEON-NOSVE-NEXT: ldp d1, d0, [sp, #16] 2052; NONEON-NOSVE-NEXT: ldrsh w9, [sp, #50] 2053; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #48] 2054; NONEON-NOSVE-NEXT: stp w8, w9, [sp, #96] 2055; NONEON-NOSVE-NEXT: ldrsh w9, [sp, #54] 2056; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #52] 2057; NONEON-NOSVE-NEXT: stp d0, d1, [sp, #56] 2058; NONEON-NOSVE-NEXT: stp w8, w9, [sp, #88] 2059; NONEON-NOSVE-NEXT: ldrsh w9, [sp, #42] 2060; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #40] 2061; NONEON-NOSVE-NEXT: ldp d0, d1, [sp, #88] 2062; NONEON-NOSVE-NEXT: stp w8, w9, [sp, #80] 2063; NONEON-NOSVE-NEXT: ldrsh w9, [sp, #46] 2064; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #44] 2065; NONEON-NOSVE-NEXT: stp w8, w9, [sp, #72] 2066; NONEON-NOSVE-NEXT: ldrsh w9, [sp, #66] 2067; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #64] 2068; NONEON-NOSVE-NEXT: stp d0, d1, [sp, #152] 2069; NONEON-NOSVE-NEXT: ldp d0, d1, [sp, #72] 2070; NONEON-NOSVE-NEXT: stp w8, w9, [sp, #128] 2071; NONEON-NOSVE-NEXT: ldrsh w9, [sp, #70] 2072; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #68] 2073; NONEON-NOSVE-NEXT: stp w8, w9, [sp, #120] 2074; NONEON-NOSVE-NEXT: ldrsh w9, [sp, #58] 2075; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #56] 2076; NONEON-NOSVE-NEXT: stp d0, d1, [sp, #136] 2077; NONEON-NOSVE-NEXT: ldp d2, d1, [sp, #120] 2078; NONEON-NOSVE-NEXT: stp w8, w9, [sp, #112] 2079; NONEON-NOSVE-NEXT: ldrsh w9, [sp, #62] 2080; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #60] 2081; NONEON-NOSVE-NEXT: stp w8, w9, [sp, #104] 2082; NONEON-NOSVE-NEXT: str d1, [sp, #328] 2083; NONEON-NOSVE-NEXT: ldp d0, d1, [sp, #104] 2084; NONEON-NOSVE-NEXT: ldp w8, w9, [sp, #160] 2085; NONEON-NOSVE-NEXT: stp d1, d2, [sp, #176] 2086; NONEON-NOSVE-NEXT: str d0, [sp, #168] 2087; NONEON-NOSVE-NEXT: scvtf d1, w9 2088; NONEON-NOSVE-NEXT: scvtf d0, w8 2089; NONEON-NOSVE-NEXT: ldp w8, w9, [sp, #152] 2090; NONEON-NOSVE-NEXT: stp d0, d1, [sp, #240] 2091; NONEON-NOSVE-NEXT: scvtf d1, w9 2092; NONEON-NOSVE-NEXT: scvtf d0, w8 2093; NONEON-NOSVE-NEXT: ldp w8, w9, [sp, #144] 2094; NONEON-NOSVE-NEXT: stp d0, d1, [sp, #224] 2095; NONEON-NOSVE-NEXT: scvtf d1, w9 2096; NONEON-NOSVE-NEXT: scvtf d0, w8 2097; NONEON-NOSVE-NEXT: ldp w8, w9, [sp, #136] 2098; NONEON-NOSVE-NEXT: stp d0, d1, [sp, #208] 2099; NONEON-NOSVE-NEXT: scvtf d1, w9 2100; NONEON-NOSVE-NEXT: scvtf d0, w8 2101; NONEON-NOSVE-NEXT: ldr w8, [sp, #332] 2102; NONEON-NOSVE-NEXT: stp d0, d1, [sp, #192] 2103; NONEON-NOSVE-NEXT: scvtf d1, w8 2104; NONEON-NOSVE-NEXT: ldr w8, [sp, #328] 2105; NONEON-NOSVE-NEXT: ldp q4, q3, [sp, #192] 2106; NONEON-NOSVE-NEXT: scvtf d0, w8 2107; NONEON-NOSVE-NEXT: ldp w8, w9, [sp, #184] 2108; NONEON-NOSVE-NEXT: stp d0, d1, [sp, #304] 2109; NONEON-NOSVE-NEXT: scvtf d1, w9 2110; NONEON-NOSVE-NEXT: scvtf d0, w8 2111; NONEON-NOSVE-NEXT: ldp w8, w9, [sp, #176] 2112; NONEON-NOSVE-NEXT: stp d0, d1, [sp, #288] 2113; NONEON-NOSVE-NEXT: scvtf d1, w9 2114; NONEON-NOSVE-NEXT: scvtf d0, w8 2115; NONEON-NOSVE-NEXT: ldp w8, w9, [sp, #168] 2116; NONEON-NOSVE-NEXT: ldp q7, q6, [sp, #288] 2117; NONEON-NOSVE-NEXT: stp d0, d1, [sp, #272] 2118; NONEON-NOSVE-NEXT: scvtf d1, w9 2119; NONEON-NOSVE-NEXT: scvtf d0, w8 2120; NONEON-NOSVE-NEXT: stp d0, d1, [sp, #256] 2121; NONEON-NOSVE-NEXT: ldp q1, q0, [sp, #224] 2122; NONEON-NOSVE-NEXT: ldp q2, q5, [sp, #256] 2123; NONEON-NOSVE-NEXT: stp q3, q4, [x1, #32] 2124; NONEON-NOSVE-NEXT: stp q6, q7, [x1, #64] 2125; NONEON-NOSVE-NEXT: stp q0, q1, [x1] 2126; NONEON-NOSVE-NEXT: stp q5, q2, [x1, #96] 2127; NONEON-NOSVE-NEXT: add sp, sp, #336 2128; NONEON-NOSVE-NEXT: ret 2129 %op1 = load <16 x i16>, ptr %a 2130 %res = sitofp <16 x i16> %op1 to <16 x double> 2131 store <16 x double> %res, ptr %b 2132 ret void 2133} 2134 2135; 2136; SCVTF S -> H 2137; 2138 2139define <2 x half> @scvtf_v2i32_v2f16(<2 x i32> %op1) { 2140; CHECK-LABEL: scvtf_v2i32_v2f16: 2141; CHECK: // %bb.0: 2142; CHECK-NEXT: ptrue p0.s, vl4 2143; CHECK-NEXT: // kill: def $d0 killed $d0 def $z0 2144; CHECK-NEXT: scvtf z0.h, p0/m, z0.s 2145; CHECK-NEXT: uzp1 z0.h, z0.h, z0.h 2146; CHECK-NEXT: // kill: def $d0 killed $d0 killed $z0 2147; CHECK-NEXT: ret 2148; 2149; NONEON-NOSVE-LABEL: scvtf_v2i32_v2f16: 2150; NONEON-NOSVE: // %bb.0: 2151; NONEON-NOSVE-NEXT: str d0, [sp, #-16]! 2152; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 16 2153; NONEON-NOSVE-NEXT: ldp w8, w9, [sp] 2154; NONEON-NOSVE-NEXT: str wzr, [sp, #12] 2155; NONEON-NOSVE-NEXT: scvtf s0, w9 2156; NONEON-NOSVE-NEXT: fcvt h0, s0 2157; NONEON-NOSVE-NEXT: str h0, [sp, #10] 2158; NONEON-NOSVE-NEXT: scvtf s0, w8 2159; NONEON-NOSVE-NEXT: fcvt h0, s0 2160; NONEON-NOSVE-NEXT: str h0, [sp, #8] 2161; NONEON-NOSVE-NEXT: ldr d0, [sp, #8] 2162; NONEON-NOSVE-NEXT: add sp, sp, #16 2163; NONEON-NOSVE-NEXT: ret 2164 %res = sitofp <2 x i32> %op1 to <2 x half> 2165 ret <2 x half> %res 2166} 2167 2168define <4 x half> @scvtf_v4i32_v4f16(<4 x i32> %op1) { 2169; CHECK-LABEL: scvtf_v4i32_v4f16: 2170; CHECK: // %bb.0: 2171; CHECK-NEXT: ptrue p0.s, vl4 2172; CHECK-NEXT: // kill: def $q0 killed $q0 def $z0 2173; CHECK-NEXT: scvtf z0.h, p0/m, z0.s 2174; CHECK-NEXT: uzp1 z0.h, z0.h, z0.h 2175; CHECK-NEXT: // kill: def $d0 killed $d0 killed $z0 2176; CHECK-NEXT: ret 2177; 2178; NONEON-NOSVE-LABEL: scvtf_v4i32_v4f16: 2179; NONEON-NOSVE: // %bb.0: 2180; NONEON-NOSVE-NEXT: str q0, [sp, #-32]! 2181; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 32 2182; NONEON-NOSVE-NEXT: ldp w8, w9, [sp, #8] 2183; NONEON-NOSVE-NEXT: scvtf s0, w9 2184; NONEON-NOSVE-NEXT: fcvt h0, s0 2185; NONEON-NOSVE-NEXT: str h0, [sp, #30] 2186; NONEON-NOSVE-NEXT: scvtf s0, w8 2187; NONEON-NOSVE-NEXT: ldp w8, w9, [sp] 2188; NONEON-NOSVE-NEXT: fcvt h0, s0 2189; NONEON-NOSVE-NEXT: str h0, [sp, #28] 2190; NONEON-NOSVE-NEXT: scvtf s0, w9 2191; NONEON-NOSVE-NEXT: fcvt h0, s0 2192; NONEON-NOSVE-NEXT: str h0, [sp, #26] 2193; NONEON-NOSVE-NEXT: scvtf s0, w8 2194; NONEON-NOSVE-NEXT: fcvt h0, s0 2195; NONEON-NOSVE-NEXT: str h0, [sp, #24] 2196; NONEON-NOSVE-NEXT: ldr d0, [sp, #24] 2197; NONEON-NOSVE-NEXT: add sp, sp, #32 2198; NONEON-NOSVE-NEXT: ret 2199 %res = sitofp <4 x i32> %op1 to <4 x half> 2200 ret <4 x half> %res 2201} 2202 2203define <8 x half> @scvtf_v8i32_v8f16(ptr %a) { 2204; CHECK-LABEL: scvtf_v8i32_v8f16: 2205; CHECK: // %bb.0: 2206; CHECK-NEXT: ldp q0, q1, [x0] 2207; CHECK-NEXT: ptrue p0.s, vl4 2208; CHECK-NEXT: scvtf z1.h, p0/m, z1.s 2209; CHECK-NEXT: scvtf z0.h, p0/m, z0.s 2210; CHECK-NEXT: ptrue p0.h, vl4 2211; CHECK-NEXT: uzp1 z1.h, z1.h, z1.h 2212; CHECK-NEXT: uzp1 z0.h, z0.h, z0.h 2213; CHECK-NEXT: splice z0.h, p0, z0.h, z1.h 2214; CHECK-NEXT: // kill: def $q0 killed $q0 killed $z0 2215; CHECK-NEXT: ret 2216; 2217; NONEON-NOSVE-LABEL: scvtf_v8i32_v8f16: 2218; NONEON-NOSVE: // %bb.0: 2219; NONEON-NOSVE-NEXT: ldp q1, q0, [x0] 2220; NONEON-NOSVE-NEXT: stp q1, q0, [sp, #-48]! 2221; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 48 2222; NONEON-NOSVE-NEXT: ldp w8, w9, [sp, #24] 2223; NONEON-NOSVE-NEXT: scvtf s0, w9 2224; NONEON-NOSVE-NEXT: fcvt h0, s0 2225; NONEON-NOSVE-NEXT: str h0, [sp, #46] 2226; NONEON-NOSVE-NEXT: scvtf s0, w8 2227; NONEON-NOSVE-NEXT: ldp w8, w9, [sp, #16] 2228; NONEON-NOSVE-NEXT: fcvt h0, s0 2229; NONEON-NOSVE-NEXT: str h0, [sp, #44] 2230; NONEON-NOSVE-NEXT: scvtf s0, w9 2231; NONEON-NOSVE-NEXT: fcvt h0, s0 2232; NONEON-NOSVE-NEXT: str h0, [sp, #42] 2233; NONEON-NOSVE-NEXT: scvtf s0, w8 2234; NONEON-NOSVE-NEXT: ldp w8, w9, [sp, #8] 2235; NONEON-NOSVE-NEXT: fcvt h0, s0 2236; NONEON-NOSVE-NEXT: str h0, [sp, #40] 2237; NONEON-NOSVE-NEXT: scvtf s0, w9 2238; NONEON-NOSVE-NEXT: fcvt h0, s0 2239; NONEON-NOSVE-NEXT: str h0, [sp, #38] 2240; NONEON-NOSVE-NEXT: scvtf s0, w8 2241; NONEON-NOSVE-NEXT: ldp w8, w9, [sp] 2242; NONEON-NOSVE-NEXT: fcvt h0, s0 2243; NONEON-NOSVE-NEXT: str h0, [sp, #36] 2244; NONEON-NOSVE-NEXT: scvtf s0, w9 2245; NONEON-NOSVE-NEXT: fcvt h0, s0 2246; NONEON-NOSVE-NEXT: str h0, [sp, #34] 2247; NONEON-NOSVE-NEXT: scvtf s0, w8 2248; NONEON-NOSVE-NEXT: fcvt h0, s0 2249; NONEON-NOSVE-NEXT: str h0, [sp, #32] 2250; NONEON-NOSVE-NEXT: ldr q0, [sp, #32] 2251; NONEON-NOSVE-NEXT: add sp, sp, #48 2252; NONEON-NOSVE-NEXT: ret 2253 %op1 = load <8 x i32>, ptr %a 2254 %res = sitofp <8 x i32> %op1 to <8 x half> 2255 ret <8 x half> %res 2256} 2257 2258; 2259; SCVTF S -> S 2260; 2261 2262define <2 x float> @scvtf_v2i32_v2f32(<2 x i32> %op1) { 2263; CHECK-LABEL: scvtf_v2i32_v2f32: 2264; CHECK: // %bb.0: 2265; CHECK-NEXT: ptrue p0.s, vl2 2266; CHECK-NEXT: // kill: def $d0 killed $d0 def $z0 2267; CHECK-NEXT: scvtf z0.s, p0/m, z0.s 2268; CHECK-NEXT: // kill: def $d0 killed $d0 killed $z0 2269; CHECK-NEXT: ret 2270; 2271; NONEON-NOSVE-LABEL: scvtf_v2i32_v2f32: 2272; NONEON-NOSVE: // %bb.0: 2273; NONEON-NOSVE-NEXT: str d0, [sp, #-16]! 2274; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 16 2275; NONEON-NOSVE-NEXT: ldp w8, w9, [sp] 2276; NONEON-NOSVE-NEXT: scvtf s1, w9 2277; NONEON-NOSVE-NEXT: scvtf s0, w8 2278; NONEON-NOSVE-NEXT: stp s0, s1, [sp, #8] 2279; NONEON-NOSVE-NEXT: ldr d0, [sp, #8] 2280; NONEON-NOSVE-NEXT: add sp, sp, #16 2281; NONEON-NOSVE-NEXT: ret 2282 %res = sitofp <2 x i32> %op1 to <2 x float> 2283 ret <2 x float> %res 2284} 2285 2286define <4 x float> @scvtf_v4i32_v4f32(<4 x i32> %op1) { 2287; CHECK-LABEL: scvtf_v4i32_v4f32: 2288; CHECK: // %bb.0: 2289; CHECK-NEXT: ptrue p0.s, vl4 2290; CHECK-NEXT: // kill: def $q0 killed $q0 def $z0 2291; CHECK-NEXT: scvtf z0.s, p0/m, z0.s 2292; CHECK-NEXT: // kill: def $q0 killed $q0 killed $z0 2293; CHECK-NEXT: ret 2294; 2295; NONEON-NOSVE-LABEL: scvtf_v4i32_v4f32: 2296; NONEON-NOSVE: // %bb.0: 2297; NONEON-NOSVE-NEXT: str q0, [sp, #-32]! 2298; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 32 2299; NONEON-NOSVE-NEXT: ldp w8, w9, [sp, #8] 2300; NONEON-NOSVE-NEXT: scvtf s1, w9 2301; NONEON-NOSVE-NEXT: scvtf s0, w8 2302; NONEON-NOSVE-NEXT: ldp w8, w9, [sp] 2303; NONEON-NOSVE-NEXT: stp s0, s1, [sp, #24] 2304; NONEON-NOSVE-NEXT: scvtf s1, w9 2305; NONEON-NOSVE-NEXT: scvtf s0, w8 2306; NONEON-NOSVE-NEXT: stp s0, s1, [sp, #16] 2307; NONEON-NOSVE-NEXT: ldr q0, [sp, #16] 2308; NONEON-NOSVE-NEXT: add sp, sp, #32 2309; NONEON-NOSVE-NEXT: ret 2310 %res = sitofp <4 x i32> %op1 to <4 x float> 2311 ret <4 x float> %res 2312} 2313 2314define void @scvtf_v8i32_v8f32(ptr %a, ptr %b) { 2315; CHECK-LABEL: scvtf_v8i32_v8f32: 2316; CHECK: // %bb.0: 2317; CHECK-NEXT: ldp q0, q1, [x0] 2318; CHECK-NEXT: ptrue p0.s, vl4 2319; CHECK-NEXT: scvtf z0.s, p0/m, z0.s 2320; CHECK-NEXT: scvtf z1.s, p0/m, z1.s 2321; CHECK-NEXT: stp q0, q1, [x1] 2322; CHECK-NEXT: ret 2323; 2324; NONEON-NOSVE-LABEL: scvtf_v8i32_v8f32: 2325; NONEON-NOSVE: // %bb.0: 2326; NONEON-NOSVE-NEXT: ldp q1, q0, [x0] 2327; NONEON-NOSVE-NEXT: stp q1, q0, [sp, #-64]! 2328; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 64 2329; NONEON-NOSVE-NEXT: ldp w8, w9, [sp, #24] 2330; NONEON-NOSVE-NEXT: scvtf s1, w9 2331; NONEON-NOSVE-NEXT: scvtf s0, w8 2332; NONEON-NOSVE-NEXT: ldp w8, w9, [sp, #16] 2333; NONEON-NOSVE-NEXT: stp s0, s1, [sp, #56] 2334; NONEON-NOSVE-NEXT: scvtf s1, w9 2335; NONEON-NOSVE-NEXT: scvtf s0, w8 2336; NONEON-NOSVE-NEXT: ldp w8, w9, [sp, #8] 2337; NONEON-NOSVE-NEXT: stp s0, s1, [sp, #48] 2338; NONEON-NOSVE-NEXT: scvtf s1, w9 2339; NONEON-NOSVE-NEXT: scvtf s0, w8 2340; NONEON-NOSVE-NEXT: ldp w8, w9, [sp] 2341; NONEON-NOSVE-NEXT: stp s0, s1, [sp, #40] 2342; NONEON-NOSVE-NEXT: scvtf s1, w9 2343; NONEON-NOSVE-NEXT: scvtf s0, w8 2344; NONEON-NOSVE-NEXT: stp s0, s1, [sp, #32] 2345; NONEON-NOSVE-NEXT: ldp q0, q1, [sp, #32] 2346; NONEON-NOSVE-NEXT: stp q0, q1, [x1] 2347; NONEON-NOSVE-NEXT: add sp, sp, #64 2348; NONEON-NOSVE-NEXT: ret 2349 %op1 = load <8 x i32>, ptr %a 2350 %res = sitofp <8 x i32> %op1 to <8 x float> 2351 store <8 x float> %res, ptr %b 2352 ret void 2353} 2354 2355; 2356; SCVTF S -> D 2357; 2358 2359define <2 x double> @scvtf_v2i32_v2f64(<2 x i32> %op1) { 2360; CHECK-LABEL: scvtf_v2i32_v2f64: 2361; CHECK: // %bb.0: 2362; CHECK-NEXT: // kill: def $d0 killed $d0 def $z0 2363; CHECK-NEXT: ptrue p0.d, vl2 2364; CHECK-NEXT: sunpklo z0.d, z0.s 2365; CHECK-NEXT: scvtf z0.d, p0/m, z0.d 2366; CHECK-NEXT: // kill: def $q0 killed $q0 killed $z0 2367; CHECK-NEXT: ret 2368; 2369; NONEON-NOSVE-LABEL: scvtf_v2i32_v2f64: 2370; NONEON-NOSVE: // %bb.0: 2371; NONEON-NOSVE-NEXT: sub sp, sp, #32 2372; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 32 2373; NONEON-NOSVE-NEXT: str d0, [sp, #8] 2374; NONEON-NOSVE-NEXT: ldp w8, w9, [sp, #8] 2375; NONEON-NOSVE-NEXT: scvtf d1, w9 2376; NONEON-NOSVE-NEXT: scvtf d0, w8 2377; NONEON-NOSVE-NEXT: stp d0, d1, [sp, #16] 2378; NONEON-NOSVE-NEXT: ldr q0, [sp, #16] 2379; NONEON-NOSVE-NEXT: add sp, sp, #32 2380; NONEON-NOSVE-NEXT: ret 2381 %res = sitofp <2 x i32> %op1 to <2 x double> 2382 ret <2 x double> %res 2383} 2384 2385define void @scvtf_v4i32_v4f64(ptr %a, ptr %b) { 2386; CHECK-LABEL: scvtf_v4i32_v4f64: 2387; CHECK: // %bb.0: 2388; CHECK-NEXT: ldr q0, [x0] 2389; CHECK-NEXT: ptrue p0.d, vl2 2390; CHECK-NEXT: sunpklo z1.d, z0.s 2391; CHECK-NEXT: ext z0.b, z0.b, z0.b, #8 2392; CHECK-NEXT: sunpklo z0.d, z0.s 2393; CHECK-NEXT: scvtf z1.d, p0/m, z1.d 2394; CHECK-NEXT: scvtf z0.d, p0/m, z0.d 2395; CHECK-NEXT: stp q1, q0, [x1] 2396; CHECK-NEXT: ret 2397; 2398; NONEON-NOSVE-LABEL: scvtf_v4i32_v4f64: 2399; NONEON-NOSVE: // %bb.0: 2400; NONEON-NOSVE-NEXT: ldr q0, [x0] 2401; NONEON-NOSVE-NEXT: str q0, [sp, #-64]! 2402; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 64 2403; NONEON-NOSVE-NEXT: ldp d1, d0, [sp] 2404; NONEON-NOSVE-NEXT: stp d0, d1, [sp, #16] 2405; NONEON-NOSVE-NEXT: ldp w8, w9, [sp, #24] 2406; NONEON-NOSVE-NEXT: scvtf d1, w9 2407; NONEON-NOSVE-NEXT: scvtf d0, w8 2408; NONEON-NOSVE-NEXT: ldp w8, w9, [sp, #16] 2409; NONEON-NOSVE-NEXT: stp d0, d1, [sp, #48] 2410; NONEON-NOSVE-NEXT: scvtf d1, w9 2411; NONEON-NOSVE-NEXT: scvtf d0, w8 2412; NONEON-NOSVE-NEXT: stp d0, d1, [sp, #32] 2413; NONEON-NOSVE-NEXT: ldp q0, q1, [sp, #32] 2414; NONEON-NOSVE-NEXT: stp q1, q0, [x1] 2415; NONEON-NOSVE-NEXT: add sp, sp, #64 2416; NONEON-NOSVE-NEXT: ret 2417 %op1 = load <4 x i32>, ptr %a 2418 %res = sitofp <4 x i32> %op1 to <4 x double> 2419 store <4 x double> %res, ptr %b 2420 ret void 2421} 2422 2423define void @scvtf_v8i32_v8f64(ptr %a, ptr %b) { 2424; CHECK-LABEL: scvtf_v8i32_v8f64: 2425; CHECK: // %bb.0: 2426; CHECK-NEXT: ldp q1, q0, [x0] 2427; CHECK-NEXT: ptrue p0.d, vl2 2428; CHECK-NEXT: sunpklo z2.d, z0.s 2429; CHECK-NEXT: ext z0.b, z0.b, z0.b, #8 2430; CHECK-NEXT: sunpklo z3.d, z1.s 2431; CHECK-NEXT: ext z1.b, z1.b, z1.b, #8 2432; CHECK-NEXT: sunpklo z0.d, z0.s 2433; CHECK-NEXT: sunpklo z1.d, z1.s 2434; CHECK-NEXT: scvtf z2.d, p0/m, z2.d 2435; CHECK-NEXT: scvtf z3.d, p0/m, z3.d 2436; CHECK-NEXT: scvtf z0.d, p0/m, z0.d 2437; CHECK-NEXT: scvtf z1.d, p0/m, z1.d 2438; CHECK-NEXT: stp q2, q0, [x1, #32] 2439; CHECK-NEXT: stp q3, q1, [x1] 2440; CHECK-NEXT: ret 2441; 2442; NONEON-NOSVE-LABEL: scvtf_v8i32_v8f64: 2443; NONEON-NOSVE: // %bb.0: 2444; NONEON-NOSVE-NEXT: ldp q0, q1, [x0] 2445; NONEON-NOSVE-NEXT: stp q0, q1, [sp, #-128]! 2446; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 128 2447; NONEON-NOSVE-NEXT: ldp d1, d0, [sp] 2448; NONEON-NOSVE-NEXT: stp d0, d1, [sp, #32] 2449; NONEON-NOSVE-NEXT: ldp d1, d0, [sp, #16] 2450; NONEON-NOSVE-NEXT: ldp w8, w9, [sp, #40] 2451; NONEON-NOSVE-NEXT: stp d0, d1, [sp, #48] 2452; NONEON-NOSVE-NEXT: scvtf d1, w9 2453; NONEON-NOSVE-NEXT: scvtf d0, w8 2454; NONEON-NOSVE-NEXT: ldp w8, w9, [sp, #32] 2455; NONEON-NOSVE-NEXT: stp d0, d1, [sp, #80] 2456; NONEON-NOSVE-NEXT: scvtf d1, w9 2457; NONEON-NOSVE-NEXT: scvtf d0, w8 2458; NONEON-NOSVE-NEXT: ldp w8, w9, [sp, #56] 2459; NONEON-NOSVE-NEXT: stp d0, d1, [sp, #64] 2460; NONEON-NOSVE-NEXT: scvtf d1, w9 2461; NONEON-NOSVE-NEXT: scvtf d0, w8 2462; NONEON-NOSVE-NEXT: ldp w8, w9, [sp, #48] 2463; NONEON-NOSVE-NEXT: ldp q3, q2, [sp, #64] 2464; NONEON-NOSVE-NEXT: stp d0, d1, [sp, #112] 2465; NONEON-NOSVE-NEXT: scvtf d1, w9 2466; NONEON-NOSVE-NEXT: scvtf d0, w8 2467; NONEON-NOSVE-NEXT: stp d0, d1, [sp, #96] 2468; NONEON-NOSVE-NEXT: ldp q0, q1, [sp, #96] 2469; NONEON-NOSVE-NEXT: stp q2, q3, [x1] 2470; NONEON-NOSVE-NEXT: stp q1, q0, [x1, #32] 2471; NONEON-NOSVE-NEXT: add sp, sp, #128 2472; NONEON-NOSVE-NEXT: ret 2473 %op1 = load <8 x i32>, ptr %a 2474 %res = sitofp <8 x i32> %op1 to <8 x double> 2475 store <8 x double> %res, ptr %b 2476 ret void 2477} 2478 2479define void @scvtf_v16i32_v16f64(ptr %a, ptr %b) { 2480; CHECK-LABEL: scvtf_v16i32_v16f64: 2481; CHECK: // %bb.0: 2482; CHECK-NEXT: ldp q1, q0, [x0, #32] 2483; CHECK-NEXT: ptrue p0.d, vl2 2484; CHECK-NEXT: ldp q5, q4, [x0] 2485; CHECK-NEXT: mov z2.d, z0.d 2486; CHECK-NEXT: mov z3.d, z1.d 2487; CHECK-NEXT: mov z6.d, z4.d 2488; CHECK-NEXT: mov z7.d, z5.d 2489; CHECK-NEXT: ext z2.b, z2.b, z0.b, #8 2490; CHECK-NEXT: ext z3.b, z3.b, z1.b, #8 2491; CHECK-NEXT: sunpklo z0.d, z0.s 2492; CHECK-NEXT: sunpklo z1.d, z1.s 2493; CHECK-NEXT: ext z6.b, z6.b, z4.b, #8 2494; CHECK-NEXT: ext z7.b, z7.b, z5.b, #8 2495; CHECK-NEXT: sunpklo z4.d, z4.s 2496; CHECK-NEXT: sunpklo z5.d, z5.s 2497; CHECK-NEXT: sunpklo z2.d, z2.s 2498; CHECK-NEXT: sunpklo z3.d, z3.s 2499; CHECK-NEXT: scvtf z0.d, p0/m, z0.d 2500; CHECK-NEXT: sunpklo z6.d, z6.s 2501; CHECK-NEXT: sunpklo z7.d, z7.s 2502; CHECK-NEXT: scvtf z1.d, p0/m, z1.d 2503; CHECK-NEXT: scvtf z4.d, p0/m, z4.d 2504; CHECK-NEXT: scvtf z2.d, p0/m, z2.d 2505; CHECK-NEXT: scvtf z3.d, p0/m, z3.d 2506; CHECK-NEXT: stp q1, q3, [x1, #64] 2507; CHECK-NEXT: movprfx z1, z7 2508; CHECK-NEXT: scvtf z1.d, p0/m, z7.d 2509; CHECK-NEXT: stp q0, q2, [x1, #96] 2510; CHECK-NEXT: movprfx z0, z6 2511; CHECK-NEXT: scvtf z0.d, p0/m, z6.d 2512; CHECK-NEXT: movprfx z2, z5 2513; CHECK-NEXT: scvtf z2.d, p0/m, z5.d 2514; CHECK-NEXT: stp q2, q1, [x1] 2515; CHECK-NEXT: stp q4, q0, [x1, #32] 2516; CHECK-NEXT: ret 2517; 2518; NONEON-NOSVE-LABEL: scvtf_v16i32_v16f64: 2519; NONEON-NOSVE: // %bb.0: 2520; NONEON-NOSVE-NEXT: sub sp, sp, #272 2521; NONEON-NOSVE-NEXT: str x29, [sp, #256] // 8-byte Folded Spill 2522; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 272 2523; NONEON-NOSVE-NEXT: .cfi_offset w29, -16 2524; NONEON-NOSVE-NEXT: ldp q0, q1, [x0] 2525; NONEON-NOSVE-NEXT: ldr x29, [sp, #256] // 8-byte Folded Reload 2526; NONEON-NOSVE-NEXT: ldp q3, q2, [x0, #32] 2527; NONEON-NOSVE-NEXT: str q1, [sp, #32] 2528; NONEON-NOSVE-NEXT: stp q0, q2, [sp] 2529; NONEON-NOSVE-NEXT: ldp d0, d1, [sp] 2530; NONEON-NOSVE-NEXT: str q3, [sp, #64] 2531; NONEON-NOSVE-NEXT: stp d1, d0, [sp, #48] 2532; NONEON-NOSVE-NEXT: ldp d0, d1, [sp, #32] 2533; NONEON-NOSVE-NEXT: ldp w8, w9, [sp, #48] 2534; NONEON-NOSVE-NEXT: stp d1, d0, [sp, #104] 2535; NONEON-NOSVE-NEXT: ldp d0, d1, [sp, #64] 2536; NONEON-NOSVE-NEXT: str d0, [sp, #264] 2537; NONEON-NOSVE-NEXT: ldp d0, d2, [sp, #16] 2538; NONEON-NOSVE-NEXT: stp d2, d0, [sp, #88] 2539; NONEON-NOSVE-NEXT: scvtf d0, w8 2540; NONEON-NOSVE-NEXT: scvtf d2, w9 2541; NONEON-NOSVE-NEXT: ldp w8, w9, [sp, #56] 2542; NONEON-NOSVE-NEXT: stp d1, d0, [sp, #120] 2543; NONEON-NOSVE-NEXT: scvtf d0, w9 2544; NONEON-NOSVE-NEXT: str d0, [sp, #152] 2545; NONEON-NOSVE-NEXT: scvtf d0, w8 2546; NONEON-NOSVE-NEXT: ldp w8, w9, [sp, #104] 2547; NONEON-NOSVE-NEXT: stp d2, d0, [sp, #136] 2548; NONEON-NOSVE-NEXT: scvtf d1, w9 2549; NONEON-NOSVE-NEXT: scvtf d0, w8 2550; NONEON-NOSVE-NEXT: ldp w8, w9, [sp, #112] 2551; NONEON-NOSVE-NEXT: stp d0, d1, [sp, #192] 2552; NONEON-NOSVE-NEXT: scvtf d1, w9 2553; NONEON-NOSVE-NEXT: scvtf d0, w8 2554; NONEON-NOSVE-NEXT: ldp w8, w9, [sp, #120] 2555; NONEON-NOSVE-NEXT: stp d0, d1, [sp, #208] 2556; NONEON-NOSVE-NEXT: scvtf d1, w9 2557; NONEON-NOSVE-NEXT: scvtf d0, w8 2558; NONEON-NOSVE-NEXT: ldr w8, [sp, #268] 2559; NONEON-NOSVE-NEXT: stp d0, d1, [sp, #224] 2560; NONEON-NOSVE-NEXT: scvtf d1, w8 2561; NONEON-NOSVE-NEXT: ldr w8, [sp, #264] 2562; NONEON-NOSVE-NEXT: ldp q4, q6, [sp, #208] 2563; NONEON-NOSVE-NEXT: scvtf d0, w8 2564; NONEON-NOSVE-NEXT: ldp w8, w9, [sp, #88] 2565; NONEON-NOSVE-NEXT: stp d0, d1, [sp, #240] 2566; NONEON-NOSVE-NEXT: scvtf d1, w9 2567; NONEON-NOSVE-NEXT: scvtf d0, w8 2568; NONEON-NOSVE-NEXT: ldp w8, w9, [sp, #96] 2569; NONEON-NOSVE-NEXT: ldr q7, [sp, #240] 2570; NONEON-NOSVE-NEXT: stp d0, d1, [sp, #160] 2571; NONEON-NOSVE-NEXT: scvtf d1, w9 2572; NONEON-NOSVE-NEXT: scvtf d0, w8 2573; NONEON-NOSVE-NEXT: ldr q5, [sp, #160] 2574; NONEON-NOSVE-NEXT: stp d0, d1, [sp, #176] 2575; NONEON-NOSVE-NEXT: ldp q0, q1, [sp, #128] 2576; NONEON-NOSVE-NEXT: ldp q2, q3, [sp, #176] 2577; NONEON-NOSVE-NEXT: stp q7, q6, [x1, #64] 2578; NONEON-NOSVE-NEXT: stp q1, q0, [x1] 2579; NONEON-NOSVE-NEXT: stp q4, q3, [x1, #32] 2580; NONEON-NOSVE-NEXT: stp q2, q5, [x1, #96] 2581; NONEON-NOSVE-NEXT: add sp, sp, #272 2582; NONEON-NOSVE-NEXT: ret 2583 %op1 = load <16 x i32>, ptr %a 2584 %res = sitofp <16 x i32> %op1 to <16 x double> 2585 store <16 x double> %res, ptr %b 2586 ret void 2587} 2588 2589; 2590; SCVTF D -> H 2591; 2592 2593define <2 x half> @scvtf_v2i64_v2f16(<2 x i64> %op1) { 2594; CHECK-LABEL: scvtf_v2i64_v2f16: 2595; CHECK: // %bb.0: 2596; CHECK-NEXT: // kill: def $q0 killed $q0 def $z0 2597; CHECK-NEXT: mov z1.d, z0.d[1] 2598; CHECK-NEXT: ptrue p0.d 2599; CHECK-NEXT: scvtf z0.h, p0/m, z0.d 2600; CHECK-NEXT: scvtf z1.h, p0/m, z1.d 2601; CHECK-NEXT: zip1 z0.h, z0.h, z1.h 2602; CHECK-NEXT: // kill: def $d0 killed $d0 killed $z0 2603; CHECK-NEXT: ret 2604; 2605; NONEON-NOSVE-LABEL: scvtf_v2i64_v2f16: 2606; NONEON-NOSVE: // %bb.0: 2607; NONEON-NOSVE-NEXT: str q0, [sp, #-32]! 2608; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 32 2609; NONEON-NOSVE-NEXT: ldp x8, x9, [sp] 2610; NONEON-NOSVE-NEXT: scvtf s0, x9 2611; NONEON-NOSVE-NEXT: fcvt h0, s0 2612; NONEON-NOSVE-NEXT: str h0, [sp, #26] 2613; NONEON-NOSVE-NEXT: scvtf s0, x8 2614; NONEON-NOSVE-NEXT: fcvt h0, s0 2615; NONEON-NOSVE-NEXT: str h0, [sp, #24] 2616; NONEON-NOSVE-NEXT: ldr d0, [sp, #24] 2617; NONEON-NOSVE-NEXT: add sp, sp, #32 2618; NONEON-NOSVE-NEXT: ret 2619 %res = sitofp <2 x i64> %op1 to <2 x half> 2620 ret <2 x half> %res 2621} 2622 2623define <4 x half> @scvtf_v4i64_v4f16(ptr %a) { 2624; CHECK-LABEL: scvtf_v4i64_v4f16: 2625; CHECK: // %bb.0: 2626; CHECK-NEXT: ldp q0, q1, [x0] 2627; CHECK-NEXT: ptrue p0.d, vl2 2628; CHECK-NEXT: scvtf z1.s, p0/m, z1.d 2629; CHECK-NEXT: scvtf z0.s, p0/m, z0.d 2630; CHECK-NEXT: ptrue p0.s, vl2 2631; CHECK-NEXT: uzp1 z1.s, z1.s, z1.s 2632; CHECK-NEXT: uzp1 z0.s, z0.s, z0.s 2633; CHECK-NEXT: splice z0.s, p0, z0.s, z1.s 2634; CHECK-NEXT: ptrue p0.s 2635; CHECK-NEXT: fcvt z0.h, p0/m, z0.s 2636; CHECK-NEXT: uzp1 z0.h, z0.h, z0.h 2637; CHECK-NEXT: // kill: def $d0 killed $d0 killed $z0 2638; CHECK-NEXT: ret 2639; 2640; NONEON-NOSVE-LABEL: scvtf_v4i64_v4f16: 2641; NONEON-NOSVE: // %bb.0: 2642; NONEON-NOSVE-NEXT: ldp q1, q0, [x0] 2643; NONEON-NOSVE-NEXT: stp q1, q0, [sp, #-48]! 2644; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 48 2645; NONEON-NOSVE-NEXT: ldp x8, x9, [sp, #16] 2646; NONEON-NOSVE-NEXT: scvtf s0, x9 2647; NONEON-NOSVE-NEXT: fcvt h0, s0 2648; NONEON-NOSVE-NEXT: str h0, [sp, #46] 2649; NONEON-NOSVE-NEXT: scvtf s0, x8 2650; NONEON-NOSVE-NEXT: ldp x8, x9, [sp] 2651; NONEON-NOSVE-NEXT: fcvt h0, s0 2652; NONEON-NOSVE-NEXT: str h0, [sp, #44] 2653; NONEON-NOSVE-NEXT: scvtf s0, x9 2654; NONEON-NOSVE-NEXT: fcvt h0, s0 2655; NONEON-NOSVE-NEXT: str h0, [sp, #42] 2656; NONEON-NOSVE-NEXT: scvtf s0, x8 2657; NONEON-NOSVE-NEXT: fcvt h0, s0 2658; NONEON-NOSVE-NEXT: str h0, [sp, #40] 2659; NONEON-NOSVE-NEXT: ldr d0, [sp, #40] 2660; NONEON-NOSVE-NEXT: add sp, sp, #48 2661; NONEON-NOSVE-NEXT: ret 2662 %op1 = load <4 x i64>, ptr %a 2663 %res = sitofp <4 x i64> %op1 to <4 x half> 2664 ret <4 x half> %res 2665} 2666 2667; 2668; SCVTF D -> S 2669; 2670 2671define <2 x float> @scvtf_v2i64_v2f32(<2 x i64> %op1) { 2672; CHECK-LABEL: scvtf_v2i64_v2f32: 2673; CHECK: // %bb.0: 2674; CHECK-NEXT: ptrue p0.d, vl2 2675; CHECK-NEXT: // kill: def $q0 killed $q0 def $z0 2676; CHECK-NEXT: scvtf z0.s, p0/m, z0.d 2677; CHECK-NEXT: uzp1 z0.s, z0.s, z0.s 2678; CHECK-NEXT: // kill: def $d0 killed $d0 killed $z0 2679; CHECK-NEXT: ret 2680; 2681; NONEON-NOSVE-LABEL: scvtf_v2i64_v2f32: 2682; NONEON-NOSVE: // %bb.0: 2683; NONEON-NOSVE-NEXT: str q0, [sp, #-32]! 2684; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 32 2685; NONEON-NOSVE-NEXT: ldp x8, x9, [sp] 2686; NONEON-NOSVE-NEXT: scvtf s1, x9 2687; NONEON-NOSVE-NEXT: scvtf s0, x8 2688; NONEON-NOSVE-NEXT: stp s0, s1, [sp, #24] 2689; NONEON-NOSVE-NEXT: ldr d0, [sp, #24] 2690; NONEON-NOSVE-NEXT: add sp, sp, #32 2691; NONEON-NOSVE-NEXT: ret 2692 %res = sitofp <2 x i64> %op1 to <2 x float> 2693 ret <2 x float> %res 2694} 2695 2696define <4 x float> @scvtf_v4i64_v4f32(ptr %a) { 2697; CHECK-LABEL: scvtf_v4i64_v4f32: 2698; CHECK: // %bb.0: 2699; CHECK-NEXT: ldp q0, q1, [x0] 2700; CHECK-NEXT: ptrue p0.d, vl2 2701; CHECK-NEXT: scvtf z1.s, p0/m, z1.d 2702; CHECK-NEXT: scvtf z0.s, p0/m, z0.d 2703; CHECK-NEXT: ptrue p0.s, vl2 2704; CHECK-NEXT: uzp1 z1.s, z1.s, z1.s 2705; CHECK-NEXT: uzp1 z0.s, z0.s, z0.s 2706; CHECK-NEXT: splice z0.s, p0, z0.s, z1.s 2707; CHECK-NEXT: // kill: def $q0 killed $q0 killed $z0 2708; CHECK-NEXT: ret 2709; 2710; NONEON-NOSVE-LABEL: scvtf_v4i64_v4f32: 2711; NONEON-NOSVE: // %bb.0: 2712; NONEON-NOSVE-NEXT: ldp q1, q0, [x0] 2713; NONEON-NOSVE-NEXT: stp q1, q0, [sp, #-48]! 2714; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 48 2715; NONEON-NOSVE-NEXT: ldp x8, x9, [sp, #16] 2716; NONEON-NOSVE-NEXT: scvtf s1, x9 2717; NONEON-NOSVE-NEXT: scvtf s0, x8 2718; NONEON-NOSVE-NEXT: ldp x8, x9, [sp] 2719; NONEON-NOSVE-NEXT: stp s0, s1, [sp, #40] 2720; NONEON-NOSVE-NEXT: scvtf s1, x9 2721; NONEON-NOSVE-NEXT: scvtf s0, x8 2722; NONEON-NOSVE-NEXT: stp s0, s1, [sp, #32] 2723; NONEON-NOSVE-NEXT: ldr q0, [sp, #32] 2724; NONEON-NOSVE-NEXT: add sp, sp, #48 2725; NONEON-NOSVE-NEXT: ret 2726 %op1 = load <4 x i64>, ptr %a 2727 %res = sitofp <4 x i64> %op1 to <4 x float> 2728 ret <4 x float> %res 2729} 2730 2731; 2732; SCVTF D -> D 2733; 2734 2735define <2 x double> @scvtf_v2i64_v2f64(<2 x i64> %op1) { 2736; CHECK-LABEL: scvtf_v2i64_v2f64: 2737; CHECK: // %bb.0: 2738; CHECK-NEXT: ptrue p0.d, vl2 2739; CHECK-NEXT: // kill: def $q0 killed $q0 def $z0 2740; CHECK-NEXT: scvtf z0.d, p0/m, z0.d 2741; CHECK-NEXT: // kill: def $q0 killed $q0 killed $z0 2742; CHECK-NEXT: ret 2743; 2744; NONEON-NOSVE-LABEL: scvtf_v2i64_v2f64: 2745; NONEON-NOSVE: // %bb.0: 2746; NONEON-NOSVE-NEXT: str q0, [sp, #-32]! 2747; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 32 2748; NONEON-NOSVE-NEXT: ldp x8, x9, [sp] 2749; NONEON-NOSVE-NEXT: scvtf d1, x9 2750; NONEON-NOSVE-NEXT: scvtf d0, x8 2751; NONEON-NOSVE-NEXT: stp d0, d1, [sp, #16] 2752; NONEON-NOSVE-NEXT: ldr q0, [sp, #16] 2753; NONEON-NOSVE-NEXT: add sp, sp, #32 2754; NONEON-NOSVE-NEXT: ret 2755 %res = sitofp <2 x i64> %op1 to <2 x double> 2756 ret <2 x double> %res 2757} 2758 2759define void @scvtf_v4i64_v4f64(ptr %a, ptr %b) { 2760; CHECK-LABEL: scvtf_v4i64_v4f64: 2761; CHECK: // %bb.0: 2762; CHECK-NEXT: ldp q0, q1, [x0] 2763; CHECK-NEXT: ptrue p0.d, vl2 2764; CHECK-NEXT: scvtf z0.d, p0/m, z0.d 2765; CHECK-NEXT: scvtf z1.d, p0/m, z1.d 2766; CHECK-NEXT: stp q0, q1, [x1] 2767; CHECK-NEXT: ret 2768; 2769; NONEON-NOSVE-LABEL: scvtf_v4i64_v4f64: 2770; NONEON-NOSVE: // %bb.0: 2771; NONEON-NOSVE-NEXT: ldp q1, q0, [x0] 2772; NONEON-NOSVE-NEXT: stp q1, q0, [sp, #-64]! 2773; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 64 2774; NONEON-NOSVE-NEXT: ldp x8, x9, [sp, #16] 2775; NONEON-NOSVE-NEXT: scvtf d1, x9 2776; NONEON-NOSVE-NEXT: scvtf d0, x8 2777; NONEON-NOSVE-NEXT: ldp x8, x9, [sp] 2778; NONEON-NOSVE-NEXT: stp d0, d1, [sp, #48] 2779; NONEON-NOSVE-NEXT: scvtf d1, x9 2780; NONEON-NOSVE-NEXT: scvtf d0, x8 2781; NONEON-NOSVE-NEXT: stp d0, d1, [sp, #32] 2782; NONEON-NOSVE-NEXT: ldp q0, q1, [sp, #32] 2783; NONEON-NOSVE-NEXT: stp q0, q1, [x1] 2784; NONEON-NOSVE-NEXT: add sp, sp, #64 2785; NONEON-NOSVE-NEXT: ret 2786 %op1 = load <4 x i64>, ptr %a 2787 %res = sitofp <4 x i64> %op1 to <4 x double> 2788 store <4 x double> %res, ptr %b 2789 ret void 2790} 2791 2792define half @scvtf_i16_f16(ptr %0) { 2793; CHECK-LABEL: scvtf_i16_f16: 2794; CHECK: // %bb.0: 2795; CHECK-NEXT: ldrsh w8, [x0] 2796; CHECK-NEXT: ptrue p0.s 2797; CHECK-NEXT: fmov s0, w8 2798; CHECK-NEXT: scvtf z0.h, p0/m, z0.s 2799; CHECK-NEXT: // kill: def $h0 killed $h0 killed $z0 2800; CHECK-NEXT: ret 2801; 2802; NONEON-NOSVE-LABEL: scvtf_i16_f16: 2803; NONEON-NOSVE: // %bb.0: 2804; NONEON-NOSVE-NEXT: ldrsh w8, [x0] 2805; NONEON-NOSVE-NEXT: scvtf s0, w8 2806; NONEON-NOSVE-NEXT: fcvt h0, s0 2807; NONEON-NOSVE-NEXT: ret 2808 %2 = load i16, ptr %0, align 64 2809 %3 = sitofp i16 %2 to half 2810 ret half %3 2811} 2812 2813define float @scvtf_i16_f32(ptr %0) { 2814; CHECK-LABEL: scvtf_i16_f32: 2815; CHECK: // %bb.0: 2816; CHECK-NEXT: ldrsh w8, [x0] 2817; CHECK-NEXT: ptrue p0.s 2818; CHECK-NEXT: fmov s0, w8 2819; CHECK-NEXT: scvtf z0.s, p0/m, z0.s 2820; CHECK-NEXT: // kill: def $s0 killed $s0 killed $z0 2821; CHECK-NEXT: ret 2822; 2823; NONEON-NOSVE-LABEL: scvtf_i16_f32: 2824; NONEON-NOSVE: // %bb.0: 2825; NONEON-NOSVE-NEXT: ldrsh w8, [x0] 2826; NONEON-NOSVE-NEXT: scvtf s0, w8 2827; NONEON-NOSVE-NEXT: ret 2828 %2 = load i16, ptr %0, align 64 2829 %3 = sitofp i16 %2 to float 2830 ret float %3 2831} 2832 2833define double @scvtf_i16_f64(ptr %0) { 2834; CHECK-LABEL: scvtf_i16_f64: 2835; CHECK: // %bb.0: 2836; CHECK-NEXT: ldrsh w8, [x0] 2837; CHECK-NEXT: scvtf d0, w8 2838; CHECK-NEXT: ret 2839; 2840; NONEON-NOSVE-LABEL: scvtf_i16_f64: 2841; NONEON-NOSVE: // %bb.0: 2842; NONEON-NOSVE-NEXT: ldrsh w8, [x0] 2843; NONEON-NOSVE-NEXT: scvtf d0, w8 2844; NONEON-NOSVE-NEXT: ret 2845 %2 = load i16, ptr %0, align 64 2846 %3 = sitofp i16 %2 to double 2847 ret double %3 2848} 2849 2850define half @scvtf_i32_f16(ptr %0) { 2851; CHECK-LABEL: scvtf_i32_f16: 2852; CHECK: // %bb.0: 2853; CHECK-NEXT: ptrue p0.s 2854; CHECK-NEXT: ldr s0, [x0] 2855; CHECK-NEXT: scvtf z0.h, p0/m, z0.s 2856; CHECK-NEXT: // kill: def $h0 killed $h0 killed $z0 2857; CHECK-NEXT: ret 2858; 2859; NONEON-NOSVE-LABEL: scvtf_i32_f16: 2860; NONEON-NOSVE: // %bb.0: 2861; NONEON-NOSVE-NEXT: ldr w8, [x0] 2862; NONEON-NOSVE-NEXT: scvtf s0, w8 2863; NONEON-NOSVE-NEXT: fcvt h0, s0 2864; NONEON-NOSVE-NEXT: ret 2865 %2 = load i32, ptr %0, align 64 2866 %3 = sitofp i32 %2 to half 2867 ret half %3 2868} 2869 2870define float @scvtf_i32_f32(ptr %0) { 2871; CHECK-LABEL: scvtf_i32_f32: 2872; CHECK: // %bb.0: 2873; CHECK-NEXT: ptrue p0.s 2874; CHECK-NEXT: ldr s0, [x0] 2875; CHECK-NEXT: scvtf z0.s, p0/m, z0.s 2876; CHECK-NEXT: // kill: def $s0 killed $s0 killed $z0 2877; CHECK-NEXT: ret 2878; 2879; NONEON-NOSVE-LABEL: scvtf_i32_f32: 2880; NONEON-NOSVE: // %bb.0: 2881; NONEON-NOSVE-NEXT: ldr w8, [x0] 2882; NONEON-NOSVE-NEXT: scvtf s0, w8 2883; NONEON-NOSVE-NEXT: ret 2884 %2 = load i32, ptr %0, align 64 2885 %3 = sitofp i32 %2 to float 2886 ret float %3 2887} 2888 2889define double @scvtf_i32_f64(ptr %0) { 2890; CHECK-LABEL: scvtf_i32_f64: 2891; CHECK: // %bb.0: 2892; CHECK-NEXT: ldr w8, [x0] 2893; CHECK-NEXT: scvtf d0, w8 2894; CHECK-NEXT: ret 2895; 2896; NONEON-NOSVE-LABEL: scvtf_i32_f64: 2897; NONEON-NOSVE: // %bb.0: 2898; NONEON-NOSVE-NEXT: ldr w8, [x0] 2899; NONEON-NOSVE-NEXT: scvtf d0, w8 2900; NONEON-NOSVE-NEXT: ret 2901 %2 = load i32, ptr %0, align 64 2902 %3 = sitofp i32 %2 to double 2903 ret double %3 2904} 2905 2906define half @scvtf_i64_f16(ptr %0) { 2907; CHECK-LABEL: scvtf_i64_f16: 2908; CHECK: // %bb.0: 2909; CHECK-NEXT: ptrue p0.d 2910; CHECK-NEXT: ldr d0, [x0] 2911; CHECK-NEXT: scvtf z0.h, p0/m, z0.d 2912; CHECK-NEXT: // kill: def $h0 killed $h0 killed $z0 2913; CHECK-NEXT: ret 2914; 2915; NONEON-NOSVE-LABEL: scvtf_i64_f16: 2916; NONEON-NOSVE: // %bb.0: 2917; NONEON-NOSVE-NEXT: ldr x8, [x0] 2918; NONEON-NOSVE-NEXT: scvtf s0, x8 2919; NONEON-NOSVE-NEXT: fcvt h0, s0 2920; NONEON-NOSVE-NEXT: ret 2921 %2 = load i64, ptr %0, align 64 2922 %3 = sitofp i64 %2 to half 2923 ret half %3 2924} 2925 2926define float @scvtf_i64_f32(ptr %0) { 2927; CHECK-LABEL: scvtf_i64_f32: 2928; CHECK: // %bb.0: 2929; CHECK-NEXT: ptrue p0.d 2930; CHECK-NEXT: ldr d0, [x0] 2931; CHECK-NEXT: scvtf z0.s, p0/m, z0.d 2932; CHECK-NEXT: // kill: def $s0 killed $s0 killed $z0 2933; CHECK-NEXT: ret 2934; 2935; NONEON-NOSVE-LABEL: scvtf_i64_f32: 2936; NONEON-NOSVE: // %bb.0: 2937; NONEON-NOSVE-NEXT: ldr x8, [x0] 2938; NONEON-NOSVE-NEXT: scvtf s0, x8 2939; NONEON-NOSVE-NEXT: ret 2940 %2 = load i64, ptr %0, align 64 2941 %3 = sitofp i64 %2 to float 2942 ret float %3 2943} 2944 2945define double @scvtf_i64_f64(ptr %0) { 2946; CHECK-LABEL: scvtf_i64_f64: 2947; CHECK: // %bb.0: 2948; CHECK-NEXT: ptrue p0.d 2949; CHECK-NEXT: ldr d0, [x0] 2950; CHECK-NEXT: scvtf z0.d, p0/m, z0.d 2951; CHECK-NEXT: // kill: def $d0 killed $d0 killed $z0 2952; CHECK-NEXT: ret 2953; 2954; NONEON-NOSVE-LABEL: scvtf_i64_f64: 2955; NONEON-NOSVE: // %bb.0: 2956; NONEON-NOSVE-NEXT: ldr x8, [x0] 2957; NONEON-NOSVE-NEXT: scvtf d0, x8 2958; NONEON-NOSVE-NEXT: ret 2959 %2 = load i64, ptr %0, align 64 2960 %3 = sitofp i64 %2 to double 2961 ret double %3 2962} 2963 2964define half @ucvtf_i16_f16(ptr %0) { 2965; CHECK-LABEL: ucvtf_i16_f16: 2966; CHECK: // %bb.0: 2967; CHECK-NEXT: ldrh w8, [x0] 2968; CHECK-NEXT: ptrue p0.s 2969; CHECK-NEXT: fmov s0, w8 2970; CHECK-NEXT: ucvtf z0.h, p0/m, z0.s 2971; CHECK-NEXT: // kill: def $h0 killed $h0 killed $z0 2972; CHECK-NEXT: ret 2973; 2974; NONEON-NOSVE-LABEL: ucvtf_i16_f16: 2975; NONEON-NOSVE: // %bb.0: 2976; NONEON-NOSVE-NEXT: ldrh w8, [x0] 2977; NONEON-NOSVE-NEXT: ucvtf s0, w8 2978; NONEON-NOSVE-NEXT: fcvt h0, s0 2979; NONEON-NOSVE-NEXT: ret 2980 %2 = load i16, ptr %0, align 64 2981 %3 = uitofp i16 %2 to half 2982 ret half %3 2983} 2984 2985define float @ucvtf_i16_f32(ptr %0) { 2986; CHECK-LABEL: ucvtf_i16_f32: 2987; CHECK: // %bb.0: 2988; CHECK-NEXT: ldrh w8, [x0] 2989; CHECK-NEXT: ptrue p0.s 2990; CHECK-NEXT: fmov s0, w8 2991; CHECK-NEXT: ucvtf z0.s, p0/m, z0.s 2992; CHECK-NEXT: // kill: def $s0 killed $s0 killed $z0 2993; CHECK-NEXT: ret 2994; 2995; NONEON-NOSVE-LABEL: ucvtf_i16_f32: 2996; NONEON-NOSVE: // %bb.0: 2997; NONEON-NOSVE-NEXT: ldrh w8, [x0] 2998; NONEON-NOSVE-NEXT: ucvtf s0, w8 2999; NONEON-NOSVE-NEXT: ret 3000 %2 = load i16, ptr %0, align 64 3001 %3 = uitofp i16 %2 to float 3002 ret float %3 3003} 3004 3005define double @ucvtf_i16_f64(ptr %0) { 3006; CHECK-LABEL: ucvtf_i16_f64: 3007; CHECK: // %bb.0: 3008; CHECK-NEXT: ldrh w8, [x0] 3009; CHECK-NEXT: ucvtf d0, w8 3010; CHECK-NEXT: ret 3011; 3012; NONEON-NOSVE-LABEL: ucvtf_i16_f64: 3013; NONEON-NOSVE: // %bb.0: 3014; NONEON-NOSVE-NEXT: ldrh w8, [x0] 3015; NONEON-NOSVE-NEXT: ucvtf d0, w8 3016; NONEON-NOSVE-NEXT: ret 3017 %2 = load i16, ptr %0, align 64 3018 %3 = uitofp i16 %2 to double 3019 ret double %3 3020} 3021 3022define half @ucvtf_i32_f16(ptr %0) { 3023; CHECK-LABEL: ucvtf_i32_f16: 3024; CHECK: // %bb.0: 3025; CHECK-NEXT: ptrue p0.s 3026; CHECK-NEXT: ldr s0, [x0] 3027; CHECK-NEXT: ucvtf z0.h, p0/m, z0.s 3028; CHECK-NEXT: // kill: def $h0 killed $h0 killed $z0 3029; CHECK-NEXT: ret 3030; 3031; NONEON-NOSVE-LABEL: ucvtf_i32_f16: 3032; NONEON-NOSVE: // %bb.0: 3033; NONEON-NOSVE-NEXT: ldr w8, [x0] 3034; NONEON-NOSVE-NEXT: ucvtf s0, w8 3035; NONEON-NOSVE-NEXT: fcvt h0, s0 3036; NONEON-NOSVE-NEXT: ret 3037 %2 = load i32, ptr %0, align 64 3038 %3 = uitofp i32 %2 to half 3039 ret half %3 3040} 3041 3042define float @ucvtf_i32_f32(ptr %0) { 3043; CHECK-LABEL: ucvtf_i32_f32: 3044; CHECK: // %bb.0: 3045; CHECK-NEXT: ptrue p0.s 3046; CHECK-NEXT: ldr s0, [x0] 3047; CHECK-NEXT: ucvtf z0.s, p0/m, z0.s 3048; CHECK-NEXT: // kill: def $s0 killed $s0 killed $z0 3049; CHECK-NEXT: ret 3050; 3051; NONEON-NOSVE-LABEL: ucvtf_i32_f32: 3052; NONEON-NOSVE: // %bb.0: 3053; NONEON-NOSVE-NEXT: ldr w8, [x0] 3054; NONEON-NOSVE-NEXT: ucvtf s0, w8 3055; NONEON-NOSVE-NEXT: ret 3056 %2 = load i32, ptr %0, align 64 3057 %3 = uitofp i32 %2 to float 3058 ret float %3 3059} 3060 3061define double @ucvtf_i32_f64(ptr %0) { 3062; CHECK-LABEL: ucvtf_i32_f64: 3063; CHECK: // %bb.0: 3064; CHECK-NEXT: ldr w8, [x0] 3065; CHECK-NEXT: ucvtf d0, w8 3066; CHECK-NEXT: ret 3067; 3068; NONEON-NOSVE-LABEL: ucvtf_i32_f64: 3069; NONEON-NOSVE: // %bb.0: 3070; NONEON-NOSVE-NEXT: ldr w8, [x0] 3071; NONEON-NOSVE-NEXT: ucvtf d0, w8 3072; NONEON-NOSVE-NEXT: ret 3073 %2 = load i32, ptr %0, align 64 3074 %3 = uitofp i32 %2 to double 3075 ret double %3 3076} 3077 3078define half @ucvtf_i64_f16(ptr %0) { 3079; CHECK-LABEL: ucvtf_i64_f16: 3080; CHECK: // %bb.0: 3081; CHECK-NEXT: ptrue p0.d 3082; CHECK-NEXT: ldr d0, [x0] 3083; CHECK-NEXT: ucvtf z0.h, p0/m, z0.d 3084; CHECK-NEXT: // kill: def $h0 killed $h0 killed $z0 3085; CHECK-NEXT: ret 3086; 3087; NONEON-NOSVE-LABEL: ucvtf_i64_f16: 3088; NONEON-NOSVE: // %bb.0: 3089; NONEON-NOSVE-NEXT: ldr x8, [x0] 3090; NONEON-NOSVE-NEXT: ucvtf s0, x8 3091; NONEON-NOSVE-NEXT: fcvt h0, s0 3092; NONEON-NOSVE-NEXT: ret 3093 %2 = load i64, ptr %0, align 64 3094 %3 = uitofp i64 %2 to half 3095 ret half %3 3096} 3097 3098define float @ucvtf_i64_f32(ptr %0) { 3099; CHECK-LABEL: ucvtf_i64_f32: 3100; CHECK: // %bb.0: 3101; CHECK-NEXT: ptrue p0.d 3102; CHECK-NEXT: ldr d0, [x0] 3103; CHECK-NEXT: ucvtf z0.s, p0/m, z0.d 3104; CHECK-NEXT: // kill: def $s0 killed $s0 killed $z0 3105; CHECK-NEXT: ret 3106; 3107; NONEON-NOSVE-LABEL: ucvtf_i64_f32: 3108; NONEON-NOSVE: // %bb.0: 3109; NONEON-NOSVE-NEXT: ldr x8, [x0] 3110; NONEON-NOSVE-NEXT: ucvtf s0, x8 3111; NONEON-NOSVE-NEXT: ret 3112 %2 = load i64, ptr %0, align 64 3113 %3 = uitofp i64 %2 to float 3114 ret float %3 3115} 3116 3117define double @ucvtf_i64_f64(ptr %0) { 3118; CHECK-LABEL: ucvtf_i64_f64: 3119; CHECK: // %bb.0: 3120; CHECK-NEXT: ptrue p0.d 3121; CHECK-NEXT: ldr d0, [x0] 3122; CHECK-NEXT: ucvtf z0.d, p0/m, z0.d 3123; CHECK-NEXT: // kill: def $d0 killed $d0 killed $z0 3124; CHECK-NEXT: ret 3125; 3126; NONEON-NOSVE-LABEL: ucvtf_i64_f64: 3127; NONEON-NOSVE: // %bb.0: 3128; NONEON-NOSVE-NEXT: ldr x8, [x0] 3129; NONEON-NOSVE-NEXT: ucvtf d0, x8 3130; NONEON-NOSVE-NEXT: ret 3131 %2 = load i64, ptr %0, align 64 3132 %3 = uitofp i64 %2 to double 3133 ret double %3 3134} 3135