What terrible consequences?

PL/I is still going strong and IBM were one of the biggest users internally
when I worked for them.

ICI in the UK were big PL/I users too.

Apart from a lack of available programmers, I would prefer to program in
PL/I than COBOL.

On Mon, Dec 26, 2016 at 7:17 AM, Richard Pinion <[email protected]>
wrote:

> Reminds me of the horror stories of when IBM first released PL/I.  It was
> said to be the
> language to replace COBOL and FORTRAN.  Many companies converted their
> COBOL applications
> to the IBM's new PL/I.  Only to have terrible consequences.  Many of these
> companies
> reconverted back to COBOL.
>
>
>
> --- [email protected] wrote:
>
> From:         Robert Prins <[email protected]>
> To:           [email protected]
> Subject: A not very Christmassy PL/I tale
> Date:         Sun, 25 Dec 2016 19:40:55 +0000
>
> Hi all,
>
> Apologies for this rant on Christmas day...
>
> Let's assume you gate-crash an IBM GSE meeting, way back in 2010 and talk
> to an
> IBM developer about optimizing code, and he tells you that IBM is well
> ahead (by
> "at least" five years) of the Open Source community!
>
> So on this Christmas day you decide, having nothing better to do than to
> listen
> to your relatives blabbering away in Lithuanian, the language of your wife
> of
> fifteen years, but a language that you still do not speak, to look at some
> more
> code emitted by, admittedly not the latest and greatest of IBM's
> Enterprise PL/I
> compilers (V4.3.0), and compare that to the code of the long out-of-support
> V2.3.0 OS compiler.
>
> Now, you've already had, more than once, discussions with one of its
> lead-developers about the quality of code emitted by the EPLI backend after
> earlier remarks that it looks pretty bad, but with said developer having
> access
> to the latest technology, there's little you can put up against his
> arguments,
> although a claim that a loop to initialize a PL/I array is faster than
> using MVC
> or overlapping MVC on the latest z13 systems still makes you wonder.
>
> So in stead, lets look at some very simple PL/I code, a very frequently
> called
> routine that calculates average times based on two inputs, seconds and a
> divisor, which should result in some pretty simple assembler code.
>
> Here is the output of the compiler, and lets start with the code generated
> by
> the old OS compiler, and for what it's worth, w_hh and w_mm are defined
> externally as "fixed dec (3)"
>
> 3829   AVERAGE_TIME: PROC(SECONDS, N);
> 3830   DCL SECONDS    FIXED DEC  (15,6);
> 3831   DCL N          FIXED DEC     (5);
> 3833   DCL D          FIXED DEC     (9);
> 3834   DCL S          FIXED DEC  (15,6) INIT (SECONDS);
>
> 3841         W_HH       = TRUNC(SECONDS / (N * 3600));
> 3842         SECONDS    = SECONDS - W_HH * (N * 3600);
> 3843         W_MM       = TRUNC(SECONDS / (N * 60));
> 3844         SECONDS    = SECONDS - W_MM * (N * 60);
>
> And I've added this code, to help the compiler eliminate common
> sub-expressions,
> as the V2.3.0 compiler wasn't all that optimizing, especially for large
> programs, as indicated by these two messages:
>
> IEL0919I W 2105 VARIABLES IN PROGRAM. GLOBAL OPTIMIZATION PERFORMED FOR 255
> VARIABLES. LOCAL OPTIMIZATION PERFORMED ON REMAINDER.
> IEL0917I W    1 BLOCK CONTAINS 424 FLOW UNITS. GLOBAL OPTIMIZATION
> PERFORMED
> ONLY IN 'DO' GROUPS.
>
> 3847         D          = N * 3600;
> 3848         W_HH       = TRUNC(S / D);
> 3849         S          = S - W_HH * D;
> 3850         D          = N * 60;
> 3851         W_MM       = TRUNC(S / D);
> 3852         S          = S - W_MM * D;
>
> And what comes out, slightly edited (removal of spaces and flowing code on
> single lines) to show statement and generated code next to each other:
>
> 3841         W_HH       = TRUNC(SECONDS / (N * 3600));
> * STATEMENT NUMBER  3841
> 01D7E0  58 40 D 0D4        L     4,212(0,13)
> 01D7E4  F8 52 D 098 4 000  ZAP   WKSP.78+32(6),N(3)
> 01D7EA  FC 52 D 098 8 BDD  MP    WKSP.78+32(6),3037(3,8)
> 01D7F0  D2 05 D 128 D 098  MVC   296(6,13),WKSP.78+32
> 01D7F6  58 90 D 0D0        L     9,208(0,13)
> 01D7FA  F8 D7 D 098 9 000  ZAP   WKSP.78+32(14),SECONDS(8)
> 01D800  FD D5 D 098 D 128  DP    WKSP.78+32(14),296(6,13)
> 01D806  D2 07 D 12E D 098  MVC   302(8,13),WKSP.78+32
> 01D80C  58 70 6 0CC        L     7,204(0,6)
> 01D810  D2 01 7 57C D 131  MVC   LIFT_WORK.WT_AVG.W_HH(2),305(13)
> 01D816  D1 00 7 57D D 135  MVN   LIFT_WORK.WT_AVG.W_HH+1(1),309(13)
>
> 3842         SECONDS    = SECONDS - W_HH * (N * 3600);
> * STATEMENT NUMBER  3842
> 01D81C  F8 52 D 098 4 000  ZAP   WKSP.78+32(6),N(3)
> 01D822  FC 52 D 098 8 BDD  MP    WKSP.78+32(6),3037(3,8)
> 01D828  D2 05 D 128 D 098  MVC   296(6,13),WKSP.78+32
> 01D82E  F8 71 D 098 7 57C  ZAP   WKSP.78+32(8),LIFT_WORK.WT_AVG.W_HH(2)
> 01D834  FC 75 D 098 D 128  MP    WKSP.78+32(8),296(6,13)
> 01D83A  D2 07 D 12E D 098  MVC   302(8,13),WKSP.78+32
> 01D840  D2 07 D 098 D 12E  MVC   WKSP.78+32(8),302(13)
> 01D846  94 F0 D 09F        NI    WKSP.78+39,X'F0'
> 01D84A  D7 02 D 0A0 D 0A0  XC    WKSP.78+40(3),WKSP.78+40
> 01D850  D1 00 D 0A2 D 135  MVN   WKSP.78+42(1),309(13)
> 01D856  FB A7 D 098 9 000  SP    WKSP.78+32(11),SECONDS(8)
> 01D85C  F8 7A D 09B D 098  ZAP   WKSP.78+35(8),WKSP.78+32(11)
> 01D862  97 01 D 0A2        XI    WKSP.78+42,X'01'
> 01D866  D2 07 9 000 D 09B  MVC   SECONDS(8),WKSP.78+35
>
> 3843         W_MM       = TRUNC(SECONDS / (N * 60));
> * STATEMENT NUMBER  3843
> 01D86C  F8 42 D 098 4 000  ZAP   WKSP.78+32(5),N(3)
> 01D872  FC 41 D 098 8 91B  MP    WKSP.78+32(5),2331(2,8)
> 01D878  D2 04 D 128 D 098  MVC   296(5,13),WKSP.78+32
> 01D87E  F8 C7 D 098 9 000  ZAP   WKSP.78+32(13),SECONDS(8)
> 01D884  FD C4 D 098 D 128  DP    WKSP.78+32(13),296(5,13)
> 01D88A  D2 07 D 12D D 098  MVC   301(8,13),WKSP.78+32
> 01D890  D2 01 7 57F D 130  MVC   LIFT_WORK.WT_AVG.W_MM(2),304(13)
> 01D896  D1 00 7 580 D 134  MVN   LIFT_WORK.WT_AVG.W_MM+1(1),308(13)
>
> 3844         SECONDS    = SECONDS - W_MM * (N * 60);
> * STATEMENT NUMBER  3844
> 01D89C  F8 42 D 098 4 000  ZAP   WKSP.78+32(5),N(3)
> 01D8A2  FC 41 D 098 8 91B  MP    WKSP.78+32(5),2331(2,8)
> 01D8A8  D2 04 D 128 D 098  MVC   296(5,13),WKSP.78+32
> 01D8AE  F8 61 D 098 7 57F  ZAP   WKSP.78+32(7),LIFT_WORK.WT_AVG.W_MM(2)
> 01D8B4  FC 64 D 098 D 128  MP    WKSP.78+32(7),296(5,13)
> 01D8BA  D2 06 D 12D D 098  MVC   301(7,13),WKSP.78+32
> 01D8C0  D2 06 D 098 D 12D  MVC   WKSP.78+32(7),301(13)
> 01D8C6  94 F0 D 09E        NI    WKSP.78+38,X'F0'
> 01D8CA  D7 02 D 09F D 09F  XC    WKSP.78+39(3),WKSP.78+39
> 01D8D0  D1 00 D 0A1 D 133  MVN   WKSP.78+41(1),307(13)
> 01D8D6  FB 97 D 098 9 000  SP    WKSP.78+32(10),SECONDS(8)
> 01D8DC  F8 79 D 09A D 098  ZAP   WKSP.78+34(8),WKSP.78+32(10)
> 01D8E2  97 01 D 0A1        XI    WKSP.78+41,X'01'
> 01D8E6  D2 07 9 000 D 09A  MVC   SECONDS(8),WKSP.78+34
>
> 3847         D          = N * 3600;
> * STATEMENT NUMBER  3847
> 01D976  F8 52 D 098 4 000  ZAP   WKSP.78+32(6),N(3)
> 01D97C  FC 52 D 098 8 BDD  MP    WKSP.78+32(6),3037(3,8)
> 01D982  D2 04 D 0C0 D 099  MVC   D(5),WKSP.78+33
>
> 3848         W_HH       = TRUNC(S / D);
> * STATEMENT NUMBER  3848
> 01D988  F8 C7 D 098 D 0B8  ZAP   WKSP.78+32(13),S(8)
> 01D98E  FD C4 D 098 D 0C0  DP    WKSP.78+32(13),D(5)
> 01D994  D2 07 D 128 D 098  MVC   296(8,13),WKSP.78+32
> 01D99A  D2 01 7 57C D 12B  MVC   LIFT_WORK.WT_AVG.W_HH(2),299(13)
> 01D9A0  D1 00 7 57D D 12F  MVN   LIFT_WORK.WT_AVG.W_HH+1(1),303(13)
>
> 3849         S          = S - W_HH * D;
> * STATEMENT NUMBER  3849
> 01D9A6  F8 61 D 128 7 57C  ZAP   296(7,13),LIFT_WORK.WT_AVG.W_HH(2)
> 01D9AC  FC 64 D 128 D 0C0  MP    296(7,13),D(5)
> 01D9B2  D7 0A D 098 D 098  XC    WKSP.78+32(11),WKSP.78+32
> 01D9B8  D2 06 D 099 D 128  MVC   WKSP.78+33(7),296(13)
> 01D9BE  94 F0 D 09F        NI    WKSP.78+39,X'F0'
> 01D9C2  D1 00 D 0A2 D 12E  MVN   WKSP.78+42(1),302(13)
> 01D9C8  FB A7 D 098 D 0B8  SP    WKSP.78+32(11),S(8)
> 01D9CE  F8 7A D 09B D 098  ZAP   WKSP.78+35(8),WKSP.78+32(11)
> 01D9D4  97 01 D 0A2        XI    WKSP.78+42,X'01'
> 01D9D8  D2 07 D 0B8 D 09B  MVC   S(8),WKSP.78+35
>
> 3850         D          = N * 60;
> * STATEMENT NUMBER  3850
> 01D9DE  F8 42 D 0C0 4 000  ZAP   D(5),N(3)
> 01D9E4  FC 41 D 0C0 8 91B  MP    D(5),2331(2,8)
>
> 3851         W_MM       = TRUNC(S / D);
> * STATEMENT NUMBER  3851
> 01D9EA  F8 C7 D 098 D 0B8  ZAP   WKSP.78+32(13),S(8)
> 01D9F0  FD C4 D 098 D 0C0  DP    WKSP.78+32(13),D(5)
> 01D9F6  D2 07 D 128 D 098  MVC   296(8,13),WKSP.78+32
> 01D9FC  D2 01 7 57F D 12B  MVC   LIFT_WORK.WT_AVG.W_MM(2),299(13)
> 01DA02  D1 00 7 580 D 12F  MVN   LIFT_WORK.WT_AVG.W_MM+1(1),303(13)
>
> 3852         S          = S - W_MM * D;
> * STATEMENT NUMBER  3852
> 01DA08  F8 61 D 128 7 57F  ZAP   296(7,13),LIFT_WORK.WT_AVG.W_MM(2)
> 01DA0E  FC 64 D 128 D 0C0  MP    296(7,13),D(5)
> 01DA14  D7 0A D 098 D 098  XC    WKSP.78+32(11),WKSP.78+32
> 01DA1A  D2 06 D 099 D 128  MVC   WKSP.78+33(7),296(13)
> 01DA20  94 F0 D 09F        NI    WKSP.78+39,X'F0'
> 01DA24  D1 00 D 0A2 D 12E  MVN   WKSP.78+42(1),302(13)
> 01DA2A  FB A7 D 098 D 0B8  SP    WKSP.78+32(11),S(8)
> 01DA30  F8 7A D 09B D 098  ZAP   WKSP.78+35(8),WKSP.78+32(11)
> 01DA36  97 01 D 0A2        XI    WKSP.78+42,X'01'
> 01DA3A  D2 07 D 0B8 D 09B  MVC   S(8),WKSP.78+35
>
> L   :  3
> ZAP : 18
> MP  : 10
> MVC : 23
> DP  :  4
> MVN :  8
> NI  :  4
> XC  :  4
> XI  :  4
> SP  :  4
>       ---
>        82 instructions, 470 bytes of code
>
> And obviously common-subexpression elimination didn't make it, or, as the
> above
> messages indicated, the source was simply too complex, this is a procedure
> in a
> 13+K lines PL/I program.
>
> Jump forward two (or even more) decades to 2014-03-10, the version of
> Enterprise
> PL/I V4.3.0 on the system where this test was done, and weep?
>
> 11200.0  average_time: proc(seconds, n);
> 11201.0  dcl seconds    fixed   (15,6);
> 11202.0  dcl n          fixed      (5);
> 11205.0  dcl d          fixed      (9);
> 11206.0  dcl s          fixed   (15,6) init (seconds);
>
> 11216.0        w_hh       = trunc(seconds / (n * 3600));
> 11217.0        seconds    = seconds - w_hh * (n * 3600);
> 11218.0        w_mm       = trunc(seconds / (n * 60));
> 11219.0        seconds    = seconds - w_mm * (n * 60);
>
> 11224.0        d          = n * 3600;
> 11225.0        w_hh       = trunc(s / d);
> 11226.0        s          = s - w_hh * d;
> 11228.0        d          = n * 60;
> 11229.0        w_mm       = trunc(s / d);
> 11230.0        s          = s - w_mm * d;
>
> Note: despite some heavy editing (removing spaces) some lines below will
> quite
> likely still wrap, sorry about that. :(
>
>                              AVERAGE_TIME
> 00C0 D207 D188 D160 11216 | MVC #pd32554_16(8,r13,392),#
> pd20033_16(r13,352)
> 00C6 D202 D16B 2F80 11216 | MVC #pd34285_16(3,r13,363),+
> CONSTANT_AREA(r2,3968)
> 00CC D702 D168 D168 11216 | XC  #pd34285_16(3,r13,360),#
> pd34285_16(r13,360)
> 00D2 D202 D1AB 2F80 11217 | MVC #pd34287_16(3,r13,427),+
> CONSTANT_AREA(r2,3968)
> 00D8 FC52 D168 D158 11216 | MP  #pd34285_16(6,r13,360),#
> pd10660_16(3,r13,344)
> 00DE D205 D168 D168 11216 | MVC #pd34285_16(6,r13,360),#
> pd34285_16(r13,360)
> 00E4 F845 D170 D168 11216 | ZAP #pd20035_16(5,r13,368),#
> pd34285_16(6,r13,360)
> 00EA D204 D170 D170 11216 | MVC #pd20035_16(5,r13,368),#
> pd20035_16(r13,368)
> 00F0 F854 D178 D170 11216 | ZAP #pd20036_16(6,r13,376),#
> pd20035_16(5,r13,368)
> 00F6 D707 D180 D180 11216 | XC  #pd32554_16(8,r13,384),#
> pd32554_16(r13,384)
> 00FC D702 D199 D199 11216 | XC  #pd34286_16(3,r13,409),#
> pd34286_16(r13,409)
> 0102 FDF5 D180 D178 11216 | DP  #pd32554_16(16,r13,384),#
> pd20036_16(6,r13,376)
> 0108 A75A 3FC0      11216 | AHI r5,H'16320'
> 010C D208 D190 D181 11216 | MVC #pd20039_16(9,r13,400),#
> pd32554_16(r13,385)
> 0112 D205 D19C D190 11216 | MVC #pd34286_16(6,r13,412),#
> pd20039_16(r13,400)
> 0118 D702 D1A8 D1A8 11217 | XC  #pd34287_16(3,r13,424),#
> pd34287_16(r13,424)
> 011E D100 D1A1 D198 11216 | MVN #pd34286_16(1,r13,417),#
> pd20039_16(r13,408)
> 0124 D201 5444 D1A0 11216 | MVC W_HH(2,r5,1092),#pd34286_16(r13,416)
> 012A FC52 D1A8 4000 11217 | MP  #pd34287_16(6,r13,424),_shadow13(3,r4,0)
> 0130 D205 D1A8 D1A8 11217 | MVC #pd34287_16(6,r13,424),#
> pd34287_16(r13,424)
> 0136 F845 D1B0 D1A8 11217 | ZAP #pd34251_16(5,r13,432),#
> pd34287_16(6,r13,424)
> 013C F854 D1B8 D1B0 11217 | ZAP #pd34252_16(6,r13,440),#
> pd34251_16(5,r13,432)
> 0142 D205 D1C2 D1B8 11217 | MVC #pd20044_16(6,r13,450),#
> pd34252_16(r13,440)
> 0148 D701 D1C0 D1C0 11217 | XC  #pd20044_16(2,r13,448),#
> pd20044_16(r13,448)
> 014E FC71 D1C0 5444 11217 | MP  #pd20044_16(8,r13,448),W_HH(2,r5,1092)
> 0154 D207 D1C8 D1C0 11217 | MVC #pd20045_16(8,r13,456),#
> pd20044_16(r13,448)
> 015A D207 D1DF E000 11217 | MVC #pd20047_16(8,r13,479),_shadow11(r14,0)
> 0160 91F0 D1C8      11217 | TM  #pd20045_16(r13,456),240
> 0164 A784 0008      11217 | JE  @16L10461
> 0168 F070 D1C8 0001 11217 | SRP #pd20045_16(8,r13,456),1,0
> 016E F070 D1C8 0FFF 11217 | SRP #pd20045_16(8,r13,456),-1,0
> 0174                11217 |        @16L10461DS       0H
> 0174 D207 D1D0 D1C8 11217 | MVC #pd20046_16(8,r13,464),#
> pd20045_16(r13,456)
> 017A D100 D1DA D1CF 11217 | MVN #pd20046_16(1,r13,474),#
> pd20045_16(r13,463)
> 0180 D40A D1D0 2F84 11217 | NC  #pd20046_16(11,r13,464),+
> CONSTANT_AREA(r2,3972)
> 0186 D702 D1DC D1DC 11217 | XC  #pd20047_16(3,r13,476),#
> pd20047_16(r13,476)
> 018C FBAA D1DC D1D0 11217 | SP  #pd20047_16(11,r13,476),#
> pd20046_16(11,r13,464)
> 0192 F87A D1E8 D1DC 11217 | ZAP #pd10676_16(8,r13,488),#
> pd20047_16(11,r13,476)
> 0198 D207 E000 D1E8 11217 | MVC _shadow11(8,r14,0),#pd10676_16(r13,488)
> 019E D202 D1F2 4000 11218 | MVC #pd34288_16(3,r13,498),_shadow13(r4,0)
> 01A4 D701 D1F0 D1F0 11218 | XC  #pd34288_16(2,r13,496),#
> pd34288_16(r13,496)
> 01AA D207 D188 E000 11218 | MVC #pd32554_16(8,r13,392),_shadow11(r14,0)
> 01B0 FC41 D1F0 2E40 11218 | MP  #pd34288_16(5,r13,496),+
> CONSTANT_AREA(2,r2,3648)
> 01B6 D204 D1F0 D1F0 11218 | MVC #pd34288_16(5,r13,496),#
> pd34288_16(r13,496)
> 01BC F834 D1F8 D1F0 11218 | ZAP #pd20049_16(4,r13,504),#
> pd34288_16(5,r13,496)
> 01C2 D203 D1F8 D1F8 11218 | MVC #pd20049_16(4,r13,504),#
> pd20049_16(r13,504)
> 01C8 F843 D200 D1F8 11218 | ZAP #pd20050_16(5,r13,512),#
> pd20049_16(4,r13,504)
> 01CE D707 D180 D180 11218 | XC  #pd32554_16(8,r13,384),#
> pd32554_16(r13,384)
> 01D4 D702 D20E D20E 11218 | XC  #pd34289_16(3,r13,526),#
> pd34289_16(r13,526)
> 01DA FDF4 D180 D200 11218 | DP  #pd32554_16(16,r13,384),#
> pd20050_16(5,r13,512)
> 01E0 D208 D205 D182 11218 | MVC #pd20053_16(9,r13,517),#
> pd32554_16(r13,386)
> 01E6 D205 D211 D205 11218 | MVC #pd34289_16(6,r13,529),#
> pd20053_16(r13,517)
> 01EC D100 D216 D20D 11218 | MVN #pd34289_16(1,r13,534),#
> pd20053_16(r13,525)
> 01F2 D201 5447 D215 11218 | MVC W_MM(2,r5,1095),#pd34289_16(r13,533)
> 01F8 D202 D21A 4000 11219 | MVC #pd34290_16(3,r13,538),_shadow13(r4,0)
> 01FE D701 D218 D218 11219 | XC  #pd34290_16(2,r13,536),#
> pd34290_16(r13,536)
> 0204 FC41 D218 2E40 11219 | MP  #pd34290_16(5,r13,536),+
> CONSTANT_AREA(2,r2,3648)
> 020A D204 D218 D218 11219 | MVC #pd34290_16(5,r13,536),#
> pd34290_16(r13,536)
> 0210 F834 D220 D218 11219 | ZAP #pd34257_16(4,r13,544),#
> pd34290_16(5,r13,536)
> 0216 F843 D228 D220 11219 | ZAP #pd34258_16(5,r13,552),#
> pd34257_16(4,r13,544)
> 021C D204 D232 D228 11219 | MVC #pd20058_16(5,r13,562),#
> pd34258_16(r13,552)
> 0222 D701 D230 D230 11219 | XC  #pd20058_16(2,r13,560),#
> pd20058_16(r13,560)
> 0228 FC61 D230 5447 11219 | MP  #pd20058_16(7,r13,560),W_MM(2,r5,1095)
> 022E D207 D24C E000 11219 | MVC #pd20061_16(8,r13,588),_shadow11(r14,0)
> 0234 D206 D238 D230 11219 | MVC #pd20059_16(7,r13,568),#
> pd20058_16(r13,560)
> 023A 91F0 D238      11219 | TM  #pd20059_16(r13,568),240
> 023E A784 0008      11219 | JE  @16L10462
> 0242 F060 D238 0001 11219 | SRP #pd20059_16(7,r13,568),1,0
> 0248 F060 D238 0FFF 11219 | SRP #pd20059_16(7,r13,568),-1,0
> 024E                11219 |        @16L10462DS       0H
> 024E D206 D240 D238 11219 | MVC #pd20060_16(7,r13,576),#
> pd20059_16(r13,568)
> 0254 D100 D249 D23E 11219 | MVN #pd20060_16(1,r13,585),#
> pd20059_16(r13,574)
> 025A D409 D240 2F90 11219 | NC  #pd20060_16(10,r13,576),+
> CONSTANT_AREA(r2,3984)
> 0260 D701 D24A D24A 11219 | XC  #pd20061_16(2,r13,586),#
> pd20061_16(r13,586)
> 0266 FB99 D24A D240 11219 | SP  #pd20061_16(10,r13,586),#
> pd20060_16(10,r13,576)
> 026C F879 D258 D24A 11219 | ZAP #pd10691_16(8,r13,600),#
> pd20061_16(10,r13,586)
> 0272 D207 E000 D258 11219 | MVC _shadow11(8,r14,0),#pd10691_16(r13,600)
> 0348 D207 D188 D0D4 11225 | MVC #pd32554_16(8,r13,392),S(r13,212)
> 034E D202 D293 2F80 11224 | MVC #pd34293_16(3,r13,659),+
> CONSTANT_AREA(r2,3968)
> 0354 D702 D290 D290 11224 | XC  #pd34293_16(3,r13,656),#
> pd34293_16(r13,656)
> 035A D207 D2C7 D0D4 11226 | MVC #pd20080_16(8,r13,711),S(r13,212)
> 0360 FC52 D290 4000 11224 | MP  #pd34293_16(6,r13,656),_shadow13(3,r4,0)
> 0366 D205 D290 D290 11224 | MVC #pd34293_16(6,r13,656),#
> pd34293_16(r13,656)
> 036C F845 D298 D290 11224 | ZAP #pd34262_16(5,r13,664),#
> pd34293_16(6,r13,656)
> 0372 D204 D298 D298 11224 | MVC #pd34262_16(5,r13,664),#
> pd34262_16(r13,664)
> 0378 D204 D0C8 D298 11224 | MVC D(5,r13,200),#pd34262_16(r13,664)
> 037E D707 D180 D180 11225 | XC  #pd32554_16(8,r13,384),#
> pd32554_16(r13,384)
> 0384 D702 D2A6 D2A6 11225 | XC  #pd34294_16(3,r13,678),#
> pd34294_16(r13,678)
> 038A FDF4 D180 D0C8 11225 | DP  #pd32554_16(16,r13,384),D(5,r13,200)
> 0390 D701 D2B0 D2B0 11226 | XC  #pd20077_16(2,r13,688),#
> pd20077_16(r13,688)
> 0396 D208 D29D D182 11225 | MVC #pd20073_16(9,r13,669),#
> pd32554_16(r13,386)
> 039C D204 D2B2 D0C8 11226 | MVC #pd20077_16(5,r13,690),D(r13,200)
> 03A2 D205 D2A9 D29D 11225 | MVC #pd34294_16(6,r13,681),#
> pd20073_16(r13,669)
> 03A8 D100 D2AE D2A5 11225 | MVN #pd34294_16(1,r13,686),#
> pd20073_16(r13,677)
> 03AE D201 5444 D2AD 11225 | MVC W_HH(2,r5,1092),#pd34294_16(r13,685)
> 03B4 FC61 D2B0 5444 11226 | MP  #pd20077_16(7,r13,688),W_HH(2,r5,1092)
> 03BA D206 D2B8 D2B0 11226 | MVC #pd20079_16(7,r13,696),#
> pd20077_16(r13,688)
> 03C0 D202 D2DA 4000 11228 | MVC #pd34295_16(3,r13,730),_shadow13(r4,0)
> 03C6 D100 D2C1 D2B6 11226 | MVN #pd20079_16(1,r13,705),#
> pd20077_16(r13,694)
> 03CC D409 D2B8 2F90 11226 | NC  #pd20079_16(10,r13,696),+
> CONSTANT_AREA(r2,3984)
> 03D2 D702 D2C4 D2C4 11226 | XC  #pd20080_16(3,r13,708),#
> pd20080_16(r13,708)
> 03D8 FBA9 D2C4 D2B8 11226 | SP  #pd20080_16(11,r13,708),#
> pd20079_16(10,r13,696)
> 03DE F87A D2D0 D2C4 11226 | ZAP #pd10718_16(8,r13,720),#
> pd20080_16(11,r13,708)
> 03E4 D207 D0D4 D2D0 11226 | MVC S(8,r13,212),#pd10718_16(r13,720)
> 03EA D701 D2D8 D2D8 11228 | XC  #pd34295_16(2,r13,728),#
> pd34295_16(r13,728)
> 03F0 D207 D188 D0D4 11229 | MVC #pd32554_16(8,r13,392),S(r13,212)
> 03F6 FC41 D2D8 2E40 11228 | MP  #pd34295_16(5,r13,728),+
> CONSTANT_AREA(2,r2,3648)
> 03FC D204 D2D8 D2D8 11228 | MVC #pd34295_16(5,r13,728),#
> pd34295_16(r13,728)
> 0402 F834 D2E0 D2D8 11228 | ZAP #pd34265_16(4,r13,736),#
> pd34295_16(5,r13,728)
> 0408 D203 D2E0 D2E0 11228 | MVC #pd34265_16(4,r13,736),#
> pd34265_16(r13,736)
> 040E F843 D2E8 D2E0 11228 | ZAP #pd34266_16(5,r13,744),#
> pd34265_16(4,r13,736)
> 0414 D204 D0C8 D2E8 11228 | MVC D(5,r13,200),#pd34266_16(r13,744)
> 041A D707 D180 D180 11229 | XC  #pd32554_16(8,r13,384),#
> pd32554_16(r13,384)
> 0424 D207 D317 D0D4 11230 | MVC #pd20085_16(8,r13,791),S(r13,212)
> 042A FDF4 D180 D0C8 11229 | DP  #pd32554_16(16,r13,384),D(5,r13,200)
> 0430 D702 D2F6 D2F6 11229 | XC  #pd34296_16(3,r13,758),#
> pd34296_16(r13,758)
> 0436 D701 D300 D300 11230 | XC  #pd20082_16(2,r13,768),#
> pd20082_16(r13,768)
> 043C D208 D2ED D182 11229 | MVC #pd34271_16(9,r13,749),#
> pd32554_16(r13,386)
> 0442 D204 D302 D0C8 11230 | MVC #pd20082_16(5,r13,770),D(r13,200)
> 0448 D205 D2F9 D2ED 11229 | MVC #pd34296_16(6,r13,761),#
> pd34271_16(r13,749)
> 044E D100 D2FE D2F5 11229 | MVN #pd34296_16(1,r13,766),#
> pd34271_16(r13,757)
> 0454 D201 5447 D2FD 11229 | MVC W_MM(2,r5,1095),#pd34296_16(r13,765)
> 045A FC61 D300 5447 11230 | MP  #pd20082_16(7,r13,768),W_MM(2,r5,1095)
> 0460 D206 D308 D300 11230 | MVC #pd20084_16(7,r13,776),#
> pd20082_16(r13,768)
> 0466 D100 D311 D306 11230 | MVN #pd20084_16(1,r13,785),#
> pd20082_16(r13,774)
> 046C D409 D308 2F90 11230 | NC  #pd20084_16(10,r13,776),+
> CONSTANT_AREA(r2,3984)
> 0472 D702 D314 D314 11230 | XC  #pd20085_16(3,r13,788),#
> pd20085_16(r13,788)
> 0478 FBA9 D314 D308 11230 | SP  #pd20085_16(11,r13,788),#
> pd20084_16(10,r13,776)
> 047E F87A D320 D314 11230 | ZAP #pd10723_16(8,r13,800),#
> pd20085_16(11,r13,788)
> 0484 D207 D0D4 D320 11230 | MVC S(8,r13,212),#pd10723_16(r13,800)
>
> First thing that's noticable is that the code has become totally
> unreadable to
> those with only a little knowledge of z/OS assembly language, everything is
> #pdnnnnn and variable names are mostly gone and, hey, it looks like it's a
> bit
> longer, so lets count:
>
> ZAP : 15
> MP  : 10
> MVC : 52
> DP  :  4
> MVN :  8
> AHI :  1
> XC  : 22
> TM  :  2
> SP  :  4
> NC  :  4
> SRP :  4
> JE  :  2
>       ---
>       128 instructions, 758 bytes of code
>
> And the count, or rather the act of counting, immediately raises five
> very, very
> significant questions:
>
> 1) What is the performance of the old code on a new z13 system compared to
> the
> code that is now emitted?
>
> 2) There are still 10 MP instructions, and inspection of the code, which
> was
> compiled ARCH(10) OPT(3) (in other words, as optimal as possible on the
> hardware
> I have access to), reveals that Enterprise PL/I AD 2014 still doesn't seem
> to
> know anything about common sub-expression elimination.
>
> 2) Why the abso-eff-ing hell (sorry is these words cause some offence) are
> there
> two JE instructions in this code, as any conditional jump has the ability
> of
> causing significant stalls due to breaking the pipeline? We are
> TRUNCATING, not
> rounding!
>
> 4) Why the flucking 'ell does the added multiply of "n * 3600" take only
> three
> instructions using the OS compiler, but no less than 7 (seven, SEVEN,
> S*E*V*E*N!) using Enterprise PL/I. And the "n * 60" multiply is even
> worse, two
> versus eight!
>
> 5) Any compiler worth the adjective "Optimizing" knows about the underlying
> hardware, and this is what the POP tells me about the DP instruction:
>
> "The first operand (the dividend) is divided by the
> second operand (the divisor). The resulting quotient
> ***and*** remainder are placed at the first-operand
> location. The operands and results are in the
> packed format." (Emphasis added)
>
> So given that, and the fact that what I'm doing here is calculating both a
> quotient and a remainder, the compiler should be able to generate rather
> more
> efficient code, maybe anyone can code the same in C (on both z/OS and
> using GCC
> or MSVC) and see how that comes out. Or maybe the maintainers of PL/I
> should
> give some serious thought about a QUOTREM() builtin function...
>
> Hell, there are probably still posts on Google in
> news://comp.lang.pascal.borland dating back to the mid-1980'ies where
> people
> were told that retrieving DX after a "A DIV B" operation would give the
> remainder in just three bytes of code, and without having to do a
> multiply, as
> the x86 DIV instruction (and probably/possibly many others) exhibit
> exactly the
> same behaviour, in that both a quotient *and* remainder are calculated at
> the
> same time.
>
> I've been out of a job for many years, and don't expect to ever work
> again, the
> PL/I market, even here in Europe is small, and being in the second half of
> my
> fifties also doesn't really help, but some of you will be working at sites
> where
> PL/I is in use. Just do yourself and your employer/client a favour, have a
> look
> at what kind of code this compiler and its newer siblings generate, and
> then ask
> IBM why you are paying a large amount of money for a compiler that
> generates
> code that may well significantly negate the increased speed your latest
> shiny
> z13 system is supposed to deliver.
>
> It all brings back memories of <http://www.ncdm.com/bloat/bloat.htm>...
>
> Merry Christmas,
>
> Robert
>
> PS: I promise that in 2017, 25 years after I made it public (at least
> within
> Wills, Faber and Dumas) I'll post "RAP00100" and all of its companions,
> panels,
> skeletons, PL/I code and what have you @
> <http://prino.neocities.org/zOS/zOS%20Tools.html>, and I hope that some
> of you
> will be able to help me to make it capable of handling some of the more
> esoteric
> features of PL/I structures. *You* might even add a RAP00120 exec to handle
> COBOL, or a RAP00130 for C...
> --
> Robert AH Prins
> robert(a)prino(d)org
> A little bit of programming @ http://prino.neocities.org/
>
> ----------------------------------------------------------------------
> For IBM-MAIN subscribe / signoff / archive access instructions,
> send email to [email protected] with the message: INFO IBM-MAIN
>
>
>
>
> _____________________________________________________________
> Netscape.  Just the Net You Need.
>
> ----------------------------------------------------------------------
> For IBM-MAIN subscribe / signoff / archive access instructions,
> send email to [email protected] with the message: INFO IBM-MAIN
>



-- 
Wayne V. Bickerdike

----------------------------------------------------------------------
For IBM-MAIN subscribe / signoff / archive access instructions,
send email to [email protected] with the message: INFO IBM-MAIN

Reply via email to