Thomas Munro writes:

> In various places we have int pageno = offset / (uint32) 1636, expanded
> from this macro (which calls the offset an xid):

It appears to depend on the context it is expanded in, as some of the
code must have gotten the segment number right:

,----[ ls -sh pg_multixact/members/ ]
| 256K 97E0
| [...]
| 256K A03B
|  24K A03C = -FFFF5FC4
|    0 FFFF5FC4
`----

> I don't really see how any uint32 value could produce such a pageno via
> that macro.  Even if called in an environment where (xid) is accidentally
> an int, the int / unsigned expression would convert it to unsigned first
> (unless (xid) is a bigger type like int64_t: by the rules of int promotion
> you'd get signed division in that case, hmm...).  But it's always called
> with a MultiXactOffset AKA uint32 variable.

I managed disassemble RecordNewMultiXact from the core dump using a
cross-binutils, and it reveals that the compiler[1] appears to have
indeed generated a signed division here.  I'm attaching a piece of C
code that does the same computation as the assembly (I think), as well
as the disassembly itself.

regards,
Andreas

Footnotes: 
[1]  Sun C 5.12 SunOS_sparc Patch 148917-07 2013/10/18, 64-bit

#include <stdint.h>
#include <stdio.h>
#include <stdlib.h>

uint32_t offset2page(uint32_t offset)
{
  uint64_t l0, i3, i5, i4, l6_1, l6_2, o2, o4, o1, o3;
  l0 = offset;
  i3 = 0x5fc3e800ULL;
  i5 = i3 ^ -375;
  i4 = (int32_t)l0;

  l6_1 = i4 * i5;
  o2 = l6_1 >> 32;
  o4 = l0 + o2;
  o1 = ((int32_t)o4) >> 10;
  o3 = ((int32_t)l0) >> 31;
  l6_2 = o1 - o3;
  return l6_2;
}

int main(int argc, char *argv[])
{
  uint32_t page = offset2page(atol(argv[1]));
  printf("page: %d\n", page);
  printf("segment: %04X\n", (int32_t)page/32);
  return 0;
}

RecordNewMultiXact:
   100112be8:   07 00 04 01     sethi  %hi(0x100400), %g3
   100112bec:   9d e3 bf 30     save  %sp, -208, %sp
   100112bf0:   82 10 e2 bd     or  %g3, 0x2bd, %g1
   100112bf4:   90 10 20 0e     mov  0xe, %o0
   100112bf8:   a5 36 20 00     srl  %i0, 0, %l2
   100112bfc:   9f 28 70 0c     sllx  %g1, 0xc, %o7
   100112c00:   a2 0c a7 ff     and  %l2, 0x7ff, %l1
   100112c04:   b9 3e a0 00     sra  %i2, 0, %i4
   100112c08:   b4 03 ed d8     add  %o7, 0xdd8, %i2
   100112c0c:   b1 36 60 00     srl  %i1, 0, %i0
   100112c10:   f0 23 a8 af     st  %i0, [ %sp + 0x8af ]
   100112c14:   b2 10 00 1b     mov  %i3, %i1
   100112c18:   40 08 1d 66     call  0x10031a1b0 ; LWLockAcquire
   100112c1c:   92 10 20 00     clr  %o1
   100112c20:   93 34 a0 0b     srl  %l2, 0xb, %o1
   100112c24:   90 10 00 1a     mov  %i2, %o0
   100112c28:   97 34 a0 00     srl  %l2, 0, %o3
   100112c2c:   7f ff f6 bd     call  0x100110720 ; SimpleLruReadPage
   100112c30:   94 10 20 01     mov  1, %o2
   100112c34:   fa 5e a0 00     ldx  [ %i2 ], %i5
   100112c38:   ab 3a 20 00     sra  %o0, 0, %l5
   100112c3c:   96 10 20 01     mov  1, %o3
   100112c40:   a9 2d 70 03     sllx  %l5, 3, %l4
   100112c44:   e0 5f 60 08     ldx  [ %i5 + 8 ], %l0
   100112c48:   a7 3c 60 00     sra  %l1, 0, %l3
   100112c4c:   ad 2c f0 02     sllx  %l3, 2, %l6
   100112c50:   da 5c 00 14     ldx  [ %l0 + %l4 ], %o5
   100112c54:   f0 23 40 16     st  %i0, [ %o5 + %l6 ]
   100112c58:   d8 5e a0 00     ldx  [ %i2 ], %o4
   100112c5c:   d4 5b 20 18     ldx  [ %o4 + 0x18 ], %o2
   100112c60:   d6 2a 80 15     stb  %o3, [ %o2 + %l5 ]
   100112c64:   40 08 1f 2d     call  0x10031a918 ; LWLockRelease
   100112c68:   90 10 20 0e     mov  0xe, %o0
   100112c6c:   90 10 20 0f     mov  0xf, %o0
   100112c70:   40 08 1d 50     call  0x10031a1b0 ; LWLockAcquire
   100112c74:   92 10 20 00     clr  %o1
   100112c78:   80 a7 20 00     cmp  %i4, 0
   100112c7c:   04 40 00 7c     ble,pn   %icc, 0x100112e6c
   100112c80:   90 07 3f ff     add  %i4, -1, %o0
   100112c84:   e0 03 a8 af     ld  [ %sp + 0x8af ], %l0
   100112c88:   37 17 f0 fa     sethi  %hi(0x5fc3e800), %i3
   100112c8c:   86 10 3f ff     mov  -1, %g3
   100112c90:   ba 1e fe 89     xor  %i3, -375, %i5
   100112c94:   d0 23 a8 b7     st  %o0, [ %sp + 0x8b7 ]
   100112c98:   a2 10 26 64     mov  0x664, %l1
   100112c9c:   c0 23 a8 b3     clr  [ %sp + 0x8b3 ]
   100112ca0:   37 10 1e 0b     sethi  %hi(0x40782c00), %i3
   100112ca4:   b9 3c 20 00     sra  %l0, 0, %i4
   100112ca8:   ac 4f 00 1d     mulx  %i4, %i5, %l6
   100112cac:   95 35 b0 20     srlx  %l6, 0x20, %o2
   100112cb0:   ba 10 26 63     mov  0x663, %i5
   100112cb4:   98 04 00 0a     add  %l0, %o2, %o4
   100112cb8:   b8 10 20 01     mov  1, %i4
   100112cbc:   93 3b 20 0a     sra  %o4, 0xa, %o1
   100112cc0:   97 3c 20 1f     sra  %l0, 0x1f, %o3
   100112cc4:   ac 22 40 0b     sub  %o1, %o3, %l6
   100112cc8:   89 2d a0 04     sll  %l6, 4, %g4
   100112ccc:   82 01 00 16     add  %g4, %l6, %g1
   100112cd0:   b1 28 60 02     sll  %g1, 2, %i0
   100112cd4:   84 26 00 01     sub  %i0, %g1, %g2
   100112cd8:   f0 03 a8 af     ld  [ %sp + 0x8af ], %i0
   100112cdc:   9f 28 a0 03     sll  %g2, 3, %o7
   100112ce0:   90 05 80 0f     add  %l6, %o7, %o0
   100112ce4:   a7 2a 20 02     sll  %o0, 2, %l3
   100112ce8:   a6 24 00 13     sub  %l0, %l3, %l3
   100112cec:   98 06 e1 11     add  %i3, 0x111, %o4
   100112cf0:   0b 14 07 82     sethi  %hi(0x501e0800), %g5
   100112cf4:   89 36 20 02     srl  %i0, 2, %g4
   100112cf8:   ae 01 63 45     add  %g5, 0x345, %l7
   100112cfc:   97 33 20 00     srl  %o4, 0, %o3
   100112d00:   82 49 00 0b     mulx  %g4, %o3, %g1
   100112d04:   9a 49 00 17     mulx  %g4, %l7, %o5
   100112d08:   91 30 70 20     srlx  %g1, 0x20, %o0
   100112d0c:   9e 21 00 08     sub  %g4, %o0, %o7
   100112d10:   8b 33 e0 01     srl  %o7, 1, %g5
   100112d14:   ae 02 00 05     add  %o0, %g5, %l7
   100112d18:   95 33 70 20     srlx  %o5, 0x20, %o2
   100112d1c:   9b 35 e0 04     srl  %l7, 4, %o5
   100112d20:   85 32 a0 07     srl  %o2, 7, %g2
   100112d24:   94 0b 7f f0     and  %o5, -16, %o2
   100112d28:   c4 23 a8 bf     st  %g2, [ %sp + 0x8bf ]
   100112d2c:   9f 35 e0 08     srl  %l7, 8, %o7
   100112d30:   80 a0 80 03     cmp  %g2, %g3
   100112d34:   96 02 80 0f     add  %o2, %o7, %o3
   100112d38:   99 2a e0 02     sll  %o3, 2, %o4
   100112d3c:   92 23 00 0b     sub  %o4, %o3, %o1
   100112d40:   96 0e 20 03     and  %i0, 3, %o3
   100112d44:   83 2a 60 03     sll  %o1, 3, %g1
   100112d48:   90 03 c0 01     add  %o7, %g1, %o0
   100112d4c:   8a 21 00 08     sub  %g4, %o0, %g5
   100112d50:   89 29 60 02     sll  %g5, 2, %g4
   100112d54:   ae 01 00 05     add  %g4, %g5, %l7
   100112d58:   af 2d e0 02     sll  %l7, 2, %l7
   100112d5c:   b1 32 e0 00     srl  %o3, 0, %i0
   100112d60:   94 05 e0 04     add  %l7, 4, %o2
   100112d64:   9b 2e 20 02     sll  %i0, 2, %o5
   100112d68:   98 02 80 0d     add  %o2, %o5, %o4
   100112d6c:   89 2a e0 03     sll  %o3, 3, %g4
   100112d70:   c8 23 a8 bb     st  %g4, [ %sp + 0x8bb ]
   100112d74:   b1 3b 20 00     sra  %o4, 0, %i0
   100112d78:   02 40 00 0a     be,pn   %icc, 0x100112da0
   100112d7c:   af 3d e0 00     sra  %l7, 0, %l7
   100112d80:   90 06 bf a8     add  %i2, -88, %o0
   100112d84:   93 3d a0 00     sra  %l6, 0, %o1
   100112d88:   97 34 a0 00     srl  %l2, 0, %o3
   100112d8c:   7f ff f6 65     call  0x100110720 ; SimpleLruReadPage
   100112d90:   94 10 20 01     mov  1, %o2
   100112d94:   ab 3a 20 00     sra  %o0, 0, %l5
   100112d98:   c6 03 a8 bf     ld  [ %sp + 0x8bf ], %g3
   100112d9c:   a9 2d 70 03     sllx  %l5, 3, %l4
   100112da0:   d2 5e bf a8     ldx  [ %i2 + -88 ], %o1
   100112da4:   89 3e 20 00     sra  %i0, 0, %g4
   100112da8:   98 10 20 ff     mov  0xff, %o4
   100112dac:   f0 06 60 00     ld  [ %i1 ], %i0
   100112db0:   a6 04 e0 01     inc  %l3
   100112db4:   ca 5a 60 08     ldx  [ %o1 + 8 ], %g5
   100112db8:   c1 6e 61 00     prefetch  [ %i1 + 0x100 ], #n_reads
   100112dbc:   c4 59 40 14     ldx  [ %g5 + %l4 ], %g2
   100112dc0:   f0 20 80 04     st  %i0, [ %g2 + %g4 ]
   100112dc4:   de 5e bf a8     ldx  [ %i2 + -88 ], %o7
   100112dc8:   ca 06 60 04     ld  [ %i1 + 4 ], %g5
   100112dcc:   b2 06 60 08     add  %i1, 8, %i1
   100112dd0:   d0 5b e0 08     ldx  [ %o7 + 8 ], %o0
   100112dd4:   de 03 a8 bb     ld  [ %sp + 0x8bb ], %o7
   100112dd8:   da 5a 00 14     ldx  [ %o0 + %l4 ], %o5
   100112ddc:   d2 03 40 17     ld  [ %o5 + %l7 ], %o1
   100112de0:   97 2b 00 0f     sll  %o4, %o7, %o3
   100112de4:   94 3a e0 00     xnor  %o3, 0, %o2
   100112de8:   b0 0a 40 0a     and  %o1, %o2, %i0
   100112dec:   89 29 40 0f     sll  %g5, %o7, %g4
   100112df0:   82 16 00 04     or  %i0, %g4, %g1
   100112df4:   c2 23 40 17     st  %g1, [ %o5 + %l7 ]
   100112df8:   de 5e bf a8     ldx  [ %i2 + -88 ], %o7
   100112dfc:   d0 5b e0 18     ldx  [ %o7 + 0x18 ], %o0
   100112e00:   f8 2a 00 15     stb  %i4, [ %o0 + %l5 ]
   100112e04:   d8 03 a8 b3     ld  [ %sp + 0x8b3 ], %o4
   100112e08:   ee 03 a8 af     ld  [ %sp + 0x8af ], %l7
   100112e0c:   9a 05 e0 01     add  %l7, 1, %o5
   100112e10:   da 23 a8 af     st  %o5, [ %sp + 0x8af ]
   100112e14:   94 03 20 01     add  %o4, 1, %o2
   100112e18:   d4 23 a8 b3     st  %o2, [ %sp + 0x8b3 ]
   100112e1c:   ae 02 80 10     add  %o2, %l0, %l7
   100112e20:   9b 35 e0 1f     srl  %l7, 0x1f, %o5
   100112e24:   98 1b 60 01     xor  %o5, 1, %o4
   100112e28:   96 20 00 0c     neg  %o4, %o3
   100112e2c:   92 0a c0 1d     and  %o3, %i5, %o1
   100112e30:   8a 02 60 01     add  %o1, 1, %g5
   100112e34:   88 1c c0 05     xor  %l3, %g5, %g4
   100112e38:   b1 31 20 00     srl  %g4, 0, %i0
   100112e3c:   82 20 00 18     neg  %i0, %g1
   100112e40:   d6 03 a8 b7     ld  [ %sp + 0x8b7 ], %o3
   100112e44:   85 30 70 3f     srlx  %g1, 0x3f, %g2
   100112e48:   9e 18 a0 01     xor  %g2, 1, %o7
   100112e4c:   ae 20 00 0f     neg  %o7, %l7
   100112e50:   80 a2 80 0b     cmp  %o2, %o3
   100112e54:   90 0d e0 01     and  %l7, 1, %o0
   100112e58:   9a 0d c0 11     and  %l7, %l1, %o5
   100112e5c:   ac 05 80 08     add  %l6, %o0, %l6
   100112e60:   a6 24 c0 0d     sub  %l3, %o5, %l3
   100112e64:   24 4f ff a2     ble,a   %icc, 0x100112cec
   100112e68:   f0 03 a8 af     ld  [ %sp + 0x8af ], %i0
   100112e6c:   b0 10 20 0f     mov  0xf, %i0
   100112e70:   40 08 1e aa     call  0x10031a918 ; LWLockRelease
   100112e74:   81 e8 00 00     restore 


-- 
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

Reply via email to