Skip to content

Commit 3619279

Browse files
Albion FungAlbion Fung
authored andcommitted
[PowerPC][PC Rel] Implement option to omit Power10 instructions from stubs
Implemented the option to omit Power10 instructions from save stubs via the option --no-power10-stubs or --power10-stubs=no on lld. --power10-stubs= will override the other option. --power10-stubs=auto also exists to use the default behaviour (ie allow Power10 instructions in stubs). Differential Revision: https://reviews.llvm.org/D94627
1 parent 6af94d2 commit 3619279

17 files changed

+311
-93
lines changed

lld/ELF/Config.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -253,6 +253,7 @@ struct Configuration {
253253
UnresolvedPolicy unresolvedSymbols;
254254
UnresolvedPolicy unresolvedSymbolsInShlib;
255255
Target2Policy target2;
256+
bool Power10Stub;
256257
ARMVFPArgKind armVFPArgs = ARMVFPArgKind::Default;
257258
BuildIdKind buildId = BuildIdKind::None;
258259
SeparateSegmentKind zSeparate;

lld/ELF/Driver.cpp

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -761,6 +761,20 @@ static OrphanHandlingPolicy getOrphanHandling(opt::InputArgList &args) {
761761
return OrphanHandlingPolicy::Place;
762762
}
763763

764+
// Parses --power10-stubs= flags, to disable or enable Power 10
765+
// instructions in stubs.
766+
static bool getP10StubOpt(opt::InputArgList &args) {
767+
768+
if (args.getLastArgValue(OPT_power10_stubs_eq)== "no")
769+
return false;
770+
771+
if (!args.hasArg(OPT_power10_stubs_eq) &&
772+
args.hasArg(OPT_no_power10_stubs))
773+
return false;
774+
775+
return true;
776+
}
777+
764778
// Parse --build-id or --build-id=<style>. We handle "tree" as a
765779
// synonym for "sha1" because all our hash functions including
766780
// -build-id=sha1 are actually tree hashes for performance reasons.
@@ -1126,6 +1140,7 @@ static void readConfigs(opt::InputArgList &args) {
11261140
config->zText = getZFlag(args, "text", "notext", true);
11271141
config->zWxneeded = hasZOption(args, "wxneeded");
11281142
setUnresolvedSymbolPolicy(args);
1143+
config->Power10Stub = getP10StubOpt(args);
11291144

11301145
if (opt::Arg *arg = args.getLastArg(OPT_eb, OPT_el)) {
11311146
if (arg->getOption().matches(OPT_eb))

lld/ELF/Options.td

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -445,6 +445,17 @@ def verbose: F<"verbose">, HelpText<"Verbose mode">;
445445

446446
def version: F<"version">, HelpText<"Display the version number and exit">;
447447

448+
def power10_stubs: F<"power10-stubs">, HelpText<"Alias for --power10-stubs=auto">;
449+
450+
def no_power10_stubs: F<"no-power10-stubs">, HelpText<"Alias for --power10-stubs=no">;
451+
452+
def power10_stubs_eq:
453+
J<"power10-stubs=">, HelpText<
454+
"Enables Power10 instructions in all stubs without options, "
455+
"options override previous flags."
456+
"auto: Allow Power10 instructions in stubs if applicable."
457+
"no: No Power10 instructions in stubs.">;
458+
448459
defm version_script: Eq<"version-script", "Read a version script">;
449460

450461
defm warn_backrefs: BB<"warn-backrefs",

lld/ELF/Thunks.cpp

Lines changed: 86 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -309,7 +309,7 @@ class PPC64R2SaveStub final : public Thunk {
309309
}
310310
return true;
311311
}
312-
uint32_t size() override { return getMayUseShortThunk() ? 8 : 20; }
312+
uint32_t size() override { return getMayUseShortThunk() ? 8 : 32; }
313313
void writeTo(uint8_t *buf) override;
314314
void addSymbols(ThunkSection &isec) override;
315315

@@ -330,7 +330,7 @@ class PPC64R2SaveStub final : public Thunk {
330330
class PPC64R12SetupStub final : public Thunk {
331331
public:
332332
PPC64R12SetupStub(Symbol &dest) : Thunk(dest, 0) { alignment = 16; }
333-
uint32_t size() override { return 16; }
333+
uint32_t size() override { return 32; }
334334
void writeTo(uint8_t *buf) override;
335335
void addSymbols(ThunkSection &isec) override;
336336
};
@@ -345,7 +345,7 @@ class PPC64R12SetupStub final : public Thunk {
345345
class PPC64PCRelPLTStub final : public Thunk {
346346
public:
347347
PPC64PCRelPLTStub(Symbol &dest) : Thunk(dest, 0) { alignment = 16; }
348-
uint32_t size() override { return 16; }
348+
uint32_t size() override { return 32; }
349349
void writeTo(uint8_t *buf) override;
350350
void addSymbols(ThunkSection &isec) override;
351351
bool isCompatibleWith(const InputSection &isec,
@@ -362,7 +362,7 @@ class PPC64PCRelPLTStub final : public Thunk {
362362
// used.
363363
class PPC64LongBranchThunk : public Thunk {
364364
public:
365-
uint32_t size() override { return 16; }
365+
uint32_t size() override { return 32; }
366366
void writeTo(uint8_t *buf) override;
367367
void addSymbols(ThunkSection &isec) override;
368368
bool isCompatibleWith(const InputSection &isec,
@@ -406,7 +406,7 @@ class PPC64PCRelLongBranchThunk final : public Thunk {
406406
: Thunk(dest, addend) {
407407
alignment = 16;
408408
}
409-
uint32_t size() override { return 16; }
409+
uint32_t size() override { return 32; }
410410
void writeTo(uint8_t *buf) override;
411411
void addSymbols(ThunkSection &isec) override;
412412
bool isCompatibleWith(const InputSection &isec,
@@ -922,17 +922,34 @@ bool PPC64PltCallStub::isCompatibleWith(const InputSection &isec,
922922

923923
void PPC64R2SaveStub::writeTo(uint8_t *buf) {
924924
const int64_t offset = computeOffset();
925-
write32(buf + 0, 0xf8410018); // std r2,24(r1)
925+
write32(buf + 0, 0xf8410018); // std r2,24(r1)
926926
// The branch offset needs to fit in 26 bits.
927927
if (getMayUseShortThunk()) {
928928
write32(buf + 4, 0x48000000 | (offset & 0x03fffffc)); // b <offset>
929929
} else if (isInt<34>(offset)) {
930-
const uint64_t paddi = PADDI_R12_NO_DISP |
931-
(((offset >> 16) & 0x3ffff) << 32) |
932-
(offset & 0xffff);
933-
writePrefixedInstruction(buf + 4, paddi); // paddi r12, 0, func@pcrel, 1
934-
write32(buf + 12, MTCTR_R12); // mtctr r12
935-
write32(buf + 16, BCTR); // bctr
930+
int nextInstOffset;
931+
if (!config->Power10Stub) {
932+
uint64_t tocOffset = destination.getVA() - getPPC64TocBase();
933+
if (tocOffset >> 16 > 0) {
934+
const uint64_t addi = ADDI_R12_TO_R12_NO_DISP | (tocOffset & 0xffff);
935+
const uint64_t addis = ADDIS_R12_TO_R2_NO_DISP | ((tocOffset >> 16) & 0xffff);
936+
write32(buf + 4, addis); // addis r12, r2 , top of offset
937+
write32(buf + 8, addi); // addi r12, r12, bottom of offset
938+
nextInstOffset = 12;
939+
} else {
940+
const uint64_t addi = ADDI_R12_TO_R2_NO_DISP | (tocOffset & 0xffff);
941+
write32(buf + 4, addi); // addi r12, r2, offset
942+
nextInstOffset = 8;
943+
}
944+
} else {
945+
const uint64_t paddi = PADDI_R12_NO_DISP |
946+
(((offset >> 16) & 0x3ffff) << 32) |
947+
(offset & 0xffff);
948+
writePrefixedInstruction(buf + 4, paddi); // paddi r12, 0, func@pcrel, 1
949+
nextInstOffset = 12;
950+
}
951+
write32(buf + nextInstOffset, MTCTR_R12); // mtctr r12
952+
write32(buf + nextInstOffset + 4, BCTR); // bctr
936953
} else {
937954
in.ppc64LongBranchTarget->addEntry(&destination, addend);
938955
const int64_t offsetFromTOC =
@@ -952,12 +969,25 @@ void PPC64R12SetupStub::writeTo(uint8_t *buf) {
952969
int64_t offset = destination.getVA() - getThunkTargetSym()->getVA();
953970
if (!isInt<34>(offset))
954971
reportRangeError(buf, offset, 34, destination, "R12 setup stub offset");
955-
uint64_t paddi = PADDI_R12_NO_DISP | (((offset >> 16) & 0x3ffff) << 32) |
956-
(offset & 0xffff);
957972

958-
writePrefixedInstruction(buf + 0, paddi); // paddi r12, 0, func@pcrel, 1
959-
write32(buf + 8, MTCTR_R12); // mtctr r12
960-
write32(buf + 12, BCTR); // bctr
973+
int nextInstOffset;
974+
if (!config->Power10Stub) {
975+
uint32_t off = destination.getVA(addend) - getThunkTargetSym()->getVA() - 8;
976+
write32(buf + 0, 0x7c0802a6); // mflr r12
977+
write32(buf + 4, 0x429f0005); // bcl 20,31,.+4
978+
write32(buf + 8, 0x7d6802a6); // mflr r11
979+
write32(buf + 12, 0x7d8803a6); // mtlr r12
980+
write32(buf + 16, 0x3d8b0000 | computeHiBits(off));// addis r12,r11,off@ha
981+
write32(buf + 20, 0x398c0000 | (off & 0xffff)); // addi r12,r12,off@l
982+
nextInstOffset = 24;
983+
} else {
984+
uint64_t paddi = PADDI_R12_NO_DISP | (((offset >> 16) & 0x3ffff) << 32) |
985+
(offset & 0xffff);
986+
writePrefixedInstruction(buf + 0, paddi); // paddi r12, 0, func@pcrel, 1
987+
nextInstOffset = 8;
988+
}
989+
write32(buf + nextInstOffset, MTCTR_R12); // mtctr r12
990+
write32(buf + nextInstOffset + 4, BCTR); // bctr
961991
}
962992

963993
void PPC64R12SetupStub::addSymbols(ThunkSection &isec) {
@@ -966,16 +996,29 @@ void PPC64R12SetupStub::addSymbols(ThunkSection &isec) {
966996
}
967997

968998
void PPC64PCRelPLTStub::writeTo(uint8_t *buf) {
999+
int nextInstOffset = 0;
9691000
int64_t offset = destination.getGotPltVA() - getThunkTargetSym()->getVA();
970-
if (!isInt<34>(offset))
971-
reportRangeError(buf, offset, 34, destination,
972-
"PC-relative PLT stub offset");
973-
uint64_t pld =
974-
PLD_R12_NO_DISP | (((offset >> 16) & 0x3ffff) << 32) | (offset & 0xffff);
9751001

976-
writePrefixedInstruction(buf + 0, pld); // pld r12, func@plt@pcrel
977-
write32(buf + 8, MTCTR_R12); // mtctr r12
978-
write32(buf + 12, BCTR); // bctr
1002+
if (config->Power10Stub) {
1003+
if (!isInt<34>(offset))
1004+
reportRangeError(buf, offset, 34, destination,
1005+
"PC-relative PLT stub offset");
1006+
const uint64_t pld = PLD_R12_NO_DISP | (((offset >> 16) & 0x3ffff) << 32) |
1007+
(offset & 0xffff);
1008+
writePrefixedInstruction(buf + 0, pld); // pld r12, func@plt@pcrel
1009+
nextInstOffset = 8;
1010+
} else {
1011+
uint32_t off = destination.getVA(addend) - getThunkTargetSym()->getVA() - 8;
1012+
write32(buf + 0, 0x7c0802a6); // mflr r12
1013+
write32(buf + 4, 0x429f0005); // bcl 20,31,.+4
1014+
write32(buf + 8, 0x7d6802a6); // mflr r11
1015+
write32(buf + 12, 0x7d8803a6); // mtlr r12
1016+
write32(buf + 16, 0x3d8b0000 | computeHiBits(off)); // addis r12,r11,off@ha
1017+
write32(buf + 20, 0x398c0000 | (off & 0xffff)); // addi r12,r12,off@l
1018+
nextInstOffset = 24;
1019+
}
1020+
write32(buf + nextInstOffset, MTCTR_R12); // mtctr r12
1021+
write32(buf + nextInstOffset + 4, BCTR); // bctr
9791022
}
9801023

9811024
void PPC64PCRelPLTStub::addSymbols(ThunkSection &isec) {
@@ -1009,12 +1052,25 @@ void PPC64PCRelLongBranchThunk::writeTo(uint8_t *buf) {
10091052
if (!isInt<34>(offset))
10101053
reportRangeError(buf, offset, 34, destination,
10111054
"PC-relative long branch stub offset");
1012-
uint64_t paddi = PADDI_R12_NO_DISP | (((offset >> 16) & 0x3ffff) << 32) |
1013-
(offset & 0xffff);
10141055

1015-
writePrefixedInstruction(buf + 0, paddi); // paddi r12, 0, func@pcrel, 1
1016-
write32(buf + 8, MTCTR_R12); // mtctr r12
1017-
write32(buf + 12, BCTR); // bctr
1056+
int nextInstOffset;
1057+
if (!config->Power10Stub) {
1058+
uint32_t off = destination.getVA(addend) - getThunkTargetSym()->getVA() - 8;
1059+
write32(buf + 0, 0x7c0802a6); // mflr r12
1060+
write32(buf + 4, 0x429f0005); // bcl 20,31,.+4
1061+
write32(buf + 8, 0x7d6802a6); // mflr r11
1062+
write32(buf + 12, 0x7d8803a6); // mtlr r12
1063+
write32(buf + 16, 0x3d8b0000 | computeHiBits(off)); // addis r12,r11,off@ha
1064+
write32(buf + 20, 0x398c0000 | (off & 0xffff)); // addi r12,r12,off@l
1065+
nextInstOffset = 24;
1066+
} else {
1067+
uint64_t paddi = PADDI_R12_NO_DISP | (((offset >> 16) & 0x3ffff) << 32) |
1068+
(offset & 0xffff);
1069+
writePrefixedInstruction(buf + 0, paddi); // paddi r12, 0, func@pcrel, 1
1070+
nextInstOffset = 8;
1071+
}
1072+
write32(buf + nextInstOffset, MTCTR_R12); // mtctr r12
1073+
write32(buf + nextInstOffset + 4, BCTR); // bctr
10181074
}
10191075

10201076
void PPC64PCRelLongBranchThunk::addSymbols(ThunkSection &isec) {

lld/ELF/Thunks.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,10 @@ void writePPC32PltCallStub(uint8_t *buf, uint64_t gotPltVA,
7373
const InputFile *file, int64_t addend);
7474
void writePPC64LoadAndBranch(uint8_t *buf, int64_t offset);
7575

76+
static inline uint16_t computeHiBits(uint32_t toCompute) {
77+
return (toCompute + 0x8000) >> 16;
78+
}
79+
7680
} // namespace elf
7781
} // namespace lld
7882

lld/test/ELF/ppc64-call-reach.s

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,7 @@ test:
6767

6868
# THUNK-LABEL: <test>:
6969
# THUNK: 10010014: bl 0x10010030
70-
# THUNK: 10010024: b 0x10010040
70+
# THUNK: 10010024: b 0x10010050
7171

7272
# .branch_lt[0]
7373
# THUNK-LABEL: <__long_branch_callee>:
@@ -78,7 +78,7 @@ test:
7878

7979
# .branch_lt[1]
8080
# THUNK-LABEL: <__long_branch_tail_callee>:
81-
# THUNK-NEXT: 10010040: addis 12, 2, 1
81+
# THUNK-NEXT: 10010050: addis 12, 2, 1
8282
# THUNK-NEXT: ld 12, -32752(12)
8383
# THUNK-NEXT: mtctr 12
8484
# THUNK-NEXT: bctr

lld/test/ELF/ppc64-long-branch-localentry-offset.s

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,8 @@
55
# RUN: llvm-nm %t | FileCheck %s
66

77
# CHECK-DAG: 0000000010010000 t __long_branch_callee
8-
# CHECK-DAG: 0000000010010010 T _start
9-
# CHECK-DAG: 0000000012010008 T callee
8+
# CHECK-DAG: 0000000010010020 T _start
9+
# CHECK-DAG: 0000000012010018 T callee
1010

1111
# The bl instruction jumps to the local entry. The distance requires a long branch stub:
1212
# localentry(callee) - _start = 0x12010008+8 - 0x10010010 = 0x2000000

lld/test/ELF/ppc64-long-branch-pi.s

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -14,26 +14,26 @@
1414
# RUN: llvm-objdump -d --no-show-raw-insn %t.so | FileCheck %s
1515

1616
# SEC-PIE: Name Type Address Off Size ES Flg Lk Inf Al
17-
# SEC-PIE: .got PROGBITS 00000000020020f0 20120f0 000008 00 WA 0 0 8
18-
# SEC-PIE: .branch_lt NOBITS 0000000002002100 2012100 000020 00 WA 0 0 8
17+
# SEC-PIE: .got PROGBITS 0000000002002100 2012100 000008 00 WA 0 0 8
18+
# SEC-PIE: .branch_lt NOBITS 0000000002002110 2012110 000020 00 WA 0 0 8
1919

2020
# SEC-SHARED: Name Type Address Off Size ES Flg Lk Inf Al
21-
# SEC-SHARED: .got PROGBITS 00000000020020d0 20120d0 000008 00 WA 0 0 8
22-
# SEC-SHARED: .branch_lt NOBITS 00000000020020e0 20120e0 000020 00 WA 0 0 8
21+
# SEC-SHARED: .got PROGBITS 00000000020020e0 20120e0 000008 00 WA 0 0 8
22+
# SEC-SHARED: .branch_lt NOBITS 00000000020020f0 20120f0 000020 00 WA 0 0 8
2323

2424
# RELOC: .rela.dyn {
25-
# RELOC-NEXT: 0x20020F8 R_PPC64_RELATIVE - 0x8000
26-
# RELOC-NEXT: 0x2002100 R_PPC64_RELATIVE - 0x2002000
27-
# RELOC-NEXT: 0x2002108 R_PPC64_RELATIVE - 0x2002008
28-
# RELOC-NEXT: 0x2002110 R_PPC64_RELATIVE - 0x200200C
29-
# RELOC-NEXT: 0x2002118 R_PPC64_RELATIVE - 0x2000
25+
# RELOC-NEXT: 0x2002108 R_PPC64_RELATIVE - 0x8000
26+
# RELOC-NEXT: 0x2002110 R_PPC64_RELATIVE - 0x2002000
27+
# RELOC-NEXT: 0x2002118 R_PPC64_RELATIVE - 0x2002008
28+
# RELOC-NEXT: 0x2002120 R_PPC64_RELATIVE - 0x200200C
29+
# RELOC-NEXT: 0x2002128 R_PPC64_RELATIVE - 0x2000
3030
# RELOC-NEXT: }
3131

3232
# CHECK: <_start>:
3333
# CHECK-NEXT: 2000: bl 0x2010
3434
# CHECK-NEXT: bl 0x2002000
35-
# CHECK-NEXT: bl 0x2020
3635
# CHECK-NEXT: bl 0x2030
36+
# CHECK-NEXT: bl 0x2050
3737

3838
## &.branch_lt[0] - .TOC. = .branch_lt - (.got+0x8000) = -32752
3939
# CHECK: <__long_branch_>:
@@ -44,14 +44,14 @@
4444

4545
## &.branch_lt[1] - .TOC. = .branch_lt - (.got+0x8000) = -32744
4646
# CHECK: <__long_branch_>:
47-
# CHECK-NEXT: 2020: addis 12, 2, 0
47+
# CHECK-NEXT: 2030: addis 12, 2, 0
4848
# CHECK-NEXT: ld 12, -32744(12)
4949
# CHECK-NEXT: mtctr 12
5050
# CHECK-NEXT: bctr
5151

5252
## &.branch_lt[2] - .TOC. = .branch_lt - (.got+0x8000) = -32736
5353
# CHECK: <__long_branch_>:
54-
# CHECK-NEXT: 2030: addis 12, 2, 0
54+
# CHECK-NEXT: 2050: addis 12, 2, 0
5555
# CHECK-NEXT: ld 12, -32736(12)
5656
# CHECK-NEXT: mtctr 12
5757
# CHECK-NEXT: bctr

lld/test/ELF/ppc64-long-branch-rel14.s

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@
2020
# CHECK-NEXT: 2000: bt 2, 0x2020
2121
# CHECK-NEXT: bt+ 2, 0x2020
2222
# CHECK-NEXT: bf 2, 0xa004
23-
# CHECK-NEXT: bt 2, 0x2030
23+
# CHECK-NEXT: bt 2, 0x2040
2424
# CHECK-NEXT: blr
2525
# CHECK-NEXT: trap
2626
# CHECK-NEXT: trap
@@ -31,10 +31,11 @@
3131
# CHECK-NEXT: ld 12, {{.*}}(12)
3232
# CHECK-NEXT: mtctr 12
3333
# CHECK-NEXT: bctr
34+
# CHECK-NEXT: ...
3435
# CHECK-EMPTY:
3536

3637
# CHECK-NEXT: <__long_branch_>:
37-
# CHECK-NEXT: 2030: addis 12, 2, 0
38+
# CHECK-NEXT: 2040: addis 12, 2, 0
3839
# CHECK-NEXT: ld 12, {{.*}}(12)
3940
# CHECK-NEXT: mtctr 12
4041
# CHECK-NEXT: bctr

lld/test/ELF/ppc64-long-branch.s

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -19,16 +19,16 @@
1919
# RUN: llvm-nm --no-sort %t | FileCheck --check-prefix=NM %s
2020

2121
# SEC: Name Type Address Off Size ES Flg Lk Inf Al
22-
# SEC: .got PROGBITS 0000000002002030 2002030 000008 00 WA 0 0 8
23-
# SEC: .branch_lt PROGBITS 0000000002002038 2002038 000018 00 WA 0 0 8
22+
# SEC: .got PROGBITS 0000000002002040 2002040 000008 00 WA 0 0 8
23+
# SEC: .branch_lt PROGBITS 0000000002002048 2002048 000018 00 WA 0 0 8
2424

2525
# SEC: There are no relocations in this file.
2626

2727
## high@localentry (high+8), .text_high+16 and .text_low+8
28-
# BRANCH-LE: 0x02002038 08200002 00000000 10200002 00000000
29-
# BRANCH-LE-NEXT: 0x02002048 08200000 00000000
30-
# BRANCH-BE: 0x02002038 00000000 02002008 00000000 02002010
31-
# BRANCH-BE-NEXT: 0x02002048 00000000 00002008
28+
# BRANCH-LE: 0x02002048 08200002 00000000 10200002 00000000
29+
# BRANCH-LE-NEXT: 0x02002058 08200000 00000000
30+
# BRANCH-BE: 0x02002048 00000000 02002008 00000000 02002010
31+
# BRANCH-BE-NEXT: 0x02002058 00000000 00002008
3232

3333
# CHECK: <_start>:
3434
# CHECK-NEXT: 2000: bl 0x2020
@@ -45,7 +45,7 @@
4545

4646
## &.branch_lt[1] - .TOC. = .branch_lt - (.got+0x8000) = -32752
4747
# CHECK: <__long_branch_>:
48-
# CHECK-NEXT: 2030: addis 12, 2, 0
48+
# CHECK-NEXT: 2040: addis 12, 2, 0
4949
# CHECK-NEXT: ld 12, -32752(12)
5050
# CHECK-NEXT: mtctr 12
5151
# CHECK-NEXT: bctr
@@ -64,7 +64,7 @@ blr
6464
# CHECK-EMPTY:
6565
# CHECK-NEXT: <high>:
6666
# CHECK-NEXT: 2002000: addis 2, 12, 1
67-
# CHECK-NEXT: addi 2, 2, -32720
67+
# CHECK-NEXT: addi 2, 2, -32704
6868
# CHECK-NEXT: bl 0x2008
6969
# CHECK-NEXT: bl 0x2002020
7070
# CHECK: <__long_branch_>:

0 commit comments

Comments
 (0)