1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 3 2; RUN: llc -mtriple=aarch64 -global-isel=0 -verify-machineinstrs %s -o - | FileCheck %s --check-prefixes=CHECK,CHECK-SD 3; RUN: llc -mtriple=aarch64 -global-isel=1 -verify-machineinstrs %s -o - | FileCheck %s --check-prefixes=CHECK,CHECK-GI 4 5define double @fpext_f32_f64(float %a) { 6; CHECK-LABEL: fpext_f32_f64: 7; CHECK: // %bb.0: // %entry 8; CHECK-NEXT: fcvt d0, s0 9; CHECK-NEXT: ret 10entry: 11 %c = fpext float %a to double 12 ret double %c 13} 14 15define double @fpext_f16_f64(half %a) { 16; CHECK-LABEL: fpext_f16_f64: 17; CHECK: // %bb.0: // %entry 18; CHECK-NEXT: fcvt d0, h0 19; CHECK-NEXT: ret 20entry: 21 %c = fpext half %a to double 22 ret double %c 23} 24 25define float @fpext_f16_f32(half %a) { 26; CHECK-LABEL: fpext_f16_f32: 27; CHECK: // %bb.0: // %entry 28; CHECK-NEXT: fcvt s0, h0 29; CHECK-NEXT: ret 30entry: 31 %c = fpext half %a to float 32 ret float %c 33} 34 35define fp128 @fpext_f16_f128(half %a) { 36; CHECK-LABEL: fpext_f16_f128: 37; CHECK: // %bb.0: // %entry 38; CHECK-NEXT: b __extendhftf2 39entry: 40 %c = fpext half %a to fp128 41 ret fp128 %c 42} 43 44define fp128 @fpext_f32_f128(float %a) { 45; CHECK-LABEL: fpext_f32_f128: 46; CHECK: // %bb.0: // %entry 47; CHECK-NEXT: b __extendsftf2 48entry: 49 %c = fpext float %a to fp128 50 ret fp128 %c 51} 52 53define fp128 @fpext_f64_f128(double %a) { 54; CHECK-LABEL: fpext_f64_f128: 55; CHECK: // %bb.0: // %entry 56; CHECK-NEXT: b __extenddftf2 57entry: 58 %c = fpext double %a to fp128 59 ret fp128 %c 60} 61 62define <2 x double> @fpext_v2f32_v2f64(<2 x float> %a) { 63; CHECK-LABEL: fpext_v2f32_v2f64: 64; CHECK: // %bb.0: // %entry 65; CHECK-NEXT: fcvtl v0.2d, v0.2s 66; CHECK-NEXT: ret 67entry: 68 %c = fpext <2 x float> %a to <2 x double> 69 ret <2 x double> %c 70} 71 72define <3 x double> @fpext_v3f32_v3f64(<3 x float> %a) { 73; CHECK-SD-LABEL: fpext_v3f32_v3f64: 74; CHECK-SD: // %bb.0: // %entry 75; CHECK-SD-NEXT: fcvtl v3.2d, v0.2s 76; CHECK-SD-NEXT: fcvtl2 v2.2d, v0.4s 77; CHECK-SD-NEXT: // kill: def $d2 killed $d2 killed $q2 78; CHECK-SD-NEXT: fmov d0, d3 79; CHECK-SD-NEXT: ext v1.16b, v3.16b, v3.16b, #8 80; CHECK-SD-NEXT: // kill: def $d1 killed $d1 killed $q1 81; CHECK-SD-NEXT: ret 82; 83; CHECK-GI-LABEL: fpext_v3f32_v3f64: 84; CHECK-GI: // %bb.0: // %entry 85; CHECK-GI-NEXT: mov s1, v0.s[2] 86; CHECK-GI-NEXT: fcvtl v0.2d, v0.2s 87; CHECK-GI-NEXT: fcvt d2, s1 88; CHECK-GI-NEXT: mov d1, v0.d[1] 89; CHECK-GI-NEXT: // kill: def $d0 killed $d0 killed $q0 90; CHECK-GI-NEXT: ret 91entry: 92 %c = fpext <3 x float> %a to <3 x double> 93 ret <3 x double> %c 94} 95 96define <4 x fp128> @fpext_v4f16_v4f128(<4 x half> %a) { 97; CHECK-SD-LABEL: fpext_v4f16_v4f128: 98; CHECK-SD: // %bb.0: // %entry 99; CHECK-SD-NEXT: sub sp, sp, #64 100; CHECK-SD-NEXT: str x30, [sp, #48] // 8-byte Folded Spill 101; CHECK-SD-NEXT: .cfi_def_cfa_offset 64 102; CHECK-SD-NEXT: .cfi_offset w30, -16 103; CHECK-SD-NEXT: // kill: def $d0 killed $d0 def $q0 104; CHECK-SD-NEXT: str q0, [sp, #32] // 16-byte Folded Spill 105; CHECK-SD-NEXT: // kill: def $h0 killed $h0 killed $q0 106; CHECK-SD-NEXT: bl __extendhftf2 107; CHECK-SD-NEXT: ldr q1, [sp, #32] // 16-byte Folded Reload 108; CHECK-SD-NEXT: str q0, [sp, #16] // 16-byte Folded Spill 109; CHECK-SD-NEXT: mov h1, v1.h[1] 110; CHECK-SD-NEXT: fmov s0, s1 111; CHECK-SD-NEXT: bl __extendhftf2 112; CHECK-SD-NEXT: ldr q1, [sp, #32] // 16-byte Folded Reload 113; CHECK-SD-NEXT: str q0, [sp] // 16-byte Folded Spill 114; CHECK-SD-NEXT: mov h1, v1.h[2] 115; CHECK-SD-NEXT: fmov s0, s1 116; CHECK-SD-NEXT: bl __extendhftf2 117; CHECK-SD-NEXT: ldr q1, [sp, #32] // 16-byte Folded Reload 118; CHECK-SD-NEXT: str q0, [sp, #32] // 16-byte Folded Spill 119; CHECK-SD-NEXT: mov h1, v1.h[3] 120; CHECK-SD-NEXT: fmov s0, s1 121; CHECK-SD-NEXT: bl __extendhftf2 122; CHECK-SD-NEXT: mov v3.16b, v0.16b 123; CHECK-SD-NEXT: ldp q1, q0, [sp] // 32-byte Folded Reload 124; CHECK-SD-NEXT: ldr q2, [sp, #32] // 16-byte Folded Reload 125; CHECK-SD-NEXT: ldr x30, [sp, #48] // 8-byte Folded Reload 126; CHECK-SD-NEXT: add sp, sp, #64 127; CHECK-SD-NEXT: ret 128; 129; CHECK-GI-LABEL: fpext_v4f16_v4f128: 130; CHECK-GI: // %bb.0: // %entry 131; CHECK-GI-NEXT: sub sp, sp, #80 132; CHECK-GI-NEXT: str d10, [sp, #48] // 8-byte Folded Spill 133; CHECK-GI-NEXT: stp d9, d8, [sp, #56] // 16-byte Folded Spill 134; CHECK-GI-NEXT: str x30, [sp, #72] // 8-byte Folded Spill 135; CHECK-GI-NEXT: .cfi_def_cfa_offset 80 136; CHECK-GI-NEXT: .cfi_offset w30, -8 137; CHECK-GI-NEXT: .cfi_offset b8, -16 138; CHECK-GI-NEXT: .cfi_offset b9, -24 139; CHECK-GI-NEXT: .cfi_offset b10, -32 140; CHECK-GI-NEXT: // kill: def $d0 killed $d0 def $q0 141; CHECK-GI-NEXT: mov h8, v0.h[1] 142; CHECK-GI-NEXT: mov h9, v0.h[2] 143; CHECK-GI-NEXT: mov h10, v0.h[3] 144; CHECK-GI-NEXT: // kill: def $h0 killed $h0 killed $q0 145; CHECK-GI-NEXT: bl __extendhftf2 146; CHECK-GI-NEXT: str q0, [sp, #32] // 16-byte Folded Spill 147; CHECK-GI-NEXT: fmov s0, s8 148; CHECK-GI-NEXT: bl __extendhftf2 149; CHECK-GI-NEXT: str q0, [sp, #16] // 16-byte Folded Spill 150; CHECK-GI-NEXT: fmov s0, s9 151; CHECK-GI-NEXT: bl __extendhftf2 152; CHECK-GI-NEXT: str q0, [sp] // 16-byte Folded Spill 153; CHECK-GI-NEXT: fmov s0, s10 154; CHECK-GI-NEXT: bl __extendhftf2 155; CHECK-GI-NEXT: mov v3.16b, v0.16b 156; CHECK-GI-NEXT: ldp q1, q0, [sp, #16] // 32-byte Folded Reload 157; CHECK-GI-NEXT: ldp d9, d8, [sp, #56] // 16-byte Folded Reload 158; CHECK-GI-NEXT: ldr q2, [sp] // 16-byte Folded Reload 159; CHECK-GI-NEXT: ldr x30, [sp, #72] // 8-byte Folded Reload 160; CHECK-GI-NEXT: ldr d10, [sp, #48] // 8-byte Folded Reload 161; CHECK-GI-NEXT: add sp, sp, #80 162; CHECK-GI-NEXT: ret 163entry: 164 %c = fpext <4 x half> %a to <4 x fp128> 165 ret <4 x fp128> %c 166} 167 168define <4 x fp128> @fpext_v4f32_v4f128(<4 x float> %a) { 169; CHECK-SD-LABEL: fpext_v4f32_v4f128: 170; CHECK-SD: // %bb.0: // %entry 171; CHECK-SD-NEXT: sub sp, sp, #80 172; CHECK-SD-NEXT: str x30, [sp, #64] // 8-byte Folded Spill 173; CHECK-SD-NEXT: .cfi_def_cfa_offset 80 174; CHECK-SD-NEXT: .cfi_offset w30, -16 175; CHECK-SD-NEXT: str q0, [sp, #48] // 16-byte Folded Spill 176; CHECK-SD-NEXT: ext v0.16b, v0.16b, v0.16b, #8 177; CHECK-SD-NEXT: str q0, [sp, #32] // 16-byte Folded Spill 178; CHECK-SD-NEXT: // kill: def $s0 killed $s0 killed $q0 179; CHECK-SD-NEXT: bl __extendsftf2 180; CHECK-SD-NEXT: ldr q1, [sp, #32] // 16-byte Folded Reload 181; CHECK-SD-NEXT: str q0, [sp, #32] // 16-byte Folded Spill 182; CHECK-SD-NEXT: mov s1, v1.s[1] 183; CHECK-SD-NEXT: fmov s0, s1 184; CHECK-SD-NEXT: bl __extendsftf2 185; CHECK-SD-NEXT: str q0, [sp, #16] // 16-byte Folded Spill 186; CHECK-SD-NEXT: ldr q0, [sp, #48] // 16-byte Folded Reload 187; CHECK-SD-NEXT: // kill: def $s0 killed $s0 killed $q0 188; CHECK-SD-NEXT: bl __extendsftf2 189; CHECK-SD-NEXT: str q0, [sp] // 16-byte Folded Spill 190; CHECK-SD-NEXT: ldr q0, [sp, #48] // 16-byte Folded Reload 191; CHECK-SD-NEXT: mov s0, v0.s[1] 192; CHECK-SD-NEXT: bl __extendsftf2 193; CHECK-SD-NEXT: mov v1.16b, v0.16b 194; CHECK-SD-NEXT: ldp q0, q3, [sp] // 32-byte Folded Reload 195; CHECK-SD-NEXT: ldr q2, [sp, #32] // 16-byte Folded Reload 196; CHECK-SD-NEXT: ldr x30, [sp, #64] // 8-byte Folded Reload 197; CHECK-SD-NEXT: add sp, sp, #80 198; CHECK-SD-NEXT: ret 199; 200; CHECK-GI-LABEL: fpext_v4f32_v4f128: 201; CHECK-GI: // %bb.0: // %entry 202; CHECK-GI-NEXT: sub sp, sp, #80 203; CHECK-GI-NEXT: str d10, [sp, #48] // 8-byte Folded Spill 204; CHECK-GI-NEXT: stp d9, d8, [sp, #56] // 16-byte Folded Spill 205; CHECK-GI-NEXT: str x30, [sp, #72] // 8-byte Folded Spill 206; CHECK-GI-NEXT: .cfi_def_cfa_offset 80 207; CHECK-GI-NEXT: .cfi_offset w30, -8 208; CHECK-GI-NEXT: .cfi_offset b8, -16 209; CHECK-GI-NEXT: .cfi_offset b9, -24 210; CHECK-GI-NEXT: .cfi_offset b10, -32 211; CHECK-GI-NEXT: mov s8, v0.s[1] 212; CHECK-GI-NEXT: mov s9, v0.s[2] 213; CHECK-GI-NEXT: mov s10, v0.s[3] 214; CHECK-GI-NEXT: // kill: def $s0 killed $s0 killed $q0 215; CHECK-GI-NEXT: bl __extendsftf2 216; CHECK-GI-NEXT: str q0, [sp, #32] // 16-byte Folded Spill 217; CHECK-GI-NEXT: fmov s0, s8 218; CHECK-GI-NEXT: bl __extendsftf2 219; CHECK-GI-NEXT: str q0, [sp, #16] // 16-byte Folded Spill 220; CHECK-GI-NEXT: fmov s0, s9 221; CHECK-GI-NEXT: bl __extendsftf2 222; CHECK-GI-NEXT: str q0, [sp] // 16-byte Folded Spill 223; CHECK-GI-NEXT: fmov s0, s10 224; CHECK-GI-NEXT: bl __extendsftf2 225; CHECK-GI-NEXT: mov v3.16b, v0.16b 226; CHECK-GI-NEXT: ldp q1, q0, [sp, #16] // 32-byte Folded Reload 227; CHECK-GI-NEXT: ldp d9, d8, [sp, #56] // 16-byte Folded Reload 228; CHECK-GI-NEXT: ldr q2, [sp] // 16-byte Folded Reload 229; CHECK-GI-NEXT: ldr x30, [sp, #72] // 8-byte Folded Reload 230; CHECK-GI-NEXT: ldr d10, [sp, #48] // 8-byte Folded Reload 231; CHECK-GI-NEXT: add sp, sp, #80 232; CHECK-GI-NEXT: ret 233entry: 234 %c = fpext <4 x float> %a to <4 x fp128> 235 ret <4 x fp128> %c 236} 237 238define <4 x fp128> @fpext_v4f64_v4f128(<4 x double> %a) { 239; CHECK-SD-LABEL: fpext_v4f64_v4f128: 240; CHECK-SD: // %bb.0: // %entry 241; CHECK-SD-NEXT: sub sp, sp, #80 242; CHECK-SD-NEXT: str x30, [sp, #64] // 8-byte Folded Spill 243; CHECK-SD-NEXT: .cfi_def_cfa_offset 80 244; CHECK-SD-NEXT: .cfi_offset w30, -16 245; CHECK-SD-NEXT: str q1, [sp, #48] // 16-byte Folded Spill 246; CHECK-SD-NEXT: str q0, [sp, #16] // 16-byte Folded Spill 247; CHECK-SD-NEXT: // kill: def $d0 killed $d0 killed $q0 248; CHECK-SD-NEXT: bl __extenddftf2 249; CHECK-SD-NEXT: str q0, [sp, #32] // 16-byte Folded Spill 250; CHECK-SD-NEXT: ldr q0, [sp, #16] // 16-byte Folded Reload 251; CHECK-SD-NEXT: mov d0, v0.d[1] 252; CHECK-SD-NEXT: bl __extenddftf2 253; CHECK-SD-NEXT: str q0, [sp, #16] // 16-byte Folded Spill 254; CHECK-SD-NEXT: ldr q0, [sp, #48] // 16-byte Folded Reload 255; CHECK-SD-NEXT: // kill: def $d0 killed $d0 killed $q0 256; CHECK-SD-NEXT: bl __extenddftf2 257; CHECK-SD-NEXT: str q0, [sp] // 16-byte Folded Spill 258; CHECK-SD-NEXT: ldr q0, [sp, #48] // 16-byte Folded Reload 259; CHECK-SD-NEXT: mov d0, v0.d[1] 260; CHECK-SD-NEXT: bl __extenddftf2 261; CHECK-SD-NEXT: mov v3.16b, v0.16b 262; CHECK-SD-NEXT: ldp q1, q0, [sp, #16] // 32-byte Folded Reload 263; CHECK-SD-NEXT: ldr q2, [sp] // 16-byte Folded Reload 264; CHECK-SD-NEXT: ldr x30, [sp, #64] // 8-byte Folded Reload 265; CHECK-SD-NEXT: add sp, sp, #80 266; CHECK-SD-NEXT: ret 267; 268; CHECK-GI-LABEL: fpext_v4f64_v4f128: 269; CHECK-GI: // %bb.0: // %entry 270; CHECK-GI-NEXT: sub sp, sp, #80 271; CHECK-GI-NEXT: stp d9, d8, [sp, #48] // 16-byte Folded Spill 272; CHECK-GI-NEXT: str x30, [sp, #64] // 8-byte Folded Spill 273; CHECK-GI-NEXT: .cfi_def_cfa_offset 80 274; CHECK-GI-NEXT: .cfi_offset w30, -16 275; CHECK-GI-NEXT: .cfi_offset b8, -24 276; CHECK-GI-NEXT: .cfi_offset b9, -32 277; CHECK-GI-NEXT: str q1, [sp] // 16-byte Folded Spill 278; CHECK-GI-NEXT: mov d8, v0.d[1] 279; CHECK-GI-NEXT: mov d9, v1.d[1] 280; CHECK-GI-NEXT: // kill: def $d0 killed $d0 killed $q0 281; CHECK-GI-NEXT: bl __extenddftf2 282; CHECK-GI-NEXT: str q0, [sp, #32] // 16-byte Folded Spill 283; CHECK-GI-NEXT: fmov d0, d8 284; CHECK-GI-NEXT: bl __extenddftf2 285; CHECK-GI-NEXT: str q0, [sp, #16] // 16-byte Folded Spill 286; CHECK-GI-NEXT: ldr q0, [sp] // 16-byte Folded Reload 287; CHECK-GI-NEXT: // kill: def $d0 killed $d0 killed $q0 288; CHECK-GI-NEXT: bl __extenddftf2 289; CHECK-GI-NEXT: str q0, [sp] // 16-byte Folded Spill 290; CHECK-GI-NEXT: fmov d0, d9 291; CHECK-GI-NEXT: bl __extenddftf2 292; CHECK-GI-NEXT: mov v3.16b, v0.16b 293; CHECK-GI-NEXT: ldp q1, q0, [sp, #16] // 32-byte Folded Reload 294; CHECK-GI-NEXT: ldp d9, d8, [sp, #48] // 16-byte Folded Reload 295; CHECK-GI-NEXT: ldr q2, [sp] // 16-byte Folded Reload 296; CHECK-GI-NEXT: ldr x30, [sp, #64] // 8-byte Folded Reload 297; CHECK-GI-NEXT: add sp, sp, #80 298; CHECK-GI-NEXT: ret 299entry: 300 %c = fpext <4 x double> %a to <4 x fp128> 301 ret <4 x fp128> %c 302} 303 304define <4 x double> @fpext_v4f32_v4f64(<4 x float> %a) { 305; CHECK-SD-LABEL: fpext_v4f32_v4f64: 306; CHECK-SD: // %bb.0: // %entry 307; CHECK-SD-NEXT: fcvtl2 v1.2d, v0.4s 308; CHECK-SD-NEXT: fcvtl v0.2d, v0.2s 309; CHECK-SD-NEXT: ret 310; 311; CHECK-GI-LABEL: fpext_v4f32_v4f64: 312; CHECK-GI: // %bb.0: // %entry 313; CHECK-GI-NEXT: fcvtl v2.2d, v0.2s 314; CHECK-GI-NEXT: fcvtl2 v1.2d, v0.4s 315; CHECK-GI-NEXT: mov v0.16b, v2.16b 316; CHECK-GI-NEXT: ret 317entry: 318 %c = fpext <4 x float> %a to <4 x double> 319 ret <4 x double> %c 320} 321 322define <2 x double> @fpext_v2f16_v2f64(<2 x half> %a) { 323; CHECK-SD-LABEL: fpext_v2f16_v2f64: 324; CHECK-SD: // %bb.0: // %entry 325; CHECK-SD-NEXT: fcvtl v0.4s, v0.4h 326; CHECK-SD-NEXT: fcvtl v0.2d, v0.2s 327; CHECK-SD-NEXT: ret 328; 329; CHECK-GI-LABEL: fpext_v2f16_v2f64: 330; CHECK-GI: // %bb.0: // %entry 331; CHECK-GI-NEXT: // kill: def $d0 killed $d0 def $q0 332; CHECK-GI-NEXT: mov h1, v0.h[1] 333; CHECK-GI-NEXT: fcvt d0, h0 334; CHECK-GI-NEXT: fcvt d1, h1 335; CHECK-GI-NEXT: mov v0.d[1], v1.d[0] 336; CHECK-GI-NEXT: ret 337entry: 338 %c = fpext <2 x half> %a to <2 x double> 339 ret <2 x double> %c 340} 341 342define <3 x double> @fpext_v3f16_v3f64(<3 x half> %a) { 343; CHECK-SD-LABEL: fpext_v3f16_v3f64: 344; CHECK-SD: // %bb.0: // %entry 345; CHECK-SD-NEXT: fcvtl v1.4s, v0.4h 346; CHECK-SD-NEXT: fcvtl v0.2d, v1.2s 347; CHECK-SD-NEXT: fcvtl2 v2.2d, v1.4s 348; CHECK-SD-NEXT: // kill: def $d2 killed $d2 killed $q2 349; CHECK-SD-NEXT: ext v1.16b, v0.16b, v0.16b, #8 350; CHECK-SD-NEXT: // kill: def $d0 killed $d0 killed $q0 351; CHECK-SD-NEXT: // kill: def $d1 killed $d1 killed $q1 352; CHECK-SD-NEXT: ret 353; 354; CHECK-GI-LABEL: fpext_v3f16_v3f64: 355; CHECK-GI: // %bb.0: // %entry 356; CHECK-GI-NEXT: // kill: def $d0 killed $d0 def $q0 357; CHECK-GI-NEXT: mov h1, v0.h[1] 358; CHECK-GI-NEXT: mov h2, v0.h[2] 359; CHECK-GI-NEXT: fcvt d0, h0 360; CHECK-GI-NEXT: fcvt d1, h1 361; CHECK-GI-NEXT: fcvt d2, h2 362; CHECK-GI-NEXT: ret 363entry: 364 %c = fpext <3 x half> %a to <3 x double> 365 ret <3 x double> %c 366} 367 368define <4 x double> @fpext_v4f16_v4f64(<4 x half> %a) { 369; CHECK-SD-LABEL: fpext_v4f16_v4f64: 370; CHECK-SD: // %bb.0: // %entry 371; CHECK-SD-NEXT: fcvtl v0.4s, v0.4h 372; CHECK-SD-NEXT: fcvtl2 v1.2d, v0.4s 373; CHECK-SD-NEXT: fcvtl v0.2d, v0.2s 374; CHECK-SD-NEXT: ret 375; 376; CHECK-GI-LABEL: fpext_v4f16_v4f64: 377; CHECK-GI: // %bb.0: // %entry 378; CHECK-GI-NEXT: // kill: def $d0 killed $d0 def $q0 379; CHECK-GI-NEXT: mov h1, v0.h[1] 380; CHECK-GI-NEXT: mov h2, v0.h[2] 381; CHECK-GI-NEXT: mov h3, v0.h[3] 382; CHECK-GI-NEXT: fcvt d0, h0 383; CHECK-GI-NEXT: fcvt d4, h1 384; CHECK-GI-NEXT: fcvt d1, h2 385; CHECK-GI-NEXT: fcvt d2, h3 386; CHECK-GI-NEXT: mov v0.d[1], v4.d[0] 387; CHECK-GI-NEXT: mov v1.d[1], v2.d[0] 388; CHECK-GI-NEXT: ret 389entry: 390 %c = fpext <4 x half> %a to <4 x double> 391 ret <4 x double> %c 392} 393 394define <2 x float> @fpext_v2f16_v2f32(<2 x half> %a) { 395; CHECK-LABEL: fpext_v2f16_v2f32: 396; CHECK: // %bb.0: // %entry 397; CHECK-NEXT: fcvtl v0.4s, v0.4h 398; CHECK-NEXT: // kill: def $d0 killed $d0 killed $q0 399; CHECK-NEXT: ret 400entry: 401 %c = fpext <2 x half> %a to <2 x float> 402 ret <2 x float> %c 403} 404 405define <3 x float> @fpext_v3f16_v3f32(<3 x half> %a) { 406; CHECK-LABEL: fpext_v3f16_v3f32: 407; CHECK: // %bb.0: // %entry 408; CHECK-NEXT: fcvtl v0.4s, v0.4h 409; CHECK-NEXT: ret 410entry: 411 %c = fpext <3 x half> %a to <3 x float> 412 ret <3 x float> %c 413} 414 415define <4 x float> @fpext_v4f16_v4f32(<4 x half> %a) { 416; CHECK-LABEL: fpext_v4f16_v4f32: 417; CHECK: // %bb.0: // %entry 418; CHECK-NEXT: fcvtl v0.4s, v0.4h 419; CHECK-NEXT: ret 420entry: 421 %c = fpext <4 x half> %a to <4 x float> 422 ret <4 x float> %c 423} 424 425define <8 x float> @fpext_v8f16_v8f32(<8 x half> %a) { 426; CHECK-SD-LABEL: fpext_v8f16_v8f32: 427; CHECK-SD: // %bb.0: // %entry 428; CHECK-SD-NEXT: fcvtl2 v1.4s, v0.8h 429; CHECK-SD-NEXT: fcvtl v0.4s, v0.4h 430; CHECK-SD-NEXT: ret 431; 432; CHECK-GI-LABEL: fpext_v8f16_v8f32: 433; CHECK-GI: // %bb.0: // %entry 434; CHECK-GI-NEXT: fcvtl v2.4s, v0.4h 435; CHECK-GI-NEXT: fcvtl2 v1.4s, v0.8h 436; CHECK-GI-NEXT: mov v0.16b, v2.16b 437; CHECK-GI-NEXT: ret 438entry: 439 %c = fpext <8 x half> %a to <8 x float> 440 ret <8 x float> %c 441} 442