diff --git a/clang/include/clang/Basic/BuiltinsPPC.def b/clang/include/clang/Basic/BuiltinsPPC.def --- a/clang/include/clang/Basic/BuiltinsPPC.def +++ b/clang/include/clang/Basic/BuiltinsPPC.def @@ -96,6 +96,8 @@ BUILTIN(__builtin_ppc_swdivs_nochk, "fff", "") BUILTIN(__builtin_ppc_alignx, "vIivC*", "nc") BUILTIN(__builtin_ppc_rdlam, "UWiUWiUWiUWIi", "nc") +BUILTIN(__builtin_ppc_swdiv, "ddd", "") +BUILTIN(__builtin_ppc_swdivs, "fff", "") // Compare BUILTIN(__builtin_ppc_cmpeqb, "LLiLLiLLi", "") BUILTIN(__builtin_ppc_cmprb, "iCIiii", "") diff --git a/clang/lib/Basic/Targets/PPC.cpp b/clang/lib/Basic/Targets/PPC.cpp --- a/clang/lib/Basic/Targets/PPC.cpp +++ b/clang/lib/Basic/Targets/PPC.cpp @@ -238,6 +238,8 @@ Builder.defineMacro("__fsqrts", "__builtin_ppc_fsqrts"); Builder.defineMacro("__addex", "__builtin_ppc_addex"); Builder.defineMacro("__cmplxl", "__builtin_complex"); + Builder.defineMacro("__swdiv", "__builtin_ppc_swdiv"); + Builder.defineMacro("__swdivs", "__builtin_ppc_swdivs"); } /// PPCTargetInfo::getTargetDefines - Return a set of the PowerPC-specific diff --git a/clang/lib/CodeGen/CGBuiltin.cpp b/clang/lib/CodeGen/CGBuiltin.cpp --- a/clang/lib/CodeGen/CGBuiltin.cpp +++ b/clang/lib/CodeGen/CGBuiltin.cpp @@ -16035,6 +16035,9 @@ *this, E, Intrinsic::sqrt, Intrinsic::experimental_constrained_sqrt)) .getScalarVal(); + case PPC::BI__builtin_ppc_swdiv: + case PPC::BI__builtin_ppc_swdivs: + return Builder.CreateFDiv(Ops[0], Ops[1], "swdiv"); } } diff --git a/clang/test/CodeGen/builtins-ppc-xlcompat-swdiv.c b/clang/test/CodeGen/builtins-ppc-xlcompat-swdiv.c new file mode 100644 --- /dev/null +++ b/clang/test/CodeGen/builtins-ppc-xlcompat-swdiv.c @@ -0,0 +1,54 @@ +// REQUIRES: powerpc-registered-target +// RUN: %clang_cc1 -triple powerpc64-unknown-unknown \ +// RUN: -emit-llvm %s -o - -target-cpu pwr7 | FileCheck %s +// RUN: %clang_cc1 -triple powerpc64le-unknown-unknown \ +// RUN: -emit-llvm %s -o - -target-cpu pwr8 | FileCheck %s +// RUN: %clang_cc1 -triple powerpc64-unknown-aix \ +// RUN: -emit-llvm %s -o - -target-cpu pwr7 | FileCheck %s +// RUN: %clang_cc1 -triple powerpc-unknown-aix \ +// RUN: -emit-llvm %s -o - -target-cpu pwr7 | FileCheck %s + +extern double a; +extern double b; +extern float c; +extern float d; + +// CHECK-LABEL: @test_swdiv( +// CHECK: [[TMP0:%.*]] = load double, double* @a +// CHECK-NEXT: [[TMP1:%.*]] = load double, double* @b +// CHECK-NEXT: [[SWDIV:%.*]] = fdiv double [[TMP0]], [[TMP1]] +// CHECK-NEXT: ret double [[SWDIV]] +// +double test_swdiv() { + return __swdiv(a, b); +} + +// CHECK-LABEL: @test_swdivs( +// CHECK: [[TMP0:%.*]] = load float, float* @c +// CHECK-NEXT: [[TMP1:%.*]] = load float, float* @d +// CHECK-NEXT: [[SWDIVS:%.*]] = fdiv float [[TMP0]], [[TMP1]] +// CHECK-NEXT: ret float [[SWDIVS]] +// +float test_swdivs() { + return __swdivs(c, d); +} + +// CHECK-LABEL: @test_builtin_ppc_swdiv( +// CHECK: [[TMP0:%.*]] = load double, double* @a +// CHECK-NEXT: [[TMP1:%.*]] = load double, double* @b +// CHECK-NEXT: [[SWDIV:%.*]] = fdiv double [[TMP0]], [[TMP1]] +// CHECK-NEXT: ret double [[SWDIV]] +// +double test_builtin_ppc_swdiv() { + return __builtin_ppc_swdiv(a, b); +} + +// CHECK-LABEL: @test_builtin_ppc_swdivs( +// CHECK: [[TMP0:%.*]] = load float, float* @c +// CHECK-NEXT: [[TMP1:%.*]] = load float, float* @d +// CHECK-NEXT: [[SWDIVS:%.*]] = fdiv float [[TMP0]], [[TMP1]] +// CHECK-NEXT: ret float [[SWDIVS]] +// +float test_builtin_ppc_swdivs() { + return __builtin_ppc_swdivs(c, d); +}