Prepared by: | twisti on Fri Oct 23 11:28:31 PDT 2009 |
---|---|
Workspace: | /home/twisti/hotspot-comp/6893554 |
Compare against: | /home/twisti/hotspot-comp/hotspot |
Summary of changes: | 6 lines changed: 2 ins; 0 del; 4 mod; 9733 unchg |
Patch of changes: | 6893554.patch |
Author comments: |
The problem occurs with negative numbers, as the 32-bit input values are sign extended into the 64-bit registers. When doing: // x |= (x >> 1); // x |= (x >> 2); // x |= (x >> 4); // x |= (x >> 8); // x |= (x >> 16); // return (WORDBITS - popc(x)); __ srl(Rsrc, 1, Rtmp); __ or3(Rsrc, Rtmp, Rdst); <snip>the 32-bit logical right shift clears the upper 32 bits but the OR with the source value adds in the sign extended upper 32 bits again. This leads to a POPC value for e.g. -1 of 64 instead of 32. The fix is to zero-extend the 32-bit source value before applying the algorithm on it. Additionally two typos are fixed. |
Bug id: | Bug Database |
Legend: |
Modified file Deleted file New file |
Cdiffs
Udiffs
Sdiffs
Frames
Old
New
Patch
Raw
src/cpu/sparc/vm/sparc.ad
6 lines changed: 2 ins; 0 del; 4 mod; 9733 unchg
This code review page was prepared using /home/twisti/bin/webrev (vers 23.18-hg-never).