summaryrefslogtreecommitdiffstats
path: root/clang/test/CodeGen
diff options
context:
space:
mode:
authorNirav Dave <niravd@google.com>2019-02-14 19:27:25 +0000
committerNirav Dave <niravd@google.com>2019-02-14 19:27:25 +0000
commit90868bb0584f657c2b307309c217dece1f13b0ac (patch)
treeaede6c7d4cc9d3170df14b3ef26d176183a80b86 /clang/test/CodeGen
parent980fb790c1791cbf7589053b15fccb6f9c14db5d (diff)
downloadbcm5719-llvm-90868bb0584f657c2b307309c217dece1f13b0ac.tar.gz
bcm5719-llvm-90868bb0584f657c2b307309c217dece1f13b0ac.zip
[X86] Add clang support for X86 flag output parameters.
Summary: Add frontend support and expected flags for X86 inline assembly flag parameters. Reviewers: craig.topper, rnk, echristo Subscribers: eraman, nickdesaulniers, void, llvm-commits Differential Revision: https://reviews.llvm.org/D57394 llvm-svn: 354053
Diffstat (limited to 'clang/test/CodeGen')
-rw-r--r--clang/test/CodeGen/inline-asm-x86-flag-output.c365
1 files changed, 365 insertions, 0 deletions
diff --git a/clang/test/CodeGen/inline-asm-x86-flag-output.c b/clang/test/CodeGen/inline-asm-x86-flag-output.c
new file mode 100644
index 00000000000..f647e3e3c1e
--- /dev/null
+++ b/clang/test/CodeGen/inline-asm-x86-flag-output.c
@@ -0,0 +1,365 @@
+// RUN: %clang_cc1 -O2 -emit-llvm %s -o - -triple x86_64-unknown-linux-gnu | FileCheck %s
+
+int test_cca(long nr, volatile long *addr) {
+ //CHECK-LABEL: @test_cca
+ //CHECK: = tail call i32 asm "cmp $2,$1", "={@cca},=*m,r,~{cc},~{dirflag},~{fpsr},~{flags}"(i64* %addr, i64 %nr)
+ int x;
+ asm("cmp %2,%1"
+ : "=@cca"(x), "=m"(*(volatile long *)(addr))
+ : "r"(nr)
+ : "cc");
+ if (x)
+ return 0;
+ return 1;
+}
+
+int test_ccae(long nr, volatile long *addr) {
+ //CHECK-LABEL: @test_ccae
+ //CHECK: = tail call i32 asm "cmp $2,$1", "={@ccae},=*m,r,~{cc},~{dirflag},~{fpsr},~{flags}"(i64* %addr, i64 %nr)
+ int x;
+ asm("cmp %2,%1"
+ : "=@ccae"(x), "=m"(*(volatile long *)(addr))
+ : "r"(nr)
+ : "cc");
+ if (x)
+ return 0;
+ return 1;
+}
+
+int test_ccb(long nr, volatile long *addr) {
+ //CHECK-LABEL: @test_ccb
+ //CHECK: = tail call i32 asm "cmp $2,$1", "={@ccb},=*m,r,~{cc},~{dirflag},~{fpsr},~{flags}"(i64* %addr, i64 %nr)
+ int x;
+ asm("cmp %2,%1"
+ : "=@ccb"(x), "=m"(*(volatile long *)(addr))
+ : "r"(nr)
+ : "cc");
+ if (x)
+ return 0;
+ return 1;
+}
+
+int test_ccbe(long nr, volatile long *addr) {
+ //CHECK-LABEL: @test_ccbe
+ //CHECK: tail call i32 asm "cmp $2,$1", "={@ccbe},=*m,r,~{cc},~{dirflag},~{fpsr},~{flags}"(i64* %addr, i64 %nr)
+ int x;
+ asm("cmp %2,%1"
+ : "=@ccbe"(x), "=m"(*(volatile long *)(addr))
+ : "r"(nr)
+ : "cc");
+ if (x)
+ return 0;
+ return 1;
+}
+
+int test_ccc(long nr, volatile long *addr) {
+ //CHECK-LABEL: @test_ccc
+ //CHECK: = tail call i32 asm "cmp $2,$1", "={@ccc},=*m,r,~{cc},~{dirflag},~{fpsr},~{flags}"(i64* %addr, i64 %nr)
+ int x;
+ asm("cmp %2,%1"
+ : "=@ccc"(x), "=m"(*(volatile long *)(addr))
+ : "r"(nr)
+ : "cc");
+ if (x)
+ return 0;
+ return 1;
+}
+
+int test_cce(long nr, volatile long *addr) {
+ //CHECK-LABEL: @test_cce
+ //CHECK: = tail call i32 asm "cmp $2,$1", "={@cce},=*m,r,~{cc},~{dirflag},~{fpsr},~{flags}"(i64* %addr, i64 %nr)
+ int x;
+ asm("cmp %2,%1"
+ : "=@cce"(x), "=m"(*(volatile long *)(addr))
+ : "r"(nr)
+ : "cc");
+ if (x)
+ return 0;
+ return 1;
+}
+
+int test_ccz(long nr, volatile long *addr) {
+ //CHECK-LABEL: @test_ccz
+ //CHECK: = tail call i32 asm "cmp $2,$1", "={@ccz},=*m,r,~{cc},~{dirflag},~{fpsr},~{flags}"(i64* %addr, i64 %nr)
+ int x;
+ asm("cmp %2,%1"
+ : "=@ccz"(x), "=m"(*(volatile long *)(addr))
+ : "r"(nr)
+ : "cc");
+ if (x)
+ return 0;
+ return 1;
+}
+
+int test_ccg(long nr, volatile long *addr) {
+ //CHECK-LABEL: @test_ccg
+ //CHECK: = tail call i32 asm "cmp $2,$1", "={@ccg},=*m,r,~{cc},~{dirflag},~{fpsr},~{flags}"(i64* %addr, i64 %nr)
+ int x;
+ asm("cmp %2,%1"
+ : "=@ccg"(x), "=m"(*(volatile long *)(addr))
+ : "r"(nr)
+ : "cc");
+ if (x)
+ return 0;
+ return 1;
+}
+
+int test_ccge(long nr, volatile long *addr) {
+ //CHECK-LABEL: @test_ccge
+ //CHECK: = tail call i32 asm "cmp $2,$1", "={@ccge},=*m,r,~{cc},~{dirflag},~{fpsr},~{flags}"(i64* %addr, i64 %nr)
+ int x;
+ asm("cmp %2,%1"
+ : "=@ccge"(x), "=m"(*(volatile long *)(addr))
+ : "r"(nr)
+ : "cc");
+ if (x)
+ return 0;
+ return 1;
+}
+
+int test_ccl(long nr, volatile long *addr) {
+ //CHECK-LABEL: @test_ccl
+ //CHECK: = tail call i32 asm "cmp $2,$1", "={@ccl},=*m,r,~{cc},~{dirflag},~{fpsr},~{flags}"(i64* %addr, i64 %nr)
+ int x;
+ asm("cmp %2,%1"
+ : "=@ccl"(x), "=m"(*(volatile long *)(addr))
+ : "r"(nr)
+ : "cc");
+ if (x)
+ return 0;
+ return 1;
+}
+
+int test_ccle(long nr, volatile long *addr) {
+ //CHECK-LABEL: @test_ccle
+ //CHECK: = tail call i32 asm "cmp $2,$1", "={@ccle},=*m,r,~{cc},~{dirflag},~{fpsr},~{flags}"(i64* %addr, i64 %nr)
+ int x;
+ asm("cmp %2,%1"
+ : "=@ccle"(x), "=m"(*(volatile long *)(addr))
+ : "r"(nr)
+ : "cc");
+ if (x)
+ return 0;
+ return 1;
+}
+
+int test_ccna(long nr, volatile long *addr) {
+ //CHECK-LABEL: @test_ccna
+ //CHECK: = tail call i32 asm "cmp $2,$1", "={@ccna},=*m,r,~{cc},~{dirflag},~{fpsr},~{flags}"(i64* %addr, i64 %nr)
+ int x;
+ asm("cmp %2,%1"
+ : "=@ccna"(x), "=m"(*(volatile long *)(addr))
+ : "r"(nr)
+ : "cc");
+ if (x)
+ return 0;
+ return 1;
+}
+
+int test_ccnae(long nr, volatile long *addr) {
+ //CHECK-LABEL: @test_ccnae
+ //CHECK: = tail call i32 asm "cmp $2,$1", "={@ccnae},=*m,r,~{cc},~{dirflag},~{fpsr},~{flags}"(i64* %addr, i64 %nr)
+ int x;
+ asm("cmp %2,%1"
+ : "=@ccnae"(x), "=m"(*(volatile long *)(addr))
+ : "r"(nr)
+ : "cc");
+ if (x)
+ return 0;
+ return 1;
+}
+
+int test_ccnb(long nr, volatile long *addr) {
+ //CHECK-LABEL: @test_ccnb
+ //CHECK: = tail call i32 asm "cmp $2,$1", "={@ccnb},=*m,r,~{cc},~{dirflag},~{fpsr},~{flags}"(i64* %addr, i64 %nr)
+ int x;
+ asm("cmp %2,%1"
+ : "=@ccnb"(x), "=m"(*(volatile long *)(addr))
+ : "r"(nr)
+ : "cc");
+ if (x)
+ return 0;
+ return 1;
+}
+
+int test_ccnbe(long nr, volatile long *addr) {
+ //CHECK-LABEL: @test_ccnbe
+ //CHECK: = tail call i32 asm "cmp $2,$1", "={@ccnbe},=*m,r,~{cc},~{dirflag},~{fpsr},~{flags}"(i64* %addr, i64 %nr)
+ int x;
+ asm("cmp %2,%1"
+ : "=@ccnbe"(x), "=m"(*(volatile long *)(addr))
+ : "r"(nr)
+ : "cc");
+ if (x)
+ return 0;
+ return 1;
+}
+
+int test_ccnc(long nr, volatile long *addr) {
+ //CHECK-LABEL: @test_ccnc
+ //CHECK: = tail call i32 asm "cmp $2,$1", "={@ccnc},=*m,r,~{cc},~{dirflag},~{fpsr},~{flags}"(i64* %addr, i64 %nr)
+ int x;
+ asm("cmp %2,%1"
+ : "=@ccnc"(x), "=m"(*(volatile long *)(addr))
+ : "r"(nr)
+ : "cc");
+ if (x)
+ return 0;
+ return 1;
+}
+
+int test_ccne(long nr, volatile long *addr) {
+ //CHECK-LABEL: @test_ccne
+ //CHECK: = tail call i32 asm "cmp $2,$1", "={@ccne},=*m,r,~{cc},~{dirflag},~{fpsr},~{flags}"(i64* %addr, i64 %nr)
+ int x;
+ asm("cmp %2,%1"
+ : "=@ccne"(x), "=m"(*(volatile long *)(addr))
+ : "r"(nr)
+ : "cc");
+ if (x)
+ return 0;
+ return 1;
+}
+
+int test_ccnz(long nr, volatile long *addr) {
+ //CHECK-LABEL: @test_ccnz
+ //CHECK: = tail call i32 asm "cmp $2,$1", "={@ccnz},=*m,r,~{cc},~{dirflag},~{fpsr},~{flags}"(i64* %addr, i64 %nr)
+ int x;
+ asm("cmp %2,%1"
+ : "=@ccnz"(x), "=m"(*(volatile long *)(addr))
+ : "r"(nr)
+ : "cc");
+ if (x)
+ return 0;
+ return 1;
+}
+
+int test_ccng(long nr, volatile long *addr) {
+ //CHECK-LABEL: @test_ccng
+ //CHECK: = tail call i32 asm "cmp $2,$1", "={@ccng},=*m,r,~{cc},~{dirflag},~{fpsr},~{flags}"(i64* %addr, i64 %nr)
+ int x;
+ asm("cmp %2,%1"
+ : "=@ccng"(x), "=m"(*(volatile long *)(addr))
+ : "r"(nr)
+ : "cc");
+ if (x)
+ return 0;
+ return 1;
+}
+
+int test_ccnge(long nr, volatile long *addr) {
+ //CHECK-LABEL: @test_ccnge
+ //CHECK: = tail call i32 asm "cmp $2,$1", "={@ccnge},=*m,r,~{cc},~{dirflag},~{fpsr},~{flags}"(i64* %addr, i64 %nr)
+ int x;
+ asm("cmp %2,%1"
+ : "=@ccnge"(x), "=m"(*(volatile long *)(addr))
+ : "r"(nr)
+ : "cc");
+ if (x)
+ return 0;
+ return 1;
+}
+
+int test_ccnl(long nr, volatile long *addr) {
+ //CHECK-LABEL: @test_ccnl
+ //CHECK: = tail call i32 asm "cmp $2,$1", "={@ccnl},=*m,r,~{cc},~{dirflag},~{fpsr},~{flags}"(i64* %addr, i64 %nr)
+ int x;
+ asm("cmp %2,%1"
+ : "=@ccnl"(x), "=m"(*(volatile long *)(addr))
+ : "r"(nr)
+ : "cc");
+ if (x)
+ return 0;
+ return 1;
+}
+
+int test_ccnle(long nr, volatile long *addr) {
+ //CHECK-LABEL: @test_ccnle
+ //CHECK: = tail call i32 asm "cmp $2,$1", "={@ccnle},=*m,r,~{cc},~{dirflag},~{fpsr},~{flags}"(i64* %addr, i64 %nr)
+ int x;
+ asm("cmp %2,%1"
+ : "=@ccnle"(x), "=m"(*(volatile long *)(addr))
+ : "r"(nr)
+ : "cc");
+ if (x)
+ return 0;
+ return 1;
+}
+
+int test_ccno(long nr, volatile long *addr) {
+ //CHECK-LABEL: @test_ccno
+ //CHECK: = tail call i32 asm "cmp $2,$1", "={@ccno},=*m,r,~{cc},~{dirflag},~{fpsr},~{flags}"(i64* %addr, i64 %nr)
+ int x;
+ asm("cmp %2,%1"
+ : "=@ccno"(x), "=m"(*(volatile long *)(addr))
+ : "r"(nr)
+ : "cc");
+ if (x)
+ return 0;
+ return 1;
+}
+
+int test_ccnp(long nr, volatile long *addr) {
+ //CHECK-LABEL: @test_ccnp
+ //CHECK: = tail call i32 asm "cmp $2,$1", "={@ccnp},=*m,r,~{cc},~{dirflag},~{fpsr},~{flags}"(i64* %addr, i64 %nr)
+ int x;
+ asm("cmp %2,%1"
+ : "=@ccnp"(x), "=m"(*(volatile long *)(addr))
+ : "r"(nr)
+ : "cc");
+ if (x)
+ return 0;
+ return 1;
+}
+
+int test_ccns(long nr, volatile long *addr) {
+ //CHECK-LABEL: @test_ccns
+ //CHECK: = tail call i32 asm "cmp $2,$1", "={@ccns},=*m,r,~{cc},~{dirflag},~{fpsr},~{flags}"(i64* %addr, i64 %nr)
+ int x;
+ asm("cmp %2,%1"
+ : "=@ccns"(x), "=m"(*(volatile long *)(addr))
+ : "r"(nr)
+ : "cc");
+ if (x)
+ return 0;
+ return 1;
+}
+
+int test_cco(long nr, volatile long *addr) {
+ //CHECK-LABEL: @test_cco
+ //CHECK: = tail call i32 asm "cmp $2,$1", "={@cco},=*m,r,~{cc},~{dirflag},~{fpsr},~{flags}"(i64* %addr, i64 %nr)
+ int x;
+ asm("cmp %2,%1"
+ : "=@cco"(x), "=m"(*(volatile long *)(addr))
+ : "r"(nr)
+ : "cc");
+ if (x)
+ return 0;
+ return 1;
+}
+
+int test_ccp(long nr, volatile long *addr) {
+ //CHECK-LABEL: @test_ccp
+ //CHECK: = tail call i32 asm "cmp $2,$1", "={@ccp},=*m,r,~{cc},~{dirflag},~{fpsr},~{flags}"(i64* %addr, i64 %nr)
+ int x;
+ asm("cmp %2,%1"
+ : "=@ccp"(x), "=m"(*(volatile long *)(addr))
+ : "r"(nr)
+ : "cc");
+ if (x)
+ return 0;
+ return 1;
+}
+
+int test_ccs(long nr, volatile long *addr) {
+ //CHECK-LABEL: @test_ccs
+ //CHECK: = tail call i32 asm "cmp $2,$1", "={@ccs},=*m,r,~{cc},~{dirflag},~{fpsr},~{flags}"(i64* %addr, i64 %nr)
+ int x;
+ asm("cmp %2,%1"
+ : "=@ccs"(x), "=m"(*(volatile long *)(addr))
+ : "r"(nr)
+ : "cc");
+ if (x)
+ return 0;
+ return 1;
+}
OpenPOWER on IntegriCloud