I have been reading through this from the bottom and hadn't seen any mention of the following:

At one shop I was in as a developer, we had a macro that would EX an MVC so that it would be variable.

We had a macro that depended on execution time arithmetic to do x MVCs and end with an EX of an MVC to take the place of an MVCL. We found that it was faster to do 4 MVCs than an MVCL. So if the length to be moved was greater than 1024 bytes, we did the MVCL, otherwise....

OTOH, at the last shop I was in, B and NOP instructions were modified by EX to make them NOP or B. And it seemed like this was the STD way to handle logic for switching from processing one type of record to another.

So here is the question for the hard core types: With z/Arch, might this cause a processor stall because of a cache line of code having been changed since that line was fetched? And how much of a delay could this cause?

-- Regards,
Steve Thompson
Make Mainframes Great Again
They use far less Electricity than Clouds and can do more work

On 8/4/2025 2:04 PM, Dan Greiner wrote:
As to my original query, I was wondering to what extent anyone might use EX (or 
EXRL) to alter the actual target instruction. Yves gave an intriguing reply 
where a value of 0, 1, or 2 in the R1 field of EX could alter its target 
instruction from SAM24, SAM31, or SAM64. In this case, it's clever and 
efficient. However, perhaps a more understandable technique might be to use EX 
with an index register that identified the actual instruction to be executed.

The CPU designers have a long love/hate relationship with execute-type 
instructions (tending towards hate). As to whether they and the architects 
envisioned that EX could be used to modify the target opcode ... undoubtedly 
they did. Perhaps they could have designed it such that if the R1 field 
modified a target opcode, an exception could be recognized ... but they didn't. 
I'm just trying to understand whether anyone (other than Yves) actually uses 
this.

As to the history of opcodes stretching beyond the first 8 bits: the original 
S/360 architecture had about 150 instructions defined, so there was room for 
another 100-or-so one byte opcodes to be defined without going beyond one byte. 
The first instance of opcodes creeping beyond bits 0-7 of the instruction 
showed up later in the S/360 architecture. Originally, the HALT IO (HIO) 
instruction  was defined as opcode 9E hex, with bits 8-15 reserved. Its opcode 
was subsequently redefined as 9E00 hex, and HALT DEVICE (HDV) was defined as 
9E01 hex.

It wasn't until the S/370 architecture (circa 1970) that major infestation of 
bits 8-15 occurred with the advent of the RRE-, S-, SSE-format instructions. 
The vast majority of these were privileged or semi-privileged instructions, 
with a few exceptions like SET SYSTEM MASK (SSM), STORE CLOCK (STCK), and TEST 
AND SET (TS) that were unprivileged. (SSM and TS were reclassified to S format 
from their original SI format in S/360).

370/XA (circa 1983) introduced the E-format instruction – an instruction format 
with just 16 bits of opcode and nothing else – for the UPDATE TREE (UPT) 
instruction (as if UPT was going to be coded so frequently that it warranted a 
special format to save code space ... not the brightest architecture IMHO).

Somewhere between ESA/370 and ESA/390, the immediate-and-relative-instruction 
facility came along that introduced the RIL format in which the opcode was 
split between bits 0-7 and 12-15. This provided significant enhancements with 
relative (to the PSW instruction address) storage operands and 16-bit immediate 
operands.

A bit later in the ESA/390 time frame came the RXE and RXF formats, a 6-byte instruction 
where the opcode was split between the first and last byte (i.e., bits 0-7 and 40-47). 
These were used for binary floating point instructions and for some z/Architecture ops 
that were retrofit to ESA/390. Also in later ESA/390 time frame came RSE and RSL formats 
with similar opcode split. These provided such "features" as COMPARE LOGICAL 
LONG UNICODE (CLCLU), MOVE LONG UNICODE (MVCLU), and ROTATE LEFT SINGLE LOGICAL (RLL).

z/Architecture flooded the architecture with gobs more instructions in which 
the opcode extended beyond bits 0-7.  For a great overview of the instruction 
formats, see Figure 5-1 in the latest PoO.

-- Regards,
Steve Thompson
Make Mainframes Great Again They use far less Electricity than Clouds and can do more work

Reply via email to