Author: Albion Fung Date: 2021-07-13T21:30:09-05:00 New Revision: 09df6199e796f9855c3fbc78df0eb42ff278cdb2
URL: https://github.com/llvm/llvm-project/commit/09df6199e796f9855c3fbc78df0eb42ff278cdb2 DIFF: https://github.com/llvm/llvm-project/commit/09df6199e796f9855c3fbc78df0eb42ff278cdb2.diff LOG: Implementation of STBCX Added: Modified: clang/include/clang/Basic/BuiltinsPPC.def clang/lib/Basic/Targets/PPC.cpp clang/lib/CodeGen/CGBuiltin.cpp llvm/include/llvm/IR/IntrinsicsPowerPC.td llvm/lib/Target/PowerPC/PPCInstrInfo.td Removed: ################################################################################ diff --git a/clang/include/clang/Basic/BuiltinsPPC.def b/clang/include/clang/Basic/BuiltinsPPC.def index 09769b3f974e..a214c4e1cc7b 100644 --- a/clang/include/clang/Basic/BuiltinsPPC.def +++ b/clang/include/clang/Basic/BuiltinsPPC.def @@ -58,6 +58,7 @@ BUILTIN(__builtin_ppc_fetch_and_swaplp, "ULiULiD*ULi", "") BUILTIN(__builtin_ppc_ldarx, "LiLiD*", "") BUILTIN(__builtin_ppc_lwarx, "iiD*", "") BUILTIN(__builtin_ppc_stdcx, "iLiD*Li", "") +BUILTIN(__builtin_ppc_stbcx, "icD*c", "") BUILTIN(__builtin_ppc_stwcx, "iiD*i", "") BUILTIN(__builtin_ppc_tdw, "vLLiLLiIUi", "") BUILTIN(__builtin_ppc_tw, "viiIUi", "") diff --git a/clang/lib/Basic/Targets/PPC.cpp b/clang/lib/Basic/Targets/PPC.cpp index b79b30d7a4cd..a428f0c3a9f7 100644 --- a/clang/lib/Basic/Targets/PPC.cpp +++ b/clang/lib/Basic/Targets/PPC.cpp @@ -118,6 +118,7 @@ static void defineXLCompatMacros(MacroBuilder &Builder) { Builder.defineMacro("__lwarx", "__builtin_ppc_lwarx"); Builder.defineMacro("__stdcx", "__builtin_ppc_stdcx"); Builder.defineMacro("__stwcx", "__builtin_ppc_stwcx"); + Builder.defineMacro("__stbcx", "__builtin_ppc_stbcx"); Builder.defineMacro("__tdw", "__builtin_ppc_tdw"); Builder.defineMacro("__tw", "__builtin_ppc_tw"); Builder.defineMacro("__trap", "__builtin_ppc_trap"); diff --git a/clang/lib/CodeGen/CGBuiltin.cpp b/clang/lib/CodeGen/CGBuiltin.cpp index baa143695418..b886f270615e 100644 --- a/clang/lib/CodeGen/CGBuiltin.cpp +++ b/clang/lib/CodeGen/CGBuiltin.cpp @@ -15575,6 +15575,21 @@ Value *CodeGenFunction::EmitPPCBuiltinExpr(unsigned BuiltinID, case PPC::BI__builtin_ppc_ldarx: case PPC::BI__builtin_ppc_lwarx: return emitPPCLoadReserveIntrinsic(*this, BuiltinID, E); + case PPC::BI__builtin_ppc_stbcx: { + llvm::Function *F = CGM.getIntrinsic(Intrinsic::ppc_stbcx); + Ops[0] = Builder.CreateBitCast(Ops[0], Int8PtrTy); + auto Signed = getIntegerWidthAndSignedness(CGM.getContext(), + E->getArg(1)->getType()).Signed; + + if (Signed) { + dbgs() << "SIGNED\n"; + Ops[1] = Builder.CreateSExt(Ops[1], Int32Ty); + } else { + dbgs() << "UNSIGNED\n"; + Ops[1] = Builder.CreateZExt(Ops[1], Int32Ty); + } + return Builder.CreateCall(F, Ops); + } } } diff --git a/llvm/include/llvm/IR/IntrinsicsPowerPC.td b/llvm/include/llvm/IR/IntrinsicsPowerPC.td index b021b43afe59..d95823ef59c5 100644 --- a/llvm/include/llvm/IR/IntrinsicsPowerPC.td +++ b/llvm/include/llvm/IR/IntrinsicsPowerPC.td @@ -1565,6 +1565,7 @@ let TargetPrefix = "ppc" in { def int_ppc_stwcx : GCCBuiltin<"__builtin_ppc_stwcx">, Intrinsic<[llvm_i32_ty], [llvm_ptr_ty, llvm_i32_ty], [IntrWriteMem]>; + def int_ppc_stbcx : Intrinsic<[llvm_i32_ty], [llvm_ptr_ty, llvm_i32_ty], [IntrWriteMem]>; // compare def int_ppc_cmpeqb : GCCBuiltin<"__builtin_ppc_cmpeqb">, diff --git a/llvm/lib/Target/PowerPC/PPCInstrInfo.td b/llvm/lib/Target/PowerPC/PPCInstrInfo.td index d97881fe818b..2e8ca2df241e 100644 --- a/llvm/lib/Target/PowerPC/PPCInstrInfo.td +++ b/llvm/lib/Target/PowerPC/PPCInstrInfo.td @@ -5445,3 +5445,5 @@ def : Pat<(int_ppc_fctudz f64:$A), (XSCVDPUXDS $A)>; def : Pat<(int_ppc_fctuwz f64:$A), (XSCVDPUXWS $A)>; +def : Pat<(int_ppc_stbcx xoaddr:$dst, gprc:$A), + (STBCX gprc:$A, xoaddr:$dst)>; _______________________________________________ llvm-branch-commits mailing list llvm-branch-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits