Robert --
That's quite astonishing. Which was the previous compiler, and were the target
and optimisation level set the same?
Best wishes / Mejores deseos / Meilleurs vœux
Ian ...
On Wednesday, August 20, 2025 at 08:50:53 PM GMT+2, Ngan, Robert
<[email protected]> wrote:
Speaking of optimizations, a while back I noticed the COBOL compiler generated
the following code to edit a PIC 9(4) BINARY value into a PIX ZZZZ9 field
MVC 496(6,R13),1851(R3) # TS2=119 +185
LLH R2,8(,R2) # U010-CO-ID
VCVD VRF16,R2,0x85,0
VUPKZ VRF16,1005(,R13),0x4 #
CDZT FP0,1005(5,R13),0x8 #
ESDTR R2,FP0
VL VRF17,2224(,R3),0 #
VL VRF18,2240(,R3),0 #
VLRL VRF20,1005(,R13),0x4 #
VGBM VRF19,0x0
VLEIB VRF19,0xf0,15
VO VRF20,VRF20,VRF19
VPERM VRF16,VRF17,VRF20,VRF18
LHI R4,0x5
VSTL VRF16,R4,496(,R13) # TS2=119
VREPIB VRF20,0x40
LLC R4,2256(R2,R3) #
LTR R4,R4
JE L0642
AHI R4,0xffff
VSTL VRF20,R4,497(,R13) # TS2=119
L0642: EQU *
L R2,108(,R8) # BLL_9
MVC 8(5,R2),497(R13) # U016-CO-ID-DISPLAY TS2=119
I thought "All those vector instructions are better than an a single ED? I'd
better learn what that's doing so I can use that technique myself".
Today, I decided to recompile the module to see if it generates better code
since I noticed some of the above code could be further optimized. Our current
COBOL 6.4 compiler generated:
MVC 536(6,R13),2403(R3) # TS2=119 +2403
LLH R2,8(,R2) # U010-CO-ID
CVD R2,1050(,R13) #
ED 536(6,R13),1055(R13) # TS2=119
L R2,88(,R8) # BLL_9
MVC 8(5,R2),537(R13) # U016-CO-ID-DISPLAY TS2=119
Robert Ngan
DXC Luxoft
-----Original Message-----
From: IBM Mainframe Assembler List <[email protected]> On Behalf
Of Ian Worthington
Sent: Wednesday, August 20, 2025 06:16
To: [email protected]
Subject: Re: Execute-Type Instructions
[Some people who received this message don't often get email from
[email protected]. Learn why this is important at
https://aka.ms/LearnAboutSenderIdentification ]
I had the opportunity a couple of years ago to do a deep dive into C/C++ (gcc)
optimisation, resulting from an incidence of integer overflow in a z/TPF C
segment. For those who are unfamiliar with the C language standardisation
backstory it seems that the original standards committee was tasked with
writing a language definition that encompassed all the different ways that
compilers of that time dealt with such matters as integer overflow. They did
this by the liberal use of such terms as "undefined" and "implementation
dependant", a situation which has lead to airline groundings and deaths,
amongst other things. Nothing quite so dramatic in our case, just a near
strike by a group travel booking office.
After fixing the immediate issue I took the opportunity to investigate what
could be done to remedy this situation more robustly, and implemented my own
arithmetic functions using C and gcc's inline assembler. As they stood, these
were horribly inefficient, but when gcc's level 3 optimisation stripped away
all of the function call overhead and what remained was only the arithmetic
operation, the CC check, and a conditional branch, just as if we had coded the
most optimal solution in line.
I came away with a deep respect for the optimisation routines.
> but all hardware enhancements> need to be translated into compiler code.
> Changing the compiler is tedious and laborious.
I did, out of curiosity, take a journey down the gcc optimisation pathway, but
came away bloodied and confused. It seemed, iirc, that there are both generic
optimisers and architecture-specific optimisers/code generators. In order to
add enhancements it is only necessary to modify the later (the gcc maintainers
will do this) and then programs may be recompiled at leisure. This seems a
much better solution than hand-modifying and retesting one's entire code base.
I am no fan of the C language "portable assembler", but came away from this
exercise mightily impressed with the capabilities of gcc.
(Should you want to know more, a write up, and a presentation deck, are
available at [snipped]
Best wishes / Mejores deseos / Meilleurs vœux
Ian ...
[snipped here and above to get under the posting line limit]