1*06c3fb27SDimitry Andric //===----- ppc64.cpp - Generic JITLink ppc64 edge kinds, utilities ------===// 2*06c3fb27SDimitry Andric // 3*06c3fb27SDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4*06c3fb27SDimitry Andric // See https://llvm.org/LICENSE.txt for license information. 5*06c3fb27SDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6*06c3fb27SDimitry Andric // 7*06c3fb27SDimitry Andric //===----------------------------------------------------------------------===// 8*06c3fb27SDimitry Andric // 9*06c3fb27SDimitry Andric // Generic utilities for graphs representing 64-bit PowerPC objects. 10*06c3fb27SDimitry Andric // 11*06c3fb27SDimitry Andric //===----------------------------------------------------------------------===// 12*06c3fb27SDimitry Andric 13*06c3fb27SDimitry Andric #include "llvm/ExecutionEngine/JITLink/ppc64.h" 14*06c3fb27SDimitry Andric 15*06c3fb27SDimitry Andric #define DEBUG_TYPE "jitlink" 16*06c3fb27SDimitry Andric 17*06c3fb27SDimitry Andric namespace llvm::jitlink::ppc64 { 18*06c3fb27SDimitry Andric 19*06c3fb27SDimitry Andric const char NullPointerContent[8] = {0x00, 0x00, 0x00, 0x00, 20*06c3fb27SDimitry Andric 0x00, 0x00, 0x00, 0x00}; 21*06c3fb27SDimitry Andric 22*06c3fb27SDimitry Andric const char PointerJumpStubContent_little[20] = { 23*06c3fb27SDimitry Andric 0x18, 0x00, 0x41, (char)0xf8, // std r2, 24(r1) 24*06c3fb27SDimitry Andric 0x00, 0x00, (char)0x82, 0x3d, // addis r12, r2, OffHa 25*06c3fb27SDimitry Andric 0x00, 0x00, (char)0x8c, (char)0xe9, // ld r12, OffLo(r12) 26*06c3fb27SDimitry Andric (char)0xa6, 0x03, (char)0x89, 0x7d, // mtctr r12 27*06c3fb27SDimitry Andric 0x20, 0x04, (char)0x80, 0x4e, // bctr 28*06c3fb27SDimitry Andric }; 29*06c3fb27SDimitry Andric 30*06c3fb27SDimitry Andric const char PointerJumpStubContent_big[20] = { 31*06c3fb27SDimitry Andric (char)0xf8, 0x41, 0x00, 0x18, // std r2, 24(r1) 32*06c3fb27SDimitry Andric 0x3d, (char)0x82, 0x00, 0x00, // addis r12, r2, OffHa 33*06c3fb27SDimitry Andric (char)0xe9, (char)0x8c, 0x00, 0x00, // ld r12, OffLo(r12) 34*06c3fb27SDimitry Andric 0x7d, (char)0x89, 0x03, (char)0xa6, // mtctr r12 35*06c3fb27SDimitry Andric 0x4e, (char)0x80, 0x04, 0x20, // bctr 36*06c3fb27SDimitry Andric }; 37*06c3fb27SDimitry Andric 38*06c3fb27SDimitry Andric // TODO: We can use prefixed instructions if LLJIT is running on power10. 39*06c3fb27SDimitry Andric const char PointerJumpStubNoTOCContent_little[32] = { 40*06c3fb27SDimitry Andric (char)0xa6, 0x02, (char)0x88, 0x7d, // mflr 12 41*06c3fb27SDimitry Andric 0x05, (char)0x00, (char)0x9f, 0x42, // bcl 20,31,.+4 42*06c3fb27SDimitry Andric (char)0xa6, 0x02, 0x68, 0x7d, // mflr 11 43*06c3fb27SDimitry Andric (char)0xa6, 0x03, (char)0x88, 0x7d, // mtlr 12 44*06c3fb27SDimitry Andric 0x00, 0x00, (char)0x8b, 0x3d, // addis 12,11,OffHa 45*06c3fb27SDimitry Andric 0x00, 0x00, (char)0x8c, (char)0xe9, // ld 12, OffLo(12) 46*06c3fb27SDimitry Andric (char)0xa6, 0x03, (char)0x89, 0x7d, // mtctr 12 47*06c3fb27SDimitry Andric 0x20, 0x04, (char)0x80, 0x4e, // bctr 48*06c3fb27SDimitry Andric }; 49*06c3fb27SDimitry Andric 50*06c3fb27SDimitry Andric const char PointerJumpStubNoTOCContent_big[32] = { 51*06c3fb27SDimitry Andric 0x7d, (char)0x88, 0x02, (char)0xa6, // mflr 12 52*06c3fb27SDimitry Andric 0x42, (char)0x9f, 0x00, 0x05, // bcl 20,31,.+4 53*06c3fb27SDimitry Andric 0x7d, 0x68, 0x02, (char)0xa6, // mflr 11 54*06c3fb27SDimitry Andric 0x7d, (char)0x88, 0x03, (char)0xa6, // mtlr 12 55*06c3fb27SDimitry Andric 0x3d, (char)0x8b, 0x00, 0x00, // addis 12,11,OffHa 56*06c3fb27SDimitry Andric (char)0xe9, (char)0x8c, 0x00, 0x00, // ld 12, OffLo(12) 57*06c3fb27SDimitry Andric 0x7d, (char)0x89, 0x03, (char)0xa6, // mtctr 12 58*06c3fb27SDimitry Andric 0x4e, (char)0x80, 0x04, 0x20, // bctr 59*06c3fb27SDimitry Andric }; 60*06c3fb27SDimitry Andric 61*06c3fb27SDimitry Andric const char *getEdgeKindName(Edge::Kind K) { 62*06c3fb27SDimitry Andric switch (K) { 63*06c3fb27SDimitry Andric case Pointer64: 64*06c3fb27SDimitry Andric return "Pointer64"; 65*06c3fb27SDimitry Andric case Pointer32: 66*06c3fb27SDimitry Andric return "Pointer32"; 67*06c3fb27SDimitry Andric case Delta64: 68*06c3fb27SDimitry Andric return "Delta64"; 69*06c3fb27SDimitry Andric case Delta32: 70*06c3fb27SDimitry Andric return "Delta32"; 71*06c3fb27SDimitry Andric case NegDelta32: 72*06c3fb27SDimitry Andric return "NegDelta32"; 73*06c3fb27SDimitry Andric case Delta16: 74*06c3fb27SDimitry Andric return "Delta16"; 75*06c3fb27SDimitry Andric case Delta16HA: 76*06c3fb27SDimitry Andric return "Delta16HA"; 77*06c3fb27SDimitry Andric case Delta16LO: 78*06c3fb27SDimitry Andric return "Delta16LO"; 79*06c3fb27SDimitry Andric case TOCDelta16HA: 80*06c3fb27SDimitry Andric return "TOCDelta16HA"; 81*06c3fb27SDimitry Andric case TOCDelta16LO: 82*06c3fb27SDimitry Andric return "TOCDelta16LO"; 83*06c3fb27SDimitry Andric case TOCDelta16DS: 84*06c3fb27SDimitry Andric return "TOCDelta16DS"; 85*06c3fb27SDimitry Andric case TOCDelta16LODS: 86*06c3fb27SDimitry Andric return "TOCDelta16LODS"; 87*06c3fb27SDimitry Andric case CallBranchDelta: 88*06c3fb27SDimitry Andric return "CallBranchDelta"; 89*06c3fb27SDimitry Andric case CallBranchDeltaRestoreTOC: 90*06c3fb27SDimitry Andric return "CallBranchDeltaRestoreTOC"; 91*06c3fb27SDimitry Andric case RequestPLTCallStub: 92*06c3fb27SDimitry Andric return "RequestPLTCallStub"; 93*06c3fb27SDimitry Andric case RequestPLTCallStubSaveTOC: 94*06c3fb27SDimitry Andric return "RequestPLTCallStubSaveTOC"; 95*06c3fb27SDimitry Andric case RequestPLTCallStubNoTOC: 96*06c3fb27SDimitry Andric return "RequestPLTCallStubNoTOC"; 97*06c3fb27SDimitry Andric default: 98*06c3fb27SDimitry Andric return getGenericEdgeKindName(static_cast<Edge::Kind>(K)); 99*06c3fb27SDimitry Andric } 100*06c3fb27SDimitry Andric } 101*06c3fb27SDimitry Andric 102*06c3fb27SDimitry Andric } // end namespace llvm::jitlink::ppc64 103