xref: /freebsd/contrib/llvm-project/llvm/lib/ExecutionEngine/JITLink/ppc64.cpp (revision 06c3fb2749bda94cb5201f81ffdb8fa6c3161b2e)
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