github.com/zxy12/go_duplicate_112_new@v0.0.0-20200807091221-747231827200/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  
    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  // 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 x) -> (Ctz64 x)
   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  
   147  (Lsh32x64 _ (Int64Make (Const32 [c]) _)) && c != 0 -> (Const32 [0])
   148  (Rsh32x64 x (Int64Make (Const32 [c]) _)) && c != 0 -> (Signmask x)
   149  (Rsh32Ux64 _ (Int64Make (Const32 [c]) _)) && c != 0 -> (Const32 [0])
   150  (Lsh16x64 _ (Int64Make (Const32 [c]) _)) && c != 0 -> (Const32 [0])
   151  (Rsh16x64 x (Int64Make (Const32 [c]) _)) && c != 0 -> (Signmask (SignExt16to32 x))
   152  (Rsh16Ux64 _ (Int64Make (Const32 [c]) _)) && c != 0 -> (Const32 [0])
   153  (Lsh8x64 _ (Int64Make (Const32 [c]) _)) && c != 0 -> (Const32 [0])
   154  (Rsh8x64 x (Int64Make (Const32 [c]) _)) && c != 0 -> (Signmask (SignExt8to32 x))
   155  (Rsh8Ux64 _ (Int64Make (Const32 [c]) _)) && c != 0 -> (Const32 [0])
   156  
   157  (Lsh32x64 x (Int64Make (Const32 [0]) lo)) -> (Lsh32x32 x lo)
   158  (Rsh32x64 x (Int64Make (Const32 [0]) lo)) -> (Rsh32x32 x lo)
   159  (Rsh32Ux64 x (Int64Make (Const32 [0]) lo)) -> (Rsh32Ux32 x lo)
   160  (Lsh16x64 x (Int64Make (Const32 [0]) lo)) -> (Lsh16x32 x lo)
   161  (Rsh16x64 x (Int64Make (Const32 [0]) lo)) -> (Rsh16x32 x lo)
   162  (Rsh16Ux64 x (Int64Make (Const32 [0]) lo)) -> (Rsh16Ux32 x lo)
   163  (Lsh8x64 x (Int64Make (Const32 [0]) lo)) -> (Lsh8x32 x lo)
   164  (Rsh8x64 x (Int64Make (Const32 [0]) lo)) -> (Rsh8x32 x lo)
   165  (Rsh8Ux64 x (Int64Make (Const32 [0]) lo)) -> (Rsh8Ux32 x lo)
   166  
   167  (Lsh64x64 _ (Int64Make (Const32 [c]) _)) && c != 0 -> (Const64 [0])
   168  (Rsh64x64 x (Int64Make (Const32 [c]) _)) && c != 0 -> (Int64Make (Signmask (Int64Hi x)) (Signmask (Int64Hi x)))
   169  (Rsh64Ux64 _ (Int64Make (Const32 [c]) _)) && c != 0 -> (Const64 [0])
   170  
   171  (Lsh64x64 x (Int64Make (Const32 [0]) lo)) -> (Lsh64x32 x lo)
   172  (Rsh64x64 x (Int64Make (Const32 [0]) lo)) -> (Rsh64x32 x lo)
   173  (Rsh64Ux64 x (Int64Make (Const32 [0]) lo)) -> (Rsh64Ux32 x lo)
   174  
   175  // turn x64 non-constant shifts to x32 shifts
   176  // if high 32-bit of the shift is nonzero, make a huge shift
   177  (Lsh64x64 x (Int64Make hi lo)) && hi.Op != OpConst32 ->
   178  	(Lsh64x32 x (Or32 <typ.UInt32> (Zeromask hi) lo))
   179  (Rsh64x64 x (Int64Make hi lo)) && hi.Op != OpConst32 ->
   180  	(Rsh64x32 x (Or32 <typ.UInt32> (Zeromask hi) lo))
   181  (Rsh64Ux64 x (Int64Make hi lo)) && hi.Op != OpConst32 ->
   182  	(Rsh64Ux32 x (Or32 <typ.UInt32> (Zeromask hi) lo))
   183  (Lsh32x64 x (Int64Make hi lo)) && hi.Op != OpConst32 ->
   184  	(Lsh32x32 x (Or32 <typ.UInt32> (Zeromask hi) lo))
   185  (Rsh32x64 x (Int64Make hi lo)) && hi.Op != OpConst32 ->
   186  	(Rsh32x32 x (Or32 <typ.UInt32> (Zeromask hi) lo))
   187  (Rsh32Ux64 x (Int64Make hi lo)) && hi.Op != OpConst32 ->
   188  	(Rsh32Ux32 x (Or32 <typ.UInt32> (Zeromask hi) lo))
   189  (Lsh16x64 x (Int64Make hi lo)) && hi.Op != OpConst32 ->
   190  	(Lsh16x32 x (Or32 <typ.UInt32> (Zeromask hi) lo))
   191  (Rsh16x64 x (Int64Make hi lo)) && hi.Op != OpConst32 ->
   192  	(Rsh16x32 x (Or32 <typ.UInt32> (Zeromask hi) lo))
   193  (Rsh16Ux64 x (Int64Make hi lo)) && hi.Op != OpConst32 ->
   194  	(Rsh16Ux32 x (Or32 <typ.UInt32> (Zeromask hi) lo))
   195  (Lsh8x64 x (Int64Make hi lo)) && hi.Op != OpConst32 ->
   196  	(Lsh8x32 x (Or32 <typ.UInt32> (Zeromask hi) lo))
   197  (Rsh8x64 x (Int64Make hi lo)) && hi.Op != OpConst32 ->
   198  	(Rsh8x32 x (Or32 <typ.UInt32> (Zeromask hi) lo))
   199  (Rsh8Ux64 x (Int64Make hi lo)) && hi.Op != OpConst32 ->
   200  	(Rsh8Ux32 x (Or32 <typ.UInt32> (Zeromask hi) lo))
   201  
   202  // 64x left shift
   203  // result.hi = hi<<s | lo>>(32-s) | lo<<(s-32) // >> is unsigned, large shifts result 0
   204  // result.lo = lo<<s
   205  (Lsh64x32 (Int64Make hi lo) s) ->
   206  	(Int64Make
   207  		(Or32 <typ.UInt32>
   208  			(Or32 <typ.UInt32>
   209  				(Lsh32x32 <typ.UInt32> hi s)
   210  				(Rsh32Ux32 <typ.UInt32>
   211  					lo
   212  					(Sub32 <typ.UInt32> (Const32 <typ.UInt32> [32]) s)))
   213  			(Lsh32x32 <typ.UInt32>
   214  				lo
   215  				(Sub32 <typ.UInt32> s (Const32 <typ.UInt32> [32]))))
   216  		(Lsh32x32 <typ.UInt32> lo s))
   217  (Lsh64x16 (Int64Make hi lo) s) ->
   218  	(Int64Make
   219  		(Or32 <typ.UInt32>
   220  			(Or32 <typ.UInt32>
   221  				(Lsh32x16 <typ.UInt32> hi s)
   222  				(Rsh32Ux16 <typ.UInt32>
   223  					lo
   224  					(Sub16 <typ.UInt16> (Const16 <typ.UInt16> [32]) s)))
   225  			(Lsh32x16 <typ.UInt32>
   226  				lo
   227  				(Sub16 <typ.UInt16> s (Const16 <typ.UInt16> [32]))))
   228  		(Lsh32x16 <typ.UInt32> lo s))
   229  (Lsh64x8 (Int64Make hi lo) s) ->
   230  	(Int64Make
   231  		(Or32 <typ.UInt32>
   232  			(Or32 <typ.UInt32>
   233  				(Lsh32x8 <typ.UInt32> hi s)
   234  				(Rsh32Ux8 <typ.UInt32>
   235  					lo
   236  					(Sub8 <typ.UInt8> (Const8 <typ.UInt8> [32]) s)))
   237  			(Lsh32x8 <typ.UInt32>
   238  				lo
   239  				(Sub8 <typ.UInt8> s (Const8 <typ.UInt8> [32]))))
   240  		(Lsh32x8 <typ.UInt32> lo s))
   241  
   242  // 64x unsigned right shift
   243  // result.hi = hi>>s
   244  // result.lo = lo>>s | hi<<(32-s) | hi>>(s-32) // >> is unsigned, large shifts result 0
   245  (Rsh64Ux32 (Int64Make hi lo) s) ->
   246  	(Int64Make
   247  		(Rsh32Ux32 <typ.UInt32> hi s)
   248  		(Or32 <typ.UInt32>
   249  			(Or32 <typ.UInt32>
   250  				(Rsh32Ux32 <typ.UInt32> lo s)
   251  				(Lsh32x32 <typ.UInt32>
   252  					hi
   253  					(Sub32 <typ.UInt32> (Const32 <typ.UInt32> [32]) s)))
   254  			(Rsh32Ux32 <typ.UInt32>
   255  				hi
   256  				(Sub32 <typ.UInt32> s (Const32 <typ.UInt32> [32])))))
   257  (Rsh64Ux16 (Int64Make hi lo) s) ->
   258  	(Int64Make
   259  		(Rsh32Ux16 <typ.UInt32> hi s)
   260  		(Or32 <typ.UInt32>
   261  			(Or32 <typ.UInt32>
   262  				(Rsh32Ux16 <typ.UInt32> lo s)
   263  				(Lsh32x16 <typ.UInt32>
   264  					hi
   265  					(Sub16 <typ.UInt16> (Const16 <typ.UInt16> [32]) s)))
   266  			(Rsh32Ux16 <typ.UInt32>
   267  				hi
   268  				(Sub16 <typ.UInt16> s (Const16 <typ.UInt16> [32])))))
   269  (Rsh64Ux8 (Int64Make hi lo) s) ->
   270  	(Int64Make
   271  		(Rsh32Ux8 <typ.UInt32> hi s)
   272  		(Or32 <typ.UInt32>
   273  			(Or32 <typ.UInt32>
   274  				(Rsh32Ux8 <typ.UInt32> lo s)
   275  				(Lsh32x8 <typ.UInt32>
   276  					hi
   277  					(Sub8 <typ.UInt8> (Const8 <typ.UInt8> [32]) s)))
   278  			(Rsh32Ux8 <typ.UInt32>
   279  				hi
   280  				(Sub8 <typ.UInt8> s (Const8 <typ.UInt8> [32])))))
   281  
   282  // 64x signed right shift
   283  // result.hi = hi>>s
   284  // result.lo = lo>>s | hi<<(32-s) | (hi>>(s-32))&zeromask(s>>5) // hi>>(s-32) is signed, large shifts result 0/-1
   285  (Rsh64x32 (Int64Make hi lo) s) ->
   286  	(Int64Make
   287  		(Rsh32x32 <typ.UInt32> hi s)
   288  		(Or32 <typ.UInt32>
   289  			(Or32 <typ.UInt32>
   290  				(Rsh32Ux32 <typ.UInt32> lo s)
   291  				(Lsh32x32 <typ.UInt32>
   292  					hi
   293  					(Sub32 <typ.UInt32> (Const32 <typ.UInt32> [32]) s)))
   294  			(And32 <typ.UInt32>
   295  				(Rsh32x32 <typ.UInt32>
   296  					hi
   297  					(Sub32 <typ.UInt32> s (Const32 <typ.UInt32> [32])))
   298  				(Zeromask
   299  					(Rsh32Ux32 <typ.UInt32> s (Const32 <typ.UInt32> [5]))))))
   300  (Rsh64x16 (Int64Make hi lo) s) ->
   301  	(Int64Make
   302  		(Rsh32x16 <typ.UInt32> hi s)
   303  		(Or32 <typ.UInt32>
   304  			(Or32 <typ.UInt32>
   305  				(Rsh32Ux16 <typ.UInt32> lo s)
   306  				(Lsh32x16 <typ.UInt32>
   307  					hi
   308  					(Sub16 <typ.UInt16> (Const16 <typ.UInt16> [32]) s)))
   309  			(And32 <typ.UInt32>
   310  				(Rsh32x16 <typ.UInt32>
   311  					hi
   312  					(Sub16 <typ.UInt16> s (Const16 <typ.UInt16> [32])))
   313  				(Zeromask
   314  					(ZeroExt16to32
   315  						(Rsh16Ux32 <typ.UInt16> s (Const32 <typ.UInt32> [5])))))))
   316  (Rsh64x8 (Int64Make hi lo) s) ->
   317  	(Int64Make
   318  		(Rsh32x8 <typ.UInt32> hi s)
   319  		(Or32 <typ.UInt32>
   320  			(Or32 <typ.UInt32>
   321  				(Rsh32Ux8 <typ.UInt32> lo s)
   322  				(Lsh32x8 <typ.UInt32>
   323  					hi
   324  					(Sub8 <typ.UInt8> (Const8 <typ.UInt8> [32]) s)))
   325  			(And32 <typ.UInt32>
   326  				(Rsh32x8 <typ.UInt32>
   327  					hi
   328  					(Sub8 <typ.UInt8> s (Const8 <typ.UInt8> [32])))
   329  				(Zeromask
   330  					(ZeroExt8to32
   331  						(Rsh8Ux32 <typ.UInt8> s (Const32 <typ.UInt32> [5])))))))
   332  
   333  // 64xConst32 shifts
   334  // we probably do not need them -- lateopt may take care of them just fine
   335  //(Lsh64x32 _ (Const32 [c])) && uint32(c) >= 64 -> (Const64 [0])
   336  //(Rsh64x32 x (Const32 [c])) && uint32(c) >= 64 -> (Int64Make (Signmask (Int64Hi x)) (Signmask (Int64Hi x)))
   337  //(Rsh64Ux32 _ (Const32 [c])) && uint32(c) >= 64 -> (Const64 [0])
   338  //
   339  //(Lsh64x32 x (Const32 [c])) && c < 64 && c > 32 ->
   340  //	(Int64Make
   341  //		(Lsh32x32 <typ.UInt32> (Int64Lo x) (Const32 <typ.UInt32> [c-32]))
   342  //		(Const32 <typ.UInt32> [0]))
   343  //(Rsh64x32 x (Const32 [c])) && c < 64 && c > 32 ->
   344  //	(Int64Make
   345  //		(Signmask (Int64Hi x))
   346  //		(Rsh32x32 <typ.Int32> (Int64Hi x) (Const32 <typ.UInt32> [c-32])))
   347  //(Rsh64Ux32 x (Const32 [c])) && c < 64 && c > 32 ->
   348  //	(Int64Make
   349  //		(Const32 <typ.UInt32> [0])
   350  //		(Rsh32Ux32 <typ.UInt32> (Int64Hi x) (Const32 <typ.UInt32> [c-32])))
   351  //
   352  //(Lsh64x32 x (Const32 [32])) -> (Int64Make (Int64Lo x) (Const32 <typ.UInt32> [0]))
   353  //(Rsh64x32 x (Const32 [32])) -> (Int64Make (Signmask (Int64Hi x)) (Int64Hi x))
   354  //(Rsh64Ux32 x (Const32 [32])) -> (Int64Make (Const32 <typ.UInt32> [0]) (Int64Hi x))
   355  //
   356  //(Lsh64x32 x (Const32 [c])) && c < 32 && c > 0 ->
   357  //	(Int64Make
   358  //		(Or32 <typ.UInt32>
   359  //			(Lsh32x32 <typ.UInt32> (Int64Hi x) (Const32 <typ.UInt32> [c]))
   360  //			(Rsh32Ux32 <typ.UInt32> (Int64Lo x) (Const32 <typ.UInt32> [32-c])))
   361  //		(Lsh32x32 <typ.UInt32> (Int64Lo x) (Const32 <typ.UInt32> [c])))
   362  //(Rsh64x32 x (Const32 [c])) && c < 32 && c > 0 ->
   363  //	(Int64Make
   364  //		(Rsh32x32 <typ.Int32> (Int64Hi x) (Const32 <typ.UInt32> [c]))
   365  //		(Or32 <typ.UInt32>
   366  //			(Rsh32Ux32 <typ.UInt32> (Int64Lo x) (Const32 <typ.UInt32> [c]))
   367  //			(Lsh32x32 <typ.UInt32> (Int64Hi x) (Const32 <typ.UInt32> [32-c]))))
   368  //(Rsh64Ux32 x (Const32 [c])) && c < 32 && c > 0 ->
   369  //	(Int64Make
   370  //		(Rsh32Ux32 <typ.UInt32> (Int64Hi x) (Const32 <typ.UInt32> [c]))
   371  //		(Or32 <typ.UInt32>
   372  //			(Rsh32Ux32 <typ.UInt32> (Int64Lo x) (Const32 <typ.UInt32> [c]))
   373  //			(Lsh32x32 <typ.UInt32> (Int64Hi x) (Const32 <typ.UInt32> [32-c]))))
   374  //
   375  //(Lsh64x32 x (Const32 [0])) -> x
   376  //(Rsh64x32 x (Const32 [0])) -> x
   377  //(Rsh64Ux32 x (Const32 [0])) -> x
   378  
   379  (Const64 <t> [c]) && t.IsSigned() ->
   380  	(Int64Make (Const32 <typ.Int32> [c>>32]) (Const32 <typ.UInt32> [int64(int32(c))]))
   381  (Const64 <t> [c]) && !t.IsSigned() ->
   382  	(Int64Make (Const32 <typ.UInt32> [c>>32]) (Const32 <typ.UInt32> [int64(int32(c))]))
   383  
   384  (Eq64 x y) ->
   385  	(AndB
   386  		(Eq32 (Int64Hi x) (Int64Hi y))
   387  		(Eq32 (Int64Lo x) (Int64Lo y)))
   388  
   389  (Neq64 x y) ->
   390  	(OrB
   391  		(Neq32 (Int64Hi x) (Int64Hi y))
   392  		(Neq32 (Int64Lo x) (Int64Lo y)))
   393  
   394  (Less64U x y) ->
   395  	(OrB
   396  		(Less32U (Int64Hi x) (Int64Hi y))
   397  		(AndB
   398  			(Eq32 (Int64Hi x) (Int64Hi y))
   399  			(Less32U (Int64Lo x) (Int64Lo y))))
   400  
   401  (Leq64U x y) ->
   402  	(OrB
   403  		(Less32U (Int64Hi x) (Int64Hi y))
   404  		(AndB
   405  			(Eq32 (Int64Hi x) (Int64Hi y))
   406  			(Leq32U (Int64Lo x) (Int64Lo y))))
   407  
   408  (Greater64U x y) ->
   409  	(OrB
   410  		(Greater32U (Int64Hi x) (Int64Hi y))
   411  		(AndB
   412  			(Eq32 (Int64Hi x) (Int64Hi y))
   413  			(Greater32U (Int64Lo x) (Int64Lo y))))
   414  
   415  (Geq64U x y) ->
   416  	(OrB
   417  		(Greater32U (Int64Hi x) (Int64Hi y))
   418  		(AndB
   419  			(Eq32 (Int64Hi x) (Int64Hi y))
   420  			(Geq32U (Int64Lo x) (Int64Lo y))))
   421  
   422  (Less64 x y) ->
   423  	(OrB
   424  		(Less32 (Int64Hi x) (Int64Hi y))
   425  		(AndB
   426  			(Eq32 (Int64Hi x) (Int64Hi y))
   427  			(Less32U (Int64Lo x) (Int64Lo y))))
   428  
   429  (Leq64 x y) ->
   430  	(OrB
   431  		(Less32 (Int64Hi x) (Int64Hi y))
   432  		(AndB
   433  			(Eq32 (Int64Hi x) (Int64Hi y))
   434  			(Leq32U (Int64Lo x) (Int64Lo y))))
   435  
   436  (Greater64 x y) ->
   437  	(OrB
   438  		(Greater32 (Int64Hi x) (Int64Hi y))
   439  		(AndB
   440  			(Eq32 (Int64Hi x) (Int64Hi y))
   441  			(Greater32U (Int64Lo x) (Int64Lo y))))
   442  
   443  (Geq64 x y) ->
   444  	(OrB
   445  		(Greater32 (Int64Hi x) (Int64Hi y))
   446  		(AndB
   447  			(Eq32 (Int64Hi x) (Int64Hi y))
   448  			(Geq32U (Int64Lo x) (Int64Lo y))))