13883e66cfd55de70d89831cf26f9ae53931d11d3Eric Christopher// Test frontend handling of __sync builtins. 23883e66cfd55de70d89831cf26f9ae53931d11d3Eric Christopher// Modified from a gcc testcase. 3060ddb0173ba91cd400f073ed0bd1f9b9c3a4d50Nuno Lopes// RUN: %clang_cc1 -triple x86_64-apple-darwin -emit-llvm %s -o - | FileCheck %s 43883e66cfd55de70d89831cf26f9ae53931d11d3Eric Christopher 53883e66cfd55de70d89831cf26f9ae53931d11d3Eric Christophersigned char sc; 63883e66cfd55de70d89831cf26f9ae53931d11d3Eric Christopherunsigned char uc; 73883e66cfd55de70d89831cf26f9ae53931d11d3Eric Christophersigned short ss; 83883e66cfd55de70d89831cf26f9ae53931d11d3Eric Christopherunsigned short us; 93883e66cfd55de70d89831cf26f9ae53931d11d3Eric Christophersigned int si; 103883e66cfd55de70d89831cf26f9ae53931d11d3Eric Christopherunsigned int ui; 113883e66cfd55de70d89831cf26f9ae53931d11d3Eric Christophersigned long long sll; 123883e66cfd55de70d89831cf26f9ae53931d11d3Eric Christopherunsigned long long ull; 133883e66cfd55de70d89831cf26f9ae53931d11d3Eric Christopher 1493ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Linvoid test_op_ignore (void) // CHECK-LABEL: define void @test_op_ignore 153883e66cfd55de70d89831cf26f9ae53931d11d3Eric Christopher{ 16c83b975f1fb9d11e10b5aa25029ae9bb5fa80e07Eli Friedman (void) __sync_fetch_and_add (&sc, 1); // CHECK: atomicrmw add i8 17c83b975f1fb9d11e10b5aa25029ae9bb5fa80e07Eli Friedman (void) __sync_fetch_and_add (&uc, 1); // CHECK: atomicrmw add i8 18c83b975f1fb9d11e10b5aa25029ae9bb5fa80e07Eli Friedman (void) __sync_fetch_and_add (&ss, 1); // CHECK: atomicrmw add i16 19c83b975f1fb9d11e10b5aa25029ae9bb5fa80e07Eli Friedman (void) __sync_fetch_and_add (&us, 1); // CHECK: atomicrmw add i16 20c83b975f1fb9d11e10b5aa25029ae9bb5fa80e07Eli Friedman (void) __sync_fetch_and_add (&si, 1); // CHECK: atomicrmw add i32 21c83b975f1fb9d11e10b5aa25029ae9bb5fa80e07Eli Friedman (void) __sync_fetch_and_add (&ui, 1); // CHECK: atomicrmw add i32 22c83b975f1fb9d11e10b5aa25029ae9bb5fa80e07Eli Friedman (void) __sync_fetch_and_add (&sll, 1); // CHECK: atomicrmw add i64 23c83b975f1fb9d11e10b5aa25029ae9bb5fa80e07Eli Friedman (void) __sync_fetch_and_add (&ull, 1); // CHECK: atomicrmw add i64 24c83b975f1fb9d11e10b5aa25029ae9bb5fa80e07Eli Friedman 25c83b975f1fb9d11e10b5aa25029ae9bb5fa80e07Eli Friedman (void) __sync_fetch_and_sub (&sc, 1); // CHECK: atomicrmw sub i8 26c83b975f1fb9d11e10b5aa25029ae9bb5fa80e07Eli Friedman (void) __sync_fetch_and_sub (&uc, 1); // CHECK: atomicrmw sub i8 27c83b975f1fb9d11e10b5aa25029ae9bb5fa80e07Eli Friedman (void) __sync_fetch_and_sub (&ss, 1); // CHECK: atomicrmw sub i16 28c83b975f1fb9d11e10b5aa25029ae9bb5fa80e07Eli Friedman (void) __sync_fetch_and_sub (&us, 1); // CHECK: atomicrmw sub i16 29c83b975f1fb9d11e10b5aa25029ae9bb5fa80e07Eli Friedman (void) __sync_fetch_and_sub (&si, 1); // CHECK: atomicrmw sub i32 30c83b975f1fb9d11e10b5aa25029ae9bb5fa80e07Eli Friedman (void) __sync_fetch_and_sub (&ui, 1); // CHECK: atomicrmw sub i32 31c83b975f1fb9d11e10b5aa25029ae9bb5fa80e07Eli Friedman (void) __sync_fetch_and_sub (&sll, 1); // CHECK: atomicrmw sub i64 32c83b975f1fb9d11e10b5aa25029ae9bb5fa80e07Eli Friedman (void) __sync_fetch_and_sub (&ull, 1); // CHECK: atomicrmw sub i64 33c83b975f1fb9d11e10b5aa25029ae9bb5fa80e07Eli Friedman 34c83b975f1fb9d11e10b5aa25029ae9bb5fa80e07Eli Friedman (void) __sync_fetch_and_or (&sc, 1); // CHECK: atomicrmw or i8 35c83b975f1fb9d11e10b5aa25029ae9bb5fa80e07Eli Friedman (void) __sync_fetch_and_or (&uc, 1); // CHECK: atomicrmw or i8 36c83b975f1fb9d11e10b5aa25029ae9bb5fa80e07Eli Friedman (void) __sync_fetch_and_or (&ss, 1); // CHECK: atomicrmw or i16 37c83b975f1fb9d11e10b5aa25029ae9bb5fa80e07Eli Friedman (void) __sync_fetch_and_or (&us, 1); // CHECK: atomicrmw or i16 38c83b975f1fb9d11e10b5aa25029ae9bb5fa80e07Eli Friedman (void) __sync_fetch_and_or (&si, 1); // CHECK: atomicrmw or i32 39c83b975f1fb9d11e10b5aa25029ae9bb5fa80e07Eli Friedman (void) __sync_fetch_and_or (&ui, 1); // CHECK: atomicrmw or i32 40c83b975f1fb9d11e10b5aa25029ae9bb5fa80e07Eli Friedman (void) __sync_fetch_and_or (&sll, 1); // CHECK: atomicrmw or i64 41c83b975f1fb9d11e10b5aa25029ae9bb5fa80e07Eli Friedman (void) __sync_fetch_and_or (&ull, 1); // CHECK: atomicrmw or i64 42c83b975f1fb9d11e10b5aa25029ae9bb5fa80e07Eli Friedman 43c83b975f1fb9d11e10b5aa25029ae9bb5fa80e07Eli Friedman (void) __sync_fetch_and_xor (&sc, 1); // CHECK: atomicrmw xor i8 44c83b975f1fb9d11e10b5aa25029ae9bb5fa80e07Eli Friedman (void) __sync_fetch_and_xor (&uc, 1); // CHECK: atomicrmw xor i8 45c83b975f1fb9d11e10b5aa25029ae9bb5fa80e07Eli Friedman (void) __sync_fetch_and_xor (&ss, 1); // CHECK: atomicrmw xor i16 46c83b975f1fb9d11e10b5aa25029ae9bb5fa80e07Eli Friedman (void) __sync_fetch_and_xor (&us, 1); // CHECK: atomicrmw xor i16 47c83b975f1fb9d11e10b5aa25029ae9bb5fa80e07Eli Friedman (void) __sync_fetch_and_xor (&si, 1); // CHECK: atomicrmw xor i32 48c83b975f1fb9d11e10b5aa25029ae9bb5fa80e07Eli Friedman (void) __sync_fetch_and_xor (&ui, 1); // CHECK: atomicrmw xor i32 49c83b975f1fb9d11e10b5aa25029ae9bb5fa80e07Eli Friedman (void) __sync_fetch_and_xor (&sll, 1); // CHECK: atomicrmw xor i64 50c83b975f1fb9d11e10b5aa25029ae9bb5fa80e07Eli Friedman (void) __sync_fetch_and_xor (&ull, 1); // CHECK: atomicrmw xor i64 51c83b975f1fb9d11e10b5aa25029ae9bb5fa80e07Eli Friedman 52c83b975f1fb9d11e10b5aa25029ae9bb5fa80e07Eli Friedman (void) __sync_fetch_and_and (&sc, 1); // CHECK: atomicrmw and i8 53c83b975f1fb9d11e10b5aa25029ae9bb5fa80e07Eli Friedman (void) __sync_fetch_and_and (&uc, 1); // CHECK: atomicrmw and i8 54c83b975f1fb9d11e10b5aa25029ae9bb5fa80e07Eli Friedman (void) __sync_fetch_and_and (&ss, 1); // CHECK: atomicrmw and i16 55c83b975f1fb9d11e10b5aa25029ae9bb5fa80e07Eli Friedman (void) __sync_fetch_and_and (&us, 1); // CHECK: atomicrmw and i16 56c83b975f1fb9d11e10b5aa25029ae9bb5fa80e07Eli Friedman (void) __sync_fetch_and_and (&si, 1); // CHECK: atomicrmw and i32 57c83b975f1fb9d11e10b5aa25029ae9bb5fa80e07Eli Friedman (void) __sync_fetch_and_and (&ui, 1); // CHECK: atomicrmw and i32 58c83b975f1fb9d11e10b5aa25029ae9bb5fa80e07Eli Friedman (void) __sync_fetch_and_and (&sll, 1); // CHECK: atomicrmw and i64 59c83b975f1fb9d11e10b5aa25029ae9bb5fa80e07Eli Friedman (void) __sync_fetch_and_and (&ull, 1); // CHECK: atomicrmw and i64 603883e66cfd55de70d89831cf26f9ae53931d11d3Eric Christopher 613883e66cfd55de70d89831cf26f9ae53931d11d3Eric Christopher} 623883e66cfd55de70d89831cf26f9ae53931d11d3Eric Christopher 6393ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Linvoid test_fetch_and_op (void) // CHECK-LABEL: define void @test_fetch_and_op 643883e66cfd55de70d89831cf26f9ae53931d11d3Eric Christopher{ 65c83b975f1fb9d11e10b5aa25029ae9bb5fa80e07Eli Friedman sc = __sync_fetch_and_add (&sc, 11); // CHECK: atomicrmw add 66c83b975f1fb9d11e10b5aa25029ae9bb5fa80e07Eli Friedman uc = __sync_fetch_and_add (&uc, 11); // CHECK: atomicrmw add 67c83b975f1fb9d11e10b5aa25029ae9bb5fa80e07Eli Friedman ss = __sync_fetch_and_add (&ss, 11); // CHECK: atomicrmw add 68c83b975f1fb9d11e10b5aa25029ae9bb5fa80e07Eli Friedman us = __sync_fetch_and_add (&us, 11); // CHECK: atomicrmw add 69c83b975f1fb9d11e10b5aa25029ae9bb5fa80e07Eli Friedman si = __sync_fetch_and_add (&si, 11); // CHECK: atomicrmw add 70c83b975f1fb9d11e10b5aa25029ae9bb5fa80e07Eli Friedman ui = __sync_fetch_and_add (&ui, 11); // CHECK: atomicrmw add 71c83b975f1fb9d11e10b5aa25029ae9bb5fa80e07Eli Friedman sll = __sync_fetch_and_add (&sll, 11); // CHECK: atomicrmw add 72c83b975f1fb9d11e10b5aa25029ae9bb5fa80e07Eli Friedman ull = __sync_fetch_and_add (&ull, 11); // CHECK: atomicrmw add 73c83b975f1fb9d11e10b5aa25029ae9bb5fa80e07Eli Friedman 74c83b975f1fb9d11e10b5aa25029ae9bb5fa80e07Eli Friedman sc = __sync_fetch_and_sub (&sc, 11); // CHECK: atomicrmw sub 75c83b975f1fb9d11e10b5aa25029ae9bb5fa80e07Eli Friedman uc = __sync_fetch_and_sub (&uc, 11); // CHECK: atomicrmw sub 76c83b975f1fb9d11e10b5aa25029ae9bb5fa80e07Eli Friedman ss = __sync_fetch_and_sub (&ss, 11); // CHECK: atomicrmw sub 77c83b975f1fb9d11e10b5aa25029ae9bb5fa80e07Eli Friedman us = __sync_fetch_and_sub (&us, 11); // CHECK: atomicrmw sub 78c83b975f1fb9d11e10b5aa25029ae9bb5fa80e07Eli Friedman si = __sync_fetch_and_sub (&si, 11); // CHECK: atomicrmw sub 79c83b975f1fb9d11e10b5aa25029ae9bb5fa80e07Eli Friedman ui = __sync_fetch_and_sub (&ui, 11); // CHECK: atomicrmw sub 80c83b975f1fb9d11e10b5aa25029ae9bb5fa80e07Eli Friedman sll = __sync_fetch_and_sub (&sll, 11); // CHECK: atomicrmw sub 81c83b975f1fb9d11e10b5aa25029ae9bb5fa80e07Eli Friedman ull = __sync_fetch_and_sub (&ull, 11); // CHECK: atomicrmw sub 82c83b975f1fb9d11e10b5aa25029ae9bb5fa80e07Eli Friedman 83c83b975f1fb9d11e10b5aa25029ae9bb5fa80e07Eli Friedman sc = __sync_fetch_and_or (&sc, 11); // CHECK: atomicrmw or 84c83b975f1fb9d11e10b5aa25029ae9bb5fa80e07Eli Friedman uc = __sync_fetch_and_or (&uc, 11); // CHECK: atomicrmw or 85c83b975f1fb9d11e10b5aa25029ae9bb5fa80e07Eli Friedman ss = __sync_fetch_and_or (&ss, 11); // CHECK: atomicrmw or 86c83b975f1fb9d11e10b5aa25029ae9bb5fa80e07Eli Friedman us = __sync_fetch_and_or (&us, 11); // CHECK: atomicrmw or 87c83b975f1fb9d11e10b5aa25029ae9bb5fa80e07Eli Friedman si = __sync_fetch_and_or (&si, 11); // CHECK: atomicrmw or 88c83b975f1fb9d11e10b5aa25029ae9bb5fa80e07Eli Friedman ui = __sync_fetch_and_or (&ui, 11); // CHECK: atomicrmw or 89c83b975f1fb9d11e10b5aa25029ae9bb5fa80e07Eli Friedman sll = __sync_fetch_and_or (&sll, 11); // CHECK: atomicrmw or 90c83b975f1fb9d11e10b5aa25029ae9bb5fa80e07Eli Friedman ull = __sync_fetch_and_or (&ull, 11); // CHECK: atomicrmw or 91c83b975f1fb9d11e10b5aa25029ae9bb5fa80e07Eli Friedman 92c83b975f1fb9d11e10b5aa25029ae9bb5fa80e07Eli Friedman sc = __sync_fetch_and_xor (&sc, 11); // CHECK: atomicrmw xor 93c83b975f1fb9d11e10b5aa25029ae9bb5fa80e07Eli Friedman uc = __sync_fetch_and_xor (&uc, 11); // CHECK: atomicrmw xor 94c83b975f1fb9d11e10b5aa25029ae9bb5fa80e07Eli Friedman ss = __sync_fetch_and_xor (&ss, 11); // CHECK: atomicrmw xor 95c83b975f1fb9d11e10b5aa25029ae9bb5fa80e07Eli Friedman us = __sync_fetch_and_xor (&us, 11); // CHECK: atomicrmw xor 96c83b975f1fb9d11e10b5aa25029ae9bb5fa80e07Eli Friedman si = __sync_fetch_and_xor (&si, 11); // CHECK: atomicrmw xor 97c83b975f1fb9d11e10b5aa25029ae9bb5fa80e07Eli Friedman ui = __sync_fetch_and_xor (&ui, 11); // CHECK: atomicrmw xor 98c83b975f1fb9d11e10b5aa25029ae9bb5fa80e07Eli Friedman sll = __sync_fetch_and_xor (&sll, 11); // CHECK: atomicrmw xor 99c83b975f1fb9d11e10b5aa25029ae9bb5fa80e07Eli Friedman ull = __sync_fetch_and_xor (&ull, 11); // CHECK: atomicrmw xor 100c83b975f1fb9d11e10b5aa25029ae9bb5fa80e07Eli Friedman 101c83b975f1fb9d11e10b5aa25029ae9bb5fa80e07Eli Friedman sc = __sync_fetch_and_and (&sc, 11); // CHECK: atomicrmw and 102c83b975f1fb9d11e10b5aa25029ae9bb5fa80e07Eli Friedman uc = __sync_fetch_and_and (&uc, 11); // CHECK: atomicrmw and 103c83b975f1fb9d11e10b5aa25029ae9bb5fa80e07Eli Friedman ss = __sync_fetch_and_and (&ss, 11); // CHECK: atomicrmw and 104c83b975f1fb9d11e10b5aa25029ae9bb5fa80e07Eli Friedman us = __sync_fetch_and_and (&us, 11); // CHECK: atomicrmw and 105c83b975f1fb9d11e10b5aa25029ae9bb5fa80e07Eli Friedman si = __sync_fetch_and_and (&si, 11); // CHECK: atomicrmw and 106c83b975f1fb9d11e10b5aa25029ae9bb5fa80e07Eli Friedman ui = __sync_fetch_and_and (&ui, 11); // CHECK: atomicrmw and 107c83b975f1fb9d11e10b5aa25029ae9bb5fa80e07Eli Friedman sll = __sync_fetch_and_and (&sll, 11); // CHECK: atomicrmw and 108c83b975f1fb9d11e10b5aa25029ae9bb5fa80e07Eli Friedman ull = __sync_fetch_and_and (&ull, 11); // CHECK: atomicrmw and 1093883e66cfd55de70d89831cf26f9ae53931d11d3Eric Christopher 1103883e66cfd55de70d89831cf26f9ae53931d11d3Eric Christopher} 1113883e66cfd55de70d89831cf26f9ae53931d11d3Eric Christopher 1123883e66cfd55de70d89831cf26f9ae53931d11d3Eric Christophervoid test_op_and_fetch (void) 1133883e66cfd55de70d89831cf26f9ae53931d11d3Eric Christopher{ 114c83b975f1fb9d11e10b5aa25029ae9bb5fa80e07Eli Friedman sc = __sync_add_and_fetch (&sc, uc); // CHECK: atomicrmw add 115c83b975f1fb9d11e10b5aa25029ae9bb5fa80e07Eli Friedman uc = __sync_add_and_fetch (&uc, uc); // CHECK: atomicrmw add 116c83b975f1fb9d11e10b5aa25029ae9bb5fa80e07Eli Friedman ss = __sync_add_and_fetch (&ss, uc); // CHECK: atomicrmw add 117c83b975f1fb9d11e10b5aa25029ae9bb5fa80e07Eli Friedman us = __sync_add_and_fetch (&us, uc); // CHECK: atomicrmw add 118c83b975f1fb9d11e10b5aa25029ae9bb5fa80e07Eli Friedman si = __sync_add_and_fetch (&si, uc); // CHECK: atomicrmw add 119c83b975f1fb9d11e10b5aa25029ae9bb5fa80e07Eli Friedman ui = __sync_add_and_fetch (&ui, uc); // CHECK: atomicrmw add 120c83b975f1fb9d11e10b5aa25029ae9bb5fa80e07Eli Friedman sll = __sync_add_and_fetch (&sll, uc); // CHECK: atomicrmw add 121c83b975f1fb9d11e10b5aa25029ae9bb5fa80e07Eli Friedman ull = __sync_add_and_fetch (&ull, uc); // CHECK: atomicrmw add 122c83b975f1fb9d11e10b5aa25029ae9bb5fa80e07Eli Friedman 123c83b975f1fb9d11e10b5aa25029ae9bb5fa80e07Eli Friedman sc = __sync_sub_and_fetch (&sc, uc); // CHECK: atomicrmw sub 124c83b975f1fb9d11e10b5aa25029ae9bb5fa80e07Eli Friedman uc = __sync_sub_and_fetch (&uc, uc); // CHECK: atomicrmw sub 125c83b975f1fb9d11e10b5aa25029ae9bb5fa80e07Eli Friedman ss = __sync_sub_and_fetch (&ss, uc); // CHECK: atomicrmw sub 126c83b975f1fb9d11e10b5aa25029ae9bb5fa80e07Eli Friedman us = __sync_sub_and_fetch (&us, uc); // CHECK: atomicrmw sub 127c83b975f1fb9d11e10b5aa25029ae9bb5fa80e07Eli Friedman si = __sync_sub_and_fetch (&si, uc); // CHECK: atomicrmw sub 128c83b975f1fb9d11e10b5aa25029ae9bb5fa80e07Eli Friedman ui = __sync_sub_and_fetch (&ui, uc); // CHECK: atomicrmw sub 129c83b975f1fb9d11e10b5aa25029ae9bb5fa80e07Eli Friedman sll = __sync_sub_and_fetch (&sll, uc); // CHECK: atomicrmw sub 130c83b975f1fb9d11e10b5aa25029ae9bb5fa80e07Eli Friedman ull = __sync_sub_and_fetch (&ull, uc); // CHECK: atomicrmw sub 131c83b975f1fb9d11e10b5aa25029ae9bb5fa80e07Eli Friedman 132c83b975f1fb9d11e10b5aa25029ae9bb5fa80e07Eli Friedman sc = __sync_or_and_fetch (&sc, uc); // CHECK: atomicrmw or 133c83b975f1fb9d11e10b5aa25029ae9bb5fa80e07Eli Friedman uc = __sync_or_and_fetch (&uc, uc); // CHECK: atomicrmw or 134c83b975f1fb9d11e10b5aa25029ae9bb5fa80e07Eli Friedman ss = __sync_or_and_fetch (&ss, uc); // CHECK: atomicrmw or 135c83b975f1fb9d11e10b5aa25029ae9bb5fa80e07Eli Friedman us = __sync_or_and_fetch (&us, uc); // CHECK: atomicrmw or 136c83b975f1fb9d11e10b5aa25029ae9bb5fa80e07Eli Friedman si = __sync_or_and_fetch (&si, uc); // CHECK: atomicrmw or 137c83b975f1fb9d11e10b5aa25029ae9bb5fa80e07Eli Friedman ui = __sync_or_and_fetch (&ui, uc); // CHECK: atomicrmw or 138c83b975f1fb9d11e10b5aa25029ae9bb5fa80e07Eli Friedman sll = __sync_or_and_fetch (&sll, uc); // CHECK: atomicrmw or 139c83b975f1fb9d11e10b5aa25029ae9bb5fa80e07Eli Friedman ull = __sync_or_and_fetch (&ull, uc); // CHECK: atomicrmw or 140c83b975f1fb9d11e10b5aa25029ae9bb5fa80e07Eli Friedman 141c83b975f1fb9d11e10b5aa25029ae9bb5fa80e07Eli Friedman sc = __sync_xor_and_fetch (&sc, uc); // CHECK: atomicrmw xor 142c83b975f1fb9d11e10b5aa25029ae9bb5fa80e07Eli Friedman uc = __sync_xor_and_fetch (&uc, uc); // CHECK: atomicrmw xor 143c83b975f1fb9d11e10b5aa25029ae9bb5fa80e07Eli Friedman ss = __sync_xor_and_fetch (&ss, uc); // CHECK: atomicrmw xor 144c83b975f1fb9d11e10b5aa25029ae9bb5fa80e07Eli Friedman us = __sync_xor_and_fetch (&us, uc); // CHECK: atomicrmw xor 145c83b975f1fb9d11e10b5aa25029ae9bb5fa80e07Eli Friedman si = __sync_xor_and_fetch (&si, uc); // CHECK: atomicrmw xor 146c83b975f1fb9d11e10b5aa25029ae9bb5fa80e07Eli Friedman ui = __sync_xor_and_fetch (&ui, uc); // CHECK: atomicrmw xor 147c83b975f1fb9d11e10b5aa25029ae9bb5fa80e07Eli Friedman sll = __sync_xor_and_fetch (&sll, uc); // CHECK: atomicrmw xor 148c83b975f1fb9d11e10b5aa25029ae9bb5fa80e07Eli Friedman ull = __sync_xor_and_fetch (&ull, uc); // CHECK: atomicrmw xor 149c83b975f1fb9d11e10b5aa25029ae9bb5fa80e07Eli Friedman 150c83b975f1fb9d11e10b5aa25029ae9bb5fa80e07Eli Friedman sc = __sync_and_and_fetch (&sc, uc); // CHECK: atomicrmw and 151c83b975f1fb9d11e10b5aa25029ae9bb5fa80e07Eli Friedman uc = __sync_and_and_fetch (&uc, uc); // CHECK: atomicrmw and 152c83b975f1fb9d11e10b5aa25029ae9bb5fa80e07Eli Friedman ss = __sync_and_and_fetch (&ss, uc); // CHECK: atomicrmw and 153c83b975f1fb9d11e10b5aa25029ae9bb5fa80e07Eli Friedman us = __sync_and_and_fetch (&us, uc); // CHECK: atomicrmw and 154c83b975f1fb9d11e10b5aa25029ae9bb5fa80e07Eli Friedman si = __sync_and_and_fetch (&si, uc); // CHECK: atomicrmw and 155c83b975f1fb9d11e10b5aa25029ae9bb5fa80e07Eli Friedman ui = __sync_and_and_fetch (&ui, uc); // CHECK: atomicrmw and 156c83b975f1fb9d11e10b5aa25029ae9bb5fa80e07Eli Friedman sll = __sync_and_and_fetch (&sll, uc); // CHECK: atomicrmw and 157c83b975f1fb9d11e10b5aa25029ae9bb5fa80e07Eli Friedman ull = __sync_and_and_fetch (&ull, uc); // CHECK: atomicrmw and 1583883e66cfd55de70d89831cf26f9ae53931d11d3Eric Christopher 1593883e66cfd55de70d89831cf26f9ae53931d11d3Eric Christopher} 1603883e66cfd55de70d89831cf26f9ae53931d11d3Eric Christopher 1613883e66cfd55de70d89831cf26f9ae53931d11d3Eric Christophervoid test_compare_and_swap (void) 1623883e66cfd55de70d89831cf26f9ae53931d11d3Eric Christopher{ 163ef8225444452a1486bd721f3285301fe84643b00Stephen Hines sc = __sync_val_compare_and_swap (&sc, uc, sc); 164ef8225444452a1486bd721f3285301fe84643b00Stephen Hines // CHECK: [[PAIR:%[a-z0-9._]+]] = cmpxchg i8 165ef8225444452a1486bd721f3285301fe84643b00Stephen Hines // CHECK: extractvalue { i8, i1 } [[PAIR]], 0 166ef8225444452a1486bd721f3285301fe84643b00Stephen Hines 167ef8225444452a1486bd721f3285301fe84643b00Stephen Hines uc = __sync_val_compare_and_swap (&uc, uc, sc); 168ef8225444452a1486bd721f3285301fe84643b00Stephen Hines // CHECK: [[PAIR:%[a-z0-9._]+]] = cmpxchg i8 169ef8225444452a1486bd721f3285301fe84643b00Stephen Hines // CHECK: extractvalue { i8, i1 } [[PAIR]], 0 170ef8225444452a1486bd721f3285301fe84643b00Stephen Hines 171ef8225444452a1486bd721f3285301fe84643b00Stephen Hines ss = __sync_val_compare_and_swap (&ss, uc, sc); 172ef8225444452a1486bd721f3285301fe84643b00Stephen Hines // CHECK: [[PAIR:%[a-z0-9._]+]] = cmpxchg i16 173ef8225444452a1486bd721f3285301fe84643b00Stephen Hines // CHECK: extractvalue { i16, i1 } [[PAIR]], 0 174ef8225444452a1486bd721f3285301fe84643b00Stephen Hines 175ef8225444452a1486bd721f3285301fe84643b00Stephen Hines us = __sync_val_compare_and_swap (&us, uc, sc); 176ef8225444452a1486bd721f3285301fe84643b00Stephen Hines // CHECK: [[PAIR:%[a-z0-9._]+]] = cmpxchg i16 177ef8225444452a1486bd721f3285301fe84643b00Stephen Hines // CHECK: extractvalue { i16, i1 } [[PAIR]], 0 178ef8225444452a1486bd721f3285301fe84643b00Stephen Hines 179ef8225444452a1486bd721f3285301fe84643b00Stephen Hines si = __sync_val_compare_and_swap (&si, uc, sc); 180ef8225444452a1486bd721f3285301fe84643b00Stephen Hines // CHECK: [[PAIR:%[a-z0-9._]+]] = cmpxchg i32 181ef8225444452a1486bd721f3285301fe84643b00Stephen Hines // CHECK: extractvalue { i32, i1 } [[PAIR]], 0 182ef8225444452a1486bd721f3285301fe84643b00Stephen Hines 183ef8225444452a1486bd721f3285301fe84643b00Stephen Hines ui = __sync_val_compare_and_swap (&ui, uc, sc); 184ef8225444452a1486bd721f3285301fe84643b00Stephen Hines // CHECK: [[PAIR:%[a-z0-9._]+]] = cmpxchg i32 185ef8225444452a1486bd721f3285301fe84643b00Stephen Hines // CHECK: extractvalue { i32, i1 } [[PAIR]], 0 186ef8225444452a1486bd721f3285301fe84643b00Stephen Hines 187ef8225444452a1486bd721f3285301fe84643b00Stephen Hines sll = __sync_val_compare_and_swap (&sll, uc, sc); 188ef8225444452a1486bd721f3285301fe84643b00Stephen Hines // CHECK: [[PAIR:%[a-z0-9._]+]] = cmpxchg i64 189ef8225444452a1486bd721f3285301fe84643b00Stephen Hines // CHECK: extractvalue { i64, i1 } [[PAIR]], 0 190ef8225444452a1486bd721f3285301fe84643b00Stephen Hines 191ef8225444452a1486bd721f3285301fe84643b00Stephen Hines ull = __sync_val_compare_and_swap (&ull, uc, sc); 192ef8225444452a1486bd721f3285301fe84643b00Stephen Hines // CHECK: [[PAIR:%[a-z0-9._]+]] = cmpxchg i64 193ef8225444452a1486bd721f3285301fe84643b00Stephen Hines // CHECK: extractvalue { i64, i1 } [[PAIR]], 0 194ef8225444452a1486bd721f3285301fe84643b00Stephen Hines 195ef8225444452a1486bd721f3285301fe84643b00Stephen Hines 196ef8225444452a1486bd721f3285301fe84643b00Stephen Hines ui = __sync_bool_compare_and_swap (&sc, uc, sc); 197ef8225444452a1486bd721f3285301fe84643b00Stephen Hines // CHECK: [[PAIR:%[a-z0-9._]+]] = cmpxchg i8 198ef8225444452a1486bd721f3285301fe84643b00Stephen Hines // CHECK: extractvalue { i8, i1 } [[PAIR]], 1 199ef8225444452a1486bd721f3285301fe84643b00Stephen Hines 200ef8225444452a1486bd721f3285301fe84643b00Stephen Hines ui = __sync_bool_compare_and_swap (&uc, uc, sc); 201ef8225444452a1486bd721f3285301fe84643b00Stephen Hines // CHECK: [[PAIR:%[a-z0-9._]+]] = cmpxchg i8 202ef8225444452a1486bd721f3285301fe84643b00Stephen Hines // CHECK: extractvalue { i8, i1 } [[PAIR]], 1 203ef8225444452a1486bd721f3285301fe84643b00Stephen Hines 204ef8225444452a1486bd721f3285301fe84643b00Stephen Hines ui = __sync_bool_compare_and_swap (&ss, uc, sc); 205ef8225444452a1486bd721f3285301fe84643b00Stephen Hines // CHECK: [[PAIR:%[a-z0-9._]+]] = cmpxchg i16 206ef8225444452a1486bd721f3285301fe84643b00Stephen Hines // CHECK: extractvalue { i16, i1 } [[PAIR]], 1 207ef8225444452a1486bd721f3285301fe84643b00Stephen Hines 208ef8225444452a1486bd721f3285301fe84643b00Stephen Hines ui = __sync_bool_compare_and_swap (&us, uc, sc); 209ef8225444452a1486bd721f3285301fe84643b00Stephen Hines // CHECK: [[PAIR:%[a-z0-9._]+]] = cmpxchg i16 210ef8225444452a1486bd721f3285301fe84643b00Stephen Hines // CHECK: extractvalue { i16, i1 } [[PAIR]], 1 211ef8225444452a1486bd721f3285301fe84643b00Stephen Hines 212ef8225444452a1486bd721f3285301fe84643b00Stephen Hines ui = __sync_bool_compare_and_swap (&si, uc, sc); 213ef8225444452a1486bd721f3285301fe84643b00Stephen Hines // CHECK: [[PAIR:%[a-z0-9._]+]] = cmpxchg i32 214ef8225444452a1486bd721f3285301fe84643b00Stephen Hines // CHECK: extractvalue { i32, i1 } [[PAIR]], 1 215ef8225444452a1486bd721f3285301fe84643b00Stephen Hines 216ef8225444452a1486bd721f3285301fe84643b00Stephen Hines ui = __sync_bool_compare_and_swap (&ui, uc, sc); 217ef8225444452a1486bd721f3285301fe84643b00Stephen Hines // CHECK: [[PAIR:%[a-z0-9._]+]] = cmpxchg i32 218ef8225444452a1486bd721f3285301fe84643b00Stephen Hines // CHECK: extractvalue { i32, i1 } [[PAIR]], 1 219ef8225444452a1486bd721f3285301fe84643b00Stephen Hines 220ef8225444452a1486bd721f3285301fe84643b00Stephen Hines ui = __sync_bool_compare_and_swap (&sll, uc, sc); 221ef8225444452a1486bd721f3285301fe84643b00Stephen Hines // CHECK: [[PAIR:%[a-z0-9._]+]] = cmpxchg i64 222ef8225444452a1486bd721f3285301fe84643b00Stephen Hines // CHECK: extractvalue { i64, i1 } [[PAIR]], 1 223ef8225444452a1486bd721f3285301fe84643b00Stephen Hines 224ef8225444452a1486bd721f3285301fe84643b00Stephen Hines ui = __sync_bool_compare_and_swap (&ull, uc, sc); 225ef8225444452a1486bd721f3285301fe84643b00Stephen Hines // CHECK: [[PAIR:%[a-z0-9._]+]] = cmpxchg i64 226ef8225444452a1486bd721f3285301fe84643b00Stephen Hines // CHECK: extractvalue { i64, i1 } [[PAIR]], 1 2273883e66cfd55de70d89831cf26f9ae53931d11d3Eric Christopher} 2283883e66cfd55de70d89831cf26f9ae53931d11d3Eric Christopher 2293883e66cfd55de70d89831cf26f9ae53931d11d3Eric Christophervoid test_lock (void) 2303883e66cfd55de70d89831cf26f9ae53931d11d3Eric Christopher{ 231c83b975f1fb9d11e10b5aa25029ae9bb5fa80e07Eli Friedman sc = __sync_lock_test_and_set (&sc, 1); // CHECK: atomicrmw xchg i8 232c83b975f1fb9d11e10b5aa25029ae9bb5fa80e07Eli Friedman uc = __sync_lock_test_and_set (&uc, 1); // CHECK: atomicrmw xchg i8 233c83b975f1fb9d11e10b5aa25029ae9bb5fa80e07Eli Friedman ss = __sync_lock_test_and_set (&ss, 1); // CHECK: atomicrmw xchg i16 234c83b975f1fb9d11e10b5aa25029ae9bb5fa80e07Eli Friedman us = __sync_lock_test_and_set (&us, 1); // CHECK: atomicrmw xchg i16 235c83b975f1fb9d11e10b5aa25029ae9bb5fa80e07Eli Friedman si = __sync_lock_test_and_set (&si, 1); // CHECK: atomicrmw xchg i32 236c83b975f1fb9d11e10b5aa25029ae9bb5fa80e07Eli Friedman ui = __sync_lock_test_and_set (&ui, 1); // CHECK: atomicrmw xchg i32 237c83b975f1fb9d11e10b5aa25029ae9bb5fa80e07Eli Friedman sll = __sync_lock_test_and_set (&sll, 1); // CHECK: atomicrmw xchg i64 238c83b975f1fb9d11e10b5aa25029ae9bb5fa80e07Eli Friedman ull = __sync_lock_test_and_set (&ull, 1); // CHECK: atomicrmw xchg i64 239c83b975f1fb9d11e10b5aa25029ae9bb5fa80e07Eli Friedman 240c83b975f1fb9d11e10b5aa25029ae9bb5fa80e07Eli Friedman __sync_synchronize (); // CHECK: fence seq_cst 241c83b975f1fb9d11e10b5aa25029ae9bb5fa80e07Eli Friedman 242eb43f4a8f133c2bc510ae136a556e92b68a6ff44Eli Friedman __sync_lock_release (&sc); // CHECK: store atomic {{.*}} release, align 1 243eb43f4a8f133c2bc510ae136a556e92b68a6ff44Eli Friedman __sync_lock_release (&uc); // CHECK: store atomic {{.*}} release, align 1 244eb43f4a8f133c2bc510ae136a556e92b68a6ff44Eli Friedman __sync_lock_release (&ss); // CHECK: store atomic {{.*}} release, align 2 245eb43f4a8f133c2bc510ae136a556e92b68a6ff44Eli Friedman __sync_lock_release (&us); /// CHECK: store atomic {{.*}} release, align 2 246eb43f4a8f133c2bc510ae136a556e92b68a6ff44Eli Friedman __sync_lock_release (&si); // CHECK: store atomic {{.*}} release, align 4 247eb43f4a8f133c2bc510ae136a556e92b68a6ff44Eli Friedman __sync_lock_release (&ui); // CHECK: store atomic {{.*}} release, align 4 248eb43f4a8f133c2bc510ae136a556e92b68a6ff44Eli Friedman __sync_lock_release (&sll); // CHECK: store atomic {{.*}} release, align 8 249eb43f4a8f133c2bc510ae136a556e92b68a6ff44Eli Friedman __sync_lock_release (&ull); // CHECK: store atomic {{.*}} release, align 8 2503883e66cfd55de70d89831cf26f9ae53931d11d3Eric Christopher} 251