FloatingPt

This commit is contained in:
Elliot Nunn 2018-07-07 00:03:09 +08:00
parent fa5cf87729
commit d65818e89e
4 changed files with 160 additions and 195 deletions

View File

@ -583,13 +583,12 @@ NCBPointerCacheEnd
VecBaseSystem ds.l 48 ; 360:420 ; when 68k emulator is running, *or* any MTask
VecBaseAlternate ds.l 48 ; 420:4e0 ; native PowerPC in blue task
VecBaseMemRetry ds.l 48 ; 4e0:5a0 ; "FDP" instruction emulation
OldKDP ds.l 1 ; 5a0 ; gotten from the old SPRG0
OtherFreeThing ds.l 1 ; 5a4
FloatEmScratch ds.d 1 ; 5a0:5a8
TopOfFreePages ds.l 1 ; 5a8 ; gotten from the old SPRG0
ds.l 1 ; 5ac
PARPerSegmentPLEPtrs ds.l 4 ; 5b0:5c0 ; for each PAR segment, a ptr into the PAR PageList
PerfMonitorBits ds.l 1 ; 5c0
ds.l 1 ; 5c4
FloatingPtTemp1 ds.l 1 ; 5c0
FloatingPtTemp2 ds.l 1 ; 5c4
SupervisorSegMapPtr ds.l 1 ; 5c8 ; these are for enabling overlay, etc
SupervisorBatMap ds.l 1 ; 5cc

View File

@ -1,176 +0,0 @@
; AUTO-GENERATED SYMBOL LIST
; IMPORTS:
; NKTranslation
; FDP_003c
; FDP_0DA0
; EXPORTS:
; FloatLoadJumpTable (=> NKTranslation)
; FloatSaveJumpTable (=> NKTranslation)
; IntFPUnavail (=> NKInit)
; IntHandleSpecialFPException (=> NKExceptions, NKRTASCalls)
; bugger_around_with_floats (=> NKExceptions, NKRTASCalls)
; major_0x03e18 (=> NKIntHandlers)
### ####### ###### # #
# # # ##### # # # # # # # ## # # ## # #
# ## # # # # # # # ## # # # # # # # # #
# # # # # ##### ###### # # # # # # # # # # # # #
# # # # # # # # # # # # ###### # # ###### # #
# # ## # # # # # # ## # # # # # # # #
### # # # # # ##### # # # # ## # # # ######
align kIntAlign
IntFPUnavail ; OUTSIDE REFERER
mfsprg r1, 0
stw r11, -0x0290(r1)
stw r6, -0x028c(r1)
lwz r6, -0x0004(r1)
lwz r11, 0x0e88(r6)
addi r11, r11, 0x01
stw r11, 0x0e88(r6)
mfspr r11, srr1
ori r11, r11, 0x2000
mtspr srr1, r11
mfmsr r11
ori r11, r11, 0x2000
lwz r6, -0x0014(r1)
mtmsr r11
isync
bl LoadFloatsFromContextBlock
lwz r11, -0x0290(r1)
lwz r6, -0x028c(r1)
mfsprg r1, 2
mtlr r1
mfsprg r1, 1
rfi
dcb.b 32, 0
major_0x03e18 ; OUTSIDE REFERER
rlwinm. r8, r11, 0, 18, 18
bnelr
IntHandleSpecialFPException ; OUTSIDE REFERER
lwz r8, 0x00e4(r6)
rlwinm. r8, r8, 1, 0, 0
mfmsr r8
ori r8, r8, 0x2000
beqlr
mtmsr r8
isync
ori r11, r11, 0x2000
LoadFloatsFromContextBlock ; OUTSIDE REFERER
lfd f31, 0x00e0(r6)
lfd f0, 0x0200(r6)
lfd f1, 0x0208(r6)
lfd f2, 0x0210(r6)
lfd f3, 0x0218(r6)
lfd f4, 0x0220(r6)
lfd f5, 0x0228(r6)
lfd f6, 0x0230(r6)
lfd f7, 0x0238(r6)
mtfsf 0xff, f31
lfd f8, 0x0240(r6)
lfd f9, 0x0248(r6)
lfd f10, 0x0250(r6)
lfd f11, 0x0258(r6)
lfd f12, 0x0260(r6)
lfd f13, 0x0268(r6)
lfd f14, 0x0270(r6)
lfd f15, 0x0278(r6)
lfd f16, 0x0280(r6)
lfd f17, 0x0288(r6)
lfd f18, 0x0290(r6)
lfd f19, 0x0298(r6)
lfd f20, 0x02a0(r6)
lfd f21, 0x02a8(r6)
lfd f22, 0x02b0(r6)
lfd f23, 0x02b8(r6)
lfd f24, 0x02c0(r6)
lfd f25, 0x02c8(r6)
lfd f26, 0x02d0(r6)
lfd f27, 0x02d8(r6)
lfd f28, 0x02e0(r6)
lfd f29, 0x02e8(r6)
lfd f30, 0x02f0(r6)
lfd f31, 0x02f8(r6)
blr
bugger_around_with_floats ; OUTSIDE REFERER
mfmsr r8
ori r8, r8, 0x2000
mtmsr r8
isync
_bclr r11, r11, 18
stfd f0, 0x0200(r6)
stfd f1, 0x0208(r6)
stfd f2, 0x0210(r6)
stfd f3, 0x0218(r6)
stfd f4, 0x0220(r6)
stfd f5, 0x0228(r6)
stfd f6, 0x0230(r6)
stfd f7, 0x0238(r6)
stfd f8, 0x0240(r6)
stfd f9, 0x0248(r6)
stfd f10, 0x0250(r6)
stfd f11, 0x0258(r6)
stfd f12, 0x0260(r6)
stfd f13, 0x0268(r6)
stfd f14, 0x0270(r6)
stfd f15, 0x0278(r6)
stfd f16, 0x0280(r6)
stfd f17, 0x0288(r6)
stfd f18, 0x0290(r6)
stfd f19, 0x0298(r6)
stfd f20, 0x02a0(r6)
stfd f21, 0x02a8(r6)
stfd f22, 0x02b0(r6)
stfd f23, 0x02b8(r6)
mffs f0
stfd f24, 0x02c0(r6)
stfd f25, 0x02c8(r6)
stfd f26, 0x02d0(r6)
stfd f27, 0x02d8(r6)
stfd f28, 0x02e0(r6)
stfd f29, 0x02e8(r6)
stfd f30, 0x02f0(r6)
stfd f31, 0x02f8(r6)
stfd f0, 0x00e0(r6)
blr
; indexed emulation code, mofo
;two instructions per load-store register
macro
CreateFloatJumpTable &opcode, &dest, &highest==31
if &highest > 0
CreateFloatJumpTable &opcode, &dest, highest = (&highest) - 1
endif
&opcode (&highest), -0x2e0(r1)
b &dest
endm
FloatLoadJumpTable
CreateFloatJumpTable lfd, FDP_0da0
FloatSaveJumpTable
CreateFloatJumpTable stfd, FDP_003c

153
NanoKernel/NKFloatingPt.s Normal file
View File

@ -0,0 +1,153 @@
; AUTO-GENERATED SYMBOL LIST
########################################################################
align kIntAlign
IntFPUnavail
; Reload the FPU
mfsprg r1, 0
stw r11, KDP.FloatingPtTemp1(r1)
lwz r11, KDP.NanoKernelInfo + NKNanoKernelInfo.FPUReloadCount(r1)
stw r6, KDP.FloatingPtTemp2(r1)
addi r11, r11, 1
stw r11, KDP.NanoKernelInfo + NKNanoKernelInfo.FPUReloadCount(r1)
mfsrr1 r11
_bset r11, r11, MSR_FPbit
mtsrr1 r11
mfmsr r11 ; need this to access float registers
_bset r11, r11, MSR_FPbit
lwz r6, KDP.PA_ContextBlock(r1)
mtmsr r11
bl LoadFloats
lwz r11, KDP.FloatingPtTemp1(r1)
lwz r6, KDP.FloatingPtTemp2(r1)
mfsprg r1, 2
mtlr r1
mfsprg r1, 1
rfi
########################################################################
major_0x03e18
rlwinm. r8, r11, 0, 18, 18
bnelr
IntHandleSpecialFPException
lwz r8, 0xe4(r6)
rlwinm. r8, r8, 1, 0, 0
mfmsr r8
_bset r8, r8, MSR_FPbit
beqlr
mtmsr r8
_bset r11, r11, MSR_FPbit
########################################################################
LoadFloats
lfd f31, 0xe0(r6)
lfd f0, 0x200(r6)
lfd f1, 0x208(r6)
lfd f2, 0x210(r6)
lfd f3, 0x218(r6)
lfd f4, 0x220(r6)
lfd f5, 0x228(r6)
lfd f6, 0x230(r6)
lfd f7, 0x238(r6)
mtfsf 0xff, f31
lfd f8, 0x240(r6)
lfd f9, 0x248(r6)
lfd f10, 0x250(r6)
lfd f11, 0x258(r6)
lfd f12, 0x260(r6)
lfd f13, 0x268(r6)
lfd f14, 0x270(r6)
lfd f15, 0x278(r6)
lfd f16, 0x280(r6)
lfd f17, 0x288(r6)
lfd f18, 0x290(r6)
lfd f19, 0x298(r6)
lfd f20, 0x2a0(r6)
lfd f21, 0x2a8(r6)
lfd f22, 0x2b0(r6)
lfd f23, 0x2b8(r6)
lfd f24, 0x2c0(r6)
lfd f25, 0x2c8(r6)
lfd f26, 0x2d0(r6)
lfd f27, 0x2d8(r6)
lfd f28, 0x2e0(r6)
lfd f29, 0x2e8(r6)
lfd f30, 0x2f0(r6)
lfd f31, 0x2f8(r6)
blr
########################################################################
DisableFPU
mfmsr r8
_bset r8, r8, MSR_FPbit
mtmsr r8
_bclr r11, r11, MSR_FPbit
stfd f0, 0x200(r6)
stfd f1, 0x208(r6)
stfd f2, 0x210(r6)
stfd f3, 0x218(r6)
stfd f4, 0x220(r6)
stfd f5, 0x228(r6)
stfd f6, 0x230(r6)
stfd f7, 0x238(r6)
stfd f8, 0x240(r6)
stfd f9, 0x248(r6)
stfd f10, 0x250(r6)
stfd f11, 0x258(r6)
stfd f12, 0x260(r6)
stfd f13, 0x268(r6)
stfd f14, 0x270(r6)
stfd f15, 0x278(r6)
stfd f16, 0x280(r6)
stfd f17, 0x288(r6)
stfd f18, 0x290(r6)
stfd f19, 0x298(r6)
stfd f20, 0x2a0(r6)
stfd f21, 0x2a8(r6)
stfd f22, 0x2b0(r6)
stfd f23, 0x2b8(r6)
mffs f0
stfd f24, 0x2c0(r6)
stfd f25, 0x2c8(r6)
stfd f26, 0x2d0(r6)
stfd f27, 0x2d8(r6)
stfd f28, 0x2e0(r6)
stfd f29, 0x2e8(r6)
stfd f30, 0x2f0(r6)
stfd f31, 0x2f8(r6)
stfd f0, 0xe0(r6)
blr
########################################################################
; This is used by MemRetry
MACRO
MakeFloatJumpTable &OPCODE, &DEST, &highest==31
if &highest > 0
MakeFloatJumpTable &OPCODE, &DEST, highest = (&highest) - 1
endif
&OPCODE &highest, KDP.FloatEmScratch(r1)
b &DEST
ENDM
FloatLoadJumpTable
MakeFloatJumpTable lfd, FDP_0da0
FloatSaveJumpTable
MakeFloatJumpTable stfd, FDP_003c

View File

@ -46,10 +46,13 @@ IntDSI
IntAlignment
org 0xC00
FDP
org 0xC38
FDP_003C
org 0xA38
loc_A38
org 0xD50
loc_D50
FDP_0DA0
org 0x13F4
MemRetryDSI
org 0x1498
@ -93,22 +96,8 @@ IntReturn
org 0x23F0
major_0x02ccc
org 0x2500
IntFPUnavail
org 0x2550
major_0x03e18
org 0x2558
IntHandleSpecialFPException
org 0x2574
LoadFloatsFromContextBlock
org 0x2600
bugger_around_with_floats
org 0x269C
FloatTables_0
org 0x289C
include 'NKFloatingPt.s'
include 'NKSoftInt.s'
include 'NKLegacyVM.s'