brintos

brintos / llvm-project-archived public Read only

0
0
Text · 6.3 KiB · e167601 Raw
214 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc < %s -mtriple=i686-unknown-unknown -mattr=+fma | FileCheck %s --check-prefix=X863; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+fma | FileCheck %s --check-prefix=X644 5define float @f1(float %a, float %b, float %c) {6; X86-LABEL: f1:7; X86:       # %bb.0:8; X86-NEXT:    pushl %eax9; X86-NEXT:    .cfi_def_cfa_offset 810; X86-NEXT:    vmovss {{.*#+}} xmm0 = mem[0],zero,zero,zero11; X86-NEXT:    vmovss {{.*#+}} xmm1 = mem[0],zero,zero,zero12; X86-NEXT:    vfmadd213ss {{.*#+}} xmm1 = (xmm0 * xmm1) + mem13; X86-NEXT:    vmovss %xmm1, (%esp)14; X86-NEXT:    flds (%esp)15; X86-NEXT:    popl %eax16; X86-NEXT:    .cfi_def_cfa_offset 417; X86-NEXT:    retl18;19; X64-LABEL: f1:20; X64:       # %bb.0:21; X64-NEXT:    vfmadd213ss {{.*#+}} xmm0 = (xmm1 * xmm0) + xmm222; X64-NEXT:    retq23  %mul = fmul fast float %b, %a24  %add = fadd fast float %mul, %c25  ret float %add26}27 28define float @f2(float %a, float %b, float %c) {29; X86-LABEL: f2:30; X86:       # %bb.0:31; X86-NEXT:    pushl %eax32; X86-NEXT:    .cfi_def_cfa_offset 833; X86-NEXT:    vmovss {{.*#+}} xmm0 = mem[0],zero,zero,zero34; X86-NEXT:    vmulss {{[0-9]+}}(%esp), %xmm0, %xmm035; X86-NEXT:    #ARITH_FENCE36; X86-NEXT:    vaddss {{[0-9]+}}(%esp), %xmm0, %xmm037; X86-NEXT:    vmovss %xmm0, (%esp)38; X86-NEXT:    flds (%esp)39; X86-NEXT:    popl %eax40; X86-NEXT:    .cfi_def_cfa_offset 441; X86-NEXT:    retl42;43; X64-LABEL: f2:44; X64:       # %bb.0:45; X64-NEXT:    vmulss %xmm0, %xmm1, %xmm046; X64-NEXT:    #ARITH_FENCE47; X64-NEXT:    vaddss %xmm2, %xmm0, %xmm048; X64-NEXT:    retq49  %mul = fmul fast float %b, %a50  %tmp = call float @llvm.arithmetic.fence.f32(float %mul)51  %add = fadd fast float %tmp, %c52  ret float %add53}54 55define double @f3(double %a) {56; X86-LABEL: f3:57; X86:       # %bb.0:58; X86-NEXT:    pushl %ebp59; X86-NEXT:    .cfi_def_cfa_offset 860; X86-NEXT:    .cfi_offset %ebp, -861; X86-NEXT:    movl %esp, %ebp62; X86-NEXT:    .cfi_def_cfa_register %ebp63; X86-NEXT:    andl $-8, %esp64; X86-NEXT:    subl $8, %esp65; X86-NEXT:    vmovsd {{.*#+}} xmm0 = mem[0],zero66; X86-NEXT:    vmulsd {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0, %xmm067; X86-NEXT:    vmovsd %xmm0, (%esp)68; X86-NEXT:    fldl (%esp)69; X86-NEXT:    movl %ebp, %esp70; X86-NEXT:    popl %ebp71; X86-NEXT:    .cfi_def_cfa %esp, 472; X86-NEXT:    retl73;74; X64-LABEL: f3:75; X64:       # %bb.0:76; X64-NEXT:    vmulsd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm077; X64-NEXT:    retq78  %1 = fadd fast double %a, %a79  %2 = fadd fast double %a, %a80  %3 = fadd fast double %1, %281  ret double %382}83 84define double @f4(double %a) {85; X86-LABEL: f4:86; X86:       # %bb.0:87; X86-NEXT:    pushl %ebp88; X86-NEXT:    .cfi_def_cfa_offset 889; X86-NEXT:    .cfi_offset %ebp, -890; X86-NEXT:    movl %esp, %ebp91; X86-NEXT:    .cfi_def_cfa_register %ebp92; X86-NEXT:    andl $-8, %esp93; X86-NEXT:    subl $8, %esp94; X86-NEXT:    vmovsd {{.*#+}} xmm0 = mem[0],zero95; X86-NEXT:    vaddsd %xmm0, %xmm0, %xmm096; X86-NEXT:    vmovapd %xmm0, %xmm197; X86-NEXT:    #ARITH_FENCE98; X86-NEXT:    vaddsd %xmm0, %xmm1, %xmm099; X86-NEXT:    vmovsd %xmm0, (%esp)100; X86-NEXT:    fldl (%esp)101; X86-NEXT:    movl %ebp, %esp102; X86-NEXT:    popl %ebp103; X86-NEXT:    .cfi_def_cfa %esp, 4104; X86-NEXT:    retl105;106; X64-LABEL: f4:107; X64:       # %bb.0:108; X64-NEXT:    vaddsd %xmm0, %xmm0, %xmm0109; X64-NEXT:    vmovapd %xmm0, %xmm1110; X64-NEXT:    #ARITH_FENCE111; X64-NEXT:    vaddsd %xmm0, %xmm1, %xmm0112; X64-NEXT:    retq113  %1 = fadd fast double %a, %a114  %t = call double @llvm.arithmetic.fence.f64(double %1)115  %2 = fadd fast double %a, %a116  %3 = fadd fast double %t, %2117  ret double %3118}119 120define <2 x float> @f5(<2 x float> %a) {121; X86-LABEL: f5:122; X86:       # %bb.0:123; X86-NEXT:    vmulps {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0, %xmm0124; X86-NEXT:    retl125;126; X64-LABEL: f5:127; X64:       # %bb.0:128; X64-NEXT:    vmulps {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0129; X64-NEXT:    retq130  %1 = fadd fast <2 x float> %a, %a131  %2 = fadd fast <2 x float> %a, %a132  %3 = fadd fast <2 x float> %1, %2133  ret <2 x float> %3134}135 136define <2 x float> @f6(<2 x float> %a) {137; X86-LABEL: f6:138; X86:       # %bb.0:139; X86-NEXT:    vaddps %xmm0, %xmm0, %xmm0140; X86-NEXT:    vmovaps %xmm0, %xmm1141; X86-NEXT:    #ARITH_FENCE142; X86-NEXT:    vaddps %xmm0, %xmm1, %xmm0143; X86-NEXT:    retl144;145; X64-LABEL: f6:146; X64:       # %bb.0:147; X64-NEXT:    vaddps %xmm0, %xmm0, %xmm0148; X64-NEXT:    vmovaps %xmm0, %xmm1149; X64-NEXT:    #ARITH_FENCE150; X64-NEXT:    vaddps %xmm0, %xmm1, %xmm0151; X64-NEXT:    retq152  %1 = fadd fast <2 x float> %a, %a153  %t = call <2 x float> @llvm.arithmetic.fence.v2f32(<2 x float> %1)154  %2 = fadd fast <2 x float> %a, %a155  %3 = fadd fast <2 x float> %t, %2156  ret <2 x float> %3157}158 159; This @f7 IR test can be generated from flowing c test:160;161; typedef __float128 TYPE;162; TYPE foo(TYPE *qr) {163;   TYPE re =__arithmetic_fence(*qr);164;   return re;165;}166;167; with flowing build command:168; clang -cc1  -triple i386-pc-linux-gnu -mreassociate  t.c -emit-llvm -O2169 170define dso_local fp128 @foo(ptr nocapture readonly %qr) local_unnamed_addr{171; X86-LABEL: foo:172; X86:       # %bb.0: # %entry173; X86-NEXT:    pushl %edi174; X86-NEXT:    .cfi_def_cfa_offset 8175; X86-NEXT:    pushl %esi176; X86-NEXT:    .cfi_def_cfa_offset 12177; X86-NEXT:    .cfi_offset %esi, -12178; X86-NEXT:    .cfi_offset %edi, -8179; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax180; X86-NEXT:    movl {{[0-9]+}}(%esp), %ecx181; X86-NEXT:    movl 12(%ecx), %edx182; X86-NEXT:    movl 8(%ecx), %esi183; X86-NEXT:    movl (%ecx), %edi184; X86-NEXT:    movl 4(%ecx), %ecx185; X86-NEXT:    #ARITH_FENCE186; X86-NEXT:    #ARITH_FENCE187; X86-NEXT:    #ARITH_FENCE188; X86-NEXT:    #ARITH_FENCE189; X86-NEXT:    movl %edx, 12(%eax)190; X86-NEXT:    movl %esi, 8(%eax)191; X86-NEXT:    movl %ecx, 4(%eax)192; X86-NEXT:    movl %edi, (%eax)193; X86-NEXT:    popl %esi194; X86-NEXT:    .cfi_def_cfa_offset 8195; X86-NEXT:    popl %edi196; X86-NEXT:    .cfi_def_cfa_offset 4197; X86-NEXT:    retl $4198;199; X64-LABEL: foo:200; X64:       # %bb.0: # %entry201; X64-NEXT:    vmovaps (%rdi), %xmm0202; X64-NEXT:    #ARITH_FENCE203; X64-NEXT:    retq204entry:205  %0 = load fp128, ptr %qr, align 16206  %1 = tail call reassoc fp128 @llvm.arithmetic.fence.f128(fp128 %0)207  ret fp128 %1208}209 210declare fp128 @llvm.arithmetic.fence.f128(fp128)211declare float @llvm.arithmetic.fence.f32(float)212declare double @llvm.arithmetic.fence.f64(double)213declare <2 x float> @llvm.arithmetic.fence.v2f32(<2 x float>)214