Skip to content

Commit df79296

Browse files
author
Mandeep Singh Grang
committed
[COFF, ARM64] Add _InterlockedAdd intrinsic
Reviewers: rnk, mstorsjo, compnerd, TomTan, haripul, javed.absar, efriedma Reviewed By: efriedma Subscribers: efriedma, kristof.beyls, chrib, jfb, cfe-commits Differential Revision: https://reviews.llvm.org/D52811 llvm-svn: 343894
1 parent 0fea2f5 commit df79296

File tree

4 files changed

+21
-0
lines changed

4 files changed

+21
-0
lines changed

clang/include/clang/Basic/BuiltinsAArch64.def

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -94,6 +94,7 @@ TARGET_HEADER_BUILTIN(_BitScanReverse, "UcUNi*UNi", "nh", "intrin.h", ALL_MS_LAN
9494
TARGET_HEADER_BUILTIN(_BitScanForward64, "UcUNi*ULLi", "nh", "intrin.h", ALL_MS_LANGUAGES, "")
9595
TARGET_HEADER_BUILTIN(_BitScanReverse64, "UcUNi*ULLi", "nh", "intrin.h", ALL_MS_LANGUAGES, "")
9696

97+
TARGET_HEADER_BUILTIN(_InterlockedAdd, "LiLiD*Li", "nh", "intrin.h", ALL_MS_LANGUAGES, "")
9798
TARGET_HEADER_BUILTIN(_InterlockedAnd64, "LLiLLiD*LLi", "nh", "intrin.h", ALL_MS_LANGUAGES, "")
9899
TARGET_HEADER_BUILTIN(_InterlockedDecrement64, "LLiLLiD*", "nh", "intrin.h", ALL_MS_LANGUAGES, "")
99100
TARGET_HEADER_BUILTIN(_InterlockedExchange64, "LLiLLiD*LLi", "nh", "intrin.h", ALL_MS_LANGUAGES, "")

clang/lib/CodeGen/CGBuiltin.cpp

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8517,6 +8517,15 @@ Value *CodeGenFunction::EmitAArch64BuiltinExpr(unsigned BuiltinID,
85178517
return EmitMSVCBuiltinExpr(MSVCIntrin::_InterlockedDecrement, E);
85188518
case AArch64::BI_InterlockedIncrement64:
85198519
return EmitMSVCBuiltinExpr(MSVCIntrin::_InterlockedIncrement, E);
8520+
8521+
case AArch64::BI_InterlockedAdd: {
8522+
Value *Arg0 = EmitScalarExpr(E->getArg(0));
8523+
Value *Arg1 = EmitScalarExpr(E->getArg(1));
8524+
AtomicRMWInst *RMWI = Builder.CreateAtomicRMW(
8525+
AtomicRMWInst::Add, Arg0, Arg1,
8526+
llvm::AtomicOrdering::SequentiallyConsistent);
8527+
return Builder.CreateAdd(RMWI, Arg1);
8528+
}
85208529
}
85218530
}
85228531

clang/lib/Headers/intrin.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -869,6 +869,7 @@ __nop(void) {
869869
\*----------------------------------------------------------------------------*/
870870
#if defined(__aarch64__)
871871
unsigned __int64 __getReg(int);
872+
long _InterlockedAdd(long volatile *Addend, long Value);
872873
#endif
873874

874875
/*----------------------------------------------------------------------------*\

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

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,16 @@
44
// RUN: not %clang_cc1 -triple arm64-linux -Werror -S -o /dev/null %s 2>&1 \
55
// RUN: | FileCheck %s -check-prefix CHECK-LINUX
66

7+
long test_InterlockedAdd(long volatile *Addend, long Value) {
8+
return _InterlockedAdd(Addend, Value);
9+
}
10+
11+
// CHECK-LABEL: define {{.*}} i32 @test_InterlockedAdd(i32* %Addend, i32 %Value) {{.*}} {
12+
// CHECK-MSVC: %[[OLDVAL:[0-9]+]] = atomicrmw add i32* %1, i32 %2 seq_cst
13+
// CHECK-MSVC: %[[NEWVAL:[0-9]+]] = add i32 %[[OLDVAL:[0-9]+]], %2
14+
// CHECK-MSVC: ret i32 %[[NEWVAL:[0-9]+]]
15+
// CHECK-LINUX: error: implicit declaration of function '_InterlockedAdd'
16+
717
void check__dmb(void) {
818
__dmb(0);
919
}

0 commit comments

Comments
 (0)