github.com/bir3/gocompiler@v0.9.2202/src/cmd/compile/internal/ssa/_gen/dec64.rules (about) 1 // Copyright 2016 The Go Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style 3 // license that can be found in the LICENSE file. 4 5 // This file contains rules to decompose [u]int64 types on 32-bit 6 // architectures. These rules work together with the decomposeBuiltIn 7 // pass which handles phis of these typ. 8 9 (Int64Hi (Int64Make hi _)) => hi 10 (Int64Lo (Int64Make _ lo)) => lo 11 12 (Load <t> ptr mem) && is64BitInt(t) && !config.BigEndian && t.IsSigned() => 13 (Int64Make 14 (Load <typ.Int32> (OffPtr <typ.Int32Ptr> [4] ptr) mem) 15 (Load <typ.UInt32> ptr mem)) 16 17 (Load <t> ptr mem) && is64BitInt(t) && !config.BigEndian && !t.IsSigned() => 18 (Int64Make 19 (Load <typ.UInt32> (OffPtr <typ.UInt32Ptr> [4] ptr) mem) 20 (Load <typ.UInt32> ptr mem)) 21 22 (Load <t> ptr mem) && is64BitInt(t) && config.BigEndian && t.IsSigned() => 23 (Int64Make 24 (Load <typ.Int32> ptr mem) 25 (Load <typ.UInt32> (OffPtr <typ.UInt32Ptr> [4] ptr) mem)) 26 27 (Load <t> ptr mem) && is64BitInt(t) && config.BigEndian && !t.IsSigned() => 28 (Int64Make 29 (Load <typ.UInt32> ptr mem) 30 (Load <typ.UInt32> (OffPtr <typ.UInt32Ptr> [4] ptr) mem)) 31 32 (Store {t} dst (Int64Make hi lo) mem) && t.Size() == 8 && !config.BigEndian => 33 (Store {hi.Type} 34 (OffPtr <hi.Type.PtrTo()> [4] dst) 35 hi 36 (Store {lo.Type} dst lo mem)) 37 38 (Store {t} dst (Int64Make hi lo) mem) && t.Size() == 8 && config.BigEndian => 39 (Store {lo.Type} 40 (OffPtr <lo.Type.PtrTo()> [4] dst) 41 lo 42 (Store {hi.Type} dst hi mem)) 43 44 // These are not enabled during decomposeBuiltin if late call expansion, but they are always enabled for softFloat 45 (Arg {n} [off]) && is64BitInt(v.Type) && !config.BigEndian && v.Type.IsSigned() && !(b.Func.pass.name == "decompose builtin") => 46 (Int64Make 47 (Arg <typ.Int32> {n} [off+4]) 48 (Arg <typ.UInt32> {n} [off])) 49 (Arg {n} [off]) && is64BitInt(v.Type) && !config.BigEndian && !v.Type.IsSigned() && !(b.Func.pass.name == "decompose builtin") => 50 (Int64Make 51 (Arg <typ.UInt32> {n} [off+4]) 52 (Arg <typ.UInt32> {n} [off])) 53 54 (Arg {n} [off]) && is64BitInt(v.Type) && config.BigEndian && v.Type.IsSigned() && !(b.Func.pass.name == "decompose builtin") => 55 (Int64Make 56 (Arg <typ.Int32> {n} [off]) 57 (Arg <typ.UInt32> {n} [off+4])) 58 (Arg {n} [off]) && is64BitInt(v.Type) && config.BigEndian && !v.Type.IsSigned() && !(b.Func.pass.name == "decompose builtin") => 59 (Int64Make 60 (Arg <typ.UInt32> {n} [off]) 61 (Arg <typ.UInt32> {n} [off+4])) 62 63 (Add64 x y) => 64 (Int64Make 65 (Add32withcarry <typ.Int32> 66 (Int64Hi x) 67 (Int64Hi y) 68 (Select1 <types.TypeFlags> (Add32carry (Int64Lo x) (Int64Lo y)))) 69 (Select0 <typ.UInt32> (Add32carry (Int64Lo x) (Int64Lo y)))) 70 71 (Sub64 x y) => 72 (Int64Make 73 (Sub32withcarry <typ.Int32> 74 (Int64Hi x) 75 (Int64Hi y) 76 (Select1 <types.TypeFlags> (Sub32carry (Int64Lo x) (Int64Lo y)))) 77 (Select0 <typ.UInt32> (Sub32carry (Int64Lo x) (Int64Lo y)))) 78 79 (Mul64 x y) => 80 (Int64Make 81 (Add32 <typ.UInt32> 82 (Mul32 <typ.UInt32> (Int64Lo x) (Int64Hi y)) 83 (Add32 <typ.UInt32> 84 (Mul32 <typ.UInt32> (Int64Hi x) (Int64Lo y)) 85 (Select0 <typ.UInt32> (Mul32uhilo (Int64Lo x) (Int64Lo y))))) 86 (Select1 <typ.UInt32> (Mul32uhilo (Int64Lo x) (Int64Lo y)))) 87 88 (And64 x y) => 89 (Int64Make 90 (And32 <typ.UInt32> (Int64Hi x) (Int64Hi y)) 91 (And32 <typ.UInt32> (Int64Lo x) (Int64Lo y))) 92 93 (Or64 x y) => 94 (Int64Make 95 (Or32 <typ.UInt32> (Int64Hi x) (Int64Hi y)) 96 (Or32 <typ.UInt32> (Int64Lo x) (Int64Lo y))) 97 98 (Xor64 x y) => 99 (Int64Make 100 (Xor32 <typ.UInt32> (Int64Hi x) (Int64Hi y)) 101 (Xor32 <typ.UInt32> (Int64Lo x) (Int64Lo y))) 102 103 (Neg64 <t> x) => (Sub64 (Const64 <t> [0]) x) 104 105 (Com64 x) => 106 (Int64Make 107 (Com32 <typ.UInt32> (Int64Hi x)) 108 (Com32 <typ.UInt32> (Int64Lo x))) 109 110 // Sadly, just because we know that x is non-zero, 111 // we don't know whether either component is, 112 // so just treat Ctz64NonZero the same as Ctz64. 113 (Ctz64NonZero ...) => (Ctz64 ...) 114 115 (Ctz64 x) => 116 (Add32 <typ.UInt32> 117 (Ctz32 <typ.UInt32> (Int64Lo x)) 118 (And32 <typ.UInt32> 119 (Com32 <typ.UInt32> (Zeromask (Int64Lo x))) 120 (Ctz32 <typ.UInt32> (Int64Hi x)))) 121 122 (BitLen64 x) => 123 (Add32 <typ.Int> 124 (BitLen32 <typ.Int> (Int64Hi x)) 125 (BitLen32 <typ.Int> 126 (Or32 <typ.UInt32> 127 (Int64Lo x) 128 (Zeromask (Int64Hi x))))) 129 130 (Bswap64 x) => 131 (Int64Make 132 (Bswap32 <typ.UInt32> (Int64Lo x)) 133 (Bswap32 <typ.UInt32> (Int64Hi x))) 134 135 (SignExt32to64 x) => (Int64Make (Signmask x) x) 136 (SignExt16to64 x) => (SignExt32to64 (SignExt16to32 x)) 137 (SignExt8to64 x) => (SignExt32to64 (SignExt8to32 x)) 138 139 (ZeroExt32to64 x) => (Int64Make (Const32 <typ.UInt32> [0]) x) 140 (ZeroExt16to64 x) => (ZeroExt32to64 (ZeroExt16to32 x)) 141 (ZeroExt8to64 x) => (ZeroExt32to64 (ZeroExt8to32 x)) 142 143 (Trunc64to32 (Int64Make _ lo)) => lo 144 (Trunc64to16 (Int64Make _ lo)) => (Trunc32to16 lo) 145 (Trunc64to8 (Int64Make _ lo)) => (Trunc32to8 lo) 146 // Most general 147 (Trunc64to32 x) => (Int64Lo x) 148 (Trunc64to16 x) => (Trunc32to16 (Int64Lo x)) 149 (Trunc64to8 x) => (Trunc32to8 (Int64Lo x)) 150 151 (Lsh32x64 _ (Int64Make (Const32 [c]) _)) && c != 0 => (Const32 [0]) 152 (Rsh32x64 x (Int64Make (Const32 [c]) _)) && c != 0 => (Signmask x) 153 (Rsh32Ux64 _ (Int64Make (Const32 [c]) _)) && c != 0 => (Const32 [0]) 154 (Lsh16x64 _ (Int64Make (Const32 [c]) _)) && c != 0 => (Const32 [0]) 155 (Rsh16x64 x (Int64Make (Const32 [c]) _)) && c != 0 => (Signmask (SignExt16to32 x)) 156 (Rsh16Ux64 _ (Int64Make (Const32 [c]) _)) && c != 0 => (Const32 [0]) 157 (Lsh8x64 _ (Int64Make (Const32 [c]) _)) && c != 0 => (Const32 [0]) 158 (Rsh8x64 x (Int64Make (Const32 [c]) _)) && c != 0 => (Signmask (SignExt8to32 x)) 159 (Rsh8Ux64 _ (Int64Make (Const32 [c]) _)) && c != 0 => (Const32 [0]) 160 161 (Lsh32x64 [c] x (Int64Make (Const32 [0]) lo)) => (Lsh32x32 [c] x lo) 162 (Rsh32x64 [c] x (Int64Make (Const32 [0]) lo)) => (Rsh32x32 [c] x lo) 163 (Rsh32Ux64 [c] x (Int64Make (Const32 [0]) lo)) => (Rsh32Ux32 [c] x lo) 164 (Lsh16x64 [c] x (Int64Make (Const32 [0]) lo)) => (Lsh16x32 [c] x lo) 165 (Rsh16x64 [c] x (Int64Make (Const32 [0]) lo)) => (Rsh16x32 [c] x lo) 166 (Rsh16Ux64 [c] x (Int64Make (Const32 [0]) lo)) => (Rsh16Ux32 [c] x lo) 167 (Lsh8x64 [c] x (Int64Make (Const32 [0]) lo)) => (Lsh8x32 [c] x lo) 168 (Rsh8x64 [c] x (Int64Make (Const32 [0]) lo)) => (Rsh8x32 [c] x lo) 169 (Rsh8Ux64 [c] x (Int64Make (Const32 [0]) lo)) => (Rsh8Ux32 [c] x lo) 170 171 (Lsh64x64 _ (Int64Make (Const32 [c]) _)) && c != 0 => (Const64 [0]) 172 (Rsh64x64 x (Int64Make (Const32 [c]) _)) && c != 0 => (Int64Make (Signmask (Int64Hi x)) (Signmask (Int64Hi x))) 173 (Rsh64Ux64 _ (Int64Make (Const32 [c]) _)) && c != 0 => (Const64 [0]) 174 175 (Lsh64x64 [c] x (Int64Make (Const32 [0]) lo)) => (Lsh64x32 [c] x lo) 176 (Rsh64x64 [c] x (Int64Make (Const32 [0]) lo)) => (Rsh64x32 [c] x lo) 177 (Rsh64Ux64 [c] x (Int64Make (Const32 [0]) lo)) => (Rsh64Ux32 [c] x lo) 178 179 // turn x64 non-constant shifts to x32 shifts 180 // if high 32-bit of the shift is nonzero, make a huge shift 181 (Lsh64x64 x (Int64Make hi lo)) && hi.Op != OpConst32 => 182 (Lsh64x32 x (Or32 <typ.UInt32> (Zeromask hi) lo)) 183 (Rsh64x64 x (Int64Make hi lo)) && hi.Op != OpConst32 => 184 (Rsh64x32 x (Or32 <typ.UInt32> (Zeromask hi) lo)) 185 (Rsh64Ux64 x (Int64Make hi lo)) && hi.Op != OpConst32 => 186 (Rsh64Ux32 x (Or32 <typ.UInt32> (Zeromask hi) lo)) 187 (Lsh32x64 x (Int64Make hi lo)) && hi.Op != OpConst32 => 188 (Lsh32x32 x (Or32 <typ.UInt32> (Zeromask hi) lo)) 189 (Rsh32x64 x (Int64Make hi lo)) && hi.Op != OpConst32 => 190 (Rsh32x32 x (Or32 <typ.UInt32> (Zeromask hi) lo)) 191 (Rsh32Ux64 x (Int64Make hi lo)) && hi.Op != OpConst32 => 192 (Rsh32Ux32 x (Or32 <typ.UInt32> (Zeromask hi) lo)) 193 (Lsh16x64 x (Int64Make hi lo)) && hi.Op != OpConst32 => 194 (Lsh16x32 x (Or32 <typ.UInt32> (Zeromask hi) lo)) 195 (Rsh16x64 x (Int64Make hi lo)) && hi.Op != OpConst32 => 196 (Rsh16x32 x (Or32 <typ.UInt32> (Zeromask hi) lo)) 197 (Rsh16Ux64 x (Int64Make hi lo)) && hi.Op != OpConst32 => 198 (Rsh16Ux32 x (Or32 <typ.UInt32> (Zeromask hi) lo)) 199 (Lsh8x64 x (Int64Make hi lo)) && hi.Op != OpConst32 => 200 (Lsh8x32 x (Or32 <typ.UInt32> (Zeromask hi) lo)) 201 (Rsh8x64 x (Int64Make hi lo)) && hi.Op != OpConst32 => 202 (Rsh8x32 x (Or32 <typ.UInt32> (Zeromask hi) lo)) 203 (Rsh8Ux64 x (Int64Make hi lo)) && hi.Op != OpConst32 => 204 (Rsh8Ux32 x (Or32 <typ.UInt32> (Zeromask hi) lo)) 205 206 // Most general 207 (Lsh64x64 x y) => (Lsh64x32 x (Or32 <typ.UInt32> (Zeromask (Int64Hi y)) (Int64Lo y))) 208 (Rsh64x64 x y) => (Rsh64x32 x (Or32 <typ.UInt32> (Zeromask (Int64Hi y)) (Int64Lo y))) 209 (Rsh64Ux64 x y) => (Rsh64Ux32 x (Or32 <typ.UInt32> (Zeromask (Int64Hi y)) (Int64Lo y))) 210 (Lsh32x64 x y) => (Lsh32x32 x (Or32 <typ.UInt32> (Zeromask (Int64Hi y)) (Int64Lo y))) 211 (Rsh32x64 x y) => (Rsh32x32 x (Or32 <typ.UInt32> (Zeromask (Int64Hi y)) (Int64Lo y))) 212 (Rsh32Ux64 x y) => (Rsh32Ux32 x (Or32 <typ.UInt32> (Zeromask (Int64Hi y)) (Int64Lo y))) 213 (Lsh16x64 x y) => (Lsh16x32 x (Or32 <typ.UInt32> (Zeromask (Int64Hi y)) (Int64Lo y))) 214 (Rsh16x64 x y) => (Rsh16x32 x (Or32 <typ.UInt32> (Zeromask (Int64Hi y)) (Int64Lo y))) 215 (Rsh16Ux64 x y) => (Rsh16Ux32 x (Or32 <typ.UInt32> (Zeromask (Int64Hi y)) (Int64Lo y))) 216 (Lsh8x64 x y) => (Lsh8x32 x (Or32 <typ.UInt32> (Zeromask (Int64Hi y)) (Int64Lo y))) 217 (Rsh8x64 x y) => (Rsh8x32 x (Or32 <typ.UInt32> (Zeromask (Int64Hi y)) (Int64Lo y))) 218 (Rsh8Ux64 x y) => (Rsh8Ux32 x (Or32 <typ.UInt32> (Zeromask (Int64Hi y)) (Int64Lo y))) 219 220 (RotateLeft64 x (Int64Make hi lo)) => (RotateLeft64 x lo) 221 (RotateLeft32 x (Int64Make hi lo)) => (RotateLeft32 x lo) 222 (RotateLeft16 x (Int64Make hi lo)) => (RotateLeft16 x lo) 223 (RotateLeft8 x (Int64Make hi lo)) => (RotateLeft8 x lo) 224 225 // Clean up constants a little 226 (Or32 <typ.UInt32> (Zeromask (Const32 [c])) y) && c == 0 => y 227 (Or32 <typ.UInt32> (Zeromask (Const32 [c])) y) && c != 0 => (Const32 <typ.UInt32> [-1]) 228 229 // 64x left shift 230 // result.hi = hi<<s | lo>>(32-s) | lo<<(s-32) // >> is unsigned, large shifts result 0 231 // result.lo = lo<<s 232 (Lsh64x32 x s) => 233 (Int64Make 234 (Or32 <typ.UInt32> 235 (Or32 <typ.UInt32> 236 (Lsh32x32 <typ.UInt32> (Int64Hi x) s) 237 (Rsh32Ux32 <typ.UInt32> 238 (Int64Lo x) 239 (Sub32 <typ.UInt32> (Const32 <typ.UInt32> [32]) s))) 240 (Lsh32x32 <typ.UInt32> 241 (Int64Lo x) 242 (Sub32 <typ.UInt32> s (Const32 <typ.UInt32> [32])))) 243 (Lsh32x32 <typ.UInt32> (Int64Lo x) s)) 244 (Lsh64x16 x s) => 245 (Int64Make 246 (Or32 <typ.UInt32> 247 (Or32 <typ.UInt32> 248 (Lsh32x16 <typ.UInt32> (Int64Hi x) s) 249 (Rsh32Ux16 <typ.UInt32> 250 (Int64Lo x) 251 (Sub16 <typ.UInt16> (Const16 <typ.UInt16> [32]) s))) 252 (Lsh32x16 <typ.UInt32> 253 (Int64Lo x) 254 (Sub16 <typ.UInt16> s (Const16 <typ.UInt16> [32])))) 255 (Lsh32x16 <typ.UInt32> (Int64Lo x) s)) 256 (Lsh64x8 x s) => 257 (Int64Make 258 (Or32 <typ.UInt32> 259 (Or32 <typ.UInt32> 260 (Lsh32x8 <typ.UInt32> (Int64Hi x) s) 261 (Rsh32Ux8 <typ.UInt32> 262 (Int64Lo x) 263 (Sub8 <typ.UInt8> (Const8 <typ.UInt8> [32]) s))) 264 (Lsh32x8 <typ.UInt32> 265 (Int64Lo x) 266 (Sub8 <typ.UInt8> s (Const8 <typ.UInt8> [32])))) 267 (Lsh32x8 <typ.UInt32> (Int64Lo x) s)) 268 269 // 64x unsigned right shift 270 // result.hi = hi>>s 271 // result.lo = lo>>s | hi<<(32-s) | hi>>(s-32) // >> is unsigned, large shifts result 0 272 (Rsh64Ux32 x s) => 273 (Int64Make 274 (Rsh32Ux32 <typ.UInt32> (Int64Hi x) s) 275 (Or32 <typ.UInt32> 276 (Or32 <typ.UInt32> 277 (Rsh32Ux32 <typ.UInt32> (Int64Lo x) s) 278 (Lsh32x32 <typ.UInt32> 279 (Int64Hi x) 280 (Sub32 <typ.UInt32> (Const32 <typ.UInt32> [32]) s))) 281 (Rsh32Ux32 <typ.UInt32> 282 (Int64Hi x) 283 (Sub32 <typ.UInt32> s (Const32 <typ.UInt32> [32]))))) 284 (Rsh64Ux16 x s) => 285 (Int64Make 286 (Rsh32Ux16 <typ.UInt32> (Int64Hi x) s) 287 (Or32 <typ.UInt32> 288 (Or32 <typ.UInt32> 289 (Rsh32Ux16 <typ.UInt32> (Int64Lo x) s) 290 (Lsh32x16 <typ.UInt32> 291 (Int64Hi x) 292 (Sub16 <typ.UInt16> (Const16 <typ.UInt16> [32]) s))) 293 (Rsh32Ux16 <typ.UInt32> 294 (Int64Hi x) 295 (Sub16 <typ.UInt16> s (Const16 <typ.UInt16> [32]))))) 296 (Rsh64Ux8 x s) => 297 (Int64Make 298 (Rsh32Ux8 <typ.UInt32> (Int64Hi x) s) 299 (Or32 <typ.UInt32> 300 (Or32 <typ.UInt32> 301 (Rsh32Ux8 <typ.UInt32> (Int64Lo x) s) 302 (Lsh32x8 <typ.UInt32> 303 (Int64Hi x) 304 (Sub8 <typ.UInt8> (Const8 <typ.UInt8> [32]) s))) 305 (Rsh32Ux8 <typ.UInt32> 306 (Int64Hi x) 307 (Sub8 <typ.UInt8> s (Const8 <typ.UInt8> [32]))))) 308 309 // 64x signed right shift 310 // result.hi = hi>>s 311 // result.lo = lo>>s | hi<<(32-s) | (hi>>(s-32))&zeromask(s>>5) // hi>>(s-32) is signed, large shifts result 0/-1 312 (Rsh64x32 x s) => 313 (Int64Make 314 (Rsh32x32 <typ.UInt32> (Int64Hi x) s) 315 (Or32 <typ.UInt32> 316 (Or32 <typ.UInt32> 317 (Rsh32Ux32 <typ.UInt32> (Int64Lo x) s) 318 (Lsh32x32 <typ.UInt32> 319 (Int64Hi x) 320 (Sub32 <typ.UInt32> (Const32 <typ.UInt32> [32]) s))) 321 (And32 <typ.UInt32> 322 (Rsh32x32 <typ.UInt32> 323 (Int64Hi x) 324 (Sub32 <typ.UInt32> s (Const32 <typ.UInt32> [32]))) 325 (Zeromask 326 (Rsh32Ux32 <typ.UInt32> s (Const32 <typ.UInt32> [5])))))) 327 (Rsh64x16 x s) => 328 (Int64Make 329 (Rsh32x16 <typ.UInt32> (Int64Hi x) s) 330 (Or32 <typ.UInt32> 331 (Or32 <typ.UInt32> 332 (Rsh32Ux16 <typ.UInt32> (Int64Lo x) s) 333 (Lsh32x16 <typ.UInt32> 334 (Int64Hi x) 335 (Sub16 <typ.UInt16> (Const16 <typ.UInt16> [32]) s))) 336 (And32 <typ.UInt32> 337 (Rsh32x16 <typ.UInt32> 338 (Int64Hi x) 339 (Sub16 <typ.UInt16> s (Const16 <typ.UInt16> [32]))) 340 (Zeromask 341 (ZeroExt16to32 342 (Rsh16Ux32 <typ.UInt16> s (Const32 <typ.UInt32> [5]))))))) 343 (Rsh64x8 x s) => 344 (Int64Make 345 (Rsh32x8 <typ.UInt32> (Int64Hi x) s) 346 (Or32 <typ.UInt32> 347 (Or32 <typ.UInt32> 348 (Rsh32Ux8 <typ.UInt32> (Int64Lo x) s) 349 (Lsh32x8 <typ.UInt32> 350 (Int64Hi x) 351 (Sub8 <typ.UInt8> (Const8 <typ.UInt8> [32]) s))) 352 (And32 <typ.UInt32> 353 (Rsh32x8 <typ.UInt32> 354 (Int64Hi x) 355 (Sub8 <typ.UInt8> s (Const8 <typ.UInt8> [32]))) 356 (Zeromask 357 (ZeroExt8to32 358 (Rsh8Ux32 <typ.UInt8> s (Const32 <typ.UInt32> [5]))))))) 359 360 (Const64 <t> [c]) && t.IsSigned() => 361 (Int64Make (Const32 <typ.Int32> [int32(c>>32)]) (Const32 <typ.UInt32> [int32(c)])) 362 (Const64 <t> [c]) && !t.IsSigned() => 363 (Int64Make (Const32 <typ.UInt32> [int32(c>>32)]) (Const32 <typ.UInt32> [int32(c)])) 364 365 (Eq64 x y) => 366 (AndB 367 (Eq32 (Int64Hi x) (Int64Hi y)) 368 (Eq32 (Int64Lo x) (Int64Lo y))) 369 370 (Neq64 x y) => 371 (OrB 372 (Neq32 (Int64Hi x) (Int64Hi y)) 373 (Neq32 (Int64Lo x) (Int64Lo y))) 374 375 (Less64U x y) => 376 (OrB 377 (Less32U (Int64Hi x) (Int64Hi y)) 378 (AndB 379 (Eq32 (Int64Hi x) (Int64Hi y)) 380 (Less32U (Int64Lo x) (Int64Lo y)))) 381 382 (Leq64U x y) => 383 (OrB 384 (Less32U (Int64Hi x) (Int64Hi y)) 385 (AndB 386 (Eq32 (Int64Hi x) (Int64Hi y)) 387 (Leq32U (Int64Lo x) (Int64Lo y)))) 388 389 (Less64 x y) => 390 (OrB 391 (Less32 (Int64Hi x) (Int64Hi y)) 392 (AndB 393 (Eq32 (Int64Hi x) (Int64Hi y)) 394 (Less32U (Int64Lo x) (Int64Lo y)))) 395 396 (Leq64 x y) => 397 (OrB 398 (Less32 (Int64Hi x) (Int64Hi y)) 399 (AndB 400 (Eq32 (Int64Hi x) (Int64Hi y)) 401 (Leq32U (Int64Lo x) (Int64Lo y))))