github.com/dannin/go@v0.0.0-20161031215817-d35dfd405eaa/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 types. 8 9 (Int64Hi (Int64Make hi _)) -> hi 10 (Int64Lo (Int64Make _ lo)) -> lo 11 12 // Assuming little endian (we don't support big endian 32-bit architecture yet) 13 (Load <t> ptr mem) && is64BitInt(t) && t.IsSigned() -> 14 (Int64Make 15 (Load <config.fe.TypeInt32()> (OffPtr <config.fe.TypeInt32().PtrTo()> [4] ptr) mem) 16 (Load <config.fe.TypeUInt32()> ptr mem)) 17 (Load <t> ptr mem) && is64BitInt(t) && !t.IsSigned() -> 18 (Int64Make 19 (Load <config.fe.TypeUInt32()> (OffPtr <config.fe.TypeUInt32().PtrTo()> [4] ptr) mem) 20 (Load <config.fe.TypeUInt32()> ptr mem)) 21 22 (Store [8] dst (Int64Make hi lo) mem) -> 23 (Store [4] 24 (OffPtr <hi.Type.PtrTo()> [4] dst) 25 hi 26 (Store [4] dst lo mem)) 27 28 (Arg {n} [off]) && is64BitInt(v.Type) && v.Type.IsSigned() -> 29 (Int64Make 30 (Arg <config.fe.TypeInt32()> {n} [off+4]) 31 (Arg <config.fe.TypeUInt32()> {n} [off])) 32 (Arg {n} [off]) && is64BitInt(v.Type) && !v.Type.IsSigned() -> 33 (Int64Make 34 (Arg <config.fe.TypeUInt32()> {n} [off+4]) 35 (Arg <config.fe.TypeUInt32()> {n} [off])) 36 37 (Add64 x y) -> 38 (Int64Make 39 (Add32withcarry <config.fe.TypeInt32()> 40 (Int64Hi x) 41 (Int64Hi y) 42 (Select1 <TypeFlags> (Add32carry (Int64Lo x) (Int64Lo y)))) 43 (Select0 <config.fe.TypeUInt32()> (Add32carry (Int64Lo x) (Int64Lo y)))) 44 45 (Sub64 x y) -> 46 (Int64Make 47 (Sub32withcarry <config.fe.TypeInt32()> 48 (Int64Hi x) 49 (Int64Hi y) 50 (Select1 <TypeFlags> (Sub32carry (Int64Lo x) (Int64Lo y)))) 51 (Select0 <config.fe.TypeUInt32()> (Sub32carry (Int64Lo x) (Int64Lo y)))) 52 53 (Mul64 x y) -> 54 (Int64Make 55 (Add32 <config.fe.TypeUInt32()> 56 (Mul32 <config.fe.TypeUInt32()> (Int64Lo x) (Int64Hi y)) 57 (Add32 <config.fe.TypeUInt32()> 58 (Mul32 <config.fe.TypeUInt32()> (Int64Hi x) (Int64Lo y)) 59 (Select0 <config.fe.TypeUInt32()> (Mul32uhilo (Int64Lo x) (Int64Lo y))))) 60 (Select1 <config.fe.TypeUInt32()> (Mul32uhilo (Int64Lo x) (Int64Lo y)))) 61 62 (And64 x y) -> 63 (Int64Make 64 (And32 <config.fe.TypeUInt32()> (Int64Hi x) (Int64Hi y)) 65 (And32 <config.fe.TypeUInt32()> (Int64Lo x) (Int64Lo y))) 66 67 (Or64 x y) -> 68 (Int64Make 69 (Or32 <config.fe.TypeUInt32()> (Int64Hi x) (Int64Hi y)) 70 (Or32 <config.fe.TypeUInt32()> (Int64Lo x) (Int64Lo y))) 71 72 (Xor64 x y) -> 73 (Int64Make 74 (Xor32 <config.fe.TypeUInt32()> (Int64Hi x) (Int64Hi y)) 75 (Xor32 <config.fe.TypeUInt32()> (Int64Lo x) (Int64Lo y))) 76 77 (Neg64 <t> x) -> (Sub64 (Const64 <t> [0]) x) 78 79 (Com64 x) -> 80 (Int64Make 81 (Com32 <config.fe.TypeUInt32()> (Int64Hi x)) 82 (Com32 <config.fe.TypeUInt32()> (Int64Lo x))) 83 84 (Ctz64 x) -> 85 (Int64Make 86 (Const32 <config.fe.TypeUInt32()> [0]) 87 (Add32 <config.fe.TypeUInt32()> 88 (Ctz32 <config.fe.TypeUInt32()> (Int64Lo x)) 89 (And32 <config.fe.TypeUInt32()> 90 (Com32 <config.fe.TypeUInt32()> (Zeromask (Int64Lo x))) 91 (Ctz32 <config.fe.TypeUInt32()> (Int64Hi x))))) 92 93 (Bswap64 x) -> 94 (Int64Make 95 (Bswap32 <config.fe.TypeUInt32()> (Int64Lo x)) 96 (Bswap32 <config.fe.TypeUInt32()> (Int64Hi x))) 97 98 (SignExt32to64 x) -> (Int64Make (Signmask x) x) 99 (SignExt16to64 x) -> (SignExt32to64 (SignExt16to32 x)) 100 (SignExt8to64 x) -> (SignExt32to64 (SignExt8to32 x)) 101 102 (ZeroExt32to64 x) -> (Int64Make (Const32 <config.fe.TypeUInt32()> [0]) x) 103 (ZeroExt16to64 x) -> (ZeroExt32to64 (ZeroExt16to32 x)) 104 (ZeroExt8to64 x) -> (ZeroExt32to64 (ZeroExt8to32 x)) 105 106 (Trunc64to32 (Int64Make _ lo)) -> lo 107 (Trunc64to16 (Int64Make _ lo)) -> (Trunc32to16 lo) 108 (Trunc64to8 (Int64Make _ lo)) -> (Trunc32to8 lo) 109 110 (Lsh32x64 _ (Int64Make (Const32 [c]) _)) && c != 0 -> (Const32 [0]) 111 (Rsh32x64 x (Int64Make (Const32 [c]) _)) && c != 0 -> (Signmask x) 112 (Rsh32Ux64 _ (Int64Make (Const32 [c]) _)) && c != 0 -> (Const32 [0]) 113 (Lsh16x64 _ (Int64Make (Const32 [c]) _)) && c != 0 -> (Const32 [0]) 114 (Rsh16x64 x (Int64Make (Const32 [c]) _)) && c != 0 -> (Signmask (SignExt16to32 x)) 115 (Rsh16Ux64 _ (Int64Make (Const32 [c]) _)) && c != 0 -> (Const32 [0]) 116 (Lsh8x64 _ (Int64Make (Const32 [c]) _)) && c != 0 -> (Const32 [0]) 117 (Rsh8x64 x (Int64Make (Const32 [c]) _)) && c != 0 -> (Signmask (SignExt8to32 x)) 118 (Rsh8Ux64 _ (Int64Make (Const32 [c]) _)) && c != 0 -> (Const32 [0]) 119 120 (Lsh32x64 x (Int64Make (Const32 [0]) lo)) -> (Lsh32x32 x lo) 121 (Rsh32x64 x (Int64Make (Const32 [0]) lo)) -> (Rsh32x32 x lo) 122 (Rsh32Ux64 x (Int64Make (Const32 [0]) lo)) -> (Rsh32Ux32 x lo) 123 (Lsh16x64 x (Int64Make (Const32 [0]) lo)) -> (Lsh16x32 x lo) 124 (Rsh16x64 x (Int64Make (Const32 [0]) lo)) -> (Rsh16x32 x lo) 125 (Rsh16Ux64 x (Int64Make (Const32 [0]) lo)) -> (Rsh16Ux32 x lo) 126 (Lsh8x64 x (Int64Make (Const32 [0]) lo)) -> (Lsh8x32 x lo) 127 (Rsh8x64 x (Int64Make (Const32 [0]) lo)) -> (Rsh8x32 x lo) 128 (Rsh8Ux64 x (Int64Make (Const32 [0]) lo)) -> (Rsh8Ux32 x lo) 129 130 (Lsh64x64 _ (Int64Make (Const32 [c]) _)) && c != 0 -> (Const64 [0]) 131 (Rsh64x64 x (Int64Make (Const32 [c]) _)) && c != 0 -> (Int64Make (Signmask (Int64Hi x)) (Signmask (Int64Hi x))) 132 (Rsh64Ux64 _ (Int64Make (Const32 [c]) _)) && c != 0 -> (Const64 [0]) 133 134 (Lsh64x64 x (Int64Make (Const32 [0]) lo)) -> (Lsh64x32 x lo) 135 (Rsh64x64 x (Int64Make (Const32 [0]) lo)) -> (Rsh64x32 x lo) 136 (Rsh64Ux64 x (Int64Make (Const32 [0]) lo)) -> (Rsh64Ux32 x lo) 137 138 // turn x64 non-constant shifts to x32 shifts 139 // if high 32-bit of the shift is nonzero, make a huge shift 140 (Lsh64x64 x (Int64Make hi lo)) && hi.Op != OpConst32 -> 141 (Lsh64x32 x (Or32 <config.fe.TypeUInt32()> (Zeromask hi) lo)) 142 (Rsh64x64 x (Int64Make hi lo)) && hi.Op != OpConst32 -> 143 (Rsh64x32 x (Or32 <config.fe.TypeUInt32()> (Zeromask hi) lo)) 144 (Rsh64Ux64 x (Int64Make hi lo)) && hi.Op != OpConst32 -> 145 (Rsh64Ux32 x (Or32 <config.fe.TypeUInt32()> (Zeromask hi) lo)) 146 (Lsh32x64 x (Int64Make hi lo)) && hi.Op != OpConst32 -> 147 (Lsh32x32 x (Or32 <config.fe.TypeUInt32()> (Zeromask hi) lo)) 148 (Rsh32x64 x (Int64Make hi lo)) && hi.Op != OpConst32 -> 149 (Rsh32x32 x (Or32 <config.fe.TypeUInt32()> (Zeromask hi) lo)) 150 (Rsh32Ux64 x (Int64Make hi lo)) && hi.Op != OpConst32 -> 151 (Rsh32Ux32 x (Or32 <config.fe.TypeUInt32()> (Zeromask hi) lo)) 152 (Lsh16x64 x (Int64Make hi lo)) && hi.Op != OpConst32 -> 153 (Lsh16x32 x (Or32 <config.fe.TypeUInt32()> (Zeromask hi) lo)) 154 (Rsh16x64 x (Int64Make hi lo)) && hi.Op != OpConst32 -> 155 (Rsh16x32 x (Or32 <config.fe.TypeUInt32()> (Zeromask hi) lo)) 156 (Rsh16Ux64 x (Int64Make hi lo)) && hi.Op != OpConst32 -> 157 (Rsh16Ux32 x (Or32 <config.fe.TypeUInt32()> (Zeromask hi) lo)) 158 (Lsh8x64 x (Int64Make hi lo)) && hi.Op != OpConst32 -> 159 (Lsh8x32 x (Or32 <config.fe.TypeUInt32()> (Zeromask hi) lo)) 160 (Rsh8x64 x (Int64Make hi lo)) && hi.Op != OpConst32 -> 161 (Rsh8x32 x (Or32 <config.fe.TypeUInt32()> (Zeromask hi) lo)) 162 (Rsh8Ux64 x (Int64Make hi lo)) && hi.Op != OpConst32 -> 163 (Rsh8Ux32 x (Or32 <config.fe.TypeUInt32()> (Zeromask hi) lo)) 164 165 // 64x left shift 166 // result.hi = hi<<s | lo>>(32-s) | lo<<(s-32) // >> is unsigned, large shifts result 0 167 // result.lo = lo<<s 168 (Lsh64x32 (Int64Make hi lo) s) -> 169 (Int64Make 170 (Or32 <config.fe.TypeUInt32()> 171 (Or32 <config.fe.TypeUInt32()> 172 (Lsh32x32 <config.fe.TypeUInt32()> hi s) 173 (Rsh32Ux32 <config.fe.TypeUInt32()> 174 lo 175 (Sub32 <config.fe.TypeUInt32()> (Const32 <config.fe.TypeUInt32()> [32]) s))) 176 (Lsh32x32 <config.fe.TypeUInt32()> 177 lo 178 (Sub32 <config.fe.TypeUInt32()> s (Const32 <config.fe.TypeUInt32()> [32])))) 179 (Lsh32x32 <config.fe.TypeUInt32()> lo s)) 180 (Lsh64x16 (Int64Make hi lo) s) -> 181 (Int64Make 182 (Or32 <config.fe.TypeUInt32()> 183 (Or32 <config.fe.TypeUInt32()> 184 (Lsh32x16 <config.fe.TypeUInt32()> hi s) 185 (Rsh32Ux16 <config.fe.TypeUInt32()> 186 lo 187 (Sub16 <config.fe.TypeUInt16()> (Const16 <config.fe.TypeUInt16()> [32]) s))) 188 (Lsh32x16 <config.fe.TypeUInt32()> 189 lo 190 (Sub16 <config.fe.TypeUInt16()> s (Const16 <config.fe.TypeUInt16()> [32])))) 191 (Lsh32x16 <config.fe.TypeUInt32()> lo s)) 192 (Lsh64x8 (Int64Make hi lo) s) -> 193 (Int64Make 194 (Or32 <config.fe.TypeUInt32()> 195 (Or32 <config.fe.TypeUInt32()> 196 (Lsh32x8 <config.fe.TypeUInt32()> hi s) 197 (Rsh32Ux8 <config.fe.TypeUInt32()> 198 lo 199 (Sub8 <config.fe.TypeUInt8()> (Const8 <config.fe.TypeUInt8()> [32]) s))) 200 (Lsh32x8 <config.fe.TypeUInt32()> 201 lo 202 (Sub8 <config.fe.TypeUInt8()> s (Const8 <config.fe.TypeUInt8()> [32])))) 203 (Lsh32x8 <config.fe.TypeUInt32()> lo s)) 204 205 // 64x unsigned right shift 206 // result.hi = hi>>s 207 // result.lo = lo>>s | hi<<(32-s) | hi>>(s-32) // >> is unsigned, large shifts result 0 208 (Rsh64Ux32 (Int64Make hi lo) s) -> 209 (Int64Make 210 (Rsh32Ux32 <config.fe.TypeUInt32()> hi s) 211 (Or32 <config.fe.TypeUInt32()> 212 (Or32 <config.fe.TypeUInt32()> 213 (Rsh32Ux32 <config.fe.TypeUInt32()> lo s) 214 (Lsh32x32 <config.fe.TypeUInt32()> 215 hi 216 (Sub32 <config.fe.TypeUInt32()> (Const32 <config.fe.TypeUInt32()> [32]) s))) 217 (Rsh32Ux32 <config.fe.TypeUInt32()> 218 hi 219 (Sub32 <config.fe.TypeUInt32()> s (Const32 <config.fe.TypeUInt32()> [32]))))) 220 (Rsh64Ux16 (Int64Make hi lo) s) -> 221 (Int64Make 222 (Rsh32Ux16 <config.fe.TypeUInt32()> hi s) 223 (Or32 <config.fe.TypeUInt32()> 224 (Or32 <config.fe.TypeUInt32()> 225 (Rsh32Ux16 <config.fe.TypeUInt32()> lo s) 226 (Lsh32x16 <config.fe.TypeUInt32()> 227 hi 228 (Sub16 <config.fe.TypeUInt16()> (Const16 <config.fe.TypeUInt16()> [32]) s))) 229 (Rsh32Ux16 <config.fe.TypeUInt32()> 230 hi 231 (Sub16 <config.fe.TypeUInt16()> s (Const16 <config.fe.TypeUInt16()> [32]))))) 232 (Rsh64Ux8 (Int64Make hi lo) s) -> 233 (Int64Make 234 (Rsh32Ux8 <config.fe.TypeUInt32()> hi s) 235 (Or32 <config.fe.TypeUInt32()> 236 (Or32 <config.fe.TypeUInt32()> 237 (Rsh32Ux8 <config.fe.TypeUInt32()> lo s) 238 (Lsh32x8 <config.fe.TypeUInt32()> 239 hi 240 (Sub8 <config.fe.TypeUInt8()> (Const8 <config.fe.TypeUInt8()> [32]) s))) 241 (Rsh32Ux8 <config.fe.TypeUInt32()> 242 hi 243 (Sub8 <config.fe.TypeUInt8()> s (Const8 <config.fe.TypeUInt8()> [32]))))) 244 245 // 64x signed right shift 246 // result.hi = hi>>s 247 // result.lo = lo>>s | hi<<(32-s) | (hi>>(s-32))&zeromask(s>>5) // hi>>(s-32) is signed, large shifts result 0/-1 248 (Rsh64x32 (Int64Make hi lo) s) -> 249 (Int64Make 250 (Rsh32x32 <config.fe.TypeUInt32()> hi s) 251 (Or32 <config.fe.TypeUInt32()> 252 (Or32 <config.fe.TypeUInt32()> 253 (Rsh32Ux32 <config.fe.TypeUInt32()> lo s) 254 (Lsh32x32 <config.fe.TypeUInt32()> 255 hi 256 (Sub32 <config.fe.TypeUInt32()> (Const32 <config.fe.TypeUInt32()> [32]) s))) 257 (And32 <config.fe.TypeUInt32()> 258 (Rsh32x32 <config.fe.TypeUInt32()> 259 hi 260 (Sub32 <config.fe.TypeUInt32()> s (Const32 <config.fe.TypeUInt32()> [32]))) 261 (Zeromask 262 (Rsh32Ux32 <config.fe.TypeUInt32()> s (Const32 <config.fe.TypeUInt32()> [5])))))) 263 (Rsh64x16 (Int64Make hi lo) s) -> 264 (Int64Make 265 (Rsh32x16 <config.fe.TypeUInt32()> hi s) 266 (Or32 <config.fe.TypeUInt32()> 267 (Or32 <config.fe.TypeUInt32()> 268 (Rsh32Ux16 <config.fe.TypeUInt32()> lo s) 269 (Lsh32x16 <config.fe.TypeUInt32()> 270 hi 271 (Sub16 <config.fe.TypeUInt16()> (Const16 <config.fe.TypeUInt16()> [32]) s))) 272 (And32 <config.fe.TypeUInt32()> 273 (Rsh32x16 <config.fe.TypeUInt32()> 274 hi 275 (Sub16 <config.fe.TypeUInt16()> s (Const16 <config.fe.TypeUInt16()> [32]))) 276 (Zeromask 277 (ZeroExt16to32 278 (Rsh16Ux32 <config.fe.TypeUInt16()> s (Const32 <config.fe.TypeUInt32()> [5]))))))) 279 (Rsh64x8 (Int64Make hi lo) s) -> 280 (Int64Make 281 (Rsh32x8 <config.fe.TypeUInt32()> hi s) 282 (Or32 <config.fe.TypeUInt32()> 283 (Or32 <config.fe.TypeUInt32()> 284 (Rsh32Ux8 <config.fe.TypeUInt32()> lo s) 285 (Lsh32x8 <config.fe.TypeUInt32()> 286 hi 287 (Sub8 <config.fe.TypeUInt8()> (Const8 <config.fe.TypeUInt8()> [32]) s))) 288 (And32 <config.fe.TypeUInt32()> 289 (Rsh32x8 <config.fe.TypeUInt32()> 290 hi 291 (Sub8 <config.fe.TypeUInt8()> s (Const8 <config.fe.TypeUInt8()> [32]))) 292 (Zeromask 293 (ZeroExt8to32 294 (Rsh8Ux32 <config.fe.TypeUInt8()> s (Const32 <config.fe.TypeUInt32()> [5]))))))) 295 296 // 64xConst32 shifts 297 // we probably do not need them -- lateopt may take care of them just fine 298 //(Lsh64x32 _ (Const32 [c])) && uint32(c) >= 64 -> (Const64 [0]) 299 //(Rsh64x32 x (Const32 [c])) && uint32(c) >= 64 -> (Int64Make (Signmask (Int64Hi x)) (Signmask (Int64Hi x))) 300 //(Rsh64Ux32 _ (Const32 [c])) && uint32(c) >= 64 -> (Const64 [0]) 301 // 302 //(Lsh64x32 x (Const32 [c])) && c < 64 && c > 32 -> 303 // (Int64Make 304 // (Lsh32x32 <config.fe.TypeUInt32()> (Int64Lo x) (Const32 <config.fe.TypeUInt32()> [c-32])) 305 // (Const32 <config.fe.TypeUInt32()> [0])) 306 //(Rsh64x32 x (Const32 [c])) && c < 64 && c > 32 -> 307 // (Int64Make 308 // (Signmask (Int64Hi x)) 309 // (Rsh32x32 <config.fe.TypeInt32()> (Int64Hi x) (Const32 <config.fe.TypeUInt32()> [c-32]))) 310 //(Rsh64Ux32 x (Const32 [c])) && c < 64 && c > 32 -> 311 // (Int64Make 312 // (Const32 <config.fe.TypeUInt32()> [0]) 313 // (Rsh32Ux32 <config.fe.TypeUInt32()> (Int64Hi x) (Const32 <config.fe.TypeUInt32()> [c-32]))) 314 // 315 //(Lsh64x32 x (Const32 [32])) -> (Int64Make (Int64Lo x) (Const32 <config.fe.TypeUInt32()> [0])) 316 //(Rsh64x32 x (Const32 [32])) -> (Int64Make (Signmask (Int64Hi x)) (Int64Hi x)) 317 //(Rsh64Ux32 x (Const32 [32])) -> (Int64Make (Const32 <config.fe.TypeUInt32()> [0]) (Int64Hi x)) 318 // 319 //(Lsh64x32 x (Const32 [c])) && c < 32 && c > 0 -> 320 // (Int64Make 321 // (Or32 <config.fe.TypeUInt32()> 322 // (Lsh32x32 <config.fe.TypeUInt32()> (Int64Hi x) (Const32 <config.fe.TypeUInt32()> [c])) 323 // (Rsh32Ux32 <config.fe.TypeUInt32()> (Int64Lo x) (Const32 <config.fe.TypeUInt32()> [32-c]))) 324 // (Lsh32x32 <config.fe.TypeUInt32()> (Int64Lo x) (Const32 <config.fe.TypeUInt32()> [c]))) 325 //(Rsh64x32 x (Const32 [c])) && c < 32 && c > 0 -> 326 // (Int64Make 327 // (Rsh32x32 <config.fe.TypeInt32()> (Int64Hi x) (Const32 <config.fe.TypeUInt32()> [c])) 328 // (Or32 <config.fe.TypeUInt32()> 329 // (Rsh32Ux32 <config.fe.TypeUInt32()> (Int64Lo x) (Const32 <config.fe.TypeUInt32()> [c])) 330 // (Lsh32x32 <config.fe.TypeUInt32()> (Int64Hi x) (Const32 <config.fe.TypeUInt32()> [32-c])))) 331 //(Rsh64Ux32 x (Const32 [c])) && c < 32 && c > 0 -> 332 // (Int64Make 333 // (Rsh32Ux32 <config.fe.TypeUInt32()> (Int64Hi x) (Const32 <config.fe.TypeUInt32()> [c])) 334 // (Or32 <config.fe.TypeUInt32()> 335 // (Rsh32Ux32 <config.fe.TypeUInt32()> (Int64Lo x) (Const32 <config.fe.TypeUInt32()> [c])) 336 // (Lsh32x32 <config.fe.TypeUInt32()> (Int64Hi x) (Const32 <config.fe.TypeUInt32()> [32-c])))) 337 // 338 //(Lsh64x32 x (Const32 [0])) -> x 339 //(Rsh64x32 x (Const32 [0])) -> x 340 //(Rsh64Ux32 x (Const32 [0])) -> x 341 342 (Lrot64 (Int64Make hi lo) [c]) && c <= 32 -> 343 (Int64Make 344 (Or32 <config.fe.TypeUInt32()> 345 (Lsh32x32 <config.fe.TypeUInt32()> hi (Const32 <config.fe.TypeUInt32()> [c])) 346 (Rsh32Ux32 <config.fe.TypeUInt32()> lo (Const32 <config.fe.TypeUInt32()> [32-c]))) 347 (Or32 <config.fe.TypeUInt32()> 348 (Lsh32x32 <config.fe.TypeUInt32()> lo (Const32 <config.fe.TypeUInt32()> [c])) 349 (Rsh32Ux32 <config.fe.TypeUInt32()> hi (Const32 <config.fe.TypeUInt32()> [32-c])))) 350 (Lrot64 (Int64Make hi lo) [c]) && c > 32 -> (Lrot64 (Int64Make lo hi) [c-32]) 351 352 (Const64 <t> [c]) && t.IsSigned() -> 353 (Int64Make (Const32 <config.fe.TypeInt32()> [c>>32]) (Const32 <config.fe.TypeUInt32()> [int64(int32(c))])) 354 (Const64 <t> [c]) && !t.IsSigned() -> 355 (Int64Make (Const32 <config.fe.TypeUInt32()> [c>>32]) (Const32 <config.fe.TypeUInt32()> [int64(int32(c))])) 356 357 (Eq64 x y) -> 358 (AndB 359 (Eq32 (Int64Hi x) (Int64Hi y)) 360 (Eq32 (Int64Lo x) (Int64Lo y))) 361 362 (Neq64 x y) -> 363 (OrB 364 (Neq32 (Int64Hi x) (Int64Hi y)) 365 (Neq32 (Int64Lo x) (Int64Lo y))) 366 367 (Less64U x y) -> 368 (OrB 369 (Less32U (Int64Hi x) (Int64Hi y)) 370 (AndB 371 (Eq32 (Int64Hi x) (Int64Hi y)) 372 (Less32U (Int64Lo x) (Int64Lo y)))) 373 374 (Leq64U x y) -> 375 (OrB 376 (Less32U (Int64Hi x) (Int64Hi y)) 377 (AndB 378 (Eq32 (Int64Hi x) (Int64Hi y)) 379 (Leq32U (Int64Lo x) (Int64Lo y)))) 380 381 (Greater64U x y) -> 382 (OrB 383 (Greater32U (Int64Hi x) (Int64Hi y)) 384 (AndB 385 (Eq32 (Int64Hi x) (Int64Hi y)) 386 (Greater32U (Int64Lo x) (Int64Lo y)))) 387 388 (Geq64U x y) -> 389 (OrB 390 (Greater32U (Int64Hi x) (Int64Hi y)) 391 (AndB 392 (Eq32 (Int64Hi x) (Int64Hi y)) 393 (Geq32U (Int64Lo x) (Int64Lo y)))) 394 395 (Less64 x y) -> 396 (OrB 397 (Less32 (Int64Hi x) (Int64Hi y)) 398 (AndB 399 (Eq32 (Int64Hi x) (Int64Hi y)) 400 (Less32U (Int64Lo x) (Int64Lo y)))) 401 402 (Leq64 x y) -> 403 (OrB 404 (Less32 (Int64Hi x) (Int64Hi y)) 405 (AndB 406 (Eq32 (Int64Hi x) (Int64Hi y)) 407 (Leq32U (Int64Lo x) (Int64Lo y)))) 408 409 (Greater64 x y) -> 410 (OrB 411 (Greater32 (Int64Hi x) (Int64Hi y)) 412 (AndB 413 (Eq32 (Int64Hi x) (Int64Hi y)) 414 (Greater32U (Int64Lo x) (Int64Lo y)))) 415 416 (Geq64 x y) -> 417 (OrB 418 (Greater32 (Int64Hi x) (Int64Hi y)) 419 (AndB 420 (Eq32 (Int64Hi x) (Int64Hi y)) 421 (Geq32U (Int64Lo x) (Int64Lo y))))