// 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)
(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)
// (x + y) / 2 with x>=y -> (x - y) / 2 + y
(Avg64u <t> x y) -> (ADD (SRDconst <t> (SUB <t> 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
(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 <t> x) -> (SUB (MOVDconst [64]) (FLOGR (AND <t> (SUBconst <t> [1] x) (NOT <t> x))))
(SumBytes4 x) -> (SumBytes2 (ADDW <typ.UInt16> (SRWconst <typ.UInt16> x [16]) x))
(SumBytes8 x) -> (SumBytes4 (ADDW <typ.UInt32> (SRDconst <typ.UInt32> x [32]) x))
-(Bswap64 x) -> (MOVDBR x)
-(Bswap32 x) -> (MOVWBR x)
+(Bswap64 ...) -> (MOVDBR ...)
+(Bswap32 ...) -> (MOVWBR ...)
// add with carry
(Select0 (Add64carry x y c))
-> (NEG (Select0 <typ.UInt64> (SUBE (MOVDconst [0]) (MOVDconst [0]) (Select1 <types.TypeFlags> (SUBE x y (Select1 <types.TypeFlags> (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)
// 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))
(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
//
// 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 <t> x) -> (SRADconst (NEG <t> 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
// Lowering rotates
(RotateLeft8 <t> x (MOVDconst [c])) -> (Or8 (Lsh8x64 <t> x (MOVDconst [c&7])) (Rsh8Ux64 <t> x (MOVDconst [-c&7])))
(RotateLeft16 <t> x (MOVDconst [c])) -> (Or16 (Lsh16x64 <t> x (MOVDconst [c&15])) (Rsh16Ux64 <t> 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))
(LoweredZero [s%256] destptr (ADDconst <destptr.Type> 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)
(If cond yes no) -> (CLIJ {s390x.LessOrGreater} (MOVBZreg <typ.Bool> 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)
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:
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:
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:
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:
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:
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:
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:
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:
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:
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:
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]
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]
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]
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)
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])
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
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]
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
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]
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))
}
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]
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
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]
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.Type> 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.Type> 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]
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)
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]
}
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]
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)
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
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]
}
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 <t> x)
- // result: (SRADconst (NEG <t> 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 <t> x)
+ // result: (SRADconst (NEG <t> 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
}
}
}
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)
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]
}
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 {