The S/360 architecture uses two's complement arithmetic, and that remains the 
case through z. Accordingly, signed and unsigned arithmetic are the same except 
for the condition code, except when sign extension is an issue, e.g., adding a 
word to a grande register..


--
Shmuel (Seymour J.) Metz
http://mason.gmu.edu/~smetz3

________________________________________
From: IBM Mainframe Assembler List [[email protected]] on behalf 
of Ian Worthington [[email protected]]
Sent: Thursday, April 14, 2022 9:04 AM
To: [email protected]
Subject: Signed/unsigned operations

I noticed today that GCC generates for:
static __uint32_t sumu32;  // unsigned int
static __uint64_t sumu64;  // unsigned long

void addStuff(__uint64_t a64, __uint64_t b64, __uint32_t a32, __uint32_t b32 ) {
    sumu32 = a32 + b32;
    sumu64 = a64 + b64;
}
the following:

117: ****     sumu32 = a32 + b32;
  77                      .loc 1 117 0
  78 0044 5810B1C4         l    %r1,452(%r11)    # sumu32.6, a32
  79 0048 5A10B1C0         a    %r1,448(%r11)    # sumu32.6, b32
  80 004c C41F0000         strl    %r1,sumu32    # sumu32.6, sumu32
  80      0000
 118: ****     sumu64 = a64 + b64;
  81                      .loc 1 118 0
  82 0052 E310B1D0         lg    %r1,464(%r11)    # sumu64.7, a64
  82      0004
  83 0058 E310B1C8         ag    %r1,456(%r11)    # sumu64.7, b64
  83      0008
  84 005e C41B0000         stgrl    %r1,sumu64    # sumu64.7, sumu64


Have I grossly misunderstood something there?  Can I really operate on an 
unsigned integer with signed operations and get the correct results?



Best wishes / Mejores deseos /  Meilleurs vœux

Ian ...

Reply via email to