1*e4980870SAlexa VanHattum(model Imm64 (type (bv 64)))
2*e4980870SAlexa VanHattum
3*e4980870SAlexa VanHattum(model IntCC (enum
4*e4980870SAlexa VanHattum    (Equal #x00)
5*e4980870SAlexa VanHattum    (NotEqual #x01)
6*e4980870SAlexa VanHattum    (SignedGreaterThan #x02)
7*e4980870SAlexa VanHattum    (SignedGreaterThanOrEqual #x03)
8*e4980870SAlexa VanHattum    (SignedLessThan #x04)
9*e4980870SAlexa VanHattum    (SignedLessThanOrEqual #x05)
10*e4980870SAlexa VanHattum    (UnsignedGreaterThan #x06)
11*e4980870SAlexa VanHattum    (UnsignedGreaterThanOrEqual #x07)
12*e4980870SAlexa VanHattum    (UnsignedLessThan #x08)
13*e4980870SAlexa VanHattum    (UnsignedLessThanOrEqual #x09)))
14*e4980870SAlexa VanHattum
15*e4980870SAlexa VanHattum(spec (smin x y)
16*e4980870SAlexa VanHattum    (provide (= result (if (bvsle x y) x y))))
17*e4980870SAlexa VanHattum(instantiate smin bv_binary_8_to_64)
18*e4980870SAlexa VanHattum
19*e4980870SAlexa VanHattum(spec (umin x y)
20*e4980870SAlexa VanHattum    (provide (= result (if (bvule x y) x y))))
21*e4980870SAlexa VanHattum(instantiate umin bv_binary_8_to_64)
22*e4980870SAlexa VanHattum
23*e4980870SAlexa VanHattum(spec (smax x y)
24*e4980870SAlexa VanHattum    (provide (= result (if (bvsge x y) x y))))
25*e4980870SAlexa VanHattum(instantiate smax bv_binary_8_to_64)
26*e4980870SAlexa VanHattum
27*e4980870SAlexa VanHattum(spec (umax x y)
28*e4980870SAlexa VanHattum    (provide (= result (if (bvuge x y) x y))))
29*e4980870SAlexa VanHattum(instantiate umax bv_binary_8_to_64)
30*e4980870SAlexa VanHattum
31*e4980870SAlexa VanHattum(spec (iconst arg)
32*e4980870SAlexa VanHattum    (provide (= arg (zero_ext 64 result))))
33*e4980870SAlexa VanHattum(instantiate iconst
34*e4980870SAlexa VanHattum    ((args (bv 64)) (ret (bv 8)) (canon (bv 8)))
35*e4980870SAlexa VanHattum    ((args (bv 64)) (ret (bv 16)) (canon (bv 16)))
36*e4980870SAlexa VanHattum    ((args (bv 64)) (ret (bv 32)) (canon (bv 32)))
37*e4980870SAlexa VanHattum    ((args (bv 64)) (ret (bv 64)) (canon (bv 64)))
38*e4980870SAlexa VanHattum)
39*e4980870SAlexa VanHattum
40*e4980870SAlexa VanHattum(spec (bitselect c x y)
41*e4980870SAlexa VanHattum    (provide (= result (bvor (bvand c x) (bvand (bvnot c) y)))))
42*e4980870SAlexa VanHattum(instantiate bitselect bv_ternary_8_to_64)
43*e4980870SAlexa VanHattum
44*e4980870SAlexa VanHattum(spec (icmp c x y)
45*e4980870SAlexa VanHattum    (provide
46*e4980870SAlexa VanHattum        (= result
47*e4980870SAlexa VanHattum            (switch c
48*e4980870SAlexa VanHattum                ((IntCC.Equal) (if (= x y) #x01 #x00))
49*e4980870SAlexa VanHattum                ((IntCC.NotEqual) (if (not (= x y)) #x01 #x00))
50*e4980870SAlexa VanHattum                ((IntCC.SignedGreaterThan) (if (bvsgt x y) #x01 #x00))
51*e4980870SAlexa VanHattum                ((IntCC.SignedGreaterThanOrEqual) (if (bvsge x y) #x01 #x00))
52*e4980870SAlexa VanHattum                ((IntCC.SignedLessThan) (if (bvslt x y) #x01 #x00))
53*e4980870SAlexa VanHattum                ((IntCC.SignedLessThanOrEqual) (if (bvsle x y) #x01 #x00))
54*e4980870SAlexa VanHattum                ((IntCC.UnsignedGreaterThan) (if (bvugt x y) #x01 #x00))
55*e4980870SAlexa VanHattum                ((IntCC.UnsignedGreaterThanOrEqual) (if (bvuge x y) #x01 #x00))
56*e4980870SAlexa VanHattum                ((IntCC.UnsignedLessThan) (if (bvult x y) #x01 #x00))
57*e4980870SAlexa VanHattum                ((IntCC.UnsignedLessThanOrEqual) (if (bvule x y) #x01 #x00)))))
58*e4980870SAlexa VanHattum    (require
59*e4980870SAlexa VanHattum        ;; AVH TODO: if we understand enums semantically, we can generate this
60*e4980870SAlexa VanHattum        (or
61*e4980870SAlexa VanHattum            (= c (IntCC.Equal))
62*e4980870SAlexa VanHattum            (= c (IntCC.NotEqual))
63*e4980870SAlexa VanHattum            (= c (IntCC.UnsignedGreaterThanOrEqual))
64*e4980870SAlexa VanHattum            (= c (IntCC.UnsignedGreaterThan))
65*e4980870SAlexa VanHattum            (= c (IntCC.UnsignedLessThanOrEqual))
66*e4980870SAlexa VanHattum            (= c (IntCC.UnsignedLessThan))
67*e4980870SAlexa VanHattum            (= c (IntCC.SignedGreaterThanOrEqual))
68*e4980870SAlexa VanHattum            (= c (IntCC.SignedGreaterThan))
69*e4980870SAlexa VanHattum            (= c (IntCC.SignedLessThanOrEqual))
70*e4980870SAlexa VanHattum            (= c (IntCC.SignedLessThan)))))
71*e4980870SAlexa VanHattum(instantiate icmp
72*e4980870SAlexa VanHattum    ((args (bv 8) (bv 8) (bv 8)) (ret (bv 8)) (canon (bv 8)))
73*e4980870SAlexa VanHattum    ((args (bv 8) (bv 16) (bv 16)) (ret (bv 8)) (canon (bv 16)))
74*e4980870SAlexa VanHattum    ((args (bv 8) (bv 32) (bv 32)) (ret (bv 8)) (canon (bv 32)))
75*e4980870SAlexa VanHattum    ((args (bv 8) (bv 64) (bv 64)) (ret (bv 8)) (canon (bv 64)))
76*e4980870SAlexa VanHattum)
77*e4980870SAlexa VanHattum
78*e4980870SAlexa VanHattum(spec (iadd x y)
79*e4980870SAlexa VanHattum    (provide (= result (bvadd x y))))
80*e4980870SAlexa VanHattum(instantiate iadd bv_binary_8_to_64)
81*e4980870SAlexa VanHattum
82*e4980870SAlexa VanHattum(spec (isub x y)
83*e4980870SAlexa VanHattum    (provide (= result (bvsub x y))))
84*e4980870SAlexa VanHattum(instantiate isub bv_binary_8_to_64)
85*e4980870SAlexa VanHattum
86*e4980870SAlexa VanHattum(spec (ineg x)
87*e4980870SAlexa VanHattum    (provide (= result (bvneg x))))
88*e4980870SAlexa VanHattum(instantiate ineg bv_unary_8_to_64)
89*e4980870SAlexa VanHattum
90*e4980870SAlexa VanHattum(spec (iabs x)
91*e4980870SAlexa VanHattum    (provide (= result
92*e4980870SAlexa VanHattum                (if (bvsge x (conv_to (widthof x) #x0000000000000000))
93*e4980870SAlexa VanHattum                    x
94*e4980870SAlexa VanHattum                    (bvneg x)))))
95*e4980870SAlexa VanHattum(instantiate iabs bv_unary_8_to_64)
96*e4980870SAlexa VanHattum
97*e4980870SAlexa VanHattum(spec (imul x y)
98*e4980870SAlexa VanHattum    (provide (= result (bvmul x y))))
99*e4980870SAlexa VanHattum(instantiate imul bv_binary_8_to_64)
100*e4980870SAlexa VanHattum
101*e4980870SAlexa VanHattum(spec (udiv x y)
102*e4980870SAlexa VanHattum    (provide (= result (bvudiv x y)))
103*e4980870SAlexa VanHattum    (require (not (= y (zero_ext (widthof y) #b0)))))
104*e4980870SAlexa VanHattum(instantiate udiv bv_binary_8_to_64)
105*e4980870SAlexa VanHattum
106*e4980870SAlexa VanHattum(spec (sdiv x y)
107*e4980870SAlexa VanHattum    (provide (= result (bvsdiv x y)))
108*e4980870SAlexa VanHattum    (require (not (= y (zero_ext (widthof y) #b0)))))
109*e4980870SAlexa VanHattum(instantiate sdiv bv_binary_8_to_64)
110*e4980870SAlexa VanHattum
111*e4980870SAlexa VanHattum(spec (urem x y)
112*e4980870SAlexa VanHattum    (provide (= result (bvurem x y)))
113*e4980870SAlexa VanHattum    (require (not (= y (zero_ext (widthof y) #b0)))))
114*e4980870SAlexa VanHattum(instantiate urem bv_binary_8_to_64)
115*e4980870SAlexa VanHattum
116*e4980870SAlexa VanHattum(spec (srem x y)
117*e4980870SAlexa VanHattum    (provide (= result (bvsrem x y)))
118*e4980870SAlexa VanHattum    (require (not (= y (zero_ext (widthof y) #b0)))))
119*e4980870SAlexa VanHattum(instantiate srem bv_binary_8_to_64)
120*e4980870SAlexa VanHattum
121*e4980870SAlexa VanHattum(spec (imul_imm x y)
122*e4980870SAlexa VanHattum    (provide (= result (bvmul (sign_ext 64 x) y))))
123*e4980870SAlexa VanHattum
124*e4980870SAlexa VanHattum(spec (band x y)
125*e4980870SAlexa VanHattum    (provide (= result (bvand x y))))
126*e4980870SAlexa VanHattum(instantiate band bv_binary_8_to_64)
127*e4980870SAlexa VanHattum
128*e4980870SAlexa VanHattum(spec (bor x y)
129*e4980870SAlexa VanHattum    (provide (= result (bvor x y))))
130*e4980870SAlexa VanHattum(instantiate bor bv_binary_8_to_64)
131*e4980870SAlexa VanHattum
132*e4980870SAlexa VanHattum(spec (bxor x y)
133*e4980870SAlexa VanHattum    (provide (= result (bvxor x y))))
134*e4980870SAlexa VanHattum(instantiate bxor bv_binary_8_to_64)
135*e4980870SAlexa VanHattum
136*e4980870SAlexa VanHattum(spec (bnot x)
137*e4980870SAlexa VanHattum    (provide (= result (bvnot x)))
138*e4980870SAlexa VanHattum    (require (or (= (widthof x) 8) (= (widthof x) 16) (= (widthof x) 32) (= (widthof x) 64))))
139*e4980870SAlexa VanHattum(instantiate bnot bv_unary_8_to_64)
140*e4980870SAlexa VanHattum
141*e4980870SAlexa VanHattum(spec (band_not x y)
142*e4980870SAlexa VanHattum    (provide (= result (bvand x (bvnot y)))))
143*e4980870SAlexa VanHattum(instantiate band_not bv_binary_8_to_64)
144*e4980870SAlexa VanHattum
145*e4980870SAlexa VanHattum(spec (rotl x y)
146*e4980870SAlexa VanHattum    (provide (= result (rotl x y))))
147*e4980870SAlexa VanHattum(instantiate rotl bv_binary_8_to_64)
148*e4980870SAlexa VanHattum
149*e4980870SAlexa VanHattum(spec (rotr x y)
150*e4980870SAlexa VanHattum    (provide (= result (rotr x y))))
151*e4980870SAlexa VanHattum(instantiate rotr bv_binary_8_to_64)
152*e4980870SAlexa VanHattum
153*e4980870SAlexa VanHattum;; fn shift_mask(&mut self, ty: Type) -> ImmLogic {
154*e4980870SAlexa VanHattum;;     let mask = (ty.lane_bits() - 1) as u64;
155*e4980870SAlexa VanHattum;;     ImmLogic::maybe_from_u64(mask, I32).unwrap()
156*e4980870SAlexa VanHattum;; }
157*e4980870SAlexa VanHattum(spec (ishl x y)
158*e4980870SAlexa VanHattum    (provide
159*e4980870SAlexa VanHattum        (= result
160*e4980870SAlexa VanHattum           (bvshl x
161*e4980870SAlexa VanHattum                  (bvand (conv_to (widthof y) (bvsub (int2bv 64 (widthof y))
162*e4980870SAlexa VanHattum                                                     #x0000000000000001))
163*e4980870SAlexa VanHattum                         y)))))
164*e4980870SAlexa VanHattum(instantiate ishl bv_binary_8_to_64)
165*e4980870SAlexa VanHattum
166*e4980870SAlexa VanHattum(spec (ushr x y)
167*e4980870SAlexa VanHattum    (provide
168*e4980870SAlexa VanHattum        (= result
169*e4980870SAlexa VanHattum           (bvlshr x
170*e4980870SAlexa VanHattum                  (bvand (conv_to (widthof y) (bvsub (int2bv 64 (widthof y))
171*e4980870SAlexa VanHattum                                                     #x0000000000000001))
172*e4980870SAlexa VanHattum                         y)))))
173*e4980870SAlexa VanHattum(instantiate ushr bv_binary_8_to_64)
174*e4980870SAlexa VanHattum
175*e4980870SAlexa VanHattum(spec (sshr x y)
176*e4980870SAlexa VanHattum    (provide
177*e4980870SAlexa VanHattum        (= result
178*e4980870SAlexa VanHattum           (bvashr x
179*e4980870SAlexa VanHattum                  (bvand (conv_to (widthof y) (bvsub (int2bv 64 (widthof y))
180*e4980870SAlexa VanHattum                                                     #x0000000000000001))
181*e4980870SAlexa VanHattum                         y)))))
182*e4980870SAlexa VanHattum(instantiate sshr bv_binary_8_to_64)
183*e4980870SAlexa VanHattum
184*e4980870SAlexa VanHattum(spec (clz x)
185*e4980870SAlexa VanHattum    (provide (= result (clz x))))
186*e4980870SAlexa VanHattum(instantiate clz bv_unary_8_to_64)
187*e4980870SAlexa VanHattum
188*e4980870SAlexa VanHattum(spec (cls x)
189*e4980870SAlexa VanHattum    (provide (= result (cls x))))
190*e4980870SAlexa VanHattum(instantiate cls bv_unary_8_to_64)
191*e4980870SAlexa VanHattum
192*e4980870SAlexa VanHattum(spec (ctz x)
193*e4980870SAlexa VanHattum    (provide (= result (clz (rev x)))))
194*e4980870SAlexa VanHattum(instantiate ctz bv_unary_8_to_64)
195*e4980870SAlexa VanHattum
196*e4980870SAlexa VanHattum(spec (popcnt x)
197*e4980870SAlexa VanHattum    (provide (= result (popcnt x))))
198*e4980870SAlexa VanHattum(instantiate popcnt bv_unary_8_to_64)
199*e4980870SAlexa VanHattum
200*e4980870SAlexa VanHattum(form extend
201*e4980870SAlexa VanHattum    ((args (bv 8)) (ret (bv 8)) (canon (bv 8)))
202*e4980870SAlexa VanHattum    ((args (bv 8)) (ret (bv 16)) (canon (bv 8)))
203*e4980870SAlexa VanHattum    ((args (bv 8)) (ret (bv 32)) (canon (bv 8)))
204*e4980870SAlexa VanHattum    ((args (bv 8)) (ret (bv 64)) (canon (bv 8)))
205*e4980870SAlexa VanHattum    ((args (bv 16)) (ret (bv 16)) (canon (bv 16)))
206*e4980870SAlexa VanHattum    ((args (bv 16)) (ret (bv 32)) (canon (bv 16)))
207*e4980870SAlexa VanHattum    ((args (bv 16)) (ret (bv 64)) (canon (bv 16)))
208*e4980870SAlexa VanHattum    ((args (bv 32)) (ret (bv 32)) (canon (bv 32)))
209*e4980870SAlexa VanHattum    ((args (bv 32)) (ret (bv 64)) (canon (bv 32)))
210*e4980870SAlexa VanHattum    ((args (bv 64)) (ret (bv 64)) (canon (bv 64)))
211*e4980870SAlexa VanHattum)
212*e4980870SAlexa VanHattum
213*e4980870SAlexa VanHattum(spec (uextend x)
214*e4980870SAlexa VanHattum    (provide (= result (zero_ext (widthof result) x))))
215*e4980870SAlexa VanHattum(instantiate uextend extend)
216*e4980870SAlexa VanHattum
217*e4980870SAlexa VanHattum(spec (sextend x)
218*e4980870SAlexa VanHattum    (provide (= result (sign_ext (widthof result) x))))
219*e4980870SAlexa VanHattum(instantiate sextend extend)
220*e4980870SAlexa VanHattum
221*e4980870SAlexa VanHattum
222*e4980870SAlexa VanHattum(form load
223*e4980870SAlexa VanHattum    ((args (bv 16) (bv 64) (bv 32)) (ret (bv 8)) (canon (bv 8)))
224*e4980870SAlexa VanHattum    ((args (bv 16) (bv 64) (bv 32)) (ret (bv 16)) (canon (bv 16)))
225*e4980870SAlexa VanHattum    ((args (bv 16) (bv 64) (bv 32)) (ret (bv 32)) (canon (bv 32)))
226*e4980870SAlexa VanHattum    ((args (bv 16) (bv 64) (bv 32)) (ret (bv 64)) (canon (bv 64)))
227*e4980870SAlexa VanHattum)
228*e4980870SAlexa VanHattum(spec (load flags val offset)
229*e4980870SAlexa VanHattum    (provide
230*e4980870SAlexa VanHattum       (= result (load_effect flags (widthof result) (bvadd val (sign_ext 64 offset))))))
231*e4980870SAlexa VanHattum(instantiate load load)
232*e4980870SAlexa VanHattum
233*e4980870SAlexa VanHattum(form store
234*e4980870SAlexa VanHattum    ((args (bv 16) (bv 8) (bv 64) (bv 32)) (ret Unit) (canon (bv 8)))
235*e4980870SAlexa VanHattum    ((args (bv 16) (bv 16) (bv 64) (bv 32)) (ret Unit) (canon (bv 16)))
236*e4980870SAlexa VanHattum    ((args (bv 16) (bv 32) (bv 64) (bv 32)) (ret Unit) (canon (bv 32)))
237*e4980870SAlexa VanHattum    ((args (bv 16) (bv 64) (bv 64) (bv 32)) (ret Unit) (canon (bv 64)))
238*e4980870SAlexa VanHattum)
239*e4980870SAlexa VanHattum(spec (store flags val_to_store addr offset)
240*e4980870SAlexa VanHattum    (provide
241*e4980870SAlexa VanHattum       (= result (store_effect flags (widthof val_to_store) val_to_store (bvadd (zero_ext 64 addr) (sign_ext 64 offset))))))
242*e4980870SAlexa VanHattum(instantiate store store)
243