From 3a9381c6b00c6a2131911b09d0dfb6264d30b15b Mon Sep 17 00:00:00 2001 From: Josh Bleecher Snyder Date: Thu, 23 Jan 2020 14:06:00 -0800 Subject: [PATCH] cmd/compile: use ellipses in S390X rules Also, explicitly zero AuxInt in some ops (like Div), to make it clear why they do not use an ellipsis. Passes toolstash-check -all. Change-Id: I47b4ed745196ed734927dbb5923edec33ce286da Reviewed-on: https://go-review.googlesource.com/c/go/+/217013 Run-TryBot: Josh Bleecher Snyder TryBot-Result: Gobot Gobot Reviewed-by: Michael Munday --- src/cmd/compile/internal/ssa/gen/S390X.rules | 171 +- src/cmd/compile/internal/ssa/rewriteS390X.go | 2016 +++--------------- 2 files changed, 414 insertions(+), 1773 deletions(-) diff --git a/src/cmd/compile/internal/ssa/gen/S390X.rules b/src/cmd/compile/internal/ssa/gen/S390X.rules index 9a8e0103c6..7761ee3b1e 100644 --- a/src/cmd/compile/internal/ssa/gen/S390X.rules +++ b/src/cmd/compile/internal/ssa/gen/S390X.rules @@ -3,27 +3,27 @@ // license that can be found in the LICENSE file. // Lowering arithmetic -(Add(64|Ptr) x y) -> (ADD x y) -(Add(32|16|8) x y) -> (ADDW x y) -(Add32F x y) -> (FADDS x y) -(Add64F x y) -> (FADD x y) - -(Sub(64|Ptr) x y) -> (SUB x y) -(Sub(32|16|8) x y) -> (SUBW x y) -(Sub32F x y) -> (FSUBS x y) -(Sub64F x y) -> (FSUB x y) - -(Mul64 x y) -> (MULLD x y) -(Mul(32|16|8) x y) -> (MULLW x y) -(Mul32F x y) -> (FMULS x y) -(Mul64F x y) -> (FMUL x y) -(Mul64uhilo x y) -> (MLGR x y) - -(Div32F x y) -> (FDIVS x y) -(Div64F x y) -> (FDIV x y) - -(Div64 x y) -> (DIVD x y) -(Div64u x y) -> (DIVDU x y) +(Add(64|Ptr) ...) -> (ADD ...) +(Add(32|16|8) ...) -> (ADDW ...) +(Add32F ...) -> (FADDS ...) +(Add64F ...) -> (FADD ...) + +(Sub(64|Ptr) ...) -> (SUB ...) +(Sub(32|16|8) ...) -> (SUBW ...) +(Sub32F ...) -> (FSUBS ...) +(Sub64F ...) -> (FSUB ...) + +(Mul64 ...) -> (MULLD ...) +(Mul(32|16|8) ...) -> (MULLW ...) +(Mul32F ...) -> (FMULS ...) +(Mul64F ...) -> (FMUL ...) +(Mul64uhilo ...) -> (MLGR ...) + +(Div32F ...) -> (FDIVS ...) +(Div64F ...) -> (FDIV ...) + +(Div64 [a] x y) -> (DIVD x y) +(Div64u ...) -> (DIVDU ...) // DIVW/DIVWU has a 64-bit dividend and a 32-bit divisor, // so a sign/zero extension of the dividend is required. (Div32 x y) -> (DIVW (MOVWreg x) y) @@ -33,11 +33,12 @@ (Div8 x y) -> (DIVW (MOVBreg x) (MOVBreg y)) (Div8u x y) -> (DIVWU (MOVBZreg x) (MOVBZreg y)) -(Hmul(64|64u) x y) -> (MULH(D|DU) x y) +(Hmul(64|64u) ...) -> (MULH(D|DU) ...) (Hmul32 x y) -> (SRDconst [32] (MULLD (MOVWreg x) (MOVWreg y))) (Hmul32u x y) -> (SRDconst [32] (MULLD (MOVWZreg x) (MOVWZreg y))) -(Mod(64|64u) x y) -> (MOD(D|DU) x y) +(Mod64 [a] x y) -> (MODD x y) +(Mod64u ...) -> (MODDU ...) // MODW/MODWU has a 64-bit dividend and a 32-bit divisor, // so a sign/zero extension of the dividend is required. (Mod32 x y) -> (MODW (MOVWreg x) y) @@ -50,28 +51,28 @@ // (x + y) / 2 with x>=y -> (x - y) / 2 + y (Avg64u x y) -> (ADD (SRDconst (SUB x y) [1]) y) -(And64 x y) -> (AND x y) -(And(32|16|8) x y) -> (ANDW x y) +(And64 ...) -> (AND ...) +(And(32|16|8) ...) -> (ANDW ...) -(Or64 x y) -> (OR x y) -(Or(32|16|8) x y) -> (ORW x y) +(Or64 ...) -> (OR ...) +(Or(32|16|8) ...) -> (ORW ...) -(Xor64 x y) -> (XOR x y) -(Xor(32|16|8) x y) -> (XORW x y) +(Xor64 ...) -> (XOR ...) +(Xor(32|16|8) ...) -> (XORW ...) -(Neg64 x) -> (NEG x) -(Neg(32|16|8) x) -> (NEGW x) -(Neg32F x) -> (FNEGS x) -(Neg64F x) -> (FNEG x) +(Neg64 ...) -> (NEG ...) +(Neg(32|16|8) ...) -> (NEGW ...) +(Neg32F ...) -> (FNEGS ...) +(Neg64F ...) -> (FNEG ...) -(Com64 x) -> (NOT x) -(Com(32|16|8) x) -> (NOTW x) -(NOT x) && true -> (XOR (MOVDconst [-1]) x) -(NOTW x) && true -> (XORWconst [-1] x) +(Com64 ...) -> (NOT ...) +(Com(32|16|8) ...) -> (NOTW ...) +(NOT x) -> (XOR (MOVDconst [-1]) x) +(NOTW x) -> (XORWconst [-1] x) // Lowering boolean ops -(AndB x y) -> (ANDW x y) -(OrB x y) -> (ORW x y) +(AndB ...) -> (ANDW ...) +(OrB ...) -> (ORW ...) (Not x) -> (XORWconst [1] x) // Lowering pointer arithmetic @@ -80,8 +81,8 @@ (OffPtr [off] ptr) -> (ADD (MOVDconst [off]) ptr) // TODO: optimize these cases? -(Ctz64NonZero x) -> (Ctz64 x) -(Ctz32NonZero x) -> (Ctz32 x) +(Ctz64NonZero ...) -> (Ctz64 ...) +(Ctz32NonZero ...) -> (Ctz32 ...) // Ctz(x) = 64 - findLeftmostOne((x-1)&^x) (Ctz64 x) -> (SUB (MOVDconst [64]) (FLOGR (AND (SUBconst [1] x) (NOT x)))) @@ -117,8 +118,8 @@ (SumBytes4 x) -> (SumBytes2 (ADDW (SRWconst x [16]) x)) (SumBytes8 x) -> (SumBytes4 (ADDW (SRDconst x [32]) x)) -(Bswap64 x) -> (MOVDBR x) -(Bswap32 x) -> (MOVWBR x) +(Bswap64 ...) -> (MOVDBR ...) +(Bswap32 ...) -> (MOVWBR ...) // add with carry (Select0 (Add64carry x y c)) @@ -133,7 +134,7 @@ -> (NEG (Select0 (SUBE (MOVDconst [0]) (MOVDconst [0]) (Select1 (SUBE x y (Select1 (SUBC (MOVDconst [0]) c))))))) // math package intrinsics -(Sqrt x) -> (FSQRT x) +(Sqrt ...) -> (FSQRT ...) (Floor x) -> (FIDBR [7] x) (Ceil x) -> (FIDBR [6] x) (Trunc x) -> (FIDBR [5] x) @@ -145,11 +146,11 @@ // The SYNC instruction (fast-BCR-serialization) prevents store-load // reordering. Other sequences of memory operations (load-load, // store-store and load-store) are already guaranteed not to be reordered. -(AtomicLoad(8|32|Acq32|64|Ptr) ptr mem) -> (MOV(BZ|WZ|WZ|D|D)atomicload ptr mem) +(AtomicLoad(8|32|Acq32|64|Ptr) ...) -> (MOV(BZ|WZ|WZ|D|D)atomicload ...) (AtomicStore(8|32|64|PtrNoWB) ptr val mem) -> (SYNC (MOV(B|W|D|D)atomicstore ptr val mem)) // Store-release doesn't require store-load ordering. -(AtomicStoreRel32 ptr val mem) -> (MOVWatomicstore ptr val mem) +(AtomicStoreRel32 ...) -> (MOVWatomicstore ...) // Atomic adds. (AtomicAdd32 ptr val mem) -> (AddTupleFirst32 val (LAA ptr val mem)) @@ -160,12 +161,12 @@ (Select1 (AddTupleFirst64 _ tuple)) -> (Select1 tuple) // Atomic exchanges. -(AtomicExchange32 ptr val mem) -> (LoweredAtomicExchange32 ptr val mem) -(AtomicExchange64 ptr val mem) -> (LoweredAtomicExchange64 ptr val mem) +(AtomicExchange32 ...) -> (LoweredAtomicExchange32 ...) +(AtomicExchange64 ...) -> (LoweredAtomicExchange64 ...) // Atomic compare and swap. -(AtomicCompareAndSwap32 ptr old new_ mem) -> (LoweredAtomicCas32 ptr old new_ mem) -(AtomicCompareAndSwap64 ptr old new_ mem) -> (LoweredAtomicCas64 ptr old new_ mem) +(AtomicCompareAndSwap32 ...) -> (LoweredAtomicCas32 ...) +(AtomicCompareAndSwap64 ...) -> (LoweredAtomicCas64 ...) // Atomic and: *(*uint8)(ptr) &= val // @@ -199,37 +200,37 @@ // Lowering extension // Note: we always extend to 64 bits even though some ops don't need that many result bits. -(SignExt8to(16|32|64) x) -> (MOVBreg x) -(SignExt16to(32|64) x) -> (MOVHreg x) -(SignExt32to64 x) -> (MOVWreg x) +(SignExt8to(16|32|64) ...) -> (MOVBreg ...) +(SignExt16to(32|64) ...) -> (MOVHreg ...) +(SignExt32to64 ...) -> (MOVWreg ...) -(ZeroExt8to(16|32|64) x) -> (MOVBZreg x) -(ZeroExt16to(32|64) x) -> (MOVHZreg x) -(ZeroExt32to64 x) -> (MOVWZreg x) +(ZeroExt8to(16|32|64) ...) -> (MOVBZreg ...) +(ZeroExt16to(32|64) ...) -> (MOVHZreg ...) +(ZeroExt32to64 ...) -> (MOVWZreg ...) (Slicemask x) -> (SRADconst (NEG x) [63]) // Lowering truncation // Because we ignore high parts of registers, truncates are just copies. -(Trunc(16|32|64)to8 x) -> x -(Trunc(32|64)to16 x) -> x -(Trunc64to32 x) -> x +(Trunc(16|32|64)to8 ...) -> (Copy ...) +(Trunc(32|64)to16 ...) -> (Copy ...) +(Trunc64to32 ...) -> (Copy ...) // Lowering float <-> int -(Cvt32to32F x) -> (CEFBRA x) -(Cvt32to64F x) -> (CDFBRA x) -(Cvt64to32F x) -> (CEGBRA x) -(Cvt64to64F x) -> (CDGBRA x) +(Cvt32to32F ...) -> (CEFBRA ...) +(Cvt32to64F ...) -> (CDFBRA ...) +(Cvt64to32F ...) -> (CEGBRA ...) +(Cvt64to64F ...) -> (CDGBRA ...) -(Cvt32Fto32 x) -> (CFEBRA x) -(Cvt32Fto64 x) -> (CGEBRA x) -(Cvt64Fto32 x) -> (CFDBRA x) -(Cvt64Fto64 x) -> (CGDBRA x) +(Cvt32Fto32 ...) -> (CFEBRA ...) +(Cvt32Fto64 ...) -> (CGEBRA ...) +(Cvt64Fto32 ...) -> (CFDBRA ...) +(Cvt64Fto64 ...) -> (CGDBRA ...) -(Cvt32Fto64F x) -> (LDEBR x) -(Cvt64Fto32F x) -> (LEDBR x) +(Cvt32Fto64F ...) -> (LDEBR ...) +(Cvt64Fto32F ...) -> (LEDBR ...) -(Round(32|64)F x) -> (LoweredRound(32|64)F x) +(Round(32|64)F ...) -> (LoweredRound(32|64)F ...) // Lowering shifts @@ -280,8 +281,8 @@ // Lowering rotates (RotateLeft8 x (MOVDconst [c])) -> (Or8 (Lsh8x64 x (MOVDconst [c&7])) (Rsh8Ux64 x (MOVDconst [-c&7]))) (RotateLeft16 x (MOVDconst [c])) -> (Or16 (Lsh16x64 x (MOVDconst [c&15])) (Rsh16Ux64 x (MOVDconst [-c&15]))) -(RotateLeft32 x y) -> (RLL x y) -(RotateLeft64 x y) -> (RLLG x y) +(RotateLeft32 ...) -> (RLL ...) +(RotateLeft64 ...) -> (RLLG ...) // Lowering comparisons (Less64 x y) -> (LOCGR {s390x.Less} (MOVDconst [0]) (MOVDconst [1]) (CMP x y)) @@ -423,26 +424,26 @@ (LoweredZero [s%256] destptr (ADDconst destptr [(s/256)*256]) mem) // Lowering constants -(Const(64|32|16|8) [val]) -> (MOVDconst [val]) -(Const(32|64)F [val]) -> (FMOV(S|D)const [val]) +(Const(64|32|16|8) ...) -> (MOVDconst ...) +(Const(32|64)F ...) -> (FMOV(S|D)const ...) (ConstNil) -> (MOVDconst [0]) -(ConstBool [b]) -> (MOVDconst [b]) +(ConstBool ...) -> (MOVDconst ...) // Lowering calls -(StaticCall [argwid] {target} mem) -> (CALLstatic [argwid] {target} mem) -(ClosureCall [argwid] entry closure mem) -> (CALLclosure [argwid] entry closure mem) -(InterCall [argwid] entry mem) -> (CALLinter [argwid] entry mem) +(StaticCall ...) -> (CALLstatic ...) +(ClosureCall ...) -> (CALLclosure ...) +(InterCall ...) -> (CALLinter ...) // Miscellaneous (IsNonNil p) -> (LOCGR {s390x.NotEqual} (MOVDconst [0]) (MOVDconst [1]) (CMPconst p [0])) (IsInBounds idx len) -> (LOCGR {s390x.Less} (MOVDconst [0]) (MOVDconst [1]) (CMPU idx len)) (IsSliceInBounds idx len) -> (LOCGR {s390x.LessOrEqual} (MOVDconst [0]) (MOVDconst [1]) (CMPU idx len)) -(NilCheck ptr mem) -> (LoweredNilCheck ptr mem) -(GetG mem) -> (LoweredGetG mem) -(GetClosurePtr) -> (LoweredGetClosurePtr) -(GetCallerSP) -> (LoweredGetCallerSP) -(GetCallerPC) -> (LoweredGetCallerPC) -(Addr {sym} base) -> (MOVDaddr {sym} base) +(NilCheck ...) -> (LoweredNilCheck ...) +(GetG ...) -> (LoweredGetG ...) +(GetClosurePtr ...) -> (LoweredGetClosurePtr ...) +(GetCallerSP ...) -> (LoweredGetCallerSP ...) +(GetCallerPC ...) -> (LoweredGetCallerPC ...) +(Addr ...) -> (MOVDaddr ...) (LocalAddr {sym} base _) -> (MOVDaddr {sym} base) (ITab (Load ptr mem)) -> (MOVDload ptr mem) @@ -450,7 +451,7 @@ (If cond yes no) -> (CLIJ {s390x.LessOrGreater} (MOVBZreg cond) [0] yes no) // Write barrier. -(WB {fn} destptr srcptr mem) -> (LoweredWB {fn} destptr srcptr mem) +(WB ...) -> (LoweredWB ...) (PanicBounds [kind] x y mem) && boundsABI(kind) == 0 -> (LoweredPanicBoundsA [kind] x y mem) (PanicBounds [kind] x y mem) && boundsABI(kind) == 1 -> (LoweredPanicBoundsB [kind] x y mem) diff --git a/src/cmd/compile/internal/ssa/rewriteS390X.go b/src/cmd/compile/internal/ssa/rewriteS390X.go index f396babee3..d9262305e8 100644 --- a/src/cmd/compile/internal/ssa/rewriteS390X.go +++ b/src/cmd/compile/internal/ssa/rewriteS390X.go @@ -9,31 +9,44 @@ import "cmd/internal/obj/s390x" func rewriteValueS390X(v *Value) bool { switch v.Op { case OpAdd16: - return rewriteValueS390X_OpAdd16(v) + v.Op = OpS390XADDW + return true case OpAdd32: - return rewriteValueS390X_OpAdd32(v) + v.Op = OpS390XADDW + return true case OpAdd32F: - return rewriteValueS390X_OpAdd32F(v) + v.Op = OpS390XFADDS + return true case OpAdd64: - return rewriteValueS390X_OpAdd64(v) + v.Op = OpS390XADD + return true case OpAdd64F: - return rewriteValueS390X_OpAdd64F(v) + v.Op = OpS390XFADD + return true case OpAdd8: - return rewriteValueS390X_OpAdd8(v) + v.Op = OpS390XADDW + return true case OpAddPtr: - return rewriteValueS390X_OpAddPtr(v) + v.Op = OpS390XADD + return true case OpAddr: - return rewriteValueS390X_OpAddr(v) + v.Op = OpS390XMOVDaddr + return true case OpAnd16: - return rewriteValueS390X_OpAnd16(v) + v.Op = OpS390XANDW + return true case OpAnd32: - return rewriteValueS390X_OpAnd32(v) + v.Op = OpS390XANDW + return true case OpAnd64: - return rewriteValueS390X_OpAnd64(v) + v.Op = OpS390XAND + return true case OpAnd8: - return rewriteValueS390X_OpAnd8(v) + v.Op = OpS390XANDW + return true case OpAndB: - return rewriteValueS390X_OpAndB(v) + v.Op = OpS390XANDW + return true case OpAtomicAdd32: return rewriteValueS390X_OpAtomicAdd32(v) case OpAtomicAdd64: @@ -41,23 +54,32 @@ func rewriteValueS390X(v *Value) bool { case OpAtomicAnd8: return rewriteValueS390X_OpAtomicAnd8(v) case OpAtomicCompareAndSwap32: - return rewriteValueS390X_OpAtomicCompareAndSwap32(v) + v.Op = OpS390XLoweredAtomicCas32 + return true case OpAtomicCompareAndSwap64: - return rewriteValueS390X_OpAtomicCompareAndSwap64(v) + v.Op = OpS390XLoweredAtomicCas64 + return true case OpAtomicExchange32: - return rewriteValueS390X_OpAtomicExchange32(v) + v.Op = OpS390XLoweredAtomicExchange32 + return true case OpAtomicExchange64: - return rewriteValueS390X_OpAtomicExchange64(v) + v.Op = OpS390XLoweredAtomicExchange64 + return true case OpAtomicLoad32: - return rewriteValueS390X_OpAtomicLoad32(v) + v.Op = OpS390XMOVWZatomicload + return true case OpAtomicLoad64: - return rewriteValueS390X_OpAtomicLoad64(v) + v.Op = OpS390XMOVDatomicload + return true case OpAtomicLoad8: - return rewriteValueS390X_OpAtomicLoad8(v) + v.Op = OpS390XMOVBZatomicload + return true case OpAtomicLoadAcq32: - return rewriteValueS390X_OpAtomicLoadAcq32(v) + v.Op = OpS390XMOVWZatomicload + return true case OpAtomicLoadPtr: - return rewriteValueS390X_OpAtomicLoadPtr(v) + v.Op = OpS390XMOVDatomicload + return true case OpAtomicOr8: return rewriteValueS390X_OpAtomicOr8(v) case OpAtomicStore32: @@ -69,71 +91,98 @@ func rewriteValueS390X(v *Value) bool { case OpAtomicStorePtrNoWB: return rewriteValueS390X_OpAtomicStorePtrNoWB(v) case OpAtomicStoreRel32: - return rewriteValueS390X_OpAtomicStoreRel32(v) + v.Op = OpS390XMOVWatomicstore + return true case OpAvg64u: return rewriteValueS390X_OpAvg64u(v) case OpBitLen64: return rewriteValueS390X_OpBitLen64(v) case OpBswap32: - return rewriteValueS390X_OpBswap32(v) + v.Op = OpS390XMOVWBR + return true case OpBswap64: - return rewriteValueS390X_OpBswap64(v) + v.Op = OpS390XMOVDBR + return true case OpCeil: return rewriteValueS390X_OpCeil(v) case OpClosureCall: - return rewriteValueS390X_OpClosureCall(v) + v.Op = OpS390XCALLclosure + return true case OpCom16: - return rewriteValueS390X_OpCom16(v) + v.Op = OpS390XNOTW + return true case OpCom32: - return rewriteValueS390X_OpCom32(v) + v.Op = OpS390XNOTW + return true case OpCom64: - return rewriteValueS390X_OpCom64(v) + v.Op = OpS390XNOT + return true case OpCom8: - return rewriteValueS390X_OpCom8(v) + v.Op = OpS390XNOTW + return true case OpConst16: - return rewriteValueS390X_OpConst16(v) + v.Op = OpS390XMOVDconst + return true case OpConst32: - return rewriteValueS390X_OpConst32(v) + v.Op = OpS390XMOVDconst + return true case OpConst32F: - return rewriteValueS390X_OpConst32F(v) + v.Op = OpS390XFMOVSconst + return true case OpConst64: - return rewriteValueS390X_OpConst64(v) + v.Op = OpS390XMOVDconst + return true case OpConst64F: - return rewriteValueS390X_OpConst64F(v) + v.Op = OpS390XFMOVDconst + return true case OpConst8: - return rewriteValueS390X_OpConst8(v) + v.Op = OpS390XMOVDconst + return true case OpConstBool: - return rewriteValueS390X_OpConstBool(v) + v.Op = OpS390XMOVDconst + return true case OpConstNil: return rewriteValueS390X_OpConstNil(v) case OpCtz32: return rewriteValueS390X_OpCtz32(v) case OpCtz32NonZero: - return rewriteValueS390X_OpCtz32NonZero(v) + v.Op = OpCtz32 + return true case OpCtz64: return rewriteValueS390X_OpCtz64(v) case OpCtz64NonZero: - return rewriteValueS390X_OpCtz64NonZero(v) + v.Op = OpCtz64 + return true case OpCvt32Fto32: - return rewriteValueS390X_OpCvt32Fto32(v) + v.Op = OpS390XCFEBRA + return true case OpCvt32Fto64: - return rewriteValueS390X_OpCvt32Fto64(v) + v.Op = OpS390XCGEBRA + return true case OpCvt32Fto64F: - return rewriteValueS390X_OpCvt32Fto64F(v) + v.Op = OpS390XLDEBR + return true case OpCvt32to32F: - return rewriteValueS390X_OpCvt32to32F(v) + v.Op = OpS390XCEFBRA + return true case OpCvt32to64F: - return rewriteValueS390X_OpCvt32to64F(v) + v.Op = OpS390XCDFBRA + return true case OpCvt64Fto32: - return rewriteValueS390X_OpCvt64Fto32(v) + v.Op = OpS390XCFDBRA + return true case OpCvt64Fto32F: - return rewriteValueS390X_OpCvt64Fto32F(v) + v.Op = OpS390XLEDBR + return true case OpCvt64Fto64: - return rewriteValueS390X_OpCvt64Fto64(v) + v.Op = OpS390XCGDBRA + return true case OpCvt64to32F: - return rewriteValueS390X_OpCvt64to32F(v) + v.Op = OpS390XCEGBRA + return true case OpCvt64to64F: - return rewriteValueS390X_OpCvt64to64F(v) + v.Op = OpS390XCDGBRA + return true case OpDiv16: return rewriteValueS390X_OpDiv16(v) case OpDiv16u: @@ -141,15 +190,18 @@ func rewriteValueS390X(v *Value) bool { case OpDiv32: return rewriteValueS390X_OpDiv32(v) case OpDiv32F: - return rewriteValueS390X_OpDiv32F(v) + v.Op = OpS390XFDIVS + return true case OpDiv32u: return rewriteValueS390X_OpDiv32u(v) case OpDiv64: return rewriteValueS390X_OpDiv64(v) case OpDiv64F: - return rewriteValueS390X_OpDiv64F(v) + v.Op = OpS390XFDIV + return true case OpDiv64u: - return rewriteValueS390X_OpDiv64u(v) + v.Op = OpS390XDIVDU + return true case OpDiv8: return rewriteValueS390X_OpDiv8(v) case OpDiv8u: @@ -195,13 +247,17 @@ func rewriteValueS390X(v *Value) bool { case OpGeq8U: return rewriteValueS390X_OpGeq8U(v) case OpGetCallerPC: - return rewriteValueS390X_OpGetCallerPC(v) + v.Op = OpS390XLoweredGetCallerPC + return true case OpGetCallerSP: - return rewriteValueS390X_OpGetCallerSP(v) + v.Op = OpS390XLoweredGetCallerSP + return true case OpGetClosurePtr: - return rewriteValueS390X_OpGetClosurePtr(v) + v.Op = OpS390XLoweredGetClosurePtr + return true case OpGetG: - return rewriteValueS390X_OpGetG(v) + v.Op = OpS390XLoweredGetG + return true case OpGreater16: return rewriteValueS390X_OpGreater16(v) case OpGreater16U: @@ -227,13 +283,16 @@ func rewriteValueS390X(v *Value) bool { case OpHmul32u: return rewriteValueS390X_OpHmul32u(v) case OpHmul64: - return rewriteValueS390X_OpHmul64(v) + v.Op = OpS390XMULHD + return true case OpHmul64u: - return rewriteValueS390X_OpHmul64u(v) + v.Op = OpS390XMULHDU + return true case OpITab: return rewriteValueS390X_OpITab(v) case OpInterCall: - return rewriteValueS390X_OpInterCall(v) + v.Op = OpS390XCALLinter + return true case OpIsInBounds: return rewriteValueS390X_OpIsInBounds(v) case OpIsNonNil: @@ -327,7 +386,8 @@ func rewriteValueS390X(v *Value) bool { case OpMod64: return rewriteValueS390X_OpMod64(v) case OpMod64u: - return rewriteValueS390X_OpMod64u(v) + v.Op = OpS390XMODDU + return true case OpMod8: return rewriteValueS390X_OpMod8(v) case OpMod8u: @@ -335,31 +395,44 @@ func rewriteValueS390X(v *Value) bool { case OpMove: return rewriteValueS390X_OpMove(v) case OpMul16: - return rewriteValueS390X_OpMul16(v) + v.Op = OpS390XMULLW + return true case OpMul32: - return rewriteValueS390X_OpMul32(v) + v.Op = OpS390XMULLW + return true case OpMul32F: - return rewriteValueS390X_OpMul32F(v) + v.Op = OpS390XFMULS + return true case OpMul64: - return rewriteValueS390X_OpMul64(v) + v.Op = OpS390XMULLD + return true case OpMul64F: - return rewriteValueS390X_OpMul64F(v) + v.Op = OpS390XFMUL + return true case OpMul64uhilo: - return rewriteValueS390X_OpMul64uhilo(v) + v.Op = OpS390XMLGR + return true case OpMul8: - return rewriteValueS390X_OpMul8(v) + v.Op = OpS390XMULLW + return true case OpNeg16: - return rewriteValueS390X_OpNeg16(v) + v.Op = OpS390XNEGW + return true case OpNeg32: - return rewriteValueS390X_OpNeg32(v) + v.Op = OpS390XNEGW + return true case OpNeg32F: - return rewriteValueS390X_OpNeg32F(v) + v.Op = OpS390XFNEGS + return true case OpNeg64: - return rewriteValueS390X_OpNeg64(v) + v.Op = OpS390XNEG + return true case OpNeg64F: - return rewriteValueS390X_OpNeg64F(v) + v.Op = OpS390XFNEG + return true case OpNeg8: - return rewriteValueS390X_OpNeg8(v) + v.Op = OpS390XNEGW + return true case OpNeq16: return rewriteValueS390X_OpNeq16(v) case OpNeq32: @@ -377,21 +450,27 @@ func rewriteValueS390X(v *Value) bool { case OpNeqPtr: return rewriteValueS390X_OpNeqPtr(v) case OpNilCheck: - return rewriteValueS390X_OpNilCheck(v) + v.Op = OpS390XLoweredNilCheck + return true case OpNot: return rewriteValueS390X_OpNot(v) case OpOffPtr: return rewriteValueS390X_OpOffPtr(v) case OpOr16: - return rewriteValueS390X_OpOr16(v) + v.Op = OpS390XORW + return true case OpOr32: - return rewriteValueS390X_OpOr32(v) + v.Op = OpS390XORW + return true case OpOr64: - return rewriteValueS390X_OpOr64(v) + v.Op = OpS390XOR + return true case OpOr8: - return rewriteValueS390X_OpOr8(v) + v.Op = OpS390XORW + return true case OpOrB: - return rewriteValueS390X_OpOrB(v) + v.Op = OpS390XORW + return true case OpPanicBounds: return rewriteValueS390X_OpPanicBounds(v) case OpPopCount16: @@ -405,17 +484,21 @@ func rewriteValueS390X(v *Value) bool { case OpRotateLeft16: return rewriteValueS390X_OpRotateLeft16(v) case OpRotateLeft32: - return rewriteValueS390X_OpRotateLeft32(v) + v.Op = OpS390XRLL + return true case OpRotateLeft64: - return rewriteValueS390X_OpRotateLeft64(v) + v.Op = OpS390XRLLG + return true case OpRotateLeft8: return rewriteValueS390X_OpRotateLeft8(v) case OpRound: return rewriteValueS390X_OpRound(v) case OpRound32F: - return rewriteValueS390X_OpRound32F(v) + v.Op = OpS390XLoweredRound32F + return true case OpRound64F: - return rewriteValueS390X_OpRound64F(v) + v.Op = OpS390XLoweredRound64F + return true case OpRoundToEven: return rewriteValueS390X_OpRoundToEven(v) case OpRsh16Ux16: @@ -737,260 +820,111 @@ func rewriteValueS390X(v *Value) bool { case OpSelect1: return rewriteValueS390X_OpSelect1(v) case OpSignExt16to32: - return rewriteValueS390X_OpSignExt16to32(v) + v.Op = OpS390XMOVHreg + return true case OpSignExt16to64: - return rewriteValueS390X_OpSignExt16to64(v) + v.Op = OpS390XMOVHreg + return true case OpSignExt32to64: - return rewriteValueS390X_OpSignExt32to64(v) + v.Op = OpS390XMOVWreg + return true case OpSignExt8to16: - return rewriteValueS390X_OpSignExt8to16(v) + v.Op = OpS390XMOVBreg + return true case OpSignExt8to32: - return rewriteValueS390X_OpSignExt8to32(v) + v.Op = OpS390XMOVBreg + return true case OpSignExt8to64: - return rewriteValueS390X_OpSignExt8to64(v) + v.Op = OpS390XMOVBreg + return true case OpSlicemask: return rewriteValueS390X_OpSlicemask(v) case OpSqrt: - return rewriteValueS390X_OpSqrt(v) + v.Op = OpS390XFSQRT + return true case OpStaticCall: - return rewriteValueS390X_OpStaticCall(v) + v.Op = OpS390XCALLstatic + return true case OpStore: return rewriteValueS390X_OpStore(v) case OpSub16: - return rewriteValueS390X_OpSub16(v) + v.Op = OpS390XSUBW + return true case OpSub32: - return rewriteValueS390X_OpSub32(v) + v.Op = OpS390XSUBW + return true case OpSub32F: - return rewriteValueS390X_OpSub32F(v) + v.Op = OpS390XFSUBS + return true case OpSub64: - return rewriteValueS390X_OpSub64(v) + v.Op = OpS390XSUB + return true case OpSub64F: - return rewriteValueS390X_OpSub64F(v) + v.Op = OpS390XFSUB + return true case OpSub8: - return rewriteValueS390X_OpSub8(v) + v.Op = OpS390XSUBW + return true case OpSubPtr: - return rewriteValueS390X_OpSubPtr(v) + v.Op = OpS390XSUB + return true case OpTrunc: return rewriteValueS390X_OpTrunc(v) case OpTrunc16to8: - return rewriteValueS390X_OpTrunc16to8(v) + v.Op = OpCopy + return true case OpTrunc32to16: - return rewriteValueS390X_OpTrunc32to16(v) + v.Op = OpCopy + return true case OpTrunc32to8: - return rewriteValueS390X_OpTrunc32to8(v) + v.Op = OpCopy + return true case OpTrunc64to16: - return rewriteValueS390X_OpTrunc64to16(v) + v.Op = OpCopy + return true case OpTrunc64to32: - return rewriteValueS390X_OpTrunc64to32(v) + v.Op = OpCopy + return true case OpTrunc64to8: - return rewriteValueS390X_OpTrunc64to8(v) + v.Op = OpCopy + return true case OpWB: - return rewriteValueS390X_OpWB(v) + v.Op = OpS390XLoweredWB + return true case OpXor16: - return rewriteValueS390X_OpXor16(v) + v.Op = OpS390XXORW + return true case OpXor32: - return rewriteValueS390X_OpXor32(v) + v.Op = OpS390XXORW + return true case OpXor64: - return rewriteValueS390X_OpXor64(v) + v.Op = OpS390XXOR + return true case OpXor8: - return rewriteValueS390X_OpXor8(v) + v.Op = OpS390XXORW + return true case OpZero: return rewriteValueS390X_OpZero(v) case OpZeroExt16to32: - return rewriteValueS390X_OpZeroExt16to32(v) - case OpZeroExt16to64: - return rewriteValueS390X_OpZeroExt16to64(v) - case OpZeroExt32to64: - return rewriteValueS390X_OpZeroExt32to64(v) - case OpZeroExt8to16: - return rewriteValueS390X_OpZeroExt8to16(v) - case OpZeroExt8to32: - return rewriteValueS390X_OpZeroExt8to32(v) - case OpZeroExt8to64: - return rewriteValueS390X_OpZeroExt8to64(v) - } - return false -} -func rewriteValueS390X_OpAdd16(v *Value) bool { - v_1 := v.Args[1] - v_0 := v.Args[0] - // match: (Add16 x y) - // result: (ADDW x y) - for { - x := v_0 - y := v_1 - v.reset(OpS390XADDW) - v.AddArg(x) - v.AddArg(y) - return true - } -} -func rewriteValueS390X_OpAdd32(v *Value) bool { - v_1 := v.Args[1] - v_0 := v.Args[0] - // match: (Add32 x y) - // result: (ADDW x y) - for { - x := v_0 - y := v_1 - v.reset(OpS390XADDW) - v.AddArg(x) - v.AddArg(y) - return true - } -} -func rewriteValueS390X_OpAdd32F(v *Value) bool { - v_1 := v.Args[1] - v_0 := v.Args[0] - // match: (Add32F x y) - // result: (FADDS x y) - for { - x := v_0 - y := v_1 - v.reset(OpS390XFADDS) - v.AddArg(x) - v.AddArg(y) - return true - } -} -func rewriteValueS390X_OpAdd64(v *Value) bool { - v_1 := v.Args[1] - v_0 := v.Args[0] - // match: (Add64 x y) - // result: (ADD x y) - for { - x := v_0 - y := v_1 - v.reset(OpS390XADD) - v.AddArg(x) - v.AddArg(y) - return true - } -} -func rewriteValueS390X_OpAdd64F(v *Value) bool { - v_1 := v.Args[1] - v_0 := v.Args[0] - // match: (Add64F x y) - // result: (FADD x y) - for { - x := v_0 - y := v_1 - v.reset(OpS390XFADD) - v.AddArg(x) - v.AddArg(y) - return true - } -} -func rewriteValueS390X_OpAdd8(v *Value) bool { - v_1 := v.Args[1] - v_0 := v.Args[0] - // match: (Add8 x y) - // result: (ADDW x y) - for { - x := v_0 - y := v_1 - v.reset(OpS390XADDW) - v.AddArg(x) - v.AddArg(y) - return true - } -} -func rewriteValueS390X_OpAddPtr(v *Value) bool { - v_1 := v.Args[1] - v_0 := v.Args[0] - // match: (AddPtr x y) - // result: (ADD x y) - for { - x := v_0 - y := v_1 - v.reset(OpS390XADD) - v.AddArg(x) - v.AddArg(y) - return true - } -} -func rewriteValueS390X_OpAddr(v *Value) bool { - v_0 := v.Args[0] - // match: (Addr {sym} base) - // result: (MOVDaddr {sym} base) - for { - sym := v.Aux - base := v_0 - v.reset(OpS390XMOVDaddr) - v.Aux = sym - v.AddArg(base) + v.Op = OpS390XMOVHZreg return true - } -} -func rewriteValueS390X_OpAnd16(v *Value) bool { - v_1 := v.Args[1] - v_0 := v.Args[0] - // match: (And16 x y) - // result: (ANDW x y) - for { - x := v_0 - y := v_1 - v.reset(OpS390XANDW) - v.AddArg(x) - v.AddArg(y) + case OpZeroExt16to64: + v.Op = OpS390XMOVHZreg return true - } -} -func rewriteValueS390X_OpAnd32(v *Value) bool { - v_1 := v.Args[1] - v_0 := v.Args[0] - // match: (And32 x y) - // result: (ANDW x y) - for { - x := v_0 - y := v_1 - v.reset(OpS390XANDW) - v.AddArg(x) - v.AddArg(y) + case OpZeroExt32to64: + v.Op = OpS390XMOVWZreg return true - } -} -func rewriteValueS390X_OpAnd64(v *Value) bool { - v_1 := v.Args[1] - v_0 := v.Args[0] - // match: (And64 x y) - // result: (AND x y) - for { - x := v_0 - y := v_1 - v.reset(OpS390XAND) - v.AddArg(x) - v.AddArg(y) + case OpZeroExt8to16: + v.Op = OpS390XMOVBZreg return true - } -} -func rewriteValueS390X_OpAnd8(v *Value) bool { - v_1 := v.Args[1] - v_0 := v.Args[0] - // match: (And8 x y) - // result: (ANDW x y) - for { - x := v_0 - y := v_1 - v.reset(OpS390XANDW) - v.AddArg(x) - v.AddArg(y) + case OpZeroExt8to32: + v.Op = OpS390XMOVBZreg return true - } -} -func rewriteValueS390X_OpAndB(v *Value) bool { - v_1 := v.Args[1] - v_0 := v.Args[0] - // match: (AndB x y) - // result: (ANDW x y) - for { - x := v_0 - y := v_1 - v.reset(OpS390XANDW) - v.AddArg(x) - v.AddArg(y) + case OpZeroExt8to64: + v.Op = OpS390XMOVBZreg return true } + return false } func rewriteValueS390X_OpAtomicAdd32(v *Value) bool { v_2 := v.Args[2] @@ -1067,151 +1001,7 @@ func rewriteValueS390X_OpAtomicAnd8(v *Value) bool { return true } } -func rewriteValueS390X_OpAtomicCompareAndSwap32(v *Value) bool { - v_3 := v.Args[3] - v_2 := v.Args[2] - v_1 := v.Args[1] - v_0 := v.Args[0] - // match: (AtomicCompareAndSwap32 ptr old new_ mem) - // result: (LoweredAtomicCas32 ptr old new_ mem) - for { - ptr := v_0 - old := v_1 - new_ := v_2 - mem := v_3 - v.reset(OpS390XLoweredAtomicCas32) - v.AddArg(ptr) - v.AddArg(old) - v.AddArg(new_) - v.AddArg(mem) - return true - } -} -func rewriteValueS390X_OpAtomicCompareAndSwap64(v *Value) bool { - v_3 := v.Args[3] - v_2 := v.Args[2] - v_1 := v.Args[1] - v_0 := v.Args[0] - // match: (AtomicCompareAndSwap64 ptr old new_ mem) - // result: (LoweredAtomicCas64 ptr old new_ mem) - for { - ptr := v_0 - old := v_1 - new_ := v_2 - mem := v_3 - v.reset(OpS390XLoweredAtomicCas64) - v.AddArg(ptr) - v.AddArg(old) - v.AddArg(new_) - v.AddArg(mem) - return true - } -} -func rewriteValueS390X_OpAtomicExchange32(v *Value) bool { - v_2 := v.Args[2] - v_1 := v.Args[1] - v_0 := v.Args[0] - // match: (AtomicExchange32 ptr val mem) - // result: (LoweredAtomicExchange32 ptr val mem) - for { - ptr := v_0 - val := v_1 - mem := v_2 - v.reset(OpS390XLoweredAtomicExchange32) - v.AddArg(ptr) - v.AddArg(val) - v.AddArg(mem) - return true - } -} -func rewriteValueS390X_OpAtomicExchange64(v *Value) bool { - v_2 := v.Args[2] - v_1 := v.Args[1] - v_0 := v.Args[0] - // match: (AtomicExchange64 ptr val mem) - // result: (LoweredAtomicExchange64 ptr val mem) - for { - ptr := v_0 - val := v_1 - mem := v_2 - v.reset(OpS390XLoweredAtomicExchange64) - v.AddArg(ptr) - v.AddArg(val) - v.AddArg(mem) - return true - } -} -func rewriteValueS390X_OpAtomicLoad32(v *Value) bool { - v_1 := v.Args[1] - v_0 := v.Args[0] - // match: (AtomicLoad32 ptr mem) - // result: (MOVWZatomicload ptr mem) - for { - ptr := v_0 - mem := v_1 - v.reset(OpS390XMOVWZatomicload) - v.AddArg(ptr) - v.AddArg(mem) - return true - } -} -func rewriteValueS390X_OpAtomicLoad64(v *Value) bool { - v_1 := v.Args[1] - v_0 := v.Args[0] - // match: (AtomicLoad64 ptr mem) - // result: (MOVDatomicload ptr mem) - for { - ptr := v_0 - mem := v_1 - v.reset(OpS390XMOVDatomicload) - v.AddArg(ptr) - v.AddArg(mem) - return true - } -} -func rewriteValueS390X_OpAtomicLoad8(v *Value) bool { - v_1 := v.Args[1] - v_0 := v.Args[0] - // match: (AtomicLoad8 ptr mem) - // result: (MOVBZatomicload ptr mem) - for { - ptr := v_0 - mem := v_1 - v.reset(OpS390XMOVBZatomicload) - v.AddArg(ptr) - v.AddArg(mem) - return true - } -} -func rewriteValueS390X_OpAtomicLoadAcq32(v *Value) bool { - v_1 := v.Args[1] - v_0 := v.Args[0] - // match: (AtomicLoadAcq32 ptr mem) - // result: (MOVWZatomicload ptr mem) - for { - ptr := v_0 - mem := v_1 - v.reset(OpS390XMOVWZatomicload) - v.AddArg(ptr) - v.AddArg(mem) - return true - } -} -func rewriteValueS390X_OpAtomicLoadPtr(v *Value) bool { - v_1 := v.Args[1] - v_0 := v.Args[0] - // match: (AtomicLoadPtr ptr mem) - // result: (MOVDatomicload ptr mem) - for { - ptr := v_0 - mem := v_1 - v.reset(OpS390XMOVDatomicload) - v.AddArg(ptr) - v.AddArg(mem) - return true - } -} -func rewriteValueS390X_OpAtomicOr8(v *Value) bool { +func rewriteValueS390X_OpAtomicOr8(v *Value) bool { v_2 := v.Args[2] v_1 := v.Args[1] v_0 := v.Args[0] @@ -1321,23 +1111,6 @@ func rewriteValueS390X_OpAtomicStorePtrNoWB(v *Value) bool { return true } } -func rewriteValueS390X_OpAtomicStoreRel32(v *Value) bool { - v_2 := v.Args[2] - v_1 := v.Args[1] - v_0 := v.Args[0] - // match: (AtomicStoreRel32 ptr val mem) - // result: (MOVWatomicstore ptr val mem) - for { - ptr := v_0 - val := v_1 - mem := v_2 - v.reset(OpS390XMOVWatomicstore) - v.AddArg(ptr) - v.AddArg(val) - v.AddArg(mem) - return true - } -} func rewriteValueS390X_OpAvg64u(v *Value) bool { v_1 := v.Args[1] v_0 := v.Args[0] @@ -1378,28 +1151,6 @@ func rewriteValueS390X_OpBitLen64(v *Value) bool { return true } } -func rewriteValueS390X_OpBswap32(v *Value) bool { - v_0 := v.Args[0] - // match: (Bswap32 x) - // result: (MOVWBR x) - for { - x := v_0 - v.reset(OpS390XMOVWBR) - v.AddArg(x) - return true - } -} -func rewriteValueS390X_OpBswap64(v *Value) bool { - v_0 := v.Args[0] - // match: (Bswap64 x) - // result: (MOVDBR x) - for { - x := v_0 - v.reset(OpS390XMOVDBR) - v.AddArg(x) - return true - } -} func rewriteValueS390X_OpCeil(v *Value) bool { v_0 := v.Args[0] // match: (Ceil x) @@ -1412,139 +1163,6 @@ func rewriteValueS390X_OpCeil(v *Value) bool { return true } } -func rewriteValueS390X_OpClosureCall(v *Value) bool { - v_2 := v.Args[2] - v_1 := v.Args[1] - v_0 := v.Args[0] - // match: (ClosureCall [argwid] entry closure mem) - // result: (CALLclosure [argwid] entry closure mem) - for { - argwid := v.AuxInt - entry := v_0 - closure := v_1 - mem := v_2 - v.reset(OpS390XCALLclosure) - v.AuxInt = argwid - v.AddArg(entry) - v.AddArg(closure) - v.AddArg(mem) - return true - } -} -func rewriteValueS390X_OpCom16(v *Value) bool { - v_0 := v.Args[0] - // match: (Com16 x) - // result: (NOTW x) - for { - x := v_0 - v.reset(OpS390XNOTW) - v.AddArg(x) - return true - } -} -func rewriteValueS390X_OpCom32(v *Value) bool { - v_0 := v.Args[0] - // match: (Com32 x) - // result: (NOTW x) - for { - x := v_0 - v.reset(OpS390XNOTW) - v.AddArg(x) - return true - } -} -func rewriteValueS390X_OpCom64(v *Value) bool { - v_0 := v.Args[0] - // match: (Com64 x) - // result: (NOT x) - for { - x := v_0 - v.reset(OpS390XNOT) - v.AddArg(x) - return true - } -} -func rewriteValueS390X_OpCom8(v *Value) bool { - v_0 := v.Args[0] - // match: (Com8 x) - // result: (NOTW x) - for { - x := v_0 - v.reset(OpS390XNOTW) - v.AddArg(x) - return true - } -} -func rewriteValueS390X_OpConst16(v *Value) bool { - // match: (Const16 [val]) - // result: (MOVDconst [val]) - for { - val := v.AuxInt - v.reset(OpS390XMOVDconst) - v.AuxInt = val - return true - } -} -func rewriteValueS390X_OpConst32(v *Value) bool { - // match: (Const32 [val]) - // result: (MOVDconst [val]) - for { - val := v.AuxInt - v.reset(OpS390XMOVDconst) - v.AuxInt = val - return true - } -} -func rewriteValueS390X_OpConst32F(v *Value) bool { - // match: (Const32F [val]) - // result: (FMOVSconst [val]) - for { - val := v.AuxInt - v.reset(OpS390XFMOVSconst) - v.AuxInt = val - return true - } -} -func rewriteValueS390X_OpConst64(v *Value) bool { - // match: (Const64 [val]) - // result: (MOVDconst [val]) - for { - val := v.AuxInt - v.reset(OpS390XMOVDconst) - v.AuxInt = val - return true - } -} -func rewriteValueS390X_OpConst64F(v *Value) bool { - // match: (Const64F [val]) - // result: (FMOVDconst [val]) - for { - val := v.AuxInt - v.reset(OpS390XFMOVDconst) - v.AuxInt = val - return true - } -} -func rewriteValueS390X_OpConst8(v *Value) bool { - // match: (Const8 [val]) - // result: (MOVDconst [val]) - for { - val := v.AuxInt - v.reset(OpS390XMOVDconst) - v.AuxInt = val - return true - } -} -func rewriteValueS390X_OpConstBool(v *Value) bool { - // match: (ConstBool [b]) - // result: (MOVDconst [b]) - for { - b := v.AuxInt - v.reset(OpS390XMOVDconst) - v.AuxInt = b - return true - } -} func rewriteValueS390X_OpConstNil(v *Value) bool { // match: (ConstNil) // result: (MOVDconst [0]) @@ -1583,17 +1201,6 @@ func rewriteValueS390X_OpCtz32(v *Value) bool { return true } } -func rewriteValueS390X_OpCtz32NonZero(v *Value) bool { - v_0 := v.Args[0] - // match: (Ctz32NonZero x) - // result: (Ctz32 x) - for { - x := v_0 - v.reset(OpCtz32) - v.AddArg(x) - return true - } -} func rewriteValueS390X_OpCtz64(v *Value) bool { v_0 := v.Args[0] b := v.Block @@ -1621,127 +1228,6 @@ func rewriteValueS390X_OpCtz64(v *Value) bool { return true } } -func rewriteValueS390X_OpCtz64NonZero(v *Value) bool { - v_0 := v.Args[0] - // match: (Ctz64NonZero x) - // result: (Ctz64 x) - for { - x := v_0 - v.reset(OpCtz64) - v.AddArg(x) - return true - } -} -func rewriteValueS390X_OpCvt32Fto32(v *Value) bool { - v_0 := v.Args[0] - // match: (Cvt32Fto32 x) - // result: (CFEBRA x) - for { - x := v_0 - v.reset(OpS390XCFEBRA) - v.AddArg(x) - return true - } -} -func rewriteValueS390X_OpCvt32Fto64(v *Value) bool { - v_0 := v.Args[0] - // match: (Cvt32Fto64 x) - // result: (CGEBRA x) - for { - x := v_0 - v.reset(OpS390XCGEBRA) - v.AddArg(x) - return true - } -} -func rewriteValueS390X_OpCvt32Fto64F(v *Value) bool { - v_0 := v.Args[0] - // match: (Cvt32Fto64F x) - // result: (LDEBR x) - for { - x := v_0 - v.reset(OpS390XLDEBR) - v.AddArg(x) - return true - } -} -func rewriteValueS390X_OpCvt32to32F(v *Value) bool { - v_0 := v.Args[0] - // match: (Cvt32to32F x) - // result: (CEFBRA x) - for { - x := v_0 - v.reset(OpS390XCEFBRA) - v.AddArg(x) - return true - } -} -func rewriteValueS390X_OpCvt32to64F(v *Value) bool { - v_0 := v.Args[0] - // match: (Cvt32to64F x) - // result: (CDFBRA x) - for { - x := v_0 - v.reset(OpS390XCDFBRA) - v.AddArg(x) - return true - } -} -func rewriteValueS390X_OpCvt64Fto32(v *Value) bool { - v_0 := v.Args[0] - // match: (Cvt64Fto32 x) - // result: (CFDBRA x) - for { - x := v_0 - v.reset(OpS390XCFDBRA) - v.AddArg(x) - return true - } -} -func rewriteValueS390X_OpCvt64Fto32F(v *Value) bool { - v_0 := v.Args[0] - // match: (Cvt64Fto32F x) - // result: (LEDBR x) - for { - x := v_0 - v.reset(OpS390XLEDBR) - v.AddArg(x) - return true - } -} -func rewriteValueS390X_OpCvt64Fto64(v *Value) bool { - v_0 := v.Args[0] - // match: (Cvt64Fto64 x) - // result: (CGDBRA x) - for { - x := v_0 - v.reset(OpS390XCGDBRA) - v.AddArg(x) - return true - } -} -func rewriteValueS390X_OpCvt64to32F(v *Value) bool { - v_0 := v.Args[0] - // match: (Cvt64to32F x) - // result: (CEGBRA x) - for { - x := v_0 - v.reset(OpS390XCEGBRA) - v.AddArg(x) - return true - } -} -func rewriteValueS390X_OpCvt64to64F(v *Value) bool { - v_0 := v.Args[0] - // match: (Cvt64to64F x) - // result: (CDGBRA x) - for { - x := v_0 - v.reset(OpS390XCDGBRA) - v.AddArg(x) - return true - } -} func rewriteValueS390X_OpDiv16(v *Value) bool { v_1 := v.Args[1] v_0 := v.Args[0] @@ -1792,83 +1278,41 @@ func rewriteValueS390X_OpDiv32(v *Value) bool { for { x := v_0 y := v_1 - v.reset(OpS390XDIVW) - v0 := b.NewValue0(v.Pos, OpS390XMOVWreg, typ.Int64) - v0.AddArg(x) - v.AddArg(v0) - v.AddArg(y) - return true - } -} -func rewriteValueS390X_OpDiv32F(v *Value) bool { - v_1 := v.Args[1] - v_0 := v.Args[0] - // match: (Div32F x y) - // result: (FDIVS x y) - for { - x := v_0 - y := v_1 - v.reset(OpS390XFDIVS) - v.AddArg(x) - v.AddArg(y) - return true - } -} -func rewriteValueS390X_OpDiv32u(v *Value) bool { - v_1 := v.Args[1] - v_0 := v.Args[0] - b := v.Block - typ := &b.Func.Config.Types - // match: (Div32u x y) - // result: (DIVWU (MOVWZreg x) y) - for { - x := v_0 - y := v_1 - v.reset(OpS390XDIVWU) - v0 := b.NewValue0(v.Pos, OpS390XMOVWZreg, typ.UInt64) - v0.AddArg(x) - v.AddArg(v0) - v.AddArg(y) - return true - } -} -func rewriteValueS390X_OpDiv64(v *Value) bool { - v_1 := v.Args[1] - v_0 := v.Args[0] - // match: (Div64 x y) - // result: (DIVD x y) - for { - x := v_0 - y := v_1 - v.reset(OpS390XDIVD) - v.AddArg(x) + v.reset(OpS390XDIVW) + v0 := b.NewValue0(v.Pos, OpS390XMOVWreg, typ.Int64) + v0.AddArg(x) + v.AddArg(v0) v.AddArg(y) return true } } -func rewriteValueS390X_OpDiv64F(v *Value) bool { +func rewriteValueS390X_OpDiv32u(v *Value) bool { v_1 := v.Args[1] v_0 := v.Args[0] - // match: (Div64F x y) - // result: (FDIV x y) + b := v.Block + typ := &b.Func.Config.Types + // match: (Div32u x y) + // result: (DIVWU (MOVWZreg x) y) for { x := v_0 y := v_1 - v.reset(OpS390XFDIV) - v.AddArg(x) + v.reset(OpS390XDIVWU) + v0 := b.NewValue0(v.Pos, OpS390XMOVWZreg, typ.UInt64) + v0.AddArg(x) + v.AddArg(v0) v.AddArg(y) return true } } -func rewriteValueS390X_OpDiv64u(v *Value) bool { +func rewriteValueS390X_OpDiv64(v *Value) bool { v_1 := v.Args[1] v_0 := v.Args[0] - // match: (Div64u x y) - // result: (DIVDU x y) + // match: (Div64 [a] x y) + // result: (DIVD x y) for { x := v_0 y := v_1 - v.reset(OpS390XDIVDU) + v.reset(OpS390XDIVD) v.AddArg(x) v.AddArg(y) return true @@ -2421,41 +1865,6 @@ func rewriteValueS390X_OpGeq8U(v *Value) bool { return true } } -func rewriteValueS390X_OpGetCallerPC(v *Value) bool { - // match: (GetCallerPC) - // result: (LoweredGetCallerPC) - for { - v.reset(OpS390XLoweredGetCallerPC) - return true - } -} -func rewriteValueS390X_OpGetCallerSP(v *Value) bool { - // match: (GetCallerSP) - // result: (LoweredGetCallerSP) - for { - v.reset(OpS390XLoweredGetCallerSP) - return true - } -} -func rewriteValueS390X_OpGetClosurePtr(v *Value) bool { - // match: (GetClosurePtr) - // result: (LoweredGetClosurePtr) - for { - v.reset(OpS390XLoweredGetClosurePtr) - return true - } -} -func rewriteValueS390X_OpGetG(v *Value) bool { - v_0 := v.Args[0] - // match: (GetG mem) - // result: (LoweredGetG mem) - for { - mem := v_0 - v.reset(OpS390XLoweredGetG) - v.AddArg(mem) - return true - } -} func rewriteValueS390X_OpGreater16(v *Value) bool { v_1 := v.Args[1] v_0 := v.Args[0] @@ -2768,34 +2177,6 @@ func rewriteValueS390X_OpHmul32u(v *Value) bool { return true } } -func rewriteValueS390X_OpHmul64(v *Value) bool { - v_1 := v.Args[1] - v_0 := v.Args[0] - // match: (Hmul64 x y) - // result: (MULHD x y) - for { - x := v_0 - y := v_1 - v.reset(OpS390XMULHD) - v.AddArg(x) - v.AddArg(y) - return true - } -} -func rewriteValueS390X_OpHmul64u(v *Value) bool { - v_1 := v.Args[1] - v_0 := v.Args[0] - // match: (Hmul64u x y) - // result: (MULHDU x y) - for { - x := v_0 - y := v_1 - v.reset(OpS390XMULHDU) - v.AddArg(x) - v.AddArg(y) - return true - } -} func rewriteValueS390X_OpITab(v *Value) bool { v_0 := v.Args[0] // match: (ITab (Load ptr mem)) @@ -2813,22 +2194,6 @@ func rewriteValueS390X_OpITab(v *Value) bool { } return false } -func rewriteValueS390X_OpInterCall(v *Value) bool { - v_1 := v.Args[1] - v_0 := v.Args[0] - // match: (InterCall [argwid] entry mem) - // result: (CALLinter [argwid] entry mem) - for { - argwid := v.AuxInt - entry := v_0 - mem := v_1 - v.reset(OpS390XCALLinter) - v.AuxInt = argwid - v.AddArg(entry) - v.AddArg(mem) - return true - } -} func rewriteValueS390X_OpIsInBounds(v *Value) bool { v_1 := v.Args[1] v_0 := v.Args[0] @@ -4354,7 +3719,7 @@ func rewriteValueS390X_OpMod32u(v *Value) bool { func rewriteValueS390X_OpMod64(v *Value) bool { v_1 := v.Args[1] v_0 := v.Args[0] - // match: (Mod64 x y) + // match: (Mod64 [a] x y) // result: (MODD x y) for { x := v_0 @@ -4365,20 +3730,6 @@ func rewriteValueS390X_OpMod64(v *Value) bool { return true } } -func rewriteValueS390X_OpMod64u(v *Value) bool { - v_1 := v.Args[1] - v_0 := v.Args[0] - // match: (Mod64u x y) - // result: (MODDU x y) - for { - x := v_0 - y := v_1 - v.reset(OpS390XMODDU) - v.AddArg(x) - v.AddArg(y) - return true - } -} func rewriteValueS390X_OpMod8(v *Value) bool { v_1 := v.Args[1] v_0 := v.Args[0] @@ -4738,248 +4089,84 @@ func rewriteValueS390X_OpMove(v *Value) bool { dst := v_0 src := v_1 mem := v_2 - if !(s > 512 && s <= 768) { - break - } - v.reset(OpS390XMVC) - v.AuxInt = makeValAndOff(s-512, 512) - v.AddArg(dst) - v.AddArg(src) - v0 := b.NewValue0(v.Pos, OpS390XMVC, types.TypeMem) - v0.AuxInt = makeValAndOff(256, 256) - v0.AddArg(dst) - v0.AddArg(src) - v1 := b.NewValue0(v.Pos, OpS390XMVC, types.TypeMem) - v1.AuxInt = makeValAndOff(256, 0) - v1.AddArg(dst) - v1.AddArg(src) - v1.AddArg(mem) - v0.AddArg(v1) - v.AddArg(v0) - return true - } - // match: (Move [s] dst src mem) - // cond: s > 768 && s <= 1024 - // result: (MVC [makeValAndOff(s-768, 768)] dst src (MVC [makeValAndOff(256, 512)] dst src (MVC [makeValAndOff(256, 256)] dst src (MVC [makeValAndOff(256, 0)] dst src mem)))) - for { - s := v.AuxInt - dst := v_0 - src := v_1 - mem := v_2 - if !(s > 768 && s <= 1024) { - break - } - v.reset(OpS390XMVC) - v.AuxInt = makeValAndOff(s-768, 768) - v.AddArg(dst) - v.AddArg(src) - v0 := b.NewValue0(v.Pos, OpS390XMVC, types.TypeMem) - v0.AuxInt = makeValAndOff(256, 512) - v0.AddArg(dst) - v0.AddArg(src) - v1 := b.NewValue0(v.Pos, OpS390XMVC, types.TypeMem) - v1.AuxInt = makeValAndOff(256, 256) - v1.AddArg(dst) - v1.AddArg(src) - v2 := b.NewValue0(v.Pos, OpS390XMVC, types.TypeMem) - v2.AuxInt = makeValAndOff(256, 0) - v2.AddArg(dst) - v2.AddArg(src) - v2.AddArg(mem) - v1.AddArg(v2) - v0.AddArg(v1) - v.AddArg(v0) - return true - } - // match: (Move [s] dst src mem) - // cond: s > 1024 - // result: (LoweredMove [s%256] dst src (ADD src (MOVDconst [(s/256)*256])) mem) - for { - s := v.AuxInt - dst := v_0 - src := v_1 - mem := v_2 - if !(s > 1024) { - break - } - v.reset(OpS390XLoweredMove) - v.AuxInt = s % 256 - v.AddArg(dst) - v.AddArg(src) - v0 := b.NewValue0(v.Pos, OpS390XADD, src.Type) - v0.AddArg(src) - v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) - v1.AuxInt = (s / 256) * 256 - v0.AddArg(v1) - v.AddArg(v0) - v.AddArg(mem) - return true - } - return false -} -func rewriteValueS390X_OpMul16(v *Value) bool { - v_1 := v.Args[1] - v_0 := v.Args[0] - // match: (Mul16 x y) - // result: (MULLW x y) - for { - x := v_0 - y := v_1 - v.reset(OpS390XMULLW) - v.AddArg(x) - v.AddArg(y) - return true - } -} -func rewriteValueS390X_OpMul32(v *Value) bool { - v_1 := v.Args[1] - v_0 := v.Args[0] - // match: (Mul32 x y) - // result: (MULLW x y) - for { - x := v_0 - y := v_1 - v.reset(OpS390XMULLW) - v.AddArg(x) - v.AddArg(y) - return true - } -} -func rewriteValueS390X_OpMul32F(v *Value) bool { - v_1 := v.Args[1] - v_0 := v.Args[0] - // match: (Mul32F x y) - // result: (FMULS x y) - for { - x := v_0 - y := v_1 - v.reset(OpS390XFMULS) - v.AddArg(x) - v.AddArg(y) - return true - } -} -func rewriteValueS390X_OpMul64(v *Value) bool { - v_1 := v.Args[1] - v_0 := v.Args[0] - // match: (Mul64 x y) - // result: (MULLD x y) - for { - x := v_0 - y := v_1 - v.reset(OpS390XMULLD) - v.AddArg(x) - v.AddArg(y) - return true - } -} -func rewriteValueS390X_OpMul64F(v *Value) bool { - v_1 := v.Args[1] - v_0 := v.Args[0] - // match: (Mul64F x y) - // result: (FMUL x y) - for { - x := v_0 - y := v_1 - v.reset(OpS390XFMUL) - v.AddArg(x) - v.AddArg(y) - return true - } -} -func rewriteValueS390X_OpMul64uhilo(v *Value) bool { - v_1 := v.Args[1] - v_0 := v.Args[0] - // match: (Mul64uhilo x y) - // result: (MLGR x y) - for { - x := v_0 - y := v_1 - v.reset(OpS390XMLGR) - v.AddArg(x) - v.AddArg(y) - return true - } -} -func rewriteValueS390X_OpMul8(v *Value) bool { - v_1 := v.Args[1] - v_0 := v.Args[0] - // match: (Mul8 x y) - // result: (MULLW x y) - for { - x := v_0 - y := v_1 - v.reset(OpS390XMULLW) - v.AddArg(x) - v.AddArg(y) - return true - } -} -func rewriteValueS390X_OpNeg16(v *Value) bool { - v_0 := v.Args[0] - // match: (Neg16 x) - // result: (NEGW x) - for { - x := v_0 - v.reset(OpS390XNEGW) - v.AddArg(x) - return true - } -} -func rewriteValueS390X_OpNeg32(v *Value) bool { - v_0 := v.Args[0] - // match: (Neg32 x) - // result: (NEGW x) - for { - x := v_0 - v.reset(OpS390XNEGW) - v.AddArg(x) - return true - } -} -func rewriteValueS390X_OpNeg32F(v *Value) bool { - v_0 := v.Args[0] - // match: (Neg32F x) - // result: (FNEGS x) - for { - x := v_0 - v.reset(OpS390XFNEGS) - v.AddArg(x) - return true - } -} -func rewriteValueS390X_OpNeg64(v *Value) bool { - v_0 := v.Args[0] - // match: (Neg64 x) - // result: (NEG x) - for { - x := v_0 - v.reset(OpS390XNEG) - v.AddArg(x) + if !(s > 512 && s <= 768) { + break + } + v.reset(OpS390XMVC) + v.AuxInt = makeValAndOff(s-512, 512) + v.AddArg(dst) + v.AddArg(src) + v0 := b.NewValue0(v.Pos, OpS390XMVC, types.TypeMem) + v0.AuxInt = makeValAndOff(256, 256) + v0.AddArg(dst) + v0.AddArg(src) + v1 := b.NewValue0(v.Pos, OpS390XMVC, types.TypeMem) + v1.AuxInt = makeValAndOff(256, 0) + v1.AddArg(dst) + v1.AddArg(src) + v1.AddArg(mem) + v0.AddArg(v1) + v.AddArg(v0) return true } -} -func rewriteValueS390X_OpNeg64F(v *Value) bool { - v_0 := v.Args[0] - // match: (Neg64F x) - // result: (FNEG x) + // match: (Move [s] dst src mem) + // cond: s > 768 && s <= 1024 + // result: (MVC [makeValAndOff(s-768, 768)] dst src (MVC [makeValAndOff(256, 512)] dst src (MVC [makeValAndOff(256, 256)] dst src (MVC [makeValAndOff(256, 0)] dst src mem)))) for { - x := v_0 - v.reset(OpS390XFNEG) - v.AddArg(x) + s := v.AuxInt + dst := v_0 + src := v_1 + mem := v_2 + if !(s > 768 && s <= 1024) { + break + } + v.reset(OpS390XMVC) + v.AuxInt = makeValAndOff(s-768, 768) + v.AddArg(dst) + v.AddArg(src) + v0 := b.NewValue0(v.Pos, OpS390XMVC, types.TypeMem) + v0.AuxInt = makeValAndOff(256, 512) + v0.AddArg(dst) + v0.AddArg(src) + v1 := b.NewValue0(v.Pos, OpS390XMVC, types.TypeMem) + v1.AuxInt = makeValAndOff(256, 256) + v1.AddArg(dst) + v1.AddArg(src) + v2 := b.NewValue0(v.Pos, OpS390XMVC, types.TypeMem) + v2.AuxInt = makeValAndOff(256, 0) + v2.AddArg(dst) + v2.AddArg(src) + v2.AddArg(mem) + v1.AddArg(v2) + v0.AddArg(v1) + v.AddArg(v0) return true } -} -func rewriteValueS390X_OpNeg8(v *Value) bool { - v_0 := v.Args[0] - // match: (Neg8 x) - // result: (NEGW x) + // match: (Move [s] dst src mem) + // cond: s > 1024 + // result: (LoweredMove [s%256] dst src (ADD src (MOVDconst [(s/256)*256])) mem) for { - x := v_0 - v.reset(OpS390XNEGW) - v.AddArg(x) + s := v.AuxInt + dst := v_0 + src := v_1 + mem := v_2 + if !(s > 1024) { + break + } + v.reset(OpS390XLoweredMove) + v.AuxInt = s % 256 + v.AddArg(dst) + v.AddArg(src) + v0 := b.NewValue0(v.Pos, OpS390XADD, src.Type) + v0.AddArg(src) + v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) + v1.AuxInt = (s / 256) * 256 + v0.AddArg(v1) + v.AddArg(v0) + v.AddArg(mem) return true } + return false } func rewriteValueS390X_OpNeq16(v *Value) bool { v_1 := v.Args[1] @@ -5193,20 +4380,6 @@ func rewriteValueS390X_OpNeqPtr(v *Value) bool { return true } } -func rewriteValueS390X_OpNilCheck(v *Value) bool { - v_1 := v.Args[1] - v_0 := v.Args[0] - // match: (NilCheck ptr mem) - // result: (LoweredNilCheck ptr mem) - for { - ptr := v_0 - mem := v_1 - v.reset(OpS390XLoweredNilCheck) - v.AddArg(ptr) - v.AddArg(mem) - return true - } -} func rewriteValueS390X_OpNot(v *Value) bool { v_0 := v.Args[0] // match: (Not x) @@ -5263,76 +4436,6 @@ func rewriteValueS390X_OpOffPtr(v *Value) bool { return true } } -func rewriteValueS390X_OpOr16(v *Value) bool { - v_1 := v.Args[1] - v_0 := v.Args[0] - // match: (Or16 x y) - // result: (ORW x y) - for { - x := v_0 - y := v_1 - v.reset(OpS390XORW) - v.AddArg(x) - v.AddArg(y) - return true - } -} -func rewriteValueS390X_OpOr32(v *Value) bool { - v_1 := v.Args[1] - v_0 := v.Args[0] - // match: (Or32 x y) - // result: (ORW x y) - for { - x := v_0 - y := v_1 - v.reset(OpS390XORW) - v.AddArg(x) - v.AddArg(y) - return true - } -} -func rewriteValueS390X_OpOr64(v *Value) bool { - v_1 := v.Args[1] - v_0 := v.Args[0] - // match: (Or64 x y) - // result: (OR x y) - for { - x := v_0 - y := v_1 - v.reset(OpS390XOR) - v.AddArg(x) - v.AddArg(y) - return true - } -} -func rewriteValueS390X_OpOr8(v *Value) bool { - v_1 := v.Args[1] - v_0 := v.Args[0] - // match: (Or8 x y) - // result: (ORW x y) - for { - x := v_0 - y := v_1 - v.reset(OpS390XORW) - v.AddArg(x) - v.AddArg(y) - return true - } -} -func rewriteValueS390X_OpOrB(v *Value) bool { - v_1 := v.Args[1] - v_0 := v.Args[0] - // match: (OrB x y) - // result: (ORW x y) - for { - x := v_0 - y := v_1 - v.reset(OpS390XORW) - v.AddArg(x) - v.AddArg(y) - return true - } -} func rewriteValueS390X_OpPanicBounds(v *Value) bool { v_2 := v.Args[2] v_1 := v.Args[1] @@ -5490,34 +4593,6 @@ func rewriteValueS390X_OpRotateLeft16(v *Value) bool { } return false } -func rewriteValueS390X_OpRotateLeft32(v *Value) bool { - v_1 := v.Args[1] - v_0 := v.Args[0] - // match: (RotateLeft32 x y) - // result: (RLL x y) - for { - x := v_0 - y := v_1 - v.reset(OpS390XRLL) - v.AddArg(x) - v.AddArg(y) - return true - } -} -func rewriteValueS390X_OpRotateLeft64(v *Value) bool { - v_1 := v.Args[1] - v_0 := v.Args[0] - // match: (RotateLeft64 x y) - // result: (RLLG x y) - for { - x := v_0 - y := v_1 - v.reset(OpS390XRLLG) - v.AddArg(x) - v.AddArg(y) - return true - } -} func rewriteValueS390X_OpRotateLeft8(v *Value) bool { v_1 := v.Args[1] v_0 := v.Args[0] @@ -5561,28 +4636,6 @@ func rewriteValueS390X_OpRound(v *Value) bool { return true } } -func rewriteValueS390X_OpRound32F(v *Value) bool { - v_0 := v.Args[0] - // match: (Round32F x) - // result: (LoweredRound32F x) - for { - x := v_0 - v.reset(OpS390XLoweredRound32F) - v.AddArg(x) - return true - } -} -func rewriteValueS390X_OpRound64F(v *Value) bool { - v_0 := v.Args[0] - // match: (Round64F x) - // result: (LoweredRound64F x) - for { - x := v_0 - v.reset(OpS390XLoweredRound64F) - v.AddArg(x) - return true - } -} func rewriteValueS390X_OpRoundToEven(v *Value) bool { v_0 := v.Args[0] // match: (RoundToEven x) @@ -16596,13 +15649,9 @@ func rewriteValueS390X_OpS390XNOT(v *Value) bool { b := v.Block typ := &b.Func.Config.Types // match: (NOT x) - // cond: true // result: (XOR (MOVDconst [-1]) x) for { x := v_0 - if !(true) { - break - } v.reset(OpS390XXOR) v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) v0.AuxInt = -1 @@ -16610,24 +15659,18 @@ func rewriteValueS390X_OpS390XNOT(v *Value) bool { v.AddArg(x) return true } - return false } func rewriteValueS390X_OpS390XNOTW(v *Value) bool { v_0 := v.Args[0] // match: (NOTW x) - // cond: true // result: (XORWconst [-1] x) for { x := v_0 - if !(true) { - break - } v.reset(OpS390XXORWconst) v.AuxInt = -1 v.AddArg(x) return true } - return false } func rewriteValueS390X_OpS390XOR(v *Value) bool { v_1 := v.Args[1] @@ -21385,111 +20428,19 @@ func rewriteValueS390X_OpSelect1(v *Value) bool { } return false } -func rewriteValueS390X_OpSignExt16to32(v *Value) bool { - v_0 := v.Args[0] - // match: (SignExt16to32 x) - // result: (MOVHreg x) - for { - x := v_0 - v.reset(OpS390XMOVHreg) - v.AddArg(x) - return true - } -} -func rewriteValueS390X_OpSignExt16to64(v *Value) bool { - v_0 := v.Args[0] - // match: (SignExt16to64 x) - // result: (MOVHreg x) - for { - x := v_0 - v.reset(OpS390XMOVHreg) - v.AddArg(x) - return true - } -} -func rewriteValueS390X_OpSignExt32to64(v *Value) bool { - v_0 := v.Args[0] - // match: (SignExt32to64 x) - // result: (MOVWreg x) - for { - x := v_0 - v.reset(OpS390XMOVWreg) - v.AddArg(x) - return true - } -} -func rewriteValueS390X_OpSignExt8to16(v *Value) bool { - v_0 := v.Args[0] - // match: (SignExt8to16 x) - // result: (MOVBreg x) - for { - x := v_0 - v.reset(OpS390XMOVBreg) - v.AddArg(x) - return true - } -} -func rewriteValueS390X_OpSignExt8to32(v *Value) bool { - v_0 := v.Args[0] - // match: (SignExt8to32 x) - // result: (MOVBreg x) - for { - x := v_0 - v.reset(OpS390XMOVBreg) - v.AddArg(x) - return true - } -} -func rewriteValueS390X_OpSignExt8to64(v *Value) bool { - v_0 := v.Args[0] - // match: (SignExt8to64 x) - // result: (MOVBreg x) - for { - x := v_0 - v.reset(OpS390XMOVBreg) - v.AddArg(x) - return true - } -} func rewriteValueS390X_OpSlicemask(v *Value) bool { v_0 := v.Args[0] b := v.Block - // match: (Slicemask x) - // result: (SRADconst (NEG x) [63]) - for { - t := v.Type - x := v_0 - v.reset(OpS390XSRADconst) - v.AuxInt = 63 - v0 := b.NewValue0(v.Pos, OpS390XNEG, t) - v0.AddArg(x) - v.AddArg(v0) - return true - } -} -func rewriteValueS390X_OpSqrt(v *Value) bool { - v_0 := v.Args[0] - // match: (Sqrt x) - // result: (FSQRT x) - for { - x := v_0 - v.reset(OpS390XFSQRT) - v.AddArg(x) - return true - } -} -func rewriteValueS390X_OpStaticCall(v *Value) bool { - v_0 := v.Args[0] - // match: (StaticCall [argwid] {target} mem) - // result: (CALLstatic [argwid] {target} mem) + // match: (Slicemask x) + // result: (SRADconst (NEG x) [63]) for { - argwid := v.AuxInt - target := v.Aux - mem := v_0 - v.reset(OpS390XCALLstatic) - v.AuxInt = argwid - v.Aux = target - v.AddArg(mem) + t := v.Type + x := v_0 + v.reset(OpS390XSRADconst) + v.AuxInt = 63 + v0 := b.NewValue0(v.Pos, OpS390XNEG, t) + v0.AddArg(x) + v.AddArg(v0) return true } } @@ -21601,104 +20552,6 @@ func rewriteValueS390X_OpStore(v *Value) bool { } return false } -func rewriteValueS390X_OpSub16(v *Value) bool { - v_1 := v.Args[1] - v_0 := v.Args[0] - // match: (Sub16 x y) - // result: (SUBW x y) - for { - x := v_0 - y := v_1 - v.reset(OpS390XSUBW) - v.AddArg(x) - v.AddArg(y) - return true - } -} -func rewriteValueS390X_OpSub32(v *Value) bool { - v_1 := v.Args[1] - v_0 := v.Args[0] - // match: (Sub32 x y) - // result: (SUBW x y) - for { - x := v_0 - y := v_1 - v.reset(OpS390XSUBW) - v.AddArg(x) - v.AddArg(y) - return true - } -} -func rewriteValueS390X_OpSub32F(v *Value) bool { - v_1 := v.Args[1] - v_0 := v.Args[0] - // match: (Sub32F x y) - // result: (FSUBS x y) - for { - x := v_0 - y := v_1 - v.reset(OpS390XFSUBS) - v.AddArg(x) - v.AddArg(y) - return true - } -} -func rewriteValueS390X_OpSub64(v *Value) bool { - v_1 := v.Args[1] - v_0 := v.Args[0] - // match: (Sub64 x y) - // result: (SUB x y) - for { - x := v_0 - y := v_1 - v.reset(OpS390XSUB) - v.AddArg(x) - v.AddArg(y) - return true - } -} -func rewriteValueS390X_OpSub64F(v *Value) bool { - v_1 := v.Args[1] - v_0 := v.Args[0] - // match: (Sub64F x y) - // result: (FSUB x y) - for { - x := v_0 - y := v_1 - v.reset(OpS390XFSUB) - v.AddArg(x) - v.AddArg(y) - return true - } -} -func rewriteValueS390X_OpSub8(v *Value) bool { - v_1 := v.Args[1] - v_0 := v.Args[0] - // match: (Sub8 x y) - // result: (SUBW x y) - for { - x := v_0 - y := v_1 - v.reset(OpS390XSUBW) - v.AddArg(x) - v.AddArg(y) - return true - } -} -func rewriteValueS390X_OpSubPtr(v *Value) bool { - v_1 := v.Args[1] - v_0 := v.Args[0] - // match: (SubPtr x y) - // result: (SUB x y) - for { - x := v_0 - y := v_1 - v.reset(OpS390XSUB) - v.AddArg(x) - v.AddArg(y) - return true - } -} func rewriteValueS390X_OpTrunc(v *Value) bool { v_0 := v.Args[0] // match: (Trunc x) @@ -21711,153 +20564,6 @@ func rewriteValueS390X_OpTrunc(v *Value) bool { return true } } -func rewriteValueS390X_OpTrunc16to8(v *Value) bool { - v_0 := v.Args[0] - // match: (Trunc16to8 x) - // result: x - for { - x := v_0 - v.reset(OpCopy) - v.Type = x.Type - v.AddArg(x) - return true - } -} -func rewriteValueS390X_OpTrunc32to16(v *Value) bool { - v_0 := v.Args[0] - // match: (Trunc32to16 x) - // result: x - for { - x := v_0 - v.reset(OpCopy) - v.Type = x.Type - v.AddArg(x) - return true - } -} -func rewriteValueS390X_OpTrunc32to8(v *Value) bool { - v_0 := v.Args[0] - // match: (Trunc32to8 x) - // result: x - for { - x := v_0 - v.reset(OpCopy) - v.Type = x.Type - v.AddArg(x) - return true - } -} -func rewriteValueS390X_OpTrunc64to16(v *Value) bool { - v_0 := v.Args[0] - // match: (Trunc64to16 x) - // result: x - for { - x := v_0 - v.reset(OpCopy) - v.Type = x.Type - v.AddArg(x) - return true - } -} -func rewriteValueS390X_OpTrunc64to32(v *Value) bool { - v_0 := v.Args[0] - // match: (Trunc64to32 x) - // result: x - for { - x := v_0 - v.reset(OpCopy) - v.Type = x.Type - v.AddArg(x) - return true - } -} -func rewriteValueS390X_OpTrunc64to8(v *Value) bool { - v_0 := v.Args[0] - // match: (Trunc64to8 x) - // result: x - for { - x := v_0 - v.reset(OpCopy) - v.Type = x.Type - v.AddArg(x) - return true - } -} -func rewriteValueS390X_OpWB(v *Value) bool { - v_2 := v.Args[2] - v_1 := v.Args[1] - v_0 := v.Args[0] - // match: (WB {fn} destptr srcptr mem) - // result: (LoweredWB {fn} destptr srcptr mem) - for { - fn := v.Aux - destptr := v_0 - srcptr := v_1 - mem := v_2 - v.reset(OpS390XLoweredWB) - v.Aux = fn - v.AddArg(destptr) - v.AddArg(srcptr) - v.AddArg(mem) - return true - } -} -func rewriteValueS390X_OpXor16(v *Value) bool { - v_1 := v.Args[1] - v_0 := v.Args[0] - // match: (Xor16 x y) - // result: (XORW x y) - for { - x := v_0 - y := v_1 - v.reset(OpS390XXORW) - v.AddArg(x) - v.AddArg(y) - return true - } -} -func rewriteValueS390X_OpXor32(v *Value) bool { - v_1 := v.Args[1] - v_0 := v.Args[0] - // match: (Xor32 x y) - // result: (XORW x y) - for { - x := v_0 - y := v_1 - v.reset(OpS390XXORW) - v.AddArg(x) - v.AddArg(y) - return true - } -} -func rewriteValueS390X_OpXor64(v *Value) bool { - v_1 := v.Args[1] - v_0 := v.Args[0] - // match: (Xor64 x y) - // result: (XOR x y) - for { - x := v_0 - y := v_1 - v.reset(OpS390XXOR) - v.AddArg(x) - v.AddArg(y) - return true - } -} -func rewriteValueS390X_OpXor8(v *Value) bool { - v_1 := v.Args[1] - v_0 := v.Args[0] - // match: (Xor8 x y) - // result: (XORW x y) - for { - x := v_0 - y := v_1 - v.reset(OpS390XXORW) - v.AddArg(x) - v.AddArg(y) - return true - } -} func rewriteValueS390X_OpZero(v *Value) bool { v_1 := v.Args[1] v_0 := v.Args[0] @@ -22040,72 +20746,6 @@ func rewriteValueS390X_OpZero(v *Value) bool { } return false } -func rewriteValueS390X_OpZeroExt16to32(v *Value) bool { - v_0 := v.Args[0] - // match: (ZeroExt16to32 x) - // result: (MOVHZreg x) - for { - x := v_0 - v.reset(OpS390XMOVHZreg) - v.AddArg(x) - return true - } -} -func rewriteValueS390X_OpZeroExt16to64(v *Value) bool { - v_0 := v.Args[0] - // match: (ZeroExt16to64 x) - // result: (MOVHZreg x) - for { - x := v_0 - v.reset(OpS390XMOVHZreg) - v.AddArg(x) - return true - } -} -func rewriteValueS390X_OpZeroExt32to64(v *Value) bool { - v_0 := v.Args[0] - // match: (ZeroExt32to64 x) - // result: (MOVWZreg x) - for { - x := v_0 - v.reset(OpS390XMOVWZreg) - v.AddArg(x) - return true - } -} -func rewriteValueS390X_OpZeroExt8to16(v *Value) bool { - v_0 := v.Args[0] - // match: (ZeroExt8to16 x) - // result: (MOVBZreg x) - for { - x := v_0 - v.reset(OpS390XMOVBZreg) - v.AddArg(x) - return true - } -} -func rewriteValueS390X_OpZeroExt8to32(v *Value) bool { - v_0 := v.Args[0] - // match: (ZeroExt8to32 x) - // result: (MOVBZreg x) - for { - x := v_0 - v.reset(OpS390XMOVBZreg) - v.AddArg(x) - return true - } -} -func rewriteValueS390X_OpZeroExt8to64(v *Value) bool { - v_0 := v.Args[0] - // match: (ZeroExt8to64 x) - // result: (MOVBZreg x) - for { - x := v_0 - v.reset(OpS390XMOVBZreg) - v.AddArg(x) - return true - } -} func rewriteBlockS390X(b *Block) bool { typ := &b.Func.Config.Types switch b.Kind { -- 2.50.0