📄 hxfprofilerarm.s
字号:
;/* ************************************************************************ *\
;** INTEL Corporation Proprietary Information
;**
;** This listing is supplied under the terms of a license
;** agreement with INTEL Corporation and may not be copied
;** nor disclosed except in accordance with the terms of
;** that agreement.
;**
;** Copyright (c) 2003 Intel Corporation.
;** All Rights Reserved.
;**
;** ************************************************************************ **
;** FILE: HXFUtils.s
;** DESCRIPTION: Optimized Vertex lighting routines.
;**
;** AUTHOR: Cian Montgomery
;** CREATED: July 31, 2003
;**
; * $Date: 7/19/04 5:13p $ $Revision: 6 $
; * $Log: /Intel_Development/Drivers/Marathon/WinCE42/opengles/HXFProfilerARM.s $
; *
; * 6 7/19/04 5:13p Cmdoan
; * changed ARM to not use delta calculations (always resets PMU), and
; * added I64 to %u output for large numbers.
; *
; * 5 1/30/04 10:37a Clmontgo
; *
; * 4 1/26/04 10:42p Clmontgo
; * FIX Profiler enable stuff
; *
; * 3 1/26/04 9:33p Clmontgo
; *
; * 2 1/26/04 6:46p Clmontgo
; * Added Profiler, Converted Lighting procs to Fixed point, Worked on
; * screen rotation code, Added wMMX debug Macros to Lighting.
; *
; * 1 1/24/04 11:50p Clmontgo
; *
; * 2 1/24/04 7:49p Clmontgo
; *
; * 1 1/22/04 11:58a Clmontgo
;
; 7 12/21/03 12:59p Clmontgo
;
; 6 12/17/03 9:22a Clmontgo
; Added Version ID and log to file headers
;\* ************************************************************************ */
INCLUDE HXFState.inc ; Definitions of the HXFState Structure
IF :DEF:HXF_PROFILE
;** ************************************************************************ **
;** CONSTANTS
;** ************************************************************************ **
ACCUMULATOR_SIZE EQU 48
ACCUMULATOR_COUNT_OFFSET_L EQU 0
ACCUMULATOR_COUNT_OFFSET_H EQU 4
ACCUMULATOR_CYCLES_OFFSET_L EQU 8
ACCUMULATOR_CYCLES_OFFSET_H EQU 12
ACCUMULATOR_EVENT_0_OFFSET_L EQU 16
ACCUMULATOR_EVENT_0_OFFSET_H EQU 20
ACCUMULATOR_EVENT_1_OFFSET_L EQU 24
ACCUMULATOR_EVENT_1_OFFSET_H EQU 28
ACCUMULATOR_EVENT_2_OFFSET_L EQU 32
ACCUMULATOR_EVENT_2_OFFSET_H EQU 36
ACCUMULATOR_EVENT_3_OFFSET_L EQU 40
ACCUMULATOR_EVENT_3_OFFSET_H EQU 44
;** ************************************************************************ **
;** EXPORTS
;** ************************************************************************ **
EXPORT |HXFSetupPMU|
EXPORT |HXFProfilerStart|
EXPORT |HXFProfilerStop|
EXPORT |HXFProfilerTransition|
;** ************************************************************************ **
;** IMPORTS
;** ************************************************************************ **
IMPORT |g_Accumulators|
IMPORT |g_AccumulatorStartValue|
IMPORT |g_CurrentAccumulator|
;** ************************************************************************ **
;** VARIABLES
;** ************************************************************************ **
;** ************************************************************************ **
;** MAROS
;** ************************************************************************ **
;** ************************************************************************ **
;** FUNCTIONS
;** ************************************************************************ **
AREA HXFPROFILE, CODE, READONLY
;** ************************************************************************ **
; Name: HXFSetupAccumulator
; Description:
; ---------------------------------------------------------------------- --
; Register Map -
; ---------------------------------------------------------------------- --
; r0 = r4 = r8 = r12 =
; r1 = r5 = r9 = r13 = sp
; r2 = r6 = r10 = r14 = lr (return)
; r3 = r7 = r11 = r15 = pc
; ---------------------------------------------------------------------- --
; wr0 = wr4 = wr8 = wr12 =
; wr1 = wr5 = wr9 = wr13 =
; wr2 = wr6 = wr10 = wr14 =
; wr3 = wr7 = wr11 = wr15 =
; wcgr0 = wcgr1 = wcgr2 = wcgr3 =
; ---------------------------------------------------------------------- --
; Prototype in C: void HXFSetupPMU(HUINT32*)
;** ************************************************************************ **
|HXFSetupPMU| PROC
; Disable PMU
mov r3, #0x00
mcr p14, 0, r3, c0, c1, 0
; reset all events
eor r2, r2, r2 ; clear r2
; Setup PMNC 0
ldr r1, [r0, #4] ; Load value
and r1, r1, #0xFF ; Mask off important part
orr r2, r2, r1 ; Mask in to our config reg
; Setup PMNC 1
ldr r1, [r0, #8]
and r1, r1, #0xFF ; Mask off important part
orr r2, r2, r1, LSL #8 ; Mask in to our config reg
; Setup PMNC 2
ldr r1, [r0, #12]
and r1, r1, #0xFF ; Mask off important part
orr r2, r2, r1, LSL #16 ; Mask in to our config reg
; Setup PMNC 3
ldr r1, [r0, #16]
and r1, r1, #0xFF ; Mask off important part
orr r2, r2, r1, LSL #24 ; Mask in to our config reg
mcr p14, 0, r2, c8, c1, 0 ; set the event sel register
; reset and enable counters
mov r3, #0x07
mcr p14, 0, r3, c0, c1, 0
mov pc, lr
ENDP
;** ************************************************************************ **
;** ************************************************************************ **
; Name: HXFStartAccumulator
; Description:
; ---------------------------------------------------------------------- --
; Register Map -
; ---------------------------------------------------------------------- --
; r0 = r4 = r8 = r12 =
; r1 = r5 = r9 = r13 = sp
; r2 = r6 = r10 = r14 = lr (return)
; r3 = r7 = r11 = r15 = pc
; ---------------------------------------------------------------------- --
; wr0 = wr4 = wr8 = wr12 =
; wr1 = wr5 = wr9 = wr13 =
; wr2 = wr6 = wr10 = wr14 =
; wr3 = wr7 = wr11 = wr15 =
; wcgr0 = wcgr1 = wcgr2 = wcgr3 =
; ---------------------------------------------------------------------- --
; Prototype in C: void HXFProfilerStart(HUINT32);
;** ************************************************************************ **
|HXFProfilerStart| PROC
; Stop the PMU
; mov r0, #0x00
; mcr p14, 0, r0, c0, c1, 0
ldr r1, =g_CurrentAccumulator
str r0, [r1]
ldr r0, =g_AccumulatorStartValue
mov r1, #0
str r1, [r0, #ACCUMULATOR_COUNT_OFFSET_L]
str r1, [r0, #ACCUMULATOR_COUNT_OFFSET_H]
; mrc p14, 0, r1, c1, c1, 0 ; Get Cycle Counter
mov r1, #0
str r1, [r0, #ACCUMULATOR_CYCLES_OFFSET_L]
str r1, [r0, #ACCUMULATOR_CYCLES_OFFSET_H]
; mrc p14, 0, r1, c0, c2, 0 ; Get PMNC0
mov r1, #0
str r1, [r0, #ACCUMULATOR_EVENT_0_OFFSET_L]
str r1, [r0, #ACCUMULATOR_EVENT_0_OFFSET_H]
; mrc p14, 0, r1, c1, c2, 0 ; Get PMNC1
mov r1, #0
str r1, [r0, #ACCUMULATOR_EVENT_1_OFFSET_L]
str r1, [r0, #ACCUMULATOR_EVENT_1_OFFSET_H]
; mrc p14, 0, r1, c2, c2, 0 ; Get PMNC2
mov r1, #0
str r1, [r0, #ACCUMULATOR_EVENT_2_OFFSET_L]
str r1, [r0, #ACCUMULATOR_EVENT_2_OFFSET_H]
; mrc p14, 0, r1, c3, c2, 0 ; Get PMNC3
mov r1, #0
str r1, [r0, #ACCUMULATOR_EVENT_3_OFFSET_L]
str r1, [r0, #ACCUMULATOR_EVENT_3_OFFSET_H]
; Restart the PMU
; mov r0, #0x01
; mcr p14, 0, r0, c0, c1, 0
; reset and enable counters
mov r3, #0x07
mcr p14, 0, r3, c0, c1, 0
mov pc, lr
ENDP
;** ************************************************************************ **
;** ************************************************************************ **
; Name: HXFProfilerStop
; Description:
; ---------------------------------------------------------------------- --
; Register Map -
; ---------------------------------------------------------------------- --
; r0 = AccId r4 = r8 = r12 =
; r1 = r5 = r9 = r13 = sp
; r2 = r6 = r10 = r14 = lr (return)
; r3 = r7 = r11 = r15 = pc
; ---------------------------------------------------------------------- --
; wr0 = wr4 = wr8 = wr12 =
; wr1 = wr5 = wr9 = wr13 =
; wr2 = wr6 = wr10 = wr14 =
; wr3 = wr7 = wr11 = wr15 =
; wcgr0 = wcgr1 = wcgr2 = wcgr3 =
; ---------------------------------------------------------------------- --
; Prototype in C: void HXFProfilerStop(HUINT32)
;** ************************************************************************ **
|HXFProfilerStop| PROC
; Stop the PMU
mov r1, #0x00
mcr p14, 0, r1, c0, c1, 0
ldr r1, =g_CurrentAccumulator
str r0, [r1]
ldr r1, =g_Accumulators
mov r12, #ACCUMULATOR_SIZE
mul r2, r0, r12
add r0, r1, r2 ; Compute offset to current accumulator
ldr r2, [r0, #ACCUMULATOR_COUNT_OFFSET_L]
add r2, r2, #1
str r2, [r0, #ACCUMULATOR_COUNT_OFFSET_L]
ldr r2, [r0, #ACCUMULATOR_CYCLES_OFFSET_L]
mrc p14, 0, r12, c1, c1, 0 ; Get Cycle Counter
adds r2, r2, r12
str r2, [r0, #ACCUMULATOR_CYCLES_OFFSET_L]
ldrcs r2, [r0, #ACCUMULATOR_CYCLES_OFFSET_H]
adccs r2, r2, #0
strcs r2, [r0, #ACCUMULATOR_CYCLES_OFFSET_H]
ldr r2, [r0, #ACCUMULATOR_EVENT_0_OFFSET_L]
mrc p14, 0, r12, c0, c2, 0 ; Get PMNC0
adds r2, r2, r12
str r2, [r0, #ACCUMULATOR_EVENT_0_OFFSET_L]
ldrcs r2, [r0, #ACCUMULATOR_EVENT_0_OFFSET_H]
adccs r2, r2, #0
strcs r2, [r0, #ACCUMULATOR_EVENT_0_OFFSET_H]
ldr r2, [r0, #ACCUMULATOR_EVENT_1_OFFSET_L]
mrc p14, 0, r12, c1, c2, 0 ; Get PMNC1
adds r2, r2, r12
str r2, [r0, #ACCUMULATOR_EVENT_1_OFFSET_L]
ldrcs r2, [r0, #ACCUMULATOR_EVENT_1_OFFSET_H]
adccs r2, r2, #0
strcs r2, [r0, #ACCUMULATOR_EVENT_1_OFFSET_H]
ldr r2, [r0, #ACCUMULATOR_EVENT_2_OFFSET_L]
mrc p14, 0, r12, c2, c2, 0 ; Get PMNC2
adds r2, r2, r12
str r2, [r0, #ACCUMULATOR_EVENT_2_OFFSET_L]
ldrcs r2, [r0, #ACCUMULATOR_EVENT_2_OFFSET_H]
adccs r2, r2, #0
strcs r2, [r0, #ACCUMULATOR_EVENT_2_OFFSET_H]
ldr r2, [r0, #ACCUMULATOR_EVENT_3_OFFSET_L]
mrc p14, 0, r12, c3, c2, 0 ; Get PMNC3
adds r2, r2, r12
str r2, [r0, #ACCUMULATOR_EVENT_3_OFFSET_L]
ldrcs r2, [r0, #ACCUMULATOR_EVENT_3_OFFSET_H]
adccs r2, r2, #0
strcs r2, [r0, #ACCUMULATOR_EVENT_3_OFFSET_H]
mov pc, lr
ENDP
;** ************************************************************************ **
;** ************************************************************************ **
; Name: HXFProfilerTransition
; Description:
; ---------------------------------------------------------------------- --
; Register Map -
; ---------------------------------------------------------------------- --
; r0 = AccId r4 = r8 = r12 =
; r1 = r5 = r9 = r13 = sp
; r2 = r6 = r10 = r14 = lr (return)
; r3 = r7 = r11 = r15 = pc
; ---------------------------------------------------------------------- --
; wr0 = wr4 = wr8 = wr12 =
; wr1 = wr5 = wr9 = wr13 =
; wr2 = wr6 = wr10 = wr14 =
; wr3 = wr7 = wr11 = wr15 =
; wcgr0 = wcgr1 = wcgr2 = wcgr3 =
; ---------------------------------------------------------------------- --
; Prototype in C: void HXFProfilerTransition(HUINT32)
;** ************************************************************************ **
|HXFProfilerTransition| PROC
; Stop the PMU
mov r1, #0x00
mcr p14, 0, r1, c0, c1, 0
ldr r1, =g_CurrentAccumulator
ldr r2, [r1] ; load current Accumulator
str r0, [r1] ; Store New Accumulator
ldr r1, =g_Accumulators
mov r12, #ACCUMULATOR_SIZE
mul r0, r2, r12
add r0, r1, r0 ; Compute offset to current accumulator
ldr r2, [r0, #ACCUMULATOR_COUNT_OFFSET_L]
add r2, r2, #1
str r2, [r0, #ACCUMULATOR_COUNT_OFFSET_L]
ldr r2, [r0, #ACCUMULATOR_CYCLES_OFFSET_L]
mrc p14, 0, r12, c1, c1, 0 ; Get Cycle Counter
adds r2, r2, r12
str r2, [r0, #ACCUMULATOR_CYCLES_OFFSET_L]
ldrcs r2, [r0, #ACCUMULATOR_CYCLES_OFFSET_H]
adccs r2, r2, #0
strcs r2, [r0, #ACCUMULATOR_CYCLES_OFFSET_H]
ldr r2, [r0, #ACCUMULATOR_EVENT_0_OFFSET_L]
mrc p14, 0, r12, c0, c2, 0 ; Get PMNC0
adds r2, r2, r12
str r2, [r0, #ACCUMULATOR_EVENT_0_OFFSET_L]
ldrcs r2, [r0, #ACCUMULATOR_EVENT_0_OFFSET_H]
adccs r2, r2, #0
strcs r2, [r0, #ACCUMULATOR_EVENT_0_OFFSET_H]
ldr r2, [r0, #ACCUMULATOR_EVENT_1_OFFSET_L]
mrc p14, 0, r12, c1, c2, 0 ; Get PMNC1
adds r2, r2, r12
str r2, [r0, #ACCUMULATOR_EVENT_1_OFFSET_L]
ldrcs r2, [r0, #ACCUMULATOR_EVENT_1_OFFSET_H]
adccs r2, r2, #0
strcs r2, [r0, #ACCUMULATOR_EVENT_1_OFFSET_H]
ldr r2, [r0, #ACCUMULATOR_EVENT_2_OFFSET_L]
mrc p14, 0, r12, c2, c2, 0 ; Get PMNC2
adds r2, r2, r12
str r2, [r0, #ACCUMULATOR_EVENT_2_OFFSET_L]
ldrcs r2, [r0, #ACCUMULATOR_EVENT_2_OFFSET_H]
adccs r2, r2, #0
strcs r2, [r0, #ACCUMULATOR_EVENT_2_OFFSET_H]
ldr r2, [r0, #ACCUMULATOR_EVENT_3_OFFSET_L]
mrc p14, 0, r12, c3, c2, 0 ; Get PMNC3
adds r2, r2, r12
str r2, [r0, #ACCUMULATOR_EVENT_3_OFFSET_L]
ldrcs r2, [r0, #ACCUMULATOR_EVENT_3_OFFSET_H]
adccs r2, r2, #0
strcs r2, [r0, #ACCUMULATOR_EVENT_3_OFFSET_H]
; Restart the PMU
mov r0, #0x01
mcr p14, 0, r0, c0, c1, 0
; reset and enable counters
mov r3, #0x07
mcr p14, 0, r3, c0, c1, 0
mov pc, lr
ENDP
;** ************************************************************************ **
ENDIF ; :DEF:HXF_PROFILE
;** ************************************************************************ **
END
;/* ************************************************************************ *\
;** ************************************************************************ **
;** EOF
;** ************************************************************************ **
;\* ************************************************************************ */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -