Add support for ARM ldrexd/strexd builtins
llvm-svn: 132249
This commit is contained in:
parent
325110f30d
commit
fe73374d7a
|
@ -24,6 +24,10 @@ BUILTIN(__builtin_arm_qsub, "iii", "nc")
|
||||||
BUILTIN(__builtin_arm_ssat, "iiUi", "nc")
|
BUILTIN(__builtin_arm_ssat, "iiUi", "nc")
|
||||||
BUILTIN(__builtin_arm_usat, "UiUiUi", "nc")
|
BUILTIN(__builtin_arm_usat, "UiUiUi", "nc")
|
||||||
|
|
||||||
|
// Store and load exclusive doubleword
|
||||||
|
BUILTIN(__builtin_arm_ldrexd, "LLUiv*", "")
|
||||||
|
BUILTIN(__builtin_arm_strexd, "iLLUiv*", "")
|
||||||
|
|
||||||
// VFP
|
// VFP
|
||||||
BUILTIN(__builtin_arm_get_fpscr, "Ui", "nc")
|
BUILTIN(__builtin_arm_get_fpscr, "Ui", "nc")
|
||||||
BUILTIN(__builtin_arm_set_fpscr, "vUi", "nc")
|
BUILTIN(__builtin_arm_set_fpscr, "vUi", "nc")
|
||||||
|
|
|
@ -1186,6 +1186,41 @@ Value *CodeGenFunction::EmitARMBuiltinExpr(unsigned BuiltinID,
|
||||||
Ops.begin(), Ops.end());
|
Ops.begin(), Ops.end());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (BuiltinID == ARM::BI__builtin_arm_ldrexd) {
|
||||||
|
Function *F = CGM.getIntrinsic(Intrinsic::arm_ldrexd);
|
||||||
|
|
||||||
|
Value *LdPtr = EmitScalarExpr(E->getArg(0));
|
||||||
|
Value *Val = Builder.CreateCall(F, LdPtr, "ldrexd");
|
||||||
|
|
||||||
|
Value *Val0 = Builder.CreateExtractValue(Val, 1);
|
||||||
|
Value *Val1 = Builder.CreateExtractValue(Val, 0);
|
||||||
|
Val0 = Builder.CreateZExt(Val0, Int64Ty);
|
||||||
|
Val1 = Builder.CreateZExt(Val1, Int64Ty);
|
||||||
|
|
||||||
|
Value *ShiftCst = llvm::ConstantInt::get(Int64Ty, 32);
|
||||||
|
Val = Builder.CreateShl(Val0, ShiftCst, "shl", true /* nuw */);
|
||||||
|
return Builder.CreateOr(Val, Val1);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (BuiltinID == ARM::BI__builtin_arm_strexd) {
|
||||||
|
Function *F = CGM.getIntrinsic(Intrinsic::arm_strexd);
|
||||||
|
llvm::Type *STy = llvm::StructType::get(getLLVMContext(), Int32Ty, Int32Ty,
|
||||||
|
NULL);
|
||||||
|
|
||||||
|
Value *One = llvm::ConstantInt::get(Int32Ty, 1);
|
||||||
|
Value *Tmp = Builder.CreateAlloca(Int64Ty, One, "tmp");
|
||||||
|
Value *Val = EmitScalarExpr(E->getArg(0));
|
||||||
|
Builder.CreateStore(Val, Tmp);
|
||||||
|
|
||||||
|
Value *LdPtr = Builder.CreateBitCast(Tmp,llvm::PointerType::getUnqual(STy));
|
||||||
|
Val = Builder.CreateLoad(LdPtr);
|
||||||
|
|
||||||
|
Value *Arg0 = Builder.CreateExtractValue(Val, 0);
|
||||||
|
Value *Arg1 = Builder.CreateExtractValue(Val, 1);
|
||||||
|
Value *StPtr = EmitScalarExpr(E->getArg(1));
|
||||||
|
return Builder.CreateCall3(F, Arg0, Arg1, StPtr, "strexd");
|
||||||
|
}
|
||||||
|
|
||||||
llvm::SmallVector<Value*, 4> Ops;
|
llvm::SmallVector<Value*, 4> Ops;
|
||||||
for (unsigned i = 0, e = E->getNumArgs() - 1; i != e; i++)
|
for (unsigned i = 0, e = E->getNumArgs() - 1; i != e; i++)
|
||||||
Ops.push_back(EmitScalarExpr(E->getArg(i)));
|
Ops.push_back(EmitScalarExpr(E->getArg(i)));
|
||||||
|
|
Loading…
Reference in New Issue