mirror of https://github.com/microsoft/clang.git
Support __iso_volatile_load8 etc on aarch64-win32.
These intrinsics are used by MSVC's header files on AArch64 Windows as well as AArch32, so we should support them for both targets. I've factored them out of CodeGenFunction::EmitARMBuiltinExpr into separate functions that EmitAArch64BuiltinExpr can call as well. Reviewers: javed.absar, mstorsjo Reviewed By: mstorsjo Subscribers: kristof.beyls, cfe-commits Differential Revision: https://reviews.llvm.org/D47476 git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@333513 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
cb6be1e264
commit
206c89ddd5
|
@ -69,5 +69,15 @@ LANGBUILTIN(__dmb, "vUi", "nc", ALL_MS_LANGUAGES)
|
|||
LANGBUILTIN(__dsb, "vUi", "nc", ALL_MS_LANGUAGES)
|
||||
LANGBUILTIN(__isb, "vUi", "nc", ALL_MS_LANGUAGES)
|
||||
|
||||
// MSVC intrinsics for volatile but non-acquire/release loads and stores
|
||||
LANGBUILTIN(__iso_volatile_load8, "ccCD*", "n", ALL_MS_LANGUAGES)
|
||||
LANGBUILTIN(__iso_volatile_load16, "ssCD*", "n", ALL_MS_LANGUAGES)
|
||||
LANGBUILTIN(__iso_volatile_load32, "iiCD*", "n", ALL_MS_LANGUAGES)
|
||||
LANGBUILTIN(__iso_volatile_load64, "LLiLLiCD*", "n", ALL_MS_LANGUAGES)
|
||||
LANGBUILTIN(__iso_volatile_store8, "vcD*c", "n", ALL_MS_LANGUAGES)
|
||||
LANGBUILTIN(__iso_volatile_store16, "vsD*s", "n", ALL_MS_LANGUAGES)
|
||||
LANGBUILTIN(__iso_volatile_store32, "viD*i", "n", ALL_MS_LANGUAGES)
|
||||
LANGBUILTIN(__iso_volatile_store64, "vLLiD*LLi", "n", ALL_MS_LANGUAGES)
|
||||
|
||||
#undef BUILTIN
|
||||
#undef LANGBUILTIN
|
||||
|
|
|
@ -5179,6 +5179,34 @@ static bool HasExtraNeonArgument(unsigned BuiltinID) {
|
|||
return true;
|
||||
}
|
||||
|
||||
Value *CodeGenFunction::EmitISOVolatileLoad(const CallExpr *E) {
|
||||
Value *Ptr = EmitScalarExpr(E->getArg(0));
|
||||
QualType ElTy = E->getArg(0)->getType()->getPointeeType();
|
||||
CharUnits LoadSize = getContext().getTypeSizeInChars(ElTy);
|
||||
llvm::Type *ITy = llvm::IntegerType::get(getLLVMContext(),
|
||||
LoadSize.getQuantity() * 8);
|
||||
Ptr = Builder.CreateBitCast(Ptr, ITy->getPointerTo());
|
||||
llvm::LoadInst *Load =
|
||||
Builder.CreateAlignedLoad(Ptr, LoadSize);
|
||||
Load->setVolatile(true);
|
||||
return Load;
|
||||
}
|
||||
|
||||
Value *CodeGenFunction::EmitISOVolatileStore(const CallExpr *E) {
|
||||
Value *Ptr = EmitScalarExpr(E->getArg(0));
|
||||
Value *Value = EmitScalarExpr(E->getArg(1));
|
||||
QualType ElTy = E->getArg(0)->getType()->getPointeeType();
|
||||
CharUnits StoreSize = getContext().getTypeSizeInChars(ElTy);
|
||||
llvm::Type *ITy = llvm::IntegerType::get(getLLVMContext(),
|
||||
StoreSize.getQuantity() * 8);
|
||||
Ptr = Builder.CreateBitCast(Ptr, ITy->getPointerTo());
|
||||
llvm::StoreInst *Store =
|
||||
Builder.CreateAlignedStore(Value, Ptr,
|
||||
StoreSize);
|
||||
Store->setVolatile(true);
|
||||
return Store;
|
||||
}
|
||||
|
||||
Value *CodeGenFunction::EmitARMBuiltinExpr(unsigned BuiltinID,
|
||||
const CallExpr *E,
|
||||
llvm::Triple::ArchType Arch) {
|
||||
|
@ -5421,35 +5449,13 @@ Value *CodeGenFunction::EmitARMBuiltinExpr(unsigned BuiltinID,
|
|||
case ARM::BI__iso_volatile_load8:
|
||||
case ARM::BI__iso_volatile_load16:
|
||||
case ARM::BI__iso_volatile_load32:
|
||||
case ARM::BI__iso_volatile_load64: {
|
||||
Value *Ptr = EmitScalarExpr(E->getArg(0));
|
||||
QualType ElTy = E->getArg(0)->getType()->getPointeeType();
|
||||
CharUnits LoadSize = getContext().getTypeSizeInChars(ElTy);
|
||||
llvm::Type *ITy = llvm::IntegerType::get(getLLVMContext(),
|
||||
LoadSize.getQuantity() * 8);
|
||||
Ptr = Builder.CreateBitCast(Ptr, ITy->getPointerTo());
|
||||
llvm::LoadInst *Load =
|
||||
Builder.CreateAlignedLoad(Ptr, LoadSize);
|
||||
Load->setVolatile(true);
|
||||
return Load;
|
||||
}
|
||||
case ARM::BI__iso_volatile_load64:
|
||||
return EmitISOVolatileLoad(E);
|
||||
case ARM::BI__iso_volatile_store8:
|
||||
case ARM::BI__iso_volatile_store16:
|
||||
case ARM::BI__iso_volatile_store32:
|
||||
case ARM::BI__iso_volatile_store64: {
|
||||
Value *Ptr = EmitScalarExpr(E->getArg(0));
|
||||
Value *Value = EmitScalarExpr(E->getArg(1));
|
||||
QualType ElTy = E->getArg(0)->getType()->getPointeeType();
|
||||
CharUnits StoreSize = getContext().getTypeSizeInChars(ElTy);
|
||||
llvm::Type *ITy = llvm::IntegerType::get(getLLVMContext(),
|
||||
StoreSize.getQuantity() * 8);
|
||||
Ptr = Builder.CreateBitCast(Ptr, ITy->getPointerTo());
|
||||
llvm::StoreInst *Store =
|
||||
Builder.CreateAlignedStore(Value, Ptr,
|
||||
StoreSize);
|
||||
Store->setVolatile(true);
|
||||
return Store;
|
||||
}
|
||||
case ARM::BI__iso_volatile_store64:
|
||||
return EmitISOVolatileStore(E);
|
||||
}
|
||||
|
||||
if (BuiltinID == ARM::BI__builtin_arm_clrex) {
|
||||
|
@ -8199,6 +8205,16 @@ Value *CodeGenFunction::EmitAArch64BuiltinExpr(unsigned BuiltinID,
|
|||
Int = Intrinsic::aarch64_neon_suqadd;
|
||||
return EmitNeonCall(CGM.getIntrinsic(Int, Ty), Ops, "vuqadd");
|
||||
}
|
||||
case AArch64::BI__iso_volatile_load8:
|
||||
case AArch64::BI__iso_volatile_load16:
|
||||
case AArch64::BI__iso_volatile_load32:
|
||||
case AArch64::BI__iso_volatile_load64:
|
||||
return EmitISOVolatileLoad(E);
|
||||
case AArch64::BI__iso_volatile_store8:
|
||||
case AArch64::BI__iso_volatile_store16:
|
||||
case AArch64::BI__iso_volatile_store32:
|
||||
case AArch64::BI__iso_volatile_store64:
|
||||
return EmitISOVolatileStore(E);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -3541,6 +3541,10 @@ public:
|
|||
SmallVectorImpl<llvm::Value *> &Ops,
|
||||
Address PtrOp0, Address PtrOp1,
|
||||
llvm::Triple::ArchType Arch);
|
||||
|
||||
llvm::Value *EmitISOVolatileLoad(const CallExpr *E);
|
||||
llvm::Value *EmitISOVolatileStore(const CallExpr *E);
|
||||
|
||||
llvm::Function *LookupNeonLLVMIntrinsic(unsigned IntrinsicID,
|
||||
unsigned Modifier, llvm::Type *ArgTy,
|
||||
const CallExpr *E);
|
||||
|
|
|
@ -0,0 +1,13 @@
|
|||
// REQUIRES: aarch64-registered-target
|
||||
// RUN: %clang_cc1 -triple aarch64-win32 -emit-llvm -fms-extensions -fms-volatile -o - < %s | FileCheck %s
|
||||
|
||||
void test1(int volatile *p, int v) {
|
||||
__iso_volatile_store32(p, v);
|
||||
// CHECK-LABEL: @test1
|
||||
// CHECK: store volatile {{.*}}, {{.*}}
|
||||
}
|
||||
int test2(const int volatile *p) {
|
||||
return __iso_volatile_load32(p);
|
||||
// CHECK-LABEL: @test2
|
||||
// CHECK: load volatile {{.*}}
|
||||
}
|
Loading…
Reference in New Issue