1*0a6a1f1dSLionel Sambuc; RUN: llc < %s -mtriple=x86_64-apple-macosx10.9 -verify-machineinstrs -mattr=cx16 | FileCheck %s 2*0a6a1f1dSLionel Sambuc 3*0a6a1f1dSLionel Sambuc@var = global i128 0 4*0a6a1f1dSLionel Sambuc 5*0a6a1f1dSLionel Sambucdefine i128 @val_compare_and_swap(i128* %p, i128 %oldval, i128 %newval) { 6*0a6a1f1dSLionel Sambuc; CHECK-LABEL: val_compare_and_swap: 7*0a6a1f1dSLionel Sambuc; CHECK: movq %rsi, %rax 8*0a6a1f1dSLionel Sambuc; CHECK: movq %rcx, %rbx 9*0a6a1f1dSLionel Sambuc; CHECK: movq %r8, %rcx 10*0a6a1f1dSLionel Sambuc; CHECK: lock 11*0a6a1f1dSLionel Sambuc; CHECK: cmpxchg16b (%rdi) 12*0a6a1f1dSLionel Sambuc 13*0a6a1f1dSLionel Sambuc %pair = cmpxchg i128* %p, i128 %oldval, i128 %newval acquire acquire 14*0a6a1f1dSLionel Sambuc %val = extractvalue { i128, i1 } %pair, 0 15*0a6a1f1dSLionel Sambuc ret i128 %val 16*0a6a1f1dSLionel Sambuc} 17*0a6a1f1dSLionel Sambuc 18*0a6a1f1dSLionel Sambucdefine void @fetch_and_nand(i128* %p, i128 %bits) { 19*0a6a1f1dSLionel Sambuc; CHECK-LABEL: fetch_and_nand: 20*0a6a1f1dSLionel Sambuc; CHECK-DAG: movq %rdx, [[INCHI:%[a-z0-9]+]] 21*0a6a1f1dSLionel Sambuc; CHECK-DAG: movq (%rdi), %rax 22*0a6a1f1dSLionel Sambuc; CHECK-DAG: movq 8(%rdi), %rdx 23*0a6a1f1dSLionel Sambuc 24*0a6a1f1dSLionel Sambuc; CHECK: [[LOOP:.?LBB[0-9]+_[0-9]+]]: 25*0a6a1f1dSLionel Sambuc; CHECK: movq %rdx, %rcx 26*0a6a1f1dSLionel Sambuc; CHECK: andq [[INCHI]], %rcx 27*0a6a1f1dSLionel Sambuc; CHECK: movq %rax, %rbx 28*0a6a1f1dSLionel Sambuc ; INCLO equivalent comes in in %rsi, so it makes sense it stays there. 29*0a6a1f1dSLionel Sambuc; CHECK: andq %rsi, %rbx 30*0a6a1f1dSLionel Sambuc; CHECK: notq %rbx 31*0a6a1f1dSLionel Sambuc; CHECK: notq %rcx 32*0a6a1f1dSLionel Sambuc; CHECK: lock 33*0a6a1f1dSLionel Sambuc; CHECK: cmpxchg16b (%rdi) 34*0a6a1f1dSLionel Sambuc; CHECK: jne [[LOOP]] 35*0a6a1f1dSLionel Sambuc 36*0a6a1f1dSLionel Sambuc; CHECK: movq %rax, _var 37*0a6a1f1dSLionel Sambuc; CHECK: movq %rdx, _var+8 38*0a6a1f1dSLionel Sambuc %val = atomicrmw nand i128* %p, i128 %bits release 39*0a6a1f1dSLionel Sambuc store i128 %val, i128* @var, align 16 40*0a6a1f1dSLionel Sambuc ret void 41*0a6a1f1dSLionel Sambuc} 42*0a6a1f1dSLionel Sambuc 43*0a6a1f1dSLionel Sambucdefine void @fetch_and_or(i128* %p, i128 %bits) { 44*0a6a1f1dSLionel Sambuc; CHECK-LABEL: fetch_and_or: 45*0a6a1f1dSLionel Sambuc; CHECK-DAG: movq %rdx, [[INCHI:%[a-z0-9]+]] 46*0a6a1f1dSLionel Sambuc; CHECK-DAG: movq (%rdi), %rax 47*0a6a1f1dSLionel Sambuc; CHECK-DAG: movq 8(%rdi), %rdx 48*0a6a1f1dSLionel Sambuc 49*0a6a1f1dSLionel Sambuc; CHECK: [[LOOP:.?LBB[0-9]+_[0-9]+]]: 50*0a6a1f1dSLionel Sambuc; CHECK: movq %rax, %rbx 51*0a6a1f1dSLionel Sambuc ; INCLO equivalent comes in in %rsi, so it makes sense it stays there. 52*0a6a1f1dSLionel Sambuc; CHECK: orq %rsi, %rbx 53*0a6a1f1dSLionel Sambuc; CHECK: movq %rdx, %rcx 54*0a6a1f1dSLionel Sambuc; CHECK: orq [[INCHI]], %rcx 55*0a6a1f1dSLionel Sambuc; CHECK: lock 56*0a6a1f1dSLionel Sambuc; CHECK: cmpxchg16b (%rdi) 57*0a6a1f1dSLionel Sambuc; CHECK: jne [[LOOP]] 58*0a6a1f1dSLionel Sambuc 59*0a6a1f1dSLionel Sambuc; CHECK: movq %rax, _var 60*0a6a1f1dSLionel Sambuc; CHECK: movq %rdx, _var+8 61*0a6a1f1dSLionel Sambuc 62*0a6a1f1dSLionel Sambuc %val = atomicrmw or i128* %p, i128 %bits seq_cst 63*0a6a1f1dSLionel Sambuc store i128 %val, i128* @var, align 16 64*0a6a1f1dSLionel Sambuc ret void 65*0a6a1f1dSLionel Sambuc} 66*0a6a1f1dSLionel Sambuc 67*0a6a1f1dSLionel Sambucdefine void @fetch_and_add(i128* %p, i128 %bits) { 68*0a6a1f1dSLionel Sambuc; CHECK-LABEL: fetch_and_add: 69*0a6a1f1dSLionel Sambuc; CHECK-DAG: movq %rdx, [[INCHI:%[a-z0-9]+]] 70*0a6a1f1dSLionel Sambuc; CHECK-DAG: movq (%rdi), %rax 71*0a6a1f1dSLionel Sambuc; CHECK-DAG: movq 8(%rdi), %rdx 72*0a6a1f1dSLionel Sambuc 73*0a6a1f1dSLionel Sambuc; CHECK: [[LOOP:.?LBB[0-9]+_[0-9]+]]: 74*0a6a1f1dSLionel Sambuc; CHECK: movq %rax, %rbx 75*0a6a1f1dSLionel Sambuc ; INCLO equivalent comes in in %rsi, so it makes sense it stays there. 76*0a6a1f1dSLionel Sambuc; CHECK: addq %rsi, %rbx 77*0a6a1f1dSLionel Sambuc; CHECK: movq %rdx, %rcx 78*0a6a1f1dSLionel Sambuc; CHECK: adcq [[INCHI]], %rcx 79*0a6a1f1dSLionel Sambuc; CHECK: lock 80*0a6a1f1dSLionel Sambuc; CHECK: cmpxchg16b (%rdi) 81*0a6a1f1dSLionel Sambuc; CHECK: jne [[LOOP]] 82*0a6a1f1dSLionel Sambuc 83*0a6a1f1dSLionel Sambuc; CHECK: movq %rax, _var 84*0a6a1f1dSLionel Sambuc; CHECK: movq %rdx, _var+8 85*0a6a1f1dSLionel Sambuc 86*0a6a1f1dSLionel Sambuc %val = atomicrmw add i128* %p, i128 %bits seq_cst 87*0a6a1f1dSLionel Sambuc store i128 %val, i128* @var, align 16 88*0a6a1f1dSLionel Sambuc ret void 89*0a6a1f1dSLionel Sambuc} 90*0a6a1f1dSLionel Sambuc 91*0a6a1f1dSLionel Sambucdefine void @fetch_and_sub(i128* %p, i128 %bits) { 92*0a6a1f1dSLionel Sambuc; CHECK-LABEL: fetch_and_sub: 93*0a6a1f1dSLionel Sambuc; CHECK-DAG: movq %rdx, [[INCHI:%[a-z0-9]+]] 94*0a6a1f1dSLionel Sambuc; CHECK-DAG: movq (%rdi), %rax 95*0a6a1f1dSLionel Sambuc; CHECK-DAG: movq 8(%rdi), %rdx 96*0a6a1f1dSLionel Sambuc 97*0a6a1f1dSLionel Sambuc; CHECK: [[LOOP:.?LBB[0-9]+_[0-9]+]]: 98*0a6a1f1dSLionel Sambuc; CHECK: movq %rax, %rbx 99*0a6a1f1dSLionel Sambuc ; INCLO equivalent comes in in %rsi, so it makes sense it stays there. 100*0a6a1f1dSLionel Sambuc; CHECK: subq %rsi, %rbx 101*0a6a1f1dSLionel Sambuc; CHECK: movq %rdx, %rcx 102*0a6a1f1dSLionel Sambuc; CHECK: sbbq [[INCHI]], %rcx 103*0a6a1f1dSLionel Sambuc; CHECK: lock 104*0a6a1f1dSLionel Sambuc; CHECK: cmpxchg16b (%rdi) 105*0a6a1f1dSLionel Sambuc; CHECK: jne [[LOOP]] 106*0a6a1f1dSLionel Sambuc 107*0a6a1f1dSLionel Sambuc; CHECK: movq %rax, _var 108*0a6a1f1dSLionel Sambuc; CHECK: movq %rdx, _var+8 109*0a6a1f1dSLionel Sambuc 110*0a6a1f1dSLionel Sambuc %val = atomicrmw sub i128* %p, i128 %bits seq_cst 111*0a6a1f1dSLionel Sambuc store i128 %val, i128* @var, align 16 112*0a6a1f1dSLionel Sambuc ret void 113*0a6a1f1dSLionel Sambuc} 114*0a6a1f1dSLionel Sambuc 115*0a6a1f1dSLionel Sambucdefine void @fetch_and_min(i128* %p, i128 %bits) { 116*0a6a1f1dSLionel Sambuc; CHECK-LABEL: fetch_and_min: 117*0a6a1f1dSLionel Sambuc; CHECK-DAG: movq %rdx, [[INCHI:%[a-z0-9]+]] 118*0a6a1f1dSLionel Sambuc; CHECK-DAG: movq (%rdi), %rax 119*0a6a1f1dSLionel Sambuc; CHECK-DAG: movq 8(%rdi), %rdx 120*0a6a1f1dSLionel Sambuc 121*0a6a1f1dSLionel Sambuc; CHECK: [[LOOP:.?LBB[0-9]+_[0-9]+]]: 122*0a6a1f1dSLionel Sambuc; CHECK: cmpq %rsi, %rax 123*0a6a1f1dSLionel Sambuc; CHECK: setbe [[CMP:%[a-z0-9]+]] 124*0a6a1f1dSLionel Sambuc; CHECK: cmpq [[INCHI]], %rdx 125*0a6a1f1dSLionel Sambuc; CHECK: setle [[HICMP:%[a-z0-9]+]] 126*0a6a1f1dSLionel Sambuc; CHECK: je [[USE_LO:.?LBB[0-9]+_[0-9]+]] 127*0a6a1f1dSLionel Sambuc 128*0a6a1f1dSLionel Sambuc; CHECK: movb [[HICMP]], [[CMP]] 129*0a6a1f1dSLionel Sambuc; CHECK: [[USE_LO]]: 130*0a6a1f1dSLionel Sambuc; CHECK: testb [[CMP]], [[CMP]] 131*0a6a1f1dSLionel Sambuc; CHECK: movq %rsi, %rbx 132*0a6a1f1dSLionel Sambuc; CHECK: cmovneq %rax, %rbx 133*0a6a1f1dSLionel Sambuc; CHECK: movq [[INCHI]], %rcx 134*0a6a1f1dSLionel Sambuc; CHECK: cmovneq %rdx, %rcx 135*0a6a1f1dSLionel Sambuc; CHECK: lock 136*0a6a1f1dSLionel Sambuc; CHECK: cmpxchg16b (%rdi) 137*0a6a1f1dSLionel Sambuc; CHECK: jne [[LOOP]] 138*0a6a1f1dSLionel Sambuc 139*0a6a1f1dSLionel Sambuc; CHECK: movq %rax, _var 140*0a6a1f1dSLionel Sambuc; CHECK: movq %rdx, _var+8 141*0a6a1f1dSLionel Sambuc 142*0a6a1f1dSLionel Sambuc %val = atomicrmw min i128* %p, i128 %bits seq_cst 143*0a6a1f1dSLionel Sambuc store i128 %val, i128* @var, align 16 144*0a6a1f1dSLionel Sambuc ret void 145*0a6a1f1dSLionel Sambuc} 146*0a6a1f1dSLionel Sambuc 147*0a6a1f1dSLionel Sambucdefine void @fetch_and_max(i128* %p, i128 %bits) { 148*0a6a1f1dSLionel Sambuc; CHECK-LABEL: fetch_and_max: 149*0a6a1f1dSLionel Sambuc; CHECK-DAG: movq %rdx, [[INCHI:%[a-z0-9]+]] 150*0a6a1f1dSLionel Sambuc; CHECK-DAG: movq (%rdi), %rax 151*0a6a1f1dSLionel Sambuc; CHECK-DAG: movq 8(%rdi), %rdx 152*0a6a1f1dSLionel Sambuc 153*0a6a1f1dSLionel Sambuc; CHECK: [[LOOP:.?LBB[0-9]+_[0-9]+]]: 154*0a6a1f1dSLionel Sambuc; CHECK: cmpq %rsi, %rax 155*0a6a1f1dSLionel Sambuc; CHECK: setae [[CMP:%[a-z0-9]+]] 156*0a6a1f1dSLionel Sambuc; CHECK: cmpq [[INCHI]], %rdx 157*0a6a1f1dSLionel Sambuc; CHECK: setge [[HICMP:%[a-z0-9]+]] 158*0a6a1f1dSLionel Sambuc; CHECK: je [[USE_LO:.?LBB[0-9]+_[0-9]+]] 159*0a6a1f1dSLionel Sambuc 160*0a6a1f1dSLionel Sambuc; CHECK: movb [[HICMP]], [[CMP]] 161*0a6a1f1dSLionel Sambuc; CHECK: [[USE_LO]]: 162*0a6a1f1dSLionel Sambuc; CHECK: testb [[CMP]], [[CMP]] 163*0a6a1f1dSLionel Sambuc; CHECK: movq %rsi, %rbx 164*0a6a1f1dSLionel Sambuc; CHECK: cmovneq %rax, %rbx 165*0a6a1f1dSLionel Sambuc; CHECK: movq [[INCHI]], %rcx 166*0a6a1f1dSLionel Sambuc; CHECK: cmovneq %rdx, %rcx 167*0a6a1f1dSLionel Sambuc; CHECK: lock 168*0a6a1f1dSLionel Sambuc; CHECK: cmpxchg16b (%rdi) 169*0a6a1f1dSLionel Sambuc; CHECK: jne [[LOOP]] 170*0a6a1f1dSLionel Sambuc 171*0a6a1f1dSLionel Sambuc; CHECK: movq %rax, _var 172*0a6a1f1dSLionel Sambuc; CHECK: movq %rdx, _var+8 173*0a6a1f1dSLionel Sambuc 174*0a6a1f1dSLionel Sambuc %val = atomicrmw max i128* %p, i128 %bits seq_cst 175*0a6a1f1dSLionel Sambuc store i128 %val, i128* @var, align 16 176*0a6a1f1dSLionel Sambuc ret void 177*0a6a1f1dSLionel Sambuc} 178*0a6a1f1dSLionel Sambuc 179*0a6a1f1dSLionel Sambucdefine void @fetch_and_umin(i128* %p, i128 %bits) { 180*0a6a1f1dSLionel Sambuc; CHECK-LABEL: fetch_and_umin: 181*0a6a1f1dSLionel Sambuc; CHECK-DAG: movq %rdx, [[INCHI:%[a-z0-9]+]] 182*0a6a1f1dSLionel Sambuc; CHECK-DAG: movq (%rdi), %rax 183*0a6a1f1dSLionel Sambuc; CHECK-DAG: movq 8(%rdi), %rdx 184*0a6a1f1dSLionel Sambuc 185*0a6a1f1dSLionel Sambuc; CHECK: [[LOOP:.?LBB[0-9]+_[0-9]+]]: 186*0a6a1f1dSLionel Sambuc; CHECK: cmpq %rsi, %rax 187*0a6a1f1dSLionel Sambuc; CHECK: setbe [[CMP:%[a-z0-9]+]] 188*0a6a1f1dSLionel Sambuc; CHECK: cmpq [[INCHI]], %rdx 189*0a6a1f1dSLionel Sambuc; CHECK: setbe [[HICMP:%[a-z0-9]+]] 190*0a6a1f1dSLionel Sambuc; CHECK: je [[USE_LO:.?LBB[0-9]+_[0-9]+]] 191*0a6a1f1dSLionel Sambuc 192*0a6a1f1dSLionel Sambuc; CHECK: movb [[HICMP]], [[CMP]] 193*0a6a1f1dSLionel Sambuc; CHECK: [[USE_LO]]: 194*0a6a1f1dSLionel Sambuc; CHECK: testb [[CMP]], [[CMP]] 195*0a6a1f1dSLionel Sambuc; CHECK: movq %rsi, %rbx 196*0a6a1f1dSLionel Sambuc; CHECK: cmovneq %rax, %rbx 197*0a6a1f1dSLionel Sambuc; CHECK: movq [[INCHI]], %rcx 198*0a6a1f1dSLionel Sambuc; CHECK: cmovneq %rdx, %rcx 199*0a6a1f1dSLionel Sambuc; CHECK: lock 200*0a6a1f1dSLionel Sambuc; CHECK: cmpxchg16b (%rdi) 201*0a6a1f1dSLionel Sambuc; CHECK: jne [[LOOP]] 202*0a6a1f1dSLionel Sambuc 203*0a6a1f1dSLionel Sambuc; CHECK: movq %rax, _var 204*0a6a1f1dSLionel Sambuc; CHECK: movq %rdx, _var+8 205*0a6a1f1dSLionel Sambuc 206*0a6a1f1dSLionel Sambuc %val = atomicrmw umin i128* %p, i128 %bits seq_cst 207*0a6a1f1dSLionel Sambuc store i128 %val, i128* @var, align 16 208*0a6a1f1dSLionel Sambuc ret void 209*0a6a1f1dSLionel Sambuc} 210*0a6a1f1dSLionel Sambuc 211*0a6a1f1dSLionel Sambucdefine void @fetch_and_umax(i128* %p, i128 %bits) { 212*0a6a1f1dSLionel Sambuc; CHECK-LABEL: fetch_and_umax: 213*0a6a1f1dSLionel Sambuc; CHECK-DAG: movq %rdx, [[INCHI:%[a-z0-9]+]] 214*0a6a1f1dSLionel Sambuc; CHECK-DAG: movq (%rdi), %rax 215*0a6a1f1dSLionel Sambuc; CHECK-DAG: movq 8(%rdi), %rdx 216*0a6a1f1dSLionel Sambuc 217*0a6a1f1dSLionel Sambuc; CHECK: [[LOOP:.?LBB[0-9]+_[0-9]+]]: 218*0a6a1f1dSLionel Sambuc; CHECK: cmpq %rax, %rsi 219*0a6a1f1dSLionel Sambuc; CHECK: setb [[CMP:%[a-z0-9]+]] 220*0a6a1f1dSLionel Sambuc; CHECK: cmpq [[INCHI]], %rdx 221*0a6a1f1dSLionel Sambuc; CHECK: seta [[HICMP:%[a-z0-9]+]] 222*0a6a1f1dSLionel Sambuc; CHECK: je [[USE_LO:.?LBB[0-9]+_[0-9]+]] 223*0a6a1f1dSLionel Sambuc 224*0a6a1f1dSLionel Sambuc; CHECK: movb [[HICMP]], [[CMP]] 225*0a6a1f1dSLionel Sambuc; CHECK: [[USE_LO]]: 226*0a6a1f1dSLionel Sambuc; CHECK: testb [[CMP]], [[CMP]] 227*0a6a1f1dSLionel Sambuc; CHECK: movq %rsi, %rbx 228*0a6a1f1dSLionel Sambuc; CHECK: cmovneq %rax, %rbx 229*0a6a1f1dSLionel Sambuc; CHECK: movq [[INCHI]], %rcx 230*0a6a1f1dSLionel Sambuc; CHECK: cmovneq %rdx, %rcx 231*0a6a1f1dSLionel Sambuc; CHECK: lock 232*0a6a1f1dSLionel Sambuc; CHECK: cmpxchg16b (%rdi) 233*0a6a1f1dSLionel Sambuc; CHECK: jne [[LOOP]] 234*0a6a1f1dSLionel Sambuc 235*0a6a1f1dSLionel Sambuc; CHECK: movq %rax, _var 236*0a6a1f1dSLionel Sambuc; CHECK: movq %rdx, _var+8 237*0a6a1f1dSLionel Sambuc 238*0a6a1f1dSLionel Sambuc %val = atomicrmw umax i128* %p, i128 %bits seq_cst 239*0a6a1f1dSLionel Sambuc store i128 %val, i128* @var, align 16 240*0a6a1f1dSLionel Sambuc ret void 241*0a6a1f1dSLionel Sambuc} 242*0a6a1f1dSLionel Sambuc 243*0a6a1f1dSLionel Sambucdefine i128 @atomic_load_seq_cst(i128* %p) { 244*0a6a1f1dSLionel Sambuc; CHECK-LABEL: atomic_load_seq_cst: 245*0a6a1f1dSLionel Sambuc; CHECK: xorl %eax, %eax 246*0a6a1f1dSLionel Sambuc; CHECK: xorl %edx, %edx 247*0a6a1f1dSLionel Sambuc; CHECK: xorl %ebx, %ebx 248*0a6a1f1dSLionel Sambuc; CHECK: xorl %ecx, %ecx 249*0a6a1f1dSLionel Sambuc; CHECK: lock 250*0a6a1f1dSLionel Sambuc; CHECK: cmpxchg16b (%rdi) 251*0a6a1f1dSLionel Sambuc 252*0a6a1f1dSLionel Sambuc %r = load atomic i128* %p seq_cst, align 16 253*0a6a1f1dSLionel Sambuc ret i128 %r 254*0a6a1f1dSLionel Sambuc} 255*0a6a1f1dSLionel Sambuc 256*0a6a1f1dSLionel Sambucdefine i128 @atomic_load_relaxed(i128* %p) { 257*0a6a1f1dSLionel Sambuc; CHECK: atomic_load_relaxed: 258*0a6a1f1dSLionel Sambuc; CHECK: xorl %eax, %eax 259*0a6a1f1dSLionel Sambuc; CHECK: xorl %edx, %edx 260*0a6a1f1dSLionel Sambuc; CHECK: xorl %ebx, %ebx 261*0a6a1f1dSLionel Sambuc; CHECK: xorl %ecx, %ecx 262*0a6a1f1dSLionel Sambuc; CHECK: lock 263*0a6a1f1dSLionel Sambuc; CHECK: cmpxchg16b (%rdi) 264*0a6a1f1dSLionel Sambuc 265*0a6a1f1dSLionel Sambuc %r = load atomic i128* %p monotonic, align 16 266*0a6a1f1dSLionel Sambuc ret i128 %r 267*0a6a1f1dSLionel Sambuc} 268*0a6a1f1dSLionel Sambuc 269*0a6a1f1dSLionel Sambucdefine void @atomic_store_seq_cst(i128* %p, i128 %in) { 270*0a6a1f1dSLionel Sambuc; CHECK-LABEL: atomic_store_seq_cst: 271*0a6a1f1dSLionel Sambuc; CHECK: movq %rdx, %rcx 272*0a6a1f1dSLionel Sambuc; CHECK: movq %rsi, %rbx 273*0a6a1f1dSLionel Sambuc; CHECK: movq (%rdi), %rax 274*0a6a1f1dSLionel Sambuc; CHECK: movq 8(%rdi), %rdx 275*0a6a1f1dSLionel Sambuc 276*0a6a1f1dSLionel Sambuc; CHECK: [[LOOP:.?LBB[0-9]+_[0-9]+]]: 277*0a6a1f1dSLionel Sambuc; CHECK: lock 278*0a6a1f1dSLionel Sambuc; CHECK: cmpxchg16b (%rdi) 279*0a6a1f1dSLionel Sambuc; CHECK: jne [[LOOP]] 280*0a6a1f1dSLionel Sambuc; CHECK-NOT: callq ___sync_lock_test_and_set_16 281*0a6a1f1dSLionel Sambuc 282*0a6a1f1dSLionel Sambuc store atomic i128 %in, i128* %p seq_cst, align 16 283*0a6a1f1dSLionel Sambuc ret void 284*0a6a1f1dSLionel Sambuc} 285*0a6a1f1dSLionel Sambuc 286*0a6a1f1dSLionel Sambucdefine void @atomic_store_release(i128* %p, i128 %in) { 287*0a6a1f1dSLionel Sambuc; CHECK-LABEL: atomic_store_release: 288*0a6a1f1dSLionel Sambuc; CHECK: movq %rdx, %rcx 289*0a6a1f1dSLionel Sambuc; CHECK: movq %rsi, %rbx 290*0a6a1f1dSLionel Sambuc; CHECK: movq (%rdi), %rax 291*0a6a1f1dSLionel Sambuc; CHECK: movq 8(%rdi), %rdx 292*0a6a1f1dSLionel Sambuc 293*0a6a1f1dSLionel Sambuc; CHECK: [[LOOP:.?LBB[0-9]+_[0-9]+]]: 294*0a6a1f1dSLionel Sambuc; CHECK: lock 295*0a6a1f1dSLionel Sambuc; CHECK: cmpxchg16b (%rdi) 296*0a6a1f1dSLionel Sambuc; CHECK: jne [[LOOP]] 297*0a6a1f1dSLionel Sambuc 298*0a6a1f1dSLionel Sambuc store atomic i128 %in, i128* %p release, align 16 299*0a6a1f1dSLionel Sambuc ret void 300*0a6a1f1dSLionel Sambuc} 301*0a6a1f1dSLionel Sambuc 302*0a6a1f1dSLionel Sambucdefine void @atomic_store_relaxed(i128* %p, i128 %in) { 303*0a6a1f1dSLionel Sambuc; CHECK-LABEL: atomic_store_relaxed: 304*0a6a1f1dSLionel Sambuc; CHECK: movq %rdx, %rcx 305*0a6a1f1dSLionel Sambuc; CHECK: movq %rsi, %rbx 306*0a6a1f1dSLionel Sambuc; CHECK: movq (%rdi), %rax 307*0a6a1f1dSLionel Sambuc; CHECK: movq 8(%rdi), %rdx 308*0a6a1f1dSLionel Sambuc 309*0a6a1f1dSLionel Sambuc; CHECK: [[LOOP:.?LBB[0-9]+_[0-9]+]]: 310*0a6a1f1dSLionel Sambuc; CHECK: lock 311*0a6a1f1dSLionel Sambuc; CHECK: cmpxchg16b (%rdi) 312*0a6a1f1dSLionel Sambuc; CHECK: jne [[LOOP]] 313*0a6a1f1dSLionel Sambuc 314*0a6a1f1dSLionel Sambuc store atomic i128 %in, i128* %p unordered, align 16 315*0a6a1f1dSLionel Sambuc ret void 316*0a6a1f1dSLionel Sambuc} 317