1*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -march=sparcv9 -verify-machineinstrs | FileCheck %s 2*9880d681SAndroid Build Coastguard Worker 3*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_atomic_i8 4*9880d681SAndroid Build Coastguard Worker; CHECK: ldub [%o0] 5*9880d681SAndroid Build Coastguard Worker; CHECK: membar 6*9880d681SAndroid Build Coastguard Worker; CHECK: ldub [%o1] 7*9880d681SAndroid Build Coastguard Worker; CHECK: membar 8*9880d681SAndroid Build Coastguard Worker; CHECK: membar 9*9880d681SAndroid Build Coastguard Worker; CHECK: stb {{.+}}, [%o2] 10*9880d681SAndroid Build Coastguard Workerdefine i8 @test_atomic_i8(i8* %ptr1, i8* %ptr2, i8* %ptr3) { 11*9880d681SAndroid Build Coastguard Workerentry: 12*9880d681SAndroid Build Coastguard Worker %0 = load atomic i8, i8* %ptr1 acquire, align 1 13*9880d681SAndroid Build Coastguard Worker %1 = load atomic i8, i8* %ptr2 acquire, align 1 14*9880d681SAndroid Build Coastguard Worker %2 = add i8 %0, %1 15*9880d681SAndroid Build Coastguard Worker store atomic i8 %2, i8* %ptr3 release, align 1 16*9880d681SAndroid Build Coastguard Worker ret i8 %2 17*9880d681SAndroid Build Coastguard Worker} 18*9880d681SAndroid Build Coastguard Worker 19*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_atomic_i16 20*9880d681SAndroid Build Coastguard Worker; CHECK: lduh [%o0] 21*9880d681SAndroid Build Coastguard Worker; CHECK: membar 22*9880d681SAndroid Build Coastguard Worker; CHECK: lduh [%o1] 23*9880d681SAndroid Build Coastguard Worker; CHECK: membar 24*9880d681SAndroid Build Coastguard Worker; CHECK: membar 25*9880d681SAndroid Build Coastguard Worker; CHECK: sth {{.+}}, [%o2] 26*9880d681SAndroid Build Coastguard Workerdefine i16 @test_atomic_i16(i16* %ptr1, i16* %ptr2, i16* %ptr3) { 27*9880d681SAndroid Build Coastguard Workerentry: 28*9880d681SAndroid Build Coastguard Worker %0 = load atomic i16, i16* %ptr1 acquire, align 2 29*9880d681SAndroid Build Coastguard Worker %1 = load atomic i16, i16* %ptr2 acquire, align 2 30*9880d681SAndroid Build Coastguard Worker %2 = add i16 %0, %1 31*9880d681SAndroid Build Coastguard Worker store atomic i16 %2, i16* %ptr3 release, align 2 32*9880d681SAndroid Build Coastguard Worker ret i16 %2 33*9880d681SAndroid Build Coastguard Worker} 34*9880d681SAndroid Build Coastguard Worker 35*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_atomic_i32 36*9880d681SAndroid Build Coastguard Worker; CHECK: ld [%o0] 37*9880d681SAndroid Build Coastguard Worker; CHECK: membar 38*9880d681SAndroid Build Coastguard Worker; CHECK: ld [%o1] 39*9880d681SAndroid Build Coastguard Worker; CHECK: membar 40*9880d681SAndroid Build Coastguard Worker; CHECK: membar 41*9880d681SAndroid Build Coastguard Worker; CHECK: st {{.+}}, [%o2] 42*9880d681SAndroid Build Coastguard Workerdefine i32 @test_atomic_i32(i32* %ptr1, i32* %ptr2, i32* %ptr3) { 43*9880d681SAndroid Build Coastguard Workerentry: 44*9880d681SAndroid Build Coastguard Worker %0 = load atomic i32, i32* %ptr1 acquire, align 4 45*9880d681SAndroid Build Coastguard Worker %1 = load atomic i32, i32* %ptr2 acquire, align 4 46*9880d681SAndroid Build Coastguard Worker %2 = add i32 %0, %1 47*9880d681SAndroid Build Coastguard Worker store atomic i32 %2, i32* %ptr3 release, align 4 48*9880d681SAndroid Build Coastguard Worker ret i32 %2 49*9880d681SAndroid Build Coastguard Worker} 50*9880d681SAndroid Build Coastguard Worker 51*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_atomic_i64 52*9880d681SAndroid Build Coastguard Worker; CHECK: ldx [%o0] 53*9880d681SAndroid Build Coastguard Worker; CHECK: membar 54*9880d681SAndroid Build Coastguard Worker; CHECK: ldx [%o1] 55*9880d681SAndroid Build Coastguard Worker; CHECK: membar 56*9880d681SAndroid Build Coastguard Worker; CHECK: membar 57*9880d681SAndroid Build Coastguard Worker; CHECK: stx {{.+}}, [%o2] 58*9880d681SAndroid Build Coastguard Workerdefine i64 @test_atomic_i64(i64* %ptr1, i64* %ptr2, i64* %ptr3) { 59*9880d681SAndroid Build Coastguard Workerentry: 60*9880d681SAndroid Build Coastguard Worker %0 = load atomic i64, i64* %ptr1 acquire, align 8 61*9880d681SAndroid Build Coastguard Worker %1 = load atomic i64, i64* %ptr2 acquire, align 8 62*9880d681SAndroid Build Coastguard Worker %2 = add i64 %0, %1 63*9880d681SAndroid Build Coastguard Worker store atomic i64 %2, i64* %ptr3 release, align 8 64*9880d681SAndroid Build Coastguard Worker ret i64 %2 65*9880d681SAndroid Build Coastguard Worker} 66*9880d681SAndroid Build Coastguard Worker 67*9880d681SAndroid Build Coastguard Worker;; TODO: the "move %icc" and related instructions are totally 68*9880d681SAndroid Build Coastguard Worker;; redundant here. There's something weird happening in optimization 69*9880d681SAndroid Build Coastguard Worker;; of the success value of cmpxchg. 70*9880d681SAndroid Build Coastguard Worker 71*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_cmpxchg_i8 72*9880d681SAndroid Build Coastguard Worker; CHECK: and %o1, -4, %o2 73*9880d681SAndroid Build Coastguard Worker; CHECK: mov 3, %o3 74*9880d681SAndroid Build Coastguard Worker; CHECK: andn %o3, %o1, %o1 75*9880d681SAndroid Build Coastguard Worker; CHECK: sll %o1, 3, %o1 76*9880d681SAndroid Build Coastguard Worker; CHECK: mov 255, %o3 77*9880d681SAndroid Build Coastguard Worker; CHECK: sll %o3, %o1, %o5 78*9880d681SAndroid Build Coastguard Worker; CHECK: xor %o5, -1, %o3 79*9880d681SAndroid Build Coastguard Worker; CHECK: mov 123, %o4 80*9880d681SAndroid Build Coastguard Worker; CHECK: ld [%o2], %g2 81*9880d681SAndroid Build Coastguard Worker; CHECK: sll %o4, %o1, %o4 82*9880d681SAndroid Build Coastguard Worker; CHECK: and %o0, 255, %o0 83*9880d681SAndroid Build Coastguard Worker; CHECK: sll %o0, %o1, %o0 84*9880d681SAndroid Build Coastguard Worker; CHECK: andn %g2, %o5, %g2 85*9880d681SAndroid Build Coastguard Worker; CHECK: sethi 0, %o5 86*9880d681SAndroid Build Coastguard Worker; CHECK: [[LABEL1:\.L.*]]: 87*9880d681SAndroid Build Coastguard Worker; CHECK: or %g2, %o4, %g3 88*9880d681SAndroid Build Coastguard Worker; CHECK: or %g2, %o0, %g4 89*9880d681SAndroid Build Coastguard Worker; CHECK: cas [%o2], %g4, %g3 90*9880d681SAndroid Build Coastguard Worker; CHECK: cmp %g3, %g4 91*9880d681SAndroid Build Coastguard Worker; CHECK: mov %o5, %g4 92*9880d681SAndroid Build Coastguard Worker; CHECK: move %icc, 1, %g4 93*9880d681SAndroid Build Coastguard Worker; CHECK: cmp %g4, 0 94*9880d681SAndroid Build Coastguard Worker; CHECK: bne [[LABEL2:\.L.*]] 95*9880d681SAndroid Build Coastguard Worker; CHECK: nop 96*9880d681SAndroid Build Coastguard Worker; CHECK: and %g3, %o3, %g4 97*9880d681SAndroid Build Coastguard Worker; CHECK: cmp %g2, %g4 98*9880d681SAndroid Build Coastguard Worker; CHECK: bne [[LABEL1]] 99*9880d681SAndroid Build Coastguard Worker; CHECK: mov %g4, %g2 100*9880d681SAndroid Build Coastguard Worker; CHECK: [[LABEL2]]: 101*9880d681SAndroid Build Coastguard Worker; CHECK: retl 102*9880d681SAndroid Build Coastguard Worker; CHECK: srl %g3, %o1, %o0 103*9880d681SAndroid Build Coastguard Workerdefine i8 @test_cmpxchg_i8(i8 %a, i8* %ptr) { 104*9880d681SAndroid Build Coastguard Workerentry: 105*9880d681SAndroid Build Coastguard Worker %pair = cmpxchg i8* %ptr, i8 %a, i8 123 monotonic monotonic 106*9880d681SAndroid Build Coastguard Worker %b = extractvalue { i8, i1 } %pair, 0 107*9880d681SAndroid Build Coastguard Worker ret i8 %b 108*9880d681SAndroid Build Coastguard Worker} 109*9880d681SAndroid Build Coastguard Worker 110*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_cmpxchg_i16 111*9880d681SAndroid Build Coastguard Worker 112*9880d681SAndroid Build Coastguard Worker; CHECK: and %o1, -4, %o2 113*9880d681SAndroid Build Coastguard Worker; CHECK: and %o1, 3, %o1 114*9880d681SAndroid Build Coastguard Worker; CHECK: xor %o1, 2, %o1 115*9880d681SAndroid Build Coastguard Worker; CHECK: sll %o1, 3, %o1 116*9880d681SAndroid Build Coastguard Worker; CHECK: sethi 63, %o3 117*9880d681SAndroid Build Coastguard Worker; CHECK: or %o3, 1023, %o4 118*9880d681SAndroid Build Coastguard Worker; CHECK: sll %o4, %o1, %o5 119*9880d681SAndroid Build Coastguard Worker; CHECK: xor %o5, -1, %o3 120*9880d681SAndroid Build Coastguard Worker; CHECK: and %o0, %o4, %o4 121*9880d681SAndroid Build Coastguard Worker; CHECK: ld [%o2], %g2 122*9880d681SAndroid Build Coastguard Worker; CHECK: mov 123, %o0 123*9880d681SAndroid Build Coastguard Worker; CHECK: sll %o0, %o1, %o0 124*9880d681SAndroid Build Coastguard Worker; CHECK: sll %o4, %o1, %o4 125*9880d681SAndroid Build Coastguard Worker; CHECK: andn %g2, %o5, %g2 126*9880d681SAndroid Build Coastguard Worker; CHECK: sethi 0, %o5 127*9880d681SAndroid Build Coastguard Worker; CHECK: [[LABEL1:\.L.*]]: 128*9880d681SAndroid Build Coastguard Worker; CHECK: or %g2, %o0, %g3 129*9880d681SAndroid Build Coastguard Worker; CHECK: or %g2, %o4, %g4 130*9880d681SAndroid Build Coastguard Worker; CHECK: cas [%o2], %g4, %g3 131*9880d681SAndroid Build Coastguard Worker; CHECK: cmp %g3, %g4 132*9880d681SAndroid Build Coastguard Worker; CHECK: mov %o5, %g4 133*9880d681SAndroid Build Coastguard Worker; CHECK: move %icc, 1, %g4 134*9880d681SAndroid Build Coastguard Worker; CHECK: cmp %g4, 0 135*9880d681SAndroid Build Coastguard Worker; CHECK: bne [[LABEL2:\.L.*]] 136*9880d681SAndroid Build Coastguard Worker; CHECK: nop 137*9880d681SAndroid Build Coastguard Worker; CHECK: and %g3, %o3, %g4 138*9880d681SAndroid Build Coastguard Worker; CHECK: cmp %g2, %g4 139*9880d681SAndroid Build Coastguard Worker; CHECK: bne [[LABEL1]] 140*9880d681SAndroid Build Coastguard Worker; CHECK: mov %g4, %g2 141*9880d681SAndroid Build Coastguard Worker; CHECK: [[LABEL2]]: 142*9880d681SAndroid Build Coastguard Worker; CHECK: retl 143*9880d681SAndroid Build Coastguard Worker; CHECK: srl %g3, %o1, %o0 144*9880d681SAndroid Build Coastguard Workerdefine i16 @test_cmpxchg_i16(i16 %a, i16* %ptr) { 145*9880d681SAndroid Build Coastguard Workerentry: 146*9880d681SAndroid Build Coastguard Worker %pair = cmpxchg i16* %ptr, i16 %a, i16 123 monotonic monotonic 147*9880d681SAndroid Build Coastguard Worker %b = extractvalue { i16, i1 } %pair, 0 148*9880d681SAndroid Build Coastguard Worker ret i16 %b 149*9880d681SAndroid Build Coastguard Worker} 150*9880d681SAndroid Build Coastguard Worker 151*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_cmpxchg_i32 152*9880d681SAndroid Build Coastguard Worker; CHECK: mov 123, [[R:%[gilo][0-7]]] 153*9880d681SAndroid Build Coastguard Worker; CHECK: cas [%o1], %o0, [[R]] 154*9880d681SAndroid Build Coastguard Worker 155*9880d681SAndroid Build Coastguard Workerdefine i32 @test_cmpxchg_i32(i32 %a, i32* %ptr) { 156*9880d681SAndroid Build Coastguard Workerentry: 157*9880d681SAndroid Build Coastguard Worker %pair = cmpxchg i32* %ptr, i32 %a, i32 123 monotonic monotonic 158*9880d681SAndroid Build Coastguard Worker %b = extractvalue { i32, i1 } %pair, 0 159*9880d681SAndroid Build Coastguard Worker ret i32 %b 160*9880d681SAndroid Build Coastguard Worker} 161*9880d681SAndroid Build Coastguard Worker 162*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_cmpxchg_i64 163*9880d681SAndroid Build Coastguard Worker; CHECK: mov 123, [[R:%[gilo][0-7]]] 164*9880d681SAndroid Build Coastguard Worker; CHECK: casx [%o1], %o0, [[R]] 165*9880d681SAndroid Build Coastguard Worker 166*9880d681SAndroid Build Coastguard Workerdefine i64 @test_cmpxchg_i64(i64 %a, i64* %ptr) { 167*9880d681SAndroid Build Coastguard Workerentry: 168*9880d681SAndroid Build Coastguard Worker %pair = cmpxchg i64* %ptr, i64 %a, i64 123 monotonic monotonic 169*9880d681SAndroid Build Coastguard Worker %b = extractvalue { i64, i1 } %pair, 0 170*9880d681SAndroid Build Coastguard Worker ret i64 %b 171*9880d681SAndroid Build Coastguard Worker} 172*9880d681SAndroid Build Coastguard Worker 173*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_swap_i8 174*9880d681SAndroid Build Coastguard Worker; CHECK: mov 42, [[R:%[gilo][0-7]]] 175*9880d681SAndroid Build Coastguard Worker; CHECK: cas 176*9880d681SAndroid Build Coastguard Worker 177*9880d681SAndroid Build Coastguard Workerdefine i8 @test_swap_i8(i8 %a, i8* %ptr) { 178*9880d681SAndroid Build Coastguard Workerentry: 179*9880d681SAndroid Build Coastguard Worker %b = atomicrmw xchg i8* %ptr, i8 42 monotonic 180*9880d681SAndroid Build Coastguard Worker ret i8 %b 181*9880d681SAndroid Build Coastguard Worker} 182*9880d681SAndroid Build Coastguard Worker 183*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_swap_i16 184*9880d681SAndroid Build Coastguard Worker; CHECK: mov 42, [[R:%[gilo][0-7]]] 185*9880d681SAndroid Build Coastguard Worker; CHECK: cas 186*9880d681SAndroid Build Coastguard Worker 187*9880d681SAndroid Build Coastguard Workerdefine i16 @test_swap_i16(i16 %a, i16* %ptr) { 188*9880d681SAndroid Build Coastguard Workerentry: 189*9880d681SAndroid Build Coastguard Worker %b = atomicrmw xchg i16* %ptr, i16 42 monotonic 190*9880d681SAndroid Build Coastguard Worker ret i16 %b 191*9880d681SAndroid Build Coastguard Worker} 192*9880d681SAndroid Build Coastguard Worker 193*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_swap_i32 194*9880d681SAndroid Build Coastguard Worker; CHECK: mov 42, [[R:%[gilo][0-7]]] 195*9880d681SAndroid Build Coastguard Worker; CHECK: swap [%o1], [[R]] 196*9880d681SAndroid Build Coastguard Worker 197*9880d681SAndroid Build Coastguard Workerdefine i32 @test_swap_i32(i32 %a, i32* %ptr) { 198*9880d681SAndroid Build Coastguard Workerentry: 199*9880d681SAndroid Build Coastguard Worker %b = atomicrmw xchg i32* %ptr, i32 42 monotonic 200*9880d681SAndroid Build Coastguard Worker ret i32 %b 201*9880d681SAndroid Build Coastguard Worker} 202*9880d681SAndroid Build Coastguard Worker 203*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_swap_i64 204*9880d681SAndroid Build Coastguard Worker; CHECK: casx [%o1], 205*9880d681SAndroid Build Coastguard Worker 206*9880d681SAndroid Build Coastguard Workerdefine i64 @test_swap_i64(i64 %a, i64* %ptr) { 207*9880d681SAndroid Build Coastguard Workerentry: 208*9880d681SAndroid Build Coastguard Worker %b = atomicrmw xchg i64* %ptr, i64 42 monotonic 209*9880d681SAndroid Build Coastguard Worker ret i64 %b 210*9880d681SAndroid Build Coastguard Worker} 211*9880d681SAndroid Build Coastguard Worker 212*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_load_sub_i8 213*9880d681SAndroid Build Coastguard Worker; CHECK: membar 214*9880d681SAndroid Build Coastguard Worker; CHECK: .L{{.*}}: 215*9880d681SAndroid Build Coastguard Worker; CHECK: sub 216*9880d681SAndroid Build Coastguard Worker; CHECK: cas [{{%[gilo][0-7]}}] 217*9880d681SAndroid Build Coastguard Worker; CHECK: membar 218*9880d681SAndroid Build Coastguard Workerdefine zeroext i8 @test_load_sub_i8(i8* %p, i8 zeroext %v) { 219*9880d681SAndroid Build Coastguard Workerentry: 220*9880d681SAndroid Build Coastguard Worker %0 = atomicrmw sub i8* %p, i8 %v seq_cst 221*9880d681SAndroid Build Coastguard Worker ret i8 %0 222*9880d681SAndroid Build Coastguard Worker} 223*9880d681SAndroid Build Coastguard Worker 224*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_load_sub_i16 225*9880d681SAndroid Build Coastguard Worker; CHECK: membar 226*9880d681SAndroid Build Coastguard Worker; CHECK: .L{{.*}}: 227*9880d681SAndroid Build Coastguard Worker; CHECK: sub 228*9880d681SAndroid Build Coastguard Worker; CHECK: cas [{{%[gilo][0-7]}}] 229*9880d681SAndroid Build Coastguard Worker; CHECK: membar 230*9880d681SAndroid Build Coastguard Workerdefine zeroext i16 @test_load_sub_i16(i16* %p, i16 zeroext %v) { 231*9880d681SAndroid Build Coastguard Workerentry: 232*9880d681SAndroid Build Coastguard Worker %0 = atomicrmw sub i16* %p, i16 %v seq_cst 233*9880d681SAndroid Build Coastguard Worker ret i16 %0 234*9880d681SAndroid Build Coastguard Worker} 235*9880d681SAndroid Build Coastguard Worker 236*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_load_add_i32 237*9880d681SAndroid Build Coastguard Worker; CHECK: membar 238*9880d681SAndroid Build Coastguard Worker; CHECK: add [[V:%[gilo][0-7]]], %o1, [[U:%[gilo][0-7]]] 239*9880d681SAndroid Build Coastguard Worker; CHECK: cas [%o0], [[V]], [[U]] 240*9880d681SAndroid Build Coastguard Worker; CHECK: membar 241*9880d681SAndroid Build Coastguard Workerdefine zeroext i32 @test_load_add_i32(i32* %p, i32 zeroext %v) { 242*9880d681SAndroid Build Coastguard Workerentry: 243*9880d681SAndroid Build Coastguard Worker %0 = atomicrmw add i32* %p, i32 %v seq_cst 244*9880d681SAndroid Build Coastguard Worker ret i32 %0 245*9880d681SAndroid Build Coastguard Worker} 246*9880d681SAndroid Build Coastguard Worker 247*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_load_sub_64 248*9880d681SAndroid Build Coastguard Worker; CHECK: membar 249*9880d681SAndroid Build Coastguard Worker; CHECK: sub 250*9880d681SAndroid Build Coastguard Worker; CHECK: casx [%o0] 251*9880d681SAndroid Build Coastguard Worker; CHECK: membar 252*9880d681SAndroid Build Coastguard Workerdefine zeroext i64 @test_load_sub_64(i64* %p, i64 zeroext %v) { 253*9880d681SAndroid Build Coastguard Workerentry: 254*9880d681SAndroid Build Coastguard Worker %0 = atomicrmw sub i64* %p, i64 %v seq_cst 255*9880d681SAndroid Build Coastguard Worker ret i64 %0 256*9880d681SAndroid Build Coastguard Worker} 257*9880d681SAndroid Build Coastguard Worker 258*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_load_xor_32 259*9880d681SAndroid Build Coastguard Worker; CHECK: membar 260*9880d681SAndroid Build Coastguard Worker; CHECK: xor 261*9880d681SAndroid Build Coastguard Worker; CHECK: cas [%o0] 262*9880d681SAndroid Build Coastguard Worker; CHECK: membar 263*9880d681SAndroid Build Coastguard Workerdefine zeroext i32 @test_load_xor_32(i32* %p, i32 zeroext %v) { 264*9880d681SAndroid Build Coastguard Workerentry: 265*9880d681SAndroid Build Coastguard Worker %0 = atomicrmw xor i32* %p, i32 %v seq_cst 266*9880d681SAndroid Build Coastguard Worker ret i32 %0 267*9880d681SAndroid Build Coastguard Worker} 268*9880d681SAndroid Build Coastguard Worker 269*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_load_and_32 270*9880d681SAndroid Build Coastguard Worker; CHECK: membar 271*9880d681SAndroid Build Coastguard Worker; CHECK: and 272*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: xor 273*9880d681SAndroid Build Coastguard Worker; CHECK: cas [%o0] 274*9880d681SAndroid Build Coastguard Worker; CHECK: membar 275*9880d681SAndroid Build Coastguard Workerdefine zeroext i32 @test_load_and_32(i32* %p, i32 zeroext %v) { 276*9880d681SAndroid Build Coastguard Workerentry: 277*9880d681SAndroid Build Coastguard Worker %0 = atomicrmw and i32* %p, i32 %v seq_cst 278*9880d681SAndroid Build Coastguard Worker ret i32 %0 279*9880d681SAndroid Build Coastguard Worker} 280*9880d681SAndroid Build Coastguard Worker 281*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_load_nand_32 282*9880d681SAndroid Build Coastguard Worker; CHECK: membar 283*9880d681SAndroid Build Coastguard Worker; CHECK: and 284*9880d681SAndroid Build Coastguard Worker; CHECK: xor 285*9880d681SAndroid Build Coastguard Worker; CHECK: cas [%o0] 286*9880d681SAndroid Build Coastguard Worker; CHECK: membar 287*9880d681SAndroid Build Coastguard Workerdefine zeroext i32 @test_load_nand_32(i32* %p, i32 zeroext %v) { 288*9880d681SAndroid Build Coastguard Workerentry: 289*9880d681SAndroid Build Coastguard Worker %0 = atomicrmw nand i32* %p, i32 %v seq_cst 290*9880d681SAndroid Build Coastguard Worker ret i32 %0 291*9880d681SAndroid Build Coastguard Worker} 292*9880d681SAndroid Build Coastguard Worker 293*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_load_max_64 294*9880d681SAndroid Build Coastguard Worker; CHECK: membar 295*9880d681SAndroid Build Coastguard Worker; CHECK: cmp 296*9880d681SAndroid Build Coastguard Worker; CHECK: movg %xcc 297*9880d681SAndroid Build Coastguard Worker; CHECK: casx [%o0] 298*9880d681SAndroid Build Coastguard Worker; CHECK: membar 299*9880d681SAndroid Build Coastguard Workerdefine zeroext i64 @test_load_max_64(i64* %p, i64 zeroext %v) { 300*9880d681SAndroid Build Coastguard Workerentry: 301*9880d681SAndroid Build Coastguard Worker %0 = atomicrmw max i64* %p, i64 %v seq_cst 302*9880d681SAndroid Build Coastguard Worker ret i64 %0 303*9880d681SAndroid Build Coastguard Worker} 304*9880d681SAndroid Build Coastguard Worker 305*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_load_umin_32 306*9880d681SAndroid Build Coastguard Worker; CHECK: membar 307*9880d681SAndroid Build Coastguard Worker; CHECK: cmp 308*9880d681SAndroid Build Coastguard Worker; CHECK: movleu %icc 309*9880d681SAndroid Build Coastguard Worker; CHECK: cas [%o0] 310*9880d681SAndroid Build Coastguard Worker; CHECK: membar 311*9880d681SAndroid Build Coastguard Workerdefine zeroext i32 @test_load_umin_32(i32* %p, i32 zeroext %v) { 312*9880d681SAndroid Build Coastguard Workerentry: 313*9880d681SAndroid Build Coastguard Worker %0 = atomicrmw umin i32* %p, i32 %v seq_cst 314*9880d681SAndroid Build Coastguard Worker ret i32 %0 315*9880d681SAndroid Build Coastguard Worker} 316