link _ppc_eabi_init.cpp

thanks, Antidote! this old compiler is jank with its peephole bug

Co-Authored-By: Phillip Stephens <antidote.crk@gmail.com>
This commit is contained in:
EpochFlame 2022-04-24 17:57:59 -04:00
parent 329ef4bff4
commit 52972ccd88
6 changed files with 91 additions and 159 deletions

View File

@ -130,6 +130,7 @@ $(BUILD_DIR)/src/Dolphin/dvdFatal.o: MWCC_VERSION := 1.2.5
$(BUILD_DIR)/src/Dolphin/dvderror.o: MWCC_VERSION := 1.2.5
$(BUILD_DIR)/src/Dolphin/dvdidutils.o: MWCC_VERSION := 1.2.5
$(BUILD_DIR)/src/Dolphin/__start.o: MWCC_VERSION := 1.2.5
$(BUILD_DIR)/src/Dolphin/__ppc_eabi_init.o: MWCC_VERSION := 1.2.5
$(BUILD_DIR)/src/Dolphin/OSLink.o: MWCC_VERSION := 1.2.5
$(BUILD_DIR)/src/Dolphin/PPCArch.o: MWCC_VERSION := 1.2.5
$(BUILD_DIR)/src/Dolphin/vec.o: MWCC_VERSION := 1.2.5

View File

@ -1,81 +0,0 @@
.include "macros.inc"
.section .init, "ax" # 0x80003100 - 0x80005600
.global __init_hardware
__init_hardware:
/* 800054EC 000024EC 7C 00 00 A6 */ mfmsr r0
/* 800054F0 000024F0 60 00 20 00 */ ori r0, r0, 0x2000
/* 800054F4 000024F4 7C 00 01 24 */ mtmsr r0
/* 800054F8 000024F8 7F E8 02 A6 */ mflr r31
/* 800054FC 000024FC 48 0E 65 25 */ bl __OSPSInit
/* 80005500 00002500 48 0E 5A C9 */ bl __OSFPRInit
/* 80005504 00002504 48 0E 77 59 */ bl __OSCacheInit
/* 80005508 00002508 7F E8 03 A6 */ mtlr r31
/* 8000550C 0000250C 4E 80 00 20 */ blr
.global __flush_cache
__flush_cache:
/* 80005510 00002510 3C A0 FF FF */ lis r5, 0xFFFFFFF1@h
/* 80005514 00002514 60 A5 FF F1 */ ori r5, r5, 0xFFFFFFF1@l
/* 80005518 00002518 7C A5 18 38 */ and r5, r5, r3
/* 8000551C 0000251C 7C 65 18 50 */ subf r3, r5, r3
/* 80005520 00002520 7C 84 1A 14 */ add r4, r4, r3
lbl_80005524:
/* 80005524 00002524 7C 00 28 6C */ dcbst 0, r5
/* 80005528 00002528 7C 00 04 AC */ sync 0
/* 8000552C 0000252C 7C 00 2F AC */ icbi 0, r5
/* 80005530 00002530 30 A5 00 08 */ addic r5, r5, 8
/* 80005534 00002534 34 84 FF F8 */ addic. r4, r4, -8
/* 80005538 00002538 40 80 FF EC */ bge lbl_80005524
/* 8000553C 0000253C 4C 00 01 2C */ isync
/* 80005540 00002540 4E 80 00 20 */ blr
.section .text, "ax" # 0x800056C0 - 0x80472F00
.global __init_user
__init_user:
/* 800F2FB4 000EFEF4 7C 08 02 A6 */ mflr r0
/* 800F2FB8 000EFEF8 90 01 00 04 */ stw r0, 4(r1)
/* 800F2FBC 000EFEFC 94 21 FF F8 */ stwu r1, -8(r1)
/* 800F2FC0 000EFF00 48 00 00 15 */ bl __init_cpp
/* 800F2FC4 000EFF04 80 01 00 0C */ lwz r0, 0xc(r1)
/* 800F2FC8 000EFF08 38 21 00 08 */ addi r1, r1, 8
/* 800F2FCC 000EFF0C 7C 08 03 A6 */ mtlr r0
/* 800F2FD0 000EFF10 4E 80 00 20 */ blr
__init_cpp: # local function
/* 800F2FD4 000EFF14 7C 08 02 A6 */ mflr r0
/* 800F2FD8 000EFF18 90 01 00 04 */ stw r0, 4(r1)
/* 800F2FDC 000EFF1C 94 21 FF F0 */ stwu r1, -0x10(r1)
/* 800F2FE0 000EFF20 93 E1 00 0C */ stw r31, 0xc(r1)
/* 800F2FE4 000EFF24 3C 60 80 47 */ lis r3, _ctors@ha
/* 800F2FE8 000EFF28 38 03 2F 00 */ addi r0, r3, _ctors@l
/* 800F2FEC 000EFF2C 7C 1F 03 78 */ mr r31, r0
/* 800F2FF0 000EFF30 48 00 00 04 */ b lbl_800F2FF4
lbl_800F2FF4:
/* 800F2FF4 000EFF34 48 00 00 04 */ b lbl_800F2FF8
lbl_800F2FF8:
/* 800F2FF8 000EFF38 48 00 00 10 */ b lbl_800F3008
lbl_800F2FFC:
/* 800F2FFC 000EFF3C 7D 88 03 A6 */ mtlr r12
/* 800F3000 000EFF40 4E 80 00 21 */ blrl
/* 800F3004 000EFF44 3B FF 00 04 */ addi r31, r31, 4
lbl_800F3008:
/* 800F3008 000EFF48 81 9F 00 00 */ lwz r12, 0(r31)
/* 800F300C 000EFF4C 28 0C 00 00 */ cmplwi r12, 0
/* 800F3010 000EFF50 40 82 FF EC */ bne lbl_800F2FFC
/* 800F3014 000EFF54 80 01 00 14 */ lwz r0, 0x14(r1)
/* 800F3018 000EFF58 83 E1 00 0C */ lwz r31, 0xc(r1)
/* 800F301C 000EFF5C 38 21 00 10 */ addi r1, r1, 0x10
/* 800F3020 000EFF60 7C 08 03 A6 */ mtlr r0
/* 800F3024 000EFF64 4E 80 00 20 */ blr
.global _ExitProcess
_ExitProcess:
/* 800F3028 000EFF68 7C 08 02 A6 */ mflr r0
/* 800F302C 000EFF6C 90 01 00 04 */ stw r0, 4(r1)
/* 800F3030 000EFF70 94 21 FF F8 */ stwu r1, -8(r1)
/* 800F3034 000EFF74 4B FE 15 65 */ bl PPCHalt
/* 800F3038 000EFF78 80 01 00 0C */ lwz r0, 0xc(r1)
/* 800F303C 000EFF7C 38 21 00 08 */ addi r1, r1, 8
/* 800F3040 000EFF80 7C 08 03 A6 */ mtlr r0
/* 800F3044 000EFF84 4E 80 00 20 */ blr

36
include/Dolphin/PPCArch.h Normal file
View File

@ -0,0 +1,36 @@
#ifndef _DOLPHIN_PPCARCH_H
#define _DOLPHIN_PPCARCH_H
#include "types.h"
#ifdef __cplusplus
extern "C" {
#endif
u32 PPCMfmsr();
void PPCMtmsr(u32 newMSR);
// u32 PPCOrMsr(u32 value);
void PPCOrMsr();
u32 PPCMfhid0();
void PPCMthid0(u32 newHID0);
u32 PPCMfl2cr();
void PPCMtl2cr(u32 newL2cr);
void PPCMtdec(u32 newDec);
void PPCSync();
void PPCHalt();
u32 PPCMffpscr();
void PPCMtfpscr(u32 newFPSCR);
u32 PPCMfhid2();
void PPCMthid2(u32 newhid2);
u32 PPCMfwpar();
void PPCMtwpar(u32 newwpar);
void PPCEnableSpeculation();
void PPCDisableSpeculation();
void PPCSetFpIEEEMode();
void PPCSetFpNonIEEEMode();
#ifdef __cplusplus
}
#endif
#endif

View File

@ -417,7 +417,7 @@ DOLPHIN:=\
$(BUILD_DIR)/asm/Dolphin/OSTime.o\
$(BUILD_DIR)/asm/Dolphin/__mem.o\
$(BUILD_DIR)/src/Dolphin/__start.o\
$(BUILD_DIR)/asm/Dolphin/__ppc_eabi_init.o\
$(BUILD_DIR)/src/Dolphin/__ppc_eabi_init.o\
$(BUILD_DIR)/asm/Dolphin/Padclamp.o\
$(BUILD_DIR)/asm/Dolphin/Pad.o\
$(BUILD_DIR)/asm/Dolphin/SIBios.o\

View File

@ -1,4 +1,5 @@
#include "types.h"
#include "Dolphin/PPCArch.h"
// clang-format off
union FpscrUnion

View File

@ -1,5 +1,48 @@
#include "types.h"
#include "Dolphin/os.h"
#include "Dolphin/PPCArch.h"
#ifdef __cplusplus
extern "C" {
#endif
typedef void (*voidfunctionptr)(void); // pointer to function returning void
__declspec(section ".ctors") extern voidfunctionptr _ctors[];
__declspec(section ".dtors") extern voidfunctionptr _dtors[];
static void __init_cpp(void);
// clang-format off
__declspec(section ".init") asm void __init_hardware(void) {
nofralloc
mfmsr r0
ori r0,r0,0x2000
mtmsr r0
mflr r31
bl __OSPSInit
bl __OSFPRInit
bl __OSCacheInit
mtlr r31
blr
}
__declspec(section ".init") asm void __flush_cache(void) {
nofralloc
lis r5, 0xFFFFFFF1@h
ori r5, r5, 0xFFFFFFF1@l
and r5, r5, r3
subf r3, r5, r3
add r4, r4, r3
loop:
dcbst 0, r5
sync
icbi 0, r5
addic r5, r5, 8
addic. r4, r4, -8
bge loop
isync
blr
}
// clang-format on
/*
* --INFO--
@ -15,38 +58,13 @@ void __init_user(void) { __init_cpp(); }
*/
static void __init_cpp(void)
{
voidfunctionptr* constructor;
/*
.loc_0x0:
mflr r0
stw r0, 0x4(r1)
stwu r1, -0x10(r1)
stw r31, 0xC(r1)
lis r3, 0x8047
addi r0, r3, 0x2F00
mr r31, r0
b .loc_0x20
.loc_0x20:
b .loc_0x24
.loc_0x24:
b .loc_0x34
.loc_0x28:
mtlr r12
blrl
addi r31, r31, 0x4
.loc_0x34:
lwz r12, 0x0(r31)
cmplwi r12, 0
bne+ .loc_0x28
lwz r0, 0x14(r1)
lwz r31, 0xC(r1)
addi r1, r1, 0x10
mtlr r0
blr
*/
* call static initializers
*/
for (constructor = _ctors; *constructor; constructor++) {
(*constructor)();
}
}
/*
@ -64,50 +82,7 @@ void __fini_cpp(void)
* Address: 800F3028
* Size: 000020
*/
void _ExitProcess(void)
{
/*
.loc_0x0:
mflr r0
stw r0, 0x4(r1)
stwu r1, -0x8(r1)
bl -0x1EA9C
lwz r0, 0xC(r1)
addi r1, r1, 0x8
mtlr r0
blr
*/
void _ExitProcess(void) { PPCHalt(); }
#ifdef __cplusplus
}
#pragma section code_type ".init"
// clang-format off
asm void __init_hardware(void) {
nofralloc
mfmsr r0
ori r0,r0,0x2000
mtmsr r0
mflr r31
bl __OSPSInit
bl __OSFPRInit
bl __OSCacheInit
mtlr r31
blr
}
asm void __flush_cache(void) {
lis r5, 0xFFFFFFF1@h
ori r5, r5, 0xFFFFFFF1@l
and r5, r5, r3
subf r3, r5, r3
add r4, r4, r3
loop:
dcbst 0, r5
sync
icbi 0, r5
addic r5, r5, 8
addic. r4, r4, -8
bge loop
isync
blr
}
// clang-format on
#endif