diff options
| author | Jan Vesely <jan.vesely@rutgers.edu> | 2014-09-26 01:19:41 +0000 |
|---|---|---|
| committer | Jan Vesely <jan.vesely@rutgers.edu> | 2014-09-26 01:19:41 +0000 |
| commit | b4379f9c2c5de9d407d7a4d989683e2cc2d9fb56 (patch) | |
| tree | 77bda992af0d2374b64eff735d14d104d13004c4 | |
| parent | 0c652c3fbc13ad28f36f6eedcd92ad28a2bebe0b (diff) | |
| download | bcm5719-llvm-b4379f9c2c5de9d407d7a4d989683e2cc2d9fb56.tar.gz bcm5719-llvm-b4379f9c2c5de9d407d7a4d989683e2cc2d9fb56.zip | |
CGBuiltin: Use frem instruction rather than libcall to implement fmod
AFAICT the semantics of frem match libm's fmod.
Signed-off-by: Jan Vesely <jan.vesely@rutgers.edu>
Reviewed-by: Tom Stellard <tom@stellard.net>
llvm-svn: 218488
| -rw-r--r-- | clang/lib/CodeGen/CGBuiltin.cpp | 8 | ||||
| -rw-r--r-- | clang/test/CodeGen/builtins.c | 16 |
2 files changed, 24 insertions, 0 deletions
diff --git a/clang/lib/CodeGen/CGBuiltin.cpp b/clang/lib/CodeGen/CGBuiltin.cpp index 69ad762d18e..9238aae88cd 100644 --- a/clang/lib/CodeGen/CGBuiltin.cpp +++ b/clang/lib/CodeGen/CGBuiltin.cpp @@ -241,6 +241,14 @@ RValue CodeGenFunction::EmitBuiltinExpr(const FunctionDecl *FD, return RValue::get(Result); } + case Builtin::BI__builtin_fmod: + case Builtin::BI__builtin_fmodf: + case Builtin::BI__builtin_fmodl: { + Value *Arg1 = EmitScalarExpr(E->getArg(0)); + Value *Arg2 = EmitScalarExpr(E->getArg(1)); + Value *Result = Builder.CreateFRem(Arg1, Arg2, "fmod"); + return RValue::get(Result); + } case Builtin::BI__builtin_conj: case Builtin::BI__builtin_conjf: diff --git a/clang/test/CodeGen/builtins.c b/clang/test/CodeGen/builtins.c index 451ed07c738..6dd749a90bd 100644 --- a/clang/test/CodeGen/builtins.c +++ b/clang/test/CodeGen/builtins.c @@ -197,6 +197,22 @@ void test_float_builtins(float F, double D, long double LD) { // CHECK: and i1 } +// CHECK-LABEL: define void @test_float_builtin_ops +void test_float_builtin_ops(float F, double D, long double LD) { + volatile float resf; + volatile double resd; + volatile long double resld; + + resf = __builtin_fmodf(F,F); + // CHECK: frem float + + resd = __builtin_fmod(D,D); + // CHECK: frem double + + resld = __builtin_fmodl(LD,LD); + // CHECK: frem x86_fp80 +} + // CHECK-LABEL: define void @test_builtin_longjmp void test_builtin_longjmp(void **buffer) { // CHECK: [[BITCAST:%.*]] = bitcast |

