hppa_b.s
来自「system C源码 一种替代verilog的语言」· S 代码 · 共 204 行
S
204 行
; QuickThreads -- Threads-building toolkit.; Copyright (c) 1993 by David Keppel; Permission to use, copy, modify and distribute this software and; its documentation for any purpose and without fee is hereby; granted, provided that the above copyright notice and this notice; appear in all copies. This software is provided as a; proof-of-concept and for demonstration purposes; there is no; representation about the suitability of this software for any; purpose.; This file (pa-risc_b.s) is part of the port of QuickThreads for; PA-RISC 1.1 architecture. It contains assembly-level support for; raw processor performance measurement. It was written in 1994 by; Uwe Reder (`uereder@cip.informatik.uni-erlangen.de'); for the Operating Systems Department (IMMD4) at the; University of Erlangen/Nuernberg Germany.; Note that the number of instructions in the measurement-loops, differ; from implementation to implementation. I took eight instructions in a loop; for every test (execute eight instructions and loop to the start). .CODE .IMPORT $global$,DATA .IMPORT $$dyncall,MILLICODE .EXPORT b_call_reg .EXPORT b_call_imm .EXPORT b_add .EXPORT b_load; Just do nothing, only return to caller. This procedure is called by; `b_call_reg' and `b_call_imm'.b_null .PROC .CALLINFO NO_CALLS, FRAME=0 .ENTRY bv,n %r0(%rp) ; just return .EXIT .PROCEND; Call the procedure `b_null' with function pointer in a register.b_call_reg .PROC .CALLINFO CALLER, FRAME=0 .ENTRY stwm %r3,64(%sp) ; store r3 (may be used by caller) stw %rp,-20(%sp) ; save return-pointer to frame-marker addil LR'to_call-$global$,%r27 ldw RR'to_call-$global$(%r1),%r3_loop0 copy %r3,%r22 ; copy the procedure label to r22, ... .CALL ; ...this is the input to $$dyncall bl $$dyncall,%mrp ; call $$dyncall (millicode function) copy %mrp,%rp ; remember the return-pointer copy %r3,%r22 .CALL bl $$dyncall,%mrp copy %mrp,%rp copy %r3,%r22 .CALL bl $$dyncall,%mrp copy %mrp,%rp copy %r3,%r22 .CALL bl $$dyncall,%mrp copy %mrp,%rp copy %r3,%r22 .CALL bl $$dyncall,%mrp copy %mrp,%rp copy %r3,%r22 .CALL bl $$dyncall,%mrp copy %mrp,%rp copy %r3,%r22 .CALL bl $$dyncall,%mrp copy %mrp,%rp copy %r3,%r22 .CALL bl $$dyncall,%mrp copy %mrp,%rp addibf,<= -8,%arg0,_loop0 ; decrement counter by 8 and loop nop ldw -20(%sp),%rp ; restore return-pointer bv %r0(%rp) ; return to caller ldwm -64(%sp),%r3 ; resore r3 and remove stack frame .EXIT .PROCEND; Call the procedure `b_null' immediate.b_call_imm .PROC .CALLINFO CALLER, FRAME=0, SAVE_RP .ENTRY ldo 64(%sp),%sp ; caller needs a stack-frame stw %rp,-20(%sp) ; save return-pointer to frame-marker_loop1 bl b_null,%rp ; call `b_null' immediate (8 times) nop bl b_null,%rp nop bl b_null,%rp nop bl b_null,%rp nop bl b_null,%rp nop bl b_null,%rp nop bl b_null,%rp nop bl b_null,%rp nop addibf,<= -8,%arg0,_loop1 ; decrement counter by 8 and loop nop ldw -20(%sp),%rp ; restore return-pointer bv %r0(%rp) ; return to caller ldo -64(%sp),%sp ; remove stack-frame .EXIT .PROCEND; Copy register-to-register.; On PA-RISC this is implemented with an `or'.; The `or' is hidden by a pseudo-operation called `copy'.b_add .PROC .CALLINFO NO_CALLS, FRAME=0 .ENTRY_loop2 copy %r19,%r20 ; copy register-to-register copy %r20,%r21 ; use caller-saves registers copy %r21,%r22 copy %r22,%r21 copy %r21,%r20 copy %r20,%r19 copy %r19,%r20 copy %r20,%r21 addibf,<= -8,%arg0,_loop2 ; decrement counter by 8 and loop nop bv,n %r0(%rp) .EXIT .PROCEND; Load memory to a register.b_load .PROC .CALLINFO NO_CALLS, FRAME=0 .ENTRY_loop3 ldw -4(%sp),%r22 ; load data from frame-marker ldw -8(%sp),%r22 ; use a caller-saves register ldw -12(%sp),%r22 ldw -16(%sp),%r22 ldw -20(%sp),%r22 ldw -24(%sp),%r22 ldw -28(%sp),%r22 ldw -32(%sp),%r22 addibf,<= -8,%arg0,_loop3 ; decrement counter by 8 and loop nop bv,n %r0(%rp) .EXIT .PROCEND .ALIGN 8to_call .WORD b_null
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?