Forums before death by AOL, social media and spammers... "We can't have nice things"
|    comp.lang.forth    |    Forth programmers eat a lot of Bratwurst    |    117,927 messages    |
[   << oldest   |   < older   |   list   |   newer >   |   newest >>   ]
|    Message 116,385 of 117,927    |
|    Hans Bezemer to Hans Bezemer    |
|    Re: DLSHIFT and DRSHIFT    |
|    01 Apr 24 18:03:03    |
      From: the.beez.speaks@gmail.com              On 01-04-2024 17:53, Hans Bezemer wrote:       > On 01-04-2024 03:22, dxf wrote:       >> On 30/03/2024 1:32 am, Hans Bezemer wrote:       >>> ...       >>> Can't make it any shorter than this. And no idea what happens with       >>> less robust LSHIFT or RSHIFT implementations. CELL-BITS should be       >>> most obvious, : SPIN SWAP ROT ; should fix most porting issues,       >>> replace ;THEN       >>> with EXIT THEN. It passes all tests.       >>>       >>> : dlshift       >>> dup 0> 0= if drop ;then       >>> >r over 0 invert cell-bits r@ - dup >r lshift and r> rshift swap       >>> r@ lshift or swap r> lshift swap       >>> ;       >>>       >>> : drshift       >>> dup 0> 0= if drop ;then       >>> >r dup 0 invert cell-bits r@ - dup >r rshift and r> lshift swap       >>> r@ rshift spin r> rshift or swap       >>> ;       >>       >> The table below shows the arguments (number and shift) presented to each       >> RSHIFT/LSHIFT in your double-shift algorithm using the 9 tests Krishna       >> provided.       >>       >> I've used a 32-bit forth in which RSHIFT/LSHIFT have been modified       >> such that       >> shifts greater than 31 bits will return 0 per the 'no ambiguous       >> conditions'       >> recommendation.       >>       >> -1 0 3 0 1 20 3 20 00 03       >>       >> -1 0 FF 0 0 20 FF 20 00 FF       >>       >> -1 0 1 0 1 20 0 20 01 00       >>       >> -1 0 FF 0 FF 20 0 20 FF 00       >>       >> -1 -20 0 -20 -1 40 -1 40 00 00       >>       >> -1 -20 0 -20 -1 40 -1 40 00 00       >>       >> -1 1 2 1 1 1F 3 1F       >>       >> -1 1F -80000000 1F 2 1 -80000000 1       >>       >> -1 1F 1 1F 3 1 7 1       >>       >> While your double-shift algorithm produces the correct results (not       >> shown here),       >> the intermediate values presented to each RSHIFT/LSHIFT can be quite       >> out-of-bounds       >> e.g. a shift of 40 and -20 (actually FFFFFFE0) would concern me. That       >> an 'unambiguous'       >> RSHIFT/LSHIFT will mask questionable parameters fed to it and return a       >> result of 0,       >> I for one find problematic. IMO it were better that RSHIFT/LSHIFT       >> should fail than       >> do this.       >       > This should fix it with minimal overhead:       >       > RSHIFT: dup cell-bits - dup 0< 0= if >r drop nip r> rshift 0 swap ;then       > drop       > LSHIFT: dup cell-bits - dup 0< 0= if >r drop drop r> lshift 0 ;then drop       >       > Moderately tested.       >       > Hans Bezemer       >              Darn, scrap that:              RSHIFT: dup cell-bits - dup 0< 0= if >r drop nip r> rshift 0 ;then drop       LSHIFT: dup cell-bits - dup 0< 0= if >r drop drop r> lshift 0 swap ;then       drop              Hans Bezemer              --- SoupGate-Win32 v1.05        * Origin: you cannot sedate... all the things you hate (1:229/2)    |
[   << oldest   |   < older   |   list   |   newer >   |   newest >>   ]
(c) 1994, bbs@darkrealms.ca