427 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 32; RUN: llc -mtriple=aarch64 -global-isel=0 -verify-machineinstrs %s -o - | FileCheck %s --check-prefixes=CHECK,CHECK-SD3; RUN: llc -mtriple=aarch64 -global-isel=1 -verify-machineinstrs %s -o - | FileCheck %s --check-prefixes=CHECK,CHECK-GI4 5define double @fpext_f32_f64(float %a) {6; CHECK-LABEL: fpext_f32_f64:7; CHECK: // %bb.0: // %entry8; CHECK-NEXT: fcvt d0, s09; CHECK-NEXT: ret10entry:11 %c = fpext float %a to double12 ret double %c13}14 15define double @fpext_f16_f64(half %a) {16; CHECK-LABEL: fpext_f16_f64:17; CHECK: // %bb.0: // %entry18; CHECK-NEXT: fcvt d0, h019; CHECK-NEXT: ret20entry:21 %c = fpext half %a to double22 ret double %c23}24 25define float @fpext_f16_f32(half %a) {26; CHECK-LABEL: fpext_f16_f32:27; CHECK: // %bb.0: // %entry28; CHECK-NEXT: fcvt s0, h029; CHECK-NEXT: ret30entry:31 %c = fpext half %a to float32 ret float %c33}34 35define fp128 @fpext_f16_f128(half %a) {36; CHECK-LABEL: fpext_f16_f128:37; CHECK: // %bb.0: // %entry38; CHECK-NEXT: b __extendhftf239entry:40 %c = fpext half %a to fp12841 ret fp128 %c42}43 44define fp128 @fpext_f32_f128(float %a) {45; CHECK-LABEL: fpext_f32_f128:46; CHECK: // %bb.0: // %entry47; CHECK-NEXT: b __extendsftf248entry:49 %c = fpext float %a to fp12850 ret fp128 %c51}52 53define fp128 @fpext_f64_f128(double %a) {54; CHECK-LABEL: fpext_f64_f128:55; CHECK: // %bb.0: // %entry56; CHECK-NEXT: b __extenddftf257entry:58 %c = fpext double %a to fp12859 ret fp128 %c60}61 62define <2 x double> @fpext_v2f32_v2f64(<2 x float> %a) {63; CHECK-LABEL: fpext_v2f32_v2f64:64; CHECK: // %bb.0: // %entry65; CHECK-NEXT: fcvtl v0.2d, v0.2s66; CHECK-NEXT: ret67entry:68 %c = fpext <2 x float> %a to <2 x double>69 ret <2 x double> %c70}71 72define <3 x double> @fpext_v3f32_v3f64(<3 x float> %a) {73; CHECK-SD-LABEL: fpext_v3f32_v3f64:74; CHECK-SD: // %bb.0: // %entry75; CHECK-SD-NEXT: fcvtl v3.2d, v0.2s76; CHECK-SD-NEXT: fcvtl2 v2.2d, v0.4s77; CHECK-SD-NEXT: // kill: def $d2 killed $d2 killed $q278; CHECK-SD-NEXT: fmov d0, d379; CHECK-SD-NEXT: ext v1.16b, v3.16b, v3.16b, #880; CHECK-SD-NEXT: // kill: def $d1 killed $d1 killed $q181; CHECK-SD-NEXT: ret82;83; CHECK-GI-LABEL: fpext_v3f32_v3f64:84; CHECK-GI: // %bb.0: // %entry85; CHECK-GI-NEXT: mov v1.s[0], v0.s[2]86; CHECK-GI-NEXT: fcvtl v0.2d, v0.2s87; CHECK-GI-NEXT: fcvtl v2.2d, v1.2s88; CHECK-GI-NEXT: mov d1, v0.d[1]89; CHECK-GI-NEXT: // kill: def $d0 killed $d0 killed $q090; CHECK-GI-NEXT: // kill: def $d2 killed $d2 killed $q291; CHECK-GI-NEXT: ret92entry:93 %c = fpext <3 x float> %a to <3 x double>94 ret <3 x double> %c95}96 97define <4 x fp128> @fpext_v4f16_v4f128(<4 x half> %a) {98; CHECK-SD-LABEL: fpext_v4f16_v4f128:99; CHECK-SD: // %bb.0: // %entry100; CHECK-SD-NEXT: sub sp, sp, #64101; CHECK-SD-NEXT: str x30, [sp, #48] // 8-byte Spill102; CHECK-SD-NEXT: .cfi_def_cfa_offset 64103; CHECK-SD-NEXT: .cfi_offset w30, -16104; CHECK-SD-NEXT: // kill: def $d0 killed $d0 def $q0105; CHECK-SD-NEXT: str q0, [sp, #32] // 16-byte Spill106; CHECK-SD-NEXT: // kill: def $h0 killed $h0 killed $q0107; CHECK-SD-NEXT: bl __extendhftf2108; CHECK-SD-NEXT: ldr q1, [sp, #32] // 16-byte Reload109; CHECK-SD-NEXT: str q0, [sp, #16] // 16-byte Spill110; CHECK-SD-NEXT: mov h1, v1.h[1]111; CHECK-SD-NEXT: fmov s0, s1112; CHECK-SD-NEXT: bl __extendhftf2113; CHECK-SD-NEXT: ldr q1, [sp, #32] // 16-byte Reload114; CHECK-SD-NEXT: str q0, [sp] // 16-byte Spill115; CHECK-SD-NEXT: mov h1, v1.h[2]116; CHECK-SD-NEXT: fmov s0, s1117; CHECK-SD-NEXT: bl __extendhftf2118; CHECK-SD-NEXT: ldr q1, [sp, #32] // 16-byte Reload119; CHECK-SD-NEXT: str q0, [sp, #32] // 16-byte Spill120; CHECK-SD-NEXT: mov h1, v1.h[3]121; CHECK-SD-NEXT: fmov s0, s1122; CHECK-SD-NEXT: bl __extendhftf2123; CHECK-SD-NEXT: mov v3.16b, v0.16b124; CHECK-SD-NEXT: ldp q1, q0, [sp] // 32-byte Folded Reload125; CHECK-SD-NEXT: ldr q2, [sp, #32] // 16-byte Reload126; CHECK-SD-NEXT: ldr x30, [sp, #48] // 8-byte Reload127; CHECK-SD-NEXT: add sp, sp, #64128; CHECK-SD-NEXT: ret129;130; CHECK-GI-LABEL: fpext_v4f16_v4f128:131; CHECK-GI: // %bb.0: // %entry132; CHECK-GI-NEXT: sub sp, sp, #80133; CHECK-GI-NEXT: str d10, [sp, #48] // 8-byte Spill134; CHECK-GI-NEXT: stp d9, d8, [sp, #56] // 16-byte Folded Spill135; CHECK-GI-NEXT: str x30, [sp, #72] // 8-byte Spill136; CHECK-GI-NEXT: .cfi_def_cfa_offset 80137; CHECK-GI-NEXT: .cfi_offset w30, -8138; CHECK-GI-NEXT: .cfi_offset b8, -16139; CHECK-GI-NEXT: .cfi_offset b9, -24140; CHECK-GI-NEXT: .cfi_offset b10, -32141; CHECK-GI-NEXT: // kill: def $d0 killed $d0 def $q0142; CHECK-GI-NEXT: mov h8, v0.h[1]143; CHECK-GI-NEXT: mov h9, v0.h[2]144; CHECK-GI-NEXT: mov h10, v0.h[3]145; CHECK-GI-NEXT: // kill: def $h0 killed $h0 killed $q0146; CHECK-GI-NEXT: bl __extendhftf2147; CHECK-GI-NEXT: str q0, [sp, #32] // 16-byte Spill148; CHECK-GI-NEXT: fmov s0, s8149; CHECK-GI-NEXT: bl __extendhftf2150; CHECK-GI-NEXT: str q0, [sp, #16] // 16-byte Spill151; CHECK-GI-NEXT: fmov s0, s9152; CHECK-GI-NEXT: bl __extendhftf2153; CHECK-GI-NEXT: str q0, [sp] // 16-byte Spill154; CHECK-GI-NEXT: fmov s0, s10155; CHECK-GI-NEXT: bl __extendhftf2156; CHECK-GI-NEXT: mov v3.16b, v0.16b157; CHECK-GI-NEXT: ldp q1, q0, [sp, #16] // 32-byte Folded Reload158; CHECK-GI-NEXT: ldp d9, d8, [sp, #56] // 16-byte Folded Reload159; CHECK-GI-NEXT: ldr q2, [sp] // 16-byte Reload160; CHECK-GI-NEXT: ldr x30, [sp, #72] // 8-byte Reload161; CHECK-GI-NEXT: ldr d10, [sp, #48] // 8-byte Reload162; CHECK-GI-NEXT: add sp, sp, #80163; CHECK-GI-NEXT: ret164entry:165 %c = fpext <4 x half> %a to <4 x fp128>166 ret <4 x fp128> %c167}168 169define <4 x fp128> @fpext_v4f32_v4f128(<4 x float> %a) {170; CHECK-SD-LABEL: fpext_v4f32_v4f128:171; CHECK-SD: // %bb.0: // %entry172; CHECK-SD-NEXT: sub sp, sp, #80173; CHECK-SD-NEXT: str x30, [sp, #64] // 8-byte Spill174; CHECK-SD-NEXT: .cfi_def_cfa_offset 80175; CHECK-SD-NEXT: .cfi_offset w30, -16176; CHECK-SD-NEXT: str q0, [sp, #48] // 16-byte Spill177; CHECK-SD-NEXT: ext v0.16b, v0.16b, v0.16b, #8178; CHECK-SD-NEXT: str q0, [sp, #32] // 16-byte Spill179; CHECK-SD-NEXT: // kill: def $s0 killed $s0 killed $q0180; CHECK-SD-NEXT: bl __extendsftf2181; CHECK-SD-NEXT: ldr q1, [sp, #32] // 16-byte Reload182; CHECK-SD-NEXT: str q0, [sp, #32] // 16-byte Spill183; CHECK-SD-NEXT: mov s1, v1.s[1]184; CHECK-SD-NEXT: fmov s0, s1185; CHECK-SD-NEXT: bl __extendsftf2186; CHECK-SD-NEXT: str q0, [sp, #16] // 16-byte Spill187; CHECK-SD-NEXT: ldr q0, [sp, #48] // 16-byte Reload188; CHECK-SD-NEXT: // kill: def $s0 killed $s0 killed $q0189; CHECK-SD-NEXT: bl __extendsftf2190; CHECK-SD-NEXT: str q0, [sp] // 16-byte Spill191; CHECK-SD-NEXT: ldr q0, [sp, #48] // 16-byte Reload192; CHECK-SD-NEXT: mov s0, v0.s[1]193; CHECK-SD-NEXT: bl __extendsftf2194; CHECK-SD-NEXT: mov v1.16b, v0.16b195; CHECK-SD-NEXT: ldp q0, q3, [sp] // 32-byte Folded Reload196; CHECK-SD-NEXT: ldr q2, [sp, #32] // 16-byte Reload197; CHECK-SD-NEXT: ldr x30, [sp, #64] // 8-byte Reload198; CHECK-SD-NEXT: add sp, sp, #80199; CHECK-SD-NEXT: ret200;201; CHECK-GI-LABEL: fpext_v4f32_v4f128:202; CHECK-GI: // %bb.0: // %entry203; CHECK-GI-NEXT: sub sp, sp, #80204; CHECK-GI-NEXT: str d10, [sp, #48] // 8-byte Spill205; CHECK-GI-NEXT: stp d9, d8, [sp, #56] // 16-byte Folded Spill206; CHECK-GI-NEXT: str x30, [sp, #72] // 8-byte Spill207; CHECK-GI-NEXT: .cfi_def_cfa_offset 80208; CHECK-GI-NEXT: .cfi_offset w30, -8209; CHECK-GI-NEXT: .cfi_offset b8, -16210; CHECK-GI-NEXT: .cfi_offset b9, -24211; CHECK-GI-NEXT: .cfi_offset b10, -32212; CHECK-GI-NEXT: mov s8, v0.s[1]213; CHECK-GI-NEXT: mov s9, v0.s[2]214; CHECK-GI-NEXT: mov s10, v0.s[3]215; CHECK-GI-NEXT: // kill: def $s0 killed $s0 killed $q0216; CHECK-GI-NEXT: bl __extendsftf2217; CHECK-GI-NEXT: str q0, [sp, #32] // 16-byte Spill218; CHECK-GI-NEXT: fmov s0, s8219; CHECK-GI-NEXT: bl __extendsftf2220; CHECK-GI-NEXT: str q0, [sp, #16] // 16-byte Spill221; CHECK-GI-NEXT: fmov s0, s9222; CHECK-GI-NEXT: bl __extendsftf2223; CHECK-GI-NEXT: str q0, [sp] // 16-byte Spill224; CHECK-GI-NEXT: fmov s0, s10225; CHECK-GI-NEXT: bl __extendsftf2226; CHECK-GI-NEXT: mov v3.16b, v0.16b227; CHECK-GI-NEXT: ldp q1, q0, [sp, #16] // 32-byte Folded Reload228; CHECK-GI-NEXT: ldp d9, d8, [sp, #56] // 16-byte Folded Reload229; CHECK-GI-NEXT: ldr q2, [sp] // 16-byte Reload230; CHECK-GI-NEXT: ldr x30, [sp, #72] // 8-byte Reload231; CHECK-GI-NEXT: ldr d10, [sp, #48] // 8-byte Reload232; CHECK-GI-NEXT: add sp, sp, #80233; CHECK-GI-NEXT: ret234entry:235 %c = fpext <4 x float> %a to <4 x fp128>236 ret <4 x fp128> %c237}238 239define <4 x fp128> @fpext_v4f64_v4f128(<4 x double> %a) {240; CHECK-SD-LABEL: fpext_v4f64_v4f128:241; CHECK-SD: // %bb.0: // %entry242; CHECK-SD-NEXT: sub sp, sp, #80243; CHECK-SD-NEXT: str x30, [sp, #64] // 8-byte Spill244; CHECK-SD-NEXT: .cfi_def_cfa_offset 80245; CHECK-SD-NEXT: .cfi_offset w30, -16246; CHECK-SD-NEXT: str q1, [sp, #48] // 16-byte Spill247; CHECK-SD-NEXT: str q0, [sp, #16] // 16-byte Spill248; CHECK-SD-NEXT: // kill: def $d0 killed $d0 killed $q0249; CHECK-SD-NEXT: bl __extenddftf2250; CHECK-SD-NEXT: str q0, [sp, #32] // 16-byte Spill251; CHECK-SD-NEXT: ldr q0, [sp, #16] // 16-byte Reload252; CHECK-SD-NEXT: mov d0, v0.d[1]253; CHECK-SD-NEXT: bl __extenddftf2254; CHECK-SD-NEXT: str q0, [sp, #16] // 16-byte Spill255; CHECK-SD-NEXT: ldr q0, [sp, #48] // 16-byte Reload256; CHECK-SD-NEXT: // kill: def $d0 killed $d0 killed $q0257; CHECK-SD-NEXT: bl __extenddftf2258; CHECK-SD-NEXT: str q0, [sp] // 16-byte Spill259; CHECK-SD-NEXT: ldr q0, [sp, #48] // 16-byte Reload260; CHECK-SD-NEXT: mov d0, v0.d[1]261; CHECK-SD-NEXT: bl __extenddftf2262; CHECK-SD-NEXT: mov v3.16b, v0.16b263; CHECK-SD-NEXT: ldp q1, q0, [sp, #16] // 32-byte Folded Reload264; CHECK-SD-NEXT: ldr q2, [sp] // 16-byte Reload265; CHECK-SD-NEXT: ldr x30, [sp, #64] // 8-byte Reload266; CHECK-SD-NEXT: add sp, sp, #80267; CHECK-SD-NEXT: ret268;269; CHECK-GI-LABEL: fpext_v4f64_v4f128:270; CHECK-GI: // %bb.0: // %entry271; CHECK-GI-NEXT: sub sp, sp, #80272; CHECK-GI-NEXT: stp d9, d8, [sp, #48] // 16-byte Folded Spill273; CHECK-GI-NEXT: str x30, [sp, #64] // 8-byte Spill274; CHECK-GI-NEXT: .cfi_def_cfa_offset 80275; CHECK-GI-NEXT: .cfi_offset w30, -16276; CHECK-GI-NEXT: .cfi_offset b8, -24277; CHECK-GI-NEXT: .cfi_offset b9, -32278; CHECK-GI-NEXT: str q1, [sp] // 16-byte Spill279; CHECK-GI-NEXT: mov d8, v0.d[1]280; CHECK-GI-NEXT: mov d9, v1.d[1]281; CHECK-GI-NEXT: // kill: def $d0 killed $d0 killed $q0282; CHECK-GI-NEXT: bl __extenddftf2283; CHECK-GI-NEXT: str q0, [sp, #32] // 16-byte Spill284; CHECK-GI-NEXT: fmov d0, d8285; CHECK-GI-NEXT: bl __extenddftf2286; CHECK-GI-NEXT: str q0, [sp, #16] // 16-byte Spill287; CHECK-GI-NEXT: ldr q0, [sp] // 16-byte Reload288; CHECK-GI-NEXT: // kill: def $d0 killed $d0 killed $q0289; CHECK-GI-NEXT: bl __extenddftf2290; CHECK-GI-NEXT: str q0, [sp] // 16-byte Spill291; CHECK-GI-NEXT: fmov d0, d9292; CHECK-GI-NEXT: bl __extenddftf2293; CHECK-GI-NEXT: mov v3.16b, v0.16b294; CHECK-GI-NEXT: ldp q1, q0, [sp, #16] // 32-byte Folded Reload295; CHECK-GI-NEXT: ldp d9, d8, [sp, #48] // 16-byte Folded Reload296; CHECK-GI-NEXT: ldr q2, [sp] // 16-byte Reload297; CHECK-GI-NEXT: ldr x30, [sp, #64] // 8-byte Reload298; CHECK-GI-NEXT: add sp, sp, #80299; CHECK-GI-NEXT: ret300entry:301 %c = fpext <4 x double> %a to <4 x fp128>302 ret <4 x fp128> %c303}304 305define <4 x double> @fpext_v4f32_v4f64(<4 x float> %a) {306; CHECK-SD-LABEL: fpext_v4f32_v4f64:307; CHECK-SD: // %bb.0: // %entry308; CHECK-SD-NEXT: fcvtl2 v1.2d, v0.4s309; CHECK-SD-NEXT: fcvtl v0.2d, v0.2s310; CHECK-SD-NEXT: ret311;312; CHECK-GI-LABEL: fpext_v4f32_v4f64:313; CHECK-GI: // %bb.0: // %entry314; CHECK-GI-NEXT: fcvtl v2.2d, v0.2s315; CHECK-GI-NEXT: fcvtl2 v1.2d, v0.4s316; CHECK-GI-NEXT: mov v0.16b, v2.16b317; CHECK-GI-NEXT: ret318entry:319 %c = fpext <4 x float> %a to <4 x double>320 ret <4 x double> %c321}322 323define <2 x double> @fpext_v2f16_v2f64(<2 x half> %a) {324; CHECK-LABEL: fpext_v2f16_v2f64:325; CHECK: // %bb.0: // %entry326; CHECK-NEXT: fcvtl v0.4s, v0.4h327; CHECK-NEXT: fcvtl v0.2d, v0.2s328; CHECK-NEXT: ret329entry:330 %c = fpext <2 x half> %a to <2 x double>331 ret <2 x double> %c332}333 334define <3 x double> @fpext_v3f16_v3f64(<3 x half> %a) {335; CHECK-SD-LABEL: fpext_v3f16_v3f64:336; CHECK-SD: // %bb.0: // %entry337; CHECK-SD-NEXT: fcvtl v1.4s, v0.4h338; CHECK-SD-NEXT: fcvtl v0.2d, v1.2s339; CHECK-SD-NEXT: fcvtl2 v2.2d, v1.4s340; CHECK-SD-NEXT: // kill: def $d2 killed $d2 killed $q2341; CHECK-SD-NEXT: ext v1.16b, v0.16b, v0.16b, #8342; CHECK-SD-NEXT: // kill: def $d0 killed $d0 killed $q0343; CHECK-SD-NEXT: // kill: def $d1 killed $d1 killed $q1344; CHECK-SD-NEXT: ret345;346; CHECK-GI-LABEL: fpext_v3f16_v3f64:347; CHECK-GI: // %bb.0: // %entry348; CHECK-GI-NEXT: fcvtl v1.4s, v0.4h349; CHECK-GI-NEXT: fcvtl v0.2d, v1.2s350; CHECK-GI-NEXT: fcvtl2 v2.2d, v1.4s351; CHECK-GI-NEXT: // kill: def $d2 killed $d2 killed $q2352; CHECK-GI-NEXT: mov d1, v0.d[1]353; CHECK-GI-NEXT: // kill: def $d0 killed $d0 killed $q0354; CHECK-GI-NEXT: ret355entry:356 %c = fpext <3 x half> %a to <3 x double>357 ret <3 x double> %c358}359 360define <4 x double> @fpext_v4f16_v4f64(<4 x half> %a) {361; CHECK-SD-LABEL: fpext_v4f16_v4f64:362; CHECK-SD: // %bb.0: // %entry363; CHECK-SD-NEXT: fcvtl v0.4s, v0.4h364; CHECK-SD-NEXT: fcvtl2 v1.2d, v0.4s365; CHECK-SD-NEXT: fcvtl v0.2d, v0.2s366; CHECK-SD-NEXT: ret367;368; CHECK-GI-LABEL: fpext_v4f16_v4f64:369; CHECK-GI: // %bb.0: // %entry370; CHECK-GI-NEXT: fcvtl v1.4s, v0.4h371; CHECK-GI-NEXT: fcvtl v0.2d, v1.2s372; CHECK-GI-NEXT: fcvtl2 v1.2d, v1.4s373; CHECK-GI-NEXT: ret374entry:375 %c = fpext <4 x half> %a to <4 x double>376 ret <4 x double> %c377}378 379define <2 x float> @fpext_v2f16_v2f32(<2 x half> %a) {380; CHECK-LABEL: fpext_v2f16_v2f32:381; CHECK: // %bb.0: // %entry382; CHECK-NEXT: fcvtl v0.4s, v0.4h383; CHECK-NEXT: // kill: def $d0 killed $d0 killed $q0384; CHECK-NEXT: ret385entry:386 %c = fpext <2 x half> %a to <2 x float>387 ret <2 x float> %c388}389 390define <3 x float> @fpext_v3f16_v3f32(<3 x half> %a) {391; CHECK-LABEL: fpext_v3f16_v3f32:392; CHECK: // %bb.0: // %entry393; CHECK-NEXT: fcvtl v0.4s, v0.4h394; CHECK-NEXT: ret395entry:396 %c = fpext <3 x half> %a to <3 x float>397 ret <3 x float> %c398}399 400define <4 x float> @fpext_v4f16_v4f32(<4 x half> %a) {401; CHECK-LABEL: fpext_v4f16_v4f32:402; CHECK: // %bb.0: // %entry403; CHECK-NEXT: fcvtl v0.4s, v0.4h404; CHECK-NEXT: ret405entry:406 %c = fpext <4 x half> %a to <4 x float>407 ret <4 x float> %c408}409 410define <8 x float> @fpext_v8f16_v8f32(<8 x half> %a) {411; CHECK-SD-LABEL: fpext_v8f16_v8f32:412; CHECK-SD: // %bb.0: // %entry413; CHECK-SD-NEXT: fcvtl2 v1.4s, v0.8h414; CHECK-SD-NEXT: fcvtl v0.4s, v0.4h415; CHECK-SD-NEXT: ret416;417; CHECK-GI-LABEL: fpext_v8f16_v8f32:418; CHECK-GI: // %bb.0: // %entry419; CHECK-GI-NEXT: fcvtl v2.4s, v0.4h420; CHECK-GI-NEXT: fcvtl2 v1.4s, v0.8h421; CHECK-GI-NEXT: mov v0.16b, v2.16b422; CHECK-GI-NEXT: ret423entry:424 %c = fpext <8 x half> %a to <8 x float>425 ret <8 x float> %c426}427