Home | History | Annotate | Download | only in PowerPC
      1 ; RUN: llc < %s -ppc-asm-full-reg-names -mtriple=ppc64-- | FileCheck %s -check-prefix=CHECK -check-prefix=CHECK-BE
      2 ; RUN: llc < %s -ppc-asm-full-reg-names -mtriple=powerpc64le-unknown-linux-gnu | FileCheck %s -check-prefix=CHECK -check-prefix=CHECK-LE
      3 ; RUN: llc < %s -ppc-asm-full-reg-names -mtriple=ppc64-- -mcpu=pwr7 | FileCheck %s
      4 ; RUN: llc < %s -ppc-asm-full-reg-names -mtriple=ppc64-- -mcpu=pwr8 | FileCheck %s -check-prefix=CHECK-P8U
      5 
      6 define i64 @exchange_and_add(i64* %mem, i64 %val) nounwind {
      7 ; CHECK-LABEL: exchange_and_add:
      8 ; CHECK: ldarx
      9   %tmp = atomicrmw add i64* %mem, i64 %val monotonic
     10 ; CHECK: stdcx.
     11   ret i64 %tmp
     12 }
     13 
     14 define i8 @exchange_and_add8(i8* %mem, i8 %val) nounwind {
     15 ; CHECK-LABEL: exchange_and_add8:
     16 ; CHECK-BE: xori
     17 ; CHECK-LE-NOT: xori
     18 ; CHECK-P8U: lbarx
     19   %tmp = atomicrmw add i8* %mem, i8 %val monotonic
     20 ; CHECK-P8U: stbcx.
     21   ret i8 %tmp
     22 }
     23 
     24 define i16 @exchange_and_add16(i16* %mem, i16 %val) nounwind {
     25 ; CHECK-LABEL: exchange_and_add16:
     26 ; CHECK-BE: xori
     27 ; CHECK-LE-NOT: xori
     28 ; CHECK-P8U: lharx
     29   %tmp = atomicrmw add i16* %mem, i16 %val monotonic
     30 ; CHECK-P8U: sthcx.
     31   ret i16 %tmp
     32 }
     33 
     34 define i64 @exchange_and_cmp(i64* %mem) nounwind {
     35 ; CHECK-LABEL: exchange_and_cmp:
     36 ; CHECK: ldarx
     37   %tmppair = cmpxchg i64* %mem, i64 0, i64 1 monotonic monotonic
     38   %tmp = extractvalue { i64, i1 } %tmppair, 0
     39 ; CHECK: stdcx.
     40 ; CHECK: stdcx.
     41   ret i64 %tmp
     42 }
     43 
     44 define i8 @exchange_and_cmp8(i8* %mem) nounwind {
     45 ; CHECK-LABEL: exchange_and_cmp8:
     46 ; CHECK-BE: xori
     47 ; CHECK-LE-NOT: xori
     48 ; CHECK-P8U: lbarx
     49   %tmppair = cmpxchg i8* %mem, i8 0, i8 1 monotonic monotonic
     50   %tmp = extractvalue { i8, i1 } %tmppair, 0
     51 ; CHECK-P8U: stbcx.
     52 ; CHECK-P8U: stbcx.
     53   ret i8 %tmp
     54 }
     55 
     56 define i16 @exchange_and_cmp16(i16* %mem) nounwind {
     57 ; CHECK-LABEL: exchange_and_cmp16:
     58 ; CHECK-BE: xori
     59 ; CHECK-LE-NOT: xori
     60 ; CHECK-P8U: lharx
     61   %tmppair = cmpxchg i16* %mem, i16 0, i16 1 monotonic monotonic
     62   %tmp = extractvalue { i16, i1 } %tmppair, 0
     63 ; CHECK-P8U: sthcx.
     64 ; CHECK-P8U: sthcx.
     65   ret i16 %tmp
     66 }
     67 
     68 define i64 @exchange(i64* %mem, i64 %val) nounwind {
     69 ; CHECK-LABEL: exchange:
     70 ; CHECK: ldarx
     71   %tmp = atomicrmw xchg i64* %mem, i64 1 monotonic
     72 ; CHECK: stdcx.
     73   ret i64 %tmp
     74 }
     75 
     76 define i8 @exchange8(i8* %mem, i8 %val) nounwind {
     77 ; CHECK-LABEL: exchange8:
     78 ; CHECK-BE: xori
     79 ; CHECK-LE-NOT: xori
     80 ; CHECK-P8U: lbarx
     81   %tmp = atomicrmw xchg i8* %mem, i8 1 monotonic
     82 ; CHECK-P8U: stbcx.
     83   ret i8 %tmp
     84 }
     85 
     86 define i16 @exchange16(i16* %mem, i16 %val) nounwind {
     87 ; CHECK-LABEL: exchange16:
     88 ; CHECK-BE: xori
     89 ; CHECK-LE-NOT: xori
     90 ; CHECK-P8U: lharx
     91   %tmp = atomicrmw xchg i16* %mem, i16 1 monotonic
     92 ; CHECK-P8U: sthcx.
     93   ret i16 %tmp
     94 }
     95 
     96 define void @atomic_store(i64* %mem, i64 %val) nounwind {
     97 entry:
     98 ; CHECK: @atomic_store
     99   store atomic i64 %val, i64* %mem release, align 64
    100 ; CHECK: lwsync
    101 ; CHECK-NOT: stdcx
    102 ; CHECK: std
    103   ret void
    104 }
    105 
    106 define i64 @atomic_load(i64* %mem) nounwind {
    107 entry:
    108 ; CHECK: @atomic_load
    109   %tmp = load atomic i64, i64* %mem acquire, align 64
    110 ; CHECK-NOT: ldarx
    111 ; CHECK: ld [[VAL:r[0-9]+]]
    112 ; CHECK: cmpd [[CR:cr[0-9]+]], [[VAL]], [[VAL]]
    113 ; CHECK: bne- [[CR]], .+4
    114 ; CHECK: isync
    115   ret i64 %tmp
    116 }
    117 
    118