?? speed2003.s
字號:
AREA |C$$code|, CODE, READONLY
MACRO
MOV_PC_LR
[ THUMBCODE
bx lr
|
mov pc,lr
]
MEND
INDEX EQU 0x31000000
SEGMENT EQU 0x31000004
WORD EQU 0x31000008
; MMU Parameter set
LOCK_BASE_LSB EQU 0x1A
LOCK_VICT_LSB EQU 0x14
P_STATE_LSB EQU 0x0
P_ENTRY_LSB EQU 0x4
VATAG_LSB EQU 0xA
VASIZE_LSB EQU 0x6
VALID_LSB EQU 0x5
DOMAIN8_LSB EQU 0xE
DOMAIN_LSB EQU 0x6
NCACHE_LSB EQU 0x5
NBUFF_LSB EQU 0x4
ACCESS_LSB EQU 0x0
PATAG_LSB EQU 0xA
PASIZE_LSB EQU 0x6
; Cache Parameter set
TAG_LSB EQU 0x8
SEG_LSB EQU 0x5
VLD_LSB EQU 0x4 ; Valid bit
DE_LSB EQU 0x3 ; Dirty Even bit
DO_LSB EQU 0x2 ; Dirty Odd bit
WB_LSB EQU 0x1 ; Write Back bit
WORD_LSB EQU 0x2
LOCK_LSB EQU 0x1A
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Dcache Test ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
EXPORT DCache_Test
DCache_Test
stmfd sp!,{r1-r12}
; MAIN PROGRAM HERE
;///////////////////////////////////////////////////
; Variable initialize
; R4 : Next Pattern [~PAT or PAT]
; R5 : Current Pattern [PAT or ~PAT]
; R6 : INC/DEC Value
; R7 : Index ; 0x0 <-> 0x63
; R8 : Seg ; 0x0 <-> 0x7
; R9 : Word ; 0x0 <-> 0x7
; R10 : PAT
; R11 : ~PAT
; R12 : LOOP4 [ INC(PAT)->INC(~PAT)->DEC(PAT)->DEC(~PAT) ]
; R3 : Pattern Type Select [ 0 - 5 ]
;/////////////////////////
; Program Variables
;/////////////////////////
MOV R3, #0 ; Pattern Select
;/////////////////////////
StartComp
StartPat
MOV R8, #0
CMP R3, #0
LDREQ R10, =0x00000000
LDREQ R11, =0xFFFFFFFF
CMP R3, #1
LDREQ R10, =0x0000FFFF
LDREQ R11, =0xFFFF0000
CMP R3, #2
LDREQ R10, =0x00FF00FF
LDREQ R11, =0xFF00FF00
CMP R3, #3
LDREQ R10, =0x0F0F0F0F
LDREQ R11, =0xF0F0F0F0
CMP R3, #4
LDREQ R10, =0x33333333
LDREQ R11, =0xCCCCCCCC
CMP R3, #5
LDREQ R10, =0xAAAAAAAA
LDREQ R11, =0x55555555
;//////////////////////////
; PRE WRITE RAM DATA
;//////////////////////////
StartSeg
MOV R12, #0
MOV R7, #0
PStartIndex
MOV R9, #0
MOV R5, R10 ; Pattern Set
PStartWord
;///////////////////////////////////////////////////
; Load DCache victim and lockdown base
MOV R0, R7, LSL #LOCK_LSB
MCR p15,0,r0,c9,c0,0 ; D
;MCR p15,0,r0,c9,c0,1 ; I
; Do DCache CAM write to
MOV R1, R5, LSL #8 ; CAM Tag
ORR R1, R1, R7 ; Index ORed
MOV R0, R1, LSL #TAG_LSB
ORR R0, R0, R8,LSL #SEG_LSB ; Segment
ORR R0, R0, #0x1E
MCR p15,2,R0,c15,c6,6 ; D CAM write
;MCR p15,2,R0,c15,c5,6 ; I CAM write
; Reload DCache lock-down pointer because it will have incremented
MOV R0, R7, LSL #LOCK_LSB ; Index
MCR p15,0,R0,c9,c0,0 ; D Write victim & lockdown
;MCR p15,0,R0,c9,c0,1 ; I Write victim & lockdown
; Do DCache RAM write
MOV R0, R5 ; RAM data
MCR p15,3,R0,c15,c2,0 ; Write RAM data to c15.C.D
;MCR p15,3,R0,c15,c1,0 ; Write RAM data to c15.C.I
MOV R0, R8, LSL #SEG_LSB ;Segment
ORR R0, R0, R9,LSL #WORD_LSB ; Word
MCR p15,2,R0,c15,c10,6 ; RAM write from c15.C.D
;MCR p15,2,R0,c15,c9,6 ; RAM write from c15.C.D
; Variable Update
CMP R9, #7
BEQ PEndWord
ADD R9, R9, #1 ; Word ++
B PStartWord
PEndWord
CMP R7, #63
BEQ PEndIndex
ADD R7, R7, #1 ; Index ++
B PStartIndex
PEndIndex
;////////////////////////////////
; MAIN READ-COMPARE-WRITE RAM DATA
;////////////////////////////////
StartLoop4
CMP R12, #0
LDREQ R6, =0x00000001
MOVEQ R7, #0
CMP R12, #1
LDREQ R6, =0x00000001
MOVEQ R7, #0
CMP R12, #2
LDREQ R6, =0xFFFFFFFF
MOVEQ R7, #63
CMP R12, #3
LDREQ R6, =0xFFFFFFFF
MOVEQ R7, #63
StartIndex
CMP R12, #0
MOVEQ R5, R10
MOVEQ R4, R11
MOVEQ R9, #0
CMP R12, #1
MOVEQ R5, R11
MOVEQ R4, R10
MOVEQ R9, #0
CMP R12, #2
MOVEQ R5, R10
MOVEQ R4, R11
MOVEQ R9, #7
CMP R12, #3
MOVEQ R5, R11
MOVEQ R4, R10
MOVEQ R9, #7
StartWord
;///////////////////////////////////////////////////
; Load DCache victim and lockdown base
MOV R0, R7, LSL #LOCK_LSB ; Index
MCR p15,0,r0,c9,c0,0 ; D Write victim & lockdown
;MCR p15,0,r0,c9,c0,1 ; I Write victim & lockdown
; Do DCache CAM write to
MOV R1, R5, LSL #8 ; CAM Tag
ORR R1, R1, R7 ; Index ORed
MOV R0, R1, LSL #TAG_LSB
ORR R0, R0, R8,LSL #SEG_LSB ; Segment
ORR R0, R0, #0x1E
MCR p15,2,R0,c15,c6,6 ; D CAM write
;MCR p15,2,R0,c15,c5,6 ; I CAM write
; Reload DCache lock-down pointer because it will have incremented
MOV R0, R7, LSL #LOCK_LSB ; Index
MCR p15,0,R0,c9,c0,0 ; D Write victim & lockdown
;MCR p15,0,R0,c9,c0,1 ; I Write victim & lockdown
; Clear c15.C.D to prove that data comes back from DCache
MOV R0, #0
MCR p15,3,R0,c15,c2,0 ; Write c15.C.D
;MCR p15,3,R0,c15,c1,0 ; Write c15.C.I
; Do a CAM match, RAM read to c15.C.[D/I]
MOV R1, R5, LSL #8 ; CAM Tag
ORR R1, R1, R7 ; Index ORed
MOV R0, R1, LSL #TAG_LSB ; TAG
ORR R0,R0,R8,LSL #SEG_LSB ; Segment
ORR R0,R0,R9, LSL #WORD_LSB ; Word
MCR p15,2,R0,c15,c6,5 ; CAM match, D. RAM read
;MCR p15,2,R0,c15,c5,5 ; CAM match, I. RAM read
; Read c15.C.D and compare with expected data.
; Note that the top 2 bits of the RAM Data returned from the CAM match
; give the Hot and Miss information [31:30] = [Miss,Hit]
MRC p15,3,R0,c15,c2,0 ; Read c15.C.D
;MRC p15,3,R0,c15,c1,0 ; Read c15.C.I
;MOV R2, #0 ; Var. Init.
;LDR R3, =0x08000FF0 ; BANK2 Addr.
;ORR R2,R2,R7, LSL #16 ; Index
;ORR R2,R2,R8, LSL #8 ; Seg
;ORR R2,R2,R9, LSL #0 ; Word
;STR R2, [R3] ; Monitor Out
; Check the RAM data --------------
MOV R0, R0, LSL #2 ; Remove bits [31:30]
MOV R1, R5 ; Expected data
MOV R1, R1, LSL #2 ; Remove bits [31:30]
CMP R0, R1
BNE ERROR
; Reload DCache lock-down pointer because it will have incremented
MOV R0, R7, LSL #LOCK_LSB ; Index
MCR p15,0,R0,c9,c0,0 ; D Write victim & lockdown
;MCR p15,0,R0,c9,c0,1 ; I Write victim & lockdown
; Do DCache RAM write --------------
MOV R0, R4 ; RAM data (R4: Next PAT)
MCR p15,3,R0,c15,c2,0 ; Write RAM data to c15.C.D
;MCR p15,3,R0,c15,c1,0 ; Write RAM data to c15.C.I
MOV R0, R8, LSL #SEG_LSB ;Segment
ORR R0, R0, R9,LSL #WORD_LSB ; Word
MCR p15,2,R0,c15,c10,6 ; RAM write from c15.C.D
;MCR p15,2,R0,c15,c9,6 ; RAM write from c15.C.D
;--------------------
; Variables Update
;--------------------
CMP R12, #0
CMPEQ R9, #7
BEQ EndWord
CMP R12, #1
CMPEQ R9, #7
BEQ EndWord
CMP R12, #2
CMPEQ R9, #0
BEQ EndWord
CMP R12, #3
CMPEQ R9, #0
BEQ EndWord
ADD R9, R9, R6 ; Word ++/-- [0<->7]
B StartWord
EndWord
CMP R12, #0
CMPEQ R7, #63
BEQ EndIndex
CMP R12, #1
CMPEQ R7, #63
BEQ EndIndex
CMP R12, #2
CMPEQ R7, #0
BEQ EndIndex
CMP R12, #3
CMPEQ R7, #0
BEQ EndIndex
ADD R7, R7, R6 ; Index ++/-- [0<->63]
B StartIndex
EndIndex
CMP R12, #3
BEQ EndLoop4
ADD R12, R12, #1 ; LOOP4 ++ [0->3]
B StartLoop4
EndLoop4
CMP R8, #7
BEQ EndSeg
ADD R8, R8, #1 ; Seg ++ [0->7]
B StartSeg
EndSeg
CMP R3, #5
BEQ EndPat
ADD R3, R3, #1 ; Pattern ++ [0->5]
B StartPat
EndPat
EndComp
;Caching_Test_End
MOV R0, #1
B EndFunc
ERROR MOV R0, #0
ldr r1,=INDEX
mov r2,r7
str r2,[r1]
ldr r1,=SEGMENT
mov r2,r8
str r2,[r1]
ldr r1,=WORD
mov r2,r9
str r2,[r1]
EndFunc
ldmfd sp!,{r1-r12}
mov pc,lr
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Icache Test ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
EXPORT ICache_Test
ICache_Test
stmfd sp!,{r1-r12}
; MAIN PROGRAM HERE
;///////////////////////////////////////////////////
; Variable initialize
; R4 : Next Pattern [~PAT or PAT]
; R5 : Current Pattern [PAT or ~PAT]
; R6 : INC/DEC Value
; R7 : Index ; 0x0 <-> 0x63
; R8 : Seg ; 0x0 <-> 0x7
; R9 : Word ; 0x0 <-> 0x7
; R10 : PAT
; R11 : ~PAT
; R12 : LOOP4 [ INC(PAT)->INC(~PAT)->DEC(PAT)->DEC(~PAT) ]
; R3 : Pattern Type Select [ 0 - 5 ]
;/////////////////////////
; Program Variables
;/////////////////////////
MOV R3, #0 ; Pattern Select
;/////////////////////////
StartComp1
StartPat1
MOV R8, #0
CMP R3, #0
LDREQ R10, =0x00000000
LDREQ R11, =0xFFFFFFFF
CMP R3, #1
LDREQ R10, =0x0000FFFF
LDREQ R11, =0xFFFF0000
CMP R3, #2
LDREQ R10, =0x00FF00FF
LDREQ R11, =0xFF00FF00
CMP R3, #3
LDREQ R10, =0x0F0F0F0F
LDREQ R11, =0xF0F0F0F0
CMP R3, #4
LDREQ R10, =0x33333333
LDREQ R11, =0xCCCCCCCC
CMP R3, #5
LDREQ R10, =0xAAAAAAAA
LDREQ R11, =0x55555555
;//////////////////////////
; PRE WRITE RAM DATA
;//////////////////////////
StartSeg1
MOV R12, #0
MOV R7, #0
PStartIndex1
MOV R9, #0
MOV R5, R10 ; Pattern Set
PStartWord1
;///////////////////////////////////////////////////
; Load DCache victim and lockdown base
MOV R0, R7, LSL #LOCK_LSB
;MCR p15,0,r0,c9,c0,0 ; D
MCR p15,0,r0,c9,c0,1 ; I
; Do DCache CAM write to
MOV R1, R5, LSL #8 ; CAM Tag
ORR R1, R1, R7 ; Index ORed
MOV R0, R1, LSL #TAG_LSB
ORR R0, R0, R8,LSL #SEG_LSB ; Segment
ORR R0, R0, #0x1E
;MCR p15,2,R0,c15,c6,6 ; D CAM write
MCR p15,2,R0,c15,c5,6 ; I CAM write
; Reload DCache lock-down pointer because it will have incremented
MOV R0, R7, LSL #LOCK_LSB ; Index
;MCR p15,0,R0,c9,c0,0 ; D Write victim & lockdown
MCR p15,0,R0,c9,c0,1 ; I Write victim & lockdown
; Do DCache RAM write
MOV R0, R5 ; RAM data
;MCR p15,3,R0,c15,c2,0 ; Write RAM data to c15.C.D
MCR p15,3,R0,c15,c1,0 ; Write RAM data to c15.C.I
MOV R0, R8, LSL #SEG_LSB ;Segment
ORR R0, R0, R9,LSL #WORD_LSB ; Word
;MCR p15,2,R0,c15,c10,6 ; RAM write from c15.C.D
MCR p15,2,R0,c15,c9,6 ; RAM write from c15.C.D
; Variable Update
CMP R9, #7
BEQ PEndWord1
ADD R9, R9, #1 ; Word ++
B PStartWord1
PEndWord1
CMP R7, #63
BEQ PEndIndex1
ADD R7, R7, #1 ; Index ++
B PStartIndex1
PEndIndex1
;////////////////////////////////
; MAIN READ-COMPARE-WRITE RAM DATA
;////////////////////////////////
StartLoop41
CMP R12, #0
LDREQ R6, =0x00000001
MOVEQ R7, #0
CMP R12, #1
LDREQ R6, =0x00000001
MOVEQ R7, #0
CMP R12, #2
LDREQ R6, =0xFFFFFFFF
MOVEQ R7, #63
CMP R12, #3
LDREQ R6, =0xFFFFFFFF
MOVEQ R7, #63
StartIndex1
CMP R12, #0
MOVEQ R5, R10
MOVEQ R4, R11
MOVEQ R9, #0
CMP R12, #1
MOVEQ R5, R11
MOVEQ R4, R10
MOVEQ R9, #0
CMP R12, #2
MOVEQ R5, R10
MOVEQ R4, R11
MOVEQ R9, #7
CMP R12, #3
MOVEQ R5, R11
MOVEQ R4, R10
MOVEQ R9, #7
StartWord1
;///////////////////////////////////////////////////
; Load DCache victim and lockdown base
MOV R0, R7, LSL #LOCK_LSB ; Index
;MCR p15,0,r0,c9,c0,0 ; D Write victim & lockdown
MCR p15,0,r0,c9,c0,1 ; I Write victim & lockdown
; Do DCache CAM write to
MOV R1, R5, LSL #8 ; CAM Tag
ORR R1, R1, R7 ; Index ORed
MOV R0, R1, LSL #TAG_LSB
ORR R0, R0, R8,LSL #SEG_LSB ; Segment
ORR R0, R0, #0x1E
;MCR p15,2,R0,c15,c6,6 ; D CAM write
MCR p15,2,R0,c15,c5,6 ; I CAM write
; Reload DCache lock-down pointer because it will have incremented
MOV R0, R7, LSL #LOCK_LSB ; Index
;MCR p15,0,R0,c9,c0,0 ; D Write victim & lockdown
MCR p15,0,R0,c9,c0,1 ; I Write victim & lockdown
; Clear c15.C.D to prove that data comes back from DCache
MOV R0, #0
;MCR p15,3,R0,c15,c2,0 ; Write c15.C.D
MCR p15,3,R0,c15,c1,0 ; Write c15.C.I
; Do a CAM match, RAM read to c15.C.[D/I]
MOV R1, R5, LSL #8 ; CAM Tag
ORR R1, R1, R7 ; Index ORed
MOV R0, R1, LSL #TAG_LSB ; TAG
ORR R0,R0,R8,LSL #SEG_LSB ; Segment
ORR R0,R0,R9, LSL #WORD_LSB ; Word
;MCR p15,2,R0,c15,c6,5 ; CAM match, D. RAM read
MCR p15,2,R0,c15,c5,5 ; CAM match, I. RAM read
; Read c15.C.D and compare with expected data.
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -