kit

kit
git clone https://git.ryansepassi.com/git/kit.git
Log | Files | Refs | README

ibit_long_shift_var.c (713B)


      1 /* 64-bit shifts by a variable amount on `long`/`unsigned long`. Exercises the
      2  * 64-bit variable-shift register forms (LSLV/LSRV/ASRV on x-registers).
      3  * volatile on value and count keeps the register form live.
      4  *   u = 0x15 (21),  sh1 = 1:  u << 1 = 42 (logical left)
      5  *   v = 0x150 (336), sh3 = 3: v >> 3 = 42 (logical right, unsigned)
      6  *   s = -336,        sh3 = 3: s >> 3 = -42 (arithmetic right, signed)
      7  *   42 + 42 + (-42) = 42. */
      8 int test_main(void) {
      9   volatile unsigned long u = 0x15;
     10   volatile unsigned long v = 0x150;
     11   volatile long s = -336;
     12   volatile int sh1 = 1, sh3 = 3;
     13   long lsl = (long)(u << sh1);
     14   long lsr = (long)(v >> sh3);
     15   long asr = s >> sh3;
     16   return (int)(lsl + lsr + asr);
     17 }