From fb7a076fa148e551c63b63a43525257020c660b4 Mon Sep 17 00:00:00 2001 From: Kevin Bracey <kbracey@gitlab.riscosopen.org> Date: Tue, 23 Jan 2001 10:31:33 +0000 Subject: [PATCH] Fix to ARM9 clean loop. --- s/ARMops | 29 ++++++++++++++--------------- 1 file changed, 14 insertions(+), 15 deletions(-) diff --git a/s/ARMops b/s/ARMops index 70b5dc08..27a8178d 100644 --- a/s/ARMops +++ b/s/ARMops @@ -143,9 +143,9 @@ FindARMloop TEQ v4, #ARMunk ; Modify deduced flags ADRNEL lr, KnownCPUFlags ADDNE lr, lr, v4, LSL #3 - LDMNEIA lr, {a1, a2} - ORRNE v5, v5, a1 - BICNE v5, v5, a2 + LDMNEIA lr, {a2, a3} + ORRNE v5, v5, a2 + BICNE v5, v5, a3 STR v5, [v6, #ProcessorFlags] @@ -306,7 +306,6 @@ Analyse_WB_CR7_LDa_L1 LDRB a2, [a1, #DCache_LineLen] SUB a4, a4, #1 MUL a4, a2, a4 - SUB a4, a4, a3 STR a4, [a1, #DCache_IndexSegStart] MOV a2, #32*1024 ; arbitrary-ish @@ -661,19 +660,19 @@ Cache_CleanAll_WB_CR7_LDa ROUT ; ; DCache_LineLen = 32 (32 byte cache line, segment field starts at bit 5) ; DCache_IndexBit = &04000000 (index field starts at bit 26) -; DCache_IndexSegStart = &FC0000E0 (start at index=63, segment = 7) +; DCache_IndexSegStart = &000000E0 (start at index=0, segment = 7) ; Push "a2, ip" MOV ip, #0 LDRB a1, [ip, #DCache_LineLen] ; segment field starts at this bit LDR a2, [ip, #DCache_IndexBit] ; index field starts at this bit - LDR ip, [ip, #DCache_IndexSegStart] ; starting value, with index and seg each at max + LDR ip, [ip, #DCache_IndexSegStart] ; starting value, with index at min, seg at max 10 MCR p15, 0, ip, c7, c10, 2 ; clean DCache entry by segment/index - SUBS ip, ip, a2 ; next index, counting down, CC if wrapped back to max - BCS %BT10 - SUBS ip, ip, a1 ; next segment, counting down, CC if done - BCS %BT10 + ADDS ip, ip, a2 ; next index, counting up, CS if wrapped back to 0 + BCC %BT10 + SUBS ip, ip, a1 ; next segment, counting down, CC if wrapped back to max + BCS %BT10 ; if segment wrapped, then we've finished MOV ip, #0 MCR p15, 0, ip, c7, c10, 4 ; drain WBuffer Pull "a2, ip" @@ -688,13 +687,13 @@ Cache_CleanInvalidateAll_WB_CR7_LDa ROUT MOV ip, #0 LDRB a1, [ip, #DCache_LineLen] ; segment field starts at this bit LDR a2, [ip, #DCache_IndexBit] ; index field starts at this bit - LDR ip, [ip, #DCache_IndexSegStart] ; starting value, with index and seg each at max + LDR ip, [ip, #DCache_IndexSegStart] ; starting value, with index at min, seg at max 10 MCR p15, 0, ip, c7, c14, 2 ; clean&invalidate DCache entry by segment/index - SUBS ip, ip, a2 ; next index, counting down, CC if wrapped back to max - BCS %BT10 - SUBS ip, ip, a1 ; next segment, counting down, CC if done - BCS %BT10 + ADDS ip, ip, a2 ; next index, counting up, CS if wrapped back to 0 + BCC %BT10 + SUBS ip, ip, a1 ; next segment, counting down, CC if wrapped back to max + BCS %BT10 ; if segment wrapped, then we've finished MOV ip, #0 MCR p15, 0, ip, c7, c10, 4 ; drain WBuffer MCR p15, 0, ip, c7, c5, 0 ; invalidate ICache -- GitLab