github.com/euank/go@v0.0.0-20160829210321-495514729181/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  (SignExt32to64 x) -> (Int64Make (Signmask x) x)
    85  (SignExt16to64 x) -> (SignExt32to64 (SignExt16to32 x))
    86  (SignExt8to64 x) -> (SignExt32to64 (SignExt8to32 x))
    87  
    88  (ZeroExt32to64 x) -> (Int64Make (Const32 <config.fe.TypeUInt32()> [0]) x)
    89  (ZeroExt16to64 x) -> (ZeroExt32to64 (ZeroExt16to32 x))
    90  (ZeroExt8to64 x) -> (ZeroExt32to64 (ZeroExt8to32 x))
    91  
    92  (Trunc64to32 (Int64Make _ lo)) -> lo
    93  (Trunc64to16 (Int64Make _ lo)) -> (Trunc32to16 lo)
    94  (Trunc64to8 (Int64Make _ lo)) -> (Trunc32to8 lo)
    95  
    96  (Lsh32x64 _ (Int64Make (Const32 [c]) _)) && c != 0 -> (Const32 [0])
    97  (Rsh32x64 x (Int64Make (Const32 [c]) _)) && c != 0 -> (Signmask x)
    98  (Rsh32Ux64 _ (Int64Make (Const32 [c]) _)) && c != 0 -> (Const32 [0])
    99  (Lsh16x64 _ (Int64Make (Const32 [c]) _)) && c != 0 -> (Const32 [0])
   100  (Rsh16x64 x (Int64Make (Const32 [c]) _)) && c != 0 -> (Signmask (SignExt16to32 x))
   101  (Rsh16Ux64 _ (Int64Make (Const32 [c]) _)) && c != 0 -> (Const32 [0])
   102  (Lsh8x64 _ (Int64Make (Const32 [c]) _)) && c != 0 -> (Const32 [0])
   103  (Rsh8x64 x (Int64Make (Const32 [c]) _)) && c != 0 -> (Signmask (SignExt8to32 x))
   104  (Rsh8Ux64 _ (Int64Make (Const32 [c]) _)) && c != 0 -> (Const32 [0])
   105  
   106  (Lsh32x64 x (Int64Make (Const32 [0]) lo)) -> (Lsh32x32 x lo)
   107  (Rsh32x64 x (Int64Make (Const32 [0]) lo)) -> (Rsh32x32 x lo)
   108  (Rsh32Ux64 x (Int64Make (Const32 [0]) lo)) -> (Rsh32Ux32 x lo)
   109  (Lsh16x64 x (Int64Make (Const32 [0]) lo)) -> (Lsh16x32 x lo)
   110  (Rsh16x64 x (Int64Make (Const32 [0]) lo)) -> (Rsh16x32 x lo)
   111  (Rsh16Ux64 x (Int64Make (Const32 [0]) lo)) -> (Rsh16Ux32 x lo)
   112  (Lsh8x64 x (Int64Make (Const32 [0]) lo)) -> (Lsh8x32 x lo)
   113  (Rsh8x64 x (Int64Make (Const32 [0]) lo)) -> (Rsh8x32 x lo)
   114  (Rsh8Ux64 x (Int64Make (Const32 [0]) lo)) -> (Rsh8Ux32 x lo)
   115  
   116  (Lsh64x64 _ (Int64Make (Const32 [c]) _)) && c != 0 -> (Const64 [0])
   117  (Rsh64x64 x (Int64Make (Const32 [c]) _)) && c != 0 -> (Int64Make (Signmask (Int64Hi x)) (Signmask (Int64Hi x)))
   118  (Rsh64Ux64 _ (Int64Make (Const32 [c]) _)) && c != 0 -> (Const64 [0])
   119  
   120  (Lsh64x64 x (Int64Make (Const32 [0]) lo)) -> (Lsh64x32 x lo)
   121  (Rsh64x64 x (Int64Make (Const32 [0]) lo)) -> (Rsh64x32 x lo)
   122  (Rsh64Ux64 x (Int64Make (Const32 [0]) lo)) -> (Rsh64Ux32 x lo)
   123  
   124  // turn x64 non-constant shifts to x32 shifts
   125  // if high 32-bit of the shift is nonzero, make a huge shift
   126  (Lsh64x64 x (Int64Make hi lo)) && hi.Op != OpConst32 ->
   127  	(Lsh64x32 x (Or32 <config.fe.TypeUInt32()> (Zeromask hi) lo))
   128  (Rsh64x64 x (Int64Make hi lo)) && hi.Op != OpConst32 ->
   129  	(Rsh64x32 x (Or32 <config.fe.TypeUInt32()> (Zeromask hi) lo))
   130  (Rsh64Ux64 x (Int64Make hi lo)) && hi.Op != OpConst32 ->
   131  	(Rsh64Ux32 x (Or32 <config.fe.TypeUInt32()> (Zeromask hi) lo))
   132  (Lsh32x64 x (Int64Make hi lo)) && hi.Op != OpConst32 ->
   133  	(Lsh32x32 x (Or32 <config.fe.TypeUInt32()> (Zeromask hi) lo))
   134  (Rsh32x64 x (Int64Make hi lo)) && hi.Op != OpConst32 ->
   135  	(Rsh32x32 x (Or32 <config.fe.TypeUInt32()> (Zeromask hi) lo))
   136  (Rsh32Ux64 x (Int64Make hi lo)) && hi.Op != OpConst32 ->
   137  	(Rsh32Ux32 x (Or32 <config.fe.TypeUInt32()> (Zeromask hi) lo))
   138  (Lsh16x64 x (Int64Make hi lo)) && hi.Op != OpConst32 ->
   139  	(Lsh16x32 x (Or32 <config.fe.TypeUInt32()> (Zeromask hi) lo))
   140  (Rsh16x64 x (Int64Make hi lo)) && hi.Op != OpConst32 ->
   141  	(Rsh16x32 x (Or32 <config.fe.TypeUInt32()> (Zeromask hi) lo))
   142  (Rsh16Ux64 x (Int64Make hi lo)) && hi.Op != OpConst32 ->
   143  	(Rsh16Ux32 x (Or32 <config.fe.TypeUInt32()> (Zeromask hi) lo))
   144  (Lsh8x64 x (Int64Make hi lo)) && hi.Op != OpConst32 ->
   145  	(Lsh8x32 x (Or32 <config.fe.TypeUInt32()> (Zeromask hi) lo))
   146  (Rsh8x64 x (Int64Make hi lo)) && hi.Op != OpConst32 ->
   147  	(Rsh8x32 x (Or32 <config.fe.TypeUInt32()> (Zeromask hi) lo))
   148  (Rsh8Ux64 x (Int64Make hi lo)) && hi.Op != OpConst32 ->
   149  	(Rsh8Ux32 x (Or32 <config.fe.TypeUInt32()> (Zeromask hi) lo))
   150  
   151  // 64x left shift
   152  // result.hi = hi<<s | lo>>(32-s) | lo<<(s-32) // >> is unsigned, large shifts result 0
   153  // result.lo = lo<<s
   154  (Lsh64x32 (Int64Make hi lo) s) ->
   155  	(Int64Make
   156  		(Or32 <config.fe.TypeUInt32()>
   157  			(Or32 <config.fe.TypeUInt32()>
   158  				(Lsh32x32 <config.fe.TypeUInt32()> hi s)
   159  				(Rsh32Ux32 <config.fe.TypeUInt32()>
   160  					lo
   161  					(Sub32 <config.fe.TypeUInt32()> (Const32 <config.fe.TypeUInt32()> [32]) s)))
   162  			(Lsh32x32 <config.fe.TypeUInt32()>
   163  				lo
   164  				(Sub32 <config.fe.TypeUInt32()> s (Const32 <config.fe.TypeUInt32()> [32]))))
   165  		(Lsh32x32 <config.fe.TypeUInt32()> lo s))
   166  (Lsh64x16 (Int64Make hi lo) s) ->
   167  	(Int64Make
   168  		(Or32 <config.fe.TypeUInt32()>
   169  			(Or32 <config.fe.TypeUInt32()>
   170  				(Lsh32x16 <config.fe.TypeUInt32()> hi s)
   171  				(Rsh32Ux16 <config.fe.TypeUInt32()>
   172  					lo
   173  					(Sub16 <config.fe.TypeUInt16()> (Const16 <config.fe.TypeUInt16()> [32]) s)))
   174  			(Lsh32x16 <config.fe.TypeUInt32()>
   175  				lo
   176  				(Sub16 <config.fe.TypeUInt16()> s (Const16 <config.fe.TypeUInt16()> [32]))))
   177  		(Lsh32x16 <config.fe.TypeUInt32()> lo s))
   178  (Lsh64x8 (Int64Make hi lo) s) ->
   179  	(Int64Make
   180  		(Or32 <config.fe.TypeUInt32()>
   181  			(Or32 <config.fe.TypeUInt32()>
   182  				(Lsh32x8 <config.fe.TypeUInt32()> hi s)
   183  				(Rsh32Ux8 <config.fe.TypeUInt32()>
   184  					lo
   185  					(Sub8 <config.fe.TypeUInt8()> (Const8 <config.fe.TypeUInt8()> [32]) s)))
   186  			(Lsh32x8 <config.fe.TypeUInt32()>
   187  				lo
   188  				(Sub8 <config.fe.TypeUInt8()> s (Const8 <config.fe.TypeUInt8()> [32]))))
   189  		(Lsh32x8 <config.fe.TypeUInt32()> lo s))
   190  
   191  // 64x unsigned right shift
   192  // result.hi = hi>>s
   193  // result.lo = lo>>s | hi<<(32-s) | hi>>(s-32) // >> is unsigned, large shifts result 0
   194  (Rsh64Ux32 (Int64Make hi lo) s) ->
   195  	(Int64Make
   196  		(Rsh32Ux32 <config.fe.TypeUInt32()> hi s)
   197  		(Or32 <config.fe.TypeUInt32()>
   198  			(Or32 <config.fe.TypeUInt32()>
   199  				(Rsh32Ux32 <config.fe.TypeUInt32()> lo s)
   200  				(Lsh32x32 <config.fe.TypeUInt32()>
   201  					hi
   202  					(Sub32 <config.fe.TypeUInt32()> (Const32 <config.fe.TypeUInt32()> [32]) s)))
   203  			(Rsh32Ux32 <config.fe.TypeUInt32()>
   204  				hi
   205  				(Sub32 <config.fe.TypeUInt32()> s (Const32 <config.fe.TypeUInt32()> [32])))))
   206  (Rsh64Ux16 (Int64Make hi lo) s) ->
   207  	(Int64Make
   208  		(Rsh32Ux16 <config.fe.TypeUInt32()> hi s)
   209  		(Or32 <config.fe.TypeUInt32()>
   210  			(Or32 <config.fe.TypeUInt32()>
   211  				(Rsh32Ux16 <config.fe.TypeUInt32()> lo s)
   212  				(Lsh32x16 <config.fe.TypeUInt32()>
   213  					hi
   214  					(Sub16 <config.fe.TypeUInt16()> (Const16 <config.fe.TypeUInt16()> [32]) s)))
   215  			(Rsh32Ux16 <config.fe.TypeUInt32()>
   216  				hi
   217  				(Sub16 <config.fe.TypeUInt16()> s (Const16 <config.fe.TypeUInt16()> [32])))))
   218  (Rsh64Ux8 (Int64Make hi lo) s) ->
   219  	(Int64Make
   220  		(Rsh32Ux8 <config.fe.TypeUInt32()> hi s)
   221  		(Or32 <config.fe.TypeUInt32()>
   222  			(Or32 <config.fe.TypeUInt32()>
   223  				(Rsh32Ux8 <config.fe.TypeUInt32()> lo s)
   224  				(Lsh32x8 <config.fe.TypeUInt32()>
   225  					hi
   226  					(Sub8 <config.fe.TypeUInt8()> (Const8 <config.fe.TypeUInt8()> [32]) s)))
   227  			(Rsh32Ux8 <config.fe.TypeUInt32()>
   228  				hi
   229  				(Sub8 <config.fe.TypeUInt8()> s (Const8 <config.fe.TypeUInt8()> [32])))))
   230  
   231  // 64x signed right shift
   232  // result.hi = hi>>s
   233  // result.lo = lo>>s | hi<<(32-s) | (hi>>(s-32))&zeromask(s>>5) // hi>>(s-32) is signed, large shifts result 0/-1
   234  (Rsh64x32 (Int64Make hi lo) s) ->
   235  	(Int64Make
   236  		(Rsh32x32 <config.fe.TypeUInt32()> hi s)
   237  		(Or32 <config.fe.TypeUInt32()>
   238  			(Or32 <config.fe.TypeUInt32()>
   239  				(Rsh32Ux32 <config.fe.TypeUInt32()> lo s)
   240  				(Lsh32x32 <config.fe.TypeUInt32()>
   241  					hi
   242  					(Sub32 <config.fe.TypeUInt32()> (Const32 <config.fe.TypeUInt32()> [32]) s)))
   243  			(And32 <config.fe.TypeUInt32()>
   244  				(Rsh32x32 <config.fe.TypeUInt32()>
   245  					hi
   246  					(Sub32 <config.fe.TypeUInt32()> s (Const32 <config.fe.TypeUInt32()> [32])))
   247  				(Zeromask
   248  					(Rsh32Ux32 <config.fe.TypeUInt32()> s (Const32 <config.fe.TypeUInt32()> [5]))))))
   249  (Rsh64x16 (Int64Make hi lo) s) ->
   250  	(Int64Make
   251  		(Rsh32x16 <config.fe.TypeUInt32()> hi s)
   252  		(Or32 <config.fe.TypeUInt32()>
   253  			(Or32 <config.fe.TypeUInt32()>
   254  				(Rsh32Ux16 <config.fe.TypeUInt32()> lo s)
   255  				(Lsh32x16 <config.fe.TypeUInt32()>
   256  					hi
   257  					(Sub16 <config.fe.TypeUInt16()> (Const16 <config.fe.TypeUInt16()> [32]) s)))
   258  			(And32 <config.fe.TypeUInt32()>
   259  				(Rsh32x16 <config.fe.TypeUInt32()>
   260  					hi
   261  					(Sub16 <config.fe.TypeUInt16()> s (Const16 <config.fe.TypeUInt16()> [32])))
   262  				(Zeromask
   263  					(ZeroExt16to32
   264  						(Rsh16Ux32 <config.fe.TypeUInt16()> s (Const32 <config.fe.TypeUInt32()> [5])))))))
   265  (Rsh64x8 (Int64Make hi lo) s) ->
   266  	(Int64Make
   267  		(Rsh32x8 <config.fe.TypeUInt32()> hi s)
   268  		(Or32 <config.fe.TypeUInt32()>
   269  			(Or32 <config.fe.TypeUInt32()>
   270  				(Rsh32Ux8 <config.fe.TypeUInt32()> lo s)
   271  				(Lsh32x8 <config.fe.TypeUInt32()>
   272  					hi
   273  					(Sub8 <config.fe.TypeUInt8()> (Const8 <config.fe.TypeUInt8()> [32]) s)))
   274  			(And32 <config.fe.TypeUInt32()>
   275  				(Rsh32x8 <config.fe.TypeUInt32()>
   276  					hi
   277  					(Sub8 <config.fe.TypeUInt8()> s (Const8 <config.fe.TypeUInt8()> [32])))
   278  				(Zeromask
   279  					(ZeroExt8to32
   280  						(Rsh8Ux32 <config.fe.TypeUInt8()> s (Const32 <config.fe.TypeUInt32()> [5])))))))
   281  
   282  // 64xConst32 shifts
   283  // we probably do not need them -- lateopt may take care of them just fine
   284  //(Lsh64x32 _ (Const32 [c])) && uint32(c) >= 64 -> (Const64 [0])
   285  //(Rsh64x32 x (Const32 [c])) && uint32(c) >= 64 -> (Int64Make (Signmask (Int64Hi x)) (Signmask (Int64Hi x)))
   286  //(Rsh64Ux32 _ (Const32 [c])) && uint32(c) >= 64 -> (Const64 [0])
   287  //
   288  //(Lsh64x32 x (Const32 [c])) && c < 64 && c > 32 ->
   289  //	(Int64Make
   290  //		(Lsh32x32 <config.fe.TypeUInt32()> (Int64Lo x) (Const32 <config.fe.TypeUInt32()> [c-32]))
   291  //		(Const32 <config.fe.TypeUInt32()> [0]))
   292  //(Rsh64x32 x (Const32 [c])) && c < 64 && c > 32 ->
   293  //	(Int64Make
   294  //		(Signmask (Int64Hi x))
   295  //		(Rsh32x32 <config.fe.TypeInt32()> (Int64Hi x) (Const32 <config.fe.TypeUInt32()> [c-32])))
   296  //(Rsh64Ux32 x (Const32 [c])) && c < 64 && c > 32 ->
   297  //	(Int64Make
   298  //		(Const32 <config.fe.TypeUInt32()> [0])
   299  //		(Rsh32Ux32 <config.fe.TypeUInt32()> (Int64Hi x) (Const32 <config.fe.TypeUInt32()> [c-32])))
   300  //
   301  //(Lsh64x32 x (Const32 [32])) -> (Int64Make (Int64Lo x) (Const32 <config.fe.TypeUInt32()> [0]))
   302  //(Rsh64x32 x (Const32 [32])) -> (Int64Make (Signmask (Int64Hi x)) (Int64Hi x))
   303  //(Rsh64Ux32 x (Const32 [32])) -> (Int64Make (Const32 <config.fe.TypeUInt32()> [0]) (Int64Hi x))
   304  //
   305  //(Lsh64x32 x (Const32 [c])) && c < 32 && c > 0 ->
   306  //	(Int64Make
   307  //		(Or32 <config.fe.TypeUInt32()>
   308  //			(Lsh32x32 <config.fe.TypeUInt32()> (Int64Hi x) (Const32 <config.fe.TypeUInt32()> [c]))
   309  //			(Rsh32Ux32 <config.fe.TypeUInt32()> (Int64Lo x) (Const32 <config.fe.TypeUInt32()> [32-c])))
   310  //		(Lsh32x32 <config.fe.TypeUInt32()> (Int64Lo x) (Const32 <config.fe.TypeUInt32()> [c])))
   311  //(Rsh64x32 x (Const32 [c])) && c < 32 && c > 0 ->
   312  //	(Int64Make
   313  //		(Rsh32x32 <config.fe.TypeInt32()> (Int64Hi x) (Const32 <config.fe.TypeUInt32()> [c]))
   314  //		(Or32 <config.fe.TypeUInt32()>
   315  //			(Rsh32Ux32 <config.fe.TypeUInt32()> (Int64Lo x) (Const32 <config.fe.TypeUInt32()> [c]))
   316  //			(Lsh32x32 <config.fe.TypeUInt32()> (Int64Hi x) (Const32 <config.fe.TypeUInt32()> [32-c]))))
   317  //(Rsh64Ux32 x (Const32 [c])) && c < 32 && c > 0 ->
   318  //	(Int64Make
   319  //		(Rsh32Ux32 <config.fe.TypeUInt32()> (Int64Hi x) (Const32 <config.fe.TypeUInt32()> [c]))
   320  //		(Or32 <config.fe.TypeUInt32()>
   321  //			(Rsh32Ux32 <config.fe.TypeUInt32()> (Int64Lo x) (Const32 <config.fe.TypeUInt32()> [c]))
   322  //			(Lsh32x32 <config.fe.TypeUInt32()> (Int64Hi x) (Const32 <config.fe.TypeUInt32()> [32-c]))))
   323  //
   324  //(Lsh64x32 x (Const32 [0])) -> x
   325  //(Rsh64x32 x (Const32 [0])) -> x
   326  //(Rsh64Ux32 x (Const32 [0])) -> x
   327  
   328  (Lrot64 (Int64Make hi lo) [c]) && c <= 32 ->
   329  	(Int64Make
   330  		(Or32 <config.fe.TypeUInt32()>
   331  			(Lsh32x32 <config.fe.TypeUInt32()> hi (Const32 <config.fe.TypeUInt32()> [c]))
   332  			(Rsh32Ux32 <config.fe.TypeUInt32()> lo (Const32 <config.fe.TypeUInt32()> [32-c])))
   333  		(Or32 <config.fe.TypeUInt32()>
   334  			(Lsh32x32 <config.fe.TypeUInt32()> lo (Const32 <config.fe.TypeUInt32()> [c]))
   335  			(Rsh32Ux32 <config.fe.TypeUInt32()> hi (Const32 <config.fe.TypeUInt32()> [32-c]))))
   336  (Lrot64 (Int64Make hi lo) [c]) && c > 32 -> (Lrot64 (Int64Make lo hi) [c-32])
   337  
   338  (Const64 <t> [c]) && t.IsSigned() ->
   339  	(Int64Make (Const32 <config.fe.TypeInt32()> [c>>32]) (Const32 <config.fe.TypeUInt32()> [int64(int32(c))]))
   340  (Const64 <t> [c]) && !t.IsSigned() ->
   341  	(Int64Make (Const32 <config.fe.TypeUInt32()> [c>>32]) (Const32 <config.fe.TypeUInt32()> [int64(int32(c))]))
   342  
   343  (Eq64 x y) ->
   344  	(AndB
   345  		(Eq32 (Int64Hi x) (Int64Hi y))
   346  		(Eq32 (Int64Lo x) (Int64Lo y)))
   347  
   348  (Neq64 x y) ->
   349  	(OrB
   350  		(Neq32 (Int64Hi x) (Int64Hi y))
   351  		(Neq32 (Int64Lo x) (Int64Lo y)))
   352  
   353  (Less64U x y) ->
   354  	(OrB
   355  		(Less32U (Int64Hi x) (Int64Hi y))
   356  		(AndB
   357  			(Eq32 (Int64Hi x) (Int64Hi y))
   358  			(Less32U (Int64Lo x) (Int64Lo y))))
   359  
   360  (Leq64U x y) ->
   361  	(OrB
   362  		(Less32U (Int64Hi x) (Int64Hi y))
   363  		(AndB
   364  			(Eq32 (Int64Hi x) (Int64Hi y))
   365  			(Leq32U (Int64Lo x) (Int64Lo y))))
   366  
   367  (Greater64U x y) ->
   368  	(OrB
   369  		(Greater32U (Int64Hi x) (Int64Hi y))
   370  		(AndB
   371  			(Eq32 (Int64Hi x) (Int64Hi y))
   372  			(Greater32U (Int64Lo x) (Int64Lo y))))
   373  
   374  (Geq64U x y) ->
   375  	(OrB
   376  		(Greater32U (Int64Hi x) (Int64Hi y))
   377  		(AndB
   378  			(Eq32 (Int64Hi x) (Int64Hi y))
   379  			(Geq32U (Int64Lo x) (Int64Lo y))))
   380  
   381  (Less64 x y) ->
   382  	(OrB
   383  		(Less32 (Int64Hi x) (Int64Hi y))
   384  		(AndB
   385  			(Eq32 (Int64Hi x) (Int64Hi y))
   386  			(Less32U (Int64Lo x) (Int64Lo y))))
   387  
   388  (Leq64 x y) ->
   389  	(OrB
   390  		(Less32 (Int64Hi x) (Int64Hi y))
   391  		(AndB
   392  			(Eq32 (Int64Hi x) (Int64Hi y))
   393  			(Leq32U (Int64Lo x) (Int64Lo y))))
   394  
   395  (Greater64 x y) ->
   396  	(OrB
   397  		(Greater32 (Int64Hi x) (Int64Hi y))
   398  		(AndB
   399  			(Eq32 (Int64Hi x) (Int64Hi y))
   400  			(Greater32U (Int64Lo x) (Int64Lo y))))
   401  
   402  (Geq64 x y) ->
   403  	(OrB
   404  		(Greater32 (Int64Hi x) (Int64Hi y))
   405  		(AndB
   406  			(Eq32 (Int64Hi x) (Int64Hi y))
   407  			(Geq32U (Int64Lo x) (Int64Lo y))))