Added 2* 2/ LSHIFT and RSHIFT as primitives.

The reason to make them primitives are that shift operations are very
basic low level operations, available in all architectures in some form.
Use pattern guards to improve readability.

Code gets a bit denser and more succinct which improves readability.