﻿:: {g:g, v:v, o:o, s:s, b:b, d:d, qd:d?, qb:b?, n:n, qn:n?, r8:r8, qr8:r8?, r4:r4, qr4:r4?, i:i, qi:i?, i8:i8, qi8:i8?, i4:i4, qi4:i4?, i2:i2, qi2:i2?, i1:i1, qi1:i1?, u8:u8, qu8:u8?, u4:u4, qu4:u4?, u2:u2, qu2:u2?, u1:u1, qu1:u1?, t:t, qt:t?, r:{S:s,I4:i4}, qr:{S:s,I4:i4}?}

1 max 2
1 min 2
2 max 1
2 min 1
-10 max 20
-10 min 20

0x7FFFFFFF max 10
10 max 0x7FFFFFFF
0x7FFFFFFF min 10
10 min 0x7FFFFFFF

0xFFFFFFFF max 10
10 max 0xFFFFFFFF
0xFFFFFFFF min 10
10 min 0xFFFFFFFF

0xFFFFFFFFu max 10u
10u max 0xFFFFFFFFu
0xFFFFFFFFu min 10u
10u min 0xFFFFFFFFu

null max 10
10 max null
null min 10
10 min null

1.0 max 2
1.0 min 2
2 max 1.0
2 min 1.0

-0.0 max  0.0
-0.0 min  0.0
 0.0 max -0.0
 0.0 min -0.0
-0.0 max -0.0
-0.0 min -0.0

1e20 max 1e30
1e20 min 1e30

1 max 1/0
1 max -1/0
1 min 1/0
1 min -1/0

1 max 0/0
1 min 0/0
1 max -0/0
1 min -0/0

0/0 max 1/0
0/0 min 1/0
0/0 max -1/0
0/0 min -1/0

1/0 max -1/0
1/0 min -1/0

null max 4.5
null min 4.5

true max false
true min false

// REVIEW: 'min' is not the same as 'and' for b?.
null max false
null min false
null and false

// REVIEW: 'max' is not the same as 'or' for b?.
null min true
null max true
null or true

"hello" max "world"
"world" max "hello"
"hello" min "world"
"world" min "hello"

"hello" max "HELLO"
"HELLO" max "hello"
"hello" min "HELLO"
"HELLO" min "hello"

"" max "world"
"world" max ""
"" min "world"
"world" min ""

null max "world"
"world" max null
null min "world"
"world" min null

i1 max i4
i2 max i4
i4 max i4
i8 max i4
i  max i4
u1 max i4
u2 max i4
u4 max i4
u8 max i4
r4 max i4
r8 max i4
t  max i4
d  max i4
o  max i4
b  max i4
s  max i4
g  max i4

i1 max qi4
i2 max qi4
i4 max qi4
i8 max qi4
i  max qi4
u1 max qi4
u2 max qi4
u4 max qi4
u8 max qi4
r4 max qi4
r8 max qi4
t  max qi4
d  max qi4
o  max qi4
b  max qi4
s  max qi4
g  max qi4

i1 max r4
i2 max r4
i4 max r4
i8 max r4
i  max r4
u1 max r4
u2 max r4
u4 max r4
u8 max r4
r4 max r4
r8 max r4
t  max r4
d  max r4
o  max r4
b  max r4
s  max r4
g  max r4

i1 max qr4
i2 max qr4
i4 max qr4
i8 max qr4
i  max qr4
u1 max qr4
u2 max qr4
u4 max qr4
u8 max qr4
r4 max qr4
r8 max qr4
t  max qr4
d  max qr4
o  max qr4
b  max qr4
s  max qr4
g  max qr4

i1 max b
i2 max b
i4 max b
i8 max b
i  max b
u1 max b
u2 max b
u4 max b
u8 max b
r4 max b
r8 max b
t  max b
d  max b
o  max b
b  max b
s  max b
g  max b

i1 max qb
i2 max qb
i4 max qb
i8 max qb
i  max qb
u1 max qb
u2 max qb
u4 max qb
u8 max qb
r4 max qb
r8 max qb
t  max qb
d  max qb
o  max qb
b  max qb
s  max qb
g  max qb

i1 max s
i2 max s
i4 max s
i8 max s
i  max s
u1 max s
u2 max s
u4 max s
u8 max s
r4 max s
r8 max s
t  max s
d  max s
o  max s
s  max s
g  max s

i1 max d
i2 max d
i4 max d
i8 max d
i  max d
u1 max d
u2 max d
u4 max d
u8 max d
r4 max d
r8 max d
t  max d
d  max d
o  max d
s  max d
g  max d

i1 max t
i2 max t
i4 max t
i8 max t
i  max t
u1 max t
u2 max t
u4 max t
u8 max t
r4 max t
r8 max t
t  max t
d  max t
o  max t
s  max t
g  max t

r  max r
qr max qr
r  max qr
r  max g
qr max g
o  max o
v  max v
g  max g

i1 min i4
i2 min i4
i4 min i4
i8 min i4
i  min i4
u1 min i4
u2 min i4
u4 min i4
u8 min i4
r4 min i4
r8 min i4
t  min i4
d  min i4
o  min i4
b  min i4
s  min i4
g  min i4

i1 min qi4
i2 min qi4
i4 min qi4
i8 min qi4
i  min qi4
u1 min qi4
u2 min qi4
u4 min qi4
u8 min qi4
r4 min qi4
r8 min qi4
t  min qi4
d  min qi4
o  min qi4
b  min qi4
s  min qi4
g  min qi4

i1 min r4
i2 min r4
i4 min r4
i8 min r4
i  min r4
u1 min r4
u2 min r4
u4 min r4
u8 min r4
r4 min r4
r8 min r4
t  min r4
d  min r4
o  min r4
b  min r4
s  min r4
g  min r4

i1 min qr4
i2 min qr4
i4 min qr4
i8 min qr4
i  min qr4
u1 min qr4
u2 min qr4
u4 min qr4
u8 min qr4
r4 min qr4
r8 min qr4
t  min qr4
d  min qr4
o  min qr4
b  min qr4
s  min qr4
g  min qr4

i1 min b
i2 min b
i4 min b
i8 min b
i  min b
u1 min b
u2 min b
u4 min b
u8 min b
r4 min b
r8 min b
t  min b
d  min b
o  min b
b  min b
s  min b
g  min b

i1 min qb
i2 min qb
i4 min qb
i8 min qb
i  min qb
u1 min qb
u2 min qb
u4 min qb
u8 min qb
r4 min qb
r8 min qb
t  min qb
d  min qb
o  min qb
b  min qb
s  min qb
g  min qb

i1 min s
i2 min s
i4 min s
i8 min s
i  min s
u1 min s
u2 min s
u4 min s
u8 min s
r4 min s
r8 min s
t  min s
d  min s
o  min s
s  min s
g  min s

i1 min d
i2 min d
i4 min d
i8 min d
i  min d
u1 min d
u2 min d
u4 min d
u8 min d
r4 min d
r8 min d
t  min d
d  min d
o  min d
s  min d
g  min d

i1 min t
i2 min t
i4 min t
i8 min t
i  min t
u1 min t
u2 min t
u4 min t
u8 min t
r4 min t
r8 min t
t  min t
d  min t
o  min t
s  min t
g  min t

// Code coverage.
i4 min g

r  min r
qr min qr
r  min qr
r  min g
qr min g
o  min o
v  min v
g  min g

i8 max i8 + i8 min i8
i8 min i8 + i8 max i8
i8 max i8 + i8 max i8
i8 min i8 + i8 min i8

b max b and b min b
b min b and b max b
b max b and b max b
b min b and b min b

b max b or b min b
b min b or b max b
b max b or b max b
b min b or b min b

b or  b min b  or b
b or  b max b  or b
b and b min b and b
b and b max b and b

// *** Lifting
:: {g:g*, o:o*, s:s*, b:b*, d:d*, qb:b?*, n:n*, qn:n?*, r8:r8*, qr8:r8?*, r4:r4*, qr4:r4?*, i:i*, qi:i?*, i8:i8*, qi8:i8?*, i4:i4*, qi4:i4?*, i2:i2*, qi2:i2?*, i1:i1*, qi1:i1?*, u8:u8*, qu8:u8?*, u4:u4*, qu4:u4?*, u2:u2*, qu2:u2?*, u1:u1*, qu1:u1?*, t:t*}

i4 max 3
3 max i4
i4 min 3
3 min i4

null max i4
i4 max null
null min i4
i4 min null

r4 max 3
3 max r4
r4 min 3
3 min r4

b max true
true max b
b min true
true min b

s max "s"
"s" max s
s min "s"
"s" min s

i4  max i4
qi4 max qi4
r4  max r4
qr4 max qr4
b   max b
qb  max qb
s   max s
d   max d
t   max t

i4  min i4
qi4 min qi4
r4  min r4
qr4 min qr4
b   min b
qb  min qb
s   min s
d   min d
t   min t

// Precedence.
i4 ++ i8 max 17
