implement __sync_synchronize and __sync_lock_release,
rdar://6880573 llvm-svn: 71637
This commit is contained in:
parent
94578cba76
commit
afde259240
|
@ -470,11 +470,23 @@ RValue CodeGenFunction::EmitBuiltinExpr(const FunctionDecl *FD,
|
|||
case Builtin::BI__sync_lock_release_2:
|
||||
case Builtin::BI__sync_lock_release_4:
|
||||
case Builtin::BI__sync_lock_release_8:
|
||||
case Builtin::BI__sync_lock_release_16:
|
||||
assert(0 && "FIXME: Implement");
|
||||
case Builtin::BI__sync_lock_release_16: {
|
||||
Value *Ptr = EmitScalarExpr(E->getArg(0));
|
||||
const llvm::Type *ElTy =
|
||||
cast<llvm::PointerType>(Ptr->getType())->getElementType();
|
||||
Builder.CreateStore(llvm::Constant::getNullValue(ElTy), Ptr, true);
|
||||
return RValue();
|
||||
}
|
||||
|
||||
case Builtin::BI__sync_synchronize: {
|
||||
Value *C[5];
|
||||
C[0] = C[1] = C[2] = C[3] = llvm::ConstantInt::get(llvm::Type::Int1Ty, 1);
|
||||
C[4] = ConstantInt::get(llvm::Type::Int1Ty, 0);
|
||||
Builder.CreateCall(CGM.getIntrinsic(Intrinsic::memory_barrier), C, C + 5);
|
||||
return RValue();
|
||||
}
|
||||
|
||||
// Library functions with special handling.
|
||||
|
||||
case Builtin::BIsqrt:
|
||||
case Builtin::BIsqrtf:
|
||||
case Builtin::BIsqrtl: {
|
||||
|
|
|
@ -33,15 +33,21 @@ int atomic(void)
|
|||
old = __sync_fetch_and_and(&val, 0x9);
|
||||
old = __sync_fetch_and_or(&val, 0xa);
|
||||
old = __sync_fetch_and_xor(&val, 0xb);
|
||||
old = __sync_fetch_and_nand(&val, 0xb);
|
||||
|
||||
old = __sync_add_and_fetch(&val, 1);
|
||||
old = __sync_sub_and_fetch(&val, 2);
|
||||
old = __sync_and_and_fetch(&valc, 3);
|
||||
old = __sync_or_and_fetch(&valc, 4);
|
||||
old = __sync_xor_and_fetch(&valc, 5);
|
||||
old = __sync_nand_and_fetch(&valc, 5);
|
||||
|
||||
|
||||
__sync_val_compare_and_swap((void **)0, (void *)0, (void *)0);
|
||||
|
||||
|
||||
__sync_lock_release(&val);
|
||||
__sync_synchronize ();
|
||||
|
||||
return old;
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue