[llvm] r210720 - [FastISel][X86] Add support for the sqrt intrinsic.

Eric Christopher echristo at gmail.com
Wed Jun 11 17:49:53 PDT 2014


> +    // Unfortunatelly we can't use FastEmit_r, because the AVX version of FSQRT
> +    // is not generated by FastISel yet.
> +    // FIXME: Update this code once tablegen can handle it.

Assuming you've looked, curious about this?

-eric

> +    static const unsigned SqrtOpc[2][2] = {
> +      {X86::SQRTSSr, X86::VSQRTSSr},
> +      {X86::SQRTSDr, X86::VSQRTSDr}
> +    };
> +    bool HasAVX = Subtarget->hasAVX();
> +    unsigned Opc;
> +    const TargetRegisterClass *RC;
> +    switch (VT.SimpleTy) {
> +    default: return false;
> +    case MVT::f32: Opc = SqrtOpc[0][HasAVX]; RC = &X86::FR32RegClass; break;
> +    case MVT::f64: Opc = SqrtOpc[1][HasAVX]; RC = &X86::FR64RegClass; break;
> +    }
> +
> +    const Value *SrcVal = I.getArgOperand(0);
> +    unsigned SrcReg = getRegForValue(SrcVal);
> +
> +    if (SrcReg == 0)
> +      return false;
> +
> +    unsigned ImplicitDefReg = 0;
> +    if (HasAVX) {
> +      ImplicitDefReg = createResultReg(RC);
> +      BuildMI(*FuncInfo.MBB, FuncInfo.InsertPt, DbgLoc,
> +              TII.get(TargetOpcode::IMPLICIT_DEF), ImplicitDefReg);
> +    }
> +
> +    unsigned ResultReg = createResultReg(RC);
> +    MachineInstrBuilder MIB;
> +    MIB = BuildMI(*FuncInfo.MBB, FuncInfo.InsertPt, DbgLoc, TII.get(Opc),
> +                  ResultReg);
> +
> +    if (ImplicitDefReg)
> +      MIB.addReg(ImplicitDefReg);
> +
> +    MIB.addReg(SrcReg);
> +
> +    UpdateValueMap(&I, ResultReg);
> +    return true;
> +  }
>    case Intrinsic::sadd_with_overflow:
>    case Intrinsic::uadd_with_overflow:
>    case Intrinsic::ssub_with_overflow:
>
> Added: llvm/trunk/test/CodeGen/X86/sqrt.ll
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/X86/sqrt.ll?rev=210720&view=auto
> ==============================================================================
> --- llvm/trunk/test/CodeGen/X86/sqrt.ll (added)
> +++ llvm/trunk/test/CodeGen/X86/sqrt.ll Wed Jun 11 18:11:02 2014
> @@ -0,0 +1,26 @@
> +; RUN: llc < %s -mtriple=x86_64-apple-darwin -mattr=-avx,+sse2                             | FileCheck %s --check-prefix=SSE2
> +; RUN: llc < %s -mtriple=x86_64-apple-darwin -mattr=-avx,+sse2 -fast-isel -fast-isel-abort | FileCheck %s --check-prefix=SSE2
> +; RUN: llc < %s -mtriple=x86_64-apple-darwin -mattr=-avx2,+avx                             | FileCheck %s --check-prefix=AVX
> +; RUN: llc < %s -mtriple=x86_64-apple-darwin -mattr=-avx2,+avx -fast-isel -fast-isel-abort | FileCheck %s --check-prefix=AVX
> +
> +define float @test_sqrt_f32(float %a) {
> +; SSE2-LABEL: test_sqrt_f32
> +; SSE2:       sqrtss %xmm0, %xmm0
> +; AVX-LABEL:  test_sqrt_f32
> +; AVX:        vsqrtss %xmm0, %xmm0
> +  %res = call float @llvm.sqrt.f32(float %a)
> +  ret float %res
> +}
> +declare float @llvm.sqrt.f32(float) nounwind readnone
> +
> +define double @test_sqrt_f64(double %a) {
> +; SSE2-LABEL: test_sqrt_f64
> +; SSE2:       sqrtsd %xmm0, %xmm0
> +; AVX-LABEL:  test_sqrt_f64
> +; AVX:        vsqrtsd %xmm0, %xmm0
> +  %res = call double @llvm.sqrt.f64(double %a)
> +  ret double %res
> +}
> +declare double @llvm.sqrt.f64(double) nounwind readnone
> +
> +
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits



More information about the llvm-commits mailing list