Home | History | Annotate | Download | only in X86
      1 ; RUN: llc < %s -O0 -mtriple=x86_64-unknown-unknown -mcpu=corei7 -verify-machineinstrs -show-mc-encoding | FileCheck %s --check-prefix X64
      2 ; RUN: llc < %s -O0 -mtriple=i386-unknown-unknown -mcpu=corei7 -verify-machineinstrs | FileCheck %s --check-prefix X32
      3 
      4 @sc16 = external global i16
      5 
      6 define void @atomic_fetch_add16() nounwind {
      7 ; X64-LABEL:   atomic_fetch_add16
      8 ; X32-LABEL:   atomic_fetch_add16
      9 entry:
     10 ; 32-bit
     11   %t1 = atomicrmw add  i16* @sc16, i16 1 acquire
     12 ; X64:       lock
     13 ; X64:       incw
     14 ; X32:       lock
     15 ; X32:       incw
     16   %t2 = atomicrmw add  i16* @sc16, i16 3 acquire
     17 ; X64:       lock
     18 ; X64:       addw $3, {{.*}} # encoding: [0x66,0xf0
     19 ; X32:       lock
     20 ; X32:       addw $3
     21   %t3 = atomicrmw add  i16* @sc16, i16 5 acquire
     22 ; X64:       lock
     23 ; X64:       xaddw {{.*}} # encoding: [0x66,0xf0
     24 ; X32:       lock
     25 ; X32:       xaddw
     26   %t4 = atomicrmw add  i16* @sc16, i16 %t3 acquire
     27 ; X64:       lock
     28 ; X64:       addw {{.*}} # encoding: [0x66,0xf0
     29 ; X32:       lock
     30 ; X32:       addw
     31   ret void
     32 ; X64:       ret
     33 ; X32:       ret
     34 }
     35 
     36 define void @atomic_fetch_sub16() nounwind {
     37 ; X64-LABEL:   atomic_fetch_sub16
     38 ; X32-LABEL:   atomic_fetch_sub16
     39   %t1 = atomicrmw sub  i16* @sc16, i16 1 acquire
     40 ; X64:       lock
     41 ; X64:       decw
     42 ; X32:       lock
     43 ; X32:       decw
     44   %t2 = atomicrmw sub  i16* @sc16, i16 3 acquire
     45 ; X64:       lock
     46 ; X64:       subw $3, {{.*}} # encoding: [0x66,0xf0
     47 ; X32:       lock
     48 ; X32:       subw $3
     49   %t3 = atomicrmw sub  i16* @sc16, i16 5 acquire
     50 ; X64:       lock
     51 ; X64:       xaddw {{.*}} # encoding: [0x66,0xf0
     52 ; X32:       lock
     53 ; X32:       xaddw
     54   %t4 = atomicrmw sub  i16* @sc16, i16 %t3 acquire
     55 ; X64:       lock
     56 ; X64:       subw {{.*}} # encoding: [0x66,0xf0
     57 ; X32:       lock
     58 ; X32:       subw
     59   ret void
     60 ; X64:       ret
     61 ; X32:       ret
     62 }
     63 
     64 define void @atomic_fetch_and16() nounwind {
     65 ; X64-LABEL:   atomic_fetch_and16
     66 ; X32-LABEL:   atomic_fetch_and16
     67   %t1 = atomicrmw and  i16* @sc16, i16 3 acquire
     68 ; X64:       lock
     69 ; X64:       andw $3, {{.*}} # encoding: [0x66,0xf0
     70 ; X32:       lock
     71 ; X32:       andw $3
     72   %t2 = atomicrmw and  i16* @sc16, i16 5 acquire
     73 ; X64:       andl
     74 ; X64:       lock
     75 ; X64:       cmpxchgw
     76 ; X32:       andl
     77 ; X32:       lock
     78 ; X32:       cmpxchgw
     79   %t3 = atomicrmw and  i16* @sc16, i16 %t2 acquire
     80 ; X64:       lock
     81 ; X64:       andw {{.*}} # encoding: [0x66,0xf0
     82 ; X32:       lock
     83 ; X32:       andw
     84   ret void
     85 ; X64:       ret
     86 ; X32:       ret
     87 }
     88 
     89 define void @atomic_fetch_or16() nounwind {
     90 ; X64-LABEL:   atomic_fetch_or16
     91 ; X32-LABEL:   atomic_fetch_or16
     92   %t1 = atomicrmw or   i16* @sc16, i16 3 acquire
     93 ; X64:       lock
     94 ; X64:       orw $3, {{.*}} # encoding: [0x66,0xf0
     95 ; X32:       lock
     96 ; X32:       orw $3
     97   %t2 = atomicrmw or   i16* @sc16, i16 5 acquire
     98 ; X64:       orl
     99 ; X64:       lock
    100 ; X64:       cmpxchgw
    101 ; X32:       orl
    102 ; X32:       lock
    103 ; X32:       cmpxchgw
    104   %t3 = atomicrmw or   i16* @sc16, i16 %t2 acquire
    105 ; X64:       lock
    106 ; X64:       orw {{.*}} # encoding: [0x66,0xf0
    107 ; X32:       lock
    108 ; X32:       orw
    109   ret void
    110 ; X64:       ret
    111 ; X32:       ret
    112 }
    113 
    114 define void @atomic_fetch_xor16() nounwind {
    115 ; X64-LABEL:   atomic_fetch_xor16
    116 ; X32-LABEL:   atomic_fetch_xor16
    117   %t1 = atomicrmw xor  i16* @sc16, i16 3 acquire
    118 ; X64:       lock
    119 ; X64:       xorw $3, {{.*}} # encoding: [0x66,0xf0
    120 ; X32:       lock
    121 ; X32:       xorw $3
    122   %t2 = atomicrmw xor  i16* @sc16, i16 5 acquire
    123 ; X64:       xorl
    124 ; X64:       lock
    125 ; X64:       cmpxchgw
    126 ; X32:       xorl
    127 ; X32:       lock
    128 ; X32:       cmpxchgw
    129   %t3 = atomicrmw xor  i16* @sc16, i16 %t2 acquire
    130 ; X64:       lock
    131 ; X64:       xorw {{.*}} # encoding: [0x66,0xf0
    132 ; X32:       lock
    133 ; X32:       xorw
    134   ret void
    135 ; X64:       ret
    136 ; X32:       ret
    137 }
    138 
    139 define void @atomic_fetch_nand16(i16 %x) nounwind {
    140 ; X64-LABEL:   atomic_fetch_nand16
    141 ; X32-LABEL:   atomic_fetch_nand16
    142   %t1 = atomicrmw nand i16* @sc16, i16 %x acquire
    143 ; X64:       andl
    144 ; X64:       notl
    145 ; X64:       lock
    146 ; X64:       cmpxchgw
    147 ; X32:       andl
    148 ; X32:       notl
    149 ; X32:       lock
    150 ; X32:       cmpxchgw
    151   ret void
    152 ; X64:       ret
    153 ; X32:       ret
    154 }
    155 
    156 define void @atomic_fetch_max16(i16 %x) nounwind {
    157   %t1 = atomicrmw max  i16* @sc16, i16 %x acquire
    158 ; X64:       movswl
    159 ; X64:       movswl
    160 ; X64:       subl
    161 ; X64:       cmov
    162 ; X64:       lock
    163 ; X64:       cmpxchgw
    164 
    165 ; X32:       movswl
    166 ; X32:       movswl
    167 ; X32:       subl
    168 ; X32:       cmov
    169 ; X32:       lock
    170 ; X32:       cmpxchgw
    171   ret void
    172 ; X64:       ret
    173 ; X32:       ret
    174 }
    175 
    176 define void @atomic_fetch_min16(i16 %x) nounwind {
    177   %t1 = atomicrmw min  i16* @sc16, i16 %x acquire
    178 ; X64:       movswl
    179 ; X64:       movswl
    180 ; X64:       subl
    181 ; X64:       cmov
    182 ; X64:       lock
    183 ; X64:       cmpxchgw
    184 
    185 ; X32:       movswl
    186 ; X32:       movswl
    187 ; X32:       subl
    188 ; X32:       cmov
    189 ; X32:       lock
    190 ; X32:       cmpxchgw
    191   ret void
    192 ; X64:       ret
    193 ; X32:       ret
    194 }
    195 
    196 define void @atomic_fetch_umax16(i16 %x) nounwind {
    197   %t1 = atomicrmw umax i16* @sc16, i16 %x acquire
    198 ; X64:       movzwl
    199 ; X64:       movzwl
    200 ; X64:       subl
    201 ; X64:       cmov
    202 ; X64:       lock
    203 ; X64:       cmpxchgw
    204 
    205 ; X32:       movzwl
    206 ; X32:       movzwl
    207 ; X32:       subl
    208 ; X32:       cmov
    209 ; X32:       lock
    210 ; X32:       cmpxchgw
    211   ret void
    212 ; X64:       ret
    213 ; X32:       ret
    214 }
    215 
    216 define void @atomic_fetch_umin16(i16 %x) nounwind {
    217   %t1 = atomicrmw umin i16* @sc16, i16 %x acquire
    218 ; X64:       movzwl
    219 ; X64:       movzwl
    220 ; X64:       subl
    221 ; X64:       cmov
    222 ; X64:       lock
    223 ; X64:       cmpxchgw
    224 
    225 ; X32:       movzwl
    226 ; X32:       movzwl
    227 ; X32:       subl
    228 ; X32:       cmov
    229 ; X32:       lock
    230 ; X32:       cmpxchgw
    231   ret void
    232 ; X64:       ret
    233 ; X32:       ret
    234 }
    235 
    236 define void @atomic_fetch_cmpxchg16() nounwind {
    237   %t1 = cmpxchg i16* @sc16, i16 0, i16 1 acquire acquire
    238 ; X64:       lock
    239 ; X64:       cmpxchgw
    240 ; X32:       lock
    241 ; X32:       cmpxchgw
    242   ret void
    243 ; X64:       ret
    244 ; X32:       ret
    245 }
    246 
    247 define void @atomic_fetch_store16(i16 %x) nounwind {
    248   store atomic i16 %x, i16* @sc16 release, align 4
    249 ; X64-NOT:   lock
    250 ; X64:       movw
    251 ; X32-NOT:   lock
    252 ; X32:       movw
    253   ret void
    254 ; X64:       ret
    255 ; X32:       ret
    256 }
    257 
    258 define void @atomic_fetch_swap16(i16 %x) nounwind {
    259   %t1 = atomicrmw xchg i16* @sc16, i16 %x acquire
    260 ; X64-NOT:   lock
    261 ; X64:       xchgw
    262 ; X32-NOT:   lock
    263 ; X32:       xchgw
    264   ret void
    265 ; X64:       ret
    266 ; X32:       ret
    267 }
    268