/*[ rol.c LOCAL CHAR SccsID[]="@(#)rol.c 1.5 02/09/94"; ROL CPU functions. ------------------ ]*/ #include #include #include #include #include #include #include #include #include #include #include #include /* ===================================================================== EXTERNAL FUNCTIONS START HERE. ===================================================================== */ /*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/ /* Generic - one size fits all 'rol'. */ /*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/ GLOBAL VOID ROL IFN3( IU32 *, pop1, /* pntr to dst/src operand */ IU32, op2, /* rotation count operand */ IUM8, op_sz /* 8, 16 or 32-bit */ ) { IU32 result; IU32 feedback; /* Bit posn to feed into Bit 0 */ ISM32 i; ISM32 new_of; /* only use lower five bits of count */ if ( (op2 &= 0x1f) == 0 ) return; /* ==== ================= |CF| <-- -- | | | | | | | | | <-- ==== | ================= | ------------------------ */ feedback = SZ2MSB(op_sz); for ( result = *pop1, i = 0; i < op2; i++ ) { if ( result & feedback ) { result = result << 1 | 1; SET_CF(1); } else { result <<= 1; SET_CF(0); } } /* OF = CF ^ MSB of result */ new_of = GET_CF() ^ (result & feedback) != 0; if ( op2 == 1 ) { SET_OF(new_of); } else { do_multiple_shiftrot_of(new_of); } *pop1 = result; /* Return answer */ }