// RUN: %clang_cc1 -no-opaque-pointers -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* elementtype(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* elementtype(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* elementtype(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* elementtype(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* elementtype(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* elementtype(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* elementtype(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* elementtype(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* elementtype(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* elementtype(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* elementtype(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* elementtype(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* elementtype(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* elementtype(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* elementtype(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* elementtype(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* elementtype(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* elementtype(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* elementtype(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* elementtype(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* elementtype(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* elementtype(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* elementtype(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* elementtype(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* elementtype(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* elementtype(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* elementtype(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* elementtype(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;
}

_Bool check_no_clobber_conflicts(void) {
  //CHECK-LABEL: @check_no_clobber_conflicts
  //CHECK:  = tail call i8 asm "", "={@cce},~{cx},~{dirflag},~{fpsr},~{flags}"()
  _Bool b;
  asm(""
      : "=@cce"(b)
      :
      : "cx");
  return b;
}

int test_assume_boolean_flag(long nr, volatile long *addr) {
  //CHECK-LABEL: @test_assume_boolean_flag
  //CHECK: %0 = tail call { i32, i32 } asm "cmp $2,$1", "={@cca},={@ccae},=*m,r,~{cc},~{dirflag},~{fpsr},~{flags}"(i64* elementtype(i64) %addr, i64 %nr)
  //CHECK: [[RES1:%.*]] = extractvalue { i32, i32 } %0, 0
  //CHECK: [[RES2:%.*]] = extractvalue { i32, i32 } %0, 1
  //CHECK: %1 = icmp ult i32 [[RES1]], 2
  //CHECK: tail call void @llvm.assume(i1 %1)
  //CHECK: %2 = icmp ult i32 [[RES2]], 2
  //CHECK: tail call void @llvm.assume(i1 %2)
  int x,y;
  asm("cmp %2,%1"
      : "=@cca"(x), "=@ccae"(y), "=m"(*(volatile long *)(addr))
      : "r"(nr)
      : "cc");
  if (x)
    return 0;
  return 1;
}
