diff options
Diffstat (limited to 'clang')
-rw-r--r-- | clang/lib/CodeGen/CGBuiltin.cpp | 8 | ||||
-rw-r--r-- | clang/test/CodeGen/arm-microsoft-intrinsics.c | 12 |
2 files changed, 14 insertions, 6 deletions
diff --git a/clang/lib/CodeGen/CGBuiltin.cpp b/clang/lib/CodeGen/CGBuiltin.cpp index a14daac596f..87def369c4f 100644 --- a/clang/lib/CodeGen/CGBuiltin.cpp +++ b/clang/lib/CodeGen/CGBuiltin.cpp @@ -1831,6 +1831,14 @@ RValue CodeGenFunction::EmitBuiltinExpr(const FunctionDecl *FD, Args.push_back(ArgValue); } + // The ARM _MoveToCoprocessor builtins put the input register value as + // the first argument, but the LLVM intrinsic expects it as the third one. + if (BuiltinID == ARM::BI_MoveToCoprocessor || + BuiltinID == ARM::BI_MoveToCoprocessor2) { + return RValue::get(Builder.CreateCall(F, {Args[1], Args[2], Args[0], + Args[3], Args[4], Args[5]})); + } + Value *V = Builder.CreateCall(F, Args); QualType BuiltinRetType = E->getType(); diff --git a/clang/test/CodeGen/arm-microsoft-intrinsics.c b/clang/test/CodeGen/arm-microsoft-intrinsics.c index 5f19e5e7c87..44782453a7a 100644 --- a/clang/test/CodeGen/arm-microsoft-intrinsics.c +++ b/clang/test/CodeGen/arm-microsoft-intrinsics.c @@ -47,17 +47,17 @@ unsigned int check_MoveFromCoprocessor2(void) { // CHECK-MSVC: @llvm.arm.mrc2(i32 0, i32 0, i32 0, i32 0, i32 0) // CHECK-EABI: error: implicit declaration of function '_MoveFromCoprocessor2' -void check_MoveToCoprocessor(void) { - _MoveToCoprocessor(0, 0, 0, 0, 0, 0); +void check_MoveToCoprocessor(unsigned int value) { + _MoveToCoprocessor(value, 10, 7, 1, 0, 0); } -// CHECK-MSVC: @llvm.arm.mcr(i32 0, i32 0, i32 0, i32 0, i32 0, i32 0) +// CHECK-MSVC: @llvm.arm.mcr(i32 10, i32 7, i32 %0, i32 1, i32 0, i32 0) // CHECK-EABI: error: implicit declaration of function '_MoveToCoprocessor' -void check_MoveToCoprocessor2(void) { - _MoveToCoprocessor2(0, 0, 0, 0, 0, 0); +void check_MoveToCoprocessor2(unsigned int value) { + _MoveToCoprocessor2(value, 10, 7, 1, 0, 0); } -// CHECK-MSVC: @llvm.arm.mcr2(i32 0, i32 0, i32 0, i32 0, i32 0, i32 0) +// CHECK-MSVC: @llvm.arm.mcr2(i32 10, i32 7, i32 %0, i32 1, i32 0, i32 0) // CHECK-EABI: error: implicit declaration of function '_MoveToCoprocessor2' |