.TITLE S3V .IDENT /V3.0/ ; This program is used to test the speed of instructions ; on VAX family processors. ; ; 11-Apr-85 B. Z. Lederman $NREP == 200. ; number of instructions wanted at one pass $NREAL = <$NREP - 3.> ; (minus loop instructions) $NPAS == 5000. ; number of passes .BLKW 2 ; buffer A: .LONG 63 ; some dummy data .LONG 63 B: .LONG <63 * 1024> ; some more dummy data .LONG <63 * 1024> C: .BLKL 4 ; just some buffer space MNEADR: .ADDRESS MNTAB ; starting point for mnemonics TABADR: .ADDRESS TABLE ; starting point for instructions TTNAME: .ASCID /SYS$OUTPUT:/ TTCHAN: .BLKW 1 ; channel TTIOSB: .BLKW 1 ; I/O Status TTLEN: .BLKW 1 ; I/O length .BLKL 1 ; device char. SAVEPC: .BLKL 1 ; space to save PC for error messages DTBUF: .BLKW 4 ; space for NUMTIM buffer DTMIN: .BLKW 1 ; minutes DTSEC: .BLKW 1 ; seconds DTHUN: .BLKW 1 ; hundreths of second FAODSC: .LONG 80 ; FAO descriptor .ADDRESS FAOBUF ; address of buffer FAOBUF: .BLKB 80 ; FAO buffer FAOLEN: .WORD 0 ; length of initial string .WORD 0 ; need quad value for $QIOW STRTIM: .BLKQ 1 ; starting time ENDTIM: .BLKQ 1 ; ending time ; .NLIST BEX MSG2: .ASCID " Minutes = !UW, Seconds = !UW.!UW" MSG4: .ASCID " !UL Instructions, !UL Passes through loop." ;ERRSTR: .ASCID "!/System Service Error at APP. !XL RO=!XL" ERMS1: .ASCII \ Instruction \ ; these must be STABUF: .ASCII \Program ends. \ ; the same length MSGL: .LONG MSGL - STABUF MNTAB:: .ASCII /MOVB 5/ ; All mnemonics must be the same .ASCII /MOVB 6/ ; length (6 characters) and they .ASCII /MOVB78/ ; must match up to the instructions .ASCII /MOVW 5/ ; listed below .ASCII /MOVW 6/ .ASCII /MOVW78/ .ASCII /MOVL 5/ .ASCII /MOVL 6/ .ASCII /MOVL78/ .ASCII /MOVQ 5/ .ASCII /MOVQ 6/ .ASCII /MOVQ78/ .ASCII /MNEGW5/ .ASCII /MNEGW6/ .ASCII /MNEGL5/ .ASCII /MNEGL6/ .ASCII /MCOMW5/ .ASCII /CVTBW5/ .ASCII /MOVZBL/ .ASCII /CMPW 5/ .ASCII /CMPL 6/ .ASCII /ADDW2 / .ASCII /BITW 5/ .ASCII /MULW2 / .ASCII /DIVW2 / .ASCII /Last / ; .LIST BEX TABLE:: ; Table of instructions to test MOVB R6, R7 ; MOVe Byte mode 5 MOVB (R6), (R7) ; MOVe Byte mode 6 MOVB -(SP), (SP)+ ; MOVe Byte mode 7 and 8 MOVW R6, R7 ; MOVe Word mode 5 MOVW (R6), (R7) ; MOVe Word mode 6 MOVW -(SP), (SP)+ ; MOVe Word mode 7 and 8 MOVL R6, R7 ; MOVe Long mode 5 MOVL (R6), (R7) ; MOVe Long mode 6 MOVL -(SP), (SP)+ ; MOVe Long mode 7 and 8 MOVQ R6, R7 ; MOVe Quad mode 5 MOVQ (R6), (R7) ; MOVe Quad mode 6 MOVQ -(SP), (SP)+ ; MOVe Quad mode 7 and 8 MNEGW R6, R7 ; Move NEGated Word MNEGW (R6), (R7) ; Move NEGated Word MNEGL R6, R7 ; Move NEGated Word MNEGL (R6), (R7) ; Move NEGated Word MCOMW R6, R7 ; Move COMplemented Word CVTBW R6, R7 ; ConVert Byte to Word MOVZBL R6, R7 ; MOVe Zero-extend Byte to Long word CMPW R6, R7 ; CoMPare Word CMPL (R6), (R7) ; CoMPare Quad ADDW2 R6, R7 ; Add Word BITW R6, R7 ; BIt Test Word MULW2 R6, R7 ; MULtiply Word DIVW2 R6, R7 ; DIVide Word HALT ; won't actually do this HALT HALT .PAGE .ENTRY SPEED, ^M START:: $ASSIGN_S DEVNAM = TTNAME, CHAN = TTCHAN BLBS R0, 10$ ; continue if O.K. RET ; otherwise exit with status in R0 10$: $FAO_S CTRSTR = MSG4, - ; format first message OUTLEN = FAOLEN, OUTBUF = FAODSC, P1 = #$NREP, P2 = #$NPAS BSBW ERROR $QIOW_S CHAN = TTCHAN, FUNC = #IO$_WRITEVBLK, - P1 = FAOBUF, P2 = FAOLEN, P4 = #32 BSBW ERROR BEGIN:: MOVL MNEADR, R12 ; get address of mnemonic MOVAL ERMS1, R7 ; get start of message MOVB (R12)+, (R7)+ ; move mnemonic into message MOVB (R12)+, (R7)+ MOVB (R12)+, (R7)+ MOVB (R12)+, (R7)+ MOVB (R12)+, (R7)+ MOVB (R12)+, (R7)+ MOVL R12, MNEADR ; save address of next mnemonic $QIOW_S CHAN = TTCHAN, - ; write out mnemonic FUNC = #IO$_WRITEVBLK, P1 = ERMS1, P2 = MSGL, P4 = #32 BSBW ERROR MOVL TABADR, R12 ; Get address of instruction MOVB (R12)+, R6 ; get first byte of instruction BNEQ 15$ ; branch if O.K. instruction JMP EXIT ; quit here if HALT instruction 15$: MOVB (R12)+, R7 ; second byte of instruction MOVB (R12)+, R8 ; third byte of instruction MOVL R12, TABADR ; save address of next instruction MOVL #$NREAL, R4 ; number of repititions MOVAL ISTRT, R5 ; address of instruction space 20$: MOVB R6, (R5)+ ; load instruction MOVB R7, (R5)+ ; second byte of instruction MOVB R8, (R5)+ ; third byte of instruction SOBGTR R4, 20$ ; continue until all loaded MOVL #$NPAS, R4 ; number of times through the loop MOVAL A, R6 ; need this for some modes MOVAL B, R7 ; this also $GETTIM_S TIMADR = STRTIM ; get NOW from system BSBW ERROR ; check for directive error ISTRT:: .REPT $NREAL ; this number of instructions NOP ; filled with real instructions above NOP NOP .ENDR DECL R4 ; count number of passes BLEQ TIMES ; quit if enough passes JMP ISTRT ; otherwise continue TIMES:: $GETTIM_S TIMADR = ENDTIM ; get NOW from system BSBW ERROR ; check for error SUBL ENDTIM, STRTIM ; get difference (in reverse order SBWC ENDTIM+4, STRTIM+4 ; as negative indicates delta time) $NUMTIM_S - ; convert to binary values TIMBUF = DTBUF, TIMADR = STRTIM BSBW ERROR $FAO_S CTRSTR = MSG2, - ; format time message OUTLEN = FAOLEN, OUTBUF = FAODSC, - P1 = DTMIN, P2 = DTSEC, P3 = DTHUN BSBW ERROR $QIOW_S CHAN = TTCHAN, - ; output time message FUNC = #IO$_WRITEVBLK, P1 = FAOBUF, P2 = FAOLEN, P4 = #32 BSBW ERROR JMP BEGIN ; repeat until last instruction EXIT:: $QIOW_S CHAN = TTCHAN, - ; write out final message FUNC = #IO$_WRITEVBLK, P1 = STABUF, P2 = MSGL, P4 = #32 $EXIT_S ; byebye ; Error Checking Routine ERROR:: BLBC R0, 10$ ; if error, branch RSB ; otherwise, continue 10$: RET ; let the system output the message ; MOVL (SP), SAVEPC ; $FAO_S CTRSTR = ERRSTR, - ; format error message ; OUTLEN = FAOLEN, OUTBUF = FAODSC, P1 = SAVEPC, P2 = R0 ; BLBC R0, END ; $QIOW_S CHAN = TTCHAN, FUNC = #IO$_WRITEVBLK, - ; P1 = FAOBUF, P2 = FAOLEN, P4 = #32 ;END:: RET .END SPEED