﻿::  { i:i, i8:i8, i4:i4, i2:i2, i1:i1, u8:u8, u4:u4, u2:u2, u1:u1 }
::+ { j:i, j8:i8, j4:i4, j2:i2, j1:i1, v8:u8, v4:u4, v2:u2, v1:u1 }

bnot i
bnot i8
bnot i4
bnot i2
bnot i1
bnot u8
bnot u4
bnot u2
bnot u1

bnot Wrap(0x01u1) bor Wrap(0u4)
bnot Wrap(0x01u2) bor Wrap(0u4)
bnot Wrap(0x01u4) bor Wrap(0u4)
bnot Wrap(0x01i1) bor Wrap(0i4)
bnot Wrap(0x01i2) bor Wrap(0i4)
bnot Wrap(0x01i4) bor Wrap(0i4)

i  band j
i8 band j8
i4 band j4
i2 band j2
i1 band j1
u8 band v8
u4 band v4
u2 band v2
u1 band v1

i  bxor j
i8 bxor j8
i4 bxor j4
i2 bxor j2
i1 bxor j1
u8 bxor v8
u4 bxor v4
u2 bxor v2
u1 bxor v1

i  bor j
i8 bor j8
i4 bor j4
i2 bor j2
i1 bor j1
u8 bor v8
u4 bor v4
u2 bor v2
u1 bor v1

i  shl j8
i8 shl j8
i4 shl j8
i2 shl j8
i1 shl j8
u8 shl j8
u4 shl j8
u2 shl j8
u1 shl j8

i  shr j8
i8 shr j8
i4 shr j8
i2 shr j8
i1 shr j8
u8 shr j8
u4 shr j8
u2 shr j8
u1 shr j8

i  shru j8
i8 shru j8
i4 shru j8
i2 shru j8
i1 shru j8
u8 shru j8
u4 shru j8
u2 shru j8
u1 shru j8

i  shri j8
i8 shri j8
i4 shri j8
i2 shri j8
i1 shri j8
u8 shri j8
u4 shri j8
u2 shri j8
u1 shri j8

// Shift different values by several amounts.
`` S := [-1i8, 0, 1, 7, 8, 15, 16, 31, 32, 62, 63, 64, 1000 ];

+0ia shl S
+1ia shl S
-1ia shl S
+2ia shl S
-2ia shl S
0x7FFFFFFFFFFFFFFFia  shl S
-0x8000000000000000ia shl S
+0i8 shl S
+1i8 shl S
-1i8 shl S
+2i8 shl S
-2i8 shl S
0x7FFFFFFFFFFFFFFFi8 shl S
0x8000000000000000i8 shl S
+0i4 shl S
+1i4 shl S
-1i4 shl S
+2i4 shl S
-2i4 shl S
0x7FFFFFFFi4 shl S
0x80000000i4 shl S
+0i2 shl S
+1i2 shl S
-1i2 shl S
+2i2 shl S
-2i2 shl S
0x7FFFi2 shl S
0x8000i2 shl S
+0i1 shl S
+1i1 shl S
-1i1 shl S
+2i1 shl S
-2i1 shl S
0x7Fi1 shl S
0x80i1 shl S

+0ia shr S
+1ia shr S
-1ia shr S
+2ia shr S
-2ia shr S
0x7FFFFFFFFFFFFFFFia  shr S
-0x8000000000000000ia shr S
+0i8 shr S
+1i8 shr S
-1i8 shr S
+2i8 shr S
-2i8 shr S
0x7FFFFFFFFFFFFFFFi8 shr S
0x8000000000000000i8 shr S
+0i4 shr S
+1i4 shr S
-1i4 shr S
+2i4 shr S
-2i4 shr S
0x7FFFFFFFi4 shr S
0x80000000i4 shr S
+0i2 shr S
+1i2 shr S
-1i2 shr S
+2i2 shr S
-2i2 shr S
0x7FFFi2 shr S
0x8000i2 shr S
+0i1 shr S
+1i1 shr S
-1i1 shr S
+2i1 shr S
-2i1 shr S
0x7Fi1 shr S
0x80i1 shr S

+0ia shru S
+1ia shru S
-1ia shru S
+2ia shru S
-2ia shru S
0x7FFFFFFFFFFFFFFFia  shru S
-0x8000000000000000ia shru S
+0i8 shru S
+1i8 shru S
-1i8 shru S
+2i8 shru S
-2i8 shru S
0x7FFFFFFFFFFFFFFFi8 shru S
0x8000000000000000i8 shru S
+0i4 shru S
+1i4 shru S
-1i4 shru S
+2i4 shru S
-2i4 shru S
0x7FFFFFFFi4 shru S
0x80000000i4 shru S
+0i2 shru S
+1i2 shru S
-1i2 shru S
+2i2 shru S
-2i2 shru S
0x7FFFi2 shru S
0x8000i2 shru S
+0i1 shru S
+1i1 shru S
-1i1 shru S
+2i1 shru S
-2i1 shru S
0x7Fi1 shru S
0x80i1 shru S

+0ia shri S
+1ia shri S
-1ia shri S
+2ia shri S
-2ia shri S
0x7FFFFFFFFFFFFFFFia  shri S
-0x8000000000000000ia shri S
+0i8 shri S
+1i8 shri S
-1i8 shri S
+2i8 shri S
-2i8 shri S
0x7FFFFFFFFFFFFFFFi8 shri S
0x8000000000000000i8 shri S
+0i4 shri S
+1i4 shri S
-1i4 shri S
+2i4 shri S
-2i4 shri S
0x7FFFFFFFi4 shri S
0x80000000i4 shri S
+0i2 shri S
+1i2 shri S
-1i2 shri S
+2i2 shri S
-2i2 shri S
0x7FFFi2 shri S
0x8000i2 shri S
+0i1 shri S
+1i1 shri S
-1i1 shri S
+2i1 shri S
-2i1 shri S
0x7Fi1 shri S
0x80i1 shri S

0u8 shl S
1u8 shl S
2u8 shl S
0x7FFFFFFFFFFFFFFFu8 shl S
0x8000000000000000u8 shl S
0u4 shl S
1u4 shl S
2u4 shl S
0x7FFFFFFFu4 shl S
0x80000000u4 shl S
0u2 shl S
1u2 shl S
2u2 shl S
0x7FFFu2 shl S
0x8000u2 shl S
0u1 shl S
1u1 shl S
2u1 shl S
0x7Fu1 shl S
0x80u1 shl S

0u8 shr S
1u8 shr S
2u8 shr S
0x7FFFFFFFFFFFFFFFu8 shr S
0x8000000000000000u8 shr S
0u4 shr S
1u4 shr S
2u4 shr S
0x7FFFFFFFu4 shr S
0x80000000u4 shr S
0u2 shr S
1u2 shr S
2u2 shr S
0x7FFFu2 shr S
0x8000u2 shr S
0u1 shr S
1u1 shr S
2u1 shr S
0x7Fu1 shr S
0x80u1 shr S

0u8 shru S
1u8 shru S
2u8 shru S
0x7FFFFFFFFFFFFFFFu8 shru S
0x8000000000000000u8 shru S
0u4 shru S
1u4 shru S
2u4 shru S
0x7FFFFFFFu4 shru S
0x80000000u4 shru S
0u2 shru S
1u2 shru S
2u2 shru S
0x7FFFu2 shru S
0x8000u2 shru S
0u1 shru S
1u1 shru S
2u1 shru S
0x7Fu1 shru S
0x80u1 shru S

0u8 shri S
1u8 shri S
2u8 shri S
0x7FFFFFFFFFFFFFFFu8 shri S
0x8000000000000000u8 shri S
0u4 shri S
1u4 shri S
2u4 shri S
0x7FFFFFFFu4 shri S
0x80000000u4 shri S
0u2 shri S
1u2 shri S
2u2 shri S
0x7FFFu2 shri S
0x8000u2 shri S
0u1 shri S
1u1 shri S
2u1 shri S
0x7Fu1 shri S
0x80u1 shri S

`` B := true;
`` S := [ -2, -1, 0, 1, 2 ];
S->Map((B shl it, B shr it, B shru it, B shri it))

`` B := false;
S->Map((B shl it, B shr it, B shru it, B shri it))

// Constant shift amount.
`` I_s := [ 0ia, 1ia, -1ia, 2ia, -2ia, 0x7FFFFFFFFFFFFFFFia, -0x8000000000000000ia ];
`` I8s := [ 0i8, 1i8, -1i8, 2i8, -2i8, 0x7FFFFFFFFFFFFFFFi8,  0x8000000000000000i8 ];
`` I4s := [ 0i4, 1i4, -1i4, 2i4, -2i4, 0x7FFFFFFFi4, 0x80000000i4 ];
`` I2s := [ 0i2, 1i2, -1i2, 2i2, -2i2, 0x7FFFi2, 0x8000i2 ];
`` I1s := [ 0i1, 1i1, -1i1, 2i1, -2i1, 0x7Fi1, 0x80i1 ];
`` U8s := [ 0u8, 1u8, bnot 0u8, 2u8, bnot 1u8, 0x7FFFFFFFFFFFFFFFu8, 0x8000000000000000u8 ];
`` U4s := [ 0u4, 1u4, bnot 0u4, 2u4, bnot 1u4, 0x7FFFFFFFu4, 0x80000000u4 ];
`` U2s := [ 0u2, 1u2, bnot 0u2, 2u2, bnot 1u2, 0x7FFFu2, 0x8000u2 ];
`` U1s := [ 0u1, 1u1, bnot 0u1, 2u1, bnot 1u1, 0x7Fu1, 0x80u1 ];

I_s shl 0
I_s shl 1
I_s shl 7
I_s shl 15
I_s shl 31
I_s shl 62
I_s shl 63
I_s shl 64
I8s shl 0
I8s shl 1
I8s shl 7
I8s shl 15
I8s shl 31
I8s shl 62
I8s shl 63
I8s shl 64
I4s shl 0
I4s shl 1
I4s shl 7
I4s shl 15
I4s shl 31
I4s shl 32
I2s shl 0
I2s shl 1
I2s shl 7
I2s shl 15
I2s shl 16
I1s shl 0
I1s shl 1
I1s shl 7
I1s shl 8

I_s shr 0
I_s shr 1
I_s shr 7
I_s shr 15
I_s shr 31
I_s shr 62
I_s shr 63
I_s shr 64
I8s shr 0
I8s shr 1
I8s shr 7
I8s shr 15
I8s shr 31
I8s shr 62
I8s shr 63
I8s shr 64
I4s shr 0
I4s shr 1
I4s shr 7
I4s shr 15
I4s shr 31
I4s shr 32
I2s shr 0
I2s shr 1
I2s shr 7
I2s shr 15
I2s shr 16
I1s shr 0
I1s shr 1
I1s shr 7
I1s shr 8

I_s shru 0
I_s shru 1
I_s shru 7
I_s shru 15
I_s shru 31
I_s shru 62
I_s shru 63
I_s shru 64
I8s shru 0
I8s shru 1
I8s shru 7
I8s shru 15
I8s shru 31
I8s shru 62
I8s shru 63
I8s shru 64
I4s shru 0
I4s shru 1
I4s shru 7
I4s shru 15
I4s shru 31
I4s shru 32
I2s shru 0
I2s shru 1
I2s shru 7
I2s shru 15
I2s shru 16
I1s shru 0
I1s shru 1
I1s shru 7
I1s shru 8

I_s shri 0
I_s shri 1
I_s shri 7
I_s shri 15
I_s shri 31
I_s shri 62
I_s shri 63
I_s shri 64
I8s shri 0
I8s shri 1
I8s shri 7
I8s shri 15
I8s shri 31
I8s shri 62
I8s shri 63
I8s shri 64
I4s shri 0
I4s shri 1
I4s shri 7
I4s shri 15
I4s shri 31
I4s shri 32
I2s shri 0
I2s shri 1
I2s shri 7
I2s shri 15
I2s shri 16
I1s shri 0
I1s shri 1
I1s shri 7
I1s shri 8

U8s shl 0
U8s shl 1
U8s shl 7
U8s shl 15
U8s shl 31
U8s shl 62
U8s shl 63
U8s shl 64
U4s shl 0
U4s shl 1
U4s shl 7
U4s shl 15
U4s shl 31
U4s shl 32
U2s shl 0
U2s shl 1
U2s shl 7
U2s shl 15
U2s shl 16
U1s shl 0
U1s shl 1
U1s shl 7
U1s shl 8

U8s shr 0
U8s shr 1
U8s shr 7
U8s shr 15
U8s shr 31
U8s shr 62
U8s shr 63
U8s shr 64
U4s shr 0
U4s shr 1
U4s shr 7
U4s shr 15
U4s shr 31
U4s shr 32
U2s shr 0
U2s shr 1
U2s shr 7
U2s shr 15
U2s shr 16
U1s shr 0
U1s shr 1
U1s shr 7
U1s shr 8

U8s shru 0
U8s shru 1
U8s shru 7
U8s shru 15
U8s shru 31
U8s shru 62
U8s shru 63
U8s shru 64
U4s shru 0
U4s shru 1
U4s shru 7
U4s shru 15
U4s shru 31
U4s shru 32
U2s shru 0
U2s shru 1
U2s shru 7
U2s shru 15
U2s shru 16
U1s shru 0
U1s shru 1
U1s shru 7
U1s shru 8

U8s shri 0
U8s shri 1
U8s shri 7
U8s shri 15
U8s shri 31
U8s shri 62
U8s shri 63
U8s shri 64
U4s shri 0
U4s shri 1
U4s shri 7
U4s shri 15
U4s shri 31
U4s shri 32
U2s shri 0
U2s shri 1
U2s shri 7
U2s shri 15
U2s shri 16
U1s shri 0
U1s shri 1
U1s shri 7
U1s shri 8

// Test shifting getting clipped by int.MaxValue.
// REVIEW: These allocate a ton of memory. Be careful about adding any more.
``` M   := 0x7FFF_FFFFi8;
``` BigShifts := [ 0x7FFF_FC00i8, 0x7FFF_FC01i8, M - 1, M, M + 1 ];
``` XS := 1ia shl BigShifts;

// REVIEW: These show infinity in the baseline (as they should), but in RexlBench (.Net Framework),
// some show zero! And 0x7FFF_FC01 shows a truly bizarre result (1.1125369292536E-308)!
XS | CastR8(_)

XS shr M - 1
XS shr M
XS shr M + 1
