...

Text file src/pkg/cmd/compile/internal/ssa/gen/dec64.rules

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

View as plain text