396 lines · c
1// RUN: %clang_cc1 -O2 -emit-llvm %s -o - -triple x86_64-unknown-linux-gnu | FileCheck %s2 3int test_cca(long nr, volatile long *addr) {4 //CHECK-LABEL: @test_cca5 //CHECK: = tail call i32 asm "cmp $2,$1", "={@cca},=*m,r,~{cc},~{dirflag},~{fpsr},~{flags}"(ptr elementtype(i64) %addr, i64 %nr)6 int x;7 asm("cmp %2,%1"8 : "=@cca"(x), "=m"(*(volatile long *)(addr))9 : "r"(nr)10 : "cc");11 if (x)12 return 0;13 return 1;14}15 16int test_ccae(long nr, volatile long *addr) {17 //CHECK-LABEL: @test_ccae18 //CHECK: = tail call i32 asm "cmp $2,$1", "={@ccae},=*m,r,~{cc},~{dirflag},~{fpsr},~{flags}"(ptr elementtype(i64) %addr, i64 %nr)19 int x;20 asm("cmp %2,%1"21 : "=@ccae"(x), "=m"(*(volatile long *)(addr))22 : "r"(nr)23 : "cc");24 if (x)25 return 0;26 return 1;27}28 29int test_ccb(long nr, volatile long *addr) {30 //CHECK-LABEL: @test_ccb31 //CHECK: = tail call i32 asm "cmp $2,$1", "={@ccb},=*m,r,~{cc},~{dirflag},~{fpsr},~{flags}"(ptr elementtype(i64) %addr, i64 %nr)32 int x;33 asm("cmp %2,%1"34 : "=@ccb"(x), "=m"(*(volatile long *)(addr))35 : "r"(nr)36 : "cc");37 if (x)38 return 0;39 return 1;40}41 42int test_ccbe(long nr, volatile long *addr) {43 //CHECK-LABEL: @test_ccbe44 //CHECK: tail call i32 asm "cmp $2,$1", "={@ccbe},=*m,r,~{cc},~{dirflag},~{fpsr},~{flags}"(ptr elementtype(i64) %addr, i64 %nr)45 int x;46 asm("cmp %2,%1"47 : "=@ccbe"(x), "=m"(*(volatile long *)(addr))48 : "r"(nr)49 : "cc");50 if (x)51 return 0;52 return 1;53}54 55int test_ccc(long nr, volatile long *addr) {56 //CHECK-LABEL: @test_ccc57 //CHECK: = tail call i32 asm "cmp $2,$1", "={@ccc},=*m,r,~{cc},~{dirflag},~{fpsr},~{flags}"(ptr elementtype(i64) %addr, i64 %nr)58 int x;59 asm("cmp %2,%1"60 : "=@ccc"(x), "=m"(*(volatile long *)(addr))61 : "r"(nr)62 : "cc");63 if (x)64 return 0;65 return 1;66}67 68int test_cce(long nr, volatile long *addr) {69 //CHECK-LABEL: @test_cce70 //CHECK: = tail call i32 asm "cmp $2,$1", "={@cce},=*m,r,~{cc},~{dirflag},~{fpsr},~{flags}"(ptr elementtype(i64) %addr, i64 %nr)71 int x;72 asm("cmp %2,%1"73 : "=@cce"(x), "=m"(*(volatile long *)(addr))74 : "r"(nr)75 : "cc");76 if (x)77 return 0;78 return 1;79}80 81int test_ccz(long nr, volatile long *addr) {82 //CHECK-LABEL: @test_ccz83 //CHECK: = tail call i32 asm "cmp $2,$1", "={@ccz},=*m,r,~{cc},~{dirflag},~{fpsr},~{flags}"(ptr elementtype(i64) %addr, i64 %nr)84 int x;85 asm("cmp %2,%1"86 : "=@ccz"(x), "=m"(*(volatile long *)(addr))87 : "r"(nr)88 : "cc");89 if (x)90 return 0;91 return 1;92}93 94int test_ccg(long nr, volatile long *addr) {95 //CHECK-LABEL: @test_ccg96 //CHECK: = tail call i32 asm "cmp $2,$1", "={@ccg},=*m,r,~{cc},~{dirflag},~{fpsr},~{flags}"(ptr elementtype(i64) %addr, i64 %nr)97 int x;98 asm("cmp %2,%1"99 : "=@ccg"(x), "=m"(*(volatile long *)(addr))100 : "r"(nr)101 : "cc");102 if (x)103 return 0;104 return 1;105}106 107int test_ccge(long nr, volatile long *addr) {108 //CHECK-LABEL: @test_ccge109 //CHECK: = tail call i32 asm "cmp $2,$1", "={@ccge},=*m,r,~{cc},~{dirflag},~{fpsr},~{flags}"(ptr elementtype(i64) %addr, i64 %nr)110 int x;111 asm("cmp %2,%1"112 : "=@ccge"(x), "=m"(*(volatile long *)(addr))113 : "r"(nr)114 : "cc");115 if (x)116 return 0;117 return 1;118}119 120int test_ccl(long nr, volatile long *addr) {121 //CHECK-LABEL: @test_ccl122 //CHECK: = tail call i32 asm "cmp $2,$1", "={@ccl},=*m,r,~{cc},~{dirflag},~{fpsr},~{flags}"(ptr elementtype(i64) %addr, i64 %nr)123 int x;124 asm("cmp %2,%1"125 : "=@ccl"(x), "=m"(*(volatile long *)(addr))126 : "r"(nr)127 : "cc");128 if (x)129 return 0;130 return 1;131}132 133int test_ccle(long nr, volatile long *addr) {134 //CHECK-LABEL: @test_ccle135 //CHECK: = tail call i32 asm "cmp $2,$1", "={@ccle},=*m,r,~{cc},~{dirflag},~{fpsr},~{flags}"(ptr elementtype(i64) %addr, i64 %nr)136 int x;137 asm("cmp %2,%1"138 : "=@ccle"(x), "=m"(*(volatile long *)(addr))139 : "r"(nr)140 : "cc");141 if (x)142 return 0;143 return 1;144}145 146int test_ccna(long nr, volatile long *addr) {147 //CHECK-LABEL: @test_ccna148 //CHECK: = tail call i32 asm "cmp $2,$1", "={@ccna},=*m,r,~{cc},~{dirflag},~{fpsr},~{flags}"(ptr elementtype(i64) %addr, i64 %nr)149 int x;150 asm("cmp %2,%1"151 : "=@ccna"(x), "=m"(*(volatile long *)(addr))152 : "r"(nr)153 : "cc");154 if (x)155 return 0;156 return 1;157}158 159int test_ccnae(long nr, volatile long *addr) {160 //CHECK-LABEL: @test_ccnae161 //CHECK: = tail call i32 asm "cmp $2,$1", "={@ccnae},=*m,r,~{cc},~{dirflag},~{fpsr},~{flags}"(ptr elementtype(i64) %addr, i64 %nr)162 int x;163 asm("cmp %2,%1"164 : "=@ccnae"(x), "=m"(*(volatile long *)(addr))165 : "r"(nr)166 : "cc");167 if (x)168 return 0;169 return 1;170}171 172int test_ccnb(long nr, volatile long *addr) {173 //CHECK-LABEL: @test_ccnb174 //CHECK: = tail call i32 asm "cmp $2,$1", "={@ccnb},=*m,r,~{cc},~{dirflag},~{fpsr},~{flags}"(ptr elementtype(i64) %addr, i64 %nr)175 int x;176 asm("cmp %2,%1"177 : "=@ccnb"(x), "=m"(*(volatile long *)(addr))178 : "r"(nr)179 : "cc");180 if (x)181 return 0;182 return 1;183}184 185int test_ccnbe(long nr, volatile long *addr) {186 //CHECK-LABEL: @test_ccnbe187 //CHECK: = tail call i32 asm "cmp $2,$1", "={@ccnbe},=*m,r,~{cc},~{dirflag},~{fpsr},~{flags}"(ptr elementtype(i64) %addr, i64 %nr)188 int x;189 asm("cmp %2,%1"190 : "=@ccnbe"(x), "=m"(*(volatile long *)(addr))191 : "r"(nr)192 : "cc");193 if (x)194 return 0;195 return 1;196}197 198int test_ccnc(long nr, volatile long *addr) {199 //CHECK-LABEL: @test_ccnc200 //CHECK: = tail call i32 asm "cmp $2,$1", "={@ccnc},=*m,r,~{cc},~{dirflag},~{fpsr},~{flags}"(ptr elementtype(i64) %addr, i64 %nr)201 int x;202 asm("cmp %2,%1"203 : "=@ccnc"(x), "=m"(*(volatile long *)(addr))204 : "r"(nr)205 : "cc");206 if (x)207 return 0;208 return 1;209}210 211int test_ccne(long nr, volatile long *addr) {212 //CHECK-LABEL: @test_ccne213 //CHECK: = tail call i32 asm "cmp $2,$1", "={@ccne},=*m,r,~{cc},~{dirflag},~{fpsr},~{flags}"(ptr elementtype(i64) %addr, i64 %nr)214 int x;215 asm("cmp %2,%1"216 : "=@ccne"(x), "=m"(*(volatile long *)(addr))217 : "r"(nr)218 : "cc");219 if (x)220 return 0;221 return 1;222}223 224int test_ccnz(long nr, volatile long *addr) {225 //CHECK-LABEL: @test_ccnz226 //CHECK: = tail call i32 asm "cmp $2,$1", "={@ccnz},=*m,r,~{cc},~{dirflag},~{fpsr},~{flags}"(ptr elementtype(i64) %addr, i64 %nr)227 int x;228 asm("cmp %2,%1"229 : "=@ccnz"(x), "=m"(*(volatile long *)(addr))230 : "r"(nr)231 : "cc");232 if (x)233 return 0;234 return 1;235}236 237int test_ccng(long nr, volatile long *addr) {238 //CHECK-LABEL: @test_ccng239 //CHECK: = tail call i32 asm "cmp $2,$1", "={@ccng},=*m,r,~{cc},~{dirflag},~{fpsr},~{flags}"(ptr elementtype(i64) %addr, i64 %nr)240 int x;241 asm("cmp %2,%1"242 : "=@ccng"(x), "=m"(*(volatile long *)(addr))243 : "r"(nr)244 : "cc");245 if (x)246 return 0;247 return 1;248}249 250int test_ccnge(long nr, volatile long *addr) {251 //CHECK-LABEL: @test_ccnge252 //CHECK: = tail call i32 asm "cmp $2,$1", "={@ccnge},=*m,r,~{cc},~{dirflag},~{fpsr},~{flags}"(ptr elementtype(i64) %addr, i64 %nr)253 int x;254 asm("cmp %2,%1"255 : "=@ccnge"(x), "=m"(*(volatile long *)(addr))256 : "r"(nr)257 : "cc");258 if (x)259 return 0;260 return 1;261}262 263int test_ccnl(long nr, volatile long *addr) {264 //CHECK-LABEL: @test_ccnl265 //CHECK: = tail call i32 asm "cmp $2,$1", "={@ccnl},=*m,r,~{cc},~{dirflag},~{fpsr},~{flags}"(ptr elementtype(i64) %addr, i64 %nr)266 int x;267 asm("cmp %2,%1"268 : "=@ccnl"(x), "=m"(*(volatile long *)(addr))269 : "r"(nr)270 : "cc");271 if (x)272 return 0;273 return 1;274}275 276int test_ccnle(long nr, volatile long *addr) {277 //CHECK-LABEL: @test_ccnle278 //CHECK: = tail call i32 asm "cmp $2,$1", "={@ccnle},=*m,r,~{cc},~{dirflag},~{fpsr},~{flags}"(ptr elementtype(i64) %addr, i64 %nr)279 int x;280 asm("cmp %2,%1"281 : "=@ccnle"(x), "=m"(*(volatile long *)(addr))282 : "r"(nr)283 : "cc");284 if (x)285 return 0;286 return 1;287}288 289int test_ccno(long nr, volatile long *addr) {290 //CHECK-LABEL: @test_ccno291 //CHECK: = tail call i32 asm "cmp $2,$1", "={@ccno},=*m,r,~{cc},~{dirflag},~{fpsr},~{flags}"(ptr elementtype(i64) %addr, i64 %nr)292 int x;293 asm("cmp %2,%1"294 : "=@ccno"(x), "=m"(*(volatile long *)(addr))295 : "r"(nr)296 : "cc");297 if (x)298 return 0;299 return 1;300}301 302int test_ccnp(long nr, volatile long *addr) {303 //CHECK-LABEL: @test_ccnp304 //CHECK: = tail call i32 asm "cmp $2,$1", "={@ccnp},=*m,r,~{cc},~{dirflag},~{fpsr},~{flags}"(ptr elementtype(i64) %addr, i64 %nr)305 int x;306 asm("cmp %2,%1"307 : "=@ccnp"(x), "=m"(*(volatile long *)(addr))308 : "r"(nr)309 : "cc");310 if (x)311 return 0;312 return 1;313}314 315int test_ccns(long nr, volatile long *addr) {316 //CHECK-LABEL: @test_ccns317 //CHECK: = tail call i32 asm "cmp $2,$1", "={@ccns},=*m,r,~{cc},~{dirflag},~{fpsr},~{flags}"(ptr elementtype(i64) %addr, i64 %nr)318 int x;319 asm("cmp %2,%1"320 : "=@ccns"(x), "=m"(*(volatile long *)(addr))321 : "r"(nr)322 : "cc");323 if (x)324 return 0;325 return 1;326}327 328int test_cco(long nr, volatile long *addr) {329 //CHECK-LABEL: @test_cco330 //CHECK: = tail call i32 asm "cmp $2,$1", "={@cco},=*m,r,~{cc},~{dirflag},~{fpsr},~{flags}"(ptr elementtype(i64) %addr, i64 %nr)331 int x;332 asm("cmp %2,%1"333 : "=@cco"(x), "=m"(*(volatile long *)(addr))334 : "r"(nr)335 : "cc");336 if (x)337 return 0;338 return 1;339}340 341int test_ccp(long nr, volatile long *addr) {342 //CHECK-LABEL: @test_ccp343 //CHECK: = tail call i32 asm "cmp $2,$1", "={@ccp},=*m,r,~{cc},~{dirflag},~{fpsr},~{flags}"(ptr elementtype(i64) %addr, i64 %nr)344 int x;345 asm("cmp %2,%1"346 : "=@ccp"(x), "=m"(*(volatile long *)(addr))347 : "r"(nr)348 : "cc");349 if (x)350 return 0;351 return 1;352}353 354int test_ccs(long nr, volatile long *addr) {355 //CHECK-LABEL: @test_ccs356 //CHECK: = tail call i32 asm "cmp $2,$1", "={@ccs},=*m,r,~{cc},~{dirflag},~{fpsr},~{flags}"(ptr elementtype(i64) %addr, i64 %nr)357 int x;358 asm("cmp %2,%1"359 : "=@ccs"(x), "=m"(*(volatile long *)(addr))360 : "r"(nr)361 : "cc");362 if (x)363 return 0;364 return 1;365}366 367_Bool check_no_clobber_conflicts(void) {368 //CHECK-LABEL: @check_no_clobber_conflicts369 //CHECK: = tail call i8 asm "", "={@cce},~{cx},~{dirflag},~{fpsr},~{flags}"()370 _Bool b;371 asm(""372 : "=@cce"(b)373 :374 : "cx");375 return b;376}377 378int test_assume_boolean_flag(long nr, volatile long *addr) {379 //CHECK-LABEL: @test_assume_boolean_flag380 //CHECK: %0 = tail call { i32, i32 } asm "cmp $2,$1", "={@cca},={@ccae},=*m,r,~{cc},~{dirflag},~{fpsr},~{flags}"(ptr elementtype(i64) %addr, i64 %nr)381 //CHECK: [[RES1:%.*]] = extractvalue { i32, i32 } %0, 0382 //CHECK: [[RES2:%.*]] = extractvalue { i32, i32 } %0, 1383 //CHECK: %1 = icmp ult i32 [[RES1]], 2384 //CHECK: tail call void @llvm.assume(i1 %1)385 //CHECK: %2 = icmp ult i32 [[RES2]], 2386 //CHECK: tail call void @llvm.assume(i1 %2)387 int x,y;388 asm("cmp %2,%1"389 : "=@cca"(x), "=@ccae"(y), "=m"(*(volatile long *)(addr))390 : "r"(nr)391 : "cc");392 if (x && y)393 return 0;394 return 1;395}396