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 }