Author: Albion Fung Date: 2021-07-15T14:29:09-05:00 New Revision: da6b871e66c933fc0c33ac4eddb1db479321c33d
URL: https://github.com/llvm/llvm-project/commit/da6b871e66c933fc0c33ac4eddb1db479321c33d DIFF: https://github.com/llvm/llvm-project/commit/da6b871e66c933fc0c33ac4eddb1db479321c33d.diff LOG: [PowerPC] Implement MFSPR, MTMSR, MTSPR builtins The builtins for mtmsr, mtspr, mfspr are implemented in this patch. This is for xlC compatibility. Added: Modified: clang/include/clang/Basic/BuiltinsPPC.def clang/lib/CodeGen/CGBuiltin.cpp llvm/include/llvm/IR/IntrinsicsPowerPC.td llvm/lib/Target/PowerPC/PPCInstr64Bit.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 b8a14f85a4bdd..f0ac3eee2b3a8 100644 --- a/clang/include/clang/Basic/BuiltinsPPC.def +++ b/clang/include/clang/Basic/BuiltinsPPC.def @@ -84,6 +84,8 @@ BUILTIN(__builtin_ppc_maddhd, "LLiLLiLLiLLi", "") BUILTIN(__builtin_ppc_maddhdu, "ULLiULLiULLiULLi", "") BUILTIN(__builtin_ppc_maddld, "LLiLLiLLiLLi", "") BUILTIN(__builtin_ppc_mfspr, "ULiiC", "") +BUILTIN(__builtin_ppc_mtmsr, "vUi", "") +BUILTIN(__builtin_ppc_mtspr, "viCULi", "") BUILTIN(__builtin_ppc_get_timebase, "ULLi", "n") diff --git a/clang/lib/CodeGen/CGBuiltin.cpp b/clang/lib/CodeGen/CGBuiltin.cpp index 94ebb60fdd193..019dc0350be69 100644 --- a/clang/lib/CodeGen/CGBuiltin.cpp +++ b/clang/lib/CodeGen/CGBuiltin.cpp @@ -15575,16 +15575,18 @@ Value *CodeGenFunction::EmitPPCBuiltinExpr(unsigned BuiltinID, case PPC::BI__builtin_ppc_lwarx: return emitPPCLoadReserveIntrinsic(*this, BuiltinID, E); case PPC::BI__builtin_ppc_mfspr: { - dbgs() <<"Hello\n"; - llvm::Type *src0 = EmitScalarExpr(E->getArg(0))->getType(); - src0->dump(); - dbgs() << "Ops size: " << Ops.size() << "\n"; - Function *F = CGM.getIntrinsic(Intrinsic::ppc_mfspr, src0); - // uint64_t Imm = cast<llvm::ConstantInt>(Ops[0])->getZExtValue(); - // Ops[0] = llvm::ConstantInt::get(Int32Ty, Imm); - Value *temp = Builder.CreateCall(F, Ops); - temp->dump(); - return temp; + llvm::Type *RetType = + CGM.getDataLayout().getTypeSizeInBits(VoidPtrTy) == 32 ? Int32Ty : + Int64Ty; + Function *F = CGM.getIntrinsic(Intrinsic::ppc_mfspr, RetType); + return Builder.CreateCall(F, Ops); + } + case PPC::BI__builtin_ppc_mtspr: { + llvm::Type *RetType = + CGM.getDataLayout().getTypeSizeInBits(VoidPtrTy) == 32 ? Int32Ty : + Int64Ty; + Function *F = CGM.getIntrinsic(Intrinsic::ppc_mtspr, RetType); + return Builder.CreateCall(F, Ops); } } } diff --git a/llvm/include/llvm/IR/IntrinsicsPowerPC.td b/llvm/include/llvm/IR/IntrinsicsPowerPC.td index 2e5600e68f53b..0f9206855becf 100644 --- a/llvm/include/llvm/IR/IntrinsicsPowerPC.td +++ b/llvm/include/llvm/IR/IntrinsicsPowerPC.td @@ -1599,6 +1599,10 @@ let TargetPrefix = "ppc" in { : GCCBuiltin<"__builtin_ppc_maddld">, Intrinsic<[llvm_i64_ty], [llvm_i64_ty, llvm_i64_ty, llvm_i64_ty], [IntrNoMem]>; - def int_ppc_mfspr : Intrinsic<[llvm_anyint_ty], [llvm_i32_ty], [ImmArg<ArgIndex<1>>]>; + def int_ppc_mfspr : Intrinsic<[llvm_anyint_ty], [llvm_i32_ty], [ImmArg<ArgIndex<0>>]>; + def int_ppc_mtmsr + : GCCBuiltin<"__builtin_ppc_mtmsr">, Intrinsic<[], [llvm_i32_ty], []>; + def int_ppc_mtspr + : Intrinsic<[], [llvm_i32_ty, llvm_anyint_ty], [ImmArg<ArgIndex<0>>]>; } diff --git a/llvm/lib/Target/PowerPC/PPCInstr64Bit.td b/llvm/lib/Target/PowerPC/PPCInstr64Bit.td index a709b496d75e6..08bd7a9a183bc 100644 --- a/llvm/lib/Target/PowerPC/PPCInstr64Bit.td +++ b/llvm/lib/Target/PowerPC/PPCInstr64Bit.td @@ -1748,5 +1748,7 @@ def : Pat<(int_ppc_tdw g8rc:$A, g8rc:$B, i32:$IMM), // trapd def : Pat<(int_ppc_trapd g8rc:$A), (TDI 24, $A, 0)>; -def : Pat<(i32 (int_ppc_mfspr i32:$SPR)), - (MFSPR $SPR)>; +def : Pat<(i64 (int_ppc_mfspr i32:$SPR)), + (MFSPR8 $SPR)>; +def : Pat<(int_ppc_mtspr i32:$SPR, g8rc:$RT), + (MTSPR8 $SPR, $RT)>; diff --git a/llvm/lib/Target/PowerPC/PPCInstrInfo.td b/llvm/lib/Target/PowerPC/PPCInstrInfo.td index 6d592c9f99532..6d7c1a6e20518 100644 --- a/llvm/lib/Target/PowerPC/PPCInstrInfo.td +++ b/llvm/lib/Target/PowerPC/PPCInstrInfo.td @@ -5447,3 +5447,7 @@ def : Pat<(int_ppc_fctuwz f64:$A), (XSCVDPUXWS $A)>; def : Pat<(i32 (int_ppc_mfspr i32:$SPR)), (MFSPR $SPR)>; +def : Pat<(int_ppc_mtspr i32:$SPR, gprc:$RT), + (MTSPR $SPR, $RT)>; +def : Pat<(int_ppc_mtmsr gprc:$RS), + (MTMSR $RS, 0)>; _______________________________________________ llvm-branch-commits mailing list llvm-branch-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits