Home | History | Annotate | Download | only in gen
      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 
     13 (Load <t> ptr mem) && is64BitInt(t) && !config.BigEndian && t.IsSigned() ->
     14 	(Int64Make
     15 		(Load <typ.Int32> (OffPtr <typ.Int32Ptr> [4] ptr) mem)
     16 		(Load <typ.UInt32> ptr mem))
     17 
     18 (Load <t> ptr mem) && is64BitInt(t) && !config.BigEndian && !t.IsSigned() ->
     19 	(Int64Make
     20 		(Load <typ.UInt32> (OffPtr <typ.UInt32Ptr> [4] ptr) mem)
     21 		(Load <typ.UInt32> ptr mem))
     22 
     23 (Load <t> ptr mem) && is64BitInt(t) && config.BigEndian && t.IsSigned() ->
     24 	(Int64Make
     25 		(Load <typ.Int32> ptr mem)
     26 		(Load <typ.UInt32> (OffPtr <typ.UInt32Ptr> [4] ptr) mem))
     27 
     28 (Load <t> ptr mem) && is64BitInt(t) && config.BigEndian && !t.IsSigned() ->
     29 	(Int64Make
     30 		(Load <typ.UInt32> ptr mem)
     31 		(Load <typ.UInt32> (OffPtr <typ.UInt32Ptr> [4] ptr) mem))
     32 
     33 (Store {t} dst (Int64Make hi lo) mem) && t.(*types.Type).Size() == 8 && !config.BigEndian ->
     34 	(Store {hi.Type}
     35 		(OffPtr <hi.Type.PtrTo()> [4] dst)
     36 		hi
     37 		(Store {lo.Type} dst lo mem))
     38 
     39 (Store {t} dst (Int64Make hi lo) mem) && t.(*types.Type).Size() == 8 && config.BigEndian ->
     40 	(Store {lo.Type}
     41 		(OffPtr <lo.Type.PtrTo()> [4] dst)
     42 		lo
     43 		(Store {hi.Type} dst hi mem))
     44 
     45 (Arg {n} [off]) && is64BitInt(v.Type) && !config.BigEndian && v.Type.IsSigned() ->
     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() ->
     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() ->
     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() ->
     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 (Ctz64 x) ->
    111 	(Add32 <typ.UInt32>
    112 		(Ctz32 <typ.UInt32> (Int64Lo x))
    113 		(And32 <typ.UInt32>
    114 			(Com32 <typ.UInt32> (Zeromask (Int64Lo x)))
    115 			(Ctz32 <typ.UInt32> (Int64Hi x))))
    116 
    117 (BitLen64 x) ->
    118 	(Add32 <typ.Int>
    119 		(BitLen32 <typ.Int> (Int64Hi x))
    120 		(BitLen32 <typ.Int>
    121 			(Or32 <typ.UInt32>
    122 				(Int64Lo x)
    123 				(Zeromask (Int64Hi x)))))
    124 
    125 (Bswap64 x) ->
    126 	(Int64Make
    127 		(Bswap32 <typ.UInt32> (Int64Lo x))
    128 		(Bswap32 <typ.UInt32> (Int64Hi x)))
    129 
    130 (SignExt32to64 x) -> (Int64Make (Signmask x) x)
    131 (SignExt16to64 x) -> (SignExt32to64 (SignExt16to32 x))
    132 (SignExt8to64 x) -> (SignExt32to64 (SignExt8to32 x))
    133 
    134 (ZeroExt32to64 x) -> (Int64Make (Const32 <typ.UInt32> [0]) x)
    135 (ZeroExt16to64 x) -> (ZeroExt32to64 (ZeroExt16to32 x))
    136 (ZeroExt8to64 x) -> (ZeroExt32to64 (ZeroExt8to32 x))
    137 
    138 (Trunc64to32 (Int64Make _ lo)) -> lo
    139 (Trunc64to16 (Int64Make _ lo)) -> (Trunc32to16 lo)
    140 (Trunc64to8 (Int64Make _ lo)) -> (Trunc32to8 lo)
    141 
    142 (Lsh32x64 _ (Int64Make (Const32 [c]) _)) && c != 0 -> (Const32 [0])
    143 (Rsh32x64 x (Int64Make (Const32 [c]) _)) && c != 0 -> (Signmask x)
    144 (Rsh32Ux64 _ (Int64Make (Const32 [c]) _)) && c != 0 -> (Const32 [0])
    145 (Lsh16x64 _ (Int64Make (Const32 [c]) _)) && c != 0 -> (Const32 [0])
    146 (Rsh16x64 x (Int64Make (Const32 [c]) _)) && c != 0 -> (Signmask (SignExt16to32 x))
    147 (Rsh16Ux64 _ (Int64Make (Const32 [c]) _)) && c != 0 -> (Const32 [0])
    148 (Lsh8x64 _ (Int64Make (Const32 [c]) _)) && c != 0 -> (Const32 [0])
    149 (Rsh8x64 x (Int64Make (Const32 [c]) _)) && c != 0 -> (Signmask (SignExt8to32 x))
    150 (Rsh8Ux64 _ (Int64Make (Const32 [c]) _)) && c != 0 -> (Const32 [0])
    151 
    152 (Lsh32x64 x (Int64Make (Const32 [0]) lo)) -> (Lsh32x32 x lo)
    153 (Rsh32x64 x (Int64Make (Const32 [0]) lo)) -> (Rsh32x32 x lo)
    154 (Rsh32Ux64 x (Int64Make (Const32 [0]) lo)) -> (Rsh32Ux32 x lo)
    155 (Lsh16x64 x (Int64Make (Const32 [0]) lo)) -> (Lsh16x32 x lo)
    156 (Rsh16x64 x (Int64Make (Const32 [0]) lo)) -> (Rsh16x32 x lo)
    157 (Rsh16Ux64 x (Int64Make (Const32 [0]) lo)) -> (Rsh16Ux32 x lo)
    158 (Lsh8x64 x (Int64Make (Const32 [0]) lo)) -> (Lsh8x32 x lo)
    159 (Rsh8x64 x (Int64Make (Const32 [0]) lo)) -> (Rsh8x32 x lo)
    160 (Rsh8Ux64 x (Int64Make (Const32 [0]) lo)) -> (Rsh8Ux32 x lo)
    161 
    162 (Lsh64x64 _ (Int64Make (Const32 [c]) _)) && c != 0 -> (Const64 [0])
    163 (Rsh64x64 x (Int64Make (Const32 [c]) _)) && c != 0 -> (Int64Make (Signmask (Int64Hi x)) (Signmask (Int64Hi x)))
    164 (Rsh64Ux64 _ (Int64Make (Const32 [c]) _)) && c != 0 -> (Const64 [0])
    165 
    166 (Lsh64x64 x (Int64Make (Const32 [0]) lo)) -> (Lsh64x32 x lo)
    167 (Rsh64x64 x (Int64Make (Const32 [0]) lo)) -> (Rsh64x32 x lo)
    168 (Rsh64Ux64 x (Int64Make (Const32 [0]) lo)) -> (Rsh64Ux32 x lo)
    169 
    170 // turn x64 non-constant shifts to x32 shifts
    171 // if high 32-bit of the shift is nonzero, make a huge shift
    172 (Lsh64x64 x (Int64Make hi lo)) && hi.Op != OpConst32 ->
    173 	(Lsh64x32 x (Or32 <typ.UInt32> (Zeromask hi) lo))
    174 (Rsh64x64 x (Int64Make hi lo)) && hi.Op != OpConst32 ->
    175 	(Rsh64x32 x (Or32 <typ.UInt32> (Zeromask hi) lo))
    176 (Rsh64Ux64 x (Int64Make hi lo)) && hi.Op != OpConst32 ->
    177 	(Rsh64Ux32 x (Or32 <typ.UInt32> (Zeromask hi) lo))
    178 (Lsh32x64 x (Int64Make hi lo)) && hi.Op != OpConst32 ->
    179 	(Lsh32x32 x (Or32 <typ.UInt32> (Zeromask hi) lo))
    180 (Rsh32x64 x (Int64Make hi lo)) && hi.Op != OpConst32 ->
    181 	(Rsh32x32 x (Or32 <typ.UInt32> (Zeromask hi) lo))
    182 (Rsh32Ux64 x (Int64Make hi lo)) && hi.Op != OpConst32 ->
    183 	(Rsh32Ux32 x (Or32 <typ.UInt32> (Zeromask hi) lo))
    184 (Lsh16x64 x (Int64Make hi lo)) && hi.Op != OpConst32 ->
    185 	(Lsh16x32 x (Or32 <typ.UInt32> (Zeromask hi) lo))
    186 (Rsh16x64 x (Int64Make hi lo)) && hi.Op != OpConst32 ->
    187 	(Rsh16x32 x (Or32 <typ.UInt32> (Zeromask hi) lo))
    188 (Rsh16Ux64 x (Int64Make hi lo)) && hi.Op != OpConst32 ->
    189 	(Rsh16Ux32 x (Or32 <typ.UInt32> (Zeromask hi) lo))
    190 (Lsh8x64 x (Int64Make hi lo)) && hi.Op != OpConst32 ->
    191 	(Lsh8x32 x (Or32 <typ.UInt32> (Zeromask hi) lo))
    192 (Rsh8x64 x (Int64Make hi lo)) && hi.Op != OpConst32 ->
    193 	(Rsh8x32 x (Or32 <typ.UInt32> (Zeromask hi) lo))
    194 (Rsh8Ux64 x (Int64Make hi lo)) && hi.Op != OpConst32 ->
    195 	(Rsh8Ux32 x (Or32 <typ.UInt32> (Zeromask hi) lo))
    196 
    197 // 64x left shift
    198 // result.hi = hi<<s | lo>>(32-s) | lo<<(s-32) // >> is unsigned, large shifts result 0
    199 // result.lo = lo<<s
    200 (Lsh64x32 (Int64Make hi lo) s) ->
    201 	(Int64Make
    202 		(Or32 <typ.UInt32>
    203 			(Or32 <typ.UInt32>
    204 				(Lsh32x32 <typ.UInt32> hi s)
    205 				(Rsh32Ux32 <typ.UInt32>
    206 					lo
    207 					(Sub32 <typ.UInt32> (Const32 <typ.UInt32> [32]) s)))
    208 			(Lsh32x32 <typ.UInt32>
    209 				lo
    210 				(Sub32 <typ.UInt32> s (Const32 <typ.UInt32> [32]))))
    211 		(Lsh32x32 <typ.UInt32> lo s))
    212 (Lsh64x16 (Int64Make hi lo) s) ->
    213 	(Int64Make
    214 		(Or32 <typ.UInt32>
    215 			(Or32 <typ.UInt32>
    216 				(Lsh32x16 <typ.UInt32> hi s)
    217 				(Rsh32Ux16 <typ.UInt32>
    218 					lo
    219 					(Sub16 <typ.UInt16> (Const16 <typ.UInt16> [32]) s)))
    220 			(Lsh32x16 <typ.UInt32>
    221 				lo
    222 				(Sub16 <typ.UInt16> s (Const16 <typ.UInt16> [32]))))
    223 		(Lsh32x16 <typ.UInt32> lo s))
    224 (Lsh64x8 (Int64Make hi lo) s) ->
    225 	(Int64Make
    226 		(Or32 <typ.UInt32>
    227 			(Or32 <typ.UInt32>
    228 				(Lsh32x8 <typ.UInt32> hi s)
    229 				(Rsh32Ux8 <typ.UInt32>
    230 					lo
    231 					(Sub8 <typ.UInt8> (Const8 <typ.UInt8> [32]) s)))
    232 			(Lsh32x8 <typ.UInt32>
    233 				lo
    234 				(Sub8 <typ.UInt8> s (Const8 <typ.UInt8> [32]))))
    235 		(Lsh32x8 <typ.UInt32> lo s))
    236 
    237 // 64x unsigned right shift
    238 // result.hi = hi>>s
    239 // result.lo = lo>>s | hi<<(32-s) | hi>>(s-32) // >> is unsigned, large shifts result 0
    240 (Rsh64Ux32 (Int64Make hi lo) s) ->
    241 	(Int64Make
    242 		(Rsh32Ux32 <typ.UInt32> hi s)
    243 		(Or32 <typ.UInt32>
    244 			(Or32 <typ.UInt32>
    245 				(Rsh32Ux32 <typ.UInt32> lo s)
    246 				(Lsh32x32 <typ.UInt32>
    247 					hi
    248 					(Sub32 <typ.UInt32> (Const32 <typ.UInt32> [32]) s)))
    249 			(Rsh32Ux32 <typ.UInt32>
    250 				hi
    251 				(Sub32 <typ.UInt32> s (Const32 <typ.UInt32> [32])))))
    252 (Rsh64Ux16 (Int64Make hi lo) s) ->
    253 	(Int64Make
    254 		(Rsh32Ux16 <typ.UInt32> hi s)
    255 		(Or32 <typ.UInt32>
    256 			(Or32 <typ.UInt32>
    257 				(Rsh32Ux16 <typ.UInt32> lo s)
    258 				(Lsh32x16 <typ.UInt32>
    259 					hi
    260 					(Sub16 <typ.UInt16> (Const16 <typ.UInt16> [32]) s)))
    261 			(Rsh32Ux16 <typ.UInt32>
    262 				hi
    263 				(Sub16 <typ.UInt16> s (Const16 <typ.UInt16> [32])))))
    264 (Rsh64Ux8 (Int64Make hi lo) s) ->
    265 	(Int64Make
    266 		(Rsh32Ux8 <typ.UInt32> hi s)
    267 		(Or32 <typ.UInt32>
    268 			(Or32 <typ.UInt32>
    269 				(Rsh32Ux8 <typ.UInt32> lo s)
    270 				(Lsh32x8 <typ.UInt32>
    271 					hi
    272 					(Sub8 <typ.UInt8> (Const8 <typ.UInt8> [32]) s)))
    273 			(Rsh32Ux8 <typ.UInt32>
    274 				hi
    275 				(Sub8 <typ.UInt8> s (Const8 <typ.UInt8> [32])))))
    276 
    277 // 64x signed right shift
    278 // result.hi = hi>>s
    279 // result.lo = lo>>s | hi<<(32-s) | (hi>>(s-32))&zeromask(s>>5) // hi>>(s-32) is signed, large shifts result 0/-1
    280 (Rsh64x32 (Int64Make hi lo) s) ->
    281 	(Int64Make
    282 		(Rsh32x32 <typ.UInt32> hi s)
    283 		(Or32 <typ.UInt32>
    284 			(Or32 <typ.UInt32>
    285 				(Rsh32Ux32 <typ.UInt32> lo s)
    286 				(Lsh32x32 <typ.UInt32>
    287 					hi
    288 					(Sub32 <typ.UInt32> (Const32 <typ.UInt32> [32]) s)))
    289 			(And32 <typ.UInt32>
    290 				(Rsh32x32 <typ.UInt32>
    291 					hi
    292 					(Sub32 <typ.UInt32> s (Const32 <typ.UInt32> [32])))
    293 				(Zeromask
    294 					(Rsh32Ux32 <typ.UInt32> s (Const32 <typ.UInt32> [5]))))))
    295 (Rsh64x16 (Int64Make hi lo) s) ->
    296 	(Int64Make
    297 		(Rsh32x16 <typ.UInt32> hi s)
    298 		(Or32 <typ.UInt32>
    299 			(Or32 <typ.UInt32>
    300 				(Rsh32Ux16 <typ.UInt32> lo s)
    301 				(Lsh32x16 <typ.UInt32>
    302 					hi
    303 					(Sub16 <typ.UInt16> (Const16 <typ.UInt16> [32]) s)))
    304 			(And32 <typ.UInt32>
    305 				(Rsh32x16 <typ.UInt32>
    306 					hi
    307 					(Sub16 <typ.UInt16> s (Const16 <typ.UInt16> [32])))
    308 				(Zeromask
    309 					(ZeroExt16to32
    310 						(Rsh16Ux32 <typ.UInt16> s (Const32 <typ.UInt32> [5])))))))
    311 (Rsh64x8 (Int64Make hi lo) s) ->
    312 	(Int64Make
    313 		(Rsh32x8 <typ.UInt32> hi s)
    314 		(Or32 <typ.UInt32>
    315 			(Or32 <typ.UInt32>
    316 				(Rsh32Ux8 <typ.UInt32> lo s)
    317 				(Lsh32x8 <typ.UInt32>
    318 					hi
    319 					(Sub8 <typ.UInt8> (Const8 <typ.UInt8> [32]) s)))
    320 			(And32 <typ.UInt32>
    321 				(Rsh32x8 <typ.UInt32>
    322 					hi
    323 					(Sub8 <typ.UInt8> s (Const8 <typ.UInt8> [32])))
    324 				(Zeromask
    325 					(ZeroExt8to32
    326 						(Rsh8Ux32 <typ.UInt8> s (Const32 <typ.UInt32> [5])))))))
    327 
    328 // 64xConst32 shifts
    329 // we probably do not need them -- lateopt may take care of them just fine
    330 //(Lsh64x32 _ (Const32 [c])) && uint32(c) >= 64 -> (Const64 [0])
    331 //(Rsh64x32 x (Const32 [c])) && uint32(c) >= 64 -> (Int64Make (Signmask (Int64Hi x)) (Signmask (Int64Hi x)))
    332 //(Rsh64Ux32 _ (Const32 [c])) && uint32(c) >= 64 -> (Const64 [0])
    333 //
    334 //(Lsh64x32 x (Const32 [c])) && c < 64 && c > 32 ->
    335 //	(Int64Make
    336 //		(Lsh32x32 <typ.UInt32> (Int64Lo x) (Const32 <typ.UInt32> [c-32]))
    337 //		(Const32 <typ.UInt32> [0]))
    338 //(Rsh64x32 x (Const32 [c])) && c < 64 && c > 32 ->
    339 //	(Int64Make
    340 //		(Signmask (Int64Hi x))
    341 //		(Rsh32x32 <typ.Int32> (Int64Hi x) (Const32 <typ.UInt32> [c-32])))
    342 //(Rsh64Ux32 x (Const32 [c])) && c < 64 && c > 32 ->
    343 //	(Int64Make
    344 //		(Const32 <typ.UInt32> [0])
    345 //		(Rsh32Ux32 <typ.UInt32> (Int64Hi x) (Const32 <typ.UInt32> [c-32])))
    346 //
    347 //(Lsh64x32 x (Const32 [32])) -> (Int64Make (Int64Lo x) (Const32 <typ.UInt32> [0]))
    348 //(Rsh64x32 x (Const32 [32])) -> (Int64Make (Signmask (Int64Hi x)) (Int64Hi x))
    349 //(Rsh64Ux32 x (Const32 [32])) -> (Int64Make (Const32 <typ.UInt32> [0]) (Int64Hi x))
    350 //
    351 //(Lsh64x32 x (Const32 [c])) && c < 32 && c > 0 ->
    352 //	(Int64Make
    353 //		(Or32 <typ.UInt32>
    354 //			(Lsh32x32 <typ.UInt32> (Int64Hi x) (Const32 <typ.UInt32> [c]))
    355 //			(Rsh32Ux32 <typ.UInt32> (Int64Lo x) (Const32 <typ.UInt32> [32-c])))
    356 //		(Lsh32x32 <typ.UInt32> (Int64Lo x) (Const32 <typ.UInt32> [c])))
    357 //(Rsh64x32 x (Const32 [c])) && c < 32 && c > 0 ->
    358 //	(Int64Make
    359 //		(Rsh32x32 <typ.Int32> (Int64Hi x) (Const32 <typ.UInt32> [c]))
    360 //		(Or32 <typ.UInt32>
    361 //			(Rsh32Ux32 <typ.UInt32> (Int64Lo x) (Const32 <typ.UInt32> [c]))
    362 //			(Lsh32x32 <typ.UInt32> (Int64Hi x) (Const32 <typ.UInt32> [32-c]))))
    363 //(Rsh64Ux32 x (Const32 [c])) && c < 32 && c > 0 ->
    364 //	(Int64Make
    365 //		(Rsh32Ux32 <typ.UInt32> (Int64Hi x) (Const32 <typ.UInt32> [c]))
    366 //		(Or32 <typ.UInt32>
    367 //			(Rsh32Ux32 <typ.UInt32> (Int64Lo x) (Const32 <typ.UInt32> [c]))
    368 //			(Lsh32x32 <typ.UInt32> (Int64Hi x) (Const32 <typ.UInt32> [32-c]))))
    369 //
    370 //(Lsh64x32 x (Const32 [0])) -> x
    371 //(Rsh64x32 x (Const32 [0])) -> x
    372 //(Rsh64Ux32 x (Const32 [0])) -> x
    373 
    374 (Const64 <t> [c]) && t.IsSigned() ->
    375 	(Int64Make (Const32 <typ.Int32> [c>>32]) (Const32 <typ.UInt32> [int64(int32(c))]))
    376 (Const64 <t> [c]) && !t.IsSigned() ->
    377 	(Int64Make (Const32 <typ.UInt32> [c>>32]) (Const32 <typ.UInt32> [int64(int32(c))]))
    378 
    379 (Eq64 x y) ->
    380 	(AndB
    381 		(Eq32 (Int64Hi x) (Int64Hi y))
    382 		(Eq32 (Int64Lo x) (Int64Lo y)))
    383 
    384 (Neq64 x y) ->
    385 	(OrB
    386 		(Neq32 (Int64Hi x) (Int64Hi y))
    387 		(Neq32 (Int64Lo x) (Int64Lo y)))
    388 
    389 (Less64U x y) ->
    390 	(OrB
    391 		(Less32U (Int64Hi x) (Int64Hi y))
    392 		(AndB
    393 			(Eq32 (Int64Hi x) (Int64Hi y))
    394 			(Less32U (Int64Lo x) (Int64Lo y))))
    395 
    396 (Leq64U x y) ->
    397 	(OrB
    398 		(Less32U (Int64Hi x) (Int64Hi y))
    399 		(AndB
    400 			(Eq32 (Int64Hi x) (Int64Hi y))
    401 			(Leq32U (Int64Lo x) (Int64Lo y))))
    402 
    403 (Greater64U x y) ->
    404 	(OrB
    405 		(Greater32U (Int64Hi x) (Int64Hi y))
    406 		(AndB
    407 			(Eq32 (Int64Hi x) (Int64Hi y))
    408 			(Greater32U (Int64Lo x) (Int64Lo y))))
    409 
    410 (Geq64U x y) ->
    411 	(OrB
    412 		(Greater32U (Int64Hi x) (Int64Hi y))
    413 		(AndB
    414 			(Eq32 (Int64Hi x) (Int64Hi y))
    415 			(Geq32U (Int64Lo x) (Int64Lo y))))
    416 
    417 (Less64 x y) ->
    418 	(OrB
    419 		(Less32 (Int64Hi x) (Int64Hi y))
    420 		(AndB
    421 			(Eq32 (Int64Hi x) (Int64Hi y))
    422 			(Less32U (Int64Lo x) (Int64Lo y))))
    423 
    424 (Leq64 x y) ->
    425 	(OrB
    426 		(Less32 (Int64Hi x) (Int64Hi y))
    427 		(AndB
    428 			(Eq32 (Int64Hi x) (Int64Hi y))
    429 			(Leq32U (Int64Lo x) (Int64Lo y))))
    430 
    431 (Greater64 x y) ->
    432 	(OrB
    433 		(Greater32 (Int64Hi x) (Int64Hi y))
    434 		(AndB
    435 			(Eq32 (Int64Hi x) (Int64Hi y))
    436 			(Greater32U (Int64Lo x) (Int64Lo y))))
    437 
    438 (Geq64 x y) ->
    439 	(OrB
    440 		(Greater32 (Int64Hi x) (Int64Hi y))
    441 		(AndB
    442 			(Eq32 (Int64Hi x) (Int64Hi y))
    443 			(Geq32U (Int64Lo x) (Int64Lo y))))
    444