1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py 2; RUN: llc < %s -mtriple=i686-unknown-unknown -mattr=+sse2 | FileCheck %s --check-prefixes=X86 3; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+sse2 | FileCheck %s --check-prefixes=X64 4 5; FIXME: Missing fsub(x,fneg(y)) -> fadd(x,y) fold 6define float @fneg_strict_fsub_to_strict_fadd(float %x, float %y) nounwind strictfp { 7; X86-LABEL: fneg_strict_fsub_to_strict_fadd: 8; X86: # %bb.0: 9; X86-NEXT: pushl %eax 10; X86-NEXT: movss {{.*#+}} xmm0 = mem[0],zero,zero,zero 11; X86-NEXT: movss {{.*#+}} xmm1 = mem[0],zero,zero,zero 12; X86-NEXT: xorps {{\.?LCPI[0-9]+_[0-9]+}}, %xmm1 13; X86-NEXT: subss %xmm1, %xmm0 14; X86-NEXT: movss %xmm0, (%esp) 15; X86-NEXT: flds (%esp) 16; X86-NEXT: wait 17; X86-NEXT: popl %eax 18; X86-NEXT: retl 19; 20; X64-LABEL: fneg_strict_fsub_to_strict_fadd: 21; X64: # %bb.0: 22; X64-NEXT: xorps {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1 23; X64-NEXT: subss %xmm1, %xmm0 24; X64-NEXT: retq 25 %neg = fneg float %y 26 %sub = call float @llvm.experimental.constrained.fsub.f32(float %x, float %neg, metadata!"round.dynamic", metadata!"fpexcept.strict") 27 ret float %sub 28} 29 30; FIXME: Missing fsub(x,fneg(y)) -> fadd(x,y) fold 31define double @fneg_strict_fsub_to_strict_fadd_d(double %x, double %y) nounwind strictfp { 32; X86-LABEL: fneg_strict_fsub_to_strict_fadd_d: 33; X86: # %bb.0: 34; X86-NEXT: pushl %ebp 35; X86-NEXT: movl %esp, %ebp 36; X86-NEXT: andl $-8, %esp 37; X86-NEXT: subl $8, %esp 38; X86-NEXT: movsd {{.*#+}} xmm0 = mem[0],zero 39; X86-NEXT: movsd {{.*#+}} xmm1 = mem[0],zero 40; X86-NEXT: xorpd {{\.?LCPI[0-9]+_[0-9]+}}, %xmm1 41; X86-NEXT: subsd %xmm1, %xmm0 42; X86-NEXT: movsd %xmm0, (%esp) 43; X86-NEXT: fldl (%esp) 44; X86-NEXT: wait 45; X86-NEXT: movl %ebp, %esp 46; X86-NEXT: popl %ebp 47; X86-NEXT: retl 48; 49; X64-LABEL: fneg_strict_fsub_to_strict_fadd_d: 50; X64: # %bb.0: 51; X64-NEXT: xorpd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1 52; X64-NEXT: subsd %xmm1, %xmm0 53; X64-NEXT: retq 54 %neg = fneg double %y 55 %sub = call double @llvm.experimental.constrained.fsub.f64(double %x, double %neg, metadata!"round.dynamic", metadata!"fpexcept.strict") 56 ret double %sub 57} 58 59; FIXME: Missing fneg(fsub(x,y)) -> fsub(y,x) fold 60define float @strict_fsub_fneg_to_strict_fsub(float %x, float %y) nounwind strictfp { 61; X86-LABEL: strict_fsub_fneg_to_strict_fsub: 62; X86: # %bb.0: 63; X86-NEXT: pushl %eax 64; X86-NEXT: movss {{.*#+}} xmm0 = mem[0],zero,zero,zero 65; X86-NEXT: subss {{[0-9]+}}(%esp), %xmm0 66; X86-NEXT: xorps {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0 67; X86-NEXT: movss %xmm0, (%esp) 68; X86-NEXT: flds (%esp) 69; X86-NEXT: wait 70; X86-NEXT: popl %eax 71; X86-NEXT: retl 72; 73; X64-LABEL: strict_fsub_fneg_to_strict_fsub: 74; X64: # %bb.0: 75; X64-NEXT: subss %xmm1, %xmm0 76; X64-NEXT: xorps {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0 77; X64-NEXT: retq 78 %sub = call float @llvm.experimental.constrained.fsub.f32(float %x, float %y, metadata!"round.dynamic", metadata!"fpexcept.strict") 79 %neg = fneg float %sub 80 ret float %neg 81} 82 83; FIXME: Missing fneg(fsub(x,y)) -> fsub(y,x) fold 84define double @strict_fsub_fneg_to_strict_fsub_d(double %x, double %y) nounwind strictfp { 85; X86-LABEL: strict_fsub_fneg_to_strict_fsub_d: 86; X86: # %bb.0: 87; X86-NEXT: pushl %ebp 88; X86-NEXT: movl %esp, %ebp 89; X86-NEXT: andl $-8, %esp 90; X86-NEXT: subl $8, %esp 91; X86-NEXT: movsd {{.*#+}} xmm0 = mem[0],zero 92; X86-NEXT: subsd 16(%ebp), %xmm0 93; X86-NEXT: xorpd {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0 94; X86-NEXT: movlpd %xmm0, (%esp) 95; X86-NEXT: fldl (%esp) 96; X86-NEXT: wait 97; X86-NEXT: movl %ebp, %esp 98; X86-NEXT: popl %ebp 99; X86-NEXT: retl 100; 101; X64-LABEL: strict_fsub_fneg_to_strict_fsub_d: 102; X64: # %bb.0: 103; X64-NEXT: subsd %xmm1, %xmm0 104; X64-NEXT: xorpd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0 105; X64-NEXT: retq 106 %sub = call double @llvm.experimental.constrained.fsub.f64(double %x, double %y, metadata!"round.dynamic", metadata!"fpexcept.strict") 107 %neg = fneg double %sub 108 ret double %neg 109} 110 111 112declare float @llvm.experimental.constrained.fsub.f32(float, float, metadata, metadata) 113declare double @llvm.experimental.constrained.fsub.f64(double, double, metadata, metadata) 114