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,345 of 117,927    |
|    Krishna Myneni to dxf    |
|    Re: D! and D@    |
|    24 Mar 24 08:04:06    |
      From: krishna.myneni@ccreweb.org              On 3/23/24 21:18, dxf wrote:       > On 24/03/2024 12:47 pm, Krishna Myneni wrote:       >> On 3/23/24 14:16, Krishna Myneni wrote:       >>> On 3/23/24 14:13, Krishna Myneni wrote:       >>> ...       >>>> I had need for DLSHIFT and DRSHIFT recently, and this is what I came up       with.       >>>>       >>>> \ u is the number of bits to shift       >>>> 1 cells 8 * constant BITS_PER_CELL       >>>> 0 value ubits       >>>>       >>>> : DLSHIFT ( ud u -- ud2 ) BITS_PER_CELL min 0 ?DO D2* LOOP ;       >>>> dup 0= IF drop EXIT THEN       >>>> BITS_PER_CELL min to ubits       >>>> ubits lshift swap       >>>> dup >r ubits msbits or       >>>> r> ubits lshift swap ;       >>>>       >>>> : DRSHIFT ( ud u -- ud2 )       >>>> dup 0= IF drop EXIT THEN       >>>> BITS_PER_CELL min to ubits       >>>> swap ubits rshift       >>>> swap dup >r ubits lsbits or       >>>> r> ubits rshift ;       >>>>       >>>> With x86, it should be possible to write efficient versions of DLSHIFT       and DRSHIFT using SHLD and SHRD instructions.       >>>>       >>>       >>> I left out the definitions of MSBITS and LSBITS (shown below):       >>>       >>> Return the u least significant bits of cell value u1       >>> \ as the most significant bits of u2       >>> : lsbits ( u1 u -- u2 )       >>> BITS_PER_CELL min       >>> BITS_PER_CELL - negate       >>> lshift ;       >>>       >>> \ Return the u most significant bits of cell value u1       >>> \ as the least significant bits of u2       >>> : msbits ( u1 u -- u2 )       >>> BITS_PER_CELL min       >>> BITS_PER_CELL - negate       >>> rshift ;       >>>       >>       >> Just realized that these versions of DRSHIFT and DLSHIFT are limited to       shift of 0 bits -- 1 cell width in bits, rather than the general shift count       of 0 bits -- 2 cells width in bits. They have to be modified for general use       on double length numbers.        Of course one can write the general shifts in terms of these by applying them       twice if needed.       >       > Indeed. I was expecting:       >       > : DLSHIFT ( ud u -- ud2 ) 0 ?DO D2* LOOP ;       >              I had considered coding D2* with a loop using D2* but thought it would       be faster to do it with LSHIFT and RSHIFT. In the end I will implement       it as an intrinsic word in assembly, using the SHLD instruction.              > DRSHIFT would require DU2/       >              Yes, but SHRD is more efficient, if it is available.              --       KM              --- 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