diff --git a/Makefile b/Makefile index 0e89a8f5..431155d5 100644 --- a/Makefile +++ b/Makefile @@ -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) $< $@ diff --git a/asm/Kyoto/CFactoryMgr.s b/asm/Kyoto/CFactoryMgr.s index fba72cbb..cb6af2d7 100644 --- a/asm/Kyoto/CFactoryMgr.s +++ b/asm/Kyoto/CFactoryMgr.s @@ -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) diff --git a/asm/Kyoto/IObj.s b/asm/Kyoto/IObj.s index 5aecfd50..41d1daa8 100644 --- a/asm/Kyoto/IObj.s +++ b/asm/Kyoto/IObj.s @@ -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) diff --git a/asm/Kyoto/Math/RMathUtils.s b/asm/Kyoto/Math/RMathUtils.s index 599728a4..1564a7cc 100644 --- a/asm/Kyoto/Math/RMathUtils.s +++ b/asm/Kyoto/Math/RMathUtils.s @@ -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 diff --git a/asm/Kyoto/Text/CTextRenderBuffer.s b/asm/Kyoto/Text/CTextRenderBuffer.s index 35219931..fd0e897e 100644 --- a/asm/Kyoto/Text/CTextRenderBuffer.s +++ b/asm/Kyoto/Text/CTextRenderBuffer.s @@ -1923,6 +1923,8 @@ lbl_803D8368: # ROM: 0x3D5368 .asciz "??(??)" .balign 4 + +# what's going on here? .if version < 2 .4byte 0 .4byte 0 diff --git a/asm/MetroidPrime/CActor.s b/asm/MetroidPrime/CActor.s index 1bf966d0..81cc4993 100644 --- a/asm/MetroidPrime/CActor.s +++ b/asm/MetroidPrime/CActor.s @@ -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) diff --git a/asm/MetroidPrime/CEulerAngles.s b/asm/MetroidPrime/CEulerAngles.s index 2bd0288e..60858e81 100644 --- a/asm/MetroidPrime/CEulerAngles.s +++ b/asm/MetroidPrime/CEulerAngles.s @@ -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) diff --git a/asm/MetroidPrime/CGBASupport.s b/asm/MetroidPrime/CGBASupport.s index 62dfbd7e..90341600 100644 --- a/asm/MetroidPrime/CGBASupport.s +++ b/asm/MetroidPrime/CGBASupport.s @@ -38,7 +38,7 @@ lbl_805A9110: .section .text, "ax" -.if version == 2 +.if version >= 2 .global PollResponse__11CGBASupportFv PollResponse__11CGBASupportFv: diff --git a/asm/MetroidPrime/Player/CMorphBall.s b/asm/MetroidPrime/Player/CMorphBall.s index 48cee7bd..a2709c0b 100644 --- a/asm/MetroidPrime/Player/CMorphBall.s +++ b/asm/MetroidPrime/Player/CMorphBall.s @@ -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 diff --git a/asm/MetroidPrime/Player/CPlayerDynamics.s b/asm/MetroidPrime/Player/CPlayerDynamics.s index ec5af122..98be6a80 100644 --- a/asm/MetroidPrime/Player/CPlayerDynamics.s +++ b/asm/MetroidPrime/Player/CPlayerDynamics.s @@ -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) diff --git a/asm/MetroidPrime/ScriptObjects/CScriptGunTurret.s b/asm/MetroidPrime/ScriptObjects/CScriptGunTurret.s index 336c2fc4..0cd5724c 100644 --- a/asm/MetroidPrime/ScriptObjects/CScriptGunTurret.s +++ b/asm/MetroidPrime/ScriptObjects/CScriptGunTurret.s @@ -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) diff --git a/asm/Runtime/FILE_POS.s b/asm/Runtime/FILE_POS.s index ccc9f7fa..04d2d444 100644 --- a/asm/Runtime/FILE_POS.s +++ b/asm/Runtime/FILE_POS.s @@ -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) diff --git a/asm/Runtime/NMWException.s b/asm/Runtime/NMWException.s index 9dfa929b..b0fbea08 100644 --- a/asm/Runtime/NMWException.s +++ b/asm/Runtime/NMWException.s @@ -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 diff --git a/asm/Runtime/__init_cpp_exceptions.s b/asm/Runtime/__init_cpp_exceptions.s index b98991e4..2db1dcd9 100644 --- a/asm/Runtime/__init_cpp_exceptions.s +++ b/asm/Runtime/__init_cpp_exceptions.s @@ -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 diff --git a/asm/Runtime/abort_exit.s b/asm/Runtime/abort_exit.s index 20cc41ca..ee41cf2d 100644 --- a/asm/Runtime/abort_exit.s +++ b/asm/Runtime/abort_exit.s @@ -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) diff --git a/asm/Runtime/ansi_fp.s b/asm/Runtime/ansi_fp.s index 9ad6aca3..63965da2 100644 --- a/asm/Runtime/ansi_fp.s +++ b/asm/Runtime/ansi_fp.s @@ -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) diff --git a/asm/Runtime/ctype.s b/asm/Runtime/ctype.s index 55bc826e..45f4bc6d 100644 --- a/asm/Runtime/ctype.s +++ b/asm/Runtime/ctype.s @@ -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 diff --git a/asm/Runtime/e_acos.s b/asm/Runtime/e_acos.s index 9fec5f69..938b2f70 100644 --- a/asm/Runtime/e_acos.s +++ b/asm/Runtime/e_acos.s @@ -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 diff --git a/asm/Runtime/e_asin.s b/asm/Runtime/e_asin.s index f2d99324..fec70ef9 100644 --- a/asm/Runtime/e_asin.s +++ b/asm/Runtime/e_asin.s @@ -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 diff --git a/asm/Runtime/e_log.s b/asm/Runtime/e_log.s index 81711d8b..397d1362 100644 --- a/asm/Runtime/e_log.s +++ b/asm/Runtime/e_log.s @@ -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: diff --git a/asm/Runtime/e_pow.s b/asm/Runtime/e_pow.s index 644c73de..8343ed7b 100644 --- a/asm/Runtime/e_pow.s +++ b/asm/Runtime/e_pow.s @@ -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 diff --git a/asm/Runtime/float.s b/asm/Runtime/float.s new file mode 100644 index 00000000..c92c677e --- /dev/null +++ b/asm/Runtime/float.s @@ -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 \ No newline at end of file diff --git a/asm/Runtime/locale.s b/asm/Runtime/locale.s new file mode 100644 index 00000000..2f359e7b --- /dev/null +++ b/asm/Runtime/locale.s @@ -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 diff --git a/asm/Runtime/s_cosf.s b/asm/Runtime/math_ppc.s similarity index 100% rename from asm/Runtime/s_cosf.s rename to asm/Runtime/math_ppc.s diff --git a/asm/Runtime/misc_io.s b/asm/Runtime/misc_io.s index 002b8e30..a214677b 100644 --- a/asm/Runtime/misc_io.s +++ b/asm/Runtime/misc_io.s @@ -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 diff --git a/asm/Runtime/printf.s b/asm/Runtime/printf.s index 3354b918..314be077 100644 --- a/asm/Runtime/printf.s +++ b/asm/Runtime/printf.s @@ -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) diff --git a/asm/Runtime/rand.s b/asm/Runtime/rand.s index 6d800928..9c83008b 100644 --- a/asm/Runtime/rand.s +++ b/asm/Runtime/rand.s @@ -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 diff --git a/asm/Runtime/sdata.s b/asm/Runtime/sdata.s deleted file mode 100644 index 858d1907..00000000 --- a/asm/Runtime/sdata.s +++ /dev/null @@ -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 - - diff --git a/asm/Runtime/strtold.s b/asm/Runtime/strtold.s index 4aa903a8..1b15ebdb 100644 --- a/asm/Runtime/strtold.s +++ b/asm/Runtime/strtold.s @@ -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 diff --git a/asm/Runtime/s_acos.s b/asm/Runtime/w_acos.s similarity index 100% rename from asm/Runtime/s_acos.s rename to asm/Runtime/w_acos.s diff --git a/asm/Runtime/s_asin.s b/asm/Runtime/w_asin.s similarity index 100% rename from asm/Runtime/s_asin.s rename to asm/Runtime/w_asin.s diff --git a/asm/Runtime/s_atan2.s b/asm/Runtime/w_atan2.s similarity index 100% rename from asm/Runtime/s_atan2.s rename to asm/Runtime/w_atan2.s diff --git a/asm/Runtime/s_exp.s b/asm/Runtime/w_exp.s similarity index 100% rename from asm/Runtime/s_exp.s rename to asm/Runtime/w_exp.s diff --git a/asm/Runtime/s_fmod.s b/asm/Runtime/w_fmod.s similarity index 100% rename from asm/Runtime/s_fmod.s rename to asm/Runtime/w_fmod.s diff --git a/asm/Runtime/s_log.s b/asm/Runtime/w_log.s similarity index 100% rename from asm/Runtime/s_log.s rename to asm/Runtime/w_log.s diff --git a/asm/Runtime/s_pow.s b/asm/Runtime/w_pow.s similarity index 100% rename from asm/Runtime/s_pow.s rename to asm/Runtime/w_pow.s diff --git a/asm/Runtime/widechar_io.s b/asm/Runtime/wchar_io.s similarity index 100% rename from asm/Runtime/widechar_io.s rename to asm/Runtime/wchar_io.s diff --git a/asm/WorldFormat/CCollidableOBBTree.s b/asm/WorldFormat/CCollidableOBBTree.s index ec3f3e30..838dc0b0 100644 --- a/asm/WorldFormat/CCollidableOBBTree.s +++ b/asm/WorldFormat/CCollidableOBBTree.s @@ -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) diff --git a/asm/WorldFormat/CMetroidAreaCollider.s b/asm/WorldFormat/CMetroidAreaCollider.s index 2ae33ff6..795c7f7b 100644 --- a/asm/WorldFormat/CMetroidAreaCollider.s +++ b/asm/WorldFormat/CMetroidAreaCollider.s @@ -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) diff --git a/include/Dolphin/os.h b/include/Dolphin/os.h index 6fb6fbac..81cf2902 100644 --- a/include/Dolphin/os.h +++ b/include/Dolphin/os.h @@ -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 diff --git a/include/Kyoto/Basics/CCast.hpp b/include/Kyoto/Basics/CCast.hpp index 565e4b83..9215d06e 100644 --- a/include/Kyoto/Basics/CCast.hpp +++ b/include/Kyoto/Basics/CCast.hpp @@ -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(in); +} +inline f32 ToReal32(u8 in) { + return static_cast(in); +} +#endif } // namespace CCast #endif diff --git a/include/Kyoto/Graphics/CColor.hpp b/include/Kyoto/Graphics/CColor.hpp index e67df6e4..a1434e86 100644 --- a/include/Kyoto/Graphics/CColor.hpp +++ b/include/Kyoto/Graphics/CColor.hpp @@ -5,7 +5,9 @@ #include "Kyoto/Basics/CCast.hpp" +#ifdef __MWERKS__ #pragma cpp_extensions on +#endif class CInputStream; class CColor { diff --git a/include/Kyoto/IObjectStore.hpp b/include/Kyoto/IObjectStore.hpp index 73f70224..34f33feb 100644 --- a/include/Kyoto/IObjectStore.hpp +++ b/include/Kyoto/IObjectStore.hpp @@ -27,7 +27,7 @@ public: static CVParamTransfer Null(); private: - rstl::rc_ptr< void > x0_; + rstl::rc_ptr< unkptr > x0_; }; class CObjectReference { public: diff --git a/include/Kyoto/Streams/CInputStream.hpp b/include/Kyoto/Streams/CInputStream.hpp index 33b2f8cb..140dc023 100644 --- a/include/Kyoto/Streams/CInputStream.hpp +++ b/include/Kyoto/Streams/CInputStream.hpp @@ -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; diff --git a/include/Kyoto/TReservedAverage.hpp b/include/Kyoto/TReservedAverage.hpp index d66c84bd..ddfdaa86 100644 --- a/include/Kyoto/TReservedAverage.hpp +++ b/include/Kyoto/TReservedAverage.hpp @@ -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; diff --git a/include/Kyoto/TToken.hpp b/include/Kyoto/TToken.hpp index c04bdf43..67f1d504 100644 --- a/include/Kyoto/TToken.hpp +++ b/include/Kyoto/TToken.hpp @@ -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; diff --git a/include/MetroidPrime/TCastTo.hpp b/include/MetroidPrime/TCastTo.hpp index ff31e5bb..de8df09d 100644 --- a/include/MetroidPrime/TCastTo.hpp +++ b/include/MetroidPrime/TCastTo.hpp @@ -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 diff --git a/include/math_ppc.h b/include/math_ppc.h index 6128581c..c079879a 100644 --- a/include/math_ppc.h +++ b/include/math_ppc.h @@ -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 diff --git a/include/rstl/construct.hpp b/include/rstl/construct.hpp index a61a9c63..f57ebf4f 100644 --- a/include/rstl/construct.hpp +++ b/include/rstl/construct.hpp @@ -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); ?? diff --git a/include/rstl/pointer_iterator.hpp b/include/rstl/pointer_iterator.hpp index 7d71b112..51e62899 100644 --- a/include/rstl/pointer_iterator.hpp +++ b/include/rstl/pointer_iterator.hpp @@ -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()); } } diff --git a/include/rstl/reserved_vector.hpp b/include/rstl/reserved_vector.hpp index bc7d53b3..71c8d373 100644 --- a/include/rstl/reserved_vector.hpp +++ b/include/rstl/reserved_vector.hpp @@ -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 diff --git a/include/rstl/rmemory_allocator.hpp b/include/rstl/rmemory_allocator.hpp index b48dca5a..3c248bb6 100644 --- a/include/rstl/rmemory_allocator.hpp +++ b/include/rstl/rmemory_allocator.hpp @@ -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 > diff --git a/include/rstl/vector.hpp b/include/rstl/vector.hpp index 568ccfbd..98cdd741 100644 --- a/include/rstl/vector.hpp +++ b/include/rstl/vector.hpp @@ -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; diff --git a/include/string.h b/include/string.h deleted file mode 100644 index 31f0e022..00000000 --- a/include/string.h +++ /dev/null @@ -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 \ No newline at end of file diff --git a/include/types.h b/include/types.h index 4908f75d..455c7f8e 100644 --- a/include/types.h +++ b/include/types.h @@ -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; diff --git a/libc/assert.h b/libc/assert.h new file mode 100644 index 00000000..32ec1dc8 --- /dev/null +++ b/libc/assert.h @@ -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 diff --git a/libc/ctype.h b/libc/ctype.h new file mode 100644 index 00000000..5e5f3620 --- /dev/null +++ b/libc/ctype.h @@ -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 diff --git a/libc/errno.h b/libc/errno.h new file mode 100644 index 00000000..96304fc6 --- /dev/null +++ b/libc/errno.h @@ -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 diff --git a/libc/float.h b/libc/float.h new file mode 100644 index 00000000..5023d19d --- /dev/null +++ b/libc/float.h @@ -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 diff --git a/libc/limits.h b/libc/limits.h new file mode 100644 index 00000000..e4bb3108 --- /dev/null +++ b/libc/limits.h @@ -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 diff --git a/libc/locale.h b/libc/locale.h new file mode 100644 index 00000000..bb93d738 --- /dev/null +++ b/libc/locale.h @@ -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 \ No newline at end of file diff --git a/libc/math.h b/libc/math.h new file mode 100644 index 00000000..f8b722ee --- /dev/null +++ b/libc/math.h @@ -0,0 +1,198 @@ +#ifndef _MATH_H_ +#define _MATH_H_ + +#include + +#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 diff --git a/libc/mem_funcs.h b/libc/mem_funcs.h new file mode 100644 index 00000000..0c5b0756 --- /dev/null +++ b/libc/mem_funcs.h @@ -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 \ No newline at end of file diff --git a/libc/stdarg.h b/libc/stdarg.h new file mode 100644 index 00000000..8834b297 --- /dev/null +++ b/libc/stdarg.h @@ -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 diff --git a/libc/stddef.h b/libc/stddef.h new file mode 100644 index 00000000..010087e2 --- /dev/null +++ b/libc/stddef.h @@ -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 diff --git a/libc/stdint.h b/libc/stdint.h new file mode 100644 index 00000000..fd88f2e3 --- /dev/null +++ b/libc/stdint.h @@ -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 diff --git a/libc/stdio.h b/libc/stdio.h new file mode 100644 index 00000000..8ddb6ede --- /dev/null +++ b/libc/stdio.h @@ -0,0 +1,76 @@ +#ifndef _STDIO_H_ +#define _STDIO_H_ + +#include +#include + +#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 diff --git a/libc/stdlib.h b/libc/stdlib.h new file mode 100644 index 00000000..0c1a9724 --- /dev/null +++ b/libc/stdlib.h @@ -0,0 +1,25 @@ +#ifndef _STDLIB_H_ +#define _STDLIB_H_ + +#include +#include + +#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 diff --git a/libc/string.h b/libc/string.h new file mode 100644 index 00000000..7633b1f1 --- /dev/null +++ b/libc/string.h @@ -0,0 +1,24 @@ +#ifndef _STRING_H_ +#define _STRING_H_ + +#include + +#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 diff --git a/libc/wchar.h b/libc/wchar.h new file mode 100644 index 00000000..6dc82b08 --- /dev/null +++ b/libc/wchar.h @@ -0,0 +1,16 @@ +#ifndef _WCHAR_H_ +#define _WCHAR_H_ + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +int fwide(FILE* stream, int mode); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/obj_files.mk b/obj_files.mk index bc1485d5..d771261c 100644 --- a/obj_files.mk +++ b/obj_files.mk @@ -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\ diff --git a/src/Dolphin/os/OSAudioSystem.c b/src/Dolphin/os/OSAudioSystem.c index 93391ad5..0a640734 100644 --- a/src/Dolphin/os/OSAudioSystem.c +++ b/src/Dolphin/os/OSAudioSystem.c @@ -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 - diff --git a/src/Kyoto/Streams/CInputStream.cpp b/src/Kyoto/Streams/CInputStream.cpp index 12eac857..69bedf1d 100644 --- a/src/Kyoto/Streams/CInputStream.cpp +++ b/src/Kyoto/Streams/CInputStream.cpp @@ -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) diff --git a/src/Kyoto/Text/CStringTable.cpp b/src/Kyoto/Text/CStringTable.cpp index 4c2b8eb2..6930de0a 100644 --- a/src/Kyoto/Text/CStringTable.cpp +++ b/src/Kyoto/Text/CStringTable.cpp @@ -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; diff --git a/src/Runtime/NMWException.h b/src/Runtime/NMWException.h new file mode 100644 index 00000000..c8291d21 --- /dev/null +++ b/src/Runtime/NMWException.h @@ -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 diff --git a/src/Runtime/abort_exit.c b/src/Runtime/abort_exit.c new file mode 100644 index 00000000..b0ebadeb --- /dev/null +++ b/src/Runtime/abort_exit.c @@ -0,0 +1,38 @@ +#include + +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(); +} diff --git a/src/Runtime/ctype.c b/src/Runtime/ctype.c new file mode 100644 index 00000000..25f2e609 --- /dev/null +++ b/src/Runtime/ctype.c @@ -0,0 +1,65 @@ +#define _CTYPE_INLINE __declspec(weak) +#include +#include + +#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 +}; \ No newline at end of file diff --git a/src/Runtime/e_acos.c b/src/Runtime/e_acos.c new file mode 100644 index 00000000..aeb1a688 --- /dev/null +++ b/src/Runtime/e_acos.c @@ -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); + } +} diff --git a/src/Runtime/e_asin.c b/src/Runtime/e_asin.c new file mode 100644 index 00000000..18c58085 --- /dev/null +++ b/src/Runtime/e_asin.c @@ -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; +} diff --git a/src/Runtime/e_atan2.c b/src/Runtime/e_atan2.c new file mode 100644 index 00000000..6adc2f85 --- /dev/null +++ b/src/Runtime/e_atan2.c @@ -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(-,-) */ + } +} diff --git a/src/Runtime/e_exp.c b/src/Runtime/e_exp.c new file mode 100644 index 00000000..1e09072a --- /dev/null +++ b/src/Runtime/e_exp.c @@ -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; + } +} diff --git a/src/Runtime/e_fmod.c b/src/Runtime/e_fmod.c new file mode 100644 index 00000000..4a686aec --- /dev/null +++ b/src/Runtime/e_fmod.c @@ -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 */ +} diff --git a/src/Runtime/e_log.c b/src/Runtime/e_log.c new file mode 100644 index 00000000..66730360 --- /dev/null +++ b/src/Runtime/e_log.c @@ -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); + } +} diff --git a/src/Runtime/e_pow.c b/src/Runtime/e_pow.c new file mode 100644 index 00000000..ea26b6cb --- /dev/null +++ b/src/Runtime/e_pow.c @@ -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|> 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; +} diff --git a/src/Runtime/e_rem_pio2.c b/src/Runtime/e_rem_pio2.c new file mode 100644 index 00000000..d1a369f1 --- /dev/null +++ b/src/Runtime/e_rem_pio2.c @@ -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; +} diff --git a/src/Runtime/fdlibm.h b/src/Runtime/fdlibm.h new file mode 100644 index 00000000..0f43cda3 --- /dev/null +++ b/src/Runtime/fdlibm.h @@ -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 +#include +#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 + * (one may replace the following line by "#include ") + */ + +#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*)); \ No newline at end of file diff --git a/src/Runtime/k_cos.c b/src/Runtime/k_cos.c new file mode 100644 index 00000000..6780afe2 --- /dev/null +++ b/src/Runtime/k_cos.c @@ -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)); + } +} diff --git a/src/Runtime/k_rem_pio2.c b/src/Runtime/k_rem_pio2.c new file mode 100644 index 00000000..d78f2f69 --- /dev/null +++ b/src/Runtime/k_rem_pio2.c @@ -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; +} diff --git a/src/Runtime/k_sin.c b/src/Runtime/k_sin.c new file mode 100644 index 00000000..6c4ded3f --- /dev/null +++ b/src/Runtime/k_sin.c @@ -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); +} diff --git a/src/Runtime/k_tan.c b/src/Runtime/k_tan.c new file mode 100644 index 00000000..4e488e91 --- /dev/null +++ b/src/Runtime/k_tan.c @@ -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); + } +} diff --git a/src/Runtime/locale.c b/src/Runtime/locale.c new file mode 100644 index 00000000..e265db0c --- /dev/null +++ b/src/Runtime/locale.c @@ -0,0 +1,33 @@ +#include +#include + +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"; diff --git a/src/Runtime/math_ppc.c b/src/Runtime/math_ppc.c new file mode 100644 index 00000000..7cacb733 --- /dev/null +++ b/src/Runtime/math_ppc.c @@ -0,0 +1,3 @@ +#include + +float cosf(float x) { return (float)cos((double)x); } diff --git a/src/Runtime/mem.c b/src/Runtime/mem.c new file mode 100644 index 00000000..f2ed7b7e --- /dev/null +++ b/src/Runtime/mem.c @@ -0,0 +1,70 @@ +#include + +#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; +} diff --git a/src/Runtime/mem_funcs.c b/src/Runtime/mem_funcs.c new file mode 100644 index 00000000..0cc2d5ef --- /dev/null +++ b/src/Runtime/mem_funcs.c @@ -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; +} diff --git a/src/Runtime/misc_io.c b/src/Runtime/misc_io.c new file mode 100644 index 00000000..6b4060ae --- /dev/null +++ b/src/Runtime/misc_io.c @@ -0,0 +1,4 @@ +extern void (*__stdio_exit)(void); +void __close_all(void); + +void __stdio_atexit(void) { __stdio_exit = __close_all; } diff --git a/src/Runtime/qsort.c b/src/Runtime/qsort.c new file mode 100644 index 00000000..ec9f6566 --- /dev/null +++ b/src/Runtime/qsort.c @@ -0,0 +1,75 @@ +#include + +#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; + } + } +} diff --git a/src/Runtime/rand.c b/src/Runtime/rand.c new file mode 100644 index 00000000..9d02257e --- /dev/null +++ b/src/Runtime/rand.c @@ -0,0 +1,10 @@ +#include + +static unsigned long int next = 1; + +int rand(void) { + next = next * 1103515245 + 12345; + return (next >> 16) & 0x7FFF; +} + +void srand(unsigned int seed) { next = seed; } diff --git a/src/Runtime/s_atan.c b/src/Runtime/s_atan.c new file mode 100644 index 00000000..c10ae76a --- /dev/null +++ b/src/Runtime/s_atan.c @@ -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; + } +} diff --git a/src/Runtime/s_copysign.c b/src/Runtime/s_copysign.c new file mode 100644 index 00000000..38b88a30 --- /dev/null +++ b/src/Runtime/s_copysign.c @@ -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; +} diff --git a/src/Runtime/s_cos.c b/src/Runtime/s_cos.c new file mode 100644 index 00000000..833d8713 --- /dev/null +++ b/src/Runtime/s_cos.c @@ -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); + } + } +} diff --git a/src/Runtime/s_floor.c b/src/Runtime/s_floor.c new file mode 100644 index 00000000..6e78d9be --- /dev/null +++ b/src/Runtime/s_floor.c @@ -0,0 +1,87 @@ +/* @(#)s_floor.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. + * ==================================================== + */ +/* + * floor(x) + * Return x rounded toward -inf to integral value + * Method: + * Bit twiddling. + * Exception: + * Inexact flag raised if x not equal to floor(x). + */ +#include "fdlibm.h" + +#ifdef __STDC__ +static const double huge = 1.0e300; +#else +static double huge = 1.0e300; +#endif + +#ifdef __STDC__ +double floor(double x) +#else +double floor(x) +double x; +#endif +{ + int i0, i1, j0; + unsigned i, j; + i0 = __HI(x); + i1 = __LO(x); + j0 = ((i0 >> 20) & 0x7ff) - 0x3ff; + if (j0 < 20) { + if (j0 < 0) { /* raise inexact if x != 0 */ + if (huge + x > 0.0) { /* return 0*sign(x) if |x|<1 */ + if (i0 >= 0) { + i0 = i1 = 0; + } else if (((i0 & 0x7fffffff) | i1) != 0) { + i0 = 0xbff00000; + i1 = 0; + } + } + } else { + i = (0x000fffff) >> j0; + if (((i0 & i) | i1) == 0) + return x; /* x is integral */ + if (huge + x > 0.0) { /* raise inexact flag */ + if (i0 < 0) + i0 += (0x00100000) >> j0; + i0 &= (~i); + i1 = 0; + } + } + } else if (j0 > 51) { + if (j0 == 0x400) + return x + x; /* inf or NaN */ + else + return x; /* x is integral */ + } else { + i = ((unsigned)(0xffffffff)) >> (j0 - 20); + if ((i1 & i) == 0) + return x; /* x is integral */ + if (huge + x > 0.0) { /* raise inexact flag */ + if (i0 < 0) { + if (j0 == 20) + i0 += 1; + else { + j = i1 + (1 << (52 - j0)); + if (j < i1) + i0 += 1; /* got a carry */ + i1 = j; + } + } + i1 &= (~i); + } + } + __HI(x) = i0; + __LO(x) = i1; + return x; +} \ No newline at end of file diff --git a/src/Runtime/s_frexp.c b/src/Runtime/s_frexp.c new file mode 100644 index 00000000..dcc1a26a --- /dev/null +++ b/src/Runtime/s_frexp.c @@ -0,0 +1,57 @@ +/* @(#)s_frexp.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. + * ==================================================== + */ + +/* + * for non-zero x + * x = frexp(arg,&exp); + * return a double fp quantity x such that 0.5 <= |x| <1.0 + * and the corresponding binary exponent "exp". That is + * arg = x*2^exp. + * If arg is inf, 0.0, or NaN, then frexp(arg,&exp) returns arg + * with *exp=0. + */ + +#include "fdlibm.h" + +#ifdef __STDC__ +static const double +#else +static double +#endif + two54 = 1.80143985094819840000e+16; /* 0x43500000, 0x00000000 */ + +#ifdef __STDC__ +double frexp(double x, int* eptr) +#else +double frexp(x, eptr) +double x; +int* eptr; +#endif +{ + int hx, ix, lx; + hx = __HI(x); + ix = 0x7fffffff & hx; + lx = __LO(x); + *eptr = 0; + if (ix >= 0x7ff00000 || ((ix | lx) == 0)) + return x; /* 0,inf,nan */ + if (ix < 0x00100000) { /* subnormal */ + x *= two54; + hx = __HI(x); + ix = hx & 0x7fffffff; + *eptr = -54; + } + *eptr += (ix >> 20) - 1022; + hx = (hx & 0x800fffff) | 0x3fe00000; + __HI(x) = hx; + return x; +} diff --git a/src/Runtime/s_ldexp.c b/src/Runtime/s_ldexp.c new file mode 100644 index 00000000..87ee8d12 --- /dev/null +++ b/src/Runtime/s_ldexp.c @@ -0,0 +1,54 @@ +/* @(#)s_ldexp.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. + * ==================================================== + */ + +#include "fdlibm.h" + +static const double two54 = 1.80143985094819840000e+16, /* 0x43500000, 0x00000000 */ + twom54 = 5.55111512312578270212e-17, /* 0x3C900000, 0x00000000 */ + big = 1.0e+300, tiny = 1.0e-300; + +double ldexp(double x, int n) { + _INT32 k, hx, lx; /*- cc 020130 -*/ + if (!isfinite(x) || x == 0.0) + return x; + + hx = __HI(x); + lx = __LO(x); + k = (hx & 0x7ff00000) >> 20; /* extract exponent */ + if (k == 0) { /* 0 or subnormal x */ + if ((lx | (hx & 0x7fffffff)) == 0) + return x; /* +-0 */ + x *= two54; + hx = __HI(x); + k = ((hx & 0x7ff00000) >> 20) - 54; + if (n < -50000) + return tiny * x; /*underflow*/ + } + if (k == 0x7ff) + return x + x; /* NaN or Inf */ + k = k + n; + if (k > 0x7fe) + return big * copysign(big, x); /* overflow */ + if (k > 0) /* normal result */ + { + __HI(x) = (hx & 0x800fffff) | (k << 20); + return x; + } + if (k <= -54) + if (n > 50000) /* in case integer overflow in n+k */ + return big * copysign(big, x); /*overflow*/ + else + return tiny * copysign(tiny, x); /*underflow*/ + k += 54; /* subnormal result */ + __HI(x) = (hx & 0x800fffff) | (k << 20); + return x * twom54; +} diff --git a/src/Runtime/s_modf.c b/src/Runtime/s_modf.c new file mode 100644 index 00000000..8da16a58 --- /dev/null +++ b/src/Runtime/s_modf.c @@ -0,0 +1,79 @@ +/* @(#)s_modf.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. + * ==================================================== + */ + +/* + * modf(double x, double *iptr) + * return fraction part of x, and return x's integral part in *iptr. + * Method: + * Bit twiddling. + * + * Exception: + * No exception. + */ + +#include "fdlibm.h" + +#ifdef __STDC__ +static const double one = 1.0; +#else +static double one = 1.0; +#endif + +#ifdef __STDC__ +double modf(double x, double* iptr) +#else +double modf(x, iptr) +double x, *iptr; +#endif +{ + _INT32 i0, i1, j0; /*- cc 020130 -*/ + _UINT32 i; /*- cc 020130 -*/ + i0 = __HI(x); /* high x */ + i1 = __LO(x); /* low x */ + j0 = ((i0 >> 20) & 0x7ff) - 0x3ff; /* exponent of x */ + if (j0 < 20) { /* integer part in high x */ + if (j0 < 0) { /* |x|<1 */ + __HIp(iptr) = i0 & 0x80000000; + __LOp(iptr) = 0; /* *iptr = +-0 */ + return x; + } else { + i = (0x000fffff) >> j0; + if (((i0 & i) | i1) == 0) { /* x is integral */ + *iptr = x; + __HI(x) &= 0x80000000; + __LO(x) = 0; /* return +-0 */ + return x; + } else { + __HIp(iptr) = i0 & (~i); + __LOp(iptr) = 0; + return x - *iptr; + } + } + } else if (j0 > 51) { /* no fraction part */ + *iptr = x * one; + __HI(x) &= 0x80000000; + __LO(x) = 0; /* return +-0 */ + return x; + } else { /* fraction part in low x */ + i = ((_UINT32)(0xffffffff)) >> (j0 - 20); /*- cc 020130 -*/ + if ((i1 & i) == 0) { /* x is integral */ + *iptr = x; + __HI(x) &= 0x80000000; + __LO(x) = 0; /* return +-0 */ + return x; + } else { + __HIp(iptr) = i0; + __LOp(iptr) = i1 & (~i); + return x - *iptr; + } + } +} diff --git a/src/Runtime/s_nextafter.c b/src/Runtime/s_nextafter.c new file mode 100644 index 00000000..6de728de --- /dev/null +++ b/src/Runtime/s_nextafter.c @@ -0,0 +1,88 @@ +/* @(#)s_nextafter.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. + * ==================================================== + */ + +/* IEEE functions + * nextafter(x,y) + * return the next machine floating-point number of x in the + * direction toward y. + * Special cases: + */ + +#include "fdlibm.h" + +#ifdef __STDC__ +double nextafter(double x, double y) +#else +double nextafter(x, y) +double x, y; +#endif +{ + _INT32 hx, hy, ix, iy; /*- cc 020130 -*/ + _UINT32 lx, ly; /*- 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 */ + ix = hx & 0x7fffffff; /* |x| */ + iy = hy & 0x7fffffff; /* |y| */ + + if (((ix >= 0x7ff00000) && ((ix - 0x7ff00000) | lx) != 0) || /* x is nan */ + ((iy >= 0x7ff00000) && ((iy - 0x7ff00000) | ly) != 0)) /* y is nan */ + return x + y; + if (x == y) + return x; /* x=y, return x */ + if ((ix | lx) == 0) { /* x == 0 */ + __HI(x) = hy & 0x80000000; /* return +-minsubnormal */ + __LO(x) = 1; + y = x * x; + if (y == x) + return y; + else + return x; /* raise underflow flag */ + } + if (hx >= 0) { /* x > 0 */ + if (hx > hy || ((hx == hy) && (lx > ly))) { /* x > y, x -= ulp */ + if (lx == 0) + hx -= 1; + lx -= 1; + } else { /* x < y, x += ulp */ + lx += 1; + if (lx == 0) + hx += 1; + } + } else { /* x < 0 */ + if (hy >= 0 || hx > hy || ((hx == hy) && (lx > ly))) { /* x < y, x -= ulp */ + if (lx == 0) + hx -= 1; + lx -= 1; + } else { /* x > y, x += ulp */ + lx += 1; + if (lx == 0) + hx += 1; + } + } + hy = hx & 0x7ff00000; + if (hy >= 0x7ff00000) + return x + x; /* overflow */ + if (hy < 0x00100000) { /* underflow */ + y = x * x; + if (y != x) { /* raise underflow flag */ + __HI(y) = hx; + __LO(y) = lx; + return y; + } + } + __HI(x) = hx; + __LO(x) = lx; + return x; +} diff --git a/src/Runtime/s_sin.c b/src/Runtime/s_sin.c new file mode 100644 index 00000000..ebb4deed --- /dev/null +++ b/src/Runtime/s_sin.c @@ -0,0 +1,84 @@ +/* @(#)s_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. + * ==================================================== + */ + +/* sin(x) + * Return sine function of x. + * + * kernel function: + * __kernel_sin ... sine function on [-pi/4,pi/4] + * __kernel_cos ... cose 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 sin(double x) +#else +double sin(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_sin(x, z, 0); + + /* sin(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_sin(y[0], y[1], 1); + case 1: + return __kernel_cos(y[0], y[1]); + case 2: + return -__kernel_sin(y[0], y[1], 1); + default: + return -__kernel_cos(y[0], y[1]); + } + } +} diff --git a/src/Runtime/s_tan.c b/src/Runtime/s_tan.c new file mode 100644 index 00000000..cf60c0fa --- /dev/null +++ b/src/Runtime/s_tan.c @@ -0,0 +1,73 @@ +/* @(#)s_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. + * ==================================================== + */ + +/* tan(x) + * Return tangent function of x. + * + * kernel function: + * __kernel_tan ... tangent 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 tan(double x) +#else +double tan(x) +double x; +#endif +{ + double y[2], z = 0.0; + _INT32 n, ix; /*- cc 020130 -*/ + + /* High word of x. */ + ix = __HI(x); + + /* |x| ~< pi/4 */ + ix &= 0x7fffffff; + if (ix <= 0x3fe921fb) + return __kernel_tan(x, z, 1); + + /* tan(Inf or NaN) is NaN */ + else if (ix >= 0x7ff00000) + return x - x; /* NaN */ + + /* argument reduction needed */ + else { + n = __ieee754_rem_pio2(x, y); + return __kernel_tan(y[0], y[1], 1 - ((n & 1) << 1)); /* 1 -- n even + -1 -- n odd */ + } +} diff --git a/src/Runtime/w_acos.c b/src/Runtime/w_acos.c new file mode 100644 index 00000000..1d9a9cec --- /dev/null +++ b/src/Runtime/w_acos.c @@ -0,0 +1,39 @@ + +/* @(#)w_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. + * ==================================================== + */ + +/* + * wrap_acos(x) + */ + +#include "fdlibm.h" + +#ifdef __STDC__ +double acos(double x) /* wrapper acos */ +#else +double acos(x) /* wrapper acos */ +double x; +#endif +{ +#ifdef _IEEE_LIBM + return __ieee754_acos(x); +#else + double z; + z = __ieee754_acos(x); + if (_LIB_VERSION == _IEEE_ || isnan(x)) + return z; + if (fabs(x) > 1.0) { + return __kernel_standard(x, x, 1); /* acos(|x|>1) */ + } else + return z; +#endif +} diff --git a/src/Runtime/w_asin.c b/src/Runtime/w_asin.c new file mode 100644 index 00000000..5519bc79 --- /dev/null +++ b/src/Runtime/w_asin.c @@ -0,0 +1,40 @@ + +/* @(#)w_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. + * ==================================================== + * + */ + +/* + * wrapper asin(x) + */ + +#include "fdlibm.h" + +#ifdef __STDC__ +double asin(double x) /* wrapper asin */ +#else +double asin(x) /* wrapper asin */ +double x; +#endif +{ +#ifdef _IEEE_LIBM + return __ieee754_asin(x); +#else + double z; + z = __ieee754_asin(x); + if (_LIB_VERSION == _IEEE_ || isnan(x)) + return z; + if (fabs(x) > 1.0) { + return __kernel_standard(x, x, 2); /* asin(|x|>1) */ + } else + return z; +#endif +} diff --git a/src/Runtime/w_atan2.c b/src/Runtime/w_atan2.c new file mode 100644 index 00000000..890f130d --- /dev/null +++ b/src/Runtime/w_atan2.c @@ -0,0 +1,40 @@ + +/* @(#)w_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. + * ==================================================== + * + */ + +/* + * wrapper atan2(y,x) + */ + +#include "fdlibm.h" + +#ifdef __STDC__ +double atan2(double y, double x) /* wrapper atan2 */ +#else +double atan2(y, x) /* wrapper atan2 */ +double y, x; +#endif +{ +#ifdef _IEEE_LIBM + return __ieee754_atan2(y, x); +#else + double z; + z = __ieee754_atan2(y, x); + if (_LIB_VERSION == _IEEE_ || isnan(x) || isnan(y)) + return z; + if (x == 0.0 && y == 0.0) { + return __kernel_standard(y, x, 3); /* atan2(+-0,+-0) */ + } else + return z; +#endif +} diff --git a/src/Runtime/w_exp.c b/src/Runtime/w_exp.c new file mode 100644 index 00000000..c8ed38b5 --- /dev/null +++ b/src/Runtime/w_exp.c @@ -0,0 +1,49 @@ +/* @(#)w_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. + * ==================================================== + */ + +/* + * wrapper exp(x) + */ + +#include "fdlibm.h" + +#ifdef __STDC__ +static const double +#else +static double +#endif + o_threshold = 7.09782712893383973096e+02, /* 0x40862E42, 0xFEFA39EF */ + u_threshold = -7.45133219101941108420e+02; /* 0xc0874910, 0xD52D3051 */ + +#ifdef __STDC__ +double exp(double x) /* wrapper pow */ +#else +double exp(x) /* wrapper exp */ +double x; +#endif +{ +#ifdef _IEEE_LIBM + return __ieee754_exp(x); +#else + double z; + z = __ieee754_exp(x); + if (_LIB_VERSION == _IEEE_) + return z; + if (isfinite(x)) { + if (x > o_threshold) + return __kernel_standard(x, x, 6); /* exp overflow */ + else if (x < u_threshold) + return __kernel_standard(x, x, 7); /* exp underflow */ + } + return z; +#endif +} diff --git a/src/Runtime/w_fmod.c b/src/Runtime/w_fmod.c new file mode 100644 index 00000000..6a0f07a0 --- /dev/null +++ b/src/Runtime/w_fmod.c @@ -0,0 +1,38 @@ +/* @(#)w_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. + * ==================================================== + */ + +/* + * wrapper fmod(x,y) + */ + +#include "fdlibm.h" + +#ifdef __STDC__ +double fmod(double x, double y) /* wrapper fmod */ +#else +double fmod(x, y) /* wrapper fmod */ +double x, y; +#endif +{ +#ifdef _IEEE_LIBM + return __ieee754_fmod(x, y); +#else + double z; + z = __ieee754_fmod(x, y); + if (_LIB_VERSION == _IEEE_ || isnan(y) || isnan(x)) + return z; + if (y == 0.0) { + return __kernel_standard(x, y, 27); /* fmod(x,0) */ + } else + return z; +#endif +} diff --git a/src/Runtime/w_log.c b/src/Runtime/w_log.c new file mode 100644 index 00000000..f4baac3d --- /dev/null +++ b/src/Runtime/w_log.c @@ -0,0 +1,38 @@ +/* @(#)w_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. + * ==================================================== + */ + +/* + * wrapper log(x) + */ + +#include "fdlibm.h" + +#ifdef __STDC__ +double log(double x) /* wrapper pow */ +#else +double log(x) /* wrapper log */ +double x; +#endif +{ +#ifdef _IEEE_LIBM + return __ieee754_log(x); +#else + double z; + z = __ieee754_log(x); + if (_LIB_VERSION == _IEEE_ || isnan(x) || x > 0.0) + return z; + if (x == 0.0) + return __kernel_standard(x, x, 16); /* log(0) */ + else + return __kernel_standard(x, x, 17); /* log(x<0) */ +#endif +} diff --git a/src/Runtime/w_pow.c b/src/Runtime/w_pow.c new file mode 100644 index 00000000..0c05ac84 --- /dev/null +++ b/src/Runtime/w_pow.c @@ -0,0 +1,58 @@ +/* @(#)w_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. + * ==================================================== + */ + +/* + * wrapper pow(x,y) return x**y + */ + +#include "fdlibm.h" + +#ifdef __STDC__ +double pow(double x, double y) /* wrapper pow */ +#else +double pow(x, y) /* wrapper pow */ +double x, y; +#endif +{ +#ifdef _IEEE_LIBM + return __ieee754_pow(x, y); +#else + double z; + z = __ieee754_pow(x, y); + if (_LIB_VERSION == _IEEE_ || isnan(y)) + return z; + if (isnan(x)) { + if (y == 0.0) + return __kernel_standard(x, y, 42); /* pow(NaN,0.0) */ + else + return z; + } + if (x == 0.0) { + if (y == 0.0) + return __kernel_standard(x, y, 20); /* pow(0.0,0.0) */ + if (isfinite(y) && y < 0.0) + return __kernel_standard(x, y, 23); /* pow(0.0,negative) */ + return z; + } + if (!isfinite(z)) { + if (isfinite(x) && isfinite(y)) { + if (isnan(z)) + return __kernel_standard(x, y, 24); /* pow neg**non-int */ + else + return __kernel_standard(x, y, 21); /* pow overflow */ + } + } + if (z == 0.0 && isfinite(x) && isfinite(y)) + return __kernel_standard(x, y, 22); /* pow underflow */ + return z; +#endif +} diff --git a/src/Runtime/wchar_io.c b/src/Runtime/wchar_io.c new file mode 100644 index 00000000..87da4af7 --- /dev/null +++ b/src/Runtime/wchar_io.c @@ -0,0 +1,28 @@ +#include + +int fwide(FILE* stream, int mode) { + int orientation; + int result; + + if ((stream == NULL) || (stream->mode.file_kind == __closed_file)) + return 0; + orientation = stream->mode.file_orientation; + switch (orientation) { + case __unoriented: + if (mode > 0) + stream->mode.file_orientation = __wide_oriented; + else if (mode < 0) + stream->mode.file_orientation = __char_oriented; + result = mode; + break; + + case __wide_oriented: + result = 1; + break; + + case __char_oriented: + result = -1; + break; + } + return result; +} diff --git a/tools/decompctx.py b/tools/decompctx.py index ac1b8147..b127e4f9 100755 --- a/tools/decompctx.py +++ b/tools/decompctx.py @@ -7,7 +7,10 @@ import re script_dir = os.path.dirname(os.path.realpath(__file__)) root_dir = os.path.abspath(os.path.join(script_dir, "..")) src_dir = os.path.join(root_dir, "src") -include_dir = os.path.join(root_dir, "include") +include_dirs = [ + os.path.join(root_dir, "include"), + os.path.join(root_dir, "libc"), +] include_pattern = re.compile(r'^#include\s*[<"](.+?)[>"]$') guard_pattern = re.compile(r'^#ifndef\s+(.*)$') @@ -16,11 +19,12 @@ defines = set() def import_h_file(in_file, r_path) -> str: rel_path = os.path.join(root_dir, r_path, in_file) - inc_path = os.path.join(include_dir, in_file) if os.path.exists(rel_path): return import_c_file(rel_path) - elif os.path.exists(inc_path): - return import_c_file(inc_path) + for include_dir in include_dirs: + inc_path = os.path.join(include_dir, in_file) + if os.path.exists(inc_path): + return import_c_file(inc_path) else: print("Failed to locate", in_file) exit(1)