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 @@ -556,6 +556,12 @@ // Set the floating point rounding mode BUILTIN(__builtin_setrnd, "di", "") +// Get content from current FPSCR +BUILTIN(__builtin_readflm, "d", "") + +// Set content of FPSCR, and return its content before update +BUILTIN(__builtin_setflm, "dd", "") + // Cache built-ins BUILTIN(__builtin_dcbf, "vvC*", "") diff --git a/clang/test/CodeGen/builtins-ppc.c b/clang/test/CodeGen/builtins-ppc.c --- a/clang/test/CodeGen/builtins-ppc.c +++ b/clang/test/CodeGen/builtins-ppc.c @@ -27,3 +27,12 @@ // CHECK: call double @llvm.ppc.setrnd(i32 %2) res = __builtin_setrnd(x); } + +void test_builtin_ppc_flm() { + volatile double res; + // CHECK: call double @llvm.ppc.readflm() + res = __builtin_readflm(); + + // CHECK: call double @llvm.ppc.setflm(double %1) + res = __builtin_setflm(res); +} diff --git a/llvm/include/llvm/IR/IntrinsicsPowerPC.td b/llvm/include/llvm/IR/IntrinsicsPowerPC.td --- a/llvm/include/llvm/IR/IntrinsicsPowerPC.td +++ b/llvm/include/llvm/IR/IntrinsicsPowerPC.td @@ -48,9 +48,11 @@ def int_ppc_eieio : Intrinsic<[],[],[]>; // Get content from current FPSCR register - def int_ppc_readflm : Intrinsic<[llvm_double_ty], [], [IntrNoMem]>; + def int_ppc_readflm : GCCBuiltin<"__builtin_readflm">, + Intrinsic<[llvm_double_ty], [], [IntrNoMem]>; // Set FPSCR register, and return previous content - def int_ppc_setflm : Intrinsic<[llvm_double_ty], [llvm_double_ty], []>; + def int_ppc_setflm : GCCBuiltin<"__builtin_setflm">, + Intrinsic<[llvm_double_ty], [llvm_double_ty], []>; // Intrinsics for [double]word extended forms of divide instructions def int_ppc_divwe : GCCBuiltin<"__builtin_divwe">,