brintos

brintos / llvm-project-archived public Read only

0
0
Text · 12.4 KiB · 56b20ea Raw
369 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; RUN: llc -mtriple=aarch64 -global-isel=1 -mattr=+fullfp16,+bf16 -verify-machineinstrs %s -o - | FileCheck %s --check-prefixes=CHECK,CHECK-GI5 6define float @fptrunc_f64_f32(double %a) {7; CHECK-LABEL: fptrunc_f64_f32:8; CHECK:       // %bb.0: // %entry9; CHECK-NEXT:    fcvt s0, d010; CHECK-NEXT:    ret11entry:12  %c = fptrunc double %a to float13  ret float %c14}15 16define half @fptrunc_f64_f16(double %a) {17; CHECK-LABEL: fptrunc_f64_f16:18; CHECK:       // %bb.0: // %entry19; CHECK-NEXT:    fcvt h0, d020; CHECK-NEXT:    ret21entry:22  %c = fptrunc double %a to half23  ret half %c24}25 26define half @fptrunc_f32_f16(float %a) {27; CHECK-LABEL: fptrunc_f32_f16:28; CHECK:       // %bb.0: // %entry29; CHECK-NEXT:    fcvt h0, s030; CHECK-NEXT:    ret31entry:32  %c = fptrunc float %a to half33  ret half %c34}35 36 37define half @fptrunc_f128_f16(fp128 %a) {38; CHECK-SD-LABEL: fptrunc_f128_f16:39; CHECK-SD:       // %bb.0: // %entry40; CHECK-SD-NEXT:    str x30, [sp, #-16]! // 8-byte Folded Spill41; CHECK-SD-NEXT:    .cfi_def_cfa_offset 1642; CHECK-SD-NEXT:    .cfi_offset w30, -1643; CHECK-SD-NEXT:    bl __trunctfhf244; CHECK-SD-NEXT:    ldr x30, [sp], #16 // 8-byte Folded Reload45; CHECK-SD-NEXT:    ret46;47; CHECK-GI-LABEL: fptrunc_f128_f16:48; CHECK-GI:       // %bb.0: // %entry49; CHECK-GI-NEXT:    b __trunctfhf250entry:51  %c = fptrunc fp128 %a to half52  ret half %c53}54 55define float @fptrunc_f128_f32(fp128 %a) {56; CHECK-SD-LABEL: fptrunc_f128_f32:57; CHECK-SD:       // %bb.0: // %entry58; CHECK-SD-NEXT:    str x30, [sp, #-16]! // 8-byte Folded Spill59; CHECK-SD-NEXT:    .cfi_def_cfa_offset 1660; CHECK-SD-NEXT:    .cfi_offset w30, -1661; CHECK-SD-NEXT:    bl __trunctfsf262; CHECK-SD-NEXT:    ldr x30, [sp], #16 // 8-byte Folded Reload63; CHECK-SD-NEXT:    ret64;65; CHECK-GI-LABEL: fptrunc_f128_f32:66; CHECK-GI:       // %bb.0: // %entry67; CHECK-GI-NEXT:    b __trunctfsf268entry:69  %c = fptrunc fp128 %a to float70  ret float %c71}72 73define double @fptrunc_f128_f64(fp128 %a) {74; CHECK-SD-LABEL: fptrunc_f128_f64:75; CHECK-SD:       // %bb.0: // %entry76; CHECK-SD-NEXT:    str x30, [sp, #-16]! // 8-byte Folded Spill77; CHECK-SD-NEXT:    .cfi_def_cfa_offset 1678; CHECK-SD-NEXT:    .cfi_offset w30, -1679; CHECK-SD-NEXT:    bl __trunctfdf280; CHECK-SD-NEXT:    ldr x30, [sp], #16 // 8-byte Folded Reload81; CHECK-SD-NEXT:    ret82;83; CHECK-GI-LABEL: fptrunc_f128_f64:84; CHECK-GI:       // %bb.0: // %entry85; CHECK-GI-NEXT:    b __trunctfdf286entry:87  %c = fptrunc fp128 %a to double88  ret double %c89}90 91define <2 x half> @fptrunc_v2f128_v2f16(<2 x fp128> %a) {92; CHECK-SD-LABEL: fptrunc_v2f128_v2f16:93; CHECK-SD:       // %bb.0: // %entry94; CHECK-SD-NEXT:    sub sp, sp, #4895; CHECK-SD-NEXT:    str x30, [sp, #32] // 8-byte Spill96; CHECK-SD-NEXT:    .cfi_def_cfa_offset 4897; CHECK-SD-NEXT:    .cfi_offset w30, -1698; CHECK-SD-NEXT:    str q0, [sp] // 16-byte Spill99; CHECK-SD-NEXT:    mov v0.16b, v1.16b100; CHECK-SD-NEXT:    bl __trunctfhf2101; CHECK-SD-NEXT:    // kill: def $h0 killed $h0 def $q0102; CHECK-SD-NEXT:    str q0, [sp, #16] // 16-byte Spill103; CHECK-SD-NEXT:    ldr q0, [sp] // 16-byte Reload104; CHECK-SD-NEXT:    bl __trunctfhf2105; CHECK-SD-NEXT:    ldr q1, [sp, #16] // 16-byte Reload106; CHECK-SD-NEXT:    // kill: def $h0 killed $h0 def $q0107; CHECK-SD-NEXT:    ldr x30, [sp, #32] // 8-byte Reload108; CHECK-SD-NEXT:    mov v0.h[1], v1.h[0]109; CHECK-SD-NEXT:    // kill: def $d0 killed $d0 killed $q0110; CHECK-SD-NEXT:    add sp, sp, #48111; CHECK-SD-NEXT:    ret112;113; CHECK-GI-LABEL: fptrunc_v2f128_v2f16:114; CHECK-GI:       // %bb.0: // %entry115; CHECK-GI-NEXT:    sub sp, sp, #48116; CHECK-GI-NEXT:    str x30, [sp, #32] // 8-byte Spill117; CHECK-GI-NEXT:    .cfi_def_cfa_offset 48118; CHECK-GI-NEXT:    .cfi_offset w30, -16119; CHECK-GI-NEXT:    str q1, [sp] // 16-byte Spill120; CHECK-GI-NEXT:    bl __trunctfhf2121; CHECK-GI-NEXT:    // kill: def $h0 killed $h0 def $q0122; CHECK-GI-NEXT:    str q0, [sp, #16] // 16-byte Spill123; CHECK-GI-NEXT:    ldr q0, [sp] // 16-byte Reload124; CHECK-GI-NEXT:    bl __trunctfhf2125; CHECK-GI-NEXT:    ldr q1, [sp, #16] // 16-byte Reload126; CHECK-GI-NEXT:    // kill: def $h0 killed $h0 def $q0127; CHECK-GI-NEXT:    ldr x30, [sp, #32] // 8-byte Reload128; CHECK-GI-NEXT:    mov v1.h[1], v0.h[0]129; CHECK-GI-NEXT:    fmov d0, d1130; CHECK-GI-NEXT:    add sp, sp, #48131; CHECK-GI-NEXT:    ret132entry:133  %c = fptrunc <2 x fp128> %a to <2 x half>134  ret <2 x half> %c135}136 137 138define <2 x float> @fptrunc_v2f128_v2f32(<2 x fp128> %a) {139; CHECK-SD-LABEL: fptrunc_v2f128_v2f32:140; CHECK-SD:       // %bb.0: // %entry141; CHECK-SD-NEXT:    sub sp, sp, #48142; CHECK-SD-NEXT:    str x30, [sp, #32] // 8-byte Spill143; CHECK-SD-NEXT:    .cfi_def_cfa_offset 48144; CHECK-SD-NEXT:    .cfi_offset w30, -16145; CHECK-SD-NEXT:    str q0, [sp] // 16-byte Spill146; CHECK-SD-NEXT:    mov v0.16b, v1.16b147; CHECK-SD-NEXT:    bl __trunctfsf2148; CHECK-SD-NEXT:    // kill: def $s0 killed $s0 def $q0149; CHECK-SD-NEXT:    str q0, [sp, #16] // 16-byte Spill150; CHECK-SD-NEXT:    ldr q0, [sp] // 16-byte Reload151; CHECK-SD-NEXT:    bl __trunctfsf2152; CHECK-SD-NEXT:    ldr q1, [sp, #16] // 16-byte Reload153; CHECK-SD-NEXT:    // kill: def $s0 killed $s0 def $q0154; CHECK-SD-NEXT:    ldr x30, [sp, #32] // 8-byte Reload155; CHECK-SD-NEXT:    mov v0.s[1], v1.s[0]156; CHECK-SD-NEXT:    // kill: def $d0 killed $d0 killed $q0157; CHECK-SD-NEXT:    add sp, sp, #48158; CHECK-SD-NEXT:    ret159;160; CHECK-GI-LABEL: fptrunc_v2f128_v2f32:161; CHECK-GI:       // %bb.0: // %entry162; CHECK-GI-NEXT:    sub sp, sp, #48163; CHECK-GI-NEXT:    str x30, [sp, #32] // 8-byte Spill164; CHECK-GI-NEXT:    .cfi_def_cfa_offset 48165; CHECK-GI-NEXT:    .cfi_offset w30, -16166; CHECK-GI-NEXT:    str q1, [sp] // 16-byte Spill167; CHECK-GI-NEXT:    bl __trunctfsf2168; CHECK-GI-NEXT:    // kill: def $s0 killed $s0 def $q0169; CHECK-GI-NEXT:    str q0, [sp, #16] // 16-byte Spill170; CHECK-GI-NEXT:    ldr q0, [sp] // 16-byte Reload171; CHECK-GI-NEXT:    bl __trunctfsf2172; CHECK-GI-NEXT:    ldr q1, [sp, #16] // 16-byte Reload173; CHECK-GI-NEXT:    // kill: def $s0 killed $s0 def $q0174; CHECK-GI-NEXT:    ldr x30, [sp, #32] // 8-byte Reload175; CHECK-GI-NEXT:    mov v1.s[1], v0.s[0]176; CHECK-GI-NEXT:    fmov d0, d1177; CHECK-GI-NEXT:    add sp, sp, #48178; CHECK-GI-NEXT:    ret179entry:180  %c = fptrunc <2 x fp128> %a to <2 x float>181  ret <2 x float> %c182}183 184 185define <2 x double> @fptrunc_v2f128_v2f64(<2 x fp128> %a) {186; CHECK-SD-LABEL: fptrunc_v2f128_v2f64:187; CHECK-SD:       // %bb.0: // %entry188; CHECK-SD-NEXT:    sub sp, sp, #48189; CHECK-SD-NEXT:    str x30, [sp, #32] // 8-byte Spill190; CHECK-SD-NEXT:    .cfi_def_cfa_offset 48191; CHECK-SD-NEXT:    .cfi_offset w30, -16192; CHECK-SD-NEXT:    str q0, [sp] // 16-byte Spill193; CHECK-SD-NEXT:    mov v0.16b, v1.16b194; CHECK-SD-NEXT:    bl __trunctfdf2195; CHECK-SD-NEXT:    // kill: def $d0 killed $d0 def $q0196; CHECK-SD-NEXT:    str q0, [sp, #16] // 16-byte Spill197; CHECK-SD-NEXT:    ldr q0, [sp] // 16-byte Reload198; CHECK-SD-NEXT:    bl __trunctfdf2199; CHECK-SD-NEXT:    ldr q1, [sp, #16] // 16-byte Reload200; CHECK-SD-NEXT:    // kill: def $d0 killed $d0 def $q0201; CHECK-SD-NEXT:    ldr x30, [sp, #32] // 8-byte Reload202; CHECK-SD-NEXT:    mov v0.d[1], v1.d[0]203; CHECK-SD-NEXT:    add sp, sp, #48204; CHECK-SD-NEXT:    ret205;206; CHECK-GI-LABEL: fptrunc_v2f128_v2f64:207; CHECK-GI:       // %bb.0: // %entry208; CHECK-GI-NEXT:    sub sp, sp, #48209; CHECK-GI-NEXT:    str x30, [sp, #32] // 8-byte Spill210; CHECK-GI-NEXT:    .cfi_def_cfa_offset 48211; CHECK-GI-NEXT:    .cfi_offset w30, -16212; CHECK-GI-NEXT:    str q1, [sp] // 16-byte Spill213; CHECK-GI-NEXT:    bl __trunctfdf2214; CHECK-GI-NEXT:    // kill: def $d0 killed $d0 def $q0215; CHECK-GI-NEXT:    str q0, [sp, #16] // 16-byte Spill216; CHECK-GI-NEXT:    ldr q0, [sp] // 16-byte Reload217; CHECK-GI-NEXT:    bl __trunctfdf2218; CHECK-GI-NEXT:    ldr q1, [sp, #16] // 16-byte Reload219; CHECK-GI-NEXT:    // kill: def $d0 killed $d0 def $q0220; CHECK-GI-NEXT:    ldr x30, [sp, #32] // 8-byte Reload221; CHECK-GI-NEXT:    mov v1.d[1], v0.d[0]222; CHECK-GI-NEXT:    mov v0.16b, v1.16b223; CHECK-GI-NEXT:    add sp, sp, #48224; CHECK-GI-NEXT:    ret225entry:226  %c = fptrunc <2 x fp128> %a to <2 x double>227  ret <2 x double> %c228}229 230define <2 x float> @fptrunc_v2f64_v2f32(<2 x double> %a) {231; CHECK-LABEL: fptrunc_v2f64_v2f32:232; CHECK:       // %bb.0: // %entry233; CHECK-NEXT:    fcvtn v0.2s, v0.2d234; CHECK-NEXT:    ret235entry:236  %c = fptrunc <2 x double> %a to <2 x float>237  ret <2 x float> %c238}239 240define <3 x float> @fptrunc_v3f64_v3f32(<3 x double> %a) {241; CHECK-SD-LABEL: fptrunc_v3f64_v3f32:242; CHECK-SD:       // %bb.0: // %entry243; CHECK-SD-NEXT:    // kill: def $d0 killed $d0 def $q0244; CHECK-SD-NEXT:    // kill: def $d1 killed $d1 def $q1245; CHECK-SD-NEXT:    // kill: def $d2 killed $d2 def $q2246; CHECK-SD-NEXT:    mov v0.d[1], v1.d[0]247; CHECK-SD-NEXT:    fcvtn v0.2s, v0.2d248; CHECK-SD-NEXT:    fcvtn2 v0.4s, v2.2d249; CHECK-SD-NEXT:    ret250;251; CHECK-GI-LABEL: fptrunc_v3f64_v3f32:252; CHECK-GI:       // %bb.0: // %entry253; CHECK-GI-NEXT:    // kill: def $d0 killed $d0 def $q0254; CHECK-GI-NEXT:    // kill: def $d1 killed $d1 def $q1255; CHECK-GI-NEXT:    // kill: def $d2 killed $d2 def $q2256; CHECK-GI-NEXT:    mov v0.d[1], v1.d[0]257; CHECK-GI-NEXT:    fcvtn v2.2s, v2.2d258; CHECK-GI-NEXT:    fcvtn v1.2s, v0.2d259; CHECK-GI-NEXT:    mov v0.s[0], v1.s[0]260; CHECK-GI-NEXT:    mov v0.s[1], v1.s[1]261; CHECK-GI-NEXT:    mov v0.s[2], v2.s[0]262; CHECK-GI-NEXT:    ret263entry:264  %c = fptrunc <3 x double> %a to <3 x float>265  ret <3 x float> %c266}267 268define <4 x float> @fptrunc_v4f64_v4f32(<4 x double> %a) {269; CHECK-LABEL: fptrunc_v4f64_v4f32:270; CHECK:       // %bb.0: // %entry271; CHECK-NEXT:    fcvtn v0.2s, v0.2d272; CHECK-NEXT:    fcvtn2 v0.4s, v1.2d273; CHECK-NEXT:    ret274entry:275  %c = fptrunc <4 x double> %a to <4 x float>276  ret <4 x float> %c277}278 279define <2 x half> @fptrunc_v2f64_v2f16(<2 x double> %a) {280; CHECK-LABEL: fptrunc_v2f64_v2f16:281; CHECK:       // %bb.0: // %entry282; CHECK-NEXT:    fcvtxn v0.2s, v0.2d283; CHECK-NEXT:    fcvtn v0.4h, v0.4s284; CHECK-NEXT:    ret285entry:286  %c = fptrunc <2 x double> %a to <2 x half>287  ret <2 x half> %c288}289 290define <3 x half> @fptrunc_v3f64_v3f16(<3 x double> %a) {291; CHECK-SD-LABEL: fptrunc_v3f64_v3f16:292; CHECK-SD:       // %bb.0: // %entry293; CHECK-SD-NEXT:    fcvt h0, d0294; CHECK-SD-NEXT:    fcvt h1, d1295; CHECK-SD-NEXT:    fcvt h2, d2296; CHECK-SD-NEXT:    mov v0.h[1], v1.h[0]297; CHECK-SD-NEXT:    mov v0.h[2], v2.h[0]298; CHECK-SD-NEXT:    // kill: def $d0 killed $d0 killed $q0299; CHECK-SD-NEXT:    ret300;301; CHECK-GI-LABEL: fptrunc_v3f64_v3f16:302; CHECK-GI:       // %bb.0: // %entry303; CHECK-GI-NEXT:    // kill: def $d0 killed $d0 def $q0304; CHECK-GI-NEXT:    // kill: def $d1 killed $d1 def $q1305; CHECK-GI-NEXT:    // kill: def $d2 killed $d2 def $q2306; CHECK-GI-NEXT:    mov v0.d[1], v1.d[0]307; CHECK-GI-NEXT:    fcvtxn v0.2s, v0.2d308; CHECK-GI-NEXT:    fcvtxn2 v0.4s, v2.2d309; CHECK-GI-NEXT:    fcvtn v0.4h, v0.4s310; CHECK-GI-NEXT:    ret311entry:312  %c = fptrunc <3 x double> %a to <3 x half>313  ret <3 x half> %c314}315 316define <4 x half> @fptrunc_v4f64_v4f16(<4 x double> %a) {317; CHECK-LABEL: fptrunc_v4f64_v4f16:318; CHECK:       // %bb.0: // %entry319; CHECK-NEXT:    fcvtxn v0.2s, v0.2d320; CHECK-NEXT:    fcvtxn2 v0.4s, v1.2d321; CHECK-NEXT:    fcvtn v0.4h, v0.4s322; CHECK-NEXT:    ret323entry:324  %c = fptrunc <4 x double> %a to <4 x half>325  ret <4 x half> %c326}327 328define <2 x half> @fptrunc_v2f32_v2f16(<2 x float> %a) {329; CHECK-LABEL: fptrunc_v2f32_v2f16:330; CHECK:       // %bb.0: // %entry331; CHECK-NEXT:    // kill: def $d0 killed $d0 def $q0332; CHECK-NEXT:    fcvtn v0.4h, v0.4s333; CHECK-NEXT:    ret334entry:335  %c = fptrunc <2 x float> %a to <2 x half>336  ret <2 x half> %c337}338 339define <3 x half> @fptrunc_v3f32_v3f16(<3 x float> %a) {340; CHECK-LABEL: fptrunc_v3f32_v3f16:341; CHECK:       // %bb.0: // %entry342; CHECK-NEXT:    fcvtn v0.4h, v0.4s343; CHECK-NEXT:    ret344entry:345  %c = fptrunc <3 x float> %a to <3 x half>346  ret <3 x half> %c347}348 349define <4 x half> @fptrunc_v4f32_v4f16(<4 x float> %a) {350; CHECK-LABEL: fptrunc_v4f32_v4f16:351; CHECK:       // %bb.0: // %entry352; CHECK-NEXT:    fcvtn v0.4h, v0.4s353; CHECK-NEXT:    ret354entry:355  %c = fptrunc <4 x float> %a to <4 x half>356  ret <4 x half> %c357}358 359define <8 x half> @fptrunc_v8f32_v8f16(<8 x float> %a) {360; CHECK-LABEL: fptrunc_v8f32_v8f16:361; CHECK:       // %bb.0: // %entry362; CHECK-NEXT:    fcvtn v0.4h, v0.4s363; CHECK-NEXT:    fcvtn2 v0.8h, v1.4s364; CHECK-NEXT:    ret365entry:366  %c = fptrunc <8 x float> %a to <8 x half>367  ret <8 x half> %c368}369