Index: include/clang/Basic/BuiltinsARM.def =================================================================== --- include/clang/Basic/BuiltinsARM.def +++ include/clang/Basic/BuiltinsARM.def @@ -52,8 +52,8 @@ BUILTIN(__builtin_arm_mcr2, "vUIiUIiUiUIiUIiUIi", "") BUILTIN(__builtin_arm_mrc, "UiUIiUIiUIiUIiUIi", "") BUILTIN(__builtin_arm_mrc2, "UiUIiUIiUIiUIiUIi", "") -BUILTIN(__builtin_arm_cdp, "vUiUiUiUiUiUi", "") -BUILTIN(__builtin_arm_cdp2, "vUiUiUiUiUiUi", "") +BUILTIN(__builtin_arm_cdp, "vUIiUIiUIiUIiUIiUIi", "") +BUILTIN(__builtin_arm_cdp2, "vUIiUIiUIiUIiUIiUIi", "") BUILTIN(__builtin_arm_mcrr, "vUIiUIiUiUiUIi", "") BUILTIN(__builtin_arm_mcrr2, "vUIiUIiUiUiUIi", "") Index: lib/Headers/arm_acle.h =================================================================== --- lib/Headers/arm_acle.h +++ lib/Headers/arm_acle.h @@ -297,6 +297,10 @@ } #endif +/* Co-Processor Intrinsics */ +#define __arm_cdp(coproc, opc1, crd, crn, crm, opc2) __builtin_arm_cdp(coproc, opc1, crd, crn, crm, opc2) +#define __arm_cdp2(coproc, opc1, crd, crn, crm, opc2) __builtin_arm_cdp2(coproc, opc1, crd, crn, crm, opc2) + /* 10.1 Special register intrinsics */ #define __arm_rsr(sysreg) __builtin_arm_rsr(sysreg) #define __arm_rsr64(sysreg) __builtin_arm_rsr64(sysreg) Index: test/CodeGen/arm-coproc-intrinsics.c =================================================================== --- /dev/null +++ test/CodeGen/arm-coproc-intrinsics.c @@ -0,0 +1,11 @@ +// RUN: %clang_cc1 -Wall -triple thumbv7-eabi -target-cpu cortex-a8 -S -o - %s | FileCheck %s + +#include + +void test1() { + // CHECK: cdp p1, #2, c3, c4, c5, #6 + __arm_cdp(1, 2, 3, 4, 5, 6); + + // CHECK: cdp2 p1, #2, c3, c4, c5, #6 + __arm_cdp2(1, 2, 3, 4, 5, 6); +} Index: test/CodeGen/builtins-arm.c =================================================================== --- test/CodeGen/builtins-arm.c +++ test/CodeGen/builtins-arm.c @@ -84,6 +84,20 @@ // CHECK: call {{.*}} @llvm.prefetch(i8* %{{.*}}, i32 1, i32 3, i32 0) } +void cdp() { + // CHECK: define void @cdp() + // CHECK: call void @llvm.arm.cdp(i32 1, i32 2, i32 3, i32 4, i32 5, i32 6) + // CHECK-NEXT: ret void + __builtin_arm_cdp(1, 2, 3, 4, 5, 6); +} + +void cdp2() { + // CHECK: define void @cdp2() + // CHECK: call void @llvm.arm.cdp2(i32 1, i32 2, i32 3, i32 4, i32 5, i32 6) + // CHECK-NEXT: ret void + __builtin_arm_cdp2(1, 2, 3, 4, 5, 6); +} + unsigned mrc() { // CHECK: define i32 @mrc() // CHECK: [[R:%.*]] = call i32 @llvm.arm.mrc(i32 15, i32 0, i32 13, i32 0, i32 3) Index: test/Sema/builtins-arm.c =================================================================== --- test/Sema/builtins-arm.c +++ test/Sema/builtins-arm.c @@ -48,6 +48,18 @@ } void test6(int a, int b, int c) { + __builtin_arm_cdp(a, 2, 3, 4, 5, 6); // expected-error {{argument to '__builtin_arm_cdp' must be a constant integer}} + __builtin_arm_cdp(1, a, 3, 4, 5, 6); // expected-error {{argument to '__builtin_arm_cdp' must be a constant integer}} + __builtin_arm_cdp(1, 2, a, 4, 5, 6); // expected-error {{argument to '__builtin_arm_cdp' must be a constant integer}} + __builtin_arm_cdp(1, 2, 3, a, 5, 6); // expected-error {{argument to '__builtin_arm_cdp' must be a constant integer}} + __builtin_arm_cdp(1, 2, 3, 4, 5, a); // expected-error {{argument to '__builtin_arm_cdp' must be a constant integer}} + + __builtin_arm_cdp2(a, 2, 3, 4, 5, 6); // expected-error {{argument to '__builtin_arm_cdp2' must be a constant integer}} + __builtin_arm_cdp2(1, a, 3, 4, 5, 6); // expected-error {{argument to '__builtin_arm_cdp2' must be a constant integer}} + __builtin_arm_cdp2(1, 2, a, 4, 5, 6); // expected-error {{argument to '__builtin_arm_cdp2' must be a constant integer}} + __builtin_arm_cdp2(1, 2, 3, a, 5, 6); // expected-error {{argument to '__builtin_arm_cdp2' must be a constant integer}} + __builtin_arm_cdp2(1, 2, 3, 4, 5, a); // expected-error {{argument to '__builtin_arm_cdp2' must be a constant integer}} + __builtin_arm_mrc( a, 0, 13, 0, 3); // expected-error {{argument to '__builtin_arm_mrc' must be a constant integer}} __builtin_arm_mrc(15, a, 13, 0, 3); // expected-error {{argument to '__builtin_arm_mrc' must be a constant integer}} __builtin_arm_mrc(15, 0, a, 0, 3); // expected-error {{argument to '__builtin_arm_mrc' must be a constant integer}}