Runtime/math matches; better libc headers

This commit is contained in:
Luke Street 2022-08-25 23:46:24 -04:00
parent e50328cd89
commit bef7db1748
116 changed files with 5434 additions and 973 deletions

View File

@ -50,9 +50,9 @@ include obj_files.mk
O_FILES := $(INIT_O_FILES) $(METROTRK_FILES) \
$(METROIDPRIME) $(WORLDFORMAT) $(WEAPONS) $(METARENDER) $(GUISYS) $(COLLISION) \
$(KYOTO) $(AI_FILES) \
$(KYOTO_1) $(ZLIB_FILES) $(KYOTO_2) $(AI_FILES) \
$(AR_FILES) $(BASE_FILES) $(DB_FILES) $(DSP_FILES) $(DVD_FILES) $(GX_FILES) $(MTX_FILES) \
$(OS_FILES) $(PAD_FILES) $(VI_FILES) $(MSL_PPCEABI_BARE_H) $(MUSYX_FILES) \
$(OS_FILES) $(PAD_FILES) $(VI_FILES) $(MSL_PPCEABI_BARE_H) $(MSL_COMMON_MATH) $(MUSYX_FILES) \
$(DTK_FILES) $(CARD_FILES) $(SI_FILES) $(EXI_FILES) $(THP_FILES) \
$(GBA_FILES)
DEPENDS := $(O_FILES:.o=.d)
@ -95,9 +95,13 @@ TRANSFORM_DEP := tools/transform-dep.py
FRANK := tools/franklite.py
# Options
INCLUDES := -i include/
INCLUDES := -i include/ -i libc/
ASM_INCLUDES := -I include/
# DotKuribo/llvm-project
CLANG_CC ?= clang-kuribo
CLANG_CFLAGS := --target=ppc32-kuribo -mcpu=750 -nostdlib -fno-exceptions -fno-rtti -O3 -Wall -Wno-trigraphs -Wno-inline-new-delete -Wno-unused-private-field -fpermissive -std=gnu++11 $(ASM_INCLUDES)
ASFLAGS := -mgekko $(ASM_INCLUDES) --defsym version=$(VERSION_NUM)
ifeq ($(VERBOSE),1)
# this set of LDFLAGS outputs warnings.
@ -107,50 +111,32 @@ ifeq ($(VERBOSE),0)
# this set of LDFLAGS generates no warnings.
LDFLAGS := $(MAPGEN) -fp fmadd -nodefaults -w off
endif
CFLAGS_1.2 = -proc gekko -nodefaults -Cpp_exceptions off -RTTI off -fp fmadd -fp_contract on -O4,p -maxerrors 1 -enum int -inline auto -MMD $(INCLUDES)
CFLAGS_MUSYX = -proc gekko -nodefaults -Cpp_exceptions off -RTTI off -fp fmadd -str reuse,pool,readonly -O4,p -maxerrors 1 -enum int -inline auto -MMD $(INCLUDES)
CFLAGS = $(CFLAGS_1.2) -use_lmw_stmw on -str reuse,pool,readonly -gccinc -nosyspath -inline deferred,noauto -common on
CFLAGS_ZLIB = $(CFLAGS_1.2) -use_lmw_stmw on -str reuse,pool,readonly -gccinc -nosyspath -inline deferred,auto
CFLAGS_1.2 += -str reuse
CFLAGS_BASE = -proc gekko -nodefaults -Cpp_exceptions off -RTTI off -fp hard -fp_contract on -O4,p -maxerrors 1 -enum int -inline auto -str reuse -nosyspath -MMD $(INCLUDES)
CFLAGS = $(CFLAGS_BASE) -use_lmw_stmw on -str reuse,pool,readonly -gccinc -inline deferred,noauto -common on
CFLAGS_RUNTIME = $(CFLAGS_BASE) -use_lmw_stmw on -str reuse,pool,readonly -gccinc -inline deferred,auto
CFLAGS_MUSYX = $(CFLAGS_BASE) -str reuse,pool,readonly
ifeq ($(VERBOSE),0)
# this set of ASFLAGS generates no warnings.
ASFLAGS += -W
endif
$(BUILD_DIR)/src/os/__start.o: MWCC_VERSION := 1.2.5
$(BUILD_DIR)/src/os/__start.o: CFLAGS := $(CFLAGS_1.2)
$(BUILD_DIR)/src/MetroTRK/mslsupp.o: MWCC_VERSION := 1.2.5
$(BUILD_DIR)/src/MetroTRK/mslsupp.o: CFLAGS := $(CFLAGS_1.2)
$(BUILD_DIR)/src/Dolphin/PPCArch.o: MWCC_VERSION := 1.2.5
$(BUILD_DIR)/src/Dolphin/PPCArch.o: CFLAGS := $(CFLAGS_1.2)
$(BUILD_DIR)/src/Dolphin/ai.o: MWCC_VERSION := 1.2.5
$(BUILD_DIR)/src/Dolphin/ai.o: CFLAGS := $(CFLAGS_1.2)
$(BUILD_DIR)/src/Dolphin/os/OSAudioSystem.o: MWCC_VERSION := 1.2.5
$(BUILD_DIR)/src/Dolphin/os/OSAudioSystem.o: CFLAGS := $(CFLAGS_1.2)
$(BUILD_DIR)/src/Dolphin/os/OSReset.o: MWCC_VERSION := 1.2.5
$(BUILD_DIR)/src/Dolphin/os/OSReset.o: CFLAGS := $(CFLAGS_1.2)
$(BUILD_DIR)/src/Dolphin/dsp/dsp.o: MWCC_VERSION := 1.2.5
$(BUILD_DIR)/src/Dolphin/dsp/dsp.o: CFLAGS := $(CFLAGS_1.2)
$(BUILD_DIR)/src/Dolphin/dsp/dsp_debug.o: CFLAGS := $(CFLAGS_1.2)
$(BUILD_DIR)/src/musyx/seq_api.o: CFLAGS := $(CFLAGS_MUSYX)
$(BUILD_DIR)/src/musyx/synth_dbtab.o: CFLAGS := $(CFLAGS_MUSYX)
$(BUILD_DIR)/src/musyx/snd_service.o: CFLAGS := $(CFLAGS_MUSYX)
$(BUILD_DIR)/src/musyx/snd_init.o: CFLAGS := $(CFLAGS_MUSYX)
$(BUILD_DIR)/src/musyx/dsp_import.o: CFLAGS := $(CFLAGS_MUSYX)
$(BUILD_DIR)/src/musyx/hw_memory.o: CFLAGS := $(CFLAGS_MUSYX)
$(BUILD_DIR)/src/musyx/reverb_fx.o: CFLAGS := $(CFLAGS_MUSYX)
$(BUILD_DIR)/src/musyx/delay_fx.o: CFLAGS := $(CFLAGS_MUSYX)
$(BUILD_DIR)/src/musyx/creverb_fx.o: CFLAGS := $(CFLAGS_MUSYX)
$(BUILD_DIR)/src/musyx/synth_ac.o: CFLAGS := $(CFLAGS_MUSYX)
$(BUILD_DIR)/src/Kyoto/zlib/adler32.o: CFLAGS := $(CFLAGS_ZLIB)
$(BUILD_DIR)/src/Kyoto/zlib/infblock.o: CFLAGS := $(CFLAGS_ZLIB)
$(BUILD_DIR)/src/Kyoto/zlib/infcodes.o: CFLAGS := $(CFLAGS_ZLIB)
$(BUILD_DIR)/src/Kyoto/zlib/inffast.o: CFLAGS := $(CFLAGS_ZLIB)
$(BUILD_DIR)/src/Kyoto/zlib/inflate.o: CFLAGS := $(CFLAGS_ZLIB)
$(BUILD_DIR)/src/Kyoto/zlib/inftrees.o: CFLAGS := $(CFLAGS_ZLIB)
$(BUILD_DIR)/src/Kyoto/zlib/infutil.o: CFLAGS := $(CFLAGS_ZLIB)
$(BUILD_DIR)/src/Kyoto/zlib/zutil.o: CFLAGS := $(CFLAGS_ZLIB)
$(INIT_O_FILES): MWCC_VERSION := 1.2.5
$(INIT_O_FILES): CFLAGS := $(CFLAGS_BASE)
$(METROTRK_FILES): MWCC_VERSION := 1.2.5
$(METROTRK_FILES): CFLAGS := $(CFLAGS_BASE)
$(BASE_FILES): MWCC_VERSION := 1.2.5
$(BASE_FILES): CFLAGS := $(CFLAGS_BASE)
$(AI_FILES): MWCC_VERSION := 1.2.5
$(AI_FILES): CFLAGS := $(CFLAGS_BASE)
$(OS_FILES): MWCC_VERSION := 1.2.5
$(OS_FILES): CFLAGS := $(CFLAGS_BASE)
$(DSP_FILES): MWCC_VERSION := 1.2.5
$(DSP_FILES): CFLAGS := $(CFLAGS_BASE)
$(MUSYX_FILES): CFLAGS := $(CFLAGS_MUSYX)
$(ZLIB_FILES): CFLAGS := $(CFLAGS_RUNTIME)
$(MSL_PPCEABI_BARE_H): CFLAGS := $(CFLAGS_RUNTIME)
$(MSL_COMMON_MATH): CFLAGS := $(CFLAGS_RUNTIME)
#-------------------------------------------------------------------------------
@ -199,9 +185,13 @@ $(ELF): $(O_FILES) $(LDSCRIPT)
-include $(DEPENDS)
$(BUILD_DIR)/%.o: %.s
@echo Assembling $<
@echo "Assembling" $<
$(QUIET) $(AS) $(ASFLAGS) -o $@ $<
$(BUILD_DIR)/%.clang.o: %.cpp
@echo "Clang " $<
$(QUIET) $(CLANG_CC) $(CLANG_CFLAGS) -c -o $@ $<
$(BUILD_DIR)/%.ep.o: $(BUILD_DIR)/%.o
@echo Frank is fixing $<
$(QUIET) $(PYTHON) $(FRANK) $< $@

View File

@ -46,9 +46,9 @@ FourCCToTypeIdx__11CFactoryMgrFUi:
/* 803385E4 00335544 38 00 FF FF */ li r0, -1
/* 803385E8 00335548 48 00 00 14 */ b lbl_803385FC
lbl_803385EC:
/* 803385EC 0033554C 3C 60 80 3F */ lis r3, lbl_803F2C20@ha
/* 803385EC 0033554C 3C 60 80 3F */ lis r3, __upper_map@ha
/* 803385F0 00335550 54 00 06 3E */ clrlwi r0, r0, 0x18
/* 803385F4 00335554 38 63 2C 20 */ addi r3, r3, lbl_803F2C20@l
/* 803385F4 00335554 38 63 2C 20 */ addi r3, r3, __upper_map@l
/* 803385F8 00335558 7C 03 00 AE */ lbzx r0, r3, r0
lbl_803385FC:
/* 803385FC 0033555C 88 81 00 09 */ lbz r4, 9(r1)
@ -59,9 +59,9 @@ lbl_803385FC:
/* 80338610 00335570 38 00 FF FF */ li r0, -1
/* 80338614 00335574 48 00 00 14 */ b lbl_80338628
lbl_80338618:
/* 80338618 00335578 3C 60 80 3F */ lis r3, lbl_803F2C20@ha
/* 80338618 00335578 3C 60 80 3F */ lis r3, __upper_map@ha
/* 8033861C 0033557C 54 80 06 3E */ clrlwi r0, r4, 0x18
/* 80338620 00335580 38 63 2C 20 */ addi r3, r3, lbl_803F2C20@l
/* 80338620 00335580 38 63 2C 20 */ addi r3, r3, __upper_map@l
/* 80338624 00335584 7C 03 00 AE */ lbzx r0, r3, r0
lbl_80338628:
/* 80338628 00335588 88 81 00 0A */ lbz r4, 0xa(r1)
@ -72,9 +72,9 @@ lbl_80338628:
/* 8033863C 0033559C 38 00 FF FF */ li r0, -1
/* 80338640 003355A0 48 00 00 14 */ b lbl_80338654
lbl_80338644:
/* 80338644 003355A4 3C 60 80 3F */ lis r3, lbl_803F2C20@ha
/* 80338644 003355A4 3C 60 80 3F */ lis r3, __upper_map@ha
/* 80338648 003355A8 54 80 06 3E */ clrlwi r0, r4, 0x18
/* 8033864C 003355AC 38 63 2C 20 */ addi r3, r3, lbl_803F2C20@l
/* 8033864C 003355AC 38 63 2C 20 */ addi r3, r3, __upper_map@l
/* 80338650 003355B0 7C 03 00 AE */ lbzx r0, r3, r0
lbl_80338654:
/* 80338654 003355B4 88 81 00 0B */ lbz r4, 0xb(r1)
@ -85,9 +85,9 @@ lbl_80338654:
/* 80338668 003355C8 38 00 FF FF */ li r0, -1
/* 8033866C 003355CC 48 00 00 14 */ b lbl_80338680
lbl_80338670:
/* 80338670 003355D0 3C 60 80 3F */ lis r3, lbl_803F2C20@ha
/* 80338670 003355D0 3C 60 80 3F */ lis r3, __upper_map@ha
/* 80338674 003355D4 54 80 06 3E */ clrlwi r0, r4, 0x18
/* 80338678 003355D8 38 63 2C 20 */ addi r3, r3, lbl_803F2C20@l
/* 80338678 003355D8 38 63 2C 20 */ addi r3, r3, __upper_map@l
/* 8033867C 003355DC 7C 03 00 AE */ lbzx r0, r3, r0
lbl_80338680:
/* 80338680 003355E0 98 01 00 0B */ stb r0, 0xb(r1)

View File

@ -24,8 +24,8 @@ Type2Text__10SObjectTagFUi:
/* 80341010 0033DF70 38 00 FF FF */ li r0, -1
/* 80341014 0033DF74 48 00 00 10 */ b lbl_80341024
lbl_80341018:
/* 80341018 0033DF78 3C 80 80 3F */ lis r4, lbl_803F2C20@ha
/* 8034101C 0033DF7C 38 84 2C 20 */ addi r4, r4, lbl_803F2C20@l
/* 80341018 0033DF78 3C 80 80 3F */ lis r4, __upper_map@ha
/* 8034101C 0033DF7C 38 84 2C 20 */ addi r4, r4, __upper_map@l
/* 80341020 0033DF80 7C 04 00 AE */ lbzx r0, r4, r0
lbl_80341024:
/* 80341024 0033DF84 54 65 86 3E */ rlwinm r5, r3, 0x10, 0x18, 0x1f
@ -35,8 +35,8 @@ lbl_80341024:
/* 80341034 0033DF94 38 00 FF FF */ li r0, -1
/* 80341038 0033DF98 48 00 00 10 */ b lbl_80341048
lbl_8034103C:
/* 8034103C 0033DF9C 3C 80 80 3F */ lis r4, lbl_803F2C20@ha
/* 80341040 0033DFA0 38 84 2C 20 */ addi r4, r4, lbl_803F2C20@l
/* 8034103C 0033DF9C 3C 80 80 3F */ lis r4, __upper_map@ha
/* 80341040 0033DFA0 38 84 2C 20 */ addi r4, r4, __upper_map@l
/* 80341044 0033DFA4 7C 04 28 AE */ lbzx r0, r4, r5
lbl_80341048:
/* 80341048 0033DFA8 54 65 C6 3E */ rlwinm r5, r3, 0x18, 0x18, 0x1f
@ -47,8 +47,8 @@ lbl_80341048:
/* 8034105C 0033DFBC 38 00 FF FF */ li r0, -1
/* 80341060 0033DFC0 48 00 00 10 */ b lbl_80341070
lbl_80341064:
/* 80341064 0033DFC4 3C 80 80 3F */ lis r4, lbl_803F2C20@ha
/* 80341068 0033DFC8 38 84 2C 20 */ addi r4, r4, lbl_803F2C20@l
/* 80341064 0033DFC4 3C 80 80 3F */ lis r4, __upper_map@ha
/* 80341068 0033DFC8 38 84 2C 20 */ addi r4, r4, __upper_map@l
/* 8034106C 0033DFCC 7C 04 28 AE */ lbzx r0, r4, r5
lbl_80341070:
/* 80341070 0033DFD0 54 64 06 3E */ clrlwi r4, r3, 0x18
@ -59,15 +59,15 @@ lbl_80341070:
/* 80341084 0033DFE4 38 60 FF FF */ li r3, -1
/* 80341088 0033DFE8 48 00 00 10 */ b lbl_80341098
lbl_8034108C:
/* 8034108C 0033DFEC 3C 60 80 3F */ lis r3, lbl_803F2C20@ha
/* 80341090 0033DFF0 38 63 2C 20 */ addi r3, r3, lbl_803F2C20@l
/* 8034108C 0033DFEC 3C 60 80 3F */ lis r3, __upper_map@ha
/* 80341090 0033DFF0 38 63 2C 20 */ addi r3, r3, __upper_map@l
/* 80341094 0033DFF4 7C 63 20 AE */ lbzx r3, r3, r4
lbl_80341098:
/* 80341098 0033DFF8 38 AD A9 58 */ addi r5, r13, lbl_805A9518@sda21
/* 8034109C 0033DFFC 38 00 00 00 */ li r0, 0
/* 803410A0 0033E000 98 65 00 03 */ stb r3, 3(r5)
/* 803410A4 0033E004 3C 60 80 3F */ lis r3, lbl_803F2A20@ha
/* 803410A8 0033E008 38 83 2A 20 */ addi r4, r3, lbl_803F2A20@l
/* 803410A4 0033E004 3C 60 80 3F */ lis r3, __ctype_map@ha
/* 803410A8 0033E008 38 83 2A 20 */ addi r4, r3, __ctype_map@l
/* 803410AC 0033E00C 98 05 00 04 */ stb r0, 4(r5)
/* 803410B0 0033E010 38 00 00 2D */ li r0, 0x2d
/* 803410B4 0033E014 88 6D A9 58 */ lbz r3, lbl_805A9518@sda21(r13)

View File

@ -580,12 +580,12 @@ lbl_80315438:
lbl_80315444:
/* 80315444 003123A4 FC 01 10 00 */ fcmpu cr0, f1, f2
/* 80315448 003123A8 41 82 00 10 */ beq lbl_80315458
/* 8031544C 003123AC 3C 60 80 5B */ lis r3, lbl_805A8BA0@ha
/* 80315450 003123B0 C0 43 8B A0 */ lfs f2, lbl_805A8BA0@l(r3)
/* 8031544C 003123AC 3C 60 80 5B */ lis r3, __float_nan@ha
/* 80315450 003123B0 C0 43 8B A0 */ lfs f2, __float_nan@l(r3)
/* 80315454 003123B4 48 00 00 0C */ b lbl_80315460
lbl_80315458:
/* 80315458 003123B8 3C 60 80 5B */ lis r3, lbl_805A8BA4@ha
/* 8031545C 003123BC C0 43 8B A4 */ lfs f2, lbl_805A8BA4@l(r3)
/* 80315458 003123B8 3C 60 80 5B */ lis r3, __float_huge@ha
/* 8031545C 003123BC C0 43 8B A4 */ lfs f2, __float_huge@l(r3)
lbl_80315460:
/* 80315460 003123C0 C8 02 C9 C8 */ lfd f0, lbl_805AE6E8@sda21(r2)
/* 80315464 003123C4 FC 20 10 24 */ fdiv f1, f0, f2
@ -625,12 +625,12 @@ lbl_803154D0:
lbl_803154DC:
/* 803154DC 0031243C FC 01 00 00 */ fcmpu cr0, f1, f0
/* 803154E0 00312440 41 82 00 10 */ beq lbl_803154F0
/* 803154E4 00312444 3C 60 80 5B */ lis r3, lbl_805A8BA0@ha
/* 803154E8 00312448 C0 03 8B A0 */ lfs f0, lbl_805A8BA0@l(r3)
/* 803154E4 00312444 3C 60 80 5B */ lis r3, __float_nan@ha
/* 803154E8 00312448 C0 03 8B A0 */ lfs f0, __float_nan@l(r3)
/* 803154EC 0031244C 48 00 00 0C */ b lbl_803154F8
lbl_803154F0:
/* 803154F0 00312450 3C 60 80 5B */ lis r3, lbl_805A8BA4@ha
/* 803154F4 00312454 C0 03 8B A4 */ lfs f0, lbl_805A8BA4@l(r3)
/* 803154F0 00312450 3C 60 80 5B */ lis r3, __float_huge@ha
/* 803154F4 00312454 C0 03 8B A4 */ lfs f0, __float_huge@l(r3)
lbl_803154F8:
/* 803154F8 00312458 FC 20 00 90 */ fmr f1, f0
/* 803154FC 0031245C 4E 80 00 20 */ blr
@ -668,12 +668,12 @@ lbl_80315560:
lbl_8031556C:
/* 8031556C 003124CC FC 01 00 00 */ fcmpu cr0, f1, f0
/* 80315570 003124D0 41 82 00 10 */ beq lbl_80315580
/* 80315574 003124D4 3C 60 80 5B */ lis r3, lbl_805A8BA0@ha
/* 80315578 003124D8 C0 03 8B A0 */ lfs f0, lbl_805A8BA0@l(r3)
/* 80315574 003124D4 3C 60 80 5B */ lis r3, __float_nan@ha
/* 80315578 003124D8 C0 03 8B A0 */ lfs f0, __float_nan@l(r3)
/* 8031557C 003124DC 48 00 00 0C */ b lbl_80315588
lbl_80315580:
/* 80315580 003124E0 3C 60 80 5B */ lis r3, lbl_805A8BA4@ha
/* 80315584 003124E4 C0 03 8B A4 */ lfs f0, lbl_805A8BA4@l(r3)
/* 80315580 003124E0 3C 60 80 5B */ lis r3, __float_huge@ha
/* 80315584 003124E4 C0 03 8B A4 */ lfs f0, __float_huge@l(r3)
lbl_80315588:
/* 80315588 003124E8 FC 20 00 18 */ frsp f1, f0
/* 8031558C 003124EC 4E 80 00 20 */ blr

View File

@ -1923,6 +1923,8 @@ lbl_803D8368:
# ROM: 0x3D5368
.asciz "??(??)"
.balign 4
# what's going on here?
.if version < 2
.4byte 0
.4byte 0

View File

@ -2031,12 +2031,12 @@ lbl_8005452C:
lbl_80054538:
/* 80054538 00051498 FC 04 08 00 */ fcmpu cr0, f4, f1
/* 8005453C 0005149C 41 82 00 10 */ beq lbl_8005454C
/* 80054540 000514A0 3C 80 80 5B */ lis r4, lbl_805A8BA0@ha
/* 80054544 000514A4 C0 24 8B A0 */ lfs f1, lbl_805A8BA0@l(r4)
/* 80054540 000514A0 3C 80 80 5B */ lis r4, __float_nan@ha
/* 80054544 000514A4 C0 24 8B A0 */ lfs f1, __float_nan@l(r4)
/* 80054548 000514A8 48 00 00 0C */ b lbl_80054554
lbl_8005454C:
/* 8005454C 000514AC 3C 80 80 5B */ lis r4, lbl_805A8BA4@ha
/* 80054550 000514B0 C0 24 8B A4 */ lfs f1, lbl_805A8BA4@l(r4)
/* 8005454C 000514AC 3C 80 80 5B */ lis r4, __float_huge@ha
/* 80054550 000514B0 C0 24 8B A4 */ lfs f1, __float_huge@l(r4)
lbl_80054554:
/* 80054554 000514B4 FC 20 08 18 */ frsp f1, f1
/* 80054558 000514B8 C0 02 86 60 */ lfs f0, lbl_805AA380@sda21(r2)

View File

@ -144,12 +144,12 @@ lbl_8001B704:
lbl_8001B710:
/* 8001B710 00018670 FC 04 48 00 */ fcmpu cr0, f4, f9
/* 8001B714 00018674 41 82 00 10 */ beq lbl_8001B724
/* 8001B718 00018678 3C 60 80 5B */ lis r3, lbl_805A8BA0@ha
/* 8001B71C 0001867C C1 23 8B A0 */ lfs f9, lbl_805A8BA0@l(r3)
/* 8001B718 00018678 3C 60 80 5B */ lis r3, __float_nan@ha
/* 8001B71C 0001867C C1 23 8B A0 */ lfs f9, __float_nan@l(r3)
/* 8001B720 00018680 48 00 00 0C */ b lbl_8001B72C
lbl_8001B724:
/* 8001B724 00018684 3C 60 80 5B */ lis r3, lbl_805A8BA4@ha
/* 8001B728 00018688 C1 23 8B A4 */ lfs f9, lbl_805A8BA4@l(r3)
/* 8001B724 00018684 3C 60 80 5B */ lis r3, __float_huge@ha
/* 8001B728 00018688 C1 23 8B A4 */ lfs f9, __float_huge@l(r3)
lbl_8001B72C:
/* 8001B72C 0001868C FF 80 48 18 */ frsp f28, f9
/* 8001B730 00018690 C0 A2 82 5C */ lfs f5, lbl_805A9F7C@sda21(r2)
@ -257,12 +257,12 @@ lbl_8001B8A4:
lbl_8001B8B0:
/* 8001B8B0 00018810 FC 04 08 00 */ fcmpu cr0, f4, f1
/* 8001B8B4 00018814 41 82 00 10 */ beq lbl_8001B8C4
/* 8001B8B8 00018818 3C 60 80 5B */ lis r3, lbl_805A8BA0@ha
/* 8001B8BC 0001881C C0 23 8B A0 */ lfs f1, lbl_805A8BA0@l(r3)
/* 8001B8B8 00018818 3C 60 80 5B */ lis r3, __float_nan@ha
/* 8001B8BC 0001881C C0 23 8B A0 */ lfs f1, __float_nan@l(r3)
/* 8001B8C0 00018820 48 00 00 0C */ b lbl_8001B8CC
lbl_8001B8C4:
/* 8001B8C4 00018824 3C 60 80 5B */ lis r3, lbl_805A8BA4@ha
/* 8001B8C8 00018828 C0 23 8B A4 */ lfs f1, lbl_805A8BA4@l(r3)
/* 8001B8C4 00018824 3C 60 80 5B */ lis r3, __float_huge@ha
/* 8001B8C8 00018828 C0 23 8B A4 */ lfs f1, __float_huge@l(r3)
lbl_8001B8CC:
/* 8001B8CC 0001882C FF E0 08 18 */ frsp f31, f1
/* 8001B8D0 00018830 C0 22 82 5C */ lfs f1, lbl_805A9F7C@sda21(r2)

View File

@ -38,7 +38,7 @@ lbl_805A9110:
.section .text, "ax"
.if version == 2
.if version >= 2
.global PollResponse__11CGBASupportFv
PollResponse__11CGBASupportFv:

View File

@ -8130,12 +8130,12 @@ lbl_800F4080:
lbl_800F408C:
/* 800F408C 000F0FEC FC 04 08 00 */ fcmpu cr0, f4, f1
/* 800F4090 000F0FF0 41 82 00 10 */ beq lbl_800F40A0
/* 800F4094 000F0FF4 3C 60 80 5B */ lis r3, lbl_805A8BA0@ha
/* 800F4098 000F0FF8 C0 23 8B A0 */ lfs f1, lbl_805A8BA0@l(r3)
/* 800F4094 000F0FF4 3C 60 80 5B */ lis r3, __float_nan@ha
/* 800F4098 000F0FF8 C0 23 8B A0 */ lfs f1, __float_nan@l(r3)
/* 800F409C 000F0FFC 48 00 00 0C */ b lbl_800F40A8
lbl_800F40A0:
/* 800F40A0 000F1000 3C 60 80 5B */ lis r3, lbl_805A8BA4@ha
/* 800F40A4 000F1004 C0 23 8B A4 */ lfs f1, lbl_805A8BA4@l(r3)
/* 800F40A0 000F1000 3C 60 80 5B */ lis r3, __float_huge@ha
/* 800F40A4 000F1004 C0 23 8B A4 */ lfs f1, __float_huge@l(r3)
lbl_800F40A8:
/* 800F40A8 000F1008 FF 80 08 18 */ frsp f28, f1
/* 800F40AC 000F100C FC 20 E8 90 */ fmr f1, f29
@ -8192,12 +8192,12 @@ lbl_800F4168:
lbl_800F4174:
/* 800F4174 000F10D4 FC 06 10 00 */ fcmpu cr0, f6, f2
/* 800F4178 000F10D8 41 82 00 10 */ beq lbl_800F4188
/* 800F417C 000F10DC 3C 60 80 5B */ lis r3, lbl_805A8BA0@ha
/* 800F4180 000F10E0 C0 43 8B A0 */ lfs f2, lbl_805A8BA0@l(r3)
/* 800F417C 000F10DC 3C 60 80 5B */ lis r3, __float_nan@ha
/* 800F4180 000F10E0 C0 43 8B A0 */ lfs f2, __float_nan@l(r3)
/* 800F4184 000F10E4 48 00 00 0C */ b lbl_800F4190
lbl_800F4188:
/* 800F4188 000F10E8 3C 60 80 5B */ lis r3, lbl_805A8BA4@ha
/* 800F418C 000F10EC C0 43 8B A4 */ lfs f2, lbl_805A8BA4@l(r3)
/* 800F4188 000F10E8 3C 60 80 5B */ lis r3, __float_huge@ha
/* 800F418C 000F10EC C0 43 8B A4 */ lfs f2, __float_huge@l(r3)
lbl_800F4190:
/* 800F4190 000F10F0 FC 60 10 18 */ frsp f3, f2
/* 800F4194 000F10F4 C0 42 91 50 */ lfs f2, lbl_805AAE70@sda21(r2)
@ -8250,12 +8250,12 @@ lbl_800F4240:
lbl_800F424C:
/* 800F424C 000F11AC FC 04 10 00 */ fcmpu cr0, f4, f2
/* 800F4250 000F11B0 41 82 00 10 */ beq lbl_800F4260
/* 800F4254 000F11B4 3C 60 80 5B */ lis r3, lbl_805A8BA0@ha
/* 800F4258 000F11B8 C0 43 8B A0 */ lfs f2, lbl_805A8BA0@l(r3)
/* 800F4254 000F11B4 3C 60 80 5B */ lis r3, __float_nan@ha
/* 800F4258 000F11B8 C0 43 8B A0 */ lfs f2, __float_nan@l(r3)
/* 800F425C 000F11BC 48 00 00 0C */ b lbl_800F4268
lbl_800F4260:
/* 800F4260 000F11C0 3C 60 80 5B */ lis r3, lbl_805A8BA4@ha
/* 800F4264 000F11C4 C0 43 8B A4 */ lfs f2, lbl_805A8BA4@l(r3)
/* 800F4260 000F11C0 3C 60 80 5B */ lis r3, __float_huge@ha
/* 800F4264 000F11C4 C0 43 8B A4 */ lfs f2, __float_huge@l(r3)
lbl_800F4268:
/* 800F4268 000F11C8 FC 20 E8 90 */ fmr f1, f29
/* 800F426C 000F11CC FC 40 10 18 */ frsp f2, f2

View File

@ -3997,12 +3997,12 @@ lbl_80285524:
lbl_80285530:
/* 80285530 00282490 FC 04 18 00 */ fcmpu cr0, f4, f3
/* 80285534 00282494 41 82 00 10 */ beq lbl_80285544
/* 80285538 00282498 3C 60 80 5B */ lis r3, lbl_805A8BA0@ha
/* 8028553C 0028249C C0 63 8B A0 */ lfs f3, lbl_805A8BA0@l(r3)
/* 80285538 00282498 3C 60 80 5B */ lis r3, __float_nan@ha
/* 8028553C 0028249C C0 63 8B A0 */ lfs f3, __float_nan@l(r3)
/* 80285540 002824A0 48 00 00 0C */ b lbl_8028554C
lbl_80285544:
/* 80285544 002824A4 3C 60 80 5B */ lis r3, lbl_805A8BA4@ha
/* 80285548 002824A8 C0 63 8B A4 */ lfs f3, lbl_805A8BA4@l(r3)
/* 80285544 002824A4 3C 60 80 5B */ lis r3, __float_huge@ha
/* 80285548 002824A8 C0 63 8B A4 */ lfs f3, __float_huge@l(r3)
lbl_8028554C:
/* 8028554C 002824AC FF E0 18 18 */ frsp f31, f3
/* 80285550 002824B0 80 7E 08 8C */ lwz r3, 0x88c(r30)

View File

@ -2958,12 +2958,12 @@ lbl_802180D0:
lbl_802180DC:
/* 802180DC 0021503C FC 04 00 00 */ fcmpu cr0, f4, f0
/* 802180E0 00215040 41 82 00 10 */ beq lbl_802180F0
/* 802180E4 00215044 3C 60 80 5B */ lis r3, lbl_805A8BA0@ha
/* 802180E8 00215048 C0 03 8B A0 */ lfs f0, lbl_805A8BA0@l(r3)
/* 802180E4 00215044 3C 60 80 5B */ lis r3, __float_nan@ha
/* 802180E8 00215048 C0 03 8B A0 */ lfs f0, __float_nan@l(r3)
/* 802180EC 0021504C 48 00 00 0C */ b lbl_802180F8
lbl_802180F0:
/* 802180F0 00215050 3C 60 80 5B */ lis r3, lbl_805A8BA4@ha
/* 802180F4 00215054 C0 03 8B A4 */ lfs f0, lbl_805A8BA4@l(r3)
/* 802180F0 00215050 3C 60 80 5B */ lis r3, __float_huge@ha
/* 802180F4 00215054 C0 03 8B A4 */ lfs f0, __float_huge@l(r3)
lbl_802180F8:
/* 802180F8 00215058 FC 20 00 18 */ frsp f1, f0
/* 802180FC 0021505C C0 02 B3 B0 */ lfs f0, lbl_805AD0D0@sda21(r2)
@ -3248,12 +3248,12 @@ lbl_80218518:
lbl_80218524:
/* 80218524 00215484 FC 04 00 00 */ fcmpu cr0, f4, f0
/* 80218528 00215488 41 82 00 10 */ beq lbl_80218538
/* 8021852C 0021548C 3C 60 80 5B */ lis r3, lbl_805A8BA0@ha
/* 80218530 00215490 C0 03 8B A0 */ lfs f0, lbl_805A8BA0@l(r3)
/* 8021852C 0021548C 3C 60 80 5B */ lis r3, __float_nan@ha
/* 80218530 00215490 C0 03 8B A0 */ lfs f0, __float_nan@l(r3)
/* 80218534 00215494 48 00 00 0C */ b lbl_80218540
lbl_80218538:
/* 80218538 00215498 3C 60 80 5B */ lis r3, lbl_805A8BA4@ha
/* 8021853C 0021549C C0 03 8B A4 */ lfs f0, lbl_805A8BA4@l(r3)
/* 80218538 00215498 3C 60 80 5B */ lis r3, __float_huge@ha
/* 8021853C 0021549C C0 03 8B A4 */ lfs f0, __float_huge@l(r3)
lbl_80218540:
/* 80218540 002154A0 FC 20 00 18 */ frsp f1, f0
/* 80218544 002154A4 C0 02 B3 B0 */ lfs f0, lbl_805AD0D0@sda21(r2)

View File

@ -2,8 +2,8 @@
.section .sbss
.balign 8
.global lbl_805A99D0
lbl_805A99D0:
.global errno
errno:
.skip 0x8
.section .text, "ax"
@ -39,7 +39,7 @@ _fseek:
lbl_8038D4C8:
/* 8038D4C8 0038A428 38 00 00 28 */ li r0, 0x28
/* 8038D4CC 0038A42C 38 60 FF FF */ li r3, -1
/* 8038D4D0 0038A430 90 0D AE 10 */ stw r0, lbl_805A99D0@sda21(r13)
/* 8038D4D0 0038A430 90 0D AE 10 */ stw r0, errno@sda21(r13)
/* 8038D4D4 0038A434 48 00 01 DC */ b lbl_8038D6B0
lbl_8038D4D8:
/* 8038D4D8 0038A438 88 1E 00 08 */ lbz r0, 8(r30)
@ -56,7 +56,7 @@ lbl_8038D4D8:
/* 8038D504 0038A464 38 00 00 28 */ li r0, 0x28
/* 8038D508 0038A468 38 60 FF FF */ li r3, -1
/* 8038D50C 0038A46C 90 9E 00 28 */ stw r4, 0x28(r30)
/* 8038D510 0038A470 90 0D AE 10 */ stw r0, lbl_805A99D0@sda21(r13)
/* 8038D510 0038A470 90 0D AE 10 */ stw r0, errno@sda21(r13)
/* 8038D514 0038A474 48 00 01 9C */ b lbl_8038D6B0
lbl_8038D518:
/* 8038D518 0038A478 2C 1F 00 01 */ cmpwi r31, 1
@ -75,7 +75,7 @@ lbl_8038D53C:
lbl_8038D548:
/* 8038D548 0038A4A8 38 00 00 28 */ li r0, 0x28
/* 8038D54C 0038A4AC 38 60 FF FF */ li r3, -1
/* 8038D550 0038A4B0 90 0D AE 10 */ stw r0, lbl_805A99D0@sda21(r13)
/* 8038D550 0038A4B0 90 0D AE 10 */ stw r0, errno@sda21(r13)
/* 8038D554 0038A4B4 48 00 00 3C */ b lbl_8038D590
lbl_8038D558:
/* 8038D558 0038A4B8 88 1E 00 08 */ lbz r0, 8(r30)
@ -164,7 +164,7 @@ lbl_8038D640:
/* 8038D684 0038A5E4 38 00 00 28 */ li r0, 0x28
/* 8038D688 0038A5E8 38 60 FF FF */ li r3, -1
/* 8038D68C 0038A5EC 90 9E 00 28 */ stw r4, 0x28(r30)
/* 8038D690 0038A5F0 90 0D AE 10 */ stw r0, lbl_805A99D0@sda21(r13)
/* 8038D690 0038A5F0 90 0D AE 10 */ stw r0, errno@sda21(r13)
/* 8038D694 0038A5F4 48 00 00 1C */ b lbl_8038D6B0
lbl_8038D698:
/* 8038D698 0038A5F8 38 60 00 00 */ li r3, 0
@ -197,7 +197,7 @@ lbl_8038D6E0:
lbl_8038D6EC:
/* 8038D6EC 0038A64C 38 00 00 28 */ li r0, 0x28
/* 8038D6F0 0038A650 38 60 FF FF */ li r3, -1
/* 8038D6F4 0038A654 90 0D AE 10 */ stw r0, lbl_805A99D0@sda21(r13)
/* 8038D6F4 0038A654 90 0D AE 10 */ stw r0, errno@sda21(r13)
/* 8038D6F8 0038A658 4E 80 00 20 */ blr
lbl_8038D6FC:
/* 8038D6FC 0038A65C 88 03 00 08 */ lbz r0, 8(r3)

View File

@ -193,11 +193,11 @@ lbl_extabindex:
.4byte 0x000000B8
.4byte __partial_array_destructor_extab
.global lbl_80003604
lbl_80003604:
.global _eti_init_info_
_eti_init_info_:
# ROM: 0x3C8184
.4byte lbl_extabindex
.4byte lbl_80003604
.4byte _eti_init_info_
.4byte __destroy_arr
.4byte 0x00000228
.4byte 0

View File

@ -33,9 +33,9 @@ __init_cpp_exceptions:
/* 8038A130 00387090 2C 00 FF FE */ cmpwi r0, -2
/* 8038A134 00387094 40 82 00 1C */ bne lbl_8038A150
/* 8038A138 00387098 4B FF FF AD */ bl GetR2__Fv
/* 8038A13C 0038709C 3C A0 80 00 */ lis r5, lbl_80003604@ha
/* 8038A13C 0038709C 3C A0 80 00 */ lis r5, _eti_init_info_@ha
/* 8038A140 003870A0 7C 64 1B 78 */ mr r4, r3
/* 8038A144 003870A4 38 65 36 04 */ addi r3, r5, lbl_80003604@l
/* 8038A144 003870A4 38 65 36 04 */ addi r3, r5, _eti_init_info_@l
/* 8038A148 003870A8 48 00 00 4D */ bl __register_fragment
/* 8038A14C 003870AC 90 6D 9F C8 */ stw r3, fragmentID@sda21(r13)
lbl_8038A150:
@ -62,4 +62,3 @@ __fini_cpp_exceptions_reference:
.balign 8
fragmentID:
.4byte 0xFFFFFFFE
.4byte 0

View File

@ -2,21 +2,19 @@
.section .bss
.balign 8
.lcomm lbl_80542198, 0x100, 4
.lcomm __atexit_funcs, 0x100, 4
.section .sbss
.balign 8
.global lbl_805A99B8
lbl_805A99B8:
.global __aborting
__aborting:
.skip 0x4
.global lbl_805A99BC
lbl_805A99BC:
__atexit_curr_func:
.skip 0x4
.global lbl_805A99C0
lbl_805A99C0:
.global __stdio_exit
__stdio_exit:
.skip 0x4
.global lbl_805A99C4
lbl_805A99C4:
__console_exit:
.skip 0x4
.section .text, "ax"
@ -27,7 +25,7 @@ exit:
/* 8038A1CC 0038712C 7C 08 02 A6 */ mflr r0
/* 8038A1D0 00387130 90 01 00 14 */ stw r0, 0x14(r1)
/* 8038A1D4 00387134 93 E1 00 0C */ stw r31, 0xc(r1)
/* 8038A1D8 00387138 80 0D AD F8 */ lwz r0, lbl_805A99B8@sda21(r13)
/* 8038A1D8 00387138 80 0D AD F8 */ lwz r0, __aborting@sda21(r13)
/* 8038A1DC 0038713C 2C 00 00 00 */ cmpwi r0, 0
/* 8038A1E0 00387140 40 82 00 4C */ bne lbl_8038A22C
/* 8038A1E4 00387144 4B FF F4 61 */ bl __destroy_global_chain
@ -43,36 +41,36 @@ lbl_8038A204:
/* 8038A204 00387164 81 9F 00 00 */ lwz r12, 0(r31)
/* 8038A208 00387168 28 0C 00 00 */ cmplwi r12, 0
/* 8038A20C 0038716C 40 82 FF EC */ bne lbl_8038A1F8
/* 8038A210 00387170 81 8D AE 00 */ lwz r12, lbl_805A99C0@sda21(r13)
/* 8038A210 00387170 81 8D AE 00 */ lwz r12, __stdio_exit@sda21(r13)
/* 8038A214 00387174 28 0C 00 00 */ cmplwi r12, 0
/* 8038A218 00387178 41 82 00 14 */ beq lbl_8038A22C
/* 8038A21C 0038717C 7D 89 03 A6 */ mtctr r12
/* 8038A220 00387180 4E 80 04 21 */ bctrl
/* 8038A224 00387184 38 00 00 00 */ li r0, 0
/* 8038A228 00387188 90 0D AE 00 */ stw r0, lbl_805A99C0@sda21(r13)
/* 8038A228 00387188 90 0D AE 00 */ stw r0, __stdio_exit@sda21(r13)
lbl_8038A22C:
/* 8038A22C 0038718C 3C 60 80 54 */ lis r3, lbl_80542198@ha
/* 8038A230 00387190 3B E3 21 98 */ addi r31, r3, lbl_80542198@l
/* 8038A22C 0038718C 3C 60 80 54 */ lis r3, __atexit_funcs@ha
/* 8038A230 00387190 3B E3 21 98 */ addi r31, r3, __atexit_funcs@l
/* 8038A234 00387194 48 00 00 20 */ b lbl_8038A254
lbl_8038A238:
/* 8038A238 00387198 80 6D AD FC */ lwz r3, lbl_805A99BC@sda21(r13)
/* 8038A238 00387198 80 6D AD FC */ lwz r3, __atexit_curr_func@sda21(r13)
/* 8038A23C 0038719C 38 63 FF FF */ addi r3, r3, -1
/* 8038A240 003871A0 54 60 10 3A */ slwi r0, r3, 2
/* 8038A244 003871A4 90 6D AD FC */ stw r3, lbl_805A99BC@sda21(r13)
/* 8038A244 003871A4 90 6D AD FC */ stw r3, __atexit_curr_func@sda21(r13)
/* 8038A248 003871A8 7D 9F 00 2E */ lwzx r12, r31, r0
/* 8038A24C 003871AC 7D 89 03 A6 */ mtctr r12
/* 8038A250 003871B0 4E 80 04 21 */ bctrl
lbl_8038A254:
/* 8038A254 003871B4 80 0D AD FC */ lwz r0, lbl_805A99BC@sda21(r13)
/* 8038A254 003871B4 80 0D AD FC */ lwz r0, __atexit_curr_func@sda21(r13)
/* 8038A258 003871B8 2C 00 00 00 */ cmpwi r0, 0
/* 8038A25C 003871BC 41 81 FF DC */ bgt lbl_8038A238
/* 8038A260 003871C0 81 8D AE 04 */ lwz r12, lbl_805A99C4@sda21(r13)
/* 8038A260 003871C0 81 8D AE 04 */ lwz r12, __console_exit@sda21(r13)
/* 8038A264 003871C4 28 0C 00 00 */ cmplwi r12, 0
/* 8038A268 003871C8 41 82 00 14 */ beq lbl_8038A27C
/* 8038A26C 003871CC 7D 89 03 A6 */ mtctr r12
/* 8038A270 003871D0 4E 80 04 21 */ bctrl
/* 8038A274 003871D4 38 00 00 00 */ li r0, 0
/* 8038A278 003871D8 90 0D AE 04 */ stw r0, lbl_805A99C4@sda21(r13)
/* 8038A278 003871D8 90 0D AE 04 */ stw r0, __console_exit@sda21(r13)
lbl_8038A27C:
/* 8038A27C 003871DC 4B FF B6 1D */ bl _ExitProcess
/* 8038A280 003871E0 80 01 00 14 */ lwz r0, 0x14(r1)

View File

@ -1,5 +1,205 @@
.include "macros.inc"
.section .data, "wa"
.balign 8
.global lbl_803F2778
lbl_803F2778:
# ROM: 0x3EF778
.4byte 0
.4byte 0x0A800000
.4byte 0
.4byte 0
.4byte 0
.4byte 0
.4byte 0
.4byte stdin_buff
.4byte 0x00000100
.4byte stdin_buff
.4byte 0
.4byte 0
.4byte 0
.4byte 0
.4byte 0
.4byte __read_console
.4byte __write_console
.4byte __close_console
.4byte 0
.4byte lbl_803F27C8
.global lbl_803F27C8
lbl_803F27C8:
# ROM: 0x3EF7C8
.4byte 0x00000001
.4byte 0x12800000
.4byte 0
.4byte 0
.4byte 0
.4byte 0
.4byte 0
.4byte stdout_buff
.4byte 0x00000100
.4byte stdout_buff
.4byte 0
.4byte 0
.4byte 0
.4byte 0
.4byte 0
.4byte __read_console
.4byte __write_console
.4byte __close_console
.4byte 0
.4byte lbl_803F2818
.global lbl_803F2818
lbl_803F2818:
# ROM: 0x3EF818
.4byte 0x00000002
.4byte 0x10800000
.4byte 0
.4byte 0
.4byte 0
.4byte 0
.4byte 0
.4byte stderr_buff
.4byte 0x00000100
.4byte stderr_buff
.4byte 0
.4byte 0
.4byte 0
.4byte 0
.4byte 0
.4byte __read_console
.4byte __write_console
.4byte __close_console
.4byte 0
.4byte lbl_803F2868
.global lbl_803F2868
lbl_803F2868:
# ROM: 0x3EF868
.4byte 0
.4byte 0
.4byte 0
.4byte 0
.4byte 0
.4byte 0
.4byte 0
.4byte 0
.4byte 0
.4byte 0
.4byte 0
.4byte 0
.4byte 0
.4byte 0
.4byte 0
.4byte 0
.4byte 0
.4byte 0
.4byte 0
.4byte 0
.global lbl_803F28B8
lbl_803F28B8:
# ROM: 0x3EF8B8
.4byte 0x40240000
.4byte 0
.4byte 0x40590000
.4byte 0
.4byte 0x408F4000
.4byte 0
.4byte 0x40C38800
.4byte 0
.4byte 0x40F86A00
.4byte 0
.4byte 0x412E8480
.4byte 0
.4byte 0x416312D0
.4byte 0
.4byte 0x4197D784
.4byte 0
.global lbl_803F28F8
lbl_803F28F8:
# ROM: 0x3EF8F8
.4byte lbl_8038C62C
.4byte lbl_8038C824
.4byte lbl_8038C824
.4byte lbl_8038C824
.4byte lbl_8038C824
.4byte lbl_8038C824
.4byte lbl_8038C824
.4byte lbl_8038C824
.4byte lbl_8038C824
.4byte lbl_8038C824
.4byte lbl_8038C824
.4byte lbl_8038C644
.4byte lbl_8038C824
.4byte lbl_8038C824
.4byte lbl_8038C824
.4byte lbl_8038C824
.4byte lbl_8038C824
.4byte lbl_8038C824
.4byte lbl_8038C824
.4byte lbl_8038C824
.4byte lbl_8038C824
.4byte lbl_8038C824
.4byte lbl_8038C824
.4byte lbl_8038C824
.4byte lbl_8038C824
.4byte lbl_8038C824
.4byte lbl_8038C824
.4byte lbl_8038C824
.4byte lbl_8038C824
.4byte lbl_8038C824
.4byte lbl_8038C824
.4byte lbl_8038C824
.4byte lbl_8038C65C
.4byte lbl_8038C824
.4byte lbl_8038C824
.4byte lbl_8038C824
.4byte lbl_8038C824
.4byte lbl_8038C824
.4byte lbl_8038C824
.4byte lbl_8038C824
.4byte lbl_8038C824
.4byte lbl_8038C824
.4byte lbl_8038C824
.4byte lbl_8038C824
.4byte lbl_8038C824
.4byte lbl_8038C824
.4byte lbl_8038C824
.4byte lbl_8038C824
.4byte lbl_8038C674
.4byte lbl_8038C824
.4byte lbl_8038C824
.4byte lbl_8038C824
.4byte lbl_8038C824
.4byte lbl_8038C824
.4byte lbl_8038C824
.4byte lbl_8038C824
.4byte lbl_8038C68C
.4byte lbl_8038C6A4
.4byte lbl_8038C6BC
.4byte lbl_8038C6D4
.4byte lbl_8038C6EC
.4byte lbl_8038C704
.4byte lbl_8038C71C
.4byte lbl_8038C734
.4byte lbl_8038C74C
.4byte lbl_8038C764
.4byte lbl_8038C77C
.4byte lbl_8038C794
.4byte lbl_8038C7AC
.4byte lbl_8038C7C4
.4byte lbl_8038C7DC
.4byte lbl_8038C7F4
.4byte lbl_8038C80C
.4byte 0
.section .rodata
.balign 8
.global lbl_803D85D8
@ -32,19 +232,6 @@ lbl_803D85D8:
.4byte 0x00323536
.4byte 0
.global lbl_803D86B8
lbl_803D86B8:
# ROM: 0x3D56B8
.2byte 0x2E00
.global lbl_803D86BA
lbl_803D86BA:
# ROM: 0x3D56BA
.byte 0x00, 0x43
.4byte 0
.section .text, "ax"
.global __dec2num
@ -96,8 +283,8 @@ lbl_8038B240:
/* 8038B244 003881A4 48 00 08 A0 */ b lbl_8038BAE4
lbl_8038B248:
/* 8038B248 003881A8 88 03 00 00 */ lbz r0, 0(r3)
/* 8038B24C 003881AC 3C 60 80 5B */ lis r3, lbl_805A8BA4@ha
/* 8038B250 003881B0 C0 23 8B A4 */ lfs f1, lbl_805A8BA4@l(r3)
/* 8038B24C 003881AC 3C 60 80 5B */ lis r3, __float_huge@ha
/* 8038B250 003881B0 C0 23 8B A4 */ lfs f1, __float_huge@l(r3)
/* 8038B254 003881B4 7C 00 07 75 */ extsb. r0, r0
/* 8038B258 003881B8 40 82 00 0C */ bne lbl_8038B264
/* 8038B25C 003881BC C8 42 CF 48 */ lfd f2, lbl_805AEC68@sda21(r2)
@ -137,9 +324,9 @@ lbl_8038B2BC:
/* 8038B2D0 00388230 40 81 00 08 */ ble lbl_8038B2D8
/* 8038B2D4 00388234 38 C0 00 0E */ li r6, 0xe
lbl_8038B2D8:
/* 8038B2D8 00388238 3C 80 80 3F */ lis r4, lbl_803F2A20@ha
/* 8038B2D8 00388238 3C 80 80 3F */ lis r4, __ctype_map@ha
/* 8038B2DC 0038823C 38 06 FF FF */ addi r0, r6, -1
/* 8038B2E0 00388240 38 A4 2A 20 */ addi r5, r4, lbl_803F2A20@l
/* 8038B2E0 00388240 38 A4 2A 20 */ addi r5, r4, __ctype_map@l
/* 8038B2E4 00388244 39 40 00 01 */ li r10, 1
/* 8038B2E8 00388248 7C 09 03 A6 */ mtctr r0
/* 8038B2EC 0038824C 2C 06 00 01 */ cmpwi r6, 1
@ -158,8 +345,8 @@ lbl_8038B310:
/* 8038B318 00388278 38 80 FF FF */ li r4, -1
/* 8038B31C 0038827C 48 00 00 10 */ b lbl_8038B32C
lbl_8038B320:
/* 8038B320 00388280 3C 80 80 3F */ lis r4, lbl_803F2B20@ha
/* 8038B324 00388284 38 84 2B 20 */ addi r4, r4, lbl_803F2B20@l
/* 8038B320 00388280 3C 80 80 3F */ lis r4, __lower_map@ha
/* 8038B324 00388284 38 84 2B 20 */ addi r4, r4, __lower_map@l
/* 8038B328 00388288 7C 84 30 AE */ lbzx r4, r4, r6
lbl_8038B32C:
/* 8038B32C 0038828C 38 04 FF A9 */ addi r0, r4, -87
@ -442,8 +629,8 @@ lbl_8038B6E4:
/* 8038B708 00388668 48 00 0C D9 */ bl __less_dec
/* 8038B70C 0038866C 2C 03 00 00 */ cmpwi r3, 0
/* 8038B710 00388670 40 82 03 B8 */ bne lbl_8038BAC8
/* 8038B714 00388674 3C 60 80 5B */ lis r3, lbl_805A8BB0@ha
/* 8038B718 00388678 C8 03 8B B0 */ lfd f0, lbl_805A8BB0@l(r3)
/* 8038B714 00388674 3C 60 80 5B */ lis r3, __double_max@ha
/* 8038B718 00388678 C8 03 8B B0 */ lfd f0, __double_max@l(r3)
/* 8038B71C 0038867C D8 01 00 20 */ stfd f0, 0x20(r1)
lbl_8038B720:
/* 8038B720 00388680 C8 21 00 20 */ lfd f1, 0x20(r1)
@ -459,9 +646,9 @@ lbl_8038B720:
/* 8038B748 003886A8 48 00 0C 99 */ bl __less_dec
/* 8038B74C 003886AC 2C 03 00 00 */ cmpwi r3, 0
/* 8038B750 003886B0 41 82 02 44 */ beq lbl_8038B994
/* 8038B754 003886B4 3C 60 80 5B */ lis r3, lbl_805A8BA4@ha
/* 8038B754 003886B4 3C 60 80 5B */ lis r3, __float_huge@ha
/* 8038B758 003886B8 C8 21 00 20 */ lfd f1, 0x20(r1)
/* 8038B75C 003886BC C0 43 8B A4 */ lfs f2, lbl_805A8BA4@l(r3)
/* 8038B75C 003886BC C0 43 8B A4 */ lfs f2, __float_huge@l(r3)
/* 8038B760 003886C0 48 00 91 F9 */ bl nextafter
/* 8038B764 003886C4 FF E0 08 90 */ fmr f31, f1
/* 8038B768 003886C8 3C 00 7F F0 */ lis r0, 0x7ff0
@ -509,9 +696,9 @@ lbl_8038B7EC:
/* 8038B7EC 0038874C FC 20 F8 90 */ fmr f1, f31
/* 8038B7F0 00388750 38 61 01 0C */ addi r3, r1, 0x10c
/* 8038B7F4 00388754 48 00 04 B5 */ bl __num2dec_internal
/* 8038B7F8 00388758 3C 60 80 5B */ lis r3, lbl_805A8BA4@ha
/* 8038B7F8 00388758 3C 60 80 5B */ lis r3, __float_huge@ha
/* 8038B7FC 0038875C 3F E0 7F F0 */ lis r31, 0x7ff0
/* 8038B800 00388760 3B C3 8B A4 */ addi r30, r3, lbl_805A8BA4@l
/* 8038B800 00388760 3B C3 8B A4 */ addi r30, r3, __float_huge@l
/* 8038B804 00388764 48 00 00 FC */ b lbl_8038B900
lbl_8038B808:
/* 8038B808 00388768 81 81 01 0C */ lwz r12, 0x10c(r1)
@ -625,16 +812,16 @@ lbl_8038B978:
/* 8038B98C 003888EC DB E1 00 20 */ stfd f31, 0x20(r1)
/* 8038B990 003888F0 48 00 01 38 */ b lbl_8038BAC8
lbl_8038B994:
/* 8038B994 003888F4 3C 60 80 5B */ lis r3, lbl_805A8BA4@ha
/* 8038B994 003888F4 3C 60 80 5B */ lis r3, __float_huge@ha
/* 8038B998 003888F8 C8 21 00 20 */ lfd f1, 0x20(r1)
/* 8038B99C 003888FC C0 03 8B A4 */ lfs f0, lbl_805A8BA4@l(r3)
/* 8038B99C 003888FC C0 03 8B A4 */ lfs f0, __float_huge@l(r3)
/* 8038B9A0 00388900 FC 40 00 50 */ fneg f2, f0
/* 8038B9A4 00388904 48 00 8F B5 */ bl nextafter
/* 8038B9A8 00388908 FF E0 08 90 */ fmr f31, f1
/* 8038B9AC 0038890C 38 61 00 88 */ addi r3, r1, 0x88
/* 8038B9B0 00388910 48 00 02 F9 */ bl __num2dec_internal
/* 8038B9B4 00388914 3C 60 80 5B */ lis r3, lbl_805A8BA4@ha
/* 8038B9B8 00388918 3B E3 8B A4 */ addi r31, r3, lbl_805A8BA4@l
/* 8038B9B4 00388914 3C 60 80 5B */ lis r3, __float_huge@ha
/* 8038B9B8 00388918 3B E3 8B A4 */ addi r31, r3, __float_huge@l
/* 8038B9BC 0038891C 48 00 00 7C */ b lbl_8038BA38
lbl_8038B9C0:
/* 8038B9C0 00388920 C0 1F 00 00 */ lfs f0, 0(r31)

View File

@ -1,5 +1,212 @@
.include "macros.inc"
.section .data, "wa"
.balign 8
.global __ctype_map
__ctype_map:
# ROM: 0x3EFA20
.4byte 0x01010101
.4byte 0x01010101
.4byte 0x01020202
.4byte 0x02020101
.4byte 0x01010101
.4byte 0x01010101
.4byte 0x01010101
.4byte 0x01010101
.4byte 0x04080808
.4byte 0x08080808
.4byte 0x08080808
.4byte 0x08080808
.4byte 0x30303030
.4byte 0x30303030
.4byte 0x30300808
.4byte 0x08080808
.4byte 0x08A0A0A0
.4byte 0xA0A0A080
.4byte 0x80808080
.4byte 0x80808080
.4byte 0x80808080
.4byte 0x80808080
.4byte 0x80808008
.4byte 0x08080808
.4byte 0x08606060
.4byte 0x60606040
.4byte 0x40404040
.4byte 0x40404040
.4byte 0x40404040
.4byte 0x40404040
.4byte 0x40404008
.4byte 0x08080801
.4byte 0
.4byte 0
.4byte 0
.4byte 0
.4byte 0
.4byte 0
.4byte 0
.4byte 0
.4byte 0
.4byte 0
.4byte 0
.4byte 0
.4byte 0
.4byte 0
.4byte 0
.4byte 0
.4byte 0
.4byte 0
.4byte 0
.4byte 0
.4byte 0
.4byte 0
.4byte 0
.4byte 0
.4byte 0
.4byte 0
.4byte 0
.4byte 0
.4byte 0
.4byte 0
.4byte 0
.4byte 0
.global __lower_map
__lower_map:
# ROM: 0x3EFB20
.4byte 0x00010203
.4byte 0x04050607
.4byte 0x08090A0B
.4byte 0x0C0D0E0F
.4byte 0x10111213
.4byte 0x14151617
.4byte 0x18191A1B
.4byte 0x1C1D1E1F
.4byte 0x20212223
.4byte 0x24252627
.4byte 0x28292A2B
.4byte 0x2C2D2E2F
.4byte 0x30313233
.4byte 0x34353637
.4byte 0x38393A3B
.4byte 0x3C3D3E3F
.4byte 0x40616263
.4byte 0x64656667
.4byte 0x68696A6B
.4byte 0x6C6D6E6F
.4byte 0x70717273
.4byte 0x74757677
.4byte 0x78797A5B
.4byte 0x5C5D5E5F
.4byte 0x60616263
.4byte 0x64656667
.4byte 0x68696A6B
.4byte 0x6C6D6E6F
.4byte 0x70717273
.4byte 0x74757677
.4byte 0x78797A7B
.4byte 0x7C7D7E7F
.4byte 0x80818283
.4byte 0x84858687
.4byte 0x88898A8B
.4byte 0x8C8D8E8F
.4byte 0x90919293
.4byte 0x94959697
.4byte 0x98999A9B
.4byte 0x9C9D9E9F
.4byte 0xA0A1A2A3
.4byte 0xA4A5A6A7
.4byte 0xA8A9AAAB
.4byte 0xACADAEAF
.4byte 0xB0B1B2B3
.4byte 0xB4B5B6B7
.4byte 0xB8B9BABB
.4byte 0xBCBDBEBF
.4byte 0xC0C1C2C3
.4byte 0xC4C5C6C7
.4byte 0xC8C9CACB
.4byte 0xCCCDCECF
.4byte 0xD0D1D2D3
.4byte 0xD4D5D6D7
.4byte 0xD8D9DADB
.4byte 0xDCDDDEDF
.4byte 0xE0E1E2E3
.4byte 0xE4E5E6E7
.4byte 0xE8E9EAEB
.4byte 0xECEDEEEF
.4byte 0xF0F1F2F3
.4byte 0xF4F5F6F7
.4byte 0xF8F9FAFB
.4byte 0xFCFDFEFF
.global __upper_map
__upper_map:
# ROM: 0x3EFC20
.4byte 0x00010203
.4byte 0x04050607
.4byte 0x08090A0B
.4byte 0x0C0D0E0F
.4byte 0x10111213
.4byte 0x14151617
.4byte 0x18191A1B
.4byte 0x1C1D1E1F
.4byte 0x20212223
.4byte 0x24252627
.4byte 0x28292A2B
.4byte 0x2C2D2E2F
.4byte 0x30313233
.4byte 0x34353637
.4byte 0x38393A3B
.4byte 0x3C3D3E3F
.4byte 0x40414243
.4byte 0x44454647
.4byte 0x48494A4B
.4byte 0x4C4D4E4F
.4byte 0x50515253
.4byte 0x54555657
.4byte 0x58595A5B
.4byte 0x5C5D5E5F
.4byte 0x60414243
.4byte 0x44454647
.4byte 0x48494A4B
.4byte 0x4C4D4E4F
.4byte 0x50515253
.4byte 0x54555657
.4byte 0x58595A7B
.4byte 0x7C7D7E7F
.4byte 0x80818283
.4byte 0x84858687
.4byte 0x88898A8B
.4byte 0x8C8D8E8F
.4byte 0x90919293
.4byte 0x94959697
.4byte 0x98999A9B
.4byte 0x9C9D9E9F
.4byte 0xA0A1A2A3
.4byte 0xA4A5A6A7
.4byte 0xA8A9AAAB
.4byte 0xACADAEAF
.4byte 0xB0B1B2B3
.4byte 0xB4B5B6B7
.4byte 0xB8B9BABB
.4byte 0xBCBDBEBF
.4byte 0xC0C1C2C3
.4byte 0xC4C5C6C7
.4byte 0xC8C9CACB
.4byte 0xCCCDCECF
.4byte 0xD0D1D2D3
.4byte 0xD4D5D6D7
.4byte 0xD8D9DADB
.4byte 0xDCDDDEDF
.4byte 0xE0E1E2E3
.4byte 0xE4E5E6E7
.4byte 0xE8E9EAEB
.4byte 0xECEDEEEF
.4byte 0xF0F1F2F3
.4byte 0xF4F5F6F7
.4byte 0xF8F9FAFB
.4byte 0xFCFDFEFF
.section .text, "ax"
.global tolower
@ -9,8 +216,8 @@ tolower:
/* 8038CF2C 00389E8C 38 60 FF FF */ li r3, -1
/* 8038CF30 00389E90 4E 80 00 20 */ blr
lbl_8038CF34:
/* 8038CF34 00389E94 3C 80 80 3F */ lis r4, lbl_803F2B20@ha
/* 8038CF34 00389E94 3C 80 80 3F */ lis r4, __lower_map@ha
/* 8038CF38 00389E98 54 60 06 3E */ clrlwi r0, r3, 0x18
/* 8038CF3C 00389E9C 38 64 2B 20 */ addi r3, r4, lbl_803F2B20@l
/* 8038CF3C 00389E9C 38 64 2B 20 */ addi r3, r4, __lower_map@l
/* 8038CF40 00389EA0 7C 63 00 AE */ lbzx r3, r3, r0
/* 8038CF44 00389EA4 4E 80 00 20 */ blr

View File

@ -23,8 +23,8 @@ lbl_80391404:
/* 80391404 0038E364 C8 22 CF A0 */ lfd f1, lbl_805AECC0@sda21(r2)
/* 80391408 0038E368 48 00 02 C8 */ b lbl_803916D0
lbl_8039140C:
/* 8039140C 0038E36C 3C 60 80 5B */ lis r3, lbl_805A8BA0@ha
/* 80391410 0038E370 C0 23 8B A0 */ lfs f1, lbl_805A8BA0@l(r3)
/* 8039140C 0038E36C 3C 60 80 5B */ lis r3, __float_nan@ha
/* 80391410 0038E370 C0 23 8B A0 */ lfs f1, __float_nan@l(r3)
/* 80391414 0038E374 48 00 02 BC */ b lbl_803916D0
lbl_80391418:
/* 80391418 0038E378 3C 00 3F E0 */ lis r0, 0x3fe0
@ -122,12 +122,12 @@ lbl_80391570:
lbl_8039157C:
/* 8039157C 0038E4DC FC 01 58 00 */ fcmpu cr0, f1, f11
/* 80391580 0038E4E0 41 82 00 10 */ beq lbl_80391590
/* 80391584 0038E4E4 3C 60 80 5B */ lis r3, lbl_805A8BA0@ha
/* 80391588 0038E4E8 C1 63 8B A0 */ lfs f11, lbl_805A8BA0@l(r3)
/* 80391584 0038E4E4 3C 60 80 5B */ lis r3, __float_nan@ha
/* 80391588 0038E4E8 C1 63 8B A0 */ lfs f11, __float_nan@l(r3)
/* 8039158C 0038E4EC 48 00 00 0C */ b lbl_80391598
lbl_80391590:
/* 80391590 0038E4F0 3C 60 80 5B */ lis r3, lbl_805A8BA4@ha
/* 80391594 0038E4F4 C1 63 8B A4 */ lfs f11, lbl_805A8BA4@l(r3)
/* 80391590 0038E4F0 3C 60 80 5B */ lis r3, __float_huge@ha
/* 80391594 0038E4F4 C1 63 8B A4 */ lfs f11, __float_huge@l(r3)
lbl_80391598:
/* 80391598 0038E4F8 FC 45 30 24 */ fdiv f2, f5, f6
/* 8039159C 0038E4FC C8 22 CF B0 */ lfd f1, lbl_805AECD0@sda21(r2)
@ -172,12 +172,12 @@ lbl_80391624:
lbl_80391630:
/* 80391630 0038E590 FC 00 48 00 */ fcmpu cr0, f0, f9
/* 80391634 0038E594 41 82 00 10 */ beq lbl_80391644
/* 80391638 0038E598 3C 60 80 5B */ lis r3, lbl_805A8BA0@ha
/* 8039163C 0038E59C C1 23 8B A0 */ lfs f9, lbl_805A8BA0@l(r3)
/* 80391638 0038E598 3C 60 80 5B */ lis r3, __float_nan@ha
/* 8039163C 0038E59C C1 23 8B A0 */ lfs f9, __float_nan@l(r3)
/* 80391640 0038E5A0 48 00 00 0C */ b lbl_8039164C
lbl_80391644:
/* 80391644 0038E5A4 3C 60 80 5B */ lis r3, lbl_805A8BA4@ha
/* 80391648 0038E5A8 C1 23 8B A4 */ lfs f9, lbl_805A8BA4@l(r3)
/* 80391644 0038E5A4 3C 60 80 5B */ lis r3, __float_huge@ha
/* 80391648 0038E5A8 C1 23 8B A4 */ lfs f9, __float_huge@l(r3)
lbl_8039164C:
/* 8039164C 0038E5AC C8 42 CF E0 */ lfd f2, lbl_805AED00@sda21(r2)
/* 80391650 0038E5B0 38 00 00 00 */ li r0, 0

View File

@ -21,8 +21,8 @@ __ieee754_asin:
/* 80391710 0038E670 FC 22 00 7A */ fmadd f1, f2, f1, f0
/* 80391714 0038E674 48 00 02 20 */ b lbl_80391934
lbl_80391718:
/* 80391718 0038E678 3C 60 80 5B */ lis r3, lbl_805A8BA0@ha
/* 8039171C 0038E67C C0 23 8B A0 */ lfs f1, lbl_805A8BA0@l(r3)
/* 80391718 0038E678 3C 60 80 5B */ lis r3, __float_nan@ha
/* 8039171C 0038E67C C0 23 8B A0 */ lfs f1, __float_nan@l(r3)
/* 80391720 0038E680 48 00 02 14 */ b lbl_80391934
lbl_80391724:
/* 80391724 0038E684 3C 00 3F E0 */ lis r0, 0x3fe0
@ -123,12 +123,12 @@ lbl_80391884:
lbl_80391890:
/* 80391890 0038E7F0 FC 02 08 00 */ fcmpu cr0, f2, f1
/* 80391894 0038E7F4 41 82 00 10 */ beq lbl_803918A4
/* 80391898 0038E7F8 3C 60 80 5B */ lis r3, lbl_805A8BA0@ha
/* 8039189C 0038E7FC C0 23 8B A0 */ lfs f1, lbl_805A8BA0@l(r3)
/* 80391898 0038E7F8 3C 60 80 5B */ lis r3, __float_nan@ha
/* 8039189C 0038E7FC C0 23 8B A0 */ lfs f1, __float_nan@l(r3)
/* 803918A0 0038E800 48 00 00 0C */ b lbl_803918AC
lbl_803918A4:
/* 803918A4 0038E804 3C 60 80 5B */ lis r3, lbl_805A8BA4@ha
/* 803918A8 0038E808 C0 23 8B A4 */ lfs f1, lbl_805A8BA4@l(r3)
/* 803918A4 0038E804 3C 60 80 5B */ lis r3, __float_huge@ha
/* 803918A8 0038E808 C0 23 8B A4 */ lfs f1, __float_huge@l(r3)
lbl_803918AC:
/* 803918AC 0038E80C 3C 60 3F EF */ lis r3, 0x3FEF3333@ha
/* 803918B0 0038E810 38 03 33 33 */ addi r0, r3, 0x3FEF3333@l

View File

@ -31,7 +31,7 @@ lbl_80392160:
/* 80392168 0038F0C8 FC 21 08 28 */ fsub f1, f1, f1
/* 8039216C 0038F0CC C8 0D AE 20 */ lfd f0, lbl_805A99E0@sda21(r13)
/* 80392170 0038F0D0 38 00 00 21 */ li r0, 0x21
/* 80392174 0038F0D4 90 0D AE 10 */ stw r0, lbl_805A99D0@sda21(r13)
/* 80392174 0038F0D4 90 0D AE 10 */ stw r0, errno@sda21(r13)
/* 80392178 0038F0D8 FC 21 00 24 */ fdiv f1, f1, f0
/* 8039217C 0038F0DC 48 00 02 1C */ b lbl_80392398
lbl_80392180:

View File

@ -193,12 +193,12 @@ lbl_803925F4:
lbl_80392600:
/* 80392600 0038F560 FC 04 08 00 */ fcmpu cr0, f4, f1
/* 80392604 0038F564 41 82 00 10 */ beq lbl_80392614
/* 80392608 0038F568 3C 60 80 5B */ lis r3, lbl_805A8BA0@ha
/* 8039260C 0038F56C C0 23 8B A0 */ lfs f1, lbl_805A8BA0@l(r3)
/* 80392608 0038F568 3C 60 80 5B */ lis r3, __float_nan@ha
/* 8039260C 0038F56C C0 23 8B A0 */ lfs f1, __float_nan@l(r3)
/* 80392610 0038F570 48 00 05 F4 */ b lbl_80392C04
lbl_80392614:
/* 80392614 0038F574 3C 60 80 5B */ lis r3, lbl_805A8BA4@ha
/* 80392618 0038F578 C0 23 8B A4 */ lfs f1, lbl_805A8BA4@l(r3)
/* 80392614 0038F574 3C 60 80 5B */ lis r3, __float_huge@ha
/* 80392618 0038F578 C0 23 8B A4 */ lfs f1, __float_huge@l(r3)
/* 8039261C 0038F57C 48 00 05 E8 */ b lbl_80392C04
lbl_80392620:
/* 80392620 0038F580 C8 01 00 08 */ lfd f0, 8(r1)
@ -246,10 +246,10 @@ lbl_803926B0:
/* 803926B4 0038F614 38 63 00 01 */ addi r3, r3, 1
/* 803926B8 0038F618 7C 68 23 79 */ or. r8, r3, r4
/* 803926BC 0038F61C 40 82 00 18 */ bne lbl_803926D4
/* 803926C0 0038F620 3C 60 80 5B */ lis r3, lbl_805A8BA0@ha
/* 803926C0 0038F620 3C 60 80 5B */ lis r3, __float_nan@ha
/* 803926C4 0038F624 38 00 00 21 */ li r0, 0x21
/* 803926C8 0038F628 90 0D AE 10 */ stw r0, lbl_805A99D0@sda21(r13)
/* 803926CC 0038F62C C0 23 8B A0 */ lfs f1, lbl_805A8BA0@l(r3)
/* 803926C8 0038F628 90 0D AE 10 */ stw r0, errno@sda21(r13)
/* 803926CC 0038F62C C0 23 8B A0 */ lfs f1, __float_nan@l(r3)
/* 803926D0 0038F630 48 00 05 34 */ b lbl_80392C04
lbl_803926D4:
/* 803926D4 0038F634 3D 00 41 E0 */ lis r8, 0x41e0

44
asm/Runtime/float.s Normal file
View File

@ -0,0 +1,44 @@
.include "macros.inc"
.section .sdata, "wa"
.balign 8
.global __float_nan
__float_nan:
# ROM: 0x3F6540
.4byte 0x7FFFFFFF
.global __float_huge
__float_huge:
# ROM: 0x3F6544
.4byte 0x7F800000
.global __double_min
__double_min:
# ROM: 0x3F6548
.4byte 0x00100000
.4byte 0
.global __double_max
__double_max:
# ROM: 0x3F6550
.4byte 0x7FEFFFFF
.4byte 0xFFFFFFFF
.global __double_huge
__double_huge:
# ROM: 0x3F6558
.4byte 0x7FF00000
.4byte 0
.global __extended_min
__extended_min:
# ROM: 0x3F6560
.4byte 0x00100000
.4byte 0
.global __extended_max
__extended_max:
# ROM: 0x3F6568
.4byte 0x7FEFFFFF
.4byte 0xFFFFFFFF

39
asm/Runtime/locale.s Normal file
View File

@ -0,0 +1,39 @@
.include "macros.inc"
.section .data, "wa"
.balign 8
.global __lconv
__lconv:
# ROM: 0x3EFD20
.4byte lbl_803D86B8
.4byte lbl_803D86BA
.4byte lbl_803D86BA
.4byte lbl_803D86BA
.4byte lbl_803D86BA
.4byte lbl_803D86BA
.4byte lbl_803D86BA
.4byte lbl_803D86BA
.4byte lbl_803D86BA
.4byte 0x7F7F7F7F
.4byte 0x7F7F7F00
.4byte lbl_803D86BA
.4byte 0x7F7F7F7F
.4byte 0x7F7F7F00
.section .rodata
.balign 8
.global lbl_803D86B8
lbl_803D86B8:
# ROM: 0x3D56B8
.asciz "."
.global lbl_803D86BA
lbl_803D86BA:
# ROM: 0x3D56BA
.asciz ""
.asciz "C"
.balign 4

View File

@ -2,10 +2,9 @@
.section .text, "ax"
# THIS DOESN'T WORK????
# .global __stdio_atexit
# __stdio_atexit:
# /* 8038DCCC 0038AC2C 3C 60 80 39 */ lis r3, __close_all@ha
# /* 8038DCD0 0038AC30 38 03 B1 18 */ addi r0, r3, __close_all@l
# /* 8038DCD4 0038AC34 90 0D AE 00 */ stw r0, lbl_805A99C0@sda21(r13)
# /* 8038DCD8 0038AC38 4E 80 00 20 */ blr
.global __stdio_atexit
__stdio_atexit:
/* 8038DCCC 0038AC2C 3C 60 80 39 */ lis r3, __close_all@ha
/* 8038DCD0 0038AC30 38 03 B1 18 */ addi r0, r3, __close_all@l
/* 8038DCD4 0038AC34 90 0D AE 00 */ stw r0, __stdio_exit@sda21(r13)
/* 8038DCD8 0038AC38 4E 80 00 20 */ blr

View File

@ -19,425 +19,8 @@ lbl_803D86C0:
.section .data, "wa"
.balign 8
# TODO: Move these where they actually belong
.global lbl_803F2778
lbl_803F2778:
# ROM: 0x3EF778
.4byte 0
.4byte 0x0A800000
.4byte 0
.4byte 0
.4byte 0
.4byte 0
.4byte 0
.4byte stdin_buff
.4byte 0x00000100
.4byte stdin_buff
.4byte 0
.4byte 0
.4byte 0
.4byte 0
.4byte 0
.4byte __read_console
.4byte __write_console
.4byte __close_console
.4byte 0
.4byte lbl_803F27C8
.global lbl_803F27C8
lbl_803F27C8:
# ROM: 0x3EF7C8
.4byte 0x00000001
.4byte 0x12800000
.4byte 0
.4byte 0
.4byte 0
.4byte 0
.4byte 0
.4byte stdout_buff
.4byte 0x00000100
.4byte stdout_buff
.4byte 0
.4byte 0
.4byte 0
.4byte 0
.4byte 0
.4byte __read_console
.4byte __write_console
.4byte __close_console
.4byte 0
.4byte lbl_803F2818
.global lbl_803F2818
lbl_803F2818:
# ROM: 0x3EF818
.4byte 0x00000002
.4byte 0x10800000
.4byte 0
.4byte 0
.4byte 0
.4byte 0
.4byte 0
.4byte stderr_buff
.4byte 0x00000100
.4byte stderr_buff
.4byte 0
.4byte 0
.4byte 0
.4byte 0
.4byte 0
.4byte __read_console
.4byte __write_console
.4byte __close_console
.4byte 0
.4byte lbl_803F2868
.global lbl_803F2868
lbl_803F2868:
# ROM: 0x3EF868
.4byte 0
.4byte 0
.4byte 0
.4byte 0
.4byte 0
.4byte 0
.4byte 0
.4byte 0
.4byte 0
.4byte 0
.4byte 0
.4byte 0
.4byte 0
.4byte 0
.4byte 0
.4byte 0
.4byte 0
.4byte 0
.4byte 0
.4byte 0
.global lbl_803F28B8
lbl_803F28B8:
# ROM: 0x3EF8B8
.4byte 0x40240000
.4byte 0
.4byte 0x40590000
.4byte 0
.4byte 0x408F4000
.4byte 0
.4byte 0x40C38800
.4byte 0
.4byte 0x40F86A00
.4byte 0
.4byte 0x412E8480
.4byte 0
.4byte 0x416312D0
.4byte 0
.4byte 0x4197D784
.4byte 0
.global lbl_803F28F8
lbl_803F28F8:
# ROM: 0x3EF8F8
.4byte lbl_8038C62C
.4byte lbl_8038C824
.4byte lbl_8038C824
.4byte lbl_8038C824
.4byte lbl_8038C824
.4byte lbl_8038C824
.4byte lbl_8038C824
.4byte lbl_8038C824
.4byte lbl_8038C824
.4byte lbl_8038C824
.4byte lbl_8038C824
.4byte lbl_8038C644
.4byte lbl_8038C824
.4byte lbl_8038C824
.4byte lbl_8038C824
.4byte lbl_8038C824
.4byte lbl_8038C824
.4byte lbl_8038C824
.4byte lbl_8038C824
.4byte lbl_8038C824
.4byte lbl_8038C824
.4byte lbl_8038C824
.4byte lbl_8038C824
.4byte lbl_8038C824
.4byte lbl_8038C824
.4byte lbl_8038C824
.4byte lbl_8038C824
.4byte lbl_8038C824
.4byte lbl_8038C824
.4byte lbl_8038C824
.4byte lbl_8038C824
.4byte lbl_8038C824
.4byte lbl_8038C65C
.4byte lbl_8038C824
.4byte lbl_8038C824
.4byte lbl_8038C824
.4byte lbl_8038C824
.4byte lbl_8038C824
.4byte lbl_8038C824
.4byte lbl_8038C824
.4byte lbl_8038C824
.4byte lbl_8038C824
.4byte lbl_8038C824
.4byte lbl_8038C824
.4byte lbl_8038C824
.4byte lbl_8038C824
.4byte lbl_8038C824
.4byte lbl_8038C824
.4byte lbl_8038C674
.4byte lbl_8038C824
.4byte lbl_8038C824
.4byte lbl_8038C824
.4byte lbl_8038C824
.4byte lbl_8038C824
.4byte lbl_8038C824
.4byte lbl_8038C824
.4byte lbl_8038C68C
.4byte lbl_8038C6A4
.4byte lbl_8038C6BC
.4byte lbl_8038C6D4
.4byte lbl_8038C6EC
.4byte lbl_8038C704
.4byte lbl_8038C71C
.4byte lbl_8038C734
.4byte lbl_8038C74C
.4byte lbl_8038C764
.4byte lbl_8038C77C
.4byte lbl_8038C794
.4byte lbl_8038C7AC
.4byte lbl_8038C7C4
.4byte lbl_8038C7DC
.4byte lbl_8038C7F4
.4byte lbl_8038C80C
.4byte 0
.global lbl_803F2A20
lbl_803F2A20:
# ROM: 0x3EFA20
.4byte 0x01010101
.4byte 0x01010101
.4byte 0x01020202
.4byte 0x02020101
.4byte 0x01010101
.4byte 0x01010101
.4byte 0x01010101
.4byte 0x01010101
.4byte 0x04080808
.4byte 0x08080808
.4byte 0x08080808
.4byte 0x08080808
.4byte 0x30303030
.4byte 0x30303030
.4byte 0x30300808
.4byte 0x08080808
.4byte 0x08A0A0A0
.4byte 0xA0A0A080
.4byte 0x80808080
.4byte 0x80808080
.4byte 0x80808080
.4byte 0x80808080
.4byte 0x80808008
.4byte 0x08080808
.4byte 0x08606060
.4byte 0x60606040
.4byte 0x40404040
.4byte 0x40404040
.4byte 0x40404040
.4byte 0x40404040
.4byte 0x40404008
.4byte 0x08080801
.4byte 0
.4byte 0
.4byte 0
.4byte 0
.4byte 0
.4byte 0
.4byte 0
.4byte 0
.4byte 0
.4byte 0
.4byte 0
.4byte 0
.4byte 0
.4byte 0
.4byte 0
.4byte 0
.4byte 0
.4byte 0
.4byte 0
.4byte 0
.4byte 0
.4byte 0
.4byte 0
.4byte 0
.4byte 0
.4byte 0
.4byte 0
.4byte 0
.4byte 0
.4byte 0
.4byte 0
.4byte 0
.global lbl_803F2B20
lbl_803F2B20:
# ROM: 0x3EFB20
.4byte 0x00010203
.4byte 0x04050607
.4byte 0x08090A0B
.4byte 0x0C0D0E0F
.4byte 0x10111213
.4byte 0x14151617
.4byte 0x18191A1B
.4byte 0x1C1D1E1F
.4byte 0x20212223
.4byte 0x24252627
.4byte 0x28292A2B
.4byte 0x2C2D2E2F
.4byte 0x30313233
.4byte 0x34353637
.4byte 0x38393A3B
.4byte 0x3C3D3E3F
.4byte 0x40616263
.4byte 0x64656667
.4byte 0x68696A6B
.4byte 0x6C6D6E6F
.4byte 0x70717273
.4byte 0x74757677
.4byte 0x78797A5B
.4byte 0x5C5D5E5F
.4byte 0x60616263
.4byte 0x64656667
.4byte 0x68696A6B
.4byte 0x6C6D6E6F
.4byte 0x70717273
.4byte 0x74757677
.4byte 0x78797A7B
.4byte 0x7C7D7E7F
.4byte 0x80818283
.4byte 0x84858687
.4byte 0x88898A8B
.4byte 0x8C8D8E8F
.4byte 0x90919293
.4byte 0x94959697
.4byte 0x98999A9B
.4byte 0x9C9D9E9F
.4byte 0xA0A1A2A3
.4byte 0xA4A5A6A7
.4byte 0xA8A9AAAB
.4byte 0xACADAEAF
.4byte 0xB0B1B2B3
.4byte 0xB4B5B6B7
.4byte 0xB8B9BABB
.4byte 0xBCBDBEBF
.4byte 0xC0C1C2C3
.4byte 0xC4C5C6C7
.4byte 0xC8C9CACB
.4byte 0xCCCDCECF
.4byte 0xD0D1D2D3
.4byte 0xD4D5D6D7
.4byte 0xD8D9DADB
.4byte 0xDCDDDEDF
.4byte 0xE0E1E2E3
.4byte 0xE4E5E6E7
.4byte 0xE8E9EAEB
.4byte 0xECEDEEEF
.4byte 0xF0F1F2F3
.4byte 0xF4F5F6F7
.4byte 0xF8F9FAFB
.4byte 0xFCFDFEFF
.global lbl_803F2C20
lbl_803F2C20:
# ROM: 0x3EFC20
.4byte 0x00010203
.4byte 0x04050607
.4byte 0x08090A0B
.4byte 0x0C0D0E0F
.4byte 0x10111213
.4byte 0x14151617
.4byte 0x18191A1B
.4byte 0x1C1D1E1F
.4byte 0x20212223
.4byte 0x24252627
.4byte 0x28292A2B
.4byte 0x2C2D2E2F
.4byte 0x30313233
.4byte 0x34353637
.4byte 0x38393A3B
.4byte 0x3C3D3E3F
.4byte 0x40414243
.4byte 0x44454647
.4byte 0x48494A4B
.4byte 0x4C4D4E4F
.4byte 0x50515253
.4byte 0x54555657
.4byte 0x58595A5B
.4byte 0x5C5D5E5F
.4byte 0x60414243
.4byte 0x44454647
.4byte 0x48494A4B
.4byte 0x4C4D4E4F
.4byte 0x50515253
.4byte 0x54555657
.4byte 0x58595A7B
.4byte 0x7C7D7E7F
.4byte 0x80818283
.4byte 0x84858687
.4byte 0x88898A8B
.4byte 0x8C8D8E8F
.4byte 0x90919293
.4byte 0x94959697
.4byte 0x98999A9B
.4byte 0x9C9D9E9F
.4byte 0xA0A1A2A3
.4byte 0xA4A5A6A7
.4byte 0xA8A9AAAB
.4byte 0xACADAEAF
.4byte 0xB0B1B2B3
.4byte 0xB4B5B6B7
.4byte 0xB8B9BABB
.4byte 0xBCBDBEBF
.4byte 0xC0C1C2C3
.4byte 0xC4C5C6C7
.4byte 0xC8C9CACB
.4byte 0xCCCDCECF
.4byte 0xD0D1D2D3
.4byte 0xD4D5D6D7
.4byte 0xD8D9DADB
.4byte 0xDCDDDEDF
.4byte 0xE0E1E2E3
.4byte 0xE4E5E6E7
.4byte 0xE8E9EAEB
.4byte 0xECEDEEEF
.4byte 0xF0F1F2F3
.4byte 0xF4F5F6F7
.4byte 0xF8F9FAFB
.4byte 0xFCFDFEFF
.global lbl_803F2D20
lbl_803F2D20:
# ROM: 0x3EFD20
.4byte lbl_803D86B8
.4byte lbl_803D86BA
.4byte lbl_803D86BA
.4byte lbl_803D86BA
.4byte lbl_803D86BA
.4byte lbl_803D86BA
.4byte lbl_803D86BA
.4byte lbl_803D86BA
.4byte lbl_803D86BA
.4byte 0x7F7F7F7F
.4byte 0x7F7F7F00
.4byte lbl_803D86BA
.4byte 0x7F7F7F7F
.4byte 0x7F7F7F00
.global lbl_803F2D58
lbl_803F2D58:
@ -595,16 +178,15 @@ lbl_803F2F40:
.4byte lbl_8038F8E0
.4byte 0
.section .sdata, "wa"
.balign 8
.global lbl_805A8B90
lbl_805A8B90:
# ROM: 0x3F6530
.4byte 0
.4byte 0
.section .text, "ax"
# TODO: Move __stdio_atexit to its own file (misc_io),
# it's here to work around a bug with CW
.global __stdio_atexit
__stdio_atexit:
/* 8038DCCC 0038AC2C 3C 60 80 39 */ lis r3, __close_all@ha
/* 8038DCD0 0038AC30 38 03 B1 18 */ addi r0, r3, __close_all@l
/* 8038DCD4 0038AC34 90 0D AE 00 */ stw r0, lbl_805A99C0@sda21(r13)
/* 8038DCD8 0038AC38 4E 80 00 20 */ blr
.global sprintf
sprintf:
@ -1463,9 +1045,9 @@ lbl_8038E884:
/* 8038E884 0038B7E4 C8 02 CF 78 */ lfd f0, lbl_805AEC98@sda21(r2)
/* 8038E888 0038B7E8 FC 1F 00 40 */ fcmpo cr0, f31, f0
/* 8038E88C 0038B7EC 40 80 00 50 */ bge lbl_8038E8DC
/* 8038E890 0038B7F0 3C 60 80 3F */ lis r3, lbl_803F2A20@ha
/* 8038E890 0038B7F0 3C 60 80 3F */ lis r3, __ctype_map@ha
/* 8038E894 0038B7F4 88 1D 00 05 */ lbz r0, 5(r29)
/* 8038E898 0038B7F8 38 63 2A 20 */ addi r3, r3, lbl_803F2A20@l
/* 8038E898 0038B7F8 38 63 2A 20 */ addi r3, r3, __ctype_map@l
/* 8038E89C 0038B7FC 3B 9C FF FB */ addi r28, r28, -5
/* 8038E8A0 0038B800 7C 03 00 AE */ lbzx r0, r3, r0
/* 8038E8A4 0038B804 54 00 06 31 */ rlwinm. r0, r0, 0, 0x18, 0x18
@ -1484,9 +1066,9 @@ lbl_8038E8C4:
/* 8038E8D4 0038B834 48 00 18 35 */ bl strcpy
/* 8038E8D8 0038B838 48 00 00 4C */ b lbl_8038E924
lbl_8038E8DC:
/* 8038E8DC 0038B83C 3C 60 80 3F */ lis r3, lbl_803F2A20@ha
/* 8038E8DC 0038B83C 3C 60 80 3F */ lis r3, __ctype_map@ha
/* 8038E8E0 0038B840 88 1D 00 05 */ lbz r0, 5(r29)
/* 8038E8E4 0038B844 38 63 2A 20 */ addi r3, r3, lbl_803F2A20@l
/* 8038E8E4 0038B844 38 63 2A 20 */ addi r3, r3, __ctype_map@l
/* 8038E8E8 0038B848 3B 9C FF FC */ addi r28, r28, -4
/* 8038E8EC 0038B84C 7C 03 00 AE */ lbzx r0, r3, r0
/* 8038E8F0 0038B850 54 00 06 31 */ rlwinm. r0, r0, 0, 0x18, 0x18
@ -1510,9 +1092,9 @@ lbl_8038E92C:
/* 8038E92C 0038B88C 88 01 00 0C */ lbz r0, 0xc(r1)
/* 8038E930 0038B890 7C 00 07 75 */ extsb. r0, r0
/* 8038E934 0038B894 41 82 00 50 */ beq lbl_8038E984
/* 8038E938 0038B898 3C 60 80 3F */ lis r3, lbl_803F2A20@ha
/* 8038E938 0038B898 3C 60 80 3F */ lis r3, __ctype_map@ha
/* 8038E93C 0038B89C 88 1D 00 05 */ lbz r0, 5(r29)
/* 8038E940 0038B8A0 38 63 2A 20 */ addi r3, r3, lbl_803F2A20@l
/* 8038E940 0038B8A0 38 63 2A 20 */ addi r3, r3, __ctype_map@l
/* 8038E944 0038B8A4 3B 9C FF FB */ addi r28, r28, -5
/* 8038E948 0038B8A8 7C 03 00 AE */ lbzx r0, r3, r0
/* 8038E94C 0038B8AC 54 00 06 31 */ rlwinm. r0, r0, 0, 0x18, 0x18
@ -1531,9 +1113,9 @@ lbl_8038E96C:
/* 8038E97C 0038B8DC 48 00 17 8D */ bl strcpy
/* 8038E980 0038B8E0 48 00 00 4C */ b lbl_8038E9CC
lbl_8038E984:
/* 8038E984 0038B8E4 3C 60 80 3F */ lis r3, lbl_803F2A20@ha
/* 8038E984 0038B8E4 3C 60 80 3F */ lis r3, __ctype_map@ha
/* 8038E988 0038B8E8 88 1D 00 05 */ lbz r0, 5(r29)
/* 8038E98C 0038B8EC 38 63 2A 20 */ addi r3, r3, lbl_803F2A20@l
/* 8038E98C 0038B8EC 38 63 2A 20 */ addi r3, r3, __ctype_map@l
/* 8038E990 0038B8F0 3B 9C FF FC */ addi r28, r28, -4
/* 8038E994 0038B8F4 7C 03 00 AE */ lbzx r0, r3, r0
/* 8038E998 0038B8F8 54 00 06 31 */ rlwinm. r0, r0, 0, 0x18, 0x18
@ -2706,8 +2288,8 @@ lbl_8038F944:
/* 8038F948 0038C8A8 7C C6 07 74 */ extsb r6, r6
/* 8038F94C 0038C8AC 48 00 00 3C */ b lbl_8038F988
lbl_8038F950:
/* 8038F950 0038C8B0 3C 60 80 3F */ lis r3, lbl_803F2A20@ha
/* 8038F954 0038C8B4 38 63 2A 20 */ addi r3, r3, lbl_803F2A20@l
/* 8038F950 0038C8B0 3C 60 80 3F */ lis r3, __ctype_map@ha
/* 8038F954 0038C8B4 38 63 2A 20 */ addi r3, r3, __ctype_map@l
/* 8038F958 0038C8B8 48 00 00 20 */ b lbl_8038F978
lbl_8038F95C:
/* 8038F95C 0038C8BC 80 01 00 10 */ lwz r0, 0x10(r1)
@ -2760,8 +2342,8 @@ lbl_8038FA04:
/* 8038FA08 0038C968 7C C6 07 74 */ extsb r6, r6
/* 8038FA0C 0038C96C 48 00 00 3C */ b lbl_8038FA48
lbl_8038FA10:
/* 8038FA10 0038C970 3C 60 80 3F */ lis r3, lbl_803F2A20@ha
/* 8038FA14 0038C974 38 63 2A 20 */ addi r3, r3, lbl_803F2A20@l
/* 8038FA10 0038C970 3C 60 80 3F */ lis r3, __ctype_map@ha
/* 8038FA14 0038C974 38 63 2A 20 */ addi r3, r3, __ctype_map@l
/* 8038FA18 0038C978 48 00 00 20 */ b lbl_8038FA38
lbl_8038FA1C:
/* 8038FA1C 0038C97C 80 01 00 14 */ lwz r0, 0x14(r1)

View File

@ -1,5 +1,12 @@
.include "macros.inc"
.section .sdata, "wa"
.balign 8
.global lbl_805A8B98
lbl_805A8B98:
# ROM: 0x3F6538
.4byte 0x00000001
.section .text, "ax"
.global srand

View File

@ -1,58 +0,0 @@
.section .sdata
.balign 8
# TODO: Split this
.global lbl_805A8B90
lbl_805A8B90:
# ROM: 0x3F6530
.4byte 0
.4byte 0
.global lbl_805A8B98
lbl_805A8B98:
# ROM: 0x3F6538
.4byte 0x00000001
.4byte 0
.global lbl_805A8BA0
lbl_805A8BA0:
# ROM: 0x3F6540
.4byte 0x7FFFFFFF
.global lbl_805A8BA4
lbl_805A8BA4:
# ROM: 0x3F6544
.4byte 0x7F800000
.global lbl_805A8BA8
lbl_805A8BA8:
# ROM: 0x3F6548
.4byte 0x00100000
.4byte 0
.global lbl_805A8BB0
lbl_805A8BB0:
# ROM: 0x3F6550
.4byte 0x7FEFFFFF
.4byte 0xFFFFFFFF
.global lbl_805A8BB8
lbl_805A8BB8:
# ROM: 0x3F6558
.4byte 0x7FF00000
.4byte 0
.global lbl_805A8BC0
lbl_805A8BC0:
# ROM: 0x3F6560
.4byte 0x00100000
.4byte 0
.global lbl_805A8BC8
lbl_805A8BC8:
# ROM: 0x3F6568
.4byte 0x7FEFFFFF
.4byte 0xFFFFFFFF

View File

@ -50,17 +50,17 @@ atof:
/* 80390224 0038D184 C8 02 CF 88 */ lfd f0, lbl_805AECA8@sda21(r2)
/* 80390228 0038D188 FC 00 08 00 */ fcmpu cr0, f0, f1
/* 8039022C 0038D18C 41 82 00 2C */ beq lbl_80390258
/* 80390230 0038D190 3C 60 80 5B */ lis r3, lbl_805A8BA8@ha
/* 80390234 0038D194 C8 03 8B A8 */ lfd f0, lbl_805A8BA8@l(r3)
/* 80390230 0038D190 3C 60 80 5B */ lis r3, __double_min@ha
/* 80390234 0038D194 C8 03 8B A8 */ lfd f0, __double_min@l(r3)
/* 80390238 0038D198 FC 02 00 40 */ fcmpo cr0, f2, f0
/* 8039023C 0038D19C 41 80 00 14 */ blt lbl_80390250
/* 80390240 0038D1A0 3C 60 80 5B */ lis r3, lbl_805A8BB0@ha
/* 80390244 0038D1A4 C8 03 8B B0 */ lfd f0, lbl_805A8BB0@l(r3)
/* 80390240 0038D1A0 3C 60 80 5B */ lis r3, __double_max@ha
/* 80390244 0038D1A4 C8 03 8B B0 */ lfd f0, __double_max@l(r3)
/* 80390248 0038D1A8 FC 02 00 40 */ fcmpo cr0, f2, f0
/* 8039024C 0038D1AC 40 81 00 0C */ ble lbl_80390258
lbl_80390250:
/* 80390250 0038D1B0 38 00 00 22 */ li r0, 0x22
/* 80390254 0038D1B4 90 0D AE 10 */ stw r0, lbl_805A99D0@sda21(r13)
/* 80390254 0038D1B4 90 0D AE 10 */ stw r0, errno@sda21(r13)
lbl_80390258:
/* 80390258 0038D1B8 80 01 00 24 */ lwz r0, 0x24(r1)
/* 8039025C 0038D1BC 7C 08 03 A6 */ mtlr r0
@ -77,8 +77,8 @@ __strtold:
/* 8039027C 0038D1DC BD C1 00 68 */ stmw r14, 0x68(r1)
/* 80390280 0038D1E0 3A E8 86 E8 */ addi r23, r8, lbl_803D86E8@l
/* 80390284 0038D1E4 7C 90 23 78 */ mr r16, r4
/* 80390288 0038D1E8 3C 80 80 3F */ lis r4, lbl_803F2D20@ha
/* 8039028C 0038D1EC 39 C4 2D 20 */ addi r14, r4, lbl_803F2D20@l
/* 80390288 0038D1E8 3C 80 80 3F */ lis r4, __lconv@ha
/* 8039028C 0038D1EC 39 C4 2D 20 */ addi r14, r4, __lconv@l
/* 80390290 0038D1F0 7C B1 2B 78 */ mr r17, r5
/* 80390294 0038D1F4 7C F2 3B 78 */ mr r18, r7
/* 80390298 0038D1F8 90 C1 00 0C */ stw r6, 0xc(r1)
@ -186,9 +186,9 @@ lbl_803903FC:
/* 80390414 0038D374 41 82 01 24 */ beq lbl_80390538
/* 80390418 0038D378 48 00 0B 94 */ b lbl_80390FAC
lbl_8039041C:
/* 8039041C 0038D37C 3C 60 80 3F */ lis r3, lbl_803F2A20@ha
/* 8039041C 0038D37C 3C 60 80 3F */ lis r3, __ctype_map@ha
/* 80390420 0038D380 54 85 06 3E */ clrlwi r5, r4, 0x18
/* 80390424 0038D384 38 63 2A 20 */ addi r3, r3, lbl_803F2A20@l
/* 80390424 0038D384 38 63 2A 20 */ addi r3, r3, __ctype_map@l
/* 80390428 0038D388 7C 03 28 AE */ lbzx r0, r3, r5
/* 8039042C 0038D38C 54 00 07 7D */ rlwinm. r0, r0, 0, 0x1d, 0x1e
/* 80390430 0038D390 41 82 00 28 */ beq lbl_80390458
@ -207,8 +207,8 @@ lbl_80390458:
/* 80390460 0038D3C0 38 00 FF FF */ li r0, -1
/* 80390464 0038D3C4 48 00 00 10 */ b lbl_80390474
lbl_80390468:
/* 80390468 0038D3C8 3C 60 80 3F */ lis r3, lbl_803F2C20@ha
/* 8039046C 0038D3CC 38 63 2C 20 */ addi r3, r3, lbl_803F2C20@l
/* 80390468 0038D3C8 3C 60 80 3F */ lis r3, __upper_map@ha
/* 8039046C 0038D3CC 38 63 2C 20 */ addi r3, r3, __upper_map@l
/* 80390470 0038D3D0 7C 03 28 AE */ lbzx r0, r3, r5
lbl_80390474:
/* 80390474 0038D3D4 2C 00 00 49 */ cmpwi r0, 0x49
@ -300,9 +300,9 @@ lbl_8039058C:
/* 803905A4 0038D504 38 00 FF FF */ li r0, -1
/* 803905A8 0038D508 48 00 00 14 */ b lbl_803905BC
lbl_803905AC:
/* 803905AC 0038D50C 3C 60 80 3F */ lis r3, lbl_803F2C20@ha
/* 803905AC 0038D50C 3C 60 80 3F */ lis r3, __upper_map@ha
/* 803905B0 0038D510 54 80 06 3E */ clrlwi r0, r4, 0x18
/* 803905B4 0038D514 38 63 2C 20 */ addi r3, r3, lbl_803F2C20@l
/* 803905B4 0038D514 38 63 2C 20 */ addi r3, r3, __upper_map@l
/* 803905B8 0038D518 7C 03 00 AE */ lbzx r0, r3, r0
lbl_803905BC:
/* 803905BC 0038D51C 7C 05 00 00 */ cmpw r5, r0
@ -315,13 +315,13 @@ lbl_803905C4:
lbl_803905D4:
/* 803905D4 0038D534 2C 0E 00 00 */ cmpwi r14, 0
/* 803905D8 0038D538 41 82 00 14 */ beq lbl_803905EC
/* 803905DC 0038D53C 3C 60 80 5B */ lis r3, lbl_805A8BA4@ha
/* 803905E0 0038D540 C0 03 8B A4 */ lfs f0, lbl_805A8BA4@l(r3)
/* 803905DC 0038D53C 3C 60 80 5B */ lis r3, __float_huge@ha
/* 803905E0 0038D540 C0 03 8B A4 */ lfs f0, __float_huge@l(r3)
/* 803905E4 0038D544 FC 20 00 50 */ fneg f1, f0
/* 803905E8 0038D548 48 00 00 0C */ b lbl_803905F4
lbl_803905EC:
/* 803905EC 0038D54C 3C 60 80 5B */ lis r3, lbl_805A8BA4@ha
/* 803905F0 0038D550 C0 23 8B A4 */ lfs f1, lbl_805A8BA4@l(r3)
/* 803905EC 0038D54C 3C 60 80 5B */ lis r3, __float_huge@ha
/* 803905F0 0038D550 C0 23 8B A4 */ lfs f1, __float_huge@l(r3)
lbl_803905F4:
/* 803905F4 0038D554 80 01 00 5C */ lwz r0, 0x5c(r1)
/* 803905F8 0038D558 80 61 00 0C */ lwz r3, 0xc(r1)
@ -363,9 +363,9 @@ lbl_80390660:
/* 80390678 0038D5D8 38 00 FF FF */ li r0, -1
/* 8039067C 0038D5DC 48 00 00 14 */ b lbl_80390690
lbl_80390680:
/* 80390680 0038D5E0 3C 60 80 3F */ lis r3, lbl_803F2C20@ha
/* 80390680 0038D5E0 3C 60 80 3F */ lis r3, __upper_map@ha
/* 80390684 0038D5E4 54 80 06 3E */ clrlwi r0, r4, 0x18
/* 80390688 0038D5E8 38 63 2C 20 */ addi r3, r3, lbl_803F2C20@l
/* 80390688 0038D5E8 38 63 2C 20 */ addi r3, r3, __upper_map@l
/* 8039068C 0038D5EC 7C 03 00 AE */ lbzx r0, r3, r0
lbl_80390690:
/* 80390690 0038D5F0 7C 05 00 00 */ cmpw r5, r0
@ -378,8 +378,8 @@ lbl_80390698:
lbl_803906A8:
/* 803906A8 0038D608 2C 14 00 04 */ cmpwi r20, 4
/* 803906AC 0038D60C 40 82 00 68 */ bne lbl_80390714
/* 803906B0 0038D610 3C 60 80 3F */ lis r3, lbl_803F2A20@ha
/* 803906B4 0038D614 39 E3 2A 20 */ addi r15, r3, lbl_803F2A20@l
/* 803906B0 0038D610 3C 60 80 3F */ lis r3, __ctype_map@ha
/* 803906B4 0038D614 39 E3 2A 20 */ addi r15, r3, __ctype_map@l
/* 803906B8 0038D618 48 00 00 28 */ b lbl_803906E0
lbl_803906BC:
/* 803906BC 0038D61C 7E 0C 83 78 */ mr r12, r16
@ -410,13 +410,13 @@ lbl_80390710:
lbl_80390714:
/* 80390714 0038D674 2C 0E 00 00 */ cmpwi r14, 0
/* 80390718 0038D678 41 82 00 14 */ beq lbl_8039072C
/* 8039071C 0038D67C 3C 60 80 5B */ lis r3, lbl_805A8BA0@ha
/* 80390720 0038D680 C0 03 8B A0 */ lfs f0, lbl_805A8BA0@l(r3)
/* 8039071C 0038D67C 3C 60 80 5B */ lis r3, __float_nan@ha
/* 80390720 0038D680 C0 03 8B A0 */ lfs f0, __float_nan@l(r3)
/* 80390724 0038D684 FC 20 00 50 */ fneg f1, f0
/* 80390728 0038D688 48 00 00 0C */ b lbl_80390734
lbl_8039072C:
/* 8039072C 0038D68C 3C 60 80 5B */ lis r3, lbl_805A8BA0@ha
/* 80390730 0038D690 C0 23 8B A0 */ lfs f1, lbl_805A8BA0@l(r3)
/* 8039072C 0038D68C 3C 60 80 5B */ lis r3, __float_nan@ha
/* 80390730 0038D690 C0 23 8B A0 */ lfs f1, __float_nan@l(r3)
lbl_80390734:
/* 80390734 0038D694 80 01 00 5C */ lwz r0, 0x5c(r1)
/* 80390738 0038D698 7C 74 9A 14 */ add r3, r20, r19
@ -443,9 +443,9 @@ lbl_8039075C:
/* 80390784 0038D6E4 7C 64 1B 78 */ mr r4, r3
/* 80390788 0038D6E8 48 00 08 24 */ b lbl_80390FAC
lbl_8039078C:
/* 8039078C 0038D6EC 3C 60 80 3F */ lis r3, lbl_803F2A20@ha
/* 8039078C 0038D6EC 3C 60 80 3F */ lis r3, __ctype_map@ha
/* 80390790 0038D6F0 54 80 06 3E */ clrlwi r0, r4, 0x18
/* 80390794 0038D6F4 38 63 2A 20 */ addi r3, r3, lbl_803F2A20@l
/* 80390794 0038D6F4 38 63 2A 20 */ addi r3, r3, __ctype_map@l
/* 80390798 0038D6F8 7C 03 00 AE */ lbzx r0, r3, r0
/* 8039079C 0038D6FC 54 00 06 F7 */ rlwinm. r0, r0, 0, 0x1b, 0x1b
/* 803907A0 0038D700 40 82 00 0C */ bne lbl_803907AC
@ -467,9 +467,9 @@ lbl_803907AC:
/* 803907DC 0038D73C 38 00 FF FF */ li r0, -1
/* 803907E0 0038D740 48 00 00 14 */ b lbl_803907F4
lbl_803907E4:
/* 803907E4 0038D744 3C A0 80 3F */ lis r5, lbl_803F2C20@ha
/* 803907E4 0038D744 3C A0 80 3F */ lis r5, __upper_map@ha
/* 803907E8 0038D748 54 60 06 3E */ clrlwi r0, r3, 0x18
/* 803907EC 0038D74C 38 65 2C 20 */ addi r3, r5, lbl_803F2C20@l
/* 803907EC 0038D74C 38 65 2C 20 */ addi r3, r5, __upper_map@l
/* 803907F0 0038D750 7C 03 00 AE */ lbzx r0, r3, r0
lbl_803907F4:
/* 803907F4 0038D754 2C 00 00 58 */ cmpwi r0, 0x58
@ -500,9 +500,9 @@ lbl_80390848:
/* 80390848 0038D7A8 39 E0 00 08 */ li r15, 8
/* 8039084C 0038D7AC 48 00 07 60 */ b lbl_80390FAC
lbl_80390850:
/* 80390850 0038D7B0 3C 60 80 3F */ lis r3, lbl_803F2A20@ha
/* 80390850 0038D7B0 3C 60 80 3F */ lis r3, __ctype_map@ha
/* 80390854 0038D7B4 54 80 06 3E */ clrlwi r0, r4, 0x18
/* 80390858 0038D7B8 38 63 2A 20 */ addi r3, r3, lbl_803F2A20@l
/* 80390858 0038D7B8 38 63 2A 20 */ addi r3, r3, __ctype_map@l
/* 8039085C 0038D7BC 7C 03 00 AE */ lbzx r0, r3, r0
/* 80390860 0038D7C0 54 00 06 F7 */ rlwinm. r0, r0, 0, 0x1b, 0x1b
/* 80390864 0038D7C4 40 82 00 3C */ bne lbl_803908A0
@ -544,9 +544,9 @@ lbl_803908C8:
/* 803908E4 0038D844 7C 64 1B 78 */ mr r4, r3
/* 803908E8 0038D848 48 00 06 C4 */ b lbl_80390FAC
lbl_803908EC:
/* 803908EC 0038D84C 3C 60 80 3F */ lis r3, lbl_803F2A20@ha
/* 803908EC 0038D84C 3C 60 80 3F */ lis r3, __ctype_map@ha
/* 803908F0 0038D850 54 80 06 3E */ clrlwi r0, r4, 0x18
/* 803908F4 0038D854 38 63 2A 20 */ addi r3, r3, lbl_803F2A20@l
/* 803908F4 0038D854 38 63 2A 20 */ addi r3, r3, __ctype_map@l
/* 803908F8 0038D858 7C 03 00 AE */ lbzx r0, r3, r0
/* 803908FC 0038D85C 54 00 06 F7 */ rlwinm. r0, r0, 0, 0x1b, 0x1b
/* 80390900 0038D860 40 82 00 0C */ bne lbl_8039090C
@ -556,9 +556,9 @@ lbl_8039090C:
/* 8039090C 0038D86C 39 E0 00 20 */ li r15, 0x20
/* 80390910 0038D870 48 00 06 9C */ b lbl_80390FAC
lbl_80390914:
/* 80390914 0038D874 3C 60 80 3F */ lis r3, lbl_803F2A20@ha
/* 80390914 0038D874 3C 60 80 3F */ lis r3, __ctype_map@ha
/* 80390918 0038D878 54 80 06 3E */ clrlwi r0, r4, 0x18
/* 8039091C 0038D87C 38 63 2A 20 */ addi r3, r3, lbl_803F2A20@l
/* 8039091C 0038D87C 38 63 2A 20 */ addi r3, r3, __ctype_map@l
/* 80390920 0038D880 7C 03 00 AE */ lbzx r0, r3, r0
/* 80390924 0038D884 54 00 06 F7 */ rlwinm. r0, r0, 0, 0x1b, 0x1b
/* 80390928 0038D888 40 82 00 0C */ bne lbl_80390934
@ -597,9 +597,9 @@ lbl_80390990:
/* 80390998 0038D8F8 38 00 FF FF */ li r0, -1
/* 8039099C 0038D8FC 48 00 00 14 */ b lbl_803909B0
lbl_803909A0:
/* 803909A0 0038D900 3C 60 80 3F */ lis r3, lbl_803F2C20@ha
/* 803909A0 0038D900 3C 60 80 3F */ lis r3, __upper_map@ha
/* 803909A4 0038D904 54 80 06 3E */ clrlwi r0, r4, 0x18
/* 803909A8 0038D908 38 63 2C 20 */ addi r3, r3, lbl_803F2C20@l
/* 803909A8 0038D908 38 63 2C 20 */ addi r3, r3, __upper_map@l
/* 803909AC 0038D90C 7C 03 00 AE */ lbzx r0, r3, r0
lbl_803909B0:
/* 803909B0 0038D910 2C 00 00 45 */ cmpwi r0, 0x45
@ -646,9 +646,9 @@ lbl_80390A44:
/* 80390A44 0038D9A4 39 E0 01 00 */ li r15, 0x100
/* 80390A48 0038D9A8 48 00 05 64 */ b lbl_80390FAC
lbl_80390A4C:
/* 80390A4C 0038D9AC 3C 60 80 3F */ lis r3, lbl_803F2A20@ha
/* 80390A4C 0038D9AC 3C 60 80 3F */ lis r3, __ctype_map@ha
/* 80390A50 0038D9B0 54 80 06 3E */ clrlwi r0, r4, 0x18
/* 80390A54 0038D9B4 38 63 2A 20 */ addi r3, r3, lbl_803F2A20@l
/* 80390A54 0038D9B4 38 63 2A 20 */ addi r3, r3, __ctype_map@l
/* 80390A58 0038D9B8 7C 03 00 AE */ lbzx r0, r3, r0
/* 80390A5C 0038D9BC 54 00 06 F7 */ rlwinm. r0, r0, 0, 0x1b, 0x1b
/* 80390A60 0038D9C0 40 82 00 0C */ bne lbl_80390A6C
@ -686,9 +686,9 @@ lbl_80390AD0:
/* 80390AD0 0038DA30 39 E0 04 00 */ li r15, 0x400
/* 80390AD4 0038DA34 48 00 04 D8 */ b lbl_80390FAC
lbl_80390AD8:
/* 80390AD8 0038DA38 3C 60 80 3F */ lis r3, lbl_803F2A20@ha
/* 80390AD8 0038DA38 3C 60 80 3F */ lis r3, __ctype_map@ha
/* 80390ADC 0038DA3C 54 80 06 3E */ clrlwi r0, r4, 0x18
/* 80390AE0 0038DA40 38 63 2A 20 */ addi r3, r3, lbl_803F2A20@l
/* 80390AE0 0038DA40 38 63 2A 20 */ addi r3, r3, __ctype_map@l
/* 80390AE4 0038DA44 7C 03 00 AE */ lbzx r0, r3, r0
/* 80390AE8 0038DA48 54 00 06 F7 */ rlwinm. r0, r0, 0, 0x1b, 0x1b
/* 80390AEC 0038DA4C 40 82 00 0C */ bne lbl_80390AF8
@ -777,9 +777,9 @@ lbl_80390C14:
/* 80390C14 0038DB74 3B E0 00 04 */ li r31, 4
/* 80390C18 0038DB78 48 00 03 94 */ b lbl_80390FAC
lbl_80390C1C:
/* 80390C1C 0038DB7C 3C 60 80 3F */ lis r3, lbl_803F2A20@ha
/* 80390C1C 0038DB7C 3C 60 80 3F */ lis r3, __ctype_map@ha
/* 80390C20 0038DB80 54 85 06 3E */ clrlwi r5, r4, 0x18
/* 80390C24 0038DB84 38 63 2A 20 */ addi r3, r3, lbl_803F2A20@l
/* 80390C24 0038DB84 38 63 2A 20 */ addi r3, r3, __ctype_map@l
/* 80390C28 0038DB88 7C 03 28 AE */ lbzx r0, r3, r5
/* 80390C2C 0038DB8C 54 00 06 B5 */ rlwinm. r0, r0, 0, 0x1a, 0x1a
/* 80390C30 0038DB90 40 82 00 3C */ bne lbl_80390C6C
@ -811,8 +811,8 @@ lbl_80390C6C:
/* 80390C90 0038DBF0 38 60 FF FF */ li r3, -1
/* 80390C94 0038DBF4 48 00 00 10 */ b lbl_80390CA4
lbl_80390C98:
/* 80390C98 0038DBF8 3C 60 80 3F */ lis r3, lbl_803F2C20@ha
/* 80390C9C 0038DBFC 38 63 2C 20 */ addi r3, r3, lbl_803F2C20@l
/* 80390C98 0038DBF8 3C 60 80 3F */ lis r3, __upper_map@ha
/* 80390C9C 0038DBFC 38 63 2C 20 */ addi r3, r3, __upper_map@l
/* 80390CA0 0038DC00 7C 63 28 AE */ lbzx r3, r3, r5
lbl_80390CA4:
/* 80390CA4 0038DC04 2C 03 00 41 */ cmpwi r3, 0x41
@ -859,9 +859,9 @@ lbl_80390D1C:
/* 80390D38 0038DC98 7C 64 1B 78 */ mr r4, r3
/* 80390D3C 0038DC9C 48 00 02 70 */ b lbl_80390FAC
lbl_80390D40:
/* 80390D40 0038DCA0 3C 60 80 3F */ lis r3, lbl_803F2A20@ha
/* 80390D40 0038DCA0 3C 60 80 3F */ lis r3, __ctype_map@ha
/* 80390D44 0038DCA4 54 85 06 3E */ clrlwi r5, r4, 0x18
/* 80390D48 0038DCA8 38 63 2A 20 */ addi r3, r3, lbl_803F2A20@l
/* 80390D48 0038DCA8 38 63 2A 20 */ addi r3, r3, __ctype_map@l
/* 80390D4C 0038DCAC 7C 03 28 AE */ lbzx r0, r3, r5
/* 80390D50 0038DCB0 54 00 06 B5 */ rlwinm. r0, r0, 0, 0x1a, 0x1a
/* 80390D54 0038DCB4 40 82 00 0C */ bne lbl_80390D60
@ -879,8 +879,8 @@ lbl_80390D60:
/* 80390D80 0038DCE0 38 60 FF FF */ li r3, -1
/* 80390D84 0038DCE4 48 00 00 10 */ b lbl_80390D94
lbl_80390D88:
/* 80390D88 0038DCE8 3C 60 80 3F */ lis r3, lbl_803F2C20@ha
/* 80390D8C 0038DCEC 38 63 2C 20 */ addi r3, r3, lbl_803F2C20@l
/* 80390D88 0038DCE8 3C 60 80 3F */ lis r3, __upper_map@ha
/* 80390D8C 0038DCEC 38 63 2C 20 */ addi r3, r3, __upper_map@l
/* 80390D90 0038DCF0 7C 63 28 AE */ lbzx r3, r3, r5
lbl_80390D94:
/* 80390D94 0038DCF4 2C 03 00 41 */ cmpwi r3, 0x41
@ -932,9 +932,9 @@ lbl_80390E30:
/* 80390E38 0038DD98 38 00 FF FF */ li r0, -1
/* 80390E3C 0038DD9C 48 00 00 14 */ b lbl_80390E50
lbl_80390E40:
/* 80390E40 0038DDA0 3C 60 80 3F */ lis r3, lbl_803F2C20@ha
/* 80390E40 0038DDA0 3C 60 80 3F */ lis r3, __upper_map@ha
/* 80390E44 0038DDA4 54 80 06 3E */ clrlwi r0, r4, 0x18
/* 80390E48 0038DDA8 38 63 2C 20 */ addi r3, r3, lbl_803F2C20@l
/* 80390E48 0038DDA8 38 63 2C 20 */ addi r3, r3, __upper_map@l
/* 80390E4C 0038DDAC 7C 03 00 AE */ lbzx r0, r3, r0
lbl_80390E50:
/* 80390E50 0038DDB0 2C 00 00 50 */ cmpwi r0, 0x50
@ -981,9 +981,9 @@ lbl_80390EC4:
/* 80390EE4 0038DE44 7C 64 1B 78 */ mr r4, r3
/* 80390EE8 0038DE48 48 00 00 C4 */ b lbl_80390FAC
lbl_80390EEC:
/* 80390EEC 0038DE4C 3C 60 80 3F */ lis r3, lbl_803F2A20@ha
/* 80390EEC 0038DE4C 3C 60 80 3F */ lis r3, __ctype_map@ha
/* 80390EF0 0038DE50 54 80 06 3E */ clrlwi r0, r4, 0x18
/* 80390EF4 0038DE54 38 63 2A 20 */ addi r3, r3, lbl_803F2A20@l
/* 80390EF4 0038DE54 38 63 2A 20 */ addi r3, r3, __ctype_map@l
/* 80390EF8 0038DE58 7C 03 00 AE */ lbzx r0, r3, r0
/* 80390EFC 0038DE5C 54 00 06 F7 */ rlwinm. r0, r0, 0, 0x1b, 0x1b
/* 80390F00 0038DE60 40 82 00 0C */ bne lbl_80390F0C
@ -1007,9 +1007,9 @@ lbl_80390F40:
/* 80390F40 0038DEA0 3B E0 01 00 */ li r31, 0x100
/* 80390F44 0038DEA4 48 00 00 68 */ b lbl_80390FAC
lbl_80390F48:
/* 80390F48 0038DEA8 3C 60 80 3F */ lis r3, lbl_803F2A20@ha
/* 80390F48 0038DEA8 3C 60 80 3F */ lis r3, __ctype_map@ha
/* 80390F4C 0038DEAC 54 80 06 3E */ clrlwi r0, r4, 0x18
/* 80390F50 0038DEB0 38 63 2A 20 */ addi r3, r3, lbl_803F2A20@l
/* 80390F50 0038DEB0 38 63 2A 20 */ addi r3, r3, __ctype_map@l
/* 80390F54 0038DEB4 7C 03 00 AE */ lbzx r0, r3, r0
/* 80390F58 0038DEB8 54 00 06 F7 */ rlwinm. r0, r0, 0, 0x1b, 0x1b
/* 80390F5C 0038DEBC 40 82 00 0C */ bne lbl_80390F68
@ -1112,13 +1112,13 @@ lbl_8039108C:
lbl_803910AC:
/* 803910AC 0038E00C 2C 0E 00 00 */ cmpwi r14, 0
/* 803910B0 0038E010 41 82 00 14 */ beq lbl_803910C4
/* 803910B4 0038E014 3C 60 80 5B */ lis r3, lbl_805A8BB8@ha
/* 803910B8 0038E018 C8 03 8B B8 */ lfd f0, lbl_805A8BB8@l(r3)
/* 803910B4 0038E014 3C 60 80 5B */ lis r3, __double_huge@ha
/* 803910B8 0038E018 C8 03 8B B8 */ lfd f0, __double_huge@l(r3)
/* 803910BC 0038E01C FC 20 00 50 */ fneg f1, f0
/* 803910C0 0038E020 48 00 01 A0 */ b lbl_80391260
lbl_803910C4:
/* 803910C4 0038E024 3C 60 80 5B */ lis r3, lbl_805A8BB8@ha
/* 803910C8 0038E028 C8 23 8B B8 */ lfd f1, lbl_805A8BB8@l(r3)
/* 803910C4 0038E024 3C 60 80 5B */ lis r3, __double_huge@ha
/* 803910C8 0038E028 C8 23 8B B8 */ lfd f1, __double_huge@l(r3)
/* 803910CC 0038E02C 48 00 01 94 */ b lbl_80391260
lbl_803910D0:
/* 803910D0 0038E030 B3 81 00 2E */ sth r28, 0x2e(r1)
@ -1128,22 +1128,22 @@ lbl_803910D0:
/* 803910E0 0038E040 D8 21 00 18 */ stfd f1, 0x18(r1)
/* 803910E4 0038E044 FC 00 08 00 */ fcmpu cr0, f0, f1
/* 803910E8 0038E048 41 82 00 20 */ beq lbl_80391108
/* 803910EC 0038E04C 3C 60 80 5B */ lis r3, lbl_805A8BC0@ha
/* 803910F0 0038E050 C8 03 8B C0 */ lfd f0, lbl_805A8BC0@l(r3)
/* 803910EC 0038E04C 3C 60 80 5B */ lis r3, __extended_min@ha
/* 803910F0 0038E050 C8 03 8B C0 */ lfd f0, __extended_min@l(r3)
/* 803910F4 0038E054 FC 01 00 40 */ fcmpo cr0, f1, f0
/* 803910F8 0038E058 40 80 00 10 */ bge lbl_80391108
/* 803910FC 0038E05C 38 00 00 01 */ li r0, 1
/* 80391100 0038E060 90 12 00 00 */ stw r0, 0(r18)
/* 80391104 0038E064 48 00 00 28 */ b lbl_8039112C
lbl_80391108:
/* 80391108 0038E068 3C 60 80 5B */ lis r3, lbl_805A8BC8@ha
/* 8039110C 0038E06C C8 03 8B C8 */ lfd f0, lbl_805A8BC8@l(r3)
/* 80391108 0038E068 3C 60 80 5B */ lis r3, __extended_max@ha
/* 8039110C 0038E06C C8 03 8B C8 */ lfd f0, __extended_max@l(r3)
/* 80391110 0038E070 FC 01 00 40 */ fcmpo cr0, f1, f0
/* 80391114 0038E074 40 81 00 18 */ ble lbl_8039112C
/* 80391118 0038E078 38 00 00 01 */ li r0, 1
/* 8039111C 0038E07C 3C 60 80 5B */ lis r3, lbl_805A8BB8@ha
/* 8039111C 0038E07C 3C 60 80 5B */ lis r3, __double_huge@ha
/* 80391120 0038E080 90 12 00 00 */ stw r0, 0(r18)
/* 80391124 0038E084 C8 03 8B B8 */ lfd f0, lbl_805A8BB8@l(r3)
/* 80391124 0038E084 C8 03 8B B8 */ lfd f0, __double_huge@l(r3)
/* 80391128 0038E088 D8 01 00 18 */ stfd f0, 0x18(r1)
lbl_8039112C:
/* 8039112C 0038E08C 2C 0E 00 00 */ cmpwi r14, 0
@ -1201,8 +1201,8 @@ lbl_80391198:
/* 803911EC 0038E14C 90 03 00 00 */ stw r0, 0(r3)
/* 803911F0 0038E150 FC 01 10 00 */ fcmpu cr0, f1, f2
/* 803911F4 0038E154 41 82 00 24 */ beq lbl_80391218
/* 803911F8 0038E158 3C 60 80 5B */ lis r3, lbl_805A8BC0@ha
/* 803911FC 0038E15C C8 03 8B C0 */ lfd f0, lbl_805A8BC0@l(r3)
/* 803911F8 0038E158 3C 60 80 5B */ lis r3, __extended_min@ha
/* 803911FC 0038E15C C8 03 8B C0 */ lfd f0, __extended_min@l(r3)
/* 80391200 0038E160 FC 02 00 40 */ fcmpo cr0, f2, f0
/* 80391204 0038E164 40 80 00 14 */ bge lbl_80391218
/* 80391208 0038E168 38 00 00 01 */ li r0, 1
@ -1210,14 +1210,14 @@ lbl_80391198:
/* 80391210 0038E170 90 12 00 00 */ stw r0, 0(r18)
/* 80391214 0038E174 48 00 00 28 */ b lbl_8039123C
lbl_80391218:
/* 80391218 0038E178 3C 60 80 5B */ lis r3, lbl_805A8BC8@ha
/* 8039121C 0038E17C C8 03 8B C8 */ lfd f0, lbl_805A8BC8@l(r3)
/* 80391218 0038E178 3C 60 80 5B */ lis r3, __extended_max@ha
/* 8039121C 0038E17C C8 03 8B C8 */ lfd f0, __extended_max@l(r3)
/* 80391220 0038E180 FC 02 00 40 */ fcmpo cr0, f2, f0
/* 80391224 0038E184 40 81 00 18 */ ble lbl_8039123C
/* 80391228 0038E188 38 00 00 01 */ li r0, 1
/* 8039122C 0038E18C 3C 60 80 5B */ lis r3, lbl_805A8BB8@ha
/* 8039122C 0038E18C 3C 60 80 5B */ lis r3, __double_huge@ha
/* 80391230 0038E190 90 12 00 00 */ stw r0, 0(r18)
/* 80391234 0038E194 C8 03 8B B8 */ lfd f0, lbl_805A8BB8@l(r3)
/* 80391234 0038E194 C8 03 8B B8 */ lfd f0, __double_huge@l(r3)
/* 80391238 0038E198 D8 01 00 18 */ stfd f0, 0x18(r1)
lbl_8039123C:
/* 8039123C 0038E19C 2C 0E 00 00 */ cmpwi r14, 0

View File

@ -1261,12 +1261,12 @@ lbl_802AAB00:
lbl_802AAB0C:
/* 802AAB0C 002A7A6C FC 09 38 00 */ fcmpu cr0, f9, f7
/* 802AAB10 002A7A70 41 82 00 10 */ beq lbl_802AAB20
/* 802AAB14 002A7A74 3C 60 80 5B */ lis r3, lbl_805A8BA0@ha
/* 802AAB18 002A7A78 C0 E3 8B A0 */ lfs f7, lbl_805A8BA0@l(r3)
/* 802AAB14 002A7A74 3C 60 80 5B */ lis r3, __float_nan@ha
/* 802AAB18 002A7A78 C0 E3 8B A0 */ lfs f7, __float_nan@l(r3)
/* 802AAB1C 002A7A7C 48 00 00 0C */ b lbl_802AAB28
lbl_802AAB20:
/* 802AAB20 002A7A80 3C 60 80 5B */ lis r3, lbl_805A8BA4@ha
/* 802AAB24 002A7A84 C0 E3 8B A4 */ lfs f7, lbl_805A8BA4@l(r3)
/* 802AAB20 002A7A80 3C 60 80 5B */ lis r3, __float_huge@ha
/* 802AAB24 002A7A84 C0 E3 8B A4 */ lfs f7, __float_huge@l(r3)
lbl_802AAB28:
/* 802AAB28 002A7A88 FC 60 00 50 */ fneg f3, f0
/* 802AAB2C 002A7A8C C8 02 C1 C0 */ lfd f0, lbl_805ADEE0@sda21(r2)

View File

@ -2553,12 +2553,12 @@ lbl_802A5520:
lbl_802A552C:
/* 802A552C 002A248C FC 09 38 00 */ fcmpu cr0, f9, f7
/* 802A5530 002A2490 41 82 00 10 */ beq lbl_802A5540
/* 802A5534 002A2494 3C 60 80 5B */ lis r3, lbl_805A8BA0@ha
/* 802A5538 002A2498 C0 E3 8B A0 */ lfs f7, lbl_805A8BA0@l(r3)
/* 802A5534 002A2494 3C 60 80 5B */ lis r3, __float_nan@ha
/* 802A5538 002A2498 C0 E3 8B A0 */ lfs f7, __float_nan@l(r3)
/* 802A553C 002A249C 48 00 00 0C */ b lbl_802A5548
lbl_802A5540:
/* 802A5540 002A24A0 3C 60 80 5B */ lis r3, lbl_805A8BA4@ha
/* 802A5544 002A24A4 C0 E3 8B A4 */ lfs f7, lbl_805A8BA4@l(r3)
/* 802A5540 002A24A0 3C 60 80 5B */ lis r3, __float_huge@ha
/* 802A5544 002A24A4 C0 E3 8B A4 */ lfs f7, __float_huge@l(r3)
lbl_802A5548:
/* 802A5548 002A24A8 FC 60 00 50 */ fneg f3, f0
/* 802A554C 002A24AC C8 02 C1 58 */ lfd f0, lbl_805ADE78@sda21(r2)

View File

@ -15,7 +15,11 @@ extern "C" {
#define OS_BASE_CACHED (OS_CACHED_REGION_PREFIX << 16)
#define OS_BASE_UNCACHED (OS_UNCACHED_REGION_PREFIX << 16)
#ifdef __MWERKS__
#define AT_ADDRESS(xyz) : (xyz)
#else
#define AT_ADDRESS
#endif
u32 __OSBusClock AT_ADDRESS(OS_BASE_CACHED | 0x00F8); // sync with OSLoMem.h
u32 __OSCoreClock AT_ADDRESS(OS_BASE_CACHED | 0x00FC); // sync with OSLoMem.h
#define OS_BUS_CLOCK __OSBusClock

View File

@ -5,6 +5,7 @@
#include "Dolphin/os/OSFastCast.h"
namespace CCast {
#ifdef __MWERKS__
inline u8 ToUint8(register f32 in) {
u8 a;
register u8* ptr = &a;
@ -24,6 +25,14 @@ inline f32 ToReal32(register const u8& in) {
}
return r;
}
#else
inline u8 ToUint8(f32 in) {
return static_cast<u8>(in);
}
inline f32 ToReal32(u8 in) {
return static_cast<f32>(in);
}
#endif
} // namespace CCast
#endif

View File

@ -5,7 +5,9 @@
#include "Kyoto/Basics/CCast.hpp"
#ifdef __MWERKS__
#pragma cpp_extensions on
#endif
class CInputStream;
class CColor {

View File

@ -27,7 +27,7 @@ public:
static CVParamTransfer Null();
private:
rstl::rc_ptr< void > x0_;
rstl::rc_ptr< unkptr > x0_;
};
class CObjectReference {
public:

View File

@ -11,8 +11,8 @@ inline T cinput_stream_helper(const TType< T >& type, CInputStream& in);
class CInputStream {
public:
CInputStream(size_t len);
CInputStream(const void* ptr, size_t len, bool owned);
CInputStream(s32 len);
CInputStream(const void* ptr, s32 len, bool owned);
virtual ~CInputStream();
virtual u32 Read(void* dest, u32 len) = 0;

View File

@ -6,7 +6,7 @@
#include "rstl/optional_object.hpp"
#include "rstl/reserved_vector.hpp"
template < typename T, size_t N >
template < typename T, s32 N >
class TReservedAverage : rstl::reserved_vector< T, N > {
public:
TReservedAverage(const T& value) {
@ -14,7 +14,7 @@ public:
}
void AddValue(const T& value) {
push_back(value);
for (size_t i = size() - 1; i > 0; --i) {
for (s32 i = size() - 1; i > 0; --i) {
operator[](i) = operator[](i - 1);
}
operator[](0) = value;

View File

@ -29,7 +29,7 @@ template < typename T >
class TCachedToken : public TToken< T > {
public:
TCachedToken() {}
TCachedToken(const CToken& token) : TToken(token), x8_item(nullptr) {}
TCachedToken(const CToken& token) : TToken< T >(token), x8_item(nullptr) {}
// TODO
operator const TToken< T >&() const;
@ -42,7 +42,7 @@ template < typename T >
class TLockedToken : public TCachedToken< T > {
public:
TLockedToken() {}
TLockedToken(const CToken& token) : TCachedToken(token) { Lock(); }
TLockedToken(const CToken& token) : TCachedToken< T >(token) { this->Lock(); }
// TODO
operator const TToken< T >&() const;

View File

@ -99,11 +99,11 @@ private:
template < typename T >
const T* TCastToConstPtr(const CEntity* p) {
return TCastToPtr(const_cast< CEntity* >(p));
return TCastToPtr< T >(const_cast< CEntity* >(p));
}
template < typename T >
const T* TCastToConstPtr(const CEntity& p) {
return TCastToPtr(const_cast< CEntity* >(&p));
return TCastToPtr< T >(const_cast< CEntity* >(&p));
}
#endif

View File

@ -1,22 +1,4 @@
#ifndef _MATH_PPC_H_
#define _MATH_PPC_H_
inline float sqrtf(float x)
{
static const double _half=.5;
static const double _three=3.0;
volatile float y;
if(x > 0.0f)
{
double guess = __frsqrte((double)x); /* returns an approximation to */
guess = _half*guess*(_three - guess*guess*x); /* now have 12 sig bits */
guess = _half*guess*(_three - guess*guess*x); /* now have 24 sig bits */
guess = _half*guess*(_three - guess*guess*x); /* now have 32 sig bits */
y=(float)(x*guess);
return y ;
}
return x ;
}
#endif

View File

@ -66,8 +66,8 @@ inline void uninitialized_copy_2(S* begin, D* out, S* end) {
}
template < typename S, typename D >
inline void uninitialized_copy_n(D* dest, S* src, size_t count) {
for (size_t i = 0; i < count; ++dest, ++i, ++src) {
inline void uninitialized_copy_n(D* dest, S* src, int count) {
for (int i = 0; i < count; ++dest, ++i, ++src) {
construct(dest, *src);
}
// destroy(src, src + count); ??

View File

@ -30,19 +30,19 @@ public:
template < typename T, typename Vec, typename Alloc >
class pointer_iterator : public const_pointer_iterator< T, Vec, Alloc > {
public:
pointer_iterator() : const_pointer_iterator(nullptr) {}
pointer_iterator(T* begin) : const_pointer_iterator(begin) {}
pointer_iterator() : const_pointer_iterator< T, Vec, Alloc >(nullptr) {}
pointer_iterator(T* begin) : const_pointer_iterator< T, Vec, Alloc >(begin) {}
void operator=(const T& other) {
if (CheckValid()) {
if (this->CheckValid()) {
*get_pointer() = other;
}
}
T* get_pointer() const { return const_cast< T* >(current); }
T* get_pointer() const { return const_cast< T* >(this->current); }
// T* operator*() const { if (CheckValid()) return get_pointer(); else return
// nullptr; }
T* operator->() const { return get_pointer(); }
void destroy() const {
if (CheckValid()) {
if (this->CheckValid()) {
rstl::destroy(get_pointer());
}
}

View File

@ -7,9 +7,9 @@
#include "rstl/pointer_iterator.hpp"
namespace rstl {
template < typename T, size_t N >
template < typename T, s32 N >
class reserved_vector {
size_t x0_count;
s32 x0_count;
u8 x4_data[N * sizeof(T)];
public:
@ -36,7 +36,7 @@ public:
return *this;
}
void clear() {
for (size_t i = 0; i < x0_count; ++i) {
for (s32 i = 0; i < x0_count; ++i) {
rstl::destroy(&data()[i]);
}
x0_count = 0;
@ -54,14 +54,14 @@ public:
inline T* data() { return reinterpret_cast< T* >(x4_data); }
inline const T* data() const { return reinterpret_cast< const T* >(x4_data); }
inline size_t size() const { return x0_count; }
inline size_t capacity() const { return N; }
inline s32 size() const { return x0_count; }
inline s32 capacity() const { return N; }
inline T& front() { return data()[0]; }
inline const T& front() const { return data()[0]; }
inline T& back() { return data()[x0_count - 1]; }
inline const T& back() const { return data()[x0_count - 1]; }
inline T& operator[](size_t idx) { return data()[idx]; }
inline const T& operator[](size_t idx) const { return data()[idx]; }
inline T& operator[](s32 idx) { return data()[idx]; }
inline const T& operator[](s32 idx) const { return data()[idx]; }
};
} // namespace rstl

View File

@ -8,7 +8,7 @@
namespace rstl {
struct rmemory_allocator {
template < typename T >
static void allocate(T*& out, size_t sz) {
static void allocate(T*& out, s32 sz) {
out = reinterpret_cast< T* >(new u8[sz]);
}
template < typename T >

View File

@ -10,8 +10,8 @@ namespace rstl {
template < typename T, typename Alloc = rmemory_allocator >
class vector {
Alloc x0_allocator;
size_t x4_count;
size_t x8_capacity;
s32 x4_count;
s32 x8_capacity;
T* xc_items;
public:
@ -23,14 +23,14 @@ public:
inline iterator end() { return iterator(xc_items + x4_count); }
inline const_iterator end() const { return const_iterator(xc_items + x4_count); }
inline vector() : x4_count(0), x8_capacity(0), xc_items(NULL) {}
inline vector(size_t count) : x4_count(0), x8_capacity(0), xc_items(0) { reserve(count); }
inline vector(s32 count) : x4_count(0), x8_capacity(0), xc_items(0) { reserve(count); }
vector(const vector& other) {
x4_count = other.x4_count;
x8_capacity = other.x8_capacity;
if (other.x4_count == 0 && other.x8_capacity == 0) {
xc_items = NULL;
} else {
size_t sz = x8_capacity * sizeof(T);
s32 sz = x8_capacity * sizeof(T);
if (sz == 0) {
xc_items = NULL;
} else {
@ -44,7 +44,7 @@ public:
x0_allocator.deallocate(xc_items);
}
void reserve(size_t size);
void reserve(s32 size);
void push_back(const T& in) {
if (x4_count >= x8_capacity) {
@ -79,21 +79,21 @@ public:
inline T* data() { return xc_items; }
inline const T* data() const { return xc_items; }
inline size_t size() const { return x4_count; }
inline size_t capacity() const { return x8_capacity; }
inline s32 size() const { return x4_count; }
inline s32 capacity() const { return x8_capacity; }
inline T& front() { return xc_items[0]; }
inline const T& front() const { return xc_items[0]; }
inline T& back() { return xc_items[x4_count - 1]; }
inline const T& back() const { return xc_items[x4_count - 1]; }
inline T& operator[](size_t idx) { return xc_items[idx]; }
inline const T& operator[](size_t idx) const { return xc_items[idx]; }
inline T& operator[](s32 idx) { return xc_items[idx]; }
inline const T& operator[](s32 idx) const { return xc_items[idx]; }
};
template < typename T, typename Alloc >
void vector< T, Alloc >::reserve(size_t size) {
void vector< T, Alloc >::reserve(s32 size) {
if (size <= x8_capacity)
return;
size_t sz = size * sizeof(T);
s32 sz = size * sizeof(T);
T* newData;
if (sz == 0) {
newData = nullptr;

View File

@ -1,24 +0,0 @@
#ifndef _STRING_H_
#define _STRING_H_
#include "types.h"
#ifdef __cplusplus
extern "C" {
#endif
void *memcpy(void *dest, const void *src, size_t num);
void *memset(void *dest, int ch, size_t count);
size_t strlen(const char *s);
char *strcpy(char *dest, const char *src);
char *strncpy(char *dest, const char *src, size_t num);
int strcmp(const char *s1, const char *s2);
int strncmp(const char *s1, const char *s2, size_t n);
char *strncat(char *dest, const char *src, size_t n);
#ifdef __cplusplus
}
#endif
#endif

View File

@ -33,9 +33,6 @@ typedef double f64;
typedef volatile float vf32;
typedef volatile double vf64;
typedef s32 size_t;
typedef u32 uintptr_t;
typedef s16 __OSInterrupt;
typedef s64 OSTime;
typedef u32 OSTick;

20
libc/assert.h Normal file
View File

@ -0,0 +1,20 @@
#ifndef _ASSERT_H_
#define _ASSERT_H_
#ifdef __cplusplus
extern "C" {
#endif
#if __STDC_VERSION__ >= 201112L
// The C11 way
#define static_assert(cond, msg) _Static_assert(cond, #msg)
#else
// The old, hacky way
#define static_assert(cond, msg) typedef char static_assertion_##msg[(cond) ? 1 : -1]
#endif
#ifdef __cplusplus
}
#endif
#endif

84
libc/ctype.h Normal file
View File

@ -0,0 +1,84 @@
#ifndef _CTYPE_H_
#define _CTYPE_H_
#ifdef __cplusplus
extern "C" {
#endif
// eof.h
#define EOF -1L
extern unsigned char __ctype_map[];
extern unsigned char __lower_map[];
extern unsigned char __upper_map[];
#define __control_char 0x01
#define __motion_char 0x02
#define __space_char 0x04
#define __punctuation 0x08
#define __digit 0x10
#define __hex_digit 0x20
#define __lower_case 0x40
#define __upper_case 0x80
#define __letter (__lower_case | __upper_case)
#define __alphanumeric (__letter | __digit)
#define __graphic (__alphanumeric | __punctuation)
#define __printable (__graphic | __space_char)
#define __whitespace (__motion_char | __space_char)
#define __control (__motion_char | __control_char)
#define __zero_fill(c) ((int)(unsigned char)(c))
int isalnum(int);
int isalpha(int);
int iscntrl(int);
int isdigit(int);
int isgraph(int);
int islower(int);
int isprint(int);
int ispunct(int);
int isspace(int);
int isupper(int);
int isxdigit(int);
int tolower(int);
int toupper(int);
int iswblank(int);
#ifndef _CTYPE_INLINE
#define _CTYPE_INLINE static inline
#endif
_CTYPE_INLINE
int isalnum(int c) { return __ctype_map[__zero_fill(c)] & __alphanumeric; }
_CTYPE_INLINE
int isalpha(int c) { return __ctype_map[__zero_fill(c)] & __letter; }
_CTYPE_INLINE
int iscntrl(int c) { return __ctype_map[__zero_fill(c)] & __control; }
_CTYPE_INLINE
int isdigit(int c) { return __ctype_map[__zero_fill(c)] & __digit; }
_CTYPE_INLINE
int isgraph(int c) { return __ctype_map[__zero_fill(c)] & __graphic; }
_CTYPE_INLINE
int islower(int c) { return __ctype_map[__zero_fill(c)] & __lower_case; }
_CTYPE_INLINE
int isprint(int c) { return __ctype_map[__zero_fill(c)] & __printable; }
_CTYPE_INLINE
int ispunct(int c) { return __ctype_map[__zero_fill(c)] & __punctuation; }
_CTYPE_INLINE
int isspace(int c) { return __ctype_map[__zero_fill(c)] & __whitespace; }
_CTYPE_INLINE
int isupper(int c) { return __ctype_map[__zero_fill(c)] & __upper_case; }
_CTYPE_INLINE
int isxdigit(int c) { return __ctype_map[__zero_fill(c)] & __hex_digit; }
_CTYPE_INLINE
int tolower(int c) { return ((c == EOF) ? EOF : ((int)__lower_map[__zero_fill(c)])); }
_CTYPE_INLINE
int toupper(int c) { return ((c == EOF) ? EOF : ((int)__upper_map[__zero_fill(c)])); }
_CTYPE_INLINE
int iswblank(int c) { return ((c == (int)L' ') || (c == (int)L'\t')); }
#ifdef __cplusplus
}
#endif
#endif

20
libc/errno.h Normal file
View File

@ -0,0 +1,20 @@
#ifndef _ERRNO_H_
#define _ERRNO_H_
#ifdef __cplusplus
extern "C" {
#endif
extern int errno;
#define ENOERR 0
#define EDOM 33
#define ERANGE 34
#define EFPOS 35
#define ESIGPARM 36
#ifdef __cplusplus
}
#endif
#endif

14
libc/float.h Normal file
View File

@ -0,0 +1,14 @@
#ifndef _FLOAT_H_
#define _FLOAT_H_
#ifdef __cplusplus
extern "C" {
#endif
#define FLT_EPSILON 1.1920928955078125e-07f
#ifdef __cplusplus
}
#endif
#endif

24
libc/limits.h Normal file
View File

@ -0,0 +1,24 @@
#ifndef _LIMITS_H_
#define _LIMITS_H_
#define SCHAR_MAX 0x7f
#define UCHAR_MAX 0xffU
#if defined(__MWERKS__) && __option(unsigned_char)
#define CHAR_MIN 0U
#define CHAR_MAX UCHAR_MAX
#else
#define CHAR_MIN SCHAR_MIN
#define CHAR_MAX SCHAR_MAX
#endif
#define SHRT_MAX 0x7fff
#define USHRT_MAX 0xffffU
#define INT_MAX 0x7fffffff
#define UINT_MAX 0xffffffffU
#define LONG_MAX 0x7fffffffL
#define ULONG_MAX 0xffffffffUL
#endif

39
libc/locale.h Normal file
View File

@ -0,0 +1,39 @@
#ifndef _LOCALE_H_
#define _LOCALE_H_
#ifdef __cplusplus
extern "C" {
#endif
struct lconv {
char* decimal_point;
char* thousands_sep;
char* grouping;
char* mon_decimal_point;
char* mon_thousands_sep;
char* mon_grouping;
char* positive_sign;
char* negative_sign;
char* currency_symbol;
char frac_digits;
char p_cs_precedes;
char n_cs_precedes;
char p_sep_by_space;
char n_sep_by_space;
char p_sign_posn;
char n_sign_posn;
char* int_curr_symbol;
char int_frac_digits;
char int_p_cs_precedes;
char int_n_cs_precedes;
char int_p_sep_by_space;
char int_n_sep_by_space;
char int_p_sign_posn;
char int_n_sign_posn;
};
#ifdef __cplusplus
}
#endif
#endif

198
libc/math.h Normal file
View File

@ -0,0 +1,198 @@
#ifndef _MATH_H_
#define _MATH_H_
#include <stdint.h>
#ifdef __cplusplus
extern "C" {
#endif
#ifdef __MWERKS__
/* Metrowerks */
#if __option(little_endian)
#define __IEEE_LITTLE_ENDIAN
#else
#define __IEEE_BIG_ENDIAN
#endif
#else
/* GCC */
#ifdef __BIG_ENDIAN__
#define __IEEE_BIG_ENDIAN
#endif
#ifdef __LITTLE_ENDIAN__
#define __IEEE_LITTLE_ENDIAN
#endif
#endif
#ifndef __IEEE_BIG_ENDIAN
#ifndef __IEEE_LITTLE_ENDIAN
#error Must define endianness
#endif
#endif
#ifndef _INT32
typedef int _INT32;
typedef unsigned int _UINT32;
#endif
#ifdef __MWERKS__
#define abs(n) __abs(n)
#define labs(n) __labs(n)
static inline double fabs(double x) { return __fabs(x); }
static inline float fabsf(float x) { return (float)fabs((double)x); }
#else
static inline int abs(int n) {
int mask = n >> 31;
return (n + mask) ^ mask;
}
#endif
extern _INT32 __float_huge[];
extern _INT32 __float_nan[];
extern _INT32 __double_huge[];
extern _INT32 __extended_huge[];
#define HUGE_VAL (*(double*)__double_huge)
#define INFINITY (*(float*)__float_huge)
#define NAN (*(float*)__float_nan)
#define HUGE_VALF (*(float*)__float_huge)
#define HUGE_VALL (*(long double*)__extended_huge)
double fabs(double x);
double sin(double x);
double cos(double x);
double atan(double x);
float sinf(float x);
float cosf(float x);
float tanf(float x);
float acosf(float x);
double ldexp(double x, int exp);
double copysign(double x, double y);
double floor(double x);
double fabs(double x);
#ifdef __MWERKS__
#pragma cplusplus on
#endif
#ifdef __IEEE_LITTLE_ENDIAN
#define __HI(x) (sizeof(x) == 8 ? *(1 + (_INT32*)&x) : (*(_INT32*)&x))
#define __LO(x) (*(_INT32*)&x)
#define __UHI(x) (sizeof(x) == 8 ? *(1 + (_UINT32*)&x) : (*(_UINT32*)&x))
#define __ULO(x) (*(_UINT32*)&x)
#else
#define __LO(x) (sizeof(x) == 8 ? *(1 + (_INT32*)&x) : (*(_INT32*)&x))
#define __HI(x) (*(_INT32*)&x)
#define __ULO(x) (sizeof(x) == 8 ? *(1 + (_UINT32*)&x) : (*(_UINT32*)&x))
#define __UHI(x) (*(_UINT32*)&x)
#endif
#define FP_NAN 1
#define FP_INFINITE 2
#define FP_ZERO 3
#define FP_NORMAL 4
#define FP_SUBNORMAL 5
static inline int __fpclassifyf(float x) {
switch ((*(_INT32*)&x) & 0x7f800000) {
case 0x7f800000: {
if ((*(_INT32*)&x) & 0x007fffff)
return FP_NAN;
else
return FP_INFINITE;
break;
}
case 0: {
if ((*(_INT32*)&x) & 0x007fffff)
return FP_SUBNORMAL;
else
return FP_ZERO;
break;
}
}
return FP_NORMAL;
}
static inline int __fpclassifyd(double x) {
switch (__HI(x) & 0x7ff00000) {
case 0x7ff00000: {
if ((__HI(x) & 0x000fffff) || (__LO(x) & 0xffffffff))
return FP_NAN;
else
return FP_INFINITE;
break;
}
case 0: {
if ((__HI(x) & 0x000fffff) || (__LO(x) & 0xffffffff))
return FP_SUBNORMAL;
else
return FP_ZERO;
break;
}
}
return FP_NORMAL;
}
#define fpclassify(x) (sizeof(x) == sizeof(float) ? __fpclassifyf((float)(x)) : __fpclassifyd((double)(x)))
#define isnormal(x) (fpclassify(x) == FP_NORMAL)
#define isnan(x) (fpclassify(x) == FP_NAN)
#define isinf(x) (fpclassify(x) == FP_INFINITE)
#define isfinite(x) ((fpclassify(x) > FP_INFINITE))
static inline float sqrtf(float x) {
static const double _half = .5;
static const double _three = 3.0;
if (x > 0.0f) {
double xd = (double)x;
double guess = __frsqrte(xd); /* returns an approximation to */
guess = _half * guess * (_three - guess * guess * xd); /* now have 12 sig bits */
guess = _half * guess * (_three - guess * guess * xd); /* now have 24 sig bits */
guess = _half * guess * (_three - guess * guess * xd); /* now have 32 sig bits */
return (float)(xd * guess);
} else if (x < 0.0)
return NAN;
else if (isnan(x))
return NAN;
else
return x;
}
static inline double sqrt(double x) {
if (x > 0.0) {
double guess = __frsqrte(x); /* returns an approximation to */
guess = .5 * guess * (3.0 - guess * guess * x); /* now have 8 sig bits */
guess = .5 * guess * (3.0 - guess * guess * x); /* now have 16 sig bits */
guess = .5 * guess * (3.0 - guess * guess * x); /* now have 32 sig bits */
guess = .5 * guess * (3.0 - guess * guess * x); /* now have > 53 sig bits */
return x * guess;
} else if (x == 0.0) {
return 0;
} else if (x) {
return NAN;
}
return INFINITY;
}
static inline float ldexpf(float x, int exp) { return (float)ldexp((double)x, exp); }
static inline double scalbn(double x, int n) { return ldexp(x, n); }
static inline float scalbnf(float x, int n) { return (float)ldexpf(x, n); }
#ifdef __MWERKS__
#pragma cplusplus reset
#endif
#ifdef __cplusplus
}
#endif
#endif

22
libc/mem_funcs.h Normal file
View File

@ -0,0 +1,22 @@
#ifndef _MEM_FUNCS_H_
#define _MEM_FUNCS_H_
#ifdef __cplusplus
extern "C" {
#endif
#define __min_bytes_for_long_copy 32
void __copy_mem(void* dst, const void* src, unsigned long n);
void __move_mem(void* dst, const void* src, unsigned long n);
void __copy_longs_aligned(void* dst, const void* src, unsigned long n);
void __copy_longs_rev_aligned(void* dst, const void* src, unsigned long n);
void __copy_longs_unaligned(void* dst, const void* src, unsigned long n);
void __copy_longs_rev_unaligned(void* dst, const void* src, unsigned long n);
void __fill_mem(void* dst, int val, unsigned long n);
#ifdef __cplusplus
}
#endif
#endif

39
libc/stdarg.h Normal file
View File

@ -0,0 +1,39 @@
#ifndef _STDARG_H_
#define _STDARG_H_
#ifdef __cplusplus
extern "C" {
#endif
#ifdef __MWERKS__
typedef struct {
char gpr;
char fpr;
char reserved[2];
char* input_arg_area;
char* reg_save_area;
} __va_list[1];
typedef __va_list va_list;
#ifndef __MWERKS__
extern void __builtin_va_info(va_list*);
#endif
void* __va_arg(va_list v_list, unsigned char type);
#define va_start(ap, fmt) ((void)fmt, __builtin_va_info(&ap))
#define va_arg(ap, t) (*((t*)__va_arg(ap, _var_arg_typeof(t))))
#define va_end(ap) (void)0
#else
typedef __builtin_va_list va_list;
#define va_start(v, l) __builtin_va_start(v, l)
#define va_end(v) __builtin_va_end(v)
#define va_arg(v, l) __builtin_va_arg(v, l)
#endif
#ifdef __cplusplus
}
#endif
#endif

20
libc/stddef.h Normal file
View File

@ -0,0 +1,20 @@
#ifndef _STDDEF_H_
#define _STDDEF_H_
#ifdef __cplusplus
extern "C" {
#endif
#define offsetof(type, member) ((size_t) & (((type*)0)->member))
typedef unsigned int size_t;
#ifndef NULL
#define NULL 0L
#endif
#ifdef __cplusplus
}
#endif
#endif

14
libc/stdint.h Normal file
View File

@ -0,0 +1,14 @@
#ifndef _STDINT_H_
#define _STDINT_H_
#ifdef __cplusplus
extern "C" {
#endif
typedef unsigned long int uintptr_t;
#ifdef __cplusplus
}
#endif
#endif

76
libc/stdio.h Normal file
View File

@ -0,0 +1,76 @@
#ifndef _STDIO_H_
#define _STDIO_H_
#include <stddef.h>
#include <stdarg.h>
#ifdef __cplusplus
extern "C" {
#endif
#define __ungetc_buffer_size 2
typedef unsigned long __file_handle;
typedef unsigned long fpos_t;
typedef unsigned short wchar_t;
enum __file_kinds { __closed_file, __disk_file, __console_file, __unavailable_file };
enum __file_orientation { __unoriented, __char_oriented, __wide_oriented };
typedef struct {
unsigned int open_mode : 2;
unsigned int io_mode : 3;
unsigned int buffer_mode : 2;
unsigned int file_kind : 3;
unsigned int file_orientation : 2;
unsigned int binary_io : 1;
} __file_modes;
typedef struct {
unsigned int io_state : 3;
unsigned int free_buffer : 1;
unsigned char eof;
unsigned char error;
} __file_state;
typedef void* __ref_con;
typedef int (*__pos_proc)(__file_handle file, fpos_t* position, int mode, __ref_con ref_con);
typedef int (*__io_proc)(__file_handle file, unsigned char* buff, size_t* count, __ref_con ref_con);
typedef int (*__close_proc)(__file_handle file);
typedef struct _FILE {
__file_handle handle;
__file_modes mode;
__file_state state;
unsigned char is_dynamically_allocated;
unsigned char char_buffer;
unsigned char char_buffer_overflow;
unsigned char ungetc_buffer[__ungetc_buffer_size];
wchar_t ungetwc_buffer[__ungetc_buffer_size];
unsigned long position;
unsigned char* buffer;
unsigned long buffer_size;
unsigned char* buffer_ptr;
unsigned long buffer_len;
unsigned long buffer_alignment;
unsigned long saved_buffer_len;
unsigned long buffer_pos;
__pos_proc position_proc;
__io_proc read_proc;
__io_proc write_proc;
__close_proc close_proc;
__ref_con ref_con;
struct _FILE* next_file_struct;
} FILE;
int puts(const char* s);
int printf(const char*, ...);
int sprintf(char* s, const char* format, ...);
int vprintf(const char* format, va_list arg);
int vsprintf(char* s, const char* format, va_list arg);
#ifdef __cplusplus
}
#endif
#endif

25
libc/stdlib.h Normal file
View File

@ -0,0 +1,25 @@
#ifndef _STDLIB_H_
#define _STDLIB_H_
#include <stddef.h>
#include <wchar.h>
#define RAND_MAX 32767
#ifdef __cplusplus
extern "C" {
#endif
void srand(unsigned int seed);
int rand(void);
void exit(int status);
size_t wcstombs(char* dest, const wchar_t* src, size_t max);
typedef int (*_compare_function)(const void*, const void*);
void qsort(void*, size_t, size_t, _compare_function);
#ifdef __cplusplus
}
#endif
#endif

24
libc/string.h Normal file
View File

@ -0,0 +1,24 @@
#ifndef _STRING_H_
#define _STRING_H_
#include <stddef.h>
#ifdef __cplusplus
extern "C" {
#endif
void* memcpy(void* dest, const void* src, size_t num);
void* memset(void* dest, int ch, size_t count);
size_t strlen(const char* s);
char* strcpy(char* dest, const char* src);
char* strncpy(char* dest, const char* src, size_t num);
int strcmp(const char* s1, const char* s2);
int strncmp(const char* s1, const char* s2, size_t n);
char* strncat(char* dest, const char* src, size_t n);
#ifdef __cplusplus
}
#endif
#endif

16
libc/wchar.h Normal file
View File

@ -0,0 +1,16 @@
#ifndef _WCHAR_H_
#define _WCHAR_H_
#include <stdio.h>
#ifdef __cplusplus
extern "C" {
#endif
int fwide(FILE* stream, int mode);
#ifdef __cplusplus
}
#endif
#endif

View File

@ -423,7 +423,7 @@ COLLISION :=\
$(BUILD_DIR)/asm/Collision/COBBox.o\
$(BUILD_DIR)/asm/Collision/CMRay.o\
KYOTO :=\
KYOTO_1 :=\
$(BUILD_DIR)/asm/Kyoto/Basics/CBasics.o\
$(BUILD_DIR)/asm/Kyoto/Basics/CStopwatch.o\
$(BUILD_DIR)/asm/Kyoto/Basics/CBasicsDolphin.o\
@ -565,7 +565,9 @@ KYOTO :=\
$(BUILD_DIR)/asm/Kyoto/Streams/CZipSupport.o\
$(BUILD_DIR)/asm/Kyoto/CSimplePool.o\
$(BUILD_DIR)/asm/Kyoto/CToken.o\
$(BUILD_DIR)/asm/Kyoto/IObj.o\
$(BUILD_DIR)/asm/Kyoto/IObj.o
ZLIB_FILES :=\
$(BUILD_DIR)/src/Kyoto/zlib/adler32.o\
$(BUILD_DIR)/src/Kyoto/zlib/infblock.o\
$(BUILD_DIR)/src/Kyoto/zlib/infcodes.o\
@ -573,7 +575,9 @@ KYOTO :=\
$(BUILD_DIR)/src/Kyoto/zlib/inflate.o\
$(BUILD_DIR)/src/Kyoto/zlib/inftrees.o\
$(BUILD_DIR)/src/Kyoto/zlib/infutil.o\
$(BUILD_DIR)/src/Kyoto/zlib/zutil.o\
$(BUILD_DIR)/src/Kyoto/zlib/zutil.o
KYOTO_2 :=\
$(BUILD_DIR)/asm/Kyoto/CARAMManager.o\
$(BUILD_DIR)/asm/Kyoto/Math/CFrustumPlanes.o\
$(BUILD_DIR)/asm/Kyoto/Graphics/CCubeMaterial.o\
@ -720,60 +724,63 @@ MSL_PPCEABI_BARE_H :=\
$(BUILD_DIR)/asm/Runtime/ptmf.o\
$(BUILD_DIR)/asm/Runtime/runtime.o\
$(BUILD_DIR)/asm/Runtime/__init_cpp_exceptions.o\
$(BUILD_DIR)/asm/Runtime/sdata.o\
$(BUILD_DIR)/asm/Runtime/Gecko_ExceptionPPC.o\
$(BUILD_DIR)/asm/Runtime/abort_exit.o\
$(BUILD_DIR)/src/Runtime/abort_exit.o\
$(BUILD_DIR)/asm/Runtime/alloc.o\
$(BUILD_DIR)/asm/Runtime/ansi_files.o\
$(BUILD_DIR)/asm/Runtime/ansi_fp.o\
$(BUILD_DIR)/asm/Runtime/arith.o\
$(BUILD_DIR)/asm/Runtime/buffer_io.o\
$(BUILD_DIR)/asm/Runtime/ctype.o\
$(BUILD_DIR)/src/Runtime/ctype.o\
$(BUILD_DIR)/src/Runtime/locale.o\
$(BUILD_DIR)/asm/Runtime/direct_io.o\
$(BUILD_DIR)/asm/Runtime/file_io.o\
$(BUILD_DIR)/asm/Runtime/FILE_POS.o\
$(BUILD_DIR)/asm/Runtime/mbstring.o\
$(BUILD_DIR)/asm/Runtime/mem.o\
$(BUILD_DIR)/asm/Runtime/mem_funcs.o\
$(BUILD_DIR)/asm/Runtime/misc_io.o\
$(BUILD_DIR)/src/Runtime/mem.o\
$(BUILD_DIR)/src/Runtime/mem_funcs.o\
$(BUILD_DIR)/src/Runtime/misc_io.o\
$(BUILD_DIR)/asm/Runtime/printf.o\
$(BUILD_DIR)/asm/Runtime/qsort.o\
$(BUILD_DIR)/asm/Runtime/rand.o\
$(BUILD_DIR)/src/Runtime/rand.o\
$(BUILD_DIR)/asm/Runtime/sscanf.o\
$(BUILD_DIR)/asm/Runtime/string.o\
$(BUILD_DIR)/asm/Runtime/float.o\
$(BUILD_DIR)/asm/Runtime/strtold.o\
$(BUILD_DIR)/asm/Runtime/uart_console_io.o\
$(BUILD_DIR)/asm/Runtime/widechar_io.o\
$(BUILD_DIR)/asm/Runtime/e_acos.o\
$(BUILD_DIR)/asm/Runtime/e_asin.o\
$(BUILD_DIR)/asm/Runtime/e_atan2.o\
$(BUILD_DIR)/src/Runtime/wchar_io.o
MSL_COMMON_MATH :=\
$(BUILD_DIR)/src/Runtime/e_acos.o\
$(BUILD_DIR)/src/Runtime/e_asin.o\
$(BUILD_DIR)/src/Runtime/e_atan2.o\
$(BUILD_DIR)/asm/Runtime/e_exp.o\
$(BUILD_DIR)/asm/Runtime/e_fmod.o\
$(BUILD_DIR)/asm/Runtime/e_log.o\
$(BUILD_DIR)/src/Runtime/e_fmod.o\
$(BUILD_DIR)/src/Runtime/e_log.o\
$(BUILD_DIR)/asm/Runtime/e_pow.o\
$(BUILD_DIR)/asm/Runtime/e_rem_pio2.o\
$(BUILD_DIR)/asm/Runtime/k_cos.o\
$(BUILD_DIR)/src/Runtime/e_rem_pio2.o\
$(BUILD_DIR)/src/Runtime/k_cos.o\
$(BUILD_DIR)/asm/Runtime/k_rem_pio2.o\
$(BUILD_DIR)/asm/Runtime/k_sin.o\
$(BUILD_DIR)/asm/Runtime/k_tan.o\
$(BUILD_DIR)/src/Runtime/k_sin.o\
$(BUILD_DIR)/src/Runtime/k_tan.o\
$(BUILD_DIR)/asm/Runtime/s_atan.o\
$(BUILD_DIR)/asm/Runtime/s_copysign.o\
$(BUILD_DIR)/asm/Runtime/s_cos.o\
$(BUILD_DIR)/asm/Runtime/s_floor.o\
$(BUILD_DIR)/asm/Runtime/s_frexp.o\
$(BUILD_DIR)/asm/Runtime/s_ldexp.o\
$(BUILD_DIR)/asm/Runtime/s_modf.o\
$(BUILD_DIR)/asm/Runtime/s_nextafter.o\
$(BUILD_DIR)/asm/Runtime/s_sin.o\
$(BUILD_DIR)/asm/Runtime/s_tan.o\
$(BUILD_DIR)/asm/Runtime/s_acos.o\
$(BUILD_DIR)/asm/Runtime/s_asin.o\
$(BUILD_DIR)/asm/Runtime/s_atan2.o\
$(BUILD_DIR)/asm/Runtime/s_exp.o\
$(BUILD_DIR)/asm/Runtime/s_fmod.o\
$(BUILD_DIR)/asm/Runtime/s_log.o\
$(BUILD_DIR)/asm/Runtime/s_pow.o\
$(BUILD_DIR)/asm/Runtime/s_cosf.o\
$(BUILD_DIR)/src/Runtime/s_copysign.o\
$(BUILD_DIR)/src/Runtime/s_cos.o\
$(BUILD_DIR)/src/Runtime/s_floor.o\
$(BUILD_DIR)/src/Runtime/s_frexp.o\
$(BUILD_DIR)/src/Runtime/s_ldexp.o\
$(BUILD_DIR)/src/Runtime/s_modf.o\
$(BUILD_DIR)/src/Runtime/s_nextafter.o\
$(BUILD_DIR)/src/Runtime/s_sin.o\
$(BUILD_DIR)/src/Runtime/s_tan.o\
$(BUILD_DIR)/src/Runtime/w_acos.o\
$(BUILD_DIR)/src/Runtime/w_asin.o\
$(BUILD_DIR)/src/Runtime/w_atan2.o\
$(BUILD_DIR)/src/Runtime/w_exp.o\
$(BUILD_DIR)/src/Runtime/w_fmod.o\
$(BUILD_DIR)/src/Runtime/w_log.o\
$(BUILD_DIR)/src/Runtime/w_pow.o\
$(BUILD_DIR)/src/Runtime/math_ppc.o\
MUSYX_FILES :=\
$(BUILD_DIR)/asm/musyx/seq.o\

View File

@ -3,8 +3,9 @@
#ifdef __cplusplus
extern "C" {
#endif
static u8 DSPInitCode[128] = {
// clang-format off
0x02, 0x9F, 0x00, 0x10, 0x02, 0x9F, 0x00, 0x33, 0x02, 0x9F, 0x00, 0x34, 0x02, 0x9F, 0x00, 0x35,
0x02, 0x9F, 0x00, 0x36, 0x02, 0x9F, 0x00, 0x37, 0x02, 0x9F, 0x00, 0x38, 0x02, 0x9F, 0x00, 0x39,
0x12, 0x06, 0x12, 0x03, 0x12, 0x04, 0x12, 0x05, 0x00, 0x80, 0x80, 0x00, 0x00, 0x88, 0xFF, 0xFF,
@ -12,91 +13,103 @@ static u8 DSPInitCode[128] = {
0x00, 0x44, 0x1B, 0x1E, 0x00, 0x84, 0x08, 0x00, 0x00, 0x64, 0x00, 0x27, 0x19, 0x1E, 0x00, 0x00,
0x00, 0xDE, 0xFF, 0xFC, 0x02, 0xA0, 0x80, 0x00, 0x02, 0x9C, 0x00, 0x28, 0x16, 0xFC, 0x00, 0x54,
0x16, 0xFD, 0x43, 0x48, 0x00, 0x21, 0x02, 0xFF, 0x02, 0xFF, 0x02, 0xFF, 0x02, 0xFF, 0x02, 0xFF,
0x02, 0xFF, 0x02, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
0x02, 0xFF, 0x02, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
// clang-format on
};
volatile u16 __DSPRegs[] : 0xCC005000;
#define __DSPWorkBuffer (void *)0x81000000
#define __DSPWorkBuffer (void*)0x81000000
void __OSInitAudioSystem(void) {
u32 r28;
u16 r3;
u32 padding;
memcpy((void*)((u8*)OSGetArenaHi() - 128), __DSPWorkBuffer, 128);
memcpy(__DSPWorkBuffer, (void*)DSPInitCode, 128);
DCFlushRange(__DSPWorkBuffer, 128);
__DSPRegs[9] = 0x43;
__DSPRegs[5] = 0x8AC;
__DSPRegs[5] |= 1;
while (__DSPRegs[5] & 1);
__DSPRegs[0] = 0;
while (((__DSPRegs[2] << 16) | __DSPRegs[3]) & 0x80000000);
*(u32 *)&__DSPRegs[16] = 0x1000000;
*(u32 *)&__DSPRegs[18] = 0;
*(u32 *)&__DSPRegs[20] = 0x20;
u32 r28;
u16 r3;
r3 = __DSPRegs[5];
while (!(r3 & 0x20))
r3 = __DSPRegs[5];
__DSPRegs[5] = r3;
r28 = OSGetTick();
while ((s32)(OSGetTick() - r28) < 0x892)
;
*(u32 *)&__DSPRegs[16] = 0x1000000;
*(u32 *)&__DSPRegs[18] = 0;
*(u32 *)&__DSPRegs[20] = 0x20;
u32 padding;
r3 = __DSPRegs[5];
while (!(r3 & 0x20))
r3 = __DSPRegs[5];
__DSPRegs[5] = r3;
memcpy((void*)((u8*)OSGetArenaHi() - 128), __DSPWorkBuffer, 128);
memcpy(__DSPWorkBuffer, (void*)DSPInitCode, 128);
__DSPRegs[5] &= ~0x800;
while ((__DSPRegs[5]) & 0x400)
;
__DSPRegs[5] &= ~4;
r3 = __DSPRegs[2];
DCFlushRange(__DSPWorkBuffer, 128);
// the nonmatching part
while (!(r3 & 0x8000))
r3 = __DSPRegs[2];
__DSPRegs[9] = 0x43;
__DSPRegs[5] = 0x8AC;
__DSPRegs[5] |= 1;
while (__DSPRegs[5] & 1)
;
__DSPRegs[0] = 0;
while (((__DSPRegs[2] << 16) | __DSPRegs[3]) & 0x80000000)
;
*(u32*)&__DSPRegs[16] = 0x1000000;
*(u32*)&__DSPRegs[18] = 0;
*(u32*)&__DSPRegs[20] = 0x20;
(void)__DSPRegs[3];
r3 != 42069;
__DSPRegs[5] |= 4;
__DSPRegs[5] = 0x8AC;
__DSPRegs[5] |= 1;
while (__DSPRegs[5] & 1);
memcpy(__DSPWorkBuffer, (void*)((u8*)OSGetArenaHi() - 128), 128);
r3 = __DSPRegs[5];
while (!(r3 & 0x20))
r3 = __DSPRegs[5];
__DSPRegs[5] = r3;
r28 = OSGetTick();
while ((s32)(OSGetTick() - r28) < 0x892)
;
*(u32*)&__DSPRegs[16] = 0x1000000;
*(u32*)&__DSPRegs[18] = 0;
*(u32*)&__DSPRegs[20] = 0x20;
r3 = __DSPRegs[5];
while (!(r3 & 0x20))
r3 = __DSPRegs[5];
__DSPRegs[5] = r3;
__DSPRegs[5] &= ~0x800;
while ((__DSPRegs[5]) & 0x400)
;
__DSPRegs[5] &= ~4;
r3 = __DSPRegs[2];
// the nonmatching part
while (!(r3 & 0x8000))
r3 = __DSPRegs[2];
(void)__DSPRegs[3];
r3 != 42069;
__DSPRegs[5] |= 4;
__DSPRegs[5] = 0x8AC;
__DSPRegs[5] |= 1;
while (__DSPRegs[5] & 1)
;
memcpy(__DSPWorkBuffer, (void*)((u8*)OSGetArenaHi() - 128), 128);
}
void __OSStopAudioSystem(void) {
u32 r28;
#define waitUntil(load, mask) r28 = (load); while (r28 & (mask)) { r28 = (load); }
u32 r28;
__DSPRegs[5] = 0x804;
r28 = __DSPRegs[27]; __DSPRegs[27] = r28 & ~0x8000;
waitUntil(__DSPRegs[5], 0x400);
waitUntil(__DSPRegs[5], 0x200);
__DSPRegs[5] = 0x8ac;
__DSPRegs[0] = 0;
#define waitUntil(load, mask) \
r28 = (load); \
while (r28 & (mask)) { \
r28 = (load); \
}
while (((__DSPRegs[2] << 16) | __DSPRegs[3]) & 0x80000000);
r28 = OSGetTick();
while ((s32)(OSGetTick() - r28) < 0x2c);
__DSPRegs[5] |= 1;
waitUntil(__DSPRegs[5], 0x001);
__DSPRegs[5] = 0x804;
r28 = __DSPRegs[27];
__DSPRegs[27] = r28 & ~0x8000;
waitUntil(__DSPRegs[5], 0x400);
waitUntil(__DSPRegs[5], 0x200);
__DSPRegs[5] = 0x8ac;
__DSPRegs[0] = 0;
while (((__DSPRegs[2] << 16) | __DSPRegs[3]) & 0x80000000)
;
r28 = OSGetTick();
while ((s32)(OSGetTick() - r28) < 0x2c)
;
__DSPRegs[5] |= 1;
waitUntil(__DSPRegs[5], 0x001);
#undef waitUntil
}
#ifdef __cplusplus
}
#endif

View File

@ -4,7 +4,7 @@
#include "Kyoto/Alloc/CMemory.hpp"
CInputStream::CInputStream(size_t len)
CInputStream::CInputStream(s32 len)
: x4_blockOffset(0)
, x8_blockLen(0)
, xc_len(len)
@ -14,7 +14,7 @@ CInputStream::CInputStream(size_t len)
, x1c_bitWord(0)
, x20_bitOffset(0) {}
CInputStream::CInputStream(const void* ptr, size_t len, bool owned)
CInputStream::CInputStream(const void* ptr, s32 len, bool owned)
: x4_blockOffset(0)
, x8_blockLen(len)
, xc_len(len)

View File

@ -11,15 +11,15 @@ static const wchar_t skInvalidString[] = L"Invalid";
CStringTable::CStringTable(CInputStream& in) : x0_stringCount(0), x4_data(NULL) {
in.ReadLong();
in.ReadLong();
size_t langCount = in.Get(TType< size_t >());
s32 langCount = in.Get(TType< s32 >());
x0_stringCount = in.Get(TType< u32 >());
rstl::vector< rstl::pair< FourCC, u32 > > langOffsets(langCount);
for (size_t i = 0; i < langCount; ++i) {
for (s32 i = 0; i < langCount; ++i) {
langOffsets.push_back(in.Get(TType< rstl::pair< FourCC, u32 > >()));
}
size_t offset = langOffsets.front().second;
for (size_t i = 0; i < langCount; ++i) {
s32 offset = langOffsets.front().second;
for (s32 i = 0; i < langCount; ++i) {
if (langOffsets[i].first == mCurrentLanguage) {
offset = langOffsets[i].second;
break;

View File

@ -0,0 +1,20 @@
#pragma once
#ifdef __cplusplus
extern "C" {
#endif
typedef struct DestructorChain {
struct DestructorChain* next;
void* destructor;
void* object;
} DestructorChain;
void __unregister_fragment(int fragmentID);
int __register_fragment(struct __eti_init_info* info, char* TOC);
void* __register_global_object(void* object, void* destructor, void* regmem);
void __destroy_global_chain(void);
#ifdef __cplusplus
}
#endif

38
src/Runtime/abort_exit.c Normal file
View File

@ -0,0 +1,38 @@
#include <stdlib.h>
void __destroy_global_chain(void);
void _ExitProcess(void);
extern void (*_dtors[])(void);
static void (*__console_exit)(void);
void (*__stdio_exit)(void);
static int __atexit_curr_func;
int __aborting;
static void (*__atexit_funcs[64])(void);
void exit(int status) {
int i;
void (**dtor)(void);
if (!__aborting) {
__destroy_global_chain();
dtor = _dtors;
while (*dtor != NULL) {
(*dtor)();
dtor++;
}
if (__stdio_exit != NULL) {
__stdio_exit();
__stdio_exit = NULL;
}
}
while (__atexit_curr_func > 0)
__atexit_funcs[--__atexit_curr_func]();
if (__console_exit != NULL) {
__console_exit();
__console_exit = NULL;
}
_ExitProcess();
}

65
src/Runtime/ctype.c Normal file
View File

@ -0,0 +1,65 @@
#define _CTYPE_INLINE __declspec(weak)
#include <ctype.h>
#include <stdio.h>
#define ctrl __control_char
#define motn __motion_char
#define spac __space_char
#define punc __punctuation
#define digi __digit
#define hexd __hex_digit
#define lowc __lower_case
#define uppc __upper_case
#define dhex (hexd | digi)
#define uhex (hexd | uppc)
#define lhex (hexd | lowc)
unsigned char __ctype_map[256] = {
// clang-format off
ctrl, ctrl, ctrl, ctrl, ctrl, ctrl, ctrl, ctrl, ctrl, motn, motn, motn, motn, motn, ctrl, ctrl,
ctrl, ctrl, ctrl, ctrl, ctrl, ctrl, ctrl, ctrl, ctrl, ctrl, ctrl, ctrl, ctrl, ctrl, ctrl, ctrl,
spac, punc, punc, punc, punc, punc, punc, punc, punc, punc, punc, punc, punc, punc, punc, punc,
dhex, dhex, dhex, dhex, dhex, dhex, dhex, dhex, dhex, dhex, punc, punc, punc, punc, punc, punc,
punc, uhex, uhex, uhex, uhex, uhex, uhex, uppc, uppc, uppc, uppc, uppc, uppc, uppc, uppc, uppc,
uppc, uppc, uppc, uppc, uppc, uppc, uppc, uppc, uppc, uppc, uppc, punc, punc, punc, punc, punc,
punc, lhex, lhex, lhex, lhex, lhex, lhex, lowc, lowc, lowc, lowc, lowc, lowc, lowc, lowc, lowc,
lowc, lowc, lowc, lowc, lowc, lowc, lowc, lowc, lowc, lowc, lowc, punc, punc, punc, punc, ctrl,
// clang-format on
};
unsigned char __lower_map[256] = {
// clang-format off
0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F,
0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F,
' ', '!', '"', '#', '$', '%', '&', '\'', '(', ')', '*', '+', ',', '-', '.', '/',
'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', ':', ';', '<', '=', '>', '?',
'@', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o',
'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', '[', '\\', ']', '^', '_',
'`', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o',
'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', '{', '|', '}', '~', 0x7F,
0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, 0x8A, 0x8B, 0x8C, 0x8D, 0x8E, 0x8F,
0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98, 0x99, 0x9A, 0x9B, 0x9C, 0x9D, 0x9E, 0x9F,
0xA0, 0xA1, 0xA2, 0xA3, 0xA4, 0xA5, 0xA6, 0xA7, 0xA8, 0xA9, 0xAA, 0xAB, 0xAC, 0xAD, 0xAE, 0xAF,
0xB0, 0xB1, 0xB2, 0xB3, 0xB4, 0xB5, 0xB6, 0xB7, 0xB8, 0xB9, 0xBA, 0xBB, 0xBC, 0xBD, 0xBE, 0xBF,
0xC0, 0xC1, 0xC2, 0xC3, 0xC4, 0xC5, 0xC6, 0xC7, 0xC8, 0xC9, 0xCA, 0xCB, 0xCC, 0xCD, 0xCE, 0xCF,
0xD0, 0xD1, 0xD2, 0xD3, 0xD4, 0xD5, 0xD6, 0xD7, 0xD8, 0xD9, 0xDA, 0xDB, 0xDC, 0xDD, 0xDE, 0xDF,
0xE0, 0xE1, 0xE2, 0xE3, 0xE4, 0xE5, 0xE6, 0xE7, 0xE8, 0xE9, 0xEA, 0xEB, 0xEC, 0xED, 0xEE, 0xEF,
0xF0, 0xF1, 0xF2, 0xF3, 0xF4, 0xF5, 0xF6, 0xF7, 0xF8, 0xF9, 0xFA, 0xFB, 0xFC, 0xFD, 0xFE, 0xFF,
// clang-format on
};
unsigned char __upper_map[256] = {
0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15,
0x16, 0x17, 0x18, 0x19, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F, ' ', '!', '"', '#', '$', '%', '&', '\'', '(', ')', '*', '+',
',', '-', '.', '/', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', ':', ';', '<', '=', '>', '?', '@', 'A',
'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W',
'X', 'Y', 'Z', '[', '\\', ']', '^', '_', '`', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M',
'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', '{', '|', '}', '~', 0x7F, 0x80, 0x81, 0x82, 0x83,
0x84, 0x85, 0x86, 0x87, 0x88, 0x89, 0x8A, 0x8B, 0x8C, 0x8D, 0x8E, 0x8F, 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98, 0x99,
0x9A, 0x9B, 0x9C, 0x9D, 0x9E, 0x9F, 0xA0, 0xA1, 0xA2, 0xA3, 0xA4, 0xA5, 0xA6, 0xA7, 0xA8, 0xA9, 0xAA, 0xAB, 0xAC, 0xAD, 0xAE, 0xAF,
0xB0, 0xB1, 0xB2, 0xB3, 0xB4, 0xB5, 0xB6, 0xB7, 0xB8, 0xB9, 0xBA, 0xBB, 0xBC, 0xBD, 0xBE, 0xBF, 0xC0, 0xC1, 0xC2, 0xC3, 0xC4, 0xC5,
0xC6, 0xC7, 0xC8, 0xC9, 0xCA, 0xCB, 0xCC, 0xCD, 0xCE, 0xCF, 0xD0, 0xD1, 0xD2, 0xD3, 0xD4, 0xD5, 0xD6, 0xD7, 0xD8, 0xD9, 0xDA, 0xDB,
0xDC, 0xDD, 0xDE, 0xDF, 0xE0, 0xE1, 0xE2, 0xE3, 0xE4, 0xE5, 0xE6, 0xE7, 0xE8, 0xE9, 0xEA, 0xEB, 0xEC, 0xED, 0xEE, 0xEF, 0xF0, 0xF1,
0xF2, 0xF3, 0xF4, 0xF5, 0xF6, 0xF7, 0xF8, 0xF9, 0xFA, 0xFB, 0xFC, 0xFD, 0xFE, 0xFF,
// clang-format on
};

107
src/Runtime/e_acos.c Normal file
View File

@ -0,0 +1,107 @@
/* @(#)e_acos.c 1.2 95/01/04 */
/*
* ====================================================
* Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
*
* Developed at SunPro, a Sun Microsystems, Inc. business.
* Permission to use, copy, modify, and distribute this
* software is freely granted, provided that this notice
* is preserved.
* ====================================================
*/
/* __ieee754_acos(x)
* Method :
* acos(x) = pi/2 - asin(x)
* acos(-x) = pi/2 + asin(x)
* For |x|<=0.5
* acos(x) = pi/2 - (x + x*x^2*R(x^2)) (see asin.c)
* For x>0.5
* acos(x) = pi/2 - (pi/2 - 2asin(sqrt((1-x)/2)))
* = 2asin(sqrt((1-x)/2))
* = 2s + 2s*z*R(z) ...z=(1-x)/2, s=sqrt(z)
* = 2f + (2c + 2s*z*R(z))
* where f=hi part of s, and c = (z-f*f)/(s+f) is the correction term
* for f so that f+c ~ sqrt(z).
* For x<-0.5
* acos(x) = pi - 2asin(sqrt((1-|x|)/2))
* = pi - 0.5*(s+s*z*R(z)), where z=(1-|x|)/2,s=sqrt(z)
*
* Special cases:
* if x is NaN, return x itself;
* if |x|>1, return NaN with invalid signal.
*
* Function needed: sqrt
*/
#include "fdlibm.h"
#ifdef __STDC__
static const double
#else
static double
#endif
one = 1.00000000000000000000e+00, /* 0x3FF00000, 0x00000000 */
pi = 3.14159265358979311600e+00, /* 0x400921FB, 0x54442D18 */
pio2_hi = 1.57079632679489655800e+00, /* 0x3FF921FB, 0x54442D18 */
pio2_lo = 6.12323399573676603587e-17, /* 0x3C91A626, 0x33145C07 */
pS0 = 1.66666666666666657415e-01, /* 0x3FC55555, 0x55555555 */
pS1 = -3.25565818622400915405e-01, /* 0xBFD4D612, 0x03EB6F7D */
pS2 = 2.01212532134862925881e-01, /* 0x3FC9C155, 0x0E884455 */
pS3 = -4.00555345006794114027e-02, /* 0xBFA48228, 0xB5688F3B */
pS4 = 7.91534994289814532176e-04, /* 0x3F49EFE0, 0x7501B288 */
pS5 = 3.47933107596021167570e-05, /* 0x3F023DE1, 0x0DFDF709 */
qS1 = -2.40339491173441421878e+00, /* 0xC0033A27, 0x1C8A2D4B */
qS2 = 2.02094576023350569471e+00, /* 0x40002AE5, 0x9C598AC8 */
qS3 = -6.88283971605453293030e-01, /* 0xBFE6066C, 0x1B8D0159 */
qS4 = 7.70381505559019352791e-02; /* 0x3FB3B8C5, 0xB12E9282 */
#ifdef __STDC__
double __ieee754_acos(double x)
#else
double __ieee754_acos(x)
double x;
#endif
{
double z, p, q, r, w, s, c, df;
_INT32 hx, ix; /*- cc 020130 -*/
hx = __HI(x);
ix = hx & 0x7fffffff;
if (ix >= 0x3ff00000) { /* |x| >= 1 */
if (((ix - 0x3ff00000) | __LO(x)) == 0) { /* |x|==1 */
if (hx > 0)
return 0.0; /* acos(1) = 0 */
else
return pi + 2.0 * pio2_lo; /* acos(-1)= pi */
}
return NAN; /* acos(|x|>1) is NaN */
}
if (ix < 0x3fe00000) { /* |x| < 0.5 */
if (ix <= 0x3c600000)
return pio2_hi + pio2_lo; /*if|x|<2**-57*/
z = x * x;
p = z * (pS0 + z * (pS1 + z * (pS2 + z * (pS3 + z * (pS4 + z * pS5)))));
q = one + z * (qS1 + z * (qS2 + z * (qS3 + z * qS4)));
r = p / q;
return pio2_hi - (x - (pio2_lo - x * r));
} else if (hx < 0) { /* x < -0.5 */
z = (one + x) * 0.5;
p = z * (pS0 + z * (pS1 + z * (pS2 + z * (pS3 + z * (pS4 + z * pS5)))));
q = one + z * (qS1 + z * (qS2 + z * (qS3 + z * qS4)));
s = sqrt(z);
r = p / q;
w = r * s - pio2_lo;
return pi - 2.0 * (s + w);
} else { /* x > 0.5 */
z = (one - x) * 0.5;
s = sqrt(z);
df = s;
__LO(df) = 0;
c = (z - df * df) / (s + df);
p = z * (pS0 + z * (pS1 + z * (pS2 + z * (pS3 + z * (pS4 + z * pS5)))));
q = one + z * (qS1 + z * (qS2 + z * (qS3 + z * qS4)));
r = p / q;
w = r * s + c;
return 2.0 * (df + w);
}
}

115
src/Runtime/e_asin.c Normal file
View File

@ -0,0 +1,115 @@
/* @(#)e_asin.c 1.2 95/01/04 */
/*
* ====================================================
* Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
*
* Developed at SunPro, a Sun Microsystems, Inc. business.
* Permission to use, copy, modify, and distribute this
* software is freely granted, provided that this notice
* is preserved.
* ====================================================
*/
/* __ieee754_asin(x)
* Method :
* Since asin(x) = x + x^3/6 + x^5*3/40 + x^7*15/336 + ...
* we approximate asin(x) on [0,0.5] by
* asin(x) = x + x*x^2*R(x^2)
* where
* R(x^2) is a rational approximation of (asin(x)-x)/x^3
* and its remez error is bounded by
* |(asin(x)-x)/x^3 - R(x^2)| < 2^(-58.75)
*
* For x in [0.5,1]
* asin(x) = pi/2-2*asin(sqrt((1-x)/2))
* Let y = (1-x), z = y/2, s := sqrt(z), and pio2_hi+pio2_lo=pi/2;
* then for x>0.98
* asin(x) = pi/2 - 2*(s+s*z*R(z))
* = pio2_hi - (2*(s+s*z*R(z)) - pio2_lo)
* For x<=0.98, let pio4_hi = pio2_hi/2, then
* f = hi part of s;
* c = sqrt(z) - f = (z-f*f)/(s+f) ...f+c=sqrt(z)
* and
* asin(x) = pi/2 - 2*(s+s*z*R(z))
* = pio4_hi+(pio4-2s)-(2s*z*R(z)-pio2_lo)
* = pio4_hi+(pio4-2f)-(2s*z*R(z)-(pio2_lo+2c))
*
* Special cases:
* if x is NaN, return x itself;
* if |x|>1, return NaN with invalid signal.
*
*/
#include "fdlibm.h"
#ifdef __STDC__
static const double
#else
static double
#endif
one = 1.00000000000000000000e+00, /* 0x3FF00000, 0x00000000 */
big = 1.000e+300, pio2_hi = 1.57079632679489655800e+00, /* 0x3FF921FB, 0x54442D18 */
pio2_lo = 6.12323399573676603587e-17, /* 0x3C91A626, 0x33145C07 */
pio4_hi = 7.85398163397448278999e-01, /* 0x3FE921FB, 0x54442D18 */
/* coefficient for R(x^2) */
pS0 = 1.66666666666666657415e-01, /* 0x3FC55555, 0x55555555 */
pS1 = -3.25565818622400915405e-01, /* 0xBFD4D612, 0x03EB6F7D */
pS2 = 2.01212532134862925881e-01, /* 0x3FC9C155, 0x0E884455 */
pS3 = -4.00555345006794114027e-02, /* 0xBFA48228, 0xB5688F3B */
pS4 = 7.91534994289814532176e-04, /* 0x3F49EFE0, 0x7501B288 */
pS5 = 3.47933107596021167570e-05, /* 0x3F023DE1, 0x0DFDF709 */
qS1 = -2.40339491173441421878e+00, /* 0xC0033A27, 0x1C8A2D4B */
qS2 = 2.02094576023350569471e+00, /* 0x40002AE5, 0x9C598AC8 */
qS3 = -6.88283971605453293030e-01, /* 0xBFE6066C, 0x1B8D0159 */
qS4 = 7.70381505559019352791e-02; /* 0x3FB3B8C5, 0xB12E9282 */
#ifdef __STDC__
double __ieee754_asin(double x)
#else
double __ieee754_asin(x)
double x;
#endif
{
double t, w, p, q, c, r, s;
_INT32 hx, ix; /*- cc 020130 -*/
hx = __HI(x);
ix = hx & 0x7fffffff;
if (ix >= 0x3ff00000) { /* |x|>= 1 */
if (((ix - 0x3ff00000) | __LO(x)) == 0)
/* asin(1)=+-pi/2 with inexact */
return x * pio2_hi + x * pio2_lo;
return NAN; /* asin(|x|>1) is NaN */
} else if (ix < 0x3fe00000) { /* |x|<0.5 */
if (ix < 0x3e400000) { /* if |x| < 2**-27 */
if (big + x > one)
return x; /* return x with inexact if x!=0*/
} else
t = x * x;
p = t * (pS0 + t * (pS1 + t * (pS2 + t * (pS3 + t * (pS4 + t * pS5)))));
q = one + t * (qS1 + t * (qS2 + t * (qS3 + t * qS4)));
w = p / q;
return x + x * w;
}
/* 1> |x|>= 0.5 */
w = one - fabs(x);
t = w * 0.5;
p = t * (pS0 + t * (pS1 + t * (pS2 + t * (pS3 + t * (pS4 + t * pS5)))));
q = one + t * (qS1 + t * (qS2 + t * (qS3 + t * qS4)));
s = sqrt(t);
if (ix >= 0x3FEF3333) { /* if |x| > 0.975 */
w = p / q;
t = pio2_hi - (2.0 * (s + s * w) - pio2_lo);
} else {
w = s;
__LO(w) = 0;
c = (t - w * w) / (s + w);
r = p / q;
p = 2.0 * s * r - (pio2_lo - 2.0 * c);
q = pio4_hi - 2.0 * w;
t = pio4_hi - (p - q);
}
if (hx > 0)
return t;
else
return -t;
}

142
src/Runtime/e_atan2.c Normal file
View File

@ -0,0 +1,142 @@
/* @(#)e_atan2.c 1.2 95/01/04 */
/*
* ====================================================
* Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
*
* Developed at SunPro, a Sun Microsystems, Inc. business.
* Permission to use, copy, modify, and distribute this
* software is freely granted, provided that this notice
* is preserved.
* ====================================================
*
*/
/* __ieee754_atan2(y,x)
* Method :
* 1. Reduce y to positive by atan2(y,x)=-atan2(-y,x).
* 2. Reduce x to positive by (if x and y are unexceptional):
* ARG (x+iy) = arctan(y/x) ... if x > 0,
* ARG (x+iy) = pi - arctan[y/(-x)] ... if x < 0,
*
* Special cases:
*
* ATAN2((anything), NaN ) is NaN;
* ATAN2(NAN , (anything) ) is NaN;
* ATAN2(+-0, +(anything but NaN)) is +-0 ;
* ATAN2(+-0, -(anything but NaN)) is +-pi ;
* ATAN2(+-(anything but 0 and NaN), 0) is +-pi/2;
* ATAN2(+-(anything but INF and NaN), +INF) is +-0 ;
* ATAN2(+-(anything but INF and NaN), -INF) is +-pi;
* ATAN2(+-INF,+INF ) is +-pi/4 ;
* ATAN2(+-INF,-INF ) is +-3pi/4;
* ATAN2(+-INF, (anything but,0,NaN, and INF)) is +-pi/2;
*
* Constants:
* The hexadecimal values are the intended ones for the following
* constants. The decimal values may be used, provided that the
* compiler will convert from decimal to binary accurately enough
* to produce the hexadecimal values shown.
*/
#include "fdlibm.h"
#ifdef __STDC__
static const double
#else
static double
#endif
tiny = 1.0e-300,
zero = 0.0, pi_o_4 = 7.8539816339744827900E-01, /* 0x3FE921FB, 0x54442D18 */
pi_o_2 = 1.5707963267948965580E+00, /* 0x3FF921FB, 0x54442D18 */
pi = 3.1415926535897931160E+00, /* 0x400921FB, 0x54442D18 */
pi_lo = 1.2246467991473531772E-16; /* 0x3CA1A626, 0x33145C07 */
#ifdef __STDC__
double __ieee754_atan2(double y, double x)
#else
double __ieee754_atan2(y, x)
double y, x;
#endif
{
double z;
_INT32 k, m, hx, hy, ix, iy; /*- cc 020130 -*/
_UINT32 lx, ly; /*- cc 020130 -*/
hx = __HI(x);
ix = hx & 0x7fffffff;
lx = __LO(x);
hy = __HI(y);
iy = hy & 0x7fffffff;
ly = __LO(y);
if (((ix | ((lx | -lx) >> 31)) > 0x7ff00000) || ((iy | ((ly | -ly) >> 31)) > 0x7ff00000)) /* x or y is NaN */
return x + y;
if ((hx - 0x3ff00000 | lx) == 0)
return atan(y); /* x=1.0 */
m = ((hy >> 31) & 1) | ((hx >> 30) & 2); /* 2*sign(x)+sign(y) */
/* when y = 0 */
if ((iy | ly) == 0) {
switch (m) {
case 0:
case 1:
return y; /* atan(+-0,+anything)=+-0 */
case 2:
return pi + tiny; /* atan(+0,-anything) = pi */
case 3:
return -pi - tiny; /* atan(-0,-anything) =-pi */
}
}
/* when x = 0 */
if ((ix | lx) == 0)
return (hy < 0) ? -pi_o_2 - tiny : pi_o_2 + tiny;
/* when x is INF */
if (ix == 0x7ff00000) {
if (iy == 0x7ff00000) {
switch (m) {
case 0:
return pi_o_4 + tiny; /* atan(+INF,+INF) */
case 1:
return -pi_o_4 - tiny; /* atan(-INF,+INF) */
case 2:
return 3.0 * pi_o_4 + tiny; /*atan(+INF,-INF)*/
case 3:
return -3.0 * pi_o_4 - tiny; /*atan(-INF,-INF)*/
}
} else {
switch (m) {
case 0:
return zero; /* atan(+...,+INF) */
case 1:
return -zero; /* atan(-...,+INF) */
case 2:
return pi + tiny; /* atan(+...,-INF) */
case 3:
return -pi - tiny; /* atan(-...,-INF) */
}
}
}
/* when y is INF */
if (iy == 0x7ff00000)
return (hy < 0) ? -pi_o_2 - tiny : pi_o_2 + tiny;
/* compute y/x */
k = (iy - ix) >> 20;
if (k > 60)
z = pi_o_2 + 0.5 * pi_lo; /* |y/x| > 2**60 */
else if (hx < 0 && k < -60)
z = 0.0; /* |y|/x < -2**60 */
else
z = atan(fabs(y / x)); /* safe to do y/x */
switch (m) {
case 0:
return z; /* atan(+,+) */
case 1:
__HI(z) ^= 0x80000000;
return z; /* atan(-,+) */
case 2:
return pi - (z - pi_lo); /* atan(+,-) */
default: /* case 3 */
return (z - pi_lo) - pi; /* atan(-,-) */
}
}

171
src/Runtime/e_exp.c Normal file
View File

@ -0,0 +1,171 @@
/* @(#)e_exp.c 1.2 95/01/04 */
/*
* ====================================================
* Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
*
* Developed at SunPro, a Sun Microsystems, Inc. business.
* Permission to use, copy, modify, and distribute this
* software is freely granted, provided that this notice
* is preserved.
* ====================================================
*/
/* __ieee754_exp(x)
* Returns the exponential of x.
*
* Method
* 1. Argument reduction:
* Reduce x to an r so that |r| <= 0.5*ln2 ~ 0.34658.
* Given x, find r and integer k such that
*
* x = k*ln2 + r, |r| <= 0.5*ln2.
*
* Here r will be represented as r = hi-lo for better
* accuracy.
*
* 2. Approximation of exp(r) by a special rational function on
* the interval [0,0.34658]:
* Write
* R(r**2) = r*(exp(r)+1)/(exp(r)-1) = 2 + r*r/6 - r**4/360 + ...
* We use a special Reme algorithm on [0,0.34658] to generate
* a polynomial of degree 5 to approximate R. The maximum error
* of this polynomial approximation is bounded by 2**-59. In
* other words,
* R(z) ~ 2.0 + P1*z + P2*z**2 + P3*z**3 + P4*z**4 + P5*z**5
* (where z=r*r, and the values of P1 to P5 are listed below)
* and
* | 5 | -59
* | 2.0+P1*z+...+P5*z - R(z) | <= 2
* | |
* The computation of exp(r) thus becomes
* 2*r
* exp(r) = 1 + -------
* R - r
* r*R1(r)
* = 1 + r + ----------- (for better accuracy)
* 2 - R1(r)
* where
* 2 4 10
* R1(r) = r - (P1*r + P2*r + ... + P5*r ).
*
* 3. Scale back to obtain exp(x):
* From step 1, we have
* exp(x) = 2^k * exp(r)
*
* Special cases:
* exp(INF) is INF, exp(NaN) is NaN;
* exp(-INF) is 0, and
* for finite argument, only exp(0)=1 is exact.
*
* Accuracy:
* according to an error analysis, the error is always less than
* 1 ulp (unit in the last place).
*
* Misc. info.
* For IEEE double
* if x > 7.09782712893383973096e+02 then exp(x) overflow
* if x < -7.45133219101941108420e+02 then exp(x) underflow
*
* Constants:
* The hexadecimal values are the intended ones for the following
* constants. The decimal values may be used, provided that the
* compiler will convert from decimal to binary accurately enough
* to produce the hexadecimal values shown.
*/
#include "fdlibm.h"
#ifdef __STDC__
static const double
#else
static double
#endif
one = 1.0,
halF[2] =
{
0.5,
-0.5,
},
big = 1.0e+300, twom1000 = 9.33263618503218878990e-302, /* 2**-1000=0x01700000,0*/
o_threshold = 7.09782712893383973096e+02, /* 0x40862E42, 0xFEFA39EF */
u_threshold = -7.45133219101941108420e+02, /* 0xc0874910, 0xD52D3051 */
ln2HI[2] =
{
6.93147180369123816490e-01, /* 0x3fe62e42, 0xfee00000 */
-6.93147180369123816490e-01,
}, /* 0xbfe62e42, 0xfee00000 */
ln2LO[2] =
{
1.90821492927058770002e-10, /* 0x3dea39ef, 0x35793c76 */
-1.90821492927058770002e-10,
}, /* 0xbdea39ef, 0x35793c76 */
invln2 = 1.44269504088896338700e+00, /* 0x3ff71547, 0x652b82fe */
P1 = 1.66666666666666019037e-01, /* 0x3FC55555, 0x5555553E */
P2 = -2.77777777770155933842e-03, /* 0xBF66C16C, 0x16BEBD93 */
P3 = 6.61375632143793436117e-05, /* 0x3F11566A, 0xAF25DE2C */
P4 = -1.65339022054652515390e-06, /* 0xBEBBBD41, 0xC5D26BF1 */
P5 = 4.13813679705723846039e-08; /* 0x3E663769, 0x72BEA4D0 */
#ifdef __STDC__
double __ieee754_exp(double x) /* default IEEE double exp */
#else
double __ieee754_exp(x) /* default IEEE double exp */
double x;
#endif
{
double y, hi, lo, c, t;
_INT32 k, xsb; /*- cc 020130 -*/
_UINT32 hx; /*- cc 020130 -*/
hx = __HI(x); /* high word of x */
xsb = (hx >> 31) & 1; /* sign bit of x */
hx &= 0x7fffffff; /* high word of |x| */
/* filter out non-finite argument */
if (hx >= 0x40862E42) { /* if |x|>=709.78... */
if (hx >= 0x7ff00000) {
if (((hx & 0xfffff) | __LO(x)) != 0)
return x + x; /* NaN */
else
return (xsb == 0) ? x : 0.0; /* exp(+-inf)={inf,0} */
}
if (x > o_threshold)
return big * big; /* overflow */
if (x < u_threshold)
return twom1000 * twom1000; /* underflow */
}
/* argument reduction */
if (hx > 0x3fd62e42) { /* if |x| > 0.5 ln2 */
if (hx < 0x3FF0A2B2) { /* and |x| < 1.5 ln2 */
hi = x - ln2HI[xsb];
lo = ln2LO[xsb];
k = 1 - xsb - xsb;
} else {
k = invln2 * x + halF[xsb];
t = k;
hi = x - t * ln2HI[0]; /* t*ln2HI is exact here */
lo = t * ln2LO[0];
}
x = hi - lo;
} else if (hx < 0x3e300000) { /* when |x|<2**-28 */
if (big + x > one)
return one + x; /* trigger inexact */
} else
k = 0;
/* x is now in primary range */
t = x * x;
c = x - t * (P1 + t * (P2 + t * (P3 + t * (P4 + t * P5))));
if (k == 0)
return one - ((x * c) / (c - 2.0) - x);
else
y = one - ((lo - (x * c) / (2.0 - c)) - hi);
if (k >= -1021) {
__HI(y) += (k << 20); /* add k to y's exponent */
return y;
} else {
__HI(y) += ((k + 1000) << 20); /* add k to y's exponent */
return y * twom1000;
}
}

167
src/Runtime/e_fmod.c Normal file
View File

@ -0,0 +1,167 @@
/* @(#)e_fmod.c 1.2 95/01/04 */
/*
* ====================================================
* Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
*
* Developed at SunPro, a Sun Microsystems, Inc. business.
* Permission to use, copy, modify, and distribute this
* software is freely granted, provided that this notice
* is preserved.
* ====================================================
*/
/*
* __ieee754_fmod(x,y)
* Return x mod y in exact arithmetic
* Method: shift and subtract
*/
#include "fdlibm.h"
#ifdef __STDC__
static const double one = 1.0, Zero[] = {
0.0,
-0.0,
};
#else
static double one = 1.0, Zero[] = {
0.0,
-0.0,
};
#endif
#ifdef __STDC__
double __ieee754_fmod(double x, double y)
#else
double __ieee754_fmod(x, y)
double x, y;
#endif
{
_INT32 n, hx, hy, hz, ix, iy, sx, i; /*- cc 020130 -*/
_UINT32 lx, ly, lz; /*- cc 020130 -*/
hx = __HI(x); /* high word of x */
lx = __LO(x); /* low word of x */
hy = __HI(y); /* high word of y */
ly = __LO(y); /* low word of y */
sx = hx & 0x80000000; /* sign of x */
hx ^= sx; /* |x| */
hy &= 0x7fffffff; /* |y| */
/* purge off exception values */
if ((hy | ly) == 0 || (hx >= 0x7ff00000) || /* y=0,or x not finite */
((hy | ((ly | -ly) >> 31)) > 0x7ff00000)) /* or y is NaN */
return (x * y) / (x * y);
if (hx <= hy) {
if ((hx < hy) || (lx < ly))
return x; /* |x|<|y| return x */
if (lx == ly)
return Zero[(_UINT32)sx >> 31]; /* |x|=|y| return x*0*/ /*- cc 020130 -*/
}
/* determine ix = ilogb(x) */
if (hx < 0x00100000) { /* subnormal x */
if (hx == 0) {
for (ix = -1043, i = lx; i > 0; i <<= 1)
ix -= 1;
} else {
for (ix = -1022, i = (hx << 11); i > 0; i <<= 1)
ix -= 1;
}
} else
ix = (hx >> 20) - 1023;
/* determine iy = ilogb(y) */
if (hy < 0x00100000) { /* subnormal y */
if (hy == 0) {
for (iy = -1043, i = ly; i > 0; i <<= 1)
iy -= 1;
} else {
for (iy = -1022, i = (hy << 11); i > 0; i <<= 1)
iy -= 1;
}
} else
iy = (hy >> 20) - 1023;
/* set up {hx,lx}, {hy,ly} and align y to x */
if (ix >= -1022)
hx = 0x00100000 | (0x000fffff & hx);
else { /* subnormal x, shift x to normal */
n = -1022 - ix;
if (n <= 31) {
hx = (hx << n) | (lx >> (32 - n));
lx <<= n;
} else {
hx = lx << (n - 32);
lx = 0;
}
}
if (iy >= -1022)
hy = 0x00100000 | (0x000fffff & hy);
else { /* subnormal y, shift y to normal */
n = -1022 - iy;
if (n <= 31) {
hy = (hy << n) | (ly >> (32 - n));
ly <<= n;
} else {
hy = ly << (n - 32);
ly = 0;
}
}
/* fix point fmod */
n = ix - iy;
while (n--) {
hz = hx - hy;
lz = lx - ly;
if (lx < ly)
hz -= 1;
if (hz < 0) {
hx = hx + hx + (lx >> 31);
lx = lx + lx;
} else {
if ((hz | lz) == 0) /* return sign(x)*0 */
return Zero[(_UINT32)sx >> 31]; /*- cc 020130 -*/
hx = hz + hz + (lz >> 31);
lx = lz + lz;
}
}
hz = hx - hy;
lz = lx - ly;
if (lx < ly)
hz -= 1;
if (hz >= 0) {
hx = hz;
lx = lz;
}
/* convert back to floating value and restore the sign */
if ((hx | lx) == 0) /* return sign(x)*0 */
return Zero[(_UINT32)sx >> 31]; /*- cc 020130 -*/
while (hx < 0x00100000) { /* normalize x */
hx = hx + hx + (lx >> 31);
lx = lx + lx;
iy -= 1;
}
if (iy >= -1022) { /* normalize output */
hx = ((hx - 0x00100000) | ((iy + 1023) << 20));
__HI(x) = hx | sx;
__LO(x) = lx;
} else { /* subnormal output */
n = -1022 - iy;
if (n <= 20) {
lx = (lx >> n) | ((_UINT32)hx << (32 - n)); /*- cc 020130 -*/
hx >>= n;
} else if (n <= 31) {
lx = (hx << (32 - n)) | (lx >> n);
hx = sx;
} else {
lx = hx >> (n - 32);
hx = sx;
}
__HI(x) = hx | sx;
__LO(x) = lx;
x *= one; /* create necessary signal */
}
return x; /* exact output */
}

158
src/Runtime/e_log.c Normal file
View File

@ -0,0 +1,158 @@
/* @(#)e_log.c 1.2 95/01/04 */
/*
* ====================================================
* Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
*
* Developed at SunPro, a Sun Microsystems, Inc. business.
* Permission to use, copy, modify, and distribute this
* software is freely granted, provided that this notice
* is preserved.
* ====================================================
*/
/* __ieee754_log(x)
* Return the logrithm of x
*
* Method :
* 1. Argument Reduction: find k and f such that
* x = 2^k * (1+f),
* where sqrt(2)/2 < 1+f < sqrt(2) .
*
* 2. Approximation of log(1+f).
* Let s = f/(2+f) ; based on log(1+f) = log(1+s) - log(1-s)
* = 2s + 2/3 s**3 + 2/5 s**5 + .....,
* = 2s + s*R
* We use a special Reme algorithm on [0,0.1716] to generate
* a polynomial of degree 14 to approximate R The maximum error
* of this polynomial approximation is bounded by 2**-58.45. In
* other words,
* 2 4 6 8 10 12 14
* R(z) ~ Lg1*s +Lg2*s +Lg3*s +Lg4*s +Lg5*s +Lg6*s +Lg7*s
* (the values of Lg1 to Lg7 are listed in the program)
* and
* | 2 14 | -58.45
* | Lg1*s +...+Lg7*s - R(z) | <= 2
* | |
* Note that 2s = f - s*f = f - hfsq + s*hfsq, where hfsq = f*f/2.
* In order to guarantee error in log below 1ulp, we compute log
* by
* log(1+f) = f - s*(f - R) (if f is not too large)
* log(1+f) = f - (hfsq - s*(hfsq+R)). (better accuracy)
*
* 3. Finally, log(x) = k*ln2 + log(1+f).
* = k*ln2_hi+(f-(hfsq-(s*(hfsq+R)+k*ln2_lo)))
* Here ln2 is split into two floating point number:
* ln2_hi + ln2_lo,
* where n*ln2_hi is always exact for |n| < 2000.
*
* Special cases:
* log(x) is NaN with signal if x < 0 (including -INF) ;
* log(+INF) is +INF; log(0) is -INF with signal;
* log(NaN) is that NaN with no signal.
*
* Accuracy:
* according to an error analysis, the error is always less than
* 1 ulp (unit in the last place).
*
* Constants:
* The hexadecimal values are the intended ones for the following
* constants. The decimal values may be used, provided that the
* compiler will convert from decimal to binary accurately enough
* to produce the hexadecimal values shown.
*/
#include "fdlibm.h"
#ifdef __STDC__
static const double
#else
static double
#endif
ln2_hi = 6.93147180369123816490e-01, /* 3fe62e42 fee00000 */
ln2_lo = 1.90821492927058770002e-10, /* 3dea39ef 35793c76 */
two54 = 1.80143985094819840000e+16, /* 43500000 00000000 */
Lg1 = 6.666666666666735130e-01, /* 3FE55555 55555593 */
Lg2 = 3.999999999940941908e-01, /* 3FD99999 9997FA04 */
Lg3 = 2.857142874366239149e-01, /* 3FD24924 94229359 */
Lg4 = 2.222219843214978396e-01, /* 3FCC71C5 1D8E78AF */
Lg5 = 1.818357216161805012e-01, /* 3FC74664 96CB03DE */
Lg6 = 1.531383769920937332e-01, /* 3FC39A09 D078C69F */
Lg7 = 1.479819860511658591e-01; /* 3FC2F112 DF3E5244 */
static double zero = 0.0;
#ifdef __STDC__
double __ieee754_log(double x)
#else
double __ieee754_log(x)
double x;
#endif
{
double hfsq, f, s, z, R, w, t1, t2, dk;
_INT32 k, hx, i, j; /*- cc 020130 -*/
_UINT32 lx; /*- cc 020130 -*/
hx = __HI(x); /* high word of x */
lx = __LO(x); /* low word of x */
k = 0;
if (hx < 0x00100000) { /* x < 2**-1022 */
if (((hx & 0x7fffffff) | lx) == 0)
return -two54 / zero; /* log(+-0)=-inf */
if (hx < 0) {
#ifdef __STDC__
errno = EDOM;
#endif
return (x - x) / zero; /* log(-#) = NaN */
}
k -= 54;
x *= two54; /* subnormal number, scale up x */
hx = __HI(x); /* high word of x */
}
if (hx >= 0x7ff00000)
return x + x;
k += (hx >> 20) - 1023;
hx &= 0x000fffff;
i = (hx + 0x95f64) & 0x100000;
__HI(x) = hx | (i ^ 0x3ff00000); /* normalize x or x/2 */
k += (i >> 20);
f = x - 1.0;
if ((0x000fffff & (2 + hx)) < 3) { /* |f| < 2**-20 */
if (f == zero)
if (k == 0)
return zero;
else {
dk = (double)k;
return dk * ln2_hi + dk * ln2_lo;
}
R = f * f * (0.5 - 0.33333333333333333 * f);
if (k == 0)
return f - R;
else {
dk = (double)k;
return dk * ln2_hi - ((R - dk * ln2_lo) - f);
}
}
s = f / (2.0 + f);
dk = (double)k;
z = s * s;
i = hx - 0x6147a;
w = z * z;
j = 0x6b851 - hx;
t1 = w * (Lg2 + w * (Lg4 + w * Lg6));
t2 = z * (Lg1 + w * (Lg3 + w * (Lg5 + w * Lg7)));
i |= j;
R = t2 + t1;
if (i > 0) {
hfsq = 0.5 * f * f;
if (k == 0)
return f - (hfsq - s * (hfsq + R));
else
return dk * ln2_hi - ((hfsq - (s * (hfsq + R) + dk * ln2_lo)) - f);
} else {
if (k == 0)
return f - s * (f - R);
else
return dk * ln2_hi - ((s * (f - R) - dk * ln2_lo) - f);
}
}

353
src/Runtime/e_pow.c Normal file
View File

@ -0,0 +1,353 @@
/* @(#)e_pow.c 1.2 95/01/04 */
/*
* ====================================================
* Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
*
* Developed at SunPro, a Sun Microsystems, Inc. business.
* Permission to use, copy, modify, and distribute this
* software is freely granted, provided that this notice
* is preserved.
* ====================================================
*/
/* __ieee754_pow(x,y) return x**y
*
* n
* Method: Let x = 2 * (1+f)
* 1. Compute and return log2(x) in two pieces:
* log2(x) = w1 + w2,
* where w1 has 53-24 = 29 bit trailing zeros.
* 2. Perform y*log2(x) = n+y' by simulating muti-precision
* arithmetic, where |y'|<=0.5.
* 3. Return x**y = 2**n*exp(y'*log2)
*
* Special cases:
* 1. (anything) ** 0 is 1
* 2. (anything) ** 1 is itself
* 3. (anything) ** NAN is NAN
* 4. NAN ** (anything except 0) is NAN
* 5. +-(|x| > 1) ** +INF is +INF
* 6. +-(|x| > 1) ** -INF is +0
* 7. +-(|x| < 1) ** +INF is +0
* 8. +-(|x| < 1) ** -INF is +INF
* 9. +-1 ** +-INF is NAN
* 10. +0 ** (+anything except 0, NAN) is +0
* 11. -0 ** (+anything except 0, NAN, odd integer) is +0
* 12. +0 ** (-anything except 0, NAN) is +INF
* 13. -0 ** (-anything except 0, NAN, odd integer) is +INF
* 14. -0 ** (odd integer) = -( +0 ** (odd integer) )
* 15. +INF ** (+anything except 0,NAN) is +INF
* 16. +INF ** (-anything except 0,NAN) is +0
* 17. -INF ** (anything) = -0 ** (-anything)
* 18. (-anything) ** (integer) is (-1)**(integer)*(+anything**integer)
* 19. (-anything except 0 and inf) ** (non-integer) is NAN
*
* Accuracy:
* pow(x,y) returns x**y nearly rounded. In particular
* pow(integer,integer)
* always returns the correct integer provided it is
* representable.
*
* Constants :
* The hexadecimal values are the intended ones for the following
* constants. The decimal values may be used, provided that the
* compiler will convert from decimal to binary accurately enough
* to produce the hexadecimal values shown.
*/
#include "fdlibm.h"
#ifdef __STDC__
static const double
#else
static double
#endif
bp[] =
{
1.0,
1.5,
},
dp_h[] =
{
0.0,
5.84962487220764160156e-01,
}, /* 0x3FE2B803, 0x40000000 */
dp_l[] =
{
0.0,
1.35003920212974897128e-08,
}, /* 0x3E4CFDEB, 0x43CFD006 */
zero = 0.0, one = 1.0, two = 2.0, two53 = 9007199254740992.0, /* 0x43400000, 0x00000000 */
big = 1.0e300, tiny = 1.0e-300,
/* poly coefs for (3/2)*(log(x)-2s-2/3*s**3 */
L1 = 5.99999999999994648725e-01, /* 0x3FE33333, 0x33333303 */
L2 = 4.28571428578550184252e-01, /* 0x3FDB6DB6, 0xDB6FABFF */
L3 = 3.33333329818377432918e-01, /* 0x3FD55555, 0x518F264D */
L4 = 2.72728123808534006489e-01, /* 0x3FD17460, 0xA91D4101 */
L5 = 2.30660745775561754067e-01, /* 0x3FCD864A, 0x93C9DB65 */
L6 = 2.06975017800338417784e-01, /* 0x3FCA7E28, 0x4A454EEF */
P1 = 1.66666666666666019037e-01, /* 0x3FC55555, 0x5555553E */
P2 = -2.77777777770155933842e-03, /* 0xBF66C16C, 0x16BEBD93 */
P3 = 6.61375632143793436117e-05, /* 0x3F11566A, 0xAF25DE2C */
P4 = -1.65339022054652515390e-06, /* 0xBEBBBD41, 0xC5D26BF1 */
P5 = 4.13813679705723846039e-08, /* 0x3E663769, 0x72BEA4D0 */
lg2 = 6.93147180559945286227e-01, /* 0x3FE62E42, 0xFEFA39EF */
lg2_h = 6.93147182464599609375e-01, /* 0x3FE62E43, 0x00000000 */
lg2_l = -1.90465429995776804525e-09, /* 0xBE205C61, 0x0CA86C39 */
ovt = 8.0085662595372944372e-0017, /* -(1024-log2(ovfl+.5ulp)) */
cp = 9.61796693925975554329e-01, /* 0x3FEEC709, 0xDC3A03FD =2/(3ln2) */
cp_h = 9.61796700954437255859e-01, /* 0x3FEEC709, 0xE0000000 =(float)cp */
cp_l = -7.02846165095275826516e-09, /* 0xBE3E2FE0, 0x145B01F5 =tail of cp_h*/
ivln2 = 1.44269504088896338700e+00, /* 0x3FF71547, 0x652B82FE =1/ln2 */
ivln2_h = 1.44269502162933349609e+00, /* 0x3FF71547, 0x60000000 =24b 1/ln2*/
ivln2_l = 1.92596299112661746887e-08; /* 0x3E54AE0B, 0xF85DDF44 =1/ln2 tail*/
#ifdef __STDC__
double __ieee754_pow(double x, double y)
#else
double __ieee754_pow(x, y)
double x, y;
#endif
{
double z, ax, z_h, z_l, p_h, p_l;
double y1, t1, t2, r, s, t, u, v, w;
_INT32 i, j, k, yisint, n; /*- cc 020130 -*/
_INT32 hx, hy, ix, iy; /*- cc 020130 -*/
_UINT32 lx, ly; /*- cc 020130 -*/
hx = __HI(x);
lx = __LO(x);
hy = __HI(y);
ly = __LO(y);
ix = hx & 0x7fffffff;
iy = hy & 0x7fffffff;
/* y==zero: x**0 = 1 */
if ((iy | ly) == 0)
return one;
/* +-NaN return x+y */
if (ix > 0x7ff00000 || ((ix == 0x7ff00000) && (lx != 0)) || iy > 0x7ff00000 || ((iy == 0x7ff00000) && (ly != 0))) {
return x + y;
#ifdef __STDC__
errno = EDOM; /* mf-- added to conform to old ANSI standard */
#endif
}
/* determine if y is an odd int when x < 0
* yisint = 0 ... y is not an integer
* yisint = 1 ... y is an odd int
* yisint = 2 ... y is an even int
*/
yisint = 0;
if (hx < 0) {
if (iy >= 0x43400000)
yisint = 2; /* even integer y */
else if (iy >= 0x3ff00000) {
k = (iy >> 20) - 0x3ff; /* exponent */
if (k > 20) {
j = ly >> (52 - k);
if ((j << (52 - k)) == ly)
yisint = 2 - (j & 1);
} else if (ly == 0) {
j = iy >> (20 - k);
if ((j << (20 - k)) == iy)
yisint = 2 - (j & 1);
}
}
}
/* special value of y */
if (ly == 0) {
if (iy == 0x7ff00000) {
/* y is +-inf */
if (((ix - 0x3ff00000) | lx) == 0)
return y - y; /* inf**+-1 is NaN */
else if (ix >= 0x3ff00000) /* (|x|>1)**+-inf = inf,0 */
return (hy >= 0) ? y : zero;
else /* (|x|<1)**-,+inf = inf,0 */
return (hy < 0) ? -y : zero;
}
if (iy == 0x3ff00000) {
/* y is +-1 */
if (hy < 0)
return one / x;
else
return x;
}
if (hy == 0x40000000)
return x * x; /* y is 2 */
if (hy == 0x3fe00000) { /* y is 0.5 */
if (hx >= 0) /* x >= +0 */
return sqrt(x);
}
}
ax = fabs(x);
/* special value of x */
if (lx == 0) {
if (ix == 0x7ff00000 || ix == 0 || ix == 0x3ff00000) {
z = ax; /*x is +-0,+-inf,+-1*/
if (hy < 0)
z = one / z; /* z = (1/|x|) */
if (hx < 0) {
if (((ix - 0x3ff00000) | yisint) == 0) {
z = (z - z) / (z - z); /* (-1)**non-int is NaN */
} else if (yisint == 1)
z = -z; /* (x<0)**odd = -(|x|**odd) */
}
return z;
}
}
/* (x<0)**(non-int) is NaN */
if ((((hx >> 31) + 1) | yisint) == 0) {
#ifdef __STDC__
errno = EDOM; /* mf-- added to conform to old ANSI standard */
#endif
return NAN;
}
/* |y| is big */
if (iy > 0x41e00000) { /* if |y| > 2**31 */
if (iy > 0x43f00000) { /* if |y| > 2**64, must o/uflow */
if (ix <= 0x3fefffff)
return (hy < 0) ? big * big : tiny * tiny;
if (ix >= 0x3ff00000)
return (hy > 0) ? big * big : tiny * tiny;
}
/* over/underflow if x is not close to one */
if (ix < 0x3fefffff)
return (hy < 0) ? big * big : tiny * tiny;
if (ix > 0x3ff00000)
return (hy > 0) ? big * big : tiny * tiny;
/* now |1-x| is tiny <= 2**-20, suffice to compute
log(x) by x-x^2/2+x^3/3-x^4/4 */
t = x - 1; /* t has 20 trailing zeros */
w = (t * t) * (0.5 - t * (0.3333333333333333333333 - t * 0.25));
u = ivln2_h * t; /* ivln2_h has 21 sig. bits */
v = t * ivln2_l - w * ivln2;
t1 = u + v;
__LO(t1) = 0;
t2 = v - (t1 - u);
} else {
double s2, s_h, s_l, t_h, t_l;
n = 0;
/* take care subnormal number */
if (ix < 0x00100000) {
ax *= two53;
n -= 53;
ix = __HI(ax);
}
n += ((ix) >> 20) - 0x3ff;
j = ix & 0x000fffff;
/* determine interval */
ix = j | 0x3ff00000; /* normalize ix */
if (j <= 0x3988E)
k = 0; /* |x|<sqrt(3/2) */
else if (j < 0xBB67A)
k = 1; /* |x|<sqrt(3) */
else {
k = 0;
n += 1;
ix -= 0x00100000;
}
__HI(ax) = ix;
/* compute s = s_h+s_l = (x-1)/(x+1) or (x-1.5)/(x+1.5) */
u = ax - bp[k]; /* bp[0]=1.0, bp[1]=1.5 */
v = one / (ax + bp[k]);
s = u * v;
s_h = s;
__LO(s_h) = 0;
/* t_h=ax+bp[k] High */
t_h = zero;
__HI(t_h) = ((ix >> 1) | 0x20000000) + 0x00080000 + (k << 18);
t_l = ax - (t_h - bp[k]);
s_l = v * ((u - s_h * t_h) - s_h * t_l);
/* compute log(ax) */
s2 = s * s;
r = s2 * s2 * (L1 + s2 * (L2 + s2 * (L3 + s2 * (L4 + s2 * (L5 + s2 * L6)))));
r += s_l * (s_h + s);
s2 = s_h * s_h;
t_h = 3.0 + s2 + r;
__LO(t_h) = 0;
t_l = r - ((t_h - 3.0) - s2);
/* u+v = s*(1+...) */
u = s_h * t_h;
v = s_l * t_h + t_l * s;
/* 2/(3log2)*(s+...) */
p_h = u + v;
__LO(p_h) = 0;
p_l = v - (p_h - u);
z_h = cp_h * p_h; /* cp_h+cp_l = 2/(3*log2) */
z_l = cp_l * p_h + p_l * cp + dp_l[k];
/* log2(ax) = (s+..)*2/(3*log2) = n + dp_h + z_h + z_l */
t = (double)n;
t1 = (((z_h + z_l) + dp_h[k]) + t);
__LO(t1) = 0;
t2 = z_l - (((t1 - t) - dp_h[k]) - z_h);
}
s = one; /* s (sign of result -ve**odd) = -1 else = 1 */
if ((((hx >> 31) + 1) | (yisint - 1)) == 0)
s = -one; /* (-ve)**(odd int) */
/* split up y into y1+y2 and compute (y1+y2)*(t1+t2) */
y1 = y;
__LO(y1) = 0;
p_l = (y - y1) * t1 + y * t2;
p_h = y1 * t1;
z = p_l + p_h;
j = __HI(z);
i = __LO(z);
if (j >= 0x40900000) { /* z >= 1024 */
if (((j - 0x40900000) | i) != 0) /* if z > 1024 */
return s * big * big; /* overflow */
else {
if (p_l + ovt > z - p_h)
return s * big * big; /* overflow */
}
} else if ((j & 0x7fffffff) >= 0x4090cc00) { /* z <= -1075 */
if (((j - 0xc090cc00) | i) != 0) /* z < -1075 */
return s * tiny * tiny; /* underflow */
else {
if (p_l <= z - p_h)
return s * tiny * tiny; /* underflow */
}
}
/*
* compute 2**(p_h+p_l)
*/
i = j & 0x7fffffff;
k = (i >> 20) - 0x3ff;
n = 0;
if (i > 0x3fe00000) { /* if |z| > 0.5, set n = [z+0.5] */
n = j + (0x00100000 >> (k + 1));
k = ((n & 0x7fffffff) >> 20) - 0x3ff; /* new k for n */
t = zero;
__HI(t) = (n & ~(0x000fffff >> k));
n = ((n & 0x000fffff) | 0x00100000) >> (20 - k);
if (j < 0)
n = -n;
p_h -= t;
}
t = p_l + p_h;
__LO(t) = 0;
u = t * lg2_h;
v = (p_l - (t - p_h)) * lg2 + t * lg2_l;
z = u + v;
w = v - (z - u);
t = z * z;
t1 = z - t * (P1 + t * (P2 + t * (P3 + t * (P4 + t * P5))));
r = (z * t1) / (t1 - two) - (w + z * w);
z = one - (r - z);
j = __HI(z);
j += (n << 20);
if ((j >> 20) <= 0)
z = scalbn(z, n); /* subnormal output */
else
__HI(z) += (n << 20);
return s * z;
}

181
src/Runtime/e_rem_pio2.c Normal file
View File

@ -0,0 +1,181 @@
/* @(#)e_rem_pio2.c 1.3 95/01/04 */
/*
* ====================================================
* Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
*
* Developed at SunPro, a Sun Microsystems, Inc. business.
* Permission to use, copy, modify, and distribute this
* software is freely granted, provided that this notice
* is preserved.
* ====================================================
*
*/
/* __ieee754_rem_pio2(x,y)
*
* return the remainder of x rem pi/2 in y[0]+y[1]
* use __kernel_rem_pio2()
*/
#include "fdlibm.h"
/*
* Table of constants for 2/pi, 396 Hex digits (476 decimal) of 2/pi
*/
#ifdef __STDC__
static const _INT32 two_over_pi[] = {
#else
static _INT32 two_over_pi[] = {
#endif
0xA2F983, 0x6E4E44, 0x1529FC, 0x2757D1, 0xF534DD, 0xC0DB62, 0x95993C, 0x439041, 0xFE5163, 0xABDEBB, 0xC561B7,
0x246E3A, 0x424DD2, 0xE00649, 0x2EEA09, 0xD1921C, 0xFE1DEB, 0x1CB129, 0xA73EE8, 0x8235F5, 0x2EBB44, 0x84E99C,
0x7026B4, 0x5F7E41, 0x3991D6, 0x398353, 0x39F49C, 0x845F8B, 0xBDF928, 0x3B1FF8, 0x97FFDE, 0x05980F, 0xEF2F11,
0x8B5A0A, 0x6D1F6D, 0x367ECF, 0x27CB09, 0xB74F46, 0x3F669E, 0x5FEA2D, 0x7527BA, 0xC7EBE5, 0xF17B3D, 0x0739F7,
0x8A5292, 0xEA6BFB, 0x5FB11F, 0x8D5D08, 0x560330, 0x46FC7B, 0x6BABF0, 0xCFBC20, 0x9AF436, 0x1DA9E3, 0x91615E,
0xE61B08, 0x659985, 0x5F14A0, 0x68408D, 0xFFD880, 0x4D7327, 0x310606, 0x1556CA, 0x73A8C9, 0x60E27B, 0xC08C6B,
};
#ifdef __STDC__
static const _INT32 npio2_hw[] = {
#else
static _INT32 npio2_hw[] = {
#endif
0x3FF921FB, 0x400921FB, 0x4012D97C, 0x401921FB, 0x401F6A7A, 0x4022D97C, 0x4025FDBB, 0x402921FB, 0x402C463A, 0x402F6A7A, 0x4031475C,
0x4032D97C, 0x40346B9C, 0x4035FDBB, 0x40378FDB, 0x403921FB, 0x403AB41B, 0x403C463A, 0x403DD85A, 0x403F6A7A, 0x40407E4C, 0x4041475C,
0x4042106C, 0x4042D97C, 0x4043A28C, 0x40446B9C, 0x404534AC, 0x4045FDBB, 0x4046C6CB, 0x40478FDB, 0x404858EB, 0x404921FB,
};
/*
* invpio2: 53 bits of 2/pi
* pio2_1: first 33 bit of pi/2
* pio2_1t: pi/2 - pio2_1
* pio2_2: second 33 bit of pi/2
* pio2_2t: pi/2 - (pio2_1+pio2_2)
* pio2_3: third 33 bit of pi/2
* pio2_3t: pi/2 - (pio2_1+pio2_2+pio2_3)
*/
#ifdef __STDC__
static const double
#else
static double
#endif
zero = 0.00000000000000000000e+00, /* 0x00000000, 0x00000000 */
half = 5.00000000000000000000e-01, /* 0x3FE00000, 0x00000000 */
two24 = 1.67772160000000000000e+07, /* 0x41700000, 0x00000000 */
invpio2 = 6.36619772367581382433e-01, /* 0x3FE45F30, 0x6DC9C883 */
pio2_1 = 1.57079632673412561417e+00, /* 0x3FF921FB, 0x54400000 */
pio2_1t = 6.07710050650619224932e-11, /* 0x3DD0B461, 0x1A626331 */
pio2_2 = 6.07710050630396597660e-11, /* 0x3DD0B461, 0x1A600000 */
pio2_2t = 2.02226624879595063154e-21, /* 0x3BA3198A, 0x2E037073 */
pio2_3 = 2.02226624871116645580e-21, /* 0x3BA3198A, 0x2E000000 */
pio2_3t = 8.47842766036889956997e-32; /* 0x397B839A, 0x252049C1 */
#ifdef __STDC__
_INT32 __ieee754_rem_pio2(double x, double* y) /*- cc 020130 -*/
#else
_INT32 __ieee754_rem_pio2(x, y) /*- cc 020130 -*/
double x, y[];
#endif
{
double z, w, t, r, fn;
double tx[3];
_INT32 e0, i, j, nx, n, ix, hx; /*- cc 020130 -*/
hx = __HI(x); /* high word of x */
ix = hx & 0x7fffffff;
if (ix <= 0x3fe921fb) /* |x| ~<= pi/4 , no need for reduction */
{
y[0] = x;
y[1] = 0;
return 0;
}
if (ix < 0x4002d97c) { /* |x| < 3pi/4, special case with n=+-1 */
if (hx > 0) {
z = x - pio2_1;
if (ix != 0x3ff921fb) { /* 33+53 bit pi is good enough */
y[0] = z - pio2_1t;
y[1] = (z - y[0]) - pio2_1t;
} else { /* near pi/2, use 33+33+53 bit pi */
z -= pio2_2;
y[0] = z - pio2_2t;
y[1] = (z - y[0]) - pio2_2t;
}
return 1;
} else { /* negative x */
z = x + pio2_1;
if (ix != 0x3ff921fb) { /* 33+53 bit pi is good enough */
y[0] = z + pio2_1t;
y[1] = (z - y[0]) + pio2_1t;
} else { /* near pi/2, use 33+33+53 bit pi */
z += pio2_2;
y[0] = z + pio2_2t;
y[1] = (z - y[0]) + pio2_2t;
}
return -1;
}
}
if (ix <= 0x413921fb) { /* |x| ~<= 2^19*(pi/2), medium size */
t = fabs(x);
n = (_INT32)(t * invpio2 + half); /*- cc 020130 -*/
fn = (double)n;
r = t - fn * pio2_1;
w = fn * pio2_1t; /* 1st round good to 85 bit */
if (n < 32 && ix != npio2_hw[n - 1]) {
y[0] = r - w; /* quick check no cancellation */
} else {
j = ix >> 20;
y[0] = r - w;
i = j - (((__HI(y[0])) >> 20) & 0x7ff);
if (i > 16) { /* 2nd iteration needed, good to 118 */
t = r;
w = fn * pio2_2;
r = t - w;
w = fn * pio2_2t - ((t - r) - w);
y[0] = r - w;
i = j - (((__HI(y[0])) >> 20) & 0x7ff);
if (i > 49) { /* 3rd iteration need, 151 bits acc */
t = r; /* will cover all possible cases */
w = fn * pio2_3;
r = t - w;
w = fn * pio2_3t - ((t - r) - w);
y[0] = r - w;
}
}
}
y[1] = (r - y[0]) - w;
if (hx < 0) {
y[0] = -y[0];
y[1] = -y[1];
return -n;
} else
return n;
}
/*
* all other (large) arguments
*/
if (ix >= 0x7ff00000) { /* x is inf or NaN */
y[0] = y[1] = x - x;
return 0;
}
/* set z = scalbn(|x|,ilogb(x)-23) */
__LO(z) = __LO(x);
e0 = (ix >> 20) - 1046; /* e0 = ilogb(z)-23; */
__HI(z) = ix - (e0 << 20);
for (i = 0; i < 2; i++) {
tx[i] = (double)((_INT32)(z)); /*- cc 020130 -*/
z = (z - tx[i]) * two24;
}
tx[2] = z;
nx = 3;
while (tx[nx - 1] == zero)
nx--; /* skip zero term */
n = __kernel_rem_pio2(tx, y, e0, nx, 2, two_over_pi);
if (hx < 0) {
y[0] = -y[0];
y[1] = -y[1];
return -n;
}
return n;
}

149
src/Runtime/fdlibm.h Normal file
View File

@ -0,0 +1,149 @@
/* @(#)fdlibm.h 1.2 95/01/04 */
/*
* ====================================================
* Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
*
* Developed at SunPro, a Sun Microsystems, Inc. business.
* Permission to use, copy, modify, and distribute this
* software is freely granted, provided that this notice
* is preserved.
* ====================================================
*/
#ifdef __STDC__
#include <errno.h>
#include <math.h>
#endif
#define _IEEE_LIBM
#if __option(little_endian)
#define __HIp(x) *(1 + (_INT32*)x) /*- cc 020130 -*/
#define __LOp(x) *(_INT32*)x /*- cc 020130 -*/
#else
#define __HIp(x) *(_INT32*)x /*- cc 020130 -*/
#define __LOp(x) *(1 + (_INT32*)x) /*- cc 020130 -*/
#endif
#ifdef __STDC__
#define __P(p) p
#else
#define __P(p) ()
#endif
/*
* ANSI/POSIX
*/
extern int signgam;
#define MAXFLOAT ((float)3.40282346638528860e+38)
enum fdversion { fdlibm_ieee = -1, fdlibm_svid, fdlibm_xopen, fdlibm_posix };
#define _LIB_VERSION_TYPE enum fdversion
#define _LIB_VERSION _fdlib_version
/* if global variable _LIB_VERSION is not desirable, one may
* change the following to be a constant by:
* #define _LIB_VERSION_TYPE const enum version
* In that case, after one initializes the value _LIB_VERSION (see
* s_lib_version.c) during compile time, it cannot be modified
* in the middle of a program
*/
extern _LIB_VERSION_TYPE _LIB_VERSION;
#define _IEEE_ fdlibm_ieee
#define _SVID_ fdlibm_svid
#define _XOPEN_ fdlibm_xopen
#define _POSIX_ fdlibm_posix
struct exception {
int type;
char* name;
double arg1;
double arg2;
double retval;
};
#define HUGE MAXFLOAT
/*
* set X_TLOSS = pi*2**52, which is possibly defined in <values.h>
* (one may replace the following line by "#include <values.h>")
*/
#define X_TLOSS 1.41484755040568800000e+16
#define DOMAIN 1
#define SING 2
#define OVERFLOW 3
#define UNDERFLOW 4
#define TLOSS 5
#define PLOSS 6
/*
* ANSI/POSIX
*/
extern int matherr __P((struct exception*));
/*
* IEEE Test Vector
*/
extern double significand __P((double));
/*
* Functions callable from C, intended to support IEEE arithmetic.
*/
extern int ilogb __P((double));
/*
* BSD math library entry points
*/
/*
* Reentrant version of gamma & lgamma; passes signgam back by reference
* as the second argument; user must allocate space for signgam.
*/
#ifdef _REENTRANT
extern double gamma_r __P((double, int*));
extern double lgamma_r __P((double, int*));
#endif /* _REENTRANT */
/* ieee style elementary functions */
extern double __ieee754_sqrt __P((double));
extern double __ieee754_acos __P((double));
extern double __ieee754_acosh __P((double));
extern double __ieee754_log __P((double));
extern double __ieee754_atanh __P((double));
extern double __ieee754_asin __P((double));
extern double __ieee754_atan2 __P((double, double));
extern double __ieee754_exp __P((double));
extern double __ieee754_cosh __P((double));
extern double __ieee754_fmod __P((double, double));
extern double __ieee754_pow __P((double, double));
extern double __ieee754_lgamma_r __P((double, int*));
extern double __ieee754_gamma_r __P((double, int*));
extern double __ieee754_lgamma __P((double));
extern double __ieee754_gamma __P((double));
extern double __ieee754_log10 __P((double));
extern double __ieee754_sinh __P((double));
extern double __ieee754_hypot __P((double, double));
extern double __ieee754_j0 __P((double));
extern double __ieee754_j1 __P((double));
extern double __ieee754_y0 __P((double));
extern double __ieee754_y1 __P((double));
extern double __ieee754_jn __P((int, double));
extern double __ieee754_yn __P((int, double));
extern double __ieee754_remainder __P((double, double));
extern int __ieee754_rem_pio2 __P((double, double*));
extern double __ieee754_scalb __P((double, int));
/* fdlibm kernel function */
extern double __kernel_standard __P((double, double, int));
extern double __kernel_sin __P((double, double, int));
extern double __kernel_cos __P((double, double));
extern double __kernel_tan __P((double, double, int));
extern int __kernel_rem_pio2 __P((double*, double*, int, int, int, const int*));

92
src/Runtime/k_cos.c Normal file
View File

@ -0,0 +1,92 @@
/* @(#)k_cos.c 1.2 95/01/04 */
/*
* ====================================================
* Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
*
* Developed at SunPro, a Sun Microsystems, Inc. business.
* Permission to use, copy, modify, and distribute this
* software is freely granted, provided that this notice
* is preserved.
* ====================================================
*/
/*
* __kernel_cos( x, y )
* kernel cos function on [-pi/4, pi/4], pi/4 ~ 0.785398164
* Input x is assumed to be bounded by ~pi/4 in magnitude.
* Input y is the tail of x.
*
* Algorithm
* 1. Since cos(-x) = cos(x), we need only to consider positive x.
* 2. if x < 2^-27 (hx<0x3e400000 0), return 1 with inexact if x!=0.
* 3. cos(x) is approximated by a polynomial of degree 14 on
* [0,pi/4]
* 4 14
* cos(x) ~ 1 - x*x/2 + C1*x + ... + C6*x
* where the remez error is
*
* | 2 4 6 8 10 12 14 | -58
* |cos(x)-(1-.5*x +C1*x +C2*x +C3*x +C4*x +C5*x +C6*x )| <= 2
* | |
*
* 4 6 8 10 12 14
* 4. let r = C1*x +C2*x +C3*x +C4*x +C5*x +C6*x , then
* cos(x) = 1 - x*x/2 + r
* since cos(x+y) ~ cos(x) - sin(x)*y
* ~ cos(x) - x*y,
* a correction term is necessary in cos(x) and hence
* cos(x+y) = 1 - (x*x/2 - (r - x*y))
* For better accuracy when x > 0.3, let qx = |x|/4 with
* the last 32 bits mask off, and if x > 0.78125, let qx = 0.28125.
* Then
* cos(x+y) = (1-qx) - ((x*x/2-qx) - (r-x*y)).
* Note that 1-qx and (x*x/2-qx) is EXACT here, and the
* magnitude of the latter is at least a quarter of x*x/2,
* thus, reducing the rounding error in the subtraction.
*/
#include "fdlibm.h"
#ifdef __STDC__
static const double
#else
static double
#endif
one = 1.00000000000000000000e+00, /* 0x3FF00000, 0x00000000 */
C1 = 4.16666666666666019037e-02, /* 0x3FA55555, 0x5555554C */
C2 = -1.38888888888741095749e-03, /* 0xBF56C16C, 0x16C15177 */
C3 = 2.48015872894767294178e-05, /* 0x3EFA01A0, 0x19CB1590 */
C4 = -2.75573143513906633035e-07, /* 0xBE927E4F, 0x809C52AD */
C5 = 2.08757232129817482790e-09, /* 0x3E21EE9E, 0xBDB4B1C4 */
C6 = -1.13596475577881948265e-11; /* 0xBDA8FAE9, 0xBE8838D4 */
#ifdef __STDC__
double __kernel_cos(double x, double y)
#else
double __kernel_cos(x, y)
double x, y;
#endif
{
double a, hz, z, r, qx;
int ix;
ix = __HI(x) & 0x7fffffff; /* ix = |x|'s high word*/
if (ix < 0x3e400000) { /* if x < 2**27 */
if (((int)x) == 0)
return one; /* generate inexact */
}
z = x * x;
r = z * (C1 + z * (C2 + z * (C3 + z * (C4 + z * (C5 + z * C6)))));
if (ix < 0x3FD33333) /* if |x| < 0.3 */
return one - (0.5 * z - (z * r - x * y));
else {
if (ix > 0x3fe90000) { /* x > 0.78125 */
qx = 0.28125;
} else {
__HI(qx) = ix - 0x00200000; /* x/4 */
__LO(qx) = 0;
}
hz = 0.5 * z - qx;
a = one - qx;
return a - (hz - (z * r - x * y));
}
}

348
src/Runtime/k_rem_pio2.c Normal file
View File

@ -0,0 +1,348 @@
/* @(#)k_rem_pio2.c 1.2 95/01/04 */
/*
* ====================================================
* Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
*
* Developed at SunPro, a Sun Microsystems, Inc. business.
* Permission to use, copy, modify, and distribute this
* software is freely granted, provided that this notice
* is preserved.
* ====================================================
*/
/*
* __kernel_rem_pio2(x,y,e0,nx,prec,ipio2)
* double x[],y[]; int e0,nx,prec; int ipio2[];
*
* __kernel_rem_pio2 return the last three digits of N with
* y = x - N*pi/2
* so that |y| < pi/2.
*
* The method is to compute the integer (mod 8) and fraction parts of
* (2/pi)*x without doing the full multiplication. In general we
* skip the part of the product that are known to be a huge integer (
* more accurately, = 0 mod 8 ). Thus the number of operations are
* independent of the exponent of the input.
*
* (2/pi) is represented by an array of 24-bit integers in ipio2[].
*
* Input parameters:
* x[] The input value (must be positive) is broken into nx
* pieces of 24-bit integers in double precision format.
* x[i] will be the i-th 24 bit of x. The scaled exponent
* of x[0] is given in input parameter e0 (i.e., x[0]*2^e0
* match x's up to 24 bits.
*
* Example of breaking a double positive z into x[0]+x[1]+x[2]:
* e0 = ilogb(z)-23
* z = scalbn(z,-e0)
* for i = 0,1,2
* x[i] = floor(z)
* z = (z-x[i])*2**24
*
*
* y[] ouput result in an array of double precision numbers.
* The dimension of y[] is:
* 24-bit precision 1
* 53-bit precision 2
* 64-bit precision 2
* 113-bit precision 3
* The actual value is the sum of them. Thus for 113-bit
* precison, one may have to do something like:
*
* long double t,w,r_head, r_tail;
* t = (long double)y[2] + (long double)y[1];
* w = (long double)y[0];
* r_head = t+w;
* r_tail = w - (r_head - t);
*
* e0 The exponent of x[0]
*
* nx dimension of x[]
*
* prec an integer indicating the precision:
* 0 24 bits (single)
* 1 53 bits (double)
* 2 64 bits (extended)
* 3 113 bits (quad)
*
* ipio2[]
* integer array, contains the (24*i)-th to (24*i+23)-th
* bit of 2/pi after binary point. The corresponding
* floating value is
*
* ipio2[i] * 2^(-24(i+1)).
*
* External function:
* double scalbn(), floor();
*
*
* Here is the description of some local variables:
*
* jk jk+1 is the initial number of terms of ipio2[] needed
* in the computation. The recommended value is 2,3,4,
* 6 for single, double, extended,and quad.
*
* jz local integer variable indicating the number of
* terms of ipio2[] used.
*
* jx nx - 1
*
* jv index for pointing to the suitable ipio2[] for the
* computation. In general, we want
* ( 2^e0*x[0] * ipio2[jv-1]*2^(-24jv) )/8
* is an integer. Thus
* e0-3-24*jv >= 0 or (e0-3)/24 >= jv
* Hence jv = max(0,(e0-3)/24).
*
* jp jp+1 is the number of terms in PIo2[] needed, jp = jk.
*
* q[] double array with integral value, representing the
* 24-bits chunk of the product of x and 2/pi.
*
* q0 the corresponding exponent of q[0]. Note that the
* exponent for q[i] would be q0-24*i.
*
* PIo2[] double precision array, obtained by cutting pi/2
* into 24 bits chunks.
*
* f[] ipio2[] in floating point
*
* iq[] integer array by breaking up q[] in 24-bits chunk.
*
* fq[] final product of x*(2/pi) in fq[0],..,fq[jk]
*
* ih integer. If >0 it indicates q[] is >= 0.5, hence
* it also indicates the *sign* of the result.
*
*/
/*
* Constants:
* The hexadecimal values are the intended ones for the following
* constants. The decimal values may be used, provided that the
* compiler will convert from decimal to binary accurately enough
* to produce the hexadecimal values shown.
*/
#include "fdlibm.h"
#ifdef __STDC__
static const _INT32 init_jk[] = {2, 3, 4, 6}; /* initial value for jk */ /*- cc 020130 -*/
#else
static _INT32 init_jk[] = {2, 3, 4, 6}; /*- cc 020130 -*/
#endif
#ifdef __STDC__
static const double PIo2[] = {
#else
static double PIo2[] = {
#endif
1.57079625129699707031e+00, /* 0x3FF921FB, 0x40000000 */
7.54978941586159635335e-08, /* 0x3E74442D, 0x00000000 */
5.39030252995776476554e-15, /* 0x3CF84698, 0x80000000 */
3.28200341580791294123e-22, /* 0x3B78CC51, 0x60000000 */
1.27065575308067607349e-29, /* 0x39F01B83, 0x80000000 */
1.22933308981111328932e-36, /* 0x387A2520, 0x40000000 */
2.73370053816464559624e-44, /* 0x36E38222, 0x80000000 */
2.16741683877804819444e-51, /* 0x3569F31D, 0x00000000 */
};
#ifdef __STDC__
static const double
#else
static double
#endif
zero = 0.0,
one = 1.0, two24 = 1.67772160000000000000e+07, /* 0x41700000, 0x00000000 */
twon24 = 5.96046447753906250000e-08; /* 0x3E700000, 0x00000000 */
#ifdef __STDC__
_INT32 __kernel_rem_pio2(double* x, double* y, _INT32 e0, _INT32 nx, _INT32 prec, const _INT32* ipio2) /*- cc 020130 -*/
#else
_INT32 __kernel_rem_pio2(x, y, e0, nx, prec, ipio2) /*- cc 020130 -*/
double x[], y[];
_INT32 e0, nx, prec;
_INT32 ipio2[]; /*- cc 020130 -*/
#endif
{
_INT32 jz, jx, jv, jp, jk, carry, n, iq[20], i, j, k, m, q0, ih; /*- cc 020130 -*/
double z, fw, f[20], fq[20], q[20];
/* initialize jk*/
jk = init_jk[prec];
jp = jk;
/* determine jx,jv,q0, note that 3>q0 */
jx = nx - 1;
jv = (e0 - 3) / 24;
if (jv < 0)
jv = 0;
q0 = e0 - 24 * (jv + 1);
/* set up f[0] to f[jx+jk] where f[jx+jk] = ipio2[jv+jk] */
j = jv - jx;
m = jx + jk;
for (i = 0; i <= m; i++, j++)
f[i] = (j < 0) ? zero : (double)ipio2[j];
/* compute q[0],q[1],...q[jk] */
for (i = 0; i <= jk; i++) {
for (j = 0, fw = 0.0; j <= jx; j++)
fw += x[j] * f[jx + i - j];
q[i] = fw;
}
jz = jk;
recompute:
/* distill q[] into iq[] reversingly */
for (i = 0, j = jz, z = q[jz]; j > 0; i++, j--) {
fw = (double)((_INT32)(twon24 * z)); /*- cc 020130 -*/
iq[i] = (_INT32)(z - two24 * fw); /*- cc 020130 -*/
z = q[j - 1] + fw;
}
/* compute n */
z = scalbn(z, q0); /* actual value of z */
z -= 8.0 * floor(z * 0.125); /* trim off integer >= 8 */
n = (_INT32)z; /*- cc 020130 -*/
z -= (double)n;
ih = 0;
if (q0 > 0) { /* need iq[jz-1] to determine n */
i = (iq[jz - 1] >> (24 - q0));
n += i;
iq[jz - 1] -= i << (24 - q0);
ih = iq[jz - 1] >> (23 - q0);
} else if (q0 == 0)
ih = iq[jz - 1] >> 23;
else if (z >= 0.5)
ih = 2;
if (ih > 0) { /* q > 0.5 */
n += 1;
carry = 0;
for (i = 0; i < jz; i++) { /* compute 1-q */
j = iq[i];
if (carry == 0) {
if (j != 0) {
carry = 1;
iq[i] = 0x1000000 - j;
}
} else
iq[i] = 0xffffff - j;
}
if (q0 > 0) { /* rare case: chance is 1 in 12 */
switch (q0) {
case 1:
iq[jz - 1] &= 0x7fffff;
break;
case 2:
iq[jz - 1] &= 0x3fffff;
break;
}
}
if (ih == 2) {
z = one - z;
if (carry != 0)
z -= scalbn(one, q0);
}
}
/* check if recomputation is needed */
if (z == zero) {
j = 0;
for (i = jz - 1; i >= jk; i--)
j |= iq[i];
if (j == 0) { /* need recomputation */
for (k = 1; iq[jk - k] == 0; k++)
; /* k = no. of terms needed */
for (i = jz + 1; i <= jz + k; i++) { /* add q[jz+1] to q[jz+k] */
f[jx + i] = (double)ipio2[jv + i];
for (j = 0, fw = 0.0; j <= jx; j++)
fw += x[j] * f[jx + i - j];
q[i] = fw;
}
jz += k;
goto recompute;
}
}
/* chop off zero terms */
if (z == 0.0) {
jz -= 1;
q0 -= 24;
while (iq[jz] == 0) {
jz--;
q0 -= 24;
}
} else { /* break z into 24-bit if necessary */
z = scalbn(z, -q0);
if (z >= two24) {
fw = (double)((_INT32)(twon24 * z)); /*- cc 020130 -*/
iq[jz] = (_INT32)(z - two24 * fw); /*- cc 020130 -*/
jz += 1;
q0 += 24;
iq[jz] = (_INT32)fw; /*- cc 020130 -*/
} else
iq[jz] = (_INT32)z; /*- cc 020130 -*/
}
/* convert integer "bit" chunk to floating-point value */
fw = scalbn(one, q0);
for (i = jz; i >= 0; i--) {
q[i] = fw * (double)iq[i];
fw *= twon24;
}
/* compute PIo2[0,...,jp]*q[jz,...,0] */
for (i = jz; i >= 0; i--) {
for (fw = 0.0, k = 0; k <= jp && k <= jz - i; k++)
fw += PIo2[k] * q[i + k];
fq[jz - i] = fw;
}
/* compress fq[] into y[] */
switch (prec) {
case 0:
fw = 0.0;
for (i = jz; i >= 0; i--)
fw += fq[i];
y[0] = (ih == 0) ? fw : -fw;
break;
case 1:
case 2:
fw = 0.0;
for (i = jz; i >= 0; i--)
fw += fq[i];
y[0] = (ih == 0) ? fw : -fw;
fw = fq[0] - fw;
for (i = 1; i <= jz; i++)
fw += fq[i];
y[1] = (ih == 0) ? fw : -fw;
break;
case 3: /* painful */
for (i = jz; i > 0; i--) {
fw = fq[i - 1] + fq[i];
fq[i] += fq[i - 1] - fw;
fq[i - 1] = fw;
}
for (i = jz; i > 1; i--) {
fw = fq[i - 1] + fq[i];
fq[i] += fq[i - 1] - fw;
fq[i - 1] = fw;
}
for (fw = 0.0, i = jz; i >= 2; i--)
fw += fq[i];
if (ih == 0) {
y[0] = fq[0];
y[1] = fq[1];
y[2] = fw;
} else {
y[0] = -fq[0];
y[1] = -fq[1];
y[2] = -fw;
}
}
return n & 7;
}

79
src/Runtime/k_sin.c Normal file
View File

@ -0,0 +1,79 @@
/* @(#)k_sin.c 1.2 95/01/04 */
/*
* ====================================================
* Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
*
* Developed at SunPro, a Sun Microsystems, Inc. business.
* Permission to use, copy, modify, and distribute this
* software is freely granted, provided that this notice
* is preserved.
* ====================================================
*/
/* __kernel_sin( x, y, iy)
* kernel sin function on [-pi/4, pi/4], pi/4 ~ 0.7854
* Input x is assumed to be bounded by ~pi/4 in magnitude.
* Input y is the tail of x.
* Input iy indicates whether y is 0. (if iy=0, y assume to be 0).
*
* Algorithm
* 1. Since sin(-x) = -sin(x), we need only to consider positive x.
* 2. if x < 2^-27 (hx<0x3e400000 0), return x with inexact if x!=0.
* 3. sin(x) is approximated by a polynomial of degree 13 on
* [0,pi/4]
* 3 13
* sin(x) ~ x + S1*x + ... + S6*x
* where
*
* |sin(x) 2 4 6 8 10 12 | -58
* |----- - (1+S1*x +S2*x +S3*x +S4*x +S5*x +S6*x )| <= 2
* | x |
*
* 4. sin(x+y) = sin(x) + sin'(x')*y
* ~ sin(x) + (1-x*x/2)*y
* For better accuracy, let
* 3 2 2 2 2
* r = x *(S2+x *(S3+x *(S4+x *(S5+x *S6))))
* then 3 2
* sin(x) = x + (S1*x + (x *(r-y/2)+y))
*/
#include "fdlibm.h"
#ifdef __STDC__
static const double
#else
static double
#endif
half = 5.00000000000000000000e-01, /* 0x3FE00000, 0x00000000 */
S1 = -1.66666666666666324348e-01, /* 0xBFC55555, 0x55555549 */
S2 = 8.33333333332248946124e-03, /* 0x3F811111, 0x1110F8A6 */
S3 = -1.98412698298579493134e-04, /* 0xBF2A01A0, 0x19C161D5 */
S4 = 2.75573137070700676789e-06, /* 0x3EC71DE3, 0x57B1FE7D */
S5 = -2.50507602534068634195e-08, /* 0xBE5AE5E6, 0x8A2B9CEB */
S6 = 1.58969099521155010221e-10; /* 0x3DE5D93A, 0x5ACFD57C */
#ifdef __STDC__
double __kernel_sin(double x, double y, int iy)
#else
double __kernel_sin(x, y, iy)
double x, y;
int iy; /* iy=0 if y is zero */
#endif
{
double z, r, v;
int ix;
ix = __HI(x) & 0x7fffffff; /* high word of x */
if (ix < 0x3e400000) /* |x| < 2**-27 */
{
if ((int)x == 0)
return x;
} /* generate inexact */
z = x * x;
v = z * x;
r = S2 + z * (S3 + z * (S4 + z * (S5 + z * S6)));
if (iy == 0)
return x + v * (S1 + z * r);
else
return x - ((z * (half * y - v * r) - y) - v * S1);
}

134
src/Runtime/k_tan.c Normal file
View File

@ -0,0 +1,134 @@
/* @(#)k_tan.c 1.2 95/01/04 */
/*
* ====================================================
* Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
*
* Developed at SunPro, a Sun Microsystems, Inc. business.
* Permission to use, copy, modify, and distribute this
* software is freely granted, provided that this notice
* is preserved.
* ====================================================
*/
/* __kernel_tan( x, y, k )
* kernel tan function on [-pi/4, pi/4], pi/4 ~ 0.7854
* Input x is assumed to be bounded by ~pi/4 in magnitude.
* Input y is the tail of x.
* Input k indicates whether tan (if k=1) or
* -1/tan (if k= -1) is returned.
*
* Algorithm
* 1. Since tan(-x) = -tan(x), we need only to consider positive x.
* 2. if x < 2^-28 (hx<0x3e300000 0), return x with inexact if x!=0.
* 3. tan(x) is approximated by a odd polynomial of degree 27 on
* [0,0.67434]
* 3 27
* tan(x) ~ x + T1*x + ... + T13*x
* where
*
* |tan(x) 2 4 26 | -59.2
* |----- - (1+T1*x +T2*x +.... +T13*x )| <= 2
* | x |
*
* Note: tan(x+y) = tan(x) + tan'(x)*y
* ~ tan(x) + (1+x*x)*y
* Therefore, for better accuracy in computing tan(x+y), let
* 3 2 2 2 2
* r = x *(T2+x *(T3+x *(...+x *(T12+x *T13))))
* then
* 3 2
* tan(x+y) = x + (T1*x + (x *(r+y)+y))
*
* 4. For x in [0.67434,pi/4], let y = pi/4 - x, then
* tan(x) = tan(pi/4-y) = (1-tan(y))/(1+tan(y))
* = 1 - 2*(tan(y) - (tan(y)^2)/(1+tan(y)))
*/
#include "fdlibm.h"
#ifdef __STDC__
static const double
#else
static double
#endif
one = 1.00000000000000000000e+00, /* 0x3FF00000, 0x00000000 */
pio4 = 7.85398163397448278999e-01, /* 0x3FE921FB, 0x54442D18 */
pio4lo = 3.06161699786838301793e-17, /* 0x3C81A626, 0x33145C07 */
T[] = {
3.33333333333334091986e-01, /* 0x3FD55555, 0x55555563 */
1.33333333333201242699e-01, /* 0x3FC11111, 0x1110FE7A */
5.39682539762260521377e-02, /* 0x3FABA1BA, 0x1BB341FE */
2.18694882948595424599e-02, /* 0x3F9664F4, 0x8406D637 */
8.86323982359930005737e-03, /* 0x3F8226E3, 0xE96E8493 */
3.59207910759131235356e-03, /* 0x3F6D6D22, 0xC9560328 */
1.45620945432529025516e-03, /* 0x3F57DBC8, 0xFEE08315 */
5.88041240820264096874e-04, /* 0x3F4344D8, 0xF2F26501 */
2.46463134818469906812e-04, /* 0x3F3026F7, 0x1A8D1068 */
7.81794442939557092300e-05, /* 0x3F147E88, 0xA03792A6 */
7.14072491382608190305e-05, /* 0x3F12B80F, 0x32F0A7E9 */
-1.85586374855275456654e-05, /* 0xBEF375CB, 0xDB605373 */
2.59073051863633712884e-05, /* 0x3EFB2A70, 0x74BF7AD4 */
};
#ifdef __STDC__
double __kernel_tan(double x, double y, _INT32 iy) /*- cc 020130 -*/
#else
double __kernel_tan(x, y, iy)
double x, y;
_INT32 iy; /*- cc 020130 -*/
#endif
{
double z, r, v, w, s;
_INT32 ix, hx; /*- cc 020130 -*/
hx = __HI(x); /* high word of x */
ix = hx & 0x7fffffff; /* high word of |x| */
if (ix < 0x3e300000) /* x < 2**-28 */
{
if ((_INT32)x == 0) { /* generate inexact */ /*- cc 020130 -*/
if (((ix | __LO(x)) | (iy + 1)) == 0)
return one / fabs(x);
else
return (iy == 1) ? x : -one / x;
}
}
if (ix >= 0x3FE59428) { /* |x|>=0.6744 */
if (hx < 0) {
x = -x;
y = -y;
}
z = pio4 - x;
w = pio4lo - y;
x = z + w;
y = 0.0;
}
z = x * x;
w = z * z;
/* Break x^5*(T[1]+x^2*T[2]+...) into
* x^5(T[1]+x^4*T[3]+...+x^20*T[11]) +
* x^5(x^2*(T[2]+x^4*T[4]+...+x^22*[T12]))
*/
r = T[1] + w * (T[3] + w * (T[5] + w * (T[7] + w * (T[9] + w * T[11]))));
v = z * (T[2] + w * (T[4] + w * (T[6] + w * (T[8] + w * (T[10] + w * T[12])))));
s = z * x;
r = y + z * (s * (r + v) + y);
r += T[0] * s;
w = x + r;
if (ix >= 0x3FE59428) {
v = (double)iy;
return (double)(1 - ((hx >> 30) & 2)) * (v - 2.0 * (x - (w * w / (w + v) - r)));
}
if (iy == 1)
return w;
else { /* if allow error up to 2 ulp,
simply return -1.0/(x+r) here */
/* compute -1.0/(x+r) accurately */
double a, t;
z = w;
__LO(z) = 0;
v = r - (z - x); /* z+v = r+x */
t = a = -1.0 / w; /* a = -1.0/w */
__LO(t) = 0;
s = 1.0 + t * z;
return t + a * (s + t * v);
}
}

33
src/Runtime/locale.c Normal file
View File

@ -0,0 +1,33 @@
#include <limits.h>
#include <locale.h>
struct lconv __lconv = {
".", // decimal_point
"", // thousands_sep
"", // grouping
"", // mon_decimal_point
"", // mon_thousands_sep
"", // mon_grouping
"", // positive_sign
"", // negative_sign
"", // currency_symbol
CHAR_MAX, // frac_digits
CHAR_MAX, // p_cs_precedes
CHAR_MAX, // n_cs_precedes
CHAR_MAX, // p_sep_by_space
CHAR_MAX, // n_sep_by_space
CHAR_MAX, // p_sign_posn
CHAR_MAX, // n_sign_posn
"", // int_curr_symbol
CHAR_MAX, // int_frac_digits
CHAR_MAX, // int_p_cs_precedes
CHAR_MAX, // int_n_cs_precedes
CHAR_MAX, // int_p_sep_by_space
CHAR_MAX, // int_n_sep_by_space
CHAR_MAX, // int_p_sign_posn
CHAR_MAX, // int_n_sign_posn
};
// Just here to generate the extra string,
// the real usage is inside setlocale, which is stripped
static char* locale_name = "C";

3
src/Runtime/math_ppc.c Normal file
View File

@ -0,0 +1,3 @@
#include <math.h>
float cosf(float x) { return (float)cos((double)x); }

70
src/Runtime/mem.c Normal file
View File

@ -0,0 +1,70 @@
#include <string.h>
#include "mem_funcs.h"
void* memmove(void* dst, const void* src, size_t n) {
const char* p;
char* q;
int rev = ((unsigned long)src < (unsigned long)dst);
if (n >= __min_bytes_for_long_copy) {
if ((((int)dst ^ (int)src)) & 3)
if (!rev)
__copy_longs_unaligned(dst, src, n);
else
__copy_longs_rev_unaligned(dst, src, n);
else if (!rev)
__copy_longs_aligned(dst, src, n);
else
__copy_longs_rev_aligned(dst, src, n);
return dst;
}
if (!rev) {
for (p = (const char*)src - 1, q = (char*)dst - 1, n++; --n;)
*++q = *++p;
} else {
for (p = (const char*)src + n, q = (char*)dst + n, n++; --n;)
*--q = *--p;
}
return dst;
}
void* memchr(const void* src, int val, size_t n) {
const unsigned char* p;
unsigned long v = (val & 0xff);
for (p = (unsigned char*)src - 1, n++; --n;)
if ((*++p & 0xff) == v)
return (void*)p;
return NULL;
}
void* __memrchr(const void* src, int val, size_t n) {
const unsigned char* p;
unsigned long v = (val & 0xff);
for (p = (unsigned char*)src + n, n++; --n;)
if (*--p == v)
return (void*)p;
return NULL;
}
int memcmp(const void* src1, const void* src2, size_t n) {
const unsigned char* p1;
const unsigned char* p2;
for (p1 = (const unsigned char*)src1 - 1, p2 = (const unsigned char*)src2 - 1, n++; --n;)
if (*++p1 != *++p2)
return ((*p1 < *p2) ? -1 : +1);
return 0;
}

223
src/Runtime/mem_funcs.c Normal file
View File

@ -0,0 +1,223 @@
#include "mem_funcs.h"
// #pragma ANSI_strict off
#define cps ((unsigned char*)src)
#define cpd ((unsigned char*)dst)
#define lps ((unsigned long*)src)
#define lpd ((unsigned long*)dst)
#define deref_auto_inc(p) *++(p)
void __copy_longs_aligned(void* dst, const void* src, unsigned long n) {
unsigned long i;
i = (-(unsigned long)dst) & 3;
cps = ((unsigned char*)src) - 1;
cpd = ((unsigned char*)dst) - 1;
if (i) {
n -= i;
do
deref_auto_inc(cpd) = deref_auto_inc(cps);
while (--i);
}
lps = ((unsigned long*)(cps + 1)) - 1;
lpd = ((unsigned long*)(cpd + 1)) - 1;
i = n >> 5;
if (i)
do {
deref_auto_inc(lpd) = deref_auto_inc(lps);
deref_auto_inc(lpd) = deref_auto_inc(lps);
deref_auto_inc(lpd) = deref_auto_inc(lps);
deref_auto_inc(lpd) = deref_auto_inc(lps);
deref_auto_inc(lpd) = deref_auto_inc(lps);
deref_auto_inc(lpd) = deref_auto_inc(lps);
deref_auto_inc(lpd) = deref_auto_inc(lps);
deref_auto_inc(lpd) = deref_auto_inc(lps);
} while (--i);
i = (n & 31) >> 2;
if (i)
do
deref_auto_inc(lpd) = deref_auto_inc(lps);
while (--i);
cps = ((unsigned char*)(lps + 1)) - 1;
cpd = ((unsigned char*)(lpd + 1)) - 1;
// TODO longlong required to match?
n &= 3ULL;
if (n)
do
deref_auto_inc(cpd) = deref_auto_inc(cps);
while (--n);
return;
}
void __copy_longs_rev_aligned(void* dst, const void* src, unsigned long n) {
unsigned long i;
cps = ((unsigned char*)src) + n;
cpd = ((unsigned char*)dst) + n;
i = ((unsigned long)cpd) & 3;
if (i) {
n -= i;
do
*--cpd = *--cps;
while (--i);
}
i = n >> 5;
if (i)
do {
*--lpd = *--lps;
*--lpd = *--lps;
*--lpd = *--lps;
*--lpd = *--lps;
*--lpd = *--lps;
*--lpd = *--lps;
*--lpd = *--lps;
*--lpd = *--lps;
} while (--i);
i = (n & 31) >> 2;
if (i)
do
*--lpd = *--lps;
while (--i);
// TODO longlong required to match?
n &= 3ULL;
if (n)
do
*--cpd = *--cps;
while (--n);
return;
}
void __copy_longs_unaligned(void* dst, const void* src, unsigned long n) {
unsigned long i, v1, v2;
unsigned int src_offset, left_shift, right_shift;
i = (-(unsigned long)dst) & 3;
cps = ((unsigned char*)src) - 1;
cpd = ((unsigned char*)dst) - 1;
if (i) {
n -= i;
do
deref_auto_inc(cpd) = deref_auto_inc(cps);
while (--i);
}
src_offset = ((unsigned int)(cps + 1)) & 3;
left_shift = src_offset << 3;
right_shift = 32 - left_shift;
cps -= src_offset;
lps = ((unsigned long*)(cps + 1)) - 1;
lpd = ((unsigned long*)(cpd + 1)) - 1;
i = n >> 3;
v1 = deref_auto_inc(lps);
do {
v2 = deref_auto_inc(lps);
deref_auto_inc(lpd) = (v1 << left_shift) | (v2 >> right_shift);
v1 = deref_auto_inc(lps);
deref_auto_inc(lpd) = (v2 << left_shift) | (v1 >> right_shift);
} while (--i);
if (n & 4) {
v2 = deref_auto_inc(lps);
deref_auto_inc(lpd) = (v1 << left_shift) | (v2 >> right_shift);
}
cps = ((unsigned char*)(lps + 1)) - 1;
cpd = ((unsigned char*)(lpd + 1)) - 1;
// TODO longlong required to match?
n &= 3ULL;
if (n) {
cps -= 4 - src_offset;
do
deref_auto_inc(cpd) = deref_auto_inc(cps);
while (--n);
}
return;
}
void __copy_longs_rev_unaligned(void* dst, const void* src, unsigned long n) {
unsigned long i, v1, v2;
unsigned int src_offset, left_shift, right_shift;
cps = ((unsigned char*)src) + n;
cpd = ((unsigned char*)dst) + n;
i = ((unsigned long)cpd) & 3;
if (i) {
n -= i;
do
*--cpd = *--cps;
while (--i);
}
src_offset = ((unsigned int)cps) & 3;
left_shift = src_offset << 3;
right_shift = 32 - left_shift;
cps += 4 - src_offset;
i = n >> 3;
v1 = *--lps;
do {
v2 = *--lps;
*--lpd = (v2 << left_shift) | (v1 >> right_shift);
v1 = *--lps;
*--lpd = (v1 << left_shift) | (v2 >> right_shift);
} while (--i);
if (n & 4) {
v2 = *--lps;
*--lpd = (v2 << left_shift) | (v1 >> right_shift);
}
// TODO longlong required to match?
n &= 3ULL;
if (n) {
cps += src_offset;
do
*--cpd = *--cps;
while (--n);
}
return;
}

4
src/Runtime/misc_io.c Normal file
View File

@ -0,0 +1,4 @@
extern void (*__stdio_exit)(void);
void __close_all(void);
void __stdio_atexit(void) { __stdio_exit = __close_all; }

75
src/Runtime/qsort.c Normal file
View File

@ -0,0 +1,75 @@
#include <stdlib.h>
#define table_ptr(i) (((char*)table_base) + (member_size * ((i)-1)))
#define swap(dst, src, cnt) \
do { \
char* p; \
char* q; \
size_t n = cnt; \
\
unsigned long tmp; \
\
for (p = (char*)src - 1, q = (char*)dst - 1, n++; --n;) { \
tmp = *++q; \
*q = *++p; \
*p = tmp; \
} \
} while (0)
void qsort(void* table_base, size_t num_members, size_t member_size, _compare_function compare_members) {
size_t l, r, j;
char* lp;
char* rp;
char* ip;
char* jp;
char* kp;
if (num_members < 2)
return;
r = num_members;
l = (r / 2) + 1;
lp = table_ptr(l);
rp = table_ptr(r);
for (;;) {
if (l > 1) {
l--;
lp -= member_size;
} else {
swap(lp, rp, member_size);
if (--r == 1)
return;
rp -= member_size;
}
j = l;
jp = table_ptr(j);
while (j * 2 <= r) {
j *= 2;
ip = jp;
jp = table_ptr(j);
if (j < r) {
kp = jp + member_size;
if (compare_members(jp, kp) < 0) {
j++;
jp = kp;
}
}
if (compare_members(ip, jp) < 0)
swap(ip, jp, member_size);
else
break;
}
}
}

10
src/Runtime/rand.c Normal file
View File

@ -0,0 +1,10 @@
#include <stdlib.h>
static unsigned long int next = 1;
int rand(void) {
next = next * 1103515245 + 12345;
return (next >> 16) & 0x7FFF;
}
void srand(unsigned int seed) { next = seed; }

142
src/Runtime/s_atan.c Normal file
View File

@ -0,0 +1,142 @@
/* @(#)s_atan.c 1.2 95/01/04 */
/*
* ====================================================
* Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
*
* Developed at SunPro, a Sun Microsystems, Inc. business.
* Permission to use, copy, modify, and distribute this
* software is freely granted, provided that this notice
* is preserved.
* ====================================================
*
*/
/* atan(x)
* Method
* 1. Reduce x to positive by atan(x) = -atan(-x).
* 2. According to the integer k=4t+0.25 chopped, t=x, the argument
* is further reduced to one of the following intervals and the
* arctangent of t is evaluated by the corresponding formula:
*
* [0,7/16] atan(x) = t-t^3*(a1+t^2*(a2+...(a10+t^2*a11)...)
* [7/16,11/16] atan(x) = atan(1/2) + atan( (t-0.5)/(1+t/2) )
* [11/16.19/16] atan(x) = atan( 1 ) + atan( (t-1)/(1+t) )
* [19/16,39/16] atan(x) = atan(3/2) + atan( (t-1.5)/(1+1.5t) )
* [39/16,INF] atan(x) = atan(INF) + atan( -1/t )
*
* Constants:
* The hexadecimal values are the intended ones for the following
* constants. The decimal values may be used, provided that the
* compiler will convert from decimal to binary accurately enough
* to produce the hexadecimal values shown.
*/
#include "fdlibm.h"
#ifdef __STDC__
static const double atanhi[] = {
#else
static double atanhi[] = {
#endif
4.63647609000806093515e-01, /* atan(0.5)hi 0x3FDDAC67, 0x0561BB4F */
7.85398163397448278999e-01, /* atan(1.0)hi 0x3FE921FB, 0x54442D18 */
9.82793723247329054082e-01, /* atan(1.5)hi 0x3FEF730B, 0xD281F69B */
1.57079632679489655800e+00, /* atan(inf)hi 0x3FF921FB, 0x54442D18 */
};
#ifdef __STDC__
static const double atanlo[] = {
#else
static double atanlo[] = {
#endif
2.26987774529616870924e-17, /* atan(0.5)lo 0x3C7A2B7F, 0x222F65E2 */
3.06161699786838301793e-17, /* atan(1.0)lo 0x3C81A626, 0x33145C07 */
1.39033110312309984516e-17, /* atan(1.5)lo 0x3C700788, 0x7AF0CBBD */
6.12323399573676603587e-17, /* atan(inf)lo 0x3C91A626, 0x33145C07 */
};
#ifdef __STDC__
static const double aT[] = {
#else
static double aT[] = {
#endif
3.33333333333329318027e-01, /* 0x3FD55555, 0x5555550D */
-1.99999999998764832476e-01, /* 0xBFC99999, 0x9998EBC4 */
1.42857142725034663711e-01, /* 0x3FC24924, 0x920083FF */
-1.11111104054623557880e-01, /* 0xBFBC71C6, 0xFE231671 */
9.09088713343650656196e-02, /* 0x3FB745CD, 0xC54C206E */
-7.69187620504482999495e-02, /* 0xBFB3B0F2, 0xAF749A6D */
6.66107313738753120669e-02, /* 0x3FB10D66, 0xA0D03D51 */
-5.83357013379057348645e-02, /* 0xBFADDE2D, 0x52DEFD9A */
4.97687799461593236017e-02, /* 0x3FA97B4B, 0x24760DEB */
-3.65315727442169155270e-02, /* 0xBFA2B444, 0x2C6A6C2F */
1.62858201153657823623e-02, /* 0x3F90AD3A, 0xE322DA11 */
};
#ifdef __STDC__
static const double
#else
static double
#endif
one = 1.0,
big = 1.0e300;
#ifdef __STDC__
double atan(double x)
#else
double atan(x)
double x;
#endif
{
double w, s1, s2, z;
_INT32 ix, hx, id; /*- cc 020130 -*/
hx = __HI(x);
ix = hx & 0x7fffffff;
if (ix >= 0x44100000) { /* if |x| >= 2^66 */
if (ix > 0x7ff00000 || (ix == 0x7ff00000 && (__LO(x) != 0)))
return x + x; /* NaN */
if (hx > 0)
return atanhi[3] + atanlo[3];
else
return -atanhi[3] - atanlo[3];
}
if (ix < 0x3fdc0000) { /* |x| < 0.4375 */
if (ix < 0x3e200000) { /* |x| < 2^-29 */
if (big + x > one)
return x; /* raise inexact */
}
id = -1;
} else {
x = fabs(x);
if (ix < 0x3ff30000) { /* |x| < 1.1875 */
if (ix < 0x3fe60000) { /* 7/16 <=|x|<11/16 */
id = 0;
x = (2.0 * x - one) / (2.0 + x);
} else { /* 11/16<=|x|< 19/16 */
id = 1;
x = (x - one) / (x + one);
}
} else {
if (ix < 0x40038000) { /* |x| < 2.4375 */
id = 2;
x = (x - 1.5) / (one + 1.5 * x);
} else { /* 2.4375 <= |x| < 2^66 */
id = 3;
x = -1.0 / x;
}
}
}
/* end of argument reduction */
z = x * x;
w = z * z;
/* break sum from i=0 to 10 aT[i]z**(i+1) into odd and even poly */
s1 = z * (aT[0] + w * (aT[2] + w * (aT[4] + w * (aT[6] + w * (aT[8] + w * aT[10])))));
s2 = w * (aT[1] + w * (aT[3] + w * (aT[5] + w * (aT[7] + w * aT[9]))));
if (id < 0)
return x - x * (s1 + s2);
else {
z = atanhi[id] - ((x * (s1 + s2) - atanlo[id]) - x);
return (hx < 0) ? -z : z;
}
}

30
src/Runtime/s_copysign.c Normal file
View File

@ -0,0 +1,30 @@
/* @(#)s_copysign.c 1.2 95/01/04 */
/*
* ====================================================
* Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
*
* Developed at SunPro, a Sun Microsystems, Inc. business.
* Permission to use, copy, modify, and distribute this
* software is freely granted, provided that this notice
* is preserved.
* ====================================================
*/
/*
* copysign(double x, double y)
* copysign(x,y) returns a value with the magnitude of x and
* with the sign bit of y.
*/
#include "fdlibm.h"
#ifdef __STDC__
double copysign(double x, double y)
#else
double __copysign(x, y)
double x, y;
#endif
{
__HI(x) = (__HI(x) & 0x7fffffff) | (__HI(y) & 0x80000000);
return x;
}

75
src/Runtime/s_cos.c Normal file
View File

@ -0,0 +1,75 @@
/* @(#)s_cos.c 1.3 95/01/18 */
/*
* ====================================================
* Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
*
* Developed at SunSoft, a Sun Microsystems, Inc. business.
* Permission to use, copy, modify, and distribute this
* software is freely granted, provided that this notice
* is preserved.
* ====================================================
*/
/* cos(x)
* Return cosine function of x.
*
* kernel function:
* __kernel_sin ... sine function on [-pi/4,pi/4]
* __kernel_cos ... cosine function on [-pi/4,pi/4]
* __ieee754_rem_pio2 ... argument reduction routine
*
* Method.
* Let S,C and T denote the sin, cos and tan respectively on
* [-PI/4, +PI/4]. Reduce the argument x to y1+y2 = x-k*pi/2
* in [-pi/4 , +pi/4], and let n = k mod 4.
* We have
*
* n sin(x) cos(x) tan(x)
* ----------------------------------------------------------
* 0 S C T
* 1 C -S -1/T
* 2 -S -C T
* 3 -C S -1/T
* ----------------------------------------------------------
*
* Special cases:
* Let trig be any of sin, cos, or tan.
* trig(+-INF) is NaN, with signals;
* trig(NaN) is that NaN;
*
* Accuracy:
* TRIG(x) returns trig(x) nearly rounded
*/
#include "fdlibm.h"
#ifdef __STDC__
double cos(double x)
#else
double cos(x)
double x;
#endif
{
double y[2], z = 0.0;
int n, ix;
/* High word of x. */
ix = __HI(x);
/* |x| ~< pi/4 */
ix &= 0x7fffffff;
if (ix <= 0x3fe921fb)
return __kernel_cos(x, z);
/* cos(Inf or NaN) is NaN */
else if (ix >= 0x7ff00000)
return x - x;
/* argument reduction needed */
else {
n = __ieee754_rem_pio2(x, y);
switch (n & 3) {
case 0:
return __kernel_cos(y[0], y[1]);
case 1:
return -__kernel_sin(y[0], y[1], 1);
case 2:
return -__kernel_cos(y[0], y[1]);
default:
return __kernel_sin(y[0], y[1], 1);
}
}
}

Some files were not shown because too many files have changed in this diff Show More