Need to see more of the code before the function was invoked. What's
happening with key, where is it loaded etc.
On 25/07/2013 7:27 PM, Charles Mills wrote:
If anyone is better at this than I am and wants to bother with more
analysis, here is the LIST output of compiling the below. (Note that it is
inline, so here is where it is invoked.)
* int index = Utility::Ffs64(key);
LG r1,#SPILL0(,r13,448)
SRAG r0,r1,32
ST r0,valueToTest%33=>32(,r13,416)
ST r1,valueToTest%33=>32(,r13,420)
+ LG r0,valueToTest%33=>32(,r13,416)
+ LTGR r0,r0
+ LGR r14,r0
+ BNE @32L1392
LGHI r3,H'0'
B @32L1393
+@32L1392 DS 0H
L r1,ffs_ptr(,r6,908)
+ LTR r14,r14
+ BE @32L1395
+ ST r0,#MX_TEMP32(,r13,196)
+ LM r15,r0,&EPA_&WSA(r1,8)
+ ST r0,_CEECAA_(,r12,500)
+ LA r1,#MX_TEMP32(,r13,196)
+ BASR r14,r15
LGFR r3,r15
B @32L1393
+@32L1395 DS 0H
+ LM r15,r0,&EPA_&WSA(r1,8)
+ LGHI r2,H'0'
+ ST r0,_CEECAA_(,r12,500)
+ ST r2,#MX_TEMP32(,r13,196)
+ LA r1,#MX_TEMP32(,r13,196)
+ BASR r14,r15
+ AHI r15,H'32'
LGFR r3,r15
@32L1393 DS 0H
Charles
-----Original Message-----
From: IBM Mainframe Discussion List [mailto:IBM-MAIN@LISTSERV.UA.EDU] On
Behalf Of Charles Mills
Sent: Sunday, July 21, 2013 11:57 PM
To: IBM-MAIN@LISTSERV.UA.EDU
Subject: Re: Looking for help with an obscure C integer problem
Here is exact cut and paste with zero editing, complete with a typo in the
second comment. The code is unit tested on MS Visual Studio -- hence the two
#ifdef's.
// Find First Set
static inline int Ffs64(unsigned long long valueToTest)
{
// returns index of first set bit. Uses UNIX convention
where bit 1 is LSB of word for compatibilit with z/OS ffs()
static const unsigned long long lswMask =
0x00000000ffffffff;
// note Windows provides a _BitScanForward64() but I did it
this way to make it more z/OS-like for test purposes
// if we ever needed Windows efficiency, or if IBM provides
an ffs64(), then this should be re-written to take advantage
if ( valueToTest == 0 ) return 0;
unsigned int testWord;
testWord = valueToTest & lswMask;
if ( testWord != 0 )
{
// _BitScanForward returns base 0
#ifdef WIN32
unsigned long index;
_BitScanForward(&index, testWord);
return index+1;
#else
return ffs(testWord);
#endif
}
else
{
testWord = valueToTest >> 32;
#ifdef WIN32
unsigned long index;
_BitScanForward(&index, testWord);
return index+33;
#else
return ffs(testWord) + 32;
#endif
}
}
I have strong -- but not utterly conclusive; you know what debugging a
complex program is like -- that for the value I had in the OP --
0x0034000000000000? -- the method returns 32, implying that the final ffs()
was called with testWord = 0.
----------------------------------------------------------------------
For IBM-MAIN subscribe / signoff / archive access instructions,
send email to lists...@listserv.ua.edu with the message: INFO IBM-MAIN
----------------------------------------------------------------------
For IBM-MAIN subscribe / signoff / archive access instructions,
send email to lists...@listserv.ua.edu with the message: INFO IBM-MAIN