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