Skip to content

Commit e220398

Browse files
authored
[MSVC, ARM64] Add __prefetch intrinsic (#67174)
Implement __prefetch intrinsic. MSVC docs: https://learn.microsoft.com/en-us/cpp/intrinsics/arm64-intrinsics?view=msvc-170 Bug: #65405
1 parent eb4a061 commit e220398

File tree

4 files changed

+23
-0
lines changed

4 files changed

+23
-0
lines changed

clang/include/clang/Basic/BuiltinsAArch64.def

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -283,6 +283,8 @@ TARGET_HEADER_BUILTIN(_CountLeadingZeros64, "UiULLi", "nh", INTRIN_H, ALL_MS_LAN
283283
TARGET_HEADER_BUILTIN(_CountOneBits, "UiUNi", "nh", INTRIN_H, ALL_MS_LANGUAGES, "")
284284
TARGET_HEADER_BUILTIN(_CountOneBits64, "UiULLi", "nh", INTRIN_H, ALL_MS_LANGUAGES, "")
285285

286+
TARGET_HEADER_BUILTIN(__prefetch, "vv*", "nh", INTRIN_H, ALL_MS_LANGUAGES, "")
287+
286288
#undef BUILTIN
287289
#undef LANGBUILTIN
288290
#undef TARGET_BUILTIN

clang/lib/CodeGen/CGBuiltin.cpp

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10842,6 +10842,15 @@ Value *CodeGenFunction::EmitAArch64BuiltinExpr(unsigned BuiltinID,
1084210842
return Result;
1084310843
}
1084410844

10845+
if (BuiltinID == AArch64::BI__prefetch) {
10846+
Value *Address = EmitScalarExpr(E->getArg(0));
10847+
Value *RW = llvm::ConstantInt::get(Int32Ty, 0);
10848+
Value *Locality = ConstantInt::get(Int32Ty, 3);
10849+
Value *Data = llvm::ConstantInt::get(Int32Ty, 1);
10850+
Function *F = CGM.getIntrinsic(Intrinsic::prefetch, Address->getType());
10851+
return Builder.CreateCall(F, {Address, RW, Locality, Data});
10852+
}
10853+
1084510854
// Handle MSVC intrinsics before argument evaluation to prevent double
1084610855
// evaluation.
1084710856
if (std::optional<MSVCIntrin> MsvcIntId =

clang/lib/Headers/intrin.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -586,6 +586,8 @@ unsigned int _CountLeadingZeros(unsigned long);
586586
unsigned int _CountLeadingZeros64(unsigned _int64);
587587
unsigned int _CountOneBits(unsigned long);
588588
unsigned int _CountOneBits64(unsigned __int64);
589+
590+
void __cdecl __prefetch(void *);
589591
#endif
590592

591593
/*----------------------------------------------------------------------------*\

clang/test/CodeGen/arm64-microsoft-intrinsics.c

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -402,6 +402,16 @@ unsigned int check_CountOneBits64(unsigned __int64 arg1) {
402402
// CHECK-MSCOMPAT: ret i32 %[[VAR2]]
403403
// CHECK-LINUX: error: call to undeclared function '_CountOneBits64'
404404

405+
void check__prefetch(void *arg1) {
406+
return __prefetch(arg1);
407+
}
408+
409+
// CHECK-MSCOMPAT: %[[ARG1:.*]].addr = alloca ptr, align 8
410+
// CHECK-MSCOMPAT: store ptr %[[ARG1]], ptr %[[ARG1]].addr, align 8
411+
// CHECK-MSCOMPAT: %[[VAR0:.*]] = load ptr, ptr %[[ARG1]].addr, align 8
412+
// CHECK-MSCOMPAT: call void @llvm.prefetch.p0(ptr %[[VAR0]], i32 0, i32 3, i32 1)
413+
// CHECK-MSCOMPAT: ret void
414+
405415

406416
// CHECK-MSCOMPAT: ![[MD2]] = !{!"x18"}
407417
// CHECK-MSCOMPAT: ![[MD3]] = !{!"sp"}

0 commit comments

Comments
 (0)