I would suggest that the reason for the moving of "IBM's" data is because of the I-Bank D-Bank cache issue (I think it is actually a processor-pipeline stall -- but I have not done this level of work since 1990 -- Yes, long before the CMOS G3 chips were announce in 1997).

What I have been doing to programs that do not have to be RENT but must become AMODE 31 is use the MF=L and MF=(E,???) formats where the List version of the macro is in "working storage" of the program (not GETMAINed, but right after the Register Save area).

This allows short instruction lengths and the PLIST is in a data area that can't be part of any instruction cache lines.

Regards,
Steve Thompson

On 08/01/2018 06:57 PM, Keith Moe wrote:
"(working storage or stack storage)"

I interpret this is mean storage that is being ALTERED, not CONSTANTS.  I would 
think that duplicate unchanged cache lines in the instruction and data caches 
would not have the same SERIOUS penalty as altering data would.  But I am not a 
hardware engineer nor do I know if this is true or not.

I've noticed that IBM has been changing many of their macros to generate fewer 
inline constants with branches around them and use more literals (which can 
sometime surprise you with unexpected addressability problems when the data 
suddenly move from being very local) presumably to reduce the double cache 
usage (with or without the move/copy penalty), but one of the most glaring 
mixture of instructions and data that is (potentially) updated are the CVTEXIT 
and CVTBRET instructions.  Programs invoked via system linkage have Register 14 
pointing to CVTEXIT.  The CVT is in the read/write nucleus and is not even 
cache line aligned!

Keith Moe
BMC Software, Inc.
--------------------------------------------
On Wed, 8/1/18, Charles Mills <[email protected]> wrote:

  Subject: Re: EQU * considered harmful
  To: [email protected]
  Date: Wednesday, August 1, 2018, 1:41 PM
"Avoid instructions
  (executable code) and operand data (working storage or stack storage)  in the 
same cache lines; which
  can
  be costly due to moving cache lines between the separated
  (split) local caches (instruction/data L1/L2)"
-- C. Kevin Shum,
  Distinguished Engineer, IBM z Systems Microprocessor
  Development (March 2016)
Charles -----Original Message-----
  From: IBM Mainframe Assembler List [mailto:[email protected]]
  On Behalf Of Keith Moe
  Sent: Wednesday,
  August 1, 2018 1:27 PM
  To: [email protected]
  Subject: Re: EQU * considered harmful
Inline data is only a killer
  if it is updated.  It is merely less efficient if it is
  read only (same cache line in instruction and data
  caches).
My example was
  merely to show that the "INSTRUCT" statement would
  force half word alignment.  Aside from macros that expand
  inline CONSTANTS (not updatable areas), I generally avoid
  mixing instructions and data.  Even in non-reentrant code
  (unfortunately there's a lot here that I have to
  maintain and it's not worth it to make it reentrant), I
  try to isolate code blocks and data blocks.
Keith Moe
  BMC
  Software, Inc.
  --------------------------------------------
  On Wed, 8/1/18, Charles Mills <[email protected]>
  wrote:
Subject: Re: EQU *
  considered harmful
   To: [email protected]
   Date: Wednesday, August 1, 2018, 1:05 PM
Well, one could argue
  that
   "DS" implies a variable, not
  instructions, and is
   therefore
  inappropriate as something on which to hang an
   instruction label.
I like
   the idea of some kind
  of "instruction" attribute
   for
  EQU, with an error if you branched to a non-instruction
   symbol. I think I might argue for an EQU
  operand rather than
   a new opcode, but that
  is a quibble.
    J      NEXTL
              DC
   CL(oddnumber)'
   '
NEXTL INSTRUCT You know
  that data mixed with instructions is
   just a
  performance KILLER on modern CPUs? They have separate
   i- and data caches, and mingling the two makes
  a mess that
   must be straightened out, at a
  cost of CPU cycles.
Charles

Reply via email to