1 ; RUN: llc -march=x86 -mattr=+cmov -mtriple=i386-pc-linux -verify-machineinstrs < %s | FileCheck %s -check-prefix=LINUX 2 ; RUN: llc -march=x86 -mattr=-cmov -mtriple=i386-pc-linux -verify-machineinstrs < %s | FileCheck %s -check-prefix=NOCMOV 3 ; RUN: llc -march=x86 -mtriple=i386-macosx -relocation-model=pic -verify-machineinstrs < %s | FileCheck %s -check-prefix=PIC 4 5 @sc64 = external global i64 6 7 define void @atomic_maxmin_i6432() { 8 ; LINUX: atomic_maxmin_i6432 9 %1 = atomicrmw max i64* @sc64, i64 5 acquire 10 ; LINUX: [[LABEL:.LBB[0-9]+_[0-9]+]] 11 ; LINUX: cmpl 12 ; LINUX: setl 13 ; LINUX: cmpl 14 ; LINUX: setl 15 ; LINUX: cmovne 16 ; LINUX: cmovne 17 ; LINUX: lock 18 ; LINUX-NEXT: cmpxchg8b 19 ; LINUX: jne [[LABEL]] 20 ; NOCMOV: [[LABEL:.LBB[0-9]+_[0-9]+]] 21 ; NOCMOV: cmpl 22 ; NOCMOV: setl 23 ; NOCMOV: cmpl 24 ; NOCMOV: setl 25 ; NOCMOV: jne 26 ; NOCMOV: jne 27 ; NOCMOV: lock 28 ; NOCMOV-NEXT: cmpxchg8b 29 ; NOCMOV: jne [[LABEL]] 30 %2 = atomicrmw min i64* @sc64, i64 6 acquire 31 ; LINUX: [[LABEL:.LBB[0-9]+_[0-9]+]] 32 ; LINUX: cmpl 33 ; LINUX: setg 34 ; LINUX: cmpl 35 ; LINUX: setg 36 ; LINUX: cmovne 37 ; LINUX: cmovne 38 ; LINUX: lock 39 ; LINUX-NEXT: cmpxchg8b 40 ; LINUX: jne [[LABEL]] 41 ; NOCMOV: [[LABEL:.LBB[0-9]+_[0-9]+]] 42 ; NOCMOV: cmpl 43 ; NOCMOV: setg 44 ; NOCMOV: cmpl 45 ; NOCMOV: setg 46 ; NOCMOV: jne 47 ; NOCMOV: jne 48 ; NOCMOV: lock 49 ; NOCMOV-NEXT: cmpxchg8b 50 ; NOCMOV: jne [[LABEL]] 51 %3 = atomicrmw umax i64* @sc64, i64 7 acquire 52 ; LINUX: [[LABEL:.LBB[0-9]+_[0-9]+]] 53 ; LINUX: cmpl 54 ; LINUX: setb 55 ; LINUX: cmpl 56 ; LINUX: setb 57 ; LINUX: cmovne 58 ; LINUX: cmovne 59 ; LINUX: lock 60 ; LINUX-NEXT: cmpxchg8b 61 ; LINUX: jne [[LABEL]] 62 ; NOCMOV: [[LABEL:.LBB[0-9]+_[0-9]+]] 63 ; NOCMOV: cmpl 64 ; NOCMOV: setb 65 ; NOCMOV: cmpl 66 ; NOCMOV: setb 67 ; NOCMOV: jne 68 ; NOCMOV: jne 69 ; NOCMOV: lock 70 ; NOCMOV-NEXT: cmpxchg8b 71 ; NOCMOV: jne [[LABEL]] 72 %4 = atomicrmw umin i64* @sc64, i64 8 acquire 73 ; LINUX: [[LABEL:.LBB[0-9]+_[0-9]+]] 74 ; LINUX: cmpl 75 ; LINUX: seta 76 ; LINUX: cmpl 77 ; LINUX: seta 78 ; LINUX: cmovne 79 ; LINUX: cmovne 80 ; LINUX: lock 81 ; LINUX-NEXT: cmpxchg8b 82 ; LINUX: jne [[LABEL]] 83 ; NOCMOV: [[LABEL:.LBB[0-9]+_[0-9]+]] 84 ; NOCMOV: cmpl 85 ; NOCMOV: seta 86 ; NOCMOV: cmpl 87 ; NOCMOV: seta 88 ; NOCMOV: jne 89 ; NOCMOV: jne 90 ; NOCMOV: lock 91 ; NOCMOV-NEXT: cmpxchg8b 92 ; NOCMOV: jne [[LABEL]] 93 ret void 94 } 95 96 ; rdar://12453106 97 @id = internal global i64 0, align 8 98 99 define void @tf_bug(i8* %ptr) nounwind { 100 ; PIC: tf_bug: 101 ; PIC: movl _id-L1$pb( 102 ; PIC: movl (_id-L1$pb)+4( 103 %tmp1 = atomicrmw add i64* @id, i64 1 seq_cst 104 %tmp2 = add i64 %tmp1, 1 105 %tmp3 = bitcast i8* %ptr to i64* 106 store i64 %tmp2, i64* %tmp3, align 4 107 ret void 108 } 109