Home | History | Annotate | Download | only in X86
      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