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))))