-
Notifications
You must be signed in to change notification settings - Fork 1
/
s370_perf.asm
6482 lines (6481 loc) · 218 KB
/
s370_perf.asm
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
* 1 2 3 4 5 6 71
*23456789*12345*789012345678901234*678901234567890123456789012345678901
* $Id: s370_perf.asm 1026 2018-05-27 12:05:23Z mueller $
*
* Copyright 2017-2018 by Walter F.J. Mueller <W.F.J.Mueller@gsi.de>
*
* This program is free software; you may redistribute and/or modify
* it under the terms of the GNU General Public License version 3.
* See Licence.txt in distribition directory for further details.
*
* Revision History: (!! update MSGVERS when adding here !!)
* Date Rev Version Comment
* 2018-05-27 1026 0.9.8 DISBAS substitutable via var SET_DISBAS
* 2018-03-30 1003 0.9.7 add and use more ltype codes; add /TCOR
* tune T510-T513,T540-T543,T560;fix T551,T553
* 2018-03-24 1001 0.9.6 use REPINSN instead of REPINS5 and REPINS2
* renames, add T150,T152,T153,T205-T209
* add T304,T305,T422,T423,T426,T427
* add T512,T513,T542,T543
* 2018-03-04 998 0.9.5 add T9**,T703; fix T232 text
* 2018-03-03 997 0.9.4 reorganize PARM decode; add /OPCF
* 2018-02-25 995 0.9.3 use R11,R12 as base to allow 8k main code
* add SETB DISBAS to disable BAS/BASR tests
* add /Cxxx, sets GMUL test; /T*** wildcards
* add config file handling; use sios path
* 2018-02-10 993 0.9.2 add STCK time to PERF003/PERF004 messages
* add PERF000 vers info; add warmup T102 run
* 2018-01-06 986 0.9.1 rename to s370_perf
* 2017-12-16 970 0.9 add /Dxxx and /Exxx params; 8k code support
* use 4k buffer for MVCL,CLCL; test renames
* add T284-T285,T303,T701,T702,T211,T212,T216
* add T116-T117,T191-T192,T156-T158,T161-T162
* add T165-T166,T450-T451,T507,T527
* 2017-12-10 969 0.8 add ltype flag in TDSC; new output format
* use BCTR loop closure; code test D aligned
* add REPINS2,REPINS5,REPINSPI,REPINSAL
* add T252-T254,T255-T259,T274-T277,T280-T283
* add T290-292,T324-T325,T415,T440-T443
* add T445-T446,T504-506,T524-526,T295-297
* add T620-T621
* 2017-12-03 968 0.71 renames, add T310,321,323,238,239,700
* 2017-12-02 967 0.7 use relocation by default, add /ORIP
* add /OPTT, page aligned 16k bufs
* 2017-11-26 966 0.6 add /OTGA /GAUT and T114,T601
* 2017-11-12 961 0.5 Initial version
* 2017-10-15 956 0.1 First draft
*
* Description:
* Code to determine instruction timing of S/370 non-priviledged
* instructions in 24 bit mode.
*
* Usage:
* s370_perf uses the PARM interface to determine job behaviour. The
* PARM string is a list of 4 letter options, each starting with a /.
* Valid options are:
* /OWTO enable step by step MVS console messages
* /ODBG enable debug trace output for test steps
* /OTGA enable debug trace output for /GAUT processing
* /OPCF print config file
* /OPTT print test table
* /ORIP run tests in place (default is relocate)
* /GAUT automatic determination of GMUL, aim is 1 sec per test
* /Gnnn set GMUL to nnn
* /GnnK set GMUL to nn * 1000
* /Cnnn use test Tnnn for GMUL calibration (default is C102)
* /Ennn enable test Tnnn (n can be digit or '*' wildcard)
* /Dnnn disable test Tnnn (dito)
* /Tnnn select test Tnnn (dito)
* /TCOR select all tests required for loop overhead correction
*
* Notes on option usage:
* 1. GMUL default and start value is 1
* 2. if multiple /Gnnn or /GnnK are given the last one is taken
* 3. /GAUT will overwrite any previous /Gnnn, but use prior /Gnnn as
* start value in the search for GMUL leading to 1 sec test time
* 4. if no /Tnnn option is seen all pre-enabled tests are executed
* 5. several /Tnnn options can be specified, in this case only these
* tests are run
* 6. /Dnnn allows to disable an enabled test
* 7. /Ennn allows to enable a disabled test
*
* Configuration file:
* read from SYSIN, is optional. Line starting with '#' are ignored
* all other lines must have the format
* Tnnn e lrcnt
* with
* Tnnn test name
* e enable flag, 0 or 1 (with 4 spaces in front)
* lrcnt new LRCNT, 10 digit field, ignored if zero
* Main usage of the config file is to redefine the LRCNT of test
* when s370_perf is run on systems other than a Hercules emulator.
* The config file is processed before the /Tnnn,/Ennn,/Dnnn PARMs.
*
* Code configuration options:
* in 'global definitions' before main code, currently:
* &DISBAS SETB a 1 will disable BAS/BASR tests
*
* Return codes:
* RC = 0 ok
* RC = 4 open SYSPRINT failed
* RC = 8 open SYSIN failed
* RC = 12 unexpected SYSIN EOF (should never happen)
* RC = 16 bad PARMs
* RC = 20 execution error, see message on SYSPRINT
*
* User Abend codes:
* 10 test too large (> CBUFSIZE)
* 50 unexpected branch taken in test
* 60 internal consistency check in test
* 255 SOS buffer overflow
*
* Used CSECTS:
* MAIN main program code and local data
* TEXT text from otxtdsc
* SIOSDATA SOS data
* TDSCDAT task descriptor list
* TDSCTBL task table
* TCODE task code
* T330CS code for T330
* DATA other data
*
*** PRINT NOGEN don't show macro expansions
*
* local macros --------------------------------------------------------
//** ##rinclude ../sios/otxtdsc.asm
*
* used global symbols
* type name set by used by comment
* GBLA TDIGCNT TDSCGEN REPINS*
* GBLC TTAG TSIMBEG TSIMEND
*
* TDSCGEN - setup test descriptor --------------------------
*
MACRO
&LABEL TDSCGEN &TAG,&LRCNT,&IGCNT,<YPE,&TEXT
GBLA &TDIGCNT
&TDIGCNT SETA &IGCNT
*
&LABEL DC A(&TAG) // TENTRY
DC A(&TAG.TEND-&TAG) // TLENGTH
DC F'&LRCNT' // TLRCNT
DC F'&IGCNT' // TIGCNT
DC F'<YPE' // TLTYPE
OTXTDSC C'&TAG' // TTAGDSC
OTXTDSC &TEXT // TTXTDSC
MEND
*
* TSIMPRE - preamble code for simple test ------------------
* Note: The preamble code starts at a double word boundary. This
* ensures that even after relocation the test code has the
* same alignments, especially that 'D' type allocations
* will stay on double word boundaries.
*
MACRO
&LABEL TSIMPRE &NBASE=1
DS 0D ensure double word alignment for test
&LABEL SAVE (14,12)
AIF (&NBASE GT 1).NBASE2
LR R12,R15 base register := entry address
USING &LABEL,R12 declare code base register
LA R11,&LABEL.L load loop target to R11
AGO .NBASEOK
.NBASE2 ANOP
LR R11,R15 base register 1 := entry address
LA R12,2048(R11)
LA R12,2048(R12) base register 1 := entry address+4k
USING &LABEL,R11,R12 declare code base registers
LA R10,&LABEL.L load loop target to R10
.NBASEOK ANOP
L R15,=A(SAVETST) R15 := current save area
ST R13,4(R15) set back pointer in current save area
LR R2,R13 remember callers save area
LR R13,R15 setup current save area
ST R13,8(R2) set forw pointer in callers save area
USING TDSC,R1 declare TDSC base register
L R15,TLRCNT load local repeat count to R15
MEND
*
* TSIMRET - return code for simple test --------------------
*
MACRO
&LABEL TSIMRET
L R15,=A(SAVETST) R15 := current save area
L R13,4(R15) get old save area back
RETURN (14,12)
MEND
*
* TSIMBEG - complete startup for simple test ---------------
*
MACRO
TSIMBEG &TAG,&LRCNT,&IGCNT,<YPE,&TEXT,&NBASE=1,&DIS=0
GBLC &TTAG
&TTAG SETC '&TAG'
*
TDSCDAT CSECT
DS 0D
&TAG.TDSC TDSCGEN &TAG,&LRCNT,&IGCNT,<YPE,&TEXT
*
TDSCTBL CSECT
&TAG.TPTR EQU *
AIF (&DIS GT 0).TDSCDIS
DC A(&TAG.TDSC) enabled test
AGO .TDSCOK
.TDSCDIS ANOP
DC X'01',AL3(&TAG.TDSC) disabled test
.TDSCOK ANOP
*
TCODE CSECT
&TAG TSIMPRE NBASE=&NBASE
*
MEND
*
* TSIMEND - end for simple test ----------------------------
*
MACRO
TSIMEND
GBLC &TTAG
LTORG
&TTAG.TEND EQU *
MEND
*
* REPINS - repeat instruction -----------------------------
*
MACRO
&LABEL REPINS &CODE,&ALIST,&IGCNT=0
GBLA &TDIGCNT
GBLC &MACRETC
LCLA &ICNT
LCLC &ARGS
*
* build from sublist &ALIST a comma separated string &ARGS
*
REPINSAL &ALIST
&ARGS SETC '&MACRETC'
*
* determine repeat count, &IGCNT if given, otherwise &TDIGCNT
* this allows to transfer the repeat count from last TDSCGEN call
*
&ICNT SETA &IGCNT
AIF (&ICNT GT 0).ICNTOK
&ICNT SETA &TDIGCNT
AIF (&ICNT GT 0).ICNTOK
MNOTE 8,'//REPINS: IGCNT and TDIGCNT equal 0; abort'
MEXIT
.ICNTOK ANOP
*
AIF ('&LABEL' EQ '').NOLBL
&LABEL EQU *
.NOLBL ANOP
*
* write a comment indicating what REPINS does (in case NOGEN in effect)
*
MNOTE *,'// REPINS: do &ICNT times:'
REPINSPI &CODE,&ARGS
*
* finally generate code: &ICNT copies of &CODE &ARGS
*
.ILOOP &CODE &ARGS
&ICNT SETA &ICNT-1
AIF (&ICNT GT 0).ILOOP
*
MEND
*
* REPINSN - repeat 5 instructions --------------------------
*
MACRO
&LABEL REPINSN &CO1,&AL1,&CO2,&AL2,&CO3,&AL3,&CO4,&AL4,&CO5,&AL5
GBLA &TDIGCNT
GBLC &MACRETC
LCLA &ICNT
LCLC &ARGS1,&ARGS2,&ARGS3,&ARGS4,&ARGS5
*
* build from sublist &ALIST* a comma separated string &ARGS*
*
REPINSAL &AL1
&ARGS1 SETC '&MACRETC'
REPINSAL &AL2
&ARGS2 SETC '&MACRETC'
AIF ('&CO3' EQ '').ARGDONE
REPINSAL &AL3
&ARGS3 SETC '&MACRETC'
AIF ('&CO4' EQ '').ARGDONE
REPINSAL &AL4
&ARGS4 SETC '&MACRETC'
AIF ('&CO5' EQ '').ARGDONE
REPINSAL &AL5
&ARGS5 SETC '&MACRETC'
.ARGDONE ANOP
*
AIF ('&LABEL' EQ '').NOLBL
&LABEL EQU *
.NOLBL ANOP
*
&ICNT SETA &TDIGCNT
*
* write a comment indicating what REPINSN does (if NOGEN in effect)
*
MNOTE *,'// REPINSN: do &ICNT times:'
REPINSPI &CO1,&ARGS1
REPINSPI &CO2,&ARGS2
AIF ('&CO3' EQ '').PRTDONE
REPINSPI &CO3,&ARGS3
AIF ('&CO4' EQ '').PRTDONE
REPINSPI &CO4,&ARGS4
AIF ('&CO5' EQ '').PRTDONE
REPINSPI &CO5,&ARGS5
.PRTDONE ANOP
*
* finally generate code: &ICNT copies of &CO1 ...
*
.ILOOP &CO1 &ARGS1
&CO2 &ARGS2
AIF ('&CO3' EQ '').GENDONE
&CO3 &ARGS3
AIF ('&CO4' EQ '').GENDONE
&CO4 &ARGS4
AIF ('&CO5' EQ '').GENDONE
&CO5 &ARGS5
.GENDONE ANOP
&ICNT SETA &ICNT-1
AIF (&ICNT GT 0).ILOOP
*
MEND
*
* REPINSAL - build from sublist a comma separated string ---
*
MACRO
REPINSAL &ALIST
GBLC &MACRETC
LCLA &AIND
*
&AIND SETA 2
&MACRETC SETC '&ALIST(1)'
*
.ALOOP AIF (&AIND GT N'&ALIST).AEND
&MACRETC SETC '&MACRETC'.','.'&ALIST(&AIND)'
&AIND SETA &AIND+1
AGO .ALOOP
.AEND ANOP
MEND
*
* REPINSPI - issue MNOTE with one instruction --------------
*
MACRO
REPINSPI &CODE,&ARGS
LCLA &MAIND
LCLC &MASTR
*
* MNOTE requires that ' is doubled for expanded variables
* thus build &MASTR as a copy of '&ARGS with ' doubled
*
&MAIND SETA 1
&MASTR SETC ''
*
.MALOOP ANOP
&MASTR SETC '&MASTR'.'&ARGS'(&MAIND,1)
AIF ('&ARGS'(&MAIND,1) NE '''').MANEXT
&MASTR SETC '&MASTR'.''''
.MANEXT ANOP
&MAIND SETA &MAIND+1
AIF (&MAIND LE K'&ARGS).MALOOP
MNOTE *,'// &CODE &MASTR'
MEND
*
* global definitions --------------------------------------------------
*
GBLB &DISBAS
&DISBAS SETB ${SET_DISBAS:-0} set 1 to disable BAS/BASR tests
*
* main preamble -------------------------------------------------------
*
MAIN START 0 start main code csect at base 0
SAVE (14,12) Save input registers
LR R11,R15 base register 1 := entry address
LA R12,2048(R11)
LA R12,2048(R12) base register 2 := entry address+4k
USING MAIN,R11,R12 declare 2 base register for 8k code
ST R13,SAVE+4 set back pointer in current save area
LR R2,R13 remember callers save area
LA R13,SAVE setup current save area
ST R13,8(R2) set forw pointer in callers save area
*
* general constant definitions-----------------------------------------
*
CBUFSIZE EQU 8192
*
* some preparations --------------------------------------------------
*
ST R1,ARGPTR save argument list pointer for later
L R3,=A(TDSCTBLE-4) pointer to last entry of TDSCTBL
OI 0(R3),X'80' mark last entry of TDSCTBL
*
* open datasets --------------------------------------------
*
OPEN (SYSPRINT,OUTPUT) open SYSPRINT
LTR R15,R15 test return code
BE OOPENOK
MVI RC+3,X'04'
B EXIT quit with RC=4
OOPENOK EQU *
*
* allocate buffers -----------------------------------------
*
GETMAIN RU,LV=CBUFSIZE,BNDRY=PAGE
ST R1,PCBUF code area pointer
GETMAIN RU,LV=4096,BNDRY=PAGE
ST R1,PBUF4K1 1st 4k data buffer pointer
GETMAIN RU,LV=4096,BNDRY=PAGE
ST R1,PBUF4K2 2nd 4k data buffer pointer
*
* main body -----------------------------------------------------------
*
TDSC DSECT
TENTRY DS F entry address
TLENGTH DS F code/data length of test
TLRCNT DS F local repeat count
TIGCNT DS F local instruction group count
TLTYPE DS F loop type
TTAGDSC DS F tag text descriptor
TTXTDSC DS F description text descriptor
*
MAIN CSECT
*
* write header -------------------------------------------------------
*
L R1,MSGVHDR
BAL R14,OTEXT print VERS message prefix
L R1,MSGVERS
BAL R14,OTEXT print version
BAL R14,OPUTLINE write line
*
* handle PARMs and config file----------------------------------------
*
BAL R14,PARMPH1 handle PARM, phase 1
BAL R14,CNFRD handle config file
BAL R14,PARMPH2 handle PARM, phase 2
*
* handle /TCOR, add tests required for loop overhead correction
* R1 current ltype (as index or byte offset)
* R2 pointer into TDSCTBL
* R3 pointer to current TDSC
* R4 pointer to TCORTBL (0 based)
* R5 pointer into case list (starting at LTTBLxx)
* R6 pointer to TDSCTBL entry
*
CLI FLGTCOR,X'00' /TCOR seen ?
BE TCORE if = not, skip handling
L R2,=A(TDSCTBL) get head of TDSCTBL
*
TCORLO L R3,0(R2) get next TDSC
USING TDSC,R3 declare TDSC base register
TM 0(R2),X'01' test disable flag
BO TCORNO if seen, continue with next
*
L R1,TLTYPE get lt
LTR R1,R1 test lt
BNH TCORNO ignore tests with lt <= 0
C R1,=A(LTMAX) compare with TCORTBL size
BNH TCOROK if <= max ok
*
L R1,MSGLTBD otherwise complain and abort
BAL R14,OTEXT print error message
L R1,TTAGDSC
BAL R14,OTEXT print tag
BAL R14,OPUTLINE write line
MVI RC+3,X'14'
B EXIT quit with RC=20
*
TCOROK L R4,=A(TCORTBL-4) get TCORTBL ptr (0 based!)
SLL R1,2 lt index to byte offset
L R5,0(R1,R4) get ptr to lt case list
TCORLI L R6,0(R5) get case (is ptr into TDSCTBL)
NI 0(R6),X'FE' clear disable flag bit
LA R5,4(R5) push ptr to next case
LTR R6,R6 end tag X'80000000' seen ?
BNL TCORLI if >= not, keep going
*
TCORNO EQU *
DROP R3
LA R2,4(R2) push pointer to next TDSC
LTR R3,R3 end tag X'80000000' seen ?
BNL TCORLO if >= not, keep going
*
L R6,=A(T100TPTR) ptr to T100 (LR test for nrr)
NI 0(R6),X'FE' clear disable flag bit
L R6,=A(T102TPTR) ptr to T102 (L test for nrx)
NI 0(R6),X'FE' clear disable flag bit
*
TCORE EQU *
*
* print test table if requested with /OPTT
*
CLI FLGOPTT,X'00' /OPTT seen ?
BE OPTPTTE if = not
L R1,MSGOPTT
BAL R14,OTEXT print GMUL message prefix
BAL R14,OPUTLINE write line
L R2,=A(TDSCTBL) get head of TDSCTBL
*
OPTPTTL L R3,0(R2) get next TDSC
USING TDSC,R3 declare TDSC base register
LR R1,R2
S R1,=A(TDSCTBL)
SRL R1,2 R1 now index into TDSCTBL
BAL R14,OINT04 print index
L R1,MSGTDIS
TM 0(R2),X'01' test disable flag
BO OPTPTTD if seen, prefix with " -"
L R1,MSGTENA otherwise with " "
OPTPTTD BAL R14,OTEXT print enable/disable prefix
L R1,TTAGDSC
BAL R14,OTEXT print tag
L R1,TLRCNT
BAL R14,OINT10 print LRCNT
L R1,TIGCNT
BAL R14,OINT04 print IGCNT
L R1,TLTYPE
BAL R14,OINT04 print LTYPE
L R1,TENTRY
BAL R14,OHEX10 print code address
L R1,TLENGTH
BAL R14,OINT10 print code length
BAL R14,OPUTLINE write line
*
DROP R3
LA R2,4(R2) push pointer to next TDSC
LTR R3,R3 end tag X'80000000' seen ?
BNL OPTPTTL if >= not, keep going
*
OPTPTTE EQU *
*
* some final preparations --------------------------------------------
*
* as warmup run test used for GMUL (with or without /GAUT !)
*
L R3,GMULTDSC get GMUL test descriptor
BAL R10,DOTEST run test with current GMUL
*
* handle /GAUT -----------------------
*
CLI FLGGAUT,X'00' /GAUT active ?
BE OPTGAUTE if = not, skip handling
*
L R3,GMULTDSC get GMUL test descriptor
OPTGAUTL BAL R10,DOTEST run test with current GMUL
LM R4,R5,TCKBEG get start time
SRDL R4,12 get it in usec
LM R6,R7,TCKEND get end time
SRDL R6,12 get it in usec
SLR R7,R5 R7 := end-start in usec (LSB)
*
CLI FLGOTGA,X'00' /OTGA active ?
BE NOTRCTGA if = not, skip printing
L R1,MSGTGA
BAL R14,OTEXT print /OTGA message prefix
L R1,GMUL
BAL R14,OINT10 print GMUL
L R1,MSGCSEP
BAL R14,OTEXT print ' : '
LA R1,TCKBEG
BAL R14,OHEX210 print TCKBEG (as hex)
L R1,MSGCSEP
BAL R14,OTEXT print ' : '
LA R1,TCKEND
BAL R14,OHEX210 print TCKEND (as hex)
L R1,MSGCSEP
BAL R14,OTEXT print ' : '
LR R1,R7
BAL R14,OINT10 print dt (as int)
BAL R14,OPUTLINE write line
NOTRCTGA EQU *
*
C R7,=F'200000' compare with 0.2 sec
BH OPTGAUTC
L R4,GMUL load GMUL
C R4,=F'30000' already at limit ?
BH OPTGAUTE if > yes, quit increasing it
SLL R4,1 2*GMUL
A R4,GMUL 3*GMUL
ST R4,GMUL now GMUL tripled
B OPTGAUTL and re-try with new GMUL
*
OPTGAUTC EQU * calculate final GMUL
XR R4,R4 clear R4
L R5,=F'1024000000' (R4,R5) := 1024 * 1000000
DR R4,R7 R5 := (1024*1000000)/dt
L R7,GMUL
MR R6,R5 R7 := GMUL * (1024*1000000)/dt
SRL R7,10 R7 := GMUL * 1000000/dt
LA R6,1
CR R7,R6 GMUL < 1
BH OPTGAUTB if > not
LR R7,R6 limit to 1
OPTGAUTB L R6,=F'99999'
CR R7,R6 GMUL > 99999
BL OPTGAUTT
LR R7,R6 limit to 99999
OPTGAUTT ST R7,GMUL
*
OPTGAUTE EQU *
*
* print headings -----------------------
*
L R1,MSGGMUL
BAL R14,OTEXT print GMUL message prefix
L R1,GMUL
BAL R14,OINT10 print GMUL
BAL R14,OPUTLINE write line
*
L R1,MSGSTRT
BAL R14,OTEXT print 'start tests' message
STCK TPRBEG get program start time
LA R1,TPRBEG
BAL R14,OHEX210 print TPRBEG (as hex)
BAL R14,OPUTLINE write line
*
L R1,MSGTHD1
BAL R14,OTEXT print heading part 1
LA R1,30
BAL R14,OTAB goto tab stop
L R1,MSGTHD2
BAL R14,OTEXT print heading part 1
BAL R14,OPUTLINE write line
*
* finally execute tests ----------------------------------------------
* R2 pointer into TDSCTBL
* R3 pointer to current TDSC
*
* outer loop over tests
*
L R2,=A(TDSCTBL) get head of TDSCTBL
TLOOP L R3,0(R2) get next TDSC
TM 0(R2),X'01' test disable flag
BO TLOOPN if seen, skip test
USING TDSC,R3 declare TDSC base register
*
CLI FLGODBG,X'00' /ODGB active ?
BE NOTRCSTP if = not, skip tracing
BAL R14,TRCSTP
NOTRCSTP EQU *
*
BAL R10,DOTEST execute test with inner GMUL loop
*
* calculate result
*
LA R1,TCKBEG
BAL R14,CNVCK2D
STD FR0,TBEG TBEG now in 1/16 of usec
*
LA R1,TCKEND
BAL R14,CNVCK2D
STD FR0,TEND TEND now in 1/16 of usec
*
LD FR0,TEND
SD FR0,TBEG
DD FR0,=D'16.E6' from 1/16 of usec to sec
STD FR0,TDIF TDIF in sec
*
L R1,TLRCNT
BAL R14,CNVF2D
LDR FR2,FR0 FR2 := float(TLRCNT)
L R1,TIGCNT
BAL R14,CNVF2D FR0 := float(TIGCNT)
MDR FR2,FR0 FR2 := TLRCNT*TIGCNT
L R1,GMUL
BAL R14,CNVF2D FR0 := float(GMUL)
MDR FR2,FR0 FR2 := TLRCNT*TIGCNT*GMUL
LD FR0,TDIF FR0 := dt
DDR FR0,FR2 FR0 := dt /(TLRCNT*TIGCNT*GMUL)
MD FR0,=D'1.E6' FR0 := 1.e6 *dt/(TLRCNT*TIGCNT*GMUL)
STD FR0,TINS TINS now in usec
*
* print /ODBG trace output
*
CLI FLGODBG,X'00' /ODBG active ?
BE NOTRCRES if = not, skip tracing
BAL R14,TRCRES
NOTRCRES EQU *
*
* print result
*
L R1,TTAGDSC
BAL R14,OTEXT print tag
BAL R14,OSKIP02 add space
L R1,TTXTDSC
BAL R14,OTEXT print description
LA R1,30
BAL R14,OTAB goto tab stop
L R1,MSGCSEP
BAL R14,OTEXT print " : "
LD FR0,TDIF
BAL R14,OFIX1306 print run time
*
L R1,TLRCNT
BAL R14,OINT10 print LRCNT
L R1,TIGCNT
BAL R14,OINT04 print IGCNT
L R1,TLTYPE
BAL R14,OINT04 print LTYPE
*
L R1,MSGCSEP
BAL R14,OTEXT print " : "
LD FR0,TINS
BAL R14,OFIX1306 print time per test
BAL R14,OPUTLINE write line
*
CLI FLGOWTO,X'00' /OWTO active ?
BE NOWTO if = not, skip oper messages
L R1,TTAGDSC
MVC WTOMSG2,0(R1) insert current tag
WTO MF=(E,WTOPLIST) and issue operator message
NOWTO EQU *
*
DROP R3
TLOOPN LA R2,4(R2) push pointer to next TDSC
LTR R3,R3 end tag X'80000000' seen ?
BNL TLOOP if >= not, keep going
*
L R1,MSGDONE
BAL R14,OTEXT print 'done tests' message
STCK TCKEND get program end time
LA R1,TCKEND
BAL R14,OHEX210 print TCKEND (as hex)
*
LA R1,TPRBEG
BAL R14,CNVCK2D convert program start time
LDR FR6,FR0 keep in FR6
*
LA R1,TCKEND
BAL R14,CNVCK2D convert program end time
SDR FR0,FR6 dt = end - beg
DD FR0,=D'16.E6' from 1/16 of usec to sec
*
L R1,MSGDT
BAL R14,OTEXT print 'done tests' message
BAL R14,OFIX1306 print run time
BAL R14,OPUTLINE write line
*
* close datasets and return to OS -------------------------------------
*
EXIT CLOSE SYSPRINT close SYSPRINT
L R13,SAVE+4 get old save area back
L R0,RC get return code
ST R0,16(R13) store in old save R15
RETURN (14,12) return to OS (will setup RC)
*
* data for MAIN program ----------------------------------------------
*
SAVE DS 18F save area (for main)
SAVETST DS 18F save area (shared by Txxx)
RC DC F'0' return code
ARGPTR DC F'0' argument list pointer
*
GMUL DC F'1' general multiplier
GMULTDSC DC A(T102TDSC) test used for GMUL
*
PCBUF DS F ptr to code area buffer
PBUF4K1 DS F ptr 1st 4k data buffer
PBUF4K2 DS F ptr 2nd 4k data buffer
*
TPRBEG DS D STCK value at program begin
TCKBEG DS D STCK value at test begin
TCKEND DS D STCK value at test end
TBEG DS D TCKBEG as double in 1/16 usec
TEND DS D TCKEND as double in 1/16 usec
TDIF DS D test time in sec
TINS DS D instruction time in usec
*
GMULPACK DS D
GMULZONE DC C'000000'
*
DS 0F
FLGTBL DC X'00',AL3(FLGODBG),C'ODBG'
DC X'00',AL3(FLGOWTO),C'OTWO'
DC X'00',AL3(FLGOTGA),C'OTGA'
DC X'00',AL3(FLGOPCF),C'OPCF'
DC X'00',AL3(FLGOPTT),C'OPTT'
DC X'00',AL3(FLGORIP),C'ORIP'
DC X'00',AL3(FLGGAUT),C'GAUT'
FTBLTCOR DC X'80',AL3(FLGTCOR),C'TCOR'
*
FLGODBG DC X'00' /ODBG active
FLGOWTO DC X'00' /OWTO active
FLGOTGA DC X'00' /OTGA active
FLGOPCF DC X'00' /OPCF active
FLGOPTT DC X'00' /OPTT active
FLGORIP DC X'00' /ORIP active
FLGGAUT DC X'00' /GAUT active
FLGTCOR DC X'00' /TCOR active
TDSCDIS DC X'00' TDSC disable done after 1st /Tnnn
CHART DC C'T' just letter 'T'
CHARWC DC C'*' just letter '*'
*
DS 0F
WTOPLIST DC AL2(4+L'WTOMSG1+L'WTOMSG2) text length + 4
DC B'1000000000000000' msg flags
WTOMSG1 DC C's370_perf: done '
WTOMSG2 DC C'Txxx'
DC B'0000010000000000' descriptor codes (6=job status)
DC B'0100000000000000' routing codes (2=console info)
*
DS 0F
MSGVERS OTXTDSC C's370_perf V0.9.8 rev 1026 2018-05-27'
MSGVHDR OTXTDSC C'PERF000I VERS: '
MSGPARM OTXTDSC C'PERF001I PARM: '
MSGGMUL OTXTDSC C'PERF002I run with GMUL= '
MSGSTRT OTXTDSC C'PERF003I start with tests at'
MSGDONE OTXTDSC C'PERF004I done with tests at'
MSGPBAD OTXTDSC C'PERF005E bad option: '
MSGPDIG OTXTDSC C'PERF006E bad digit: '
MSGPTST OTXTDSC C'PERF007E bad test: '
MSGPGM0 OTXTDSC C'PERF008E GMUL is zero: '
MSGCBAD OTXTDSC C'PERF009E bad config item: '
MSGCLNE OTXTDSC C'PERF010I config: '
MSGLTBD OTXTDSC C'PERF011E bad loop type for: '
MSGDT OTXTDSC C' dt='
MSGOPTT OTXTDSC C' ind tag lr ig lt addr length'
MSGTHD1 OTXTDSC C' tag description'
MSGTHD2 OTXTDSC C' : test(s) lr ig lt : inst(usec)'
MSGTENA OTXTDSC C' '
MSGTDIS OTXTDSC C' -'
MSGCSEP OTXTDSC C' : '
MSGDBG OTXTDSC C'-- '
MSGBEG OTXTDSC C'-- TCKBEG:'
MSGEND OTXTDSC C'-- TCKEND:'
MSGDIF OTXTDSC C'-- DIFF:'
MSGINS OTXTDSC C'-- INS:'
MSGTGA OTXTDSC C'-- GAUT:'
*
DS 0H
*
* helper routines ----------------------------------------------------
*
* --------------------------------------------------------------------
* BR14FAR: helper used in 'far call' BAL/BALR tests ==================
*
BR14FAR BR R14
*
* --------------------------------------------------------------------
* PARMPH1: handle PARMs, phase 1, all except /Tnnn /Dnnn /Ennn =======
* R2 PARM address
* R3 PARM length
*
PARMPH1 ST R14,PARMPHXL
*
L R2,ARGPTR get argument list pointer
L R2,0(R2) load PARM base address
LH R3,0(R2) load PARM length
LTR R3,R3 test length
BZ PARMPH1E if =0 no PARM specified
*
LA R2,2(R2) R2 points to 1st PARM char
*
* print PARM if given ------------------
*
L R1,MSGPARM
BAL R14,OTEXT print PARM message prefix
N R2,=X'00FFFFFF' force upper bit to zero
LR R1,R3 get length
SLL R1,24 put length into bits 0-7
OR R1,R2 and address into bits 8-31
BAL R14,OTEXT print PARM as passed
BAL R14,OPUTLINE write line
*
* loop over options ----------------------------------------
*
PARMPH1L CLI 0(R2),C'/' does option start with / ?
BNE PARMABO if != not
C R3,=F'5' at least 5 chars left ?
BL PARMABO if < not
BE OPTLOK if = exactly 5 char left
CLI 5(R2),C'/' does option end with / ?
BNE PARMABO if != not
*
* handle flags: /Oxxx,/GAUT,/TCOR -----
* R4 current option
* R5 current FLGTBL entry
* R6 ptr to flag
*
OPTLOK L R4,1(R2) load all 4 option bytes
LA R5,FLGTBL load ptr to FLGTBL
FLGLOOP L R6,0(R5) load ptr to flag
C R4,4(R5) does table entry match ?
BNE FLGNEXT if != not, try next table entry
MVI 0(R6),X'01' otherwise set flag
B PARMPH1N and try next option
FLGNEXT LA R5,8(R5) push ptr to next entry
LTR R6,R6 end tag X'80000000' seen ?
BNL FLGLOOP if >= not, keep going
*
* check for /T /D /E, accept and ignore them in phase 1
*
CLI 1(R2),C'T' is it /T ?
BE PARMPH1N if = yes, accept and next option
CLI 1(R2),C'D' is it /D ?
BE PARMPH1N if = yes, accept and next option
CLI 1(R2),C'E' is it /E ?
BE PARMPH1N if = yes, accept and next option
*
* handle /Cnnn -------------------------
* R4 ptr to current TDSCTBL entry
* R5 current TDSC
* R6 current tag text descriptor
* R7 current option (as Tnnn)
*
CLI 1(R2),C'C' is it /C ?
BNE OPTCDONE if != try next
L R7,1(R2) load all 4 option bytes
ICM R7,B'1000',CHART force leading byte to 'T'
*
L R4,=A(TDSCTBL) get head of TDSCTBL
OPTCLOOP L R5,0(R4) get next TDSC
USING TDSC,R5 declare TDSC base register
L R6,TTAGDSC get tag text descriptor
C R7,0(R6) does Tnnn option match tag ?
BNE OPTCNEXT if != not, try next
*
ST R5,GMULTDSC setup GMUL TDSC pointer
B PARMPH1N and consider option handled
*
DROP R5
*
OPTCNEXT LA R4,4(R4) push pointer to next TDSC
LTR R5,R5 end tag X'80000000' seen ?
BNL OPTCLOOP if >= not, keep going
B PARMABOT if here no test found, complain
*
* handle /Gxxx -------------------------
*
OPTCDONE CLI 1(R2),C'G' is it /G ?
BNE PARMABO if != is unknown option
*
OPTGNNN CLI 4(R2),C'K' is it /GnnK form ?
BE OPTGNNK
MVC GMULZONE+3(3),2(R2) get 3 digit, place 000nnn
B OPTGCNV
OPTGNNK MVC GMULZONE+1(2),2(R2) get 2 digit, place 0nn000
*
OPTGCNV LA R5,GMULZONE+1 setup digit check, data pointer
LA R6,1 increment
LA R7,GMULZONE+5 end pointer
OPTGLOOP CLI 0(R5),C'0' is char >= '0'
BL PARMABOD if < not
CLI 0(R5),C'9' is char <= '9'
BH PARMABOD if > not
BXLE R5,R6,OPTGLOOP and loop till end
*
PACK GMULPACK(8),GMULZONE zoned to packed
CVB R0,GMULPACK and packed to binary
LTR R0,R0 test result
BNE OPTGOK if =0 complain
L R1,MSGPGM0
B PARMABO1
OPTGOK ST R0,GMUL store GMUL
*
* now handle next option ---------------
*
PARMPH1N LA R2,5(R2) push to next option
S R3,=F'5' decrement rest length
BH PARMPH1L if >0 check next option
*
PARMPH1E L R14,PARMPHXL
BR R14
*
* bad PARM abort handling
*
PARMABOD L R1,MSGPDIG
B PARMABO1
PARMABOT L R1,MSGPTST
B PARMABO1
*
PARMABO L R1,MSGPBAD
PARMABO1 BAL R14,OTEXT print error message
LR R1,R3 get rest length
SLL R1,24 put length into bits 0-7
OR R1,R2 and rest address into bits 8-31
BAL R14,OTEXT print rest of PARM
BAL R14,OPUTLINE write line
MVI RC+3,X'10'
B EXIT quit with RC=16
*
PARMPHXL DS 1F R14 save area (for PARMPH*,CNFRD)
*
* --------------------------------------------------------------------
* PARMPH2: handle PARMs, phase 2, handle /Tnnn /Dnnn /Ennn ===========
* R2 PARM address
* R3 PARM length
*
PARMPH2 ST R14,PARMPHXL
*
L R2,ARGPTR get argument list pointer
L R2,0(R2) load PARM base address
LH R3,0(R2) load PARM length
LTR R3,R3 test length
BZ PARMPH2E if =0 no PARM specified
*
LA R2,2(R2) R2 points to 1st PARM char
*
* loop over options ----------------------------------------