1 // Code generated from gen/RISCV64.rules; DO NOT EDIT.
2 // generated with: cd gen; go run *.go
7 import "cmd/compile/internal/types"
9 func rewriteValueRISCV64(v *Value) bool {
33 return rewriteValueRISCV64_OpAddr(v)
50 v.Op = OpRISCV64LoweredAtomicAdd32
53 v.Op = OpRISCV64LoweredAtomicAdd64
56 v.Op = OpRISCV64LoweredAtomicAnd32
59 return rewriteValueRISCV64_OpAtomicAnd8(v)
60 case OpAtomicCompareAndSwap32:
61 v.Op = OpRISCV64LoweredAtomicCas32
63 case OpAtomicCompareAndSwap64:
64 v.Op = OpRISCV64LoweredAtomicCas64
66 case OpAtomicExchange32:
67 v.Op = OpRISCV64LoweredAtomicExchange32
69 case OpAtomicExchange64:
70 v.Op = OpRISCV64LoweredAtomicExchange64
73 v.Op = OpRISCV64LoweredAtomicLoad32
76 v.Op = OpRISCV64LoweredAtomicLoad64
79 v.Op = OpRISCV64LoweredAtomicLoad8
82 v.Op = OpRISCV64LoweredAtomicLoad64
85 v.Op = OpRISCV64LoweredAtomicOr32
88 return rewriteValueRISCV64_OpAtomicOr8(v)
90 v.Op = OpRISCV64LoweredAtomicStore32
93 v.Op = OpRISCV64LoweredAtomicStore64
96 v.Op = OpRISCV64LoweredAtomicStore8
98 case OpAtomicStorePtrNoWB:
99 v.Op = OpRISCV64LoweredAtomicStore64
102 return rewriteValueRISCV64_OpAvg64u(v)
104 v.Op = OpRISCV64CALLclosure
119 return rewriteValueRISCV64_OpConst16(v)
121 return rewriteValueRISCV64_OpConst32(v)
123 return rewriteValueRISCV64_OpConst32F(v)
125 return rewriteValueRISCV64_OpConst64(v)
127 return rewriteValueRISCV64_OpConst64F(v)
129 return rewriteValueRISCV64_OpConst8(v)
131 return rewriteValueRISCV64_OpConstBool(v)
133 return rewriteValueRISCV64_OpConstNil(v)
135 v.Op = OpRISCV64MOVconvert
138 v.Op = OpRISCV64FCVTWS
141 v.Op = OpRISCV64FCVTLS
144 v.Op = OpRISCV64FCVTDS
147 v.Op = OpRISCV64FCVTSW
150 v.Op = OpRISCV64FCVTDW
153 v.Op = OpRISCV64FCVTWD
156 v.Op = OpRISCV64FCVTSD
159 v.Op = OpRISCV64FCVTLD
162 v.Op = OpRISCV64FCVTSL
165 v.Op = OpRISCV64FCVTDL
167 case OpCvtBoolToUint8:
171 return rewriteValueRISCV64_OpDiv16(v)
173 return rewriteValueRISCV64_OpDiv16u(v)
175 return rewriteValueRISCV64_OpDiv32(v)
177 v.Op = OpRISCV64FDIVS
180 v.Op = OpRISCV64DIVUW
183 return rewriteValueRISCV64_OpDiv64(v)
185 v.Op = OpRISCV64FDIVD
191 return rewriteValueRISCV64_OpDiv8(v)
193 return rewriteValueRISCV64_OpDiv8u(v)
195 return rewriteValueRISCV64_OpEq16(v)
197 return rewriteValueRISCV64_OpEq32(v)
202 return rewriteValueRISCV64_OpEq64(v)
207 return rewriteValueRISCV64_OpEq8(v)
209 return rewriteValueRISCV64_OpEqB(v)
211 return rewriteValueRISCV64_OpEqPtr(v)
213 v.Op = OpRISCV64LoweredGetCallerPC
216 v.Op = OpRISCV64LoweredGetCallerSP
218 case OpGetClosurePtr:
219 v.Op = OpRISCV64LoweredGetClosurePtr
222 return rewriteValueRISCV64_OpHmul32(v)
224 return rewriteValueRISCV64_OpHmul32u(v)
229 v.Op = OpRISCV64MULHU
232 v.Op = OpRISCV64CALLinter
240 case OpIsSliceInBounds:
244 return rewriteValueRISCV64_OpLeq16(v)
246 return rewriteValueRISCV64_OpLeq16U(v)
248 return rewriteValueRISCV64_OpLeq32(v)
253 return rewriteValueRISCV64_OpLeq32U(v)
255 return rewriteValueRISCV64_OpLeq64(v)
260 return rewriteValueRISCV64_OpLeq64U(v)
262 return rewriteValueRISCV64_OpLeq8(v)
264 return rewriteValueRISCV64_OpLeq8U(v)
266 return rewriteValueRISCV64_OpLess16(v)
268 return rewriteValueRISCV64_OpLess16U(v)
270 return rewriteValueRISCV64_OpLess32(v)
275 return rewriteValueRISCV64_OpLess32U(v)
286 return rewriteValueRISCV64_OpLess8(v)
288 return rewriteValueRISCV64_OpLess8U(v)
290 return rewriteValueRISCV64_OpLoad(v)
292 return rewriteValueRISCV64_OpLocalAddr(v)
294 return rewriteValueRISCV64_OpLsh16x16(v)
296 return rewriteValueRISCV64_OpLsh16x32(v)
298 return rewriteValueRISCV64_OpLsh16x64(v)
300 return rewriteValueRISCV64_OpLsh16x8(v)
302 return rewriteValueRISCV64_OpLsh32x16(v)
304 return rewriteValueRISCV64_OpLsh32x32(v)
306 return rewriteValueRISCV64_OpLsh32x64(v)
308 return rewriteValueRISCV64_OpLsh32x8(v)
310 return rewriteValueRISCV64_OpLsh64x16(v)
312 return rewriteValueRISCV64_OpLsh64x32(v)
314 return rewriteValueRISCV64_OpLsh64x64(v)
316 return rewriteValueRISCV64_OpLsh64x8(v)
318 return rewriteValueRISCV64_OpLsh8x16(v)
320 return rewriteValueRISCV64_OpLsh8x32(v)
322 return rewriteValueRISCV64_OpLsh8x64(v)
324 return rewriteValueRISCV64_OpLsh8x8(v)
326 return rewriteValueRISCV64_OpMod16(v)
328 return rewriteValueRISCV64_OpMod16u(v)
330 return rewriteValueRISCV64_OpMod32(v)
332 v.Op = OpRISCV64REMUW
335 return rewriteValueRISCV64_OpMod64(v)
340 return rewriteValueRISCV64_OpMod8(v)
342 return rewriteValueRISCV64_OpMod8u(v)
344 return rewriteValueRISCV64_OpMove(v)
346 return rewriteValueRISCV64_OpMul16(v)
351 v.Op = OpRISCV64FMULS
357 v.Op = OpRISCV64FMULD
360 return rewriteValueRISCV64_OpMul8(v)
368 v.Op = OpRISCV64FNEGS
374 v.Op = OpRISCV64FNEGD
380 return rewriteValueRISCV64_OpNeq16(v)
382 return rewriteValueRISCV64_OpNeq32(v)
387 return rewriteValueRISCV64_OpNeq64(v)
392 return rewriteValueRISCV64_OpNeq8(v)
397 return rewriteValueRISCV64_OpNeqPtr(v)
399 v.Op = OpRISCV64LoweredNilCheck
405 return rewriteValueRISCV64_OpOffPtr(v)
422 return rewriteValueRISCV64_OpPanicBounds(v)
424 return rewriteValueRISCV64_OpRISCV64ADD(v)
426 return rewriteValueRISCV64_OpRISCV64ADDI(v)
428 return rewriteValueRISCV64_OpRISCV64AND(v)
429 case OpRISCV64MOVBUload:
430 return rewriteValueRISCV64_OpRISCV64MOVBUload(v)
431 case OpRISCV64MOVBUreg:
432 return rewriteValueRISCV64_OpRISCV64MOVBUreg(v)
433 case OpRISCV64MOVBload:
434 return rewriteValueRISCV64_OpRISCV64MOVBload(v)
435 case OpRISCV64MOVBreg:
436 return rewriteValueRISCV64_OpRISCV64MOVBreg(v)
437 case OpRISCV64MOVBstore:
438 return rewriteValueRISCV64_OpRISCV64MOVBstore(v)
439 case OpRISCV64MOVBstorezero:
440 return rewriteValueRISCV64_OpRISCV64MOVBstorezero(v)
441 case OpRISCV64MOVDload:
442 return rewriteValueRISCV64_OpRISCV64MOVDload(v)
443 case OpRISCV64MOVDnop:
444 return rewriteValueRISCV64_OpRISCV64MOVDnop(v)
445 case OpRISCV64MOVDreg:
446 return rewriteValueRISCV64_OpRISCV64MOVDreg(v)
447 case OpRISCV64MOVDstore:
448 return rewriteValueRISCV64_OpRISCV64MOVDstore(v)
449 case OpRISCV64MOVDstorezero:
450 return rewriteValueRISCV64_OpRISCV64MOVDstorezero(v)
451 case OpRISCV64MOVHUload:
452 return rewriteValueRISCV64_OpRISCV64MOVHUload(v)
453 case OpRISCV64MOVHUreg:
454 return rewriteValueRISCV64_OpRISCV64MOVHUreg(v)
455 case OpRISCV64MOVHload:
456 return rewriteValueRISCV64_OpRISCV64MOVHload(v)
457 case OpRISCV64MOVHreg:
458 return rewriteValueRISCV64_OpRISCV64MOVHreg(v)
459 case OpRISCV64MOVHstore:
460 return rewriteValueRISCV64_OpRISCV64MOVHstore(v)
461 case OpRISCV64MOVHstorezero:
462 return rewriteValueRISCV64_OpRISCV64MOVHstorezero(v)
463 case OpRISCV64MOVWUload:
464 return rewriteValueRISCV64_OpRISCV64MOVWUload(v)
465 case OpRISCV64MOVWUreg:
466 return rewriteValueRISCV64_OpRISCV64MOVWUreg(v)
467 case OpRISCV64MOVWload:
468 return rewriteValueRISCV64_OpRISCV64MOVWload(v)
469 case OpRISCV64MOVWreg:
470 return rewriteValueRISCV64_OpRISCV64MOVWreg(v)
471 case OpRISCV64MOVWstore:
472 return rewriteValueRISCV64_OpRISCV64MOVWstore(v)
473 case OpRISCV64MOVWstorezero:
474 return rewriteValueRISCV64_OpRISCV64MOVWstorezero(v)
476 return rewriteValueRISCV64_OpRISCV64OR(v)
478 return rewriteValueRISCV64_OpRISCV64SLL(v)
480 return rewriteValueRISCV64_OpRISCV64SRA(v)
482 return rewriteValueRISCV64_OpRISCV64SRL(v)
484 return rewriteValueRISCV64_OpRISCV64SUB(v)
486 return rewriteValueRISCV64_OpRISCV64SUBW(v)
488 return rewriteValueRISCV64_OpRISCV64XOR(v)
490 return rewriteValueRISCV64_OpRotateLeft16(v)
492 return rewriteValueRISCV64_OpRotateLeft32(v)
494 return rewriteValueRISCV64_OpRotateLeft64(v)
496 return rewriteValueRISCV64_OpRotateLeft8(v)
504 return rewriteValueRISCV64_OpRsh16Ux16(v)
506 return rewriteValueRISCV64_OpRsh16Ux32(v)
508 return rewriteValueRISCV64_OpRsh16Ux64(v)
510 return rewriteValueRISCV64_OpRsh16Ux8(v)
512 return rewriteValueRISCV64_OpRsh16x16(v)
514 return rewriteValueRISCV64_OpRsh16x32(v)
516 return rewriteValueRISCV64_OpRsh16x64(v)
518 return rewriteValueRISCV64_OpRsh16x8(v)
520 return rewriteValueRISCV64_OpRsh32Ux16(v)
522 return rewriteValueRISCV64_OpRsh32Ux32(v)
524 return rewriteValueRISCV64_OpRsh32Ux64(v)
526 return rewriteValueRISCV64_OpRsh32Ux8(v)
528 return rewriteValueRISCV64_OpRsh32x16(v)
530 return rewriteValueRISCV64_OpRsh32x32(v)
532 return rewriteValueRISCV64_OpRsh32x64(v)
534 return rewriteValueRISCV64_OpRsh32x8(v)
536 return rewriteValueRISCV64_OpRsh64Ux16(v)
538 return rewriteValueRISCV64_OpRsh64Ux32(v)
540 return rewriteValueRISCV64_OpRsh64Ux64(v)
542 return rewriteValueRISCV64_OpRsh64Ux8(v)
544 return rewriteValueRISCV64_OpRsh64x16(v)
546 return rewriteValueRISCV64_OpRsh64x32(v)
548 return rewriteValueRISCV64_OpRsh64x64(v)
550 return rewriteValueRISCV64_OpRsh64x8(v)
552 return rewriteValueRISCV64_OpRsh8Ux16(v)
554 return rewriteValueRISCV64_OpRsh8Ux32(v)
556 return rewriteValueRISCV64_OpRsh8Ux64(v)
558 return rewriteValueRISCV64_OpRsh8Ux8(v)
560 return rewriteValueRISCV64_OpRsh8x16(v)
562 return rewriteValueRISCV64_OpRsh8x32(v)
564 return rewriteValueRISCV64_OpRsh8x64(v)
566 return rewriteValueRISCV64_OpRsh8x8(v)
567 case OpSignExt16to32:
568 v.Op = OpRISCV64MOVHreg
570 case OpSignExt16to64:
571 v.Op = OpRISCV64MOVHreg
573 case OpSignExt32to64:
574 v.Op = OpRISCV64MOVWreg
577 v.Op = OpRISCV64MOVBreg
580 v.Op = OpRISCV64MOVBreg
583 v.Op = OpRISCV64MOVBreg
586 return rewriteValueRISCV64_OpSlicemask(v)
588 v.Op = OpRISCV64FSQRTD
591 v.Op = OpRISCV64FSQRTS
594 v.Op = OpRISCV64CALLstatic
597 return rewriteValueRISCV64_OpStore(v)
605 v.Op = OpRISCV64FSUBS
611 v.Op = OpRISCV64FSUBD
638 v.Op = OpRISCV64LoweredWB
653 return rewriteValueRISCV64_OpZero(v)
654 case OpZeroExt16to32:
655 v.Op = OpRISCV64MOVHUreg
657 case OpZeroExt16to64:
658 v.Op = OpRISCV64MOVHUreg
660 case OpZeroExt32to64:
661 v.Op = OpRISCV64MOVWUreg
664 v.Op = OpRISCV64MOVBUreg
667 v.Op = OpRISCV64MOVBUreg
670 v.Op = OpRISCV64MOVBUreg
675 func rewriteValueRISCV64_OpAddr(v *Value) bool {
677 // match: (Addr {sym} base)
678 // result: (MOVaddr {sym} [0] base)
680 sym := auxToSym(v.Aux)
682 v.reset(OpRISCV64MOVaddr)
683 v.AuxInt = int32ToAuxInt(0)
684 v.Aux = symToAux(sym)
689 func rewriteValueRISCV64_OpAtomicAnd8(v *Value) bool {
694 typ := &b.Func.Config.Types
695 // match: (AtomicAnd8 ptr val mem)
696 // result: (LoweredAtomicAnd32 (ANDI <typ.Uintptr> [^3] ptr) (NOT <typ.UInt32> (SLL <typ.UInt32> (XORI <typ.UInt32> [0xff] (ZeroExt8to32 val)) (SLLI <typ.UInt64> [3] (ANDI <typ.UInt64> [3] ptr)))) mem)
701 v.reset(OpRISCV64LoweredAtomicAnd32)
702 v0 := b.NewValue0(v.Pos, OpRISCV64ANDI, typ.Uintptr)
703 v0.AuxInt = int64ToAuxInt(^3)
705 v1 := b.NewValue0(v.Pos, OpRISCV64NOT, typ.UInt32)
706 v2 := b.NewValue0(v.Pos, OpRISCV64SLL, typ.UInt32)
707 v3 := b.NewValue0(v.Pos, OpRISCV64XORI, typ.UInt32)
708 v3.AuxInt = int64ToAuxInt(0xff)
709 v4 := b.NewValue0(v.Pos, OpZeroExt8to32, typ.UInt32)
712 v5 := b.NewValue0(v.Pos, OpRISCV64SLLI, typ.UInt64)
713 v5.AuxInt = int64ToAuxInt(3)
714 v6 := b.NewValue0(v.Pos, OpRISCV64ANDI, typ.UInt64)
715 v6.AuxInt = int64ToAuxInt(3)
720 v.AddArg3(v0, v1, mem)
724 func rewriteValueRISCV64_OpAtomicOr8(v *Value) bool {
729 typ := &b.Func.Config.Types
730 // match: (AtomicOr8 ptr val mem)
731 // result: (LoweredAtomicOr32 (ANDI <typ.Uintptr> [^3] ptr) (SLL <typ.UInt32> (ZeroExt8to32 val) (SLLI <typ.UInt64> [3] (ANDI <typ.UInt64> [3] ptr))) mem)
736 v.reset(OpRISCV64LoweredAtomicOr32)
737 v0 := b.NewValue0(v.Pos, OpRISCV64ANDI, typ.Uintptr)
738 v0.AuxInt = int64ToAuxInt(^3)
740 v1 := b.NewValue0(v.Pos, OpRISCV64SLL, typ.UInt32)
741 v2 := b.NewValue0(v.Pos, OpZeroExt8to32, typ.UInt32)
743 v3 := b.NewValue0(v.Pos, OpRISCV64SLLI, typ.UInt64)
744 v3.AuxInt = int64ToAuxInt(3)
745 v4 := b.NewValue0(v.Pos, OpRISCV64ANDI, typ.UInt64)
746 v4.AuxInt = int64ToAuxInt(3)
750 v.AddArg3(v0, v1, mem)
754 func rewriteValueRISCV64_OpAvg64u(v *Value) bool {
758 // match: (Avg64u <t> x y)
759 // result: (ADD (ADD <t> (SRLI <t> [1] x) (SRLI <t> [1] y)) (ANDI <t> [1] (AND <t> x y)))
764 v.reset(OpRISCV64ADD)
765 v0 := b.NewValue0(v.Pos, OpRISCV64ADD, t)
766 v1 := b.NewValue0(v.Pos, OpRISCV64SRLI, t)
767 v1.AuxInt = int64ToAuxInt(1)
769 v2 := b.NewValue0(v.Pos, OpRISCV64SRLI, t)
770 v2.AuxInt = int64ToAuxInt(1)
773 v3 := b.NewValue0(v.Pos, OpRISCV64ANDI, t)
774 v3.AuxInt = int64ToAuxInt(1)
775 v4 := b.NewValue0(v.Pos, OpRISCV64AND, t)
782 func rewriteValueRISCV64_OpConst16(v *Value) bool {
783 // match: (Const16 [val])
784 // result: (MOVDconst [int64(val)])
786 val := auxIntToInt16(v.AuxInt)
787 v.reset(OpRISCV64MOVDconst)
788 v.AuxInt = int64ToAuxInt(int64(val))
792 func rewriteValueRISCV64_OpConst32(v *Value) bool {
793 // match: (Const32 [val])
794 // result: (MOVDconst [int64(val)])
796 val := auxIntToInt32(v.AuxInt)
797 v.reset(OpRISCV64MOVDconst)
798 v.AuxInt = int64ToAuxInt(int64(val))
802 func rewriteValueRISCV64_OpConst32F(v *Value) bool {
804 typ := &b.Func.Config.Types
805 // match: (Const32F [val])
806 // result: (FMVSX (MOVDconst [int64(math.Float32bits(val))]))
808 val := auxIntToFloat32(v.AuxInt)
809 v.reset(OpRISCV64FMVSX)
810 v0 := b.NewValue0(v.Pos, OpRISCV64MOVDconst, typ.UInt64)
811 v0.AuxInt = int64ToAuxInt(int64(math.Float32bits(val)))
816 func rewriteValueRISCV64_OpConst64(v *Value) bool {
817 // match: (Const64 [val])
818 // result: (MOVDconst [int64(val)])
820 val := auxIntToInt64(v.AuxInt)
821 v.reset(OpRISCV64MOVDconst)
822 v.AuxInt = int64ToAuxInt(int64(val))
826 func rewriteValueRISCV64_OpConst64F(v *Value) bool {
828 typ := &b.Func.Config.Types
829 // match: (Const64F [val])
830 // result: (FMVDX (MOVDconst [int64(math.Float64bits(val))]))
832 val := auxIntToFloat64(v.AuxInt)
833 v.reset(OpRISCV64FMVDX)
834 v0 := b.NewValue0(v.Pos, OpRISCV64MOVDconst, typ.UInt64)
835 v0.AuxInt = int64ToAuxInt(int64(math.Float64bits(val)))
840 func rewriteValueRISCV64_OpConst8(v *Value) bool {
841 // match: (Const8 [val])
842 // result: (MOVDconst [int64(val)])
844 val := auxIntToInt8(v.AuxInt)
845 v.reset(OpRISCV64MOVDconst)
846 v.AuxInt = int64ToAuxInt(int64(val))
850 func rewriteValueRISCV64_OpConstBool(v *Value) bool {
851 // match: (ConstBool [val])
852 // result: (MOVDconst [int64(b2i(val))])
854 val := auxIntToBool(v.AuxInt)
855 v.reset(OpRISCV64MOVDconst)
856 v.AuxInt = int64ToAuxInt(int64(b2i(val)))
860 func rewriteValueRISCV64_OpConstNil(v *Value) bool {
862 // result: (MOVDconst [0])
864 v.reset(OpRISCV64MOVDconst)
865 v.AuxInt = int64ToAuxInt(0)
869 func rewriteValueRISCV64_OpDiv16(v *Value) bool {
873 typ := &b.Func.Config.Types
874 // match: (Div16 x y [false])
875 // result: (DIVW (SignExt16to32 x) (SignExt16to32 y))
877 if auxIntToBool(v.AuxInt) != false {
882 v.reset(OpRISCV64DIVW)
883 v0 := b.NewValue0(v.Pos, OpSignExt16to32, typ.Int32)
885 v1 := b.NewValue0(v.Pos, OpSignExt16to32, typ.Int32)
892 func rewriteValueRISCV64_OpDiv16u(v *Value) bool {
896 typ := &b.Func.Config.Types
897 // match: (Div16u x y)
898 // result: (DIVUW (ZeroExt16to32 x) (ZeroExt16to32 y))
902 v.reset(OpRISCV64DIVUW)
903 v0 := b.NewValue0(v.Pos, OpZeroExt16to32, typ.UInt32)
905 v1 := b.NewValue0(v.Pos, OpZeroExt16to32, typ.UInt32)
911 func rewriteValueRISCV64_OpDiv32(v *Value) bool {
914 // match: (Div32 x y [false])
915 // result: (DIVW x y)
917 if auxIntToBool(v.AuxInt) != false {
922 v.reset(OpRISCV64DIVW)
928 func rewriteValueRISCV64_OpDiv64(v *Value) bool {
931 // match: (Div64 x y [false])
934 if auxIntToBool(v.AuxInt) != false {
939 v.reset(OpRISCV64DIV)
945 func rewriteValueRISCV64_OpDiv8(v *Value) bool {
949 typ := &b.Func.Config.Types
951 // result: (DIVW (SignExt8to32 x) (SignExt8to32 y))
955 v.reset(OpRISCV64DIVW)
956 v0 := b.NewValue0(v.Pos, OpSignExt8to32, typ.Int32)
958 v1 := b.NewValue0(v.Pos, OpSignExt8to32, typ.Int32)
964 func rewriteValueRISCV64_OpDiv8u(v *Value) bool {
968 typ := &b.Func.Config.Types
969 // match: (Div8u x y)
970 // result: (DIVUW (ZeroExt8to32 x) (ZeroExt8to32 y))
974 v.reset(OpRISCV64DIVUW)
975 v0 := b.NewValue0(v.Pos, OpZeroExt8to32, typ.UInt32)
977 v1 := b.NewValue0(v.Pos, OpZeroExt8to32, typ.UInt32)
983 func rewriteValueRISCV64_OpEq16(v *Value) bool {
987 typ := &b.Func.Config.Types
989 // result: (SEQZ (SUB <x.Type> (ZeroExt16to64 x) (ZeroExt16to64 y)))
993 v.reset(OpRISCV64SEQZ)
994 v0 := b.NewValue0(v.Pos, OpRISCV64SUB, x.Type)
995 v1 := b.NewValue0(v.Pos, OpZeroExt16to64, typ.UInt64)
997 v2 := b.NewValue0(v.Pos, OpZeroExt16to64, typ.UInt64)
1004 func rewriteValueRISCV64_OpEq32(v *Value) bool {
1008 typ := &b.Func.Config.Types
1009 // match: (Eq32 x y)
1010 // result: (SEQZ (SUB <x.Type> (ZeroExt32to64 x) (ZeroExt32to64 y)))
1014 v.reset(OpRISCV64SEQZ)
1015 v0 := b.NewValue0(v.Pos, OpRISCV64SUB, x.Type)
1016 v1 := b.NewValue0(v.Pos, OpZeroExt32to64, typ.UInt64)
1018 v2 := b.NewValue0(v.Pos, OpZeroExt32to64, typ.UInt64)
1025 func rewriteValueRISCV64_OpEq64(v *Value) bool {
1029 // match: (Eq64 x y)
1030 // result: (SEQZ (SUB <x.Type> x y))
1034 v.reset(OpRISCV64SEQZ)
1035 v0 := b.NewValue0(v.Pos, OpRISCV64SUB, x.Type)
1041 func rewriteValueRISCV64_OpEq8(v *Value) bool {
1045 typ := &b.Func.Config.Types
1047 // result: (SEQZ (SUB <x.Type> (ZeroExt8to64 x) (ZeroExt8to64 y)))
1051 v.reset(OpRISCV64SEQZ)
1052 v0 := b.NewValue0(v.Pos, OpRISCV64SUB, x.Type)
1053 v1 := b.NewValue0(v.Pos, OpZeroExt8to64, typ.UInt64)
1055 v2 := b.NewValue0(v.Pos, OpZeroExt8to64, typ.UInt64)
1062 func rewriteValueRISCV64_OpEqB(v *Value) bool {
1066 typ := &b.Func.Config.Types
1068 // result: (SEQZ (XOR <typ.Bool> x y))
1072 v.reset(OpRISCV64SEQZ)
1073 v0 := b.NewValue0(v.Pos, OpRISCV64XOR, typ.Bool)
1079 func rewriteValueRISCV64_OpEqPtr(v *Value) bool {
1083 // match: (EqPtr x y)
1084 // result: (SEQZ (SUB <x.Type> x y))
1088 v.reset(OpRISCV64SEQZ)
1089 v0 := b.NewValue0(v.Pos, OpRISCV64SUB, x.Type)
1095 func rewriteValueRISCV64_OpHmul32(v *Value) bool {
1099 typ := &b.Func.Config.Types
1100 // match: (Hmul32 x y)
1101 // result: (SRAI [32] (MUL (SignExt32to64 x) (SignExt32to64 y)))
1105 v.reset(OpRISCV64SRAI)
1106 v.AuxInt = int64ToAuxInt(32)
1107 v0 := b.NewValue0(v.Pos, OpRISCV64MUL, typ.Int64)
1108 v1 := b.NewValue0(v.Pos, OpSignExt32to64, typ.Int64)
1110 v2 := b.NewValue0(v.Pos, OpSignExt32to64, typ.Int64)
1117 func rewriteValueRISCV64_OpHmul32u(v *Value) bool {
1121 typ := &b.Func.Config.Types
1122 // match: (Hmul32u x y)
1123 // result: (SRLI [32] (MUL (ZeroExt32to64 x) (ZeroExt32to64 y)))
1127 v.reset(OpRISCV64SRLI)
1128 v.AuxInt = int64ToAuxInt(32)
1129 v0 := b.NewValue0(v.Pos, OpRISCV64MUL, typ.Int64)
1130 v1 := b.NewValue0(v.Pos, OpZeroExt32to64, typ.UInt64)
1132 v2 := b.NewValue0(v.Pos, OpZeroExt32to64, typ.UInt64)
1139 func rewriteValueRISCV64_OpLeq16(v *Value) bool {
1143 typ := &b.Func.Config.Types
1144 // match: (Leq16 x y)
1145 // result: (Not (Less16 y x))
1150 v0 := b.NewValue0(v.Pos, OpLess16, typ.Bool)
1156 func rewriteValueRISCV64_OpLeq16U(v *Value) bool {
1160 typ := &b.Func.Config.Types
1161 // match: (Leq16U x y)
1162 // result: (Not (Less16U y x))
1167 v0 := b.NewValue0(v.Pos, OpLess16U, typ.Bool)
1173 func rewriteValueRISCV64_OpLeq32(v *Value) bool {
1177 typ := &b.Func.Config.Types
1178 // match: (Leq32 x y)
1179 // result: (Not (Less32 y x))
1184 v0 := b.NewValue0(v.Pos, OpLess32, typ.Bool)
1190 func rewriteValueRISCV64_OpLeq32U(v *Value) bool {
1194 typ := &b.Func.Config.Types
1195 // match: (Leq32U x y)
1196 // result: (Not (Less32U y x))
1201 v0 := b.NewValue0(v.Pos, OpLess32U, typ.Bool)
1207 func rewriteValueRISCV64_OpLeq64(v *Value) bool {
1211 typ := &b.Func.Config.Types
1212 // match: (Leq64 x y)
1213 // result: (Not (Less64 y x))
1218 v0 := b.NewValue0(v.Pos, OpLess64, typ.Bool)
1224 func rewriteValueRISCV64_OpLeq64U(v *Value) bool {
1228 typ := &b.Func.Config.Types
1229 // match: (Leq64U x y)
1230 // result: (Not (Less64U y x))
1235 v0 := b.NewValue0(v.Pos, OpLess64U, typ.Bool)
1241 func rewriteValueRISCV64_OpLeq8(v *Value) bool {
1245 typ := &b.Func.Config.Types
1246 // match: (Leq8 x y)
1247 // result: (Not (Less8 y x))
1252 v0 := b.NewValue0(v.Pos, OpLess8, typ.Bool)
1258 func rewriteValueRISCV64_OpLeq8U(v *Value) bool {
1262 typ := &b.Func.Config.Types
1263 // match: (Leq8U x y)
1264 // result: (Not (Less8U y x))
1269 v0 := b.NewValue0(v.Pos, OpLess8U, typ.Bool)
1275 func rewriteValueRISCV64_OpLess16(v *Value) bool {
1279 typ := &b.Func.Config.Types
1280 // match: (Less16 x y)
1281 // result: (SLT (SignExt16to64 x) (SignExt16to64 y))
1285 v.reset(OpRISCV64SLT)
1286 v0 := b.NewValue0(v.Pos, OpSignExt16to64, typ.Int64)
1288 v1 := b.NewValue0(v.Pos, OpSignExt16to64, typ.Int64)
1294 func rewriteValueRISCV64_OpLess16U(v *Value) bool {
1298 typ := &b.Func.Config.Types
1299 // match: (Less16U x y)
1300 // result: (SLTU (ZeroExt16to64 x) (ZeroExt16to64 y))
1304 v.reset(OpRISCV64SLTU)
1305 v0 := b.NewValue0(v.Pos, OpZeroExt16to64, typ.UInt64)
1307 v1 := b.NewValue0(v.Pos, OpZeroExt16to64, typ.UInt64)
1313 func rewriteValueRISCV64_OpLess32(v *Value) bool {
1317 typ := &b.Func.Config.Types
1318 // match: (Less32 x y)
1319 // result: (SLT (SignExt32to64 x) (SignExt32to64 y))
1323 v.reset(OpRISCV64SLT)
1324 v0 := b.NewValue0(v.Pos, OpSignExt32to64, typ.Int64)
1326 v1 := b.NewValue0(v.Pos, OpSignExt32to64, typ.Int64)
1332 func rewriteValueRISCV64_OpLess32U(v *Value) bool {
1336 typ := &b.Func.Config.Types
1337 // match: (Less32U x y)
1338 // result: (SLTU (ZeroExt32to64 x) (ZeroExt32to64 y))
1342 v.reset(OpRISCV64SLTU)
1343 v0 := b.NewValue0(v.Pos, OpZeroExt32to64, typ.UInt64)
1345 v1 := b.NewValue0(v.Pos, OpZeroExt32to64, typ.UInt64)
1351 func rewriteValueRISCV64_OpLess8(v *Value) bool {
1355 typ := &b.Func.Config.Types
1356 // match: (Less8 x y)
1357 // result: (SLT (SignExt8to64 x) (SignExt8to64 y))
1361 v.reset(OpRISCV64SLT)
1362 v0 := b.NewValue0(v.Pos, OpSignExt8to64, typ.Int64)
1364 v1 := b.NewValue0(v.Pos, OpSignExt8to64, typ.Int64)
1370 func rewriteValueRISCV64_OpLess8U(v *Value) bool {
1374 typ := &b.Func.Config.Types
1375 // match: (Less8U x y)
1376 // result: (SLTU (ZeroExt8to64 x) (ZeroExt8to64 y))
1380 v.reset(OpRISCV64SLTU)
1381 v0 := b.NewValue0(v.Pos, OpZeroExt8to64, typ.UInt64)
1383 v1 := b.NewValue0(v.Pos, OpZeroExt8to64, typ.UInt64)
1389 func rewriteValueRISCV64_OpLoad(v *Value) bool {
1392 // match: (Load <t> ptr mem)
1393 // cond: t.IsBoolean()
1394 // result: (MOVBUload ptr mem)
1399 if !(t.IsBoolean()) {
1402 v.reset(OpRISCV64MOVBUload)
1406 // match: (Load <t> ptr mem)
1407 // cond: ( is8BitInt(t) && isSigned(t))
1408 // result: (MOVBload ptr mem)
1413 if !(is8BitInt(t) && isSigned(t)) {
1416 v.reset(OpRISCV64MOVBload)
1420 // match: (Load <t> ptr mem)
1421 // cond: ( is8BitInt(t) && !isSigned(t))
1422 // result: (MOVBUload ptr mem)
1427 if !(is8BitInt(t) && !isSigned(t)) {
1430 v.reset(OpRISCV64MOVBUload)
1434 // match: (Load <t> ptr mem)
1435 // cond: (is16BitInt(t) && isSigned(t))
1436 // result: (MOVHload ptr mem)
1441 if !(is16BitInt(t) && isSigned(t)) {
1444 v.reset(OpRISCV64MOVHload)
1448 // match: (Load <t> ptr mem)
1449 // cond: (is16BitInt(t) && !isSigned(t))
1450 // result: (MOVHUload ptr mem)
1455 if !(is16BitInt(t) && !isSigned(t)) {
1458 v.reset(OpRISCV64MOVHUload)
1462 // match: (Load <t> ptr mem)
1463 // cond: (is32BitInt(t) && isSigned(t))
1464 // result: (MOVWload ptr mem)
1469 if !(is32BitInt(t) && isSigned(t)) {
1472 v.reset(OpRISCV64MOVWload)
1476 // match: (Load <t> ptr mem)
1477 // cond: (is32BitInt(t) && !isSigned(t))
1478 // result: (MOVWUload ptr mem)
1483 if !(is32BitInt(t) && !isSigned(t)) {
1486 v.reset(OpRISCV64MOVWUload)
1490 // match: (Load <t> ptr mem)
1491 // cond: (is64BitInt(t) || isPtr(t))
1492 // result: (MOVDload ptr mem)
1497 if !(is64BitInt(t) || isPtr(t)) {
1500 v.reset(OpRISCV64MOVDload)
1504 // match: (Load <t> ptr mem)
1505 // cond: is32BitFloat(t)
1506 // result: (FMOVWload ptr mem)
1511 if !(is32BitFloat(t)) {
1514 v.reset(OpRISCV64FMOVWload)
1518 // match: (Load <t> ptr mem)
1519 // cond: is64BitFloat(t)
1520 // result: (FMOVDload ptr mem)
1525 if !(is64BitFloat(t)) {
1528 v.reset(OpRISCV64FMOVDload)
1534 func rewriteValueRISCV64_OpLocalAddr(v *Value) bool {
1536 // match: (LocalAddr {sym} base _)
1537 // result: (MOVaddr {sym} base)
1539 sym := auxToSym(v.Aux)
1541 v.reset(OpRISCV64MOVaddr)
1542 v.Aux = symToAux(sym)
1547 func rewriteValueRISCV64_OpLsh16x16(v *Value) bool {
1551 typ := &b.Func.Config.Types
1552 // match: (Lsh16x16 <t> x y)
1553 // result: (AND (SLL <t> x y) (Neg16 <t> (SLTIU <t> [64] (ZeroExt16to64 y))))
1558 v.reset(OpRISCV64AND)
1559 v0 := b.NewValue0(v.Pos, OpRISCV64SLL, t)
1561 v1 := b.NewValue0(v.Pos, OpNeg16, t)
1562 v2 := b.NewValue0(v.Pos, OpRISCV64SLTIU, t)
1563 v2.AuxInt = int64ToAuxInt(64)
1564 v3 := b.NewValue0(v.Pos, OpZeroExt16to64, typ.UInt64)
1572 func rewriteValueRISCV64_OpLsh16x32(v *Value) bool {
1576 typ := &b.Func.Config.Types
1577 // match: (Lsh16x32 <t> x y)
1578 // result: (AND (SLL <t> x y) (Neg16 <t> (SLTIU <t> [64] (ZeroExt32to64 y))))
1583 v.reset(OpRISCV64AND)
1584 v0 := b.NewValue0(v.Pos, OpRISCV64SLL, t)
1586 v1 := b.NewValue0(v.Pos, OpNeg16, t)
1587 v2 := b.NewValue0(v.Pos, OpRISCV64SLTIU, t)
1588 v2.AuxInt = int64ToAuxInt(64)
1589 v3 := b.NewValue0(v.Pos, OpZeroExt32to64, typ.UInt64)
1597 func rewriteValueRISCV64_OpLsh16x64(v *Value) bool {
1601 // match: (Lsh16x64 <t> x y)
1602 // result: (AND (SLL <t> x y) (Neg16 <t> (SLTIU <t> [64] y)))
1607 v.reset(OpRISCV64AND)
1608 v0 := b.NewValue0(v.Pos, OpRISCV64SLL, t)
1610 v1 := b.NewValue0(v.Pos, OpNeg16, t)
1611 v2 := b.NewValue0(v.Pos, OpRISCV64SLTIU, t)
1612 v2.AuxInt = int64ToAuxInt(64)
1619 func rewriteValueRISCV64_OpLsh16x8(v *Value) bool {
1623 typ := &b.Func.Config.Types
1624 // match: (Lsh16x8 <t> x y)
1625 // result: (AND (SLL <t> x y) (Neg16 <t> (SLTIU <t> [64] (ZeroExt8to64 y))))
1630 v.reset(OpRISCV64AND)
1631 v0 := b.NewValue0(v.Pos, OpRISCV64SLL, t)
1633 v1 := b.NewValue0(v.Pos, OpNeg16, t)
1634 v2 := b.NewValue0(v.Pos, OpRISCV64SLTIU, t)
1635 v2.AuxInt = int64ToAuxInt(64)
1636 v3 := b.NewValue0(v.Pos, OpZeroExt8to64, typ.UInt64)
1644 func rewriteValueRISCV64_OpLsh32x16(v *Value) bool {
1648 typ := &b.Func.Config.Types
1649 // match: (Lsh32x16 <t> x y)
1650 // result: (AND (SLL <t> x y) (Neg32 <t> (SLTIU <t> [64] (ZeroExt16to64 y))))
1655 v.reset(OpRISCV64AND)
1656 v0 := b.NewValue0(v.Pos, OpRISCV64SLL, t)
1658 v1 := b.NewValue0(v.Pos, OpNeg32, t)
1659 v2 := b.NewValue0(v.Pos, OpRISCV64SLTIU, t)
1660 v2.AuxInt = int64ToAuxInt(64)
1661 v3 := b.NewValue0(v.Pos, OpZeroExt16to64, typ.UInt64)
1669 func rewriteValueRISCV64_OpLsh32x32(v *Value) bool {
1673 typ := &b.Func.Config.Types
1674 // match: (Lsh32x32 <t> x y)
1675 // result: (AND (SLL <t> x y) (Neg32 <t> (SLTIU <t> [64] (ZeroExt32to64 y))))
1680 v.reset(OpRISCV64AND)
1681 v0 := b.NewValue0(v.Pos, OpRISCV64SLL, t)
1683 v1 := b.NewValue0(v.Pos, OpNeg32, t)
1684 v2 := b.NewValue0(v.Pos, OpRISCV64SLTIU, t)
1685 v2.AuxInt = int64ToAuxInt(64)
1686 v3 := b.NewValue0(v.Pos, OpZeroExt32to64, typ.UInt64)
1694 func rewriteValueRISCV64_OpLsh32x64(v *Value) bool {
1698 // match: (Lsh32x64 <t> x y)
1699 // result: (AND (SLL <t> x y) (Neg32 <t> (SLTIU <t> [64] y)))
1704 v.reset(OpRISCV64AND)
1705 v0 := b.NewValue0(v.Pos, OpRISCV64SLL, t)
1707 v1 := b.NewValue0(v.Pos, OpNeg32, t)
1708 v2 := b.NewValue0(v.Pos, OpRISCV64SLTIU, t)
1709 v2.AuxInt = int64ToAuxInt(64)
1716 func rewriteValueRISCV64_OpLsh32x8(v *Value) bool {
1720 typ := &b.Func.Config.Types
1721 // match: (Lsh32x8 <t> x y)
1722 // result: (AND (SLL <t> x y) (Neg32 <t> (SLTIU <t> [64] (ZeroExt8to64 y))))
1727 v.reset(OpRISCV64AND)
1728 v0 := b.NewValue0(v.Pos, OpRISCV64SLL, t)
1730 v1 := b.NewValue0(v.Pos, OpNeg32, t)
1731 v2 := b.NewValue0(v.Pos, OpRISCV64SLTIU, t)
1732 v2.AuxInt = int64ToAuxInt(64)
1733 v3 := b.NewValue0(v.Pos, OpZeroExt8to64, typ.UInt64)
1741 func rewriteValueRISCV64_OpLsh64x16(v *Value) bool {
1745 typ := &b.Func.Config.Types
1746 // match: (Lsh64x16 <t> x y)
1747 // result: (AND (SLL <t> x y) (Neg64 <t> (SLTIU <t> [64] (ZeroExt16to64 y))))
1752 v.reset(OpRISCV64AND)
1753 v0 := b.NewValue0(v.Pos, OpRISCV64SLL, t)
1755 v1 := b.NewValue0(v.Pos, OpNeg64, t)
1756 v2 := b.NewValue0(v.Pos, OpRISCV64SLTIU, t)
1757 v2.AuxInt = int64ToAuxInt(64)
1758 v3 := b.NewValue0(v.Pos, OpZeroExt16to64, typ.UInt64)
1766 func rewriteValueRISCV64_OpLsh64x32(v *Value) bool {
1770 typ := &b.Func.Config.Types
1771 // match: (Lsh64x32 <t> x y)
1772 // result: (AND (SLL <t> x y) (Neg64 <t> (SLTIU <t> [64] (ZeroExt32to64 y))))
1777 v.reset(OpRISCV64AND)
1778 v0 := b.NewValue0(v.Pos, OpRISCV64SLL, t)
1780 v1 := b.NewValue0(v.Pos, OpNeg64, t)
1781 v2 := b.NewValue0(v.Pos, OpRISCV64SLTIU, t)
1782 v2.AuxInt = int64ToAuxInt(64)
1783 v3 := b.NewValue0(v.Pos, OpZeroExt32to64, typ.UInt64)
1791 func rewriteValueRISCV64_OpLsh64x64(v *Value) bool {
1795 // match: (Lsh64x64 <t> x y)
1796 // result: (AND (SLL <t> x y) (Neg64 <t> (SLTIU <t> [64] y)))
1801 v.reset(OpRISCV64AND)
1802 v0 := b.NewValue0(v.Pos, OpRISCV64SLL, t)
1804 v1 := b.NewValue0(v.Pos, OpNeg64, t)
1805 v2 := b.NewValue0(v.Pos, OpRISCV64SLTIU, t)
1806 v2.AuxInt = int64ToAuxInt(64)
1813 func rewriteValueRISCV64_OpLsh64x8(v *Value) bool {
1817 typ := &b.Func.Config.Types
1818 // match: (Lsh64x8 <t> x y)
1819 // result: (AND (SLL <t> x y) (Neg64 <t> (SLTIU <t> [64] (ZeroExt8to64 y))))
1824 v.reset(OpRISCV64AND)
1825 v0 := b.NewValue0(v.Pos, OpRISCV64SLL, t)
1827 v1 := b.NewValue0(v.Pos, OpNeg64, t)
1828 v2 := b.NewValue0(v.Pos, OpRISCV64SLTIU, t)
1829 v2.AuxInt = int64ToAuxInt(64)
1830 v3 := b.NewValue0(v.Pos, OpZeroExt8to64, typ.UInt64)
1838 func rewriteValueRISCV64_OpLsh8x16(v *Value) bool {
1842 typ := &b.Func.Config.Types
1843 // match: (Lsh8x16 <t> x y)
1844 // result: (AND (SLL <t> x y) (Neg8 <t> (SLTIU <t> [64] (ZeroExt16to64 y))))
1849 v.reset(OpRISCV64AND)
1850 v0 := b.NewValue0(v.Pos, OpRISCV64SLL, t)
1852 v1 := b.NewValue0(v.Pos, OpNeg8, t)
1853 v2 := b.NewValue0(v.Pos, OpRISCV64SLTIU, t)
1854 v2.AuxInt = int64ToAuxInt(64)
1855 v3 := b.NewValue0(v.Pos, OpZeroExt16to64, typ.UInt64)
1863 func rewriteValueRISCV64_OpLsh8x32(v *Value) bool {
1867 typ := &b.Func.Config.Types
1868 // match: (Lsh8x32 <t> x y)
1869 // result: (AND (SLL <t> x y) (Neg8 <t> (SLTIU <t> [64] (ZeroExt32to64 y))))
1874 v.reset(OpRISCV64AND)
1875 v0 := b.NewValue0(v.Pos, OpRISCV64SLL, t)
1877 v1 := b.NewValue0(v.Pos, OpNeg8, t)
1878 v2 := b.NewValue0(v.Pos, OpRISCV64SLTIU, t)
1879 v2.AuxInt = int64ToAuxInt(64)
1880 v3 := b.NewValue0(v.Pos, OpZeroExt32to64, typ.UInt64)
1888 func rewriteValueRISCV64_OpLsh8x64(v *Value) bool {
1892 // match: (Lsh8x64 <t> x y)
1893 // result: (AND (SLL <t> x y) (Neg8 <t> (SLTIU <t> [64] y)))
1898 v.reset(OpRISCV64AND)
1899 v0 := b.NewValue0(v.Pos, OpRISCV64SLL, t)
1901 v1 := b.NewValue0(v.Pos, OpNeg8, t)
1902 v2 := b.NewValue0(v.Pos, OpRISCV64SLTIU, t)
1903 v2.AuxInt = int64ToAuxInt(64)
1910 func rewriteValueRISCV64_OpLsh8x8(v *Value) bool {
1914 typ := &b.Func.Config.Types
1915 // match: (Lsh8x8 <t> x y)
1916 // result: (AND (SLL <t> x y) (Neg8 <t> (SLTIU <t> [64] (ZeroExt8to64 y))))
1921 v.reset(OpRISCV64AND)
1922 v0 := b.NewValue0(v.Pos, OpRISCV64SLL, t)
1924 v1 := b.NewValue0(v.Pos, OpNeg8, t)
1925 v2 := b.NewValue0(v.Pos, OpRISCV64SLTIU, t)
1926 v2.AuxInt = int64ToAuxInt(64)
1927 v3 := b.NewValue0(v.Pos, OpZeroExt8to64, typ.UInt64)
1935 func rewriteValueRISCV64_OpMod16(v *Value) bool {
1939 typ := &b.Func.Config.Types
1940 // match: (Mod16 x y [false])
1941 // result: (REMW (SignExt16to32 x) (SignExt16to32 y))
1943 if auxIntToBool(v.AuxInt) != false {
1948 v.reset(OpRISCV64REMW)
1949 v0 := b.NewValue0(v.Pos, OpSignExt16to32, typ.Int32)
1951 v1 := b.NewValue0(v.Pos, OpSignExt16to32, typ.Int32)
1958 func rewriteValueRISCV64_OpMod16u(v *Value) bool {
1962 typ := &b.Func.Config.Types
1963 // match: (Mod16u x y)
1964 // result: (REMUW (ZeroExt16to32 x) (ZeroExt16to32 y))
1968 v.reset(OpRISCV64REMUW)
1969 v0 := b.NewValue0(v.Pos, OpZeroExt16to32, typ.UInt32)
1971 v1 := b.NewValue0(v.Pos, OpZeroExt16to32, typ.UInt32)
1977 func rewriteValueRISCV64_OpMod32(v *Value) bool {
1980 // match: (Mod32 x y [false])
1981 // result: (REMW x y)
1983 if auxIntToBool(v.AuxInt) != false {
1988 v.reset(OpRISCV64REMW)
1994 func rewriteValueRISCV64_OpMod64(v *Value) bool {
1997 // match: (Mod64 x y [false])
1998 // result: (REM x y)
2000 if auxIntToBool(v.AuxInt) != false {
2005 v.reset(OpRISCV64REM)
2011 func rewriteValueRISCV64_OpMod8(v *Value) bool {
2015 typ := &b.Func.Config.Types
2016 // match: (Mod8 x y)
2017 // result: (REMW (SignExt8to32 x) (SignExt8to32 y))
2021 v.reset(OpRISCV64REMW)
2022 v0 := b.NewValue0(v.Pos, OpSignExt8to32, typ.Int32)
2024 v1 := b.NewValue0(v.Pos, OpSignExt8to32, typ.Int32)
2030 func rewriteValueRISCV64_OpMod8u(v *Value) bool {
2034 typ := &b.Func.Config.Types
2035 // match: (Mod8u x y)
2036 // result: (REMUW (ZeroExt8to32 x) (ZeroExt8to32 y))
2040 v.reset(OpRISCV64REMUW)
2041 v0 := b.NewValue0(v.Pos, OpZeroExt8to32, typ.UInt32)
2043 v1 := b.NewValue0(v.Pos, OpZeroExt8to32, typ.UInt32)
2049 func rewriteValueRISCV64_OpMove(v *Value) bool {
2054 config := b.Func.Config
2055 typ := &b.Func.Config.Types
2056 // match: (Move [0] _ _ mem)
2059 if auxIntToInt64(v.AuxInt) != 0 {
2066 // match: (Move [1] dst src mem)
2067 // result: (MOVBstore dst (MOVBload src mem) mem)
2069 if auxIntToInt64(v.AuxInt) != 1 {
2075 v.reset(OpRISCV64MOVBstore)
2076 v0 := b.NewValue0(v.Pos, OpRISCV64MOVBload, typ.Int8)
2077 v0.AddArg2(src, mem)
2078 v.AddArg3(dst, v0, mem)
2081 // match: (Move [2] {t} dst src mem)
2082 // cond: t.Alignment()%2 == 0
2083 // result: (MOVHstore dst (MOVHload src mem) mem)
2085 if auxIntToInt64(v.AuxInt) != 2 {
2088 t := auxToType(v.Aux)
2092 if !(t.Alignment()%2 == 0) {
2095 v.reset(OpRISCV64MOVHstore)
2096 v0 := b.NewValue0(v.Pos, OpRISCV64MOVHload, typ.Int16)
2097 v0.AddArg2(src, mem)
2098 v.AddArg3(dst, v0, mem)
2101 // match: (Move [2] dst src mem)
2102 // result: (MOVBstore [1] dst (MOVBload [1] src mem) (MOVBstore dst (MOVBload src mem) mem))
2104 if auxIntToInt64(v.AuxInt) != 2 {
2110 v.reset(OpRISCV64MOVBstore)
2111 v.AuxInt = int32ToAuxInt(1)
2112 v0 := b.NewValue0(v.Pos, OpRISCV64MOVBload, typ.Int8)
2113 v0.AuxInt = int32ToAuxInt(1)
2114 v0.AddArg2(src, mem)
2115 v1 := b.NewValue0(v.Pos, OpRISCV64MOVBstore, types.TypeMem)
2116 v2 := b.NewValue0(v.Pos, OpRISCV64MOVBload, typ.Int8)
2117 v2.AddArg2(src, mem)
2118 v1.AddArg3(dst, v2, mem)
2119 v.AddArg3(dst, v0, v1)
2122 // match: (Move [4] {t} dst src mem)
2123 // cond: t.Alignment()%4 == 0
2124 // result: (MOVWstore dst (MOVWload src mem) mem)
2126 if auxIntToInt64(v.AuxInt) != 4 {
2129 t := auxToType(v.Aux)
2133 if !(t.Alignment()%4 == 0) {
2136 v.reset(OpRISCV64MOVWstore)
2137 v0 := b.NewValue0(v.Pos, OpRISCV64MOVWload, typ.Int32)
2138 v0.AddArg2(src, mem)
2139 v.AddArg3(dst, v0, mem)
2142 // match: (Move [4] {t} dst src mem)
2143 // cond: t.Alignment()%2 == 0
2144 // result: (MOVHstore [2] dst (MOVHload [2] src mem) (MOVHstore dst (MOVHload src mem) mem))
2146 if auxIntToInt64(v.AuxInt) != 4 {
2149 t := auxToType(v.Aux)
2153 if !(t.Alignment()%2 == 0) {
2156 v.reset(OpRISCV64MOVHstore)
2157 v.AuxInt = int32ToAuxInt(2)
2158 v0 := b.NewValue0(v.Pos, OpRISCV64MOVHload, typ.Int16)
2159 v0.AuxInt = int32ToAuxInt(2)
2160 v0.AddArg2(src, mem)
2161 v1 := b.NewValue0(v.Pos, OpRISCV64MOVHstore, types.TypeMem)
2162 v2 := b.NewValue0(v.Pos, OpRISCV64MOVHload, typ.Int16)
2163 v2.AddArg2(src, mem)
2164 v1.AddArg3(dst, v2, mem)
2165 v.AddArg3(dst, v0, v1)
2168 // match: (Move [4] dst src mem)
2169 // result: (MOVBstore [3] dst (MOVBload [3] src mem) (MOVBstore [2] dst (MOVBload [2] src mem) (MOVBstore [1] dst (MOVBload [1] src mem) (MOVBstore dst (MOVBload src mem) mem))))
2171 if auxIntToInt64(v.AuxInt) != 4 {
2177 v.reset(OpRISCV64MOVBstore)
2178 v.AuxInt = int32ToAuxInt(3)
2179 v0 := b.NewValue0(v.Pos, OpRISCV64MOVBload, typ.Int8)
2180 v0.AuxInt = int32ToAuxInt(3)
2181 v0.AddArg2(src, mem)
2182 v1 := b.NewValue0(v.Pos, OpRISCV64MOVBstore, types.TypeMem)
2183 v1.AuxInt = int32ToAuxInt(2)
2184 v2 := b.NewValue0(v.Pos, OpRISCV64MOVBload, typ.Int8)
2185 v2.AuxInt = int32ToAuxInt(2)
2186 v2.AddArg2(src, mem)
2187 v3 := b.NewValue0(v.Pos, OpRISCV64MOVBstore, types.TypeMem)
2188 v3.AuxInt = int32ToAuxInt(1)
2189 v4 := b.NewValue0(v.Pos, OpRISCV64MOVBload, typ.Int8)
2190 v4.AuxInt = int32ToAuxInt(1)
2191 v4.AddArg2(src, mem)
2192 v5 := b.NewValue0(v.Pos, OpRISCV64MOVBstore, types.TypeMem)
2193 v6 := b.NewValue0(v.Pos, OpRISCV64MOVBload, typ.Int8)
2194 v6.AddArg2(src, mem)
2195 v5.AddArg3(dst, v6, mem)
2196 v3.AddArg3(dst, v4, v5)
2197 v1.AddArg3(dst, v2, v3)
2198 v.AddArg3(dst, v0, v1)
2201 // match: (Move [8] {t} dst src mem)
2202 // cond: t.Alignment()%8 == 0
2203 // result: (MOVDstore dst (MOVDload src mem) mem)
2205 if auxIntToInt64(v.AuxInt) != 8 {
2208 t := auxToType(v.Aux)
2212 if !(t.Alignment()%8 == 0) {
2215 v.reset(OpRISCV64MOVDstore)
2216 v0 := b.NewValue0(v.Pos, OpRISCV64MOVDload, typ.Int64)
2217 v0.AddArg2(src, mem)
2218 v.AddArg3(dst, v0, mem)
2221 // match: (Move [8] {t} dst src mem)
2222 // cond: t.Alignment()%4 == 0
2223 // result: (MOVWstore [4] dst (MOVWload [4] src mem) (MOVWstore dst (MOVWload src mem) mem))
2225 if auxIntToInt64(v.AuxInt) != 8 {
2228 t := auxToType(v.Aux)
2232 if !(t.Alignment()%4 == 0) {
2235 v.reset(OpRISCV64MOVWstore)
2236 v.AuxInt = int32ToAuxInt(4)
2237 v0 := b.NewValue0(v.Pos, OpRISCV64MOVWload, typ.Int32)
2238 v0.AuxInt = int32ToAuxInt(4)
2239 v0.AddArg2(src, mem)
2240 v1 := b.NewValue0(v.Pos, OpRISCV64MOVWstore, types.TypeMem)
2241 v2 := b.NewValue0(v.Pos, OpRISCV64MOVWload, typ.Int32)
2242 v2.AddArg2(src, mem)
2243 v1.AddArg3(dst, v2, mem)
2244 v.AddArg3(dst, v0, v1)
2247 // match: (Move [8] {t} dst src mem)
2248 // cond: t.Alignment()%2 == 0
2249 // result: (MOVHstore [6] dst (MOVHload [6] src mem) (MOVHstore [4] dst (MOVHload [4] src mem) (MOVHstore [2] dst (MOVHload [2] src mem) (MOVHstore dst (MOVHload src mem) mem))))
2251 if auxIntToInt64(v.AuxInt) != 8 {
2254 t := auxToType(v.Aux)
2258 if !(t.Alignment()%2 == 0) {
2261 v.reset(OpRISCV64MOVHstore)
2262 v.AuxInt = int32ToAuxInt(6)
2263 v0 := b.NewValue0(v.Pos, OpRISCV64MOVHload, typ.Int16)
2264 v0.AuxInt = int32ToAuxInt(6)
2265 v0.AddArg2(src, mem)
2266 v1 := b.NewValue0(v.Pos, OpRISCV64MOVHstore, types.TypeMem)
2267 v1.AuxInt = int32ToAuxInt(4)
2268 v2 := b.NewValue0(v.Pos, OpRISCV64MOVHload, typ.Int16)
2269 v2.AuxInt = int32ToAuxInt(4)
2270 v2.AddArg2(src, mem)
2271 v3 := b.NewValue0(v.Pos, OpRISCV64MOVHstore, types.TypeMem)
2272 v3.AuxInt = int32ToAuxInt(2)
2273 v4 := b.NewValue0(v.Pos, OpRISCV64MOVHload, typ.Int16)
2274 v4.AuxInt = int32ToAuxInt(2)
2275 v4.AddArg2(src, mem)
2276 v5 := b.NewValue0(v.Pos, OpRISCV64MOVHstore, types.TypeMem)
2277 v6 := b.NewValue0(v.Pos, OpRISCV64MOVHload, typ.Int16)
2278 v6.AddArg2(src, mem)
2279 v5.AddArg3(dst, v6, mem)
2280 v3.AddArg3(dst, v4, v5)
2281 v1.AddArg3(dst, v2, v3)
2282 v.AddArg3(dst, v0, v1)
2285 // match: (Move [3] dst src mem)
2286 // result: (MOVBstore [2] dst (MOVBload [2] src mem) (MOVBstore [1] dst (MOVBload [1] src mem) (MOVBstore dst (MOVBload src mem) mem)))
2288 if auxIntToInt64(v.AuxInt) != 3 {
2294 v.reset(OpRISCV64MOVBstore)
2295 v.AuxInt = int32ToAuxInt(2)
2296 v0 := b.NewValue0(v.Pos, OpRISCV64MOVBload, typ.Int8)
2297 v0.AuxInt = int32ToAuxInt(2)
2298 v0.AddArg2(src, mem)
2299 v1 := b.NewValue0(v.Pos, OpRISCV64MOVBstore, types.TypeMem)
2300 v1.AuxInt = int32ToAuxInt(1)
2301 v2 := b.NewValue0(v.Pos, OpRISCV64MOVBload, typ.Int8)
2302 v2.AuxInt = int32ToAuxInt(1)
2303 v2.AddArg2(src, mem)
2304 v3 := b.NewValue0(v.Pos, OpRISCV64MOVBstore, types.TypeMem)
2305 v4 := b.NewValue0(v.Pos, OpRISCV64MOVBload, typ.Int8)
2306 v4.AddArg2(src, mem)
2307 v3.AddArg3(dst, v4, mem)
2308 v1.AddArg3(dst, v2, v3)
2309 v.AddArg3(dst, v0, v1)
2312 // match: (Move [6] {t} dst src mem)
2313 // cond: t.Alignment()%2 == 0
2314 // result: (MOVHstore [4] dst (MOVHload [4] src mem) (MOVHstore [2] dst (MOVHload [2] src mem) (MOVHstore dst (MOVHload src mem) mem)))
2316 if auxIntToInt64(v.AuxInt) != 6 {
2319 t := auxToType(v.Aux)
2323 if !(t.Alignment()%2 == 0) {
2326 v.reset(OpRISCV64MOVHstore)
2327 v.AuxInt = int32ToAuxInt(4)
2328 v0 := b.NewValue0(v.Pos, OpRISCV64MOVHload, typ.Int16)
2329 v0.AuxInt = int32ToAuxInt(4)
2330 v0.AddArg2(src, mem)
2331 v1 := b.NewValue0(v.Pos, OpRISCV64MOVHstore, types.TypeMem)
2332 v1.AuxInt = int32ToAuxInt(2)
2333 v2 := b.NewValue0(v.Pos, OpRISCV64MOVHload, typ.Int16)
2334 v2.AuxInt = int32ToAuxInt(2)
2335 v2.AddArg2(src, mem)
2336 v3 := b.NewValue0(v.Pos, OpRISCV64MOVHstore, types.TypeMem)
2337 v4 := b.NewValue0(v.Pos, OpRISCV64MOVHload, typ.Int16)
2338 v4.AddArg2(src, mem)
2339 v3.AddArg3(dst, v4, mem)
2340 v1.AddArg3(dst, v2, v3)
2341 v.AddArg3(dst, v0, v1)
2344 // match: (Move [12] {t} dst src mem)
2345 // cond: t.Alignment()%4 == 0
2346 // result: (MOVWstore [8] dst (MOVWload [8] src mem) (MOVWstore [4] dst (MOVWload [4] src mem) (MOVWstore dst (MOVWload src mem) mem)))
2348 if auxIntToInt64(v.AuxInt) != 12 {
2351 t := auxToType(v.Aux)
2355 if !(t.Alignment()%4 == 0) {
2358 v.reset(OpRISCV64MOVWstore)
2359 v.AuxInt = int32ToAuxInt(8)
2360 v0 := b.NewValue0(v.Pos, OpRISCV64MOVWload, typ.Int32)
2361 v0.AuxInt = int32ToAuxInt(8)
2362 v0.AddArg2(src, mem)
2363 v1 := b.NewValue0(v.Pos, OpRISCV64MOVWstore, types.TypeMem)
2364 v1.AuxInt = int32ToAuxInt(4)
2365 v2 := b.NewValue0(v.Pos, OpRISCV64MOVWload, typ.Int32)
2366 v2.AuxInt = int32ToAuxInt(4)
2367 v2.AddArg2(src, mem)
2368 v3 := b.NewValue0(v.Pos, OpRISCV64MOVWstore, types.TypeMem)
2369 v4 := b.NewValue0(v.Pos, OpRISCV64MOVWload, typ.Int32)
2370 v4.AddArg2(src, mem)
2371 v3.AddArg3(dst, v4, mem)
2372 v1.AddArg3(dst, v2, v3)
2373 v.AddArg3(dst, v0, v1)
2376 // match: (Move [16] {t} dst src mem)
2377 // cond: t.Alignment()%8 == 0
2378 // result: (MOVDstore [8] dst (MOVDload [8] src mem) (MOVDstore dst (MOVDload src mem) mem))
2380 if auxIntToInt64(v.AuxInt) != 16 {
2383 t := auxToType(v.Aux)
2387 if !(t.Alignment()%8 == 0) {
2390 v.reset(OpRISCV64MOVDstore)
2391 v.AuxInt = int32ToAuxInt(8)
2392 v0 := b.NewValue0(v.Pos, OpRISCV64MOVDload, typ.Int64)
2393 v0.AuxInt = int32ToAuxInt(8)
2394 v0.AddArg2(src, mem)
2395 v1 := b.NewValue0(v.Pos, OpRISCV64MOVDstore, types.TypeMem)
2396 v2 := b.NewValue0(v.Pos, OpRISCV64MOVDload, typ.Int64)
2397 v2.AddArg2(src, mem)
2398 v1.AddArg3(dst, v2, mem)
2399 v.AddArg3(dst, v0, v1)
2402 // match: (Move [24] {t} dst src mem)
2403 // cond: t.Alignment()%8 == 0
2404 // result: (MOVDstore [16] dst (MOVDload [16] src mem) (MOVDstore [8] dst (MOVDload [8] src mem) (MOVDstore dst (MOVDload src mem) mem)))
2406 if auxIntToInt64(v.AuxInt) != 24 {
2409 t := auxToType(v.Aux)
2413 if !(t.Alignment()%8 == 0) {
2416 v.reset(OpRISCV64MOVDstore)
2417 v.AuxInt = int32ToAuxInt(16)
2418 v0 := b.NewValue0(v.Pos, OpRISCV64MOVDload, typ.Int64)
2419 v0.AuxInt = int32ToAuxInt(16)
2420 v0.AddArg2(src, mem)
2421 v1 := b.NewValue0(v.Pos, OpRISCV64MOVDstore, types.TypeMem)
2422 v1.AuxInt = int32ToAuxInt(8)
2423 v2 := b.NewValue0(v.Pos, OpRISCV64MOVDload, typ.Int64)
2424 v2.AuxInt = int32ToAuxInt(8)
2425 v2.AddArg2(src, mem)
2426 v3 := b.NewValue0(v.Pos, OpRISCV64MOVDstore, types.TypeMem)
2427 v4 := b.NewValue0(v.Pos, OpRISCV64MOVDload, typ.Int64)
2428 v4.AddArg2(src, mem)
2429 v3.AddArg3(dst, v4, mem)
2430 v1.AddArg3(dst, v2, v3)
2431 v.AddArg3(dst, v0, v1)
2434 // match: (Move [32] {t} dst src mem)
2435 // cond: t.Alignment()%8 == 0
2436 // result: (MOVDstore [24] dst (MOVDload [24] src mem) (MOVDstore [16] dst (MOVDload [16] src mem) (MOVDstore [8] dst (MOVDload [8] src mem) (MOVDstore dst (MOVDload src mem) mem))))
2438 if auxIntToInt64(v.AuxInt) != 32 {
2441 t := auxToType(v.Aux)
2445 if !(t.Alignment()%8 == 0) {
2448 v.reset(OpRISCV64MOVDstore)
2449 v.AuxInt = int32ToAuxInt(24)
2450 v0 := b.NewValue0(v.Pos, OpRISCV64MOVDload, typ.Int64)
2451 v0.AuxInt = int32ToAuxInt(24)
2452 v0.AddArg2(src, mem)
2453 v1 := b.NewValue0(v.Pos, OpRISCV64MOVDstore, types.TypeMem)
2454 v1.AuxInt = int32ToAuxInt(16)
2455 v2 := b.NewValue0(v.Pos, OpRISCV64MOVDload, typ.Int64)
2456 v2.AuxInt = int32ToAuxInt(16)
2457 v2.AddArg2(src, mem)
2458 v3 := b.NewValue0(v.Pos, OpRISCV64MOVDstore, types.TypeMem)
2459 v3.AuxInt = int32ToAuxInt(8)
2460 v4 := b.NewValue0(v.Pos, OpRISCV64MOVDload, typ.Int64)
2461 v4.AuxInt = int32ToAuxInt(8)
2462 v4.AddArg2(src, mem)
2463 v5 := b.NewValue0(v.Pos, OpRISCV64MOVDstore, types.TypeMem)
2464 v6 := b.NewValue0(v.Pos, OpRISCV64MOVDload, typ.Int64)
2465 v6.AddArg2(src, mem)
2466 v5.AddArg3(dst, v6, mem)
2467 v3.AddArg3(dst, v4, v5)
2468 v1.AddArg3(dst, v2, v3)
2469 v.AddArg3(dst, v0, v1)
2472 // match: (Move [s] {t} dst src mem)
2473 // cond: s%8 == 0 && s <= 8*128 && t.Alignment()%8 == 0 && !config.noDuffDevice && logLargeCopy(v, s)
2474 // result: (DUFFCOPY [16 * (128 - s/8)] dst src mem)
2476 s := auxIntToInt64(v.AuxInt)
2477 t := auxToType(v.Aux)
2481 if !(s%8 == 0 && s <= 8*128 && t.Alignment()%8 == 0 && !config.noDuffDevice && logLargeCopy(v, s)) {
2484 v.reset(OpRISCV64DUFFCOPY)
2485 v.AuxInt = int64ToAuxInt(16 * (128 - s/8))
2486 v.AddArg3(dst, src, mem)
2489 // match: (Move [s] {t} dst src mem)
2490 // cond: (s <= 16 || logLargeCopy(v, s))
2491 // result: (LoweredMove [t.Alignment()] dst src (ADDI <src.Type> [s-moveSize(t.Alignment(), config)] src) mem)
2493 s := auxIntToInt64(v.AuxInt)
2494 t := auxToType(v.Aux)
2498 if !(s <= 16 || logLargeCopy(v, s)) {
2501 v.reset(OpRISCV64LoweredMove)
2502 v.AuxInt = int64ToAuxInt(t.Alignment())
2503 v0 := b.NewValue0(v.Pos, OpRISCV64ADDI, src.Type)
2504 v0.AuxInt = int64ToAuxInt(s - moveSize(t.Alignment(), config))
2506 v.AddArg4(dst, src, v0, mem)
2511 func rewriteValueRISCV64_OpMul16(v *Value) bool {
2515 typ := &b.Func.Config.Types
2516 // match: (Mul16 x y)
2517 // result: (MULW (SignExt16to32 x) (SignExt16to32 y))
2521 v.reset(OpRISCV64MULW)
2522 v0 := b.NewValue0(v.Pos, OpSignExt16to32, typ.Int32)
2524 v1 := b.NewValue0(v.Pos, OpSignExt16to32, typ.Int32)
2530 func rewriteValueRISCV64_OpMul8(v *Value) bool {
2534 typ := &b.Func.Config.Types
2535 // match: (Mul8 x y)
2536 // result: (MULW (SignExt8to32 x) (SignExt8to32 y))
2540 v.reset(OpRISCV64MULW)
2541 v0 := b.NewValue0(v.Pos, OpSignExt8to32, typ.Int32)
2543 v1 := b.NewValue0(v.Pos, OpSignExt8to32, typ.Int32)
2549 func rewriteValueRISCV64_OpNeq16(v *Value) bool {
2553 typ := &b.Func.Config.Types
2554 // match: (Neq16 x y)
2555 // result: (SNEZ (SUB <x.Type> (ZeroExt16to64 x) (ZeroExt16to64 y)))
2559 v.reset(OpRISCV64SNEZ)
2560 v0 := b.NewValue0(v.Pos, OpRISCV64SUB, x.Type)
2561 v1 := b.NewValue0(v.Pos, OpZeroExt16to64, typ.UInt64)
2563 v2 := b.NewValue0(v.Pos, OpZeroExt16to64, typ.UInt64)
2570 func rewriteValueRISCV64_OpNeq32(v *Value) bool {
2574 typ := &b.Func.Config.Types
2575 // match: (Neq32 x y)
2576 // result: (SNEZ (SUB <x.Type> (ZeroExt32to64 x) (ZeroExt32to64 y)))
2580 v.reset(OpRISCV64SNEZ)
2581 v0 := b.NewValue0(v.Pos, OpRISCV64SUB, x.Type)
2582 v1 := b.NewValue0(v.Pos, OpZeroExt32to64, typ.UInt64)
2584 v2 := b.NewValue0(v.Pos, OpZeroExt32to64, typ.UInt64)
2591 func rewriteValueRISCV64_OpNeq64(v *Value) bool {
2595 // match: (Neq64 x y)
2596 // result: (SNEZ (SUB <x.Type> x y))
2600 v.reset(OpRISCV64SNEZ)
2601 v0 := b.NewValue0(v.Pos, OpRISCV64SUB, x.Type)
2607 func rewriteValueRISCV64_OpNeq8(v *Value) bool {
2611 typ := &b.Func.Config.Types
2612 // match: (Neq8 x y)
2613 // result: (SNEZ (SUB <x.Type> (ZeroExt8to64 x) (ZeroExt8to64 y)))
2617 v.reset(OpRISCV64SNEZ)
2618 v0 := b.NewValue0(v.Pos, OpRISCV64SUB, x.Type)
2619 v1 := b.NewValue0(v.Pos, OpZeroExt8to64, typ.UInt64)
2621 v2 := b.NewValue0(v.Pos, OpZeroExt8to64, typ.UInt64)
2628 func rewriteValueRISCV64_OpNeqPtr(v *Value) bool {
2632 // match: (NeqPtr x y)
2633 // result: (SNEZ (SUB <x.Type> x y))
2637 v.reset(OpRISCV64SNEZ)
2638 v0 := b.NewValue0(v.Pos, OpRISCV64SUB, x.Type)
2644 func rewriteValueRISCV64_OpOffPtr(v *Value) bool {
2647 typ := &b.Func.Config.Types
2648 // match: (OffPtr [off] ptr:(SP))
2649 // cond: is32Bit(off)
2650 // result: (MOVaddr [int32(off)] ptr)
2652 off := auxIntToInt64(v.AuxInt)
2654 if ptr.Op != OpSP || !(is32Bit(off)) {
2657 v.reset(OpRISCV64MOVaddr)
2658 v.AuxInt = int32ToAuxInt(int32(off))
2662 // match: (OffPtr [off] ptr)
2663 // cond: is32Bit(off)
2664 // result: (ADDI [off] ptr)
2666 off := auxIntToInt64(v.AuxInt)
2668 if !(is32Bit(off)) {
2671 v.reset(OpRISCV64ADDI)
2672 v.AuxInt = int64ToAuxInt(off)
2676 // match: (OffPtr [off] ptr)
2677 // result: (ADD (MOVDconst [off]) ptr)
2679 off := auxIntToInt64(v.AuxInt)
2681 v.reset(OpRISCV64ADD)
2682 v0 := b.NewValue0(v.Pos, OpRISCV64MOVDconst, typ.UInt64)
2683 v0.AuxInt = int64ToAuxInt(off)
2688 func rewriteValueRISCV64_OpPanicBounds(v *Value) bool {
2692 // match: (PanicBounds [kind] x y mem)
2693 // cond: boundsABI(kind) == 0
2694 // result: (LoweredPanicBoundsA [kind] x y mem)
2696 kind := auxIntToInt64(v.AuxInt)
2700 if !(boundsABI(kind) == 0) {
2703 v.reset(OpRISCV64LoweredPanicBoundsA)
2704 v.AuxInt = int64ToAuxInt(kind)
2705 v.AddArg3(x, y, mem)
2708 // match: (PanicBounds [kind] x y mem)
2709 // cond: boundsABI(kind) == 1
2710 // result: (LoweredPanicBoundsB [kind] x y mem)
2712 kind := auxIntToInt64(v.AuxInt)
2716 if !(boundsABI(kind) == 1) {
2719 v.reset(OpRISCV64LoweredPanicBoundsB)
2720 v.AuxInt = int64ToAuxInt(kind)
2721 v.AddArg3(x, y, mem)
2724 // match: (PanicBounds [kind] x y mem)
2725 // cond: boundsABI(kind) == 2
2726 // result: (LoweredPanicBoundsC [kind] x y mem)
2728 kind := auxIntToInt64(v.AuxInt)
2732 if !(boundsABI(kind) == 2) {
2735 v.reset(OpRISCV64LoweredPanicBoundsC)
2736 v.AuxInt = int64ToAuxInt(kind)
2737 v.AddArg3(x, y, mem)
2742 func rewriteValueRISCV64_OpRISCV64ADD(v *Value) bool {
2745 // match: (ADD (MOVDconst [val]) x)
2746 // cond: is32Bit(val)
2747 // result: (ADDI [val] x)
2749 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
2750 if v_0.Op != OpRISCV64MOVDconst {
2753 val := auxIntToInt64(v_0.AuxInt)
2755 if !(is32Bit(val)) {
2758 v.reset(OpRISCV64ADDI)
2759 v.AuxInt = int64ToAuxInt(val)
2767 func rewriteValueRISCV64_OpRISCV64ADDI(v *Value) bool {
2769 // match: (ADDI [c] (MOVaddr [d] {s} x))
2770 // cond: is32Bit(c+int64(d))
2771 // result: (MOVaddr [int32(c)+d] {s} x)
2773 c := auxIntToInt64(v.AuxInt)
2774 if v_0.Op != OpRISCV64MOVaddr {
2777 d := auxIntToInt32(v_0.AuxInt)
2778 s := auxToSym(v_0.Aux)
2780 if !(is32Bit(c + int64(d))) {
2783 v.reset(OpRISCV64MOVaddr)
2784 v.AuxInt = int32ToAuxInt(int32(c) + d)
2789 // match: (ADDI [0] x)
2792 if auxIntToInt64(v.AuxInt) != 0 {
2801 func rewriteValueRISCV64_OpRISCV64AND(v *Value) bool {
2804 // match: (AND (MOVDconst [val]) x)
2805 // cond: is32Bit(val)
2806 // result: (ANDI [val] x)
2808 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
2809 if v_0.Op != OpRISCV64MOVDconst {
2812 val := auxIntToInt64(v_0.AuxInt)
2814 if !(is32Bit(val)) {
2817 v.reset(OpRISCV64ANDI)
2818 v.AuxInt = int64ToAuxInt(val)
2826 func rewriteValueRISCV64_OpRISCV64MOVBUload(v *Value) bool {
2829 // match: (MOVBUload [off1] {sym1} (MOVaddr [off2] {sym2} base) mem)
2830 // cond: is32Bit(int64(off1)+int64(off2)) && canMergeSym(sym1, sym2)
2831 // result: (MOVBUload [off1+off2] {mergeSym(sym1,sym2)} base mem)
2833 off1 := auxIntToInt32(v.AuxInt)
2834 sym1 := auxToSym(v.Aux)
2835 if v_0.Op != OpRISCV64MOVaddr {
2838 off2 := auxIntToInt32(v_0.AuxInt)
2839 sym2 := auxToSym(v_0.Aux)
2842 if !(is32Bit(int64(off1)+int64(off2)) && canMergeSym(sym1, sym2)) {
2845 v.reset(OpRISCV64MOVBUload)
2846 v.AuxInt = int32ToAuxInt(off1 + off2)
2847 v.Aux = symToAux(mergeSym(sym1, sym2))
2848 v.AddArg2(base, mem)
2851 // match: (MOVBUload [off1] {sym} (ADDI [off2] base) mem)
2852 // cond: is32Bit(int64(off1)+off2)
2853 // result: (MOVBUload [off1+int32(off2)] {sym} base mem)
2855 off1 := auxIntToInt32(v.AuxInt)
2856 sym := auxToSym(v.Aux)
2857 if v_0.Op != OpRISCV64ADDI {
2860 off2 := auxIntToInt64(v_0.AuxInt)
2863 if !(is32Bit(int64(off1) + off2)) {
2866 v.reset(OpRISCV64MOVBUload)
2867 v.AuxInt = int32ToAuxInt(off1 + int32(off2))
2868 v.Aux = symToAux(sym)
2869 v.AddArg2(base, mem)
2874 func rewriteValueRISCV64_OpRISCV64MOVBUreg(v *Value) bool {
2877 // match: (MOVBUreg (MOVDconst [c]))
2878 // result: (MOVDconst [int64(uint8(c))])
2880 if v_0.Op != OpRISCV64MOVDconst {
2883 c := auxIntToInt64(v_0.AuxInt)
2884 v.reset(OpRISCV64MOVDconst)
2885 v.AuxInt = int64ToAuxInt(int64(uint8(c)))
2888 // match: (MOVBUreg x:(MOVBUload _ _))
2889 // result: (MOVDreg x)
2892 if x.Op != OpRISCV64MOVBUload {
2895 v.reset(OpRISCV64MOVDreg)
2899 // match: (MOVBUreg x:(MOVBUreg _))
2900 // result: (MOVDreg x)
2903 if x.Op != OpRISCV64MOVBUreg {
2906 v.reset(OpRISCV64MOVDreg)
2910 // match: (MOVBUreg <t> x:(MOVBload [off] {sym} ptr mem))
2911 // cond: x.Uses == 1 && clobber(x)
2912 // result: @x.Block (MOVBUload <t> [off] {sym} ptr mem)
2916 if x.Op != OpRISCV64MOVBload {
2919 off := auxIntToInt32(x.AuxInt)
2920 sym := auxToSym(x.Aux)
2923 if !(x.Uses == 1 && clobber(x)) {
2927 v0 := b.NewValue0(x.Pos, OpRISCV64MOVBUload, t)
2929 v0.AuxInt = int32ToAuxInt(off)
2930 v0.Aux = symToAux(sym)
2931 v0.AddArg2(ptr, mem)
2936 func rewriteValueRISCV64_OpRISCV64MOVBload(v *Value) bool {
2939 // match: (MOVBload [off1] {sym1} (MOVaddr [off2] {sym2} base) mem)
2940 // cond: is32Bit(int64(off1)+int64(off2)) && canMergeSym(sym1, sym2)
2941 // result: (MOVBload [off1+off2] {mergeSym(sym1,sym2)} base mem)
2943 off1 := auxIntToInt32(v.AuxInt)
2944 sym1 := auxToSym(v.Aux)
2945 if v_0.Op != OpRISCV64MOVaddr {
2948 off2 := auxIntToInt32(v_0.AuxInt)
2949 sym2 := auxToSym(v_0.Aux)
2952 if !(is32Bit(int64(off1)+int64(off2)) && canMergeSym(sym1, sym2)) {
2955 v.reset(OpRISCV64MOVBload)
2956 v.AuxInt = int32ToAuxInt(off1 + off2)
2957 v.Aux = symToAux(mergeSym(sym1, sym2))
2958 v.AddArg2(base, mem)
2961 // match: (MOVBload [off1] {sym} (ADDI [off2] base) mem)
2962 // cond: is32Bit(int64(off1)+off2)
2963 // result: (MOVBload [off1+int32(off2)] {sym} base mem)
2965 off1 := auxIntToInt32(v.AuxInt)
2966 sym := auxToSym(v.Aux)
2967 if v_0.Op != OpRISCV64ADDI {
2970 off2 := auxIntToInt64(v_0.AuxInt)
2973 if !(is32Bit(int64(off1) + off2)) {
2976 v.reset(OpRISCV64MOVBload)
2977 v.AuxInt = int32ToAuxInt(off1 + int32(off2))
2978 v.Aux = symToAux(sym)
2979 v.AddArg2(base, mem)
2984 func rewriteValueRISCV64_OpRISCV64MOVBreg(v *Value) bool {
2987 // match: (MOVBreg (MOVDconst [c]))
2988 // result: (MOVDconst [int64(int8(c))])
2990 if v_0.Op != OpRISCV64MOVDconst {
2993 c := auxIntToInt64(v_0.AuxInt)
2994 v.reset(OpRISCV64MOVDconst)
2995 v.AuxInt = int64ToAuxInt(int64(int8(c)))
2998 // match: (MOVBreg x:(MOVBload _ _))
2999 // result: (MOVDreg x)
3002 if x.Op != OpRISCV64MOVBload {
3005 v.reset(OpRISCV64MOVDreg)
3009 // match: (MOVBreg x:(MOVBreg _))
3010 // result: (MOVDreg x)
3013 if x.Op != OpRISCV64MOVBreg {
3016 v.reset(OpRISCV64MOVDreg)
3020 // match: (MOVBreg <t> x:(MOVBUload [off] {sym} ptr mem))
3021 // cond: x.Uses == 1 && clobber(x)
3022 // result: @x.Block (MOVBload <t> [off] {sym} ptr mem)
3026 if x.Op != OpRISCV64MOVBUload {
3029 off := auxIntToInt32(x.AuxInt)
3030 sym := auxToSym(x.Aux)
3033 if !(x.Uses == 1 && clobber(x)) {
3037 v0 := b.NewValue0(x.Pos, OpRISCV64MOVBload, t)
3039 v0.AuxInt = int32ToAuxInt(off)
3040 v0.Aux = symToAux(sym)
3041 v0.AddArg2(ptr, mem)
3046 func rewriteValueRISCV64_OpRISCV64MOVBstore(v *Value) bool {
3050 // match: (MOVBstore [off1] {sym1} (MOVaddr [off2] {sym2} base) val mem)
3051 // cond: is32Bit(int64(off1)+int64(off2)) && canMergeSym(sym1, sym2)
3052 // result: (MOVBstore [off1+off2] {mergeSym(sym1,sym2)} base val mem)
3054 off1 := auxIntToInt32(v.AuxInt)
3055 sym1 := auxToSym(v.Aux)
3056 if v_0.Op != OpRISCV64MOVaddr {
3059 off2 := auxIntToInt32(v_0.AuxInt)
3060 sym2 := auxToSym(v_0.Aux)
3064 if !(is32Bit(int64(off1)+int64(off2)) && canMergeSym(sym1, sym2)) {
3067 v.reset(OpRISCV64MOVBstore)
3068 v.AuxInt = int32ToAuxInt(off1 + off2)
3069 v.Aux = symToAux(mergeSym(sym1, sym2))
3070 v.AddArg3(base, val, mem)
3073 // match: (MOVBstore [off1] {sym} (ADDI [off2] base) val mem)
3074 // cond: is32Bit(int64(off1)+off2)
3075 // result: (MOVBstore [off1+int32(off2)] {sym} base val mem)
3077 off1 := auxIntToInt32(v.AuxInt)
3078 sym := auxToSym(v.Aux)
3079 if v_0.Op != OpRISCV64ADDI {
3082 off2 := auxIntToInt64(v_0.AuxInt)
3086 if !(is32Bit(int64(off1) + off2)) {
3089 v.reset(OpRISCV64MOVBstore)
3090 v.AuxInt = int32ToAuxInt(off1 + int32(off2))
3091 v.Aux = symToAux(sym)
3092 v.AddArg3(base, val, mem)
3095 // match: (MOVBstore [off] {sym} ptr (MOVDconst [0]) mem)
3096 // result: (MOVBstorezero [off] {sym} ptr mem)
3098 off := auxIntToInt32(v.AuxInt)
3099 sym := auxToSym(v.Aux)
3101 if v_1.Op != OpRISCV64MOVDconst || auxIntToInt64(v_1.AuxInt) != 0 {
3105 v.reset(OpRISCV64MOVBstorezero)
3106 v.AuxInt = int32ToAuxInt(off)
3107 v.Aux = symToAux(sym)
3111 // match: (MOVBstore [off] {sym} ptr (MOVBreg x) mem)
3112 // result: (MOVBstore [off] {sym} ptr x mem)
3114 off := auxIntToInt32(v.AuxInt)
3115 sym := auxToSym(v.Aux)
3117 if v_1.Op != OpRISCV64MOVBreg {
3122 v.reset(OpRISCV64MOVBstore)
3123 v.AuxInt = int32ToAuxInt(off)
3124 v.Aux = symToAux(sym)
3125 v.AddArg3(ptr, x, mem)
3128 // match: (MOVBstore [off] {sym} ptr (MOVHreg x) mem)
3129 // result: (MOVBstore [off] {sym} ptr x mem)
3131 off := auxIntToInt32(v.AuxInt)
3132 sym := auxToSym(v.Aux)
3134 if v_1.Op != OpRISCV64MOVHreg {
3139 v.reset(OpRISCV64MOVBstore)
3140 v.AuxInt = int32ToAuxInt(off)
3141 v.Aux = symToAux(sym)
3142 v.AddArg3(ptr, x, mem)
3145 // match: (MOVBstore [off] {sym} ptr (MOVWreg x) mem)
3146 // result: (MOVBstore [off] {sym} ptr x mem)
3148 off := auxIntToInt32(v.AuxInt)
3149 sym := auxToSym(v.Aux)
3151 if v_1.Op != OpRISCV64MOVWreg {
3156 v.reset(OpRISCV64MOVBstore)
3157 v.AuxInt = int32ToAuxInt(off)
3158 v.Aux = symToAux(sym)
3159 v.AddArg3(ptr, x, mem)
3162 // match: (MOVBstore [off] {sym} ptr (MOVBUreg x) mem)
3163 // result: (MOVBstore [off] {sym} ptr x mem)
3165 off := auxIntToInt32(v.AuxInt)
3166 sym := auxToSym(v.Aux)
3168 if v_1.Op != OpRISCV64MOVBUreg {
3173 v.reset(OpRISCV64MOVBstore)
3174 v.AuxInt = int32ToAuxInt(off)
3175 v.Aux = symToAux(sym)
3176 v.AddArg3(ptr, x, mem)
3179 // match: (MOVBstore [off] {sym} ptr (MOVHUreg x) mem)
3180 // result: (MOVBstore [off] {sym} ptr x mem)
3182 off := auxIntToInt32(v.AuxInt)
3183 sym := auxToSym(v.Aux)
3185 if v_1.Op != OpRISCV64MOVHUreg {
3190 v.reset(OpRISCV64MOVBstore)
3191 v.AuxInt = int32ToAuxInt(off)
3192 v.Aux = symToAux(sym)
3193 v.AddArg3(ptr, x, mem)
3196 // match: (MOVBstore [off] {sym} ptr (MOVWUreg x) mem)
3197 // result: (MOVBstore [off] {sym} ptr x mem)
3199 off := auxIntToInt32(v.AuxInt)
3200 sym := auxToSym(v.Aux)
3202 if v_1.Op != OpRISCV64MOVWUreg {
3207 v.reset(OpRISCV64MOVBstore)
3208 v.AuxInt = int32ToAuxInt(off)
3209 v.Aux = symToAux(sym)
3210 v.AddArg3(ptr, x, mem)
3215 func rewriteValueRISCV64_OpRISCV64MOVBstorezero(v *Value) bool {
3218 // match: (MOVBstorezero [off1] {sym1} (MOVaddr [off2] {sym2} ptr) mem)
3219 // cond: canMergeSym(sym1,sym2) && is32Bit(int64(off1)+int64(off2))
3220 // result: (MOVBstorezero [off1+off2] {mergeSym(sym1,sym2)} ptr mem)
3222 off1 := auxIntToInt32(v.AuxInt)
3223 sym1 := auxToSym(v.Aux)
3224 if v_0.Op != OpRISCV64MOVaddr {
3227 off2 := auxIntToInt32(v_0.AuxInt)
3228 sym2 := auxToSym(v_0.Aux)
3231 if !(canMergeSym(sym1, sym2) && is32Bit(int64(off1)+int64(off2))) {
3234 v.reset(OpRISCV64MOVBstorezero)
3235 v.AuxInt = int32ToAuxInt(off1 + off2)
3236 v.Aux = symToAux(mergeSym(sym1, sym2))
3240 // match: (MOVBstorezero [off1] {sym} (ADDI [off2] ptr) mem)
3241 // cond: is32Bit(int64(off1)+off2)
3242 // result: (MOVBstorezero [off1+int32(off2)] {sym} ptr mem)
3244 off1 := auxIntToInt32(v.AuxInt)
3245 sym := auxToSym(v.Aux)
3246 if v_0.Op != OpRISCV64ADDI {
3249 off2 := auxIntToInt64(v_0.AuxInt)
3252 if !(is32Bit(int64(off1) + off2)) {
3255 v.reset(OpRISCV64MOVBstorezero)
3256 v.AuxInt = int32ToAuxInt(off1 + int32(off2))
3257 v.Aux = symToAux(sym)
3263 func rewriteValueRISCV64_OpRISCV64MOVDload(v *Value) bool {
3266 // match: (MOVDload [off1] {sym1} (MOVaddr [off2] {sym2} base) mem)
3267 // cond: is32Bit(int64(off1)+int64(off2)) && canMergeSym(sym1, sym2)
3268 // result: (MOVDload [off1+off2] {mergeSym(sym1,sym2)} base mem)
3270 off1 := auxIntToInt32(v.AuxInt)
3271 sym1 := auxToSym(v.Aux)
3272 if v_0.Op != OpRISCV64MOVaddr {
3275 off2 := auxIntToInt32(v_0.AuxInt)
3276 sym2 := auxToSym(v_0.Aux)
3279 if !(is32Bit(int64(off1)+int64(off2)) && canMergeSym(sym1, sym2)) {
3282 v.reset(OpRISCV64MOVDload)
3283 v.AuxInt = int32ToAuxInt(off1 + off2)
3284 v.Aux = symToAux(mergeSym(sym1, sym2))
3285 v.AddArg2(base, mem)
3288 // match: (MOVDload [off1] {sym} (ADDI [off2] base) mem)
3289 // cond: is32Bit(int64(off1)+off2)
3290 // result: (MOVDload [off1+int32(off2)] {sym} base mem)
3292 off1 := auxIntToInt32(v.AuxInt)
3293 sym := auxToSym(v.Aux)
3294 if v_0.Op != OpRISCV64ADDI {
3297 off2 := auxIntToInt64(v_0.AuxInt)
3300 if !(is32Bit(int64(off1) + off2)) {
3303 v.reset(OpRISCV64MOVDload)
3304 v.AuxInt = int32ToAuxInt(off1 + int32(off2))
3305 v.Aux = symToAux(sym)
3306 v.AddArg2(base, mem)
3311 func rewriteValueRISCV64_OpRISCV64MOVDnop(v *Value) bool {
3313 // match: (MOVDnop (MOVDconst [c]))
3314 // result: (MOVDconst [c])
3316 if v_0.Op != OpRISCV64MOVDconst {
3319 c := auxIntToInt64(v_0.AuxInt)
3320 v.reset(OpRISCV64MOVDconst)
3321 v.AuxInt = int64ToAuxInt(c)
3326 func rewriteValueRISCV64_OpRISCV64MOVDreg(v *Value) bool {
3328 // match: (MOVDreg x)
3329 // cond: x.Uses == 1
3330 // result: (MOVDnop x)
3336 v.reset(OpRISCV64MOVDnop)
3342 func rewriteValueRISCV64_OpRISCV64MOVDstore(v *Value) bool {
3346 // match: (MOVDstore [off1] {sym1} (MOVaddr [off2] {sym2} base) val mem)
3347 // cond: is32Bit(int64(off1)+int64(off2)) && canMergeSym(sym1, sym2)
3348 // result: (MOVDstore [off1+off2] {mergeSym(sym1,sym2)} base val mem)
3350 off1 := auxIntToInt32(v.AuxInt)
3351 sym1 := auxToSym(v.Aux)
3352 if v_0.Op != OpRISCV64MOVaddr {
3355 off2 := auxIntToInt32(v_0.AuxInt)
3356 sym2 := auxToSym(v_0.Aux)
3360 if !(is32Bit(int64(off1)+int64(off2)) && canMergeSym(sym1, sym2)) {
3363 v.reset(OpRISCV64MOVDstore)
3364 v.AuxInt = int32ToAuxInt(off1 + off2)
3365 v.Aux = symToAux(mergeSym(sym1, sym2))
3366 v.AddArg3(base, val, mem)
3369 // match: (MOVDstore [off1] {sym} (ADDI [off2] base) val mem)
3370 // cond: is32Bit(int64(off1)+off2)
3371 // result: (MOVDstore [off1+int32(off2)] {sym} base val mem)
3373 off1 := auxIntToInt32(v.AuxInt)
3374 sym := auxToSym(v.Aux)
3375 if v_0.Op != OpRISCV64ADDI {
3378 off2 := auxIntToInt64(v_0.AuxInt)
3382 if !(is32Bit(int64(off1) + off2)) {
3385 v.reset(OpRISCV64MOVDstore)
3386 v.AuxInt = int32ToAuxInt(off1 + int32(off2))
3387 v.Aux = symToAux(sym)
3388 v.AddArg3(base, val, mem)
3391 // match: (MOVDstore [off] {sym} ptr (MOVDconst [0]) mem)
3392 // result: (MOVDstorezero [off] {sym} ptr mem)
3394 off := auxIntToInt32(v.AuxInt)
3395 sym := auxToSym(v.Aux)
3397 if v_1.Op != OpRISCV64MOVDconst || auxIntToInt64(v_1.AuxInt) != 0 {
3401 v.reset(OpRISCV64MOVDstorezero)
3402 v.AuxInt = int32ToAuxInt(off)
3403 v.Aux = symToAux(sym)
3409 func rewriteValueRISCV64_OpRISCV64MOVDstorezero(v *Value) bool {
3412 // match: (MOVDstorezero [off1] {sym1} (MOVaddr [off2] {sym2} ptr) mem)
3413 // cond: canMergeSym(sym1,sym2) && is32Bit(int64(off1)+int64(off2))
3414 // result: (MOVDstorezero [off1+off2] {mergeSym(sym1,sym2)} ptr mem)
3416 off1 := auxIntToInt32(v.AuxInt)
3417 sym1 := auxToSym(v.Aux)
3418 if v_0.Op != OpRISCV64MOVaddr {
3421 off2 := auxIntToInt32(v_0.AuxInt)
3422 sym2 := auxToSym(v_0.Aux)
3425 if !(canMergeSym(sym1, sym2) && is32Bit(int64(off1)+int64(off2))) {
3428 v.reset(OpRISCV64MOVDstorezero)
3429 v.AuxInt = int32ToAuxInt(off1 + off2)
3430 v.Aux = symToAux(mergeSym(sym1, sym2))
3434 // match: (MOVDstorezero [off1] {sym} (ADDI [off2] ptr) mem)
3435 // cond: is32Bit(int64(off1)+off2)
3436 // result: (MOVDstorezero [off1+int32(off2)] {sym} ptr mem)
3438 off1 := auxIntToInt32(v.AuxInt)
3439 sym := auxToSym(v.Aux)
3440 if v_0.Op != OpRISCV64ADDI {
3443 off2 := auxIntToInt64(v_0.AuxInt)
3446 if !(is32Bit(int64(off1) + off2)) {
3449 v.reset(OpRISCV64MOVDstorezero)
3450 v.AuxInt = int32ToAuxInt(off1 + int32(off2))
3451 v.Aux = symToAux(sym)
3457 func rewriteValueRISCV64_OpRISCV64MOVHUload(v *Value) bool {
3460 // match: (MOVHUload [off1] {sym1} (MOVaddr [off2] {sym2} base) mem)
3461 // cond: is32Bit(int64(off1)+int64(off2)) && canMergeSym(sym1, sym2)
3462 // result: (MOVHUload [off1+off2] {mergeSym(sym1,sym2)} base mem)
3464 off1 := auxIntToInt32(v.AuxInt)
3465 sym1 := auxToSym(v.Aux)
3466 if v_0.Op != OpRISCV64MOVaddr {
3469 off2 := auxIntToInt32(v_0.AuxInt)
3470 sym2 := auxToSym(v_0.Aux)
3473 if !(is32Bit(int64(off1)+int64(off2)) && canMergeSym(sym1, sym2)) {
3476 v.reset(OpRISCV64MOVHUload)
3477 v.AuxInt = int32ToAuxInt(off1 + off2)
3478 v.Aux = symToAux(mergeSym(sym1, sym2))
3479 v.AddArg2(base, mem)
3482 // match: (MOVHUload [off1] {sym} (ADDI [off2] base) mem)
3483 // cond: is32Bit(int64(off1)+off2)
3484 // result: (MOVHUload [off1+int32(off2)] {sym} base mem)
3486 off1 := auxIntToInt32(v.AuxInt)
3487 sym := auxToSym(v.Aux)
3488 if v_0.Op != OpRISCV64ADDI {
3491 off2 := auxIntToInt64(v_0.AuxInt)
3494 if !(is32Bit(int64(off1) + off2)) {
3497 v.reset(OpRISCV64MOVHUload)
3498 v.AuxInt = int32ToAuxInt(off1 + int32(off2))
3499 v.Aux = symToAux(sym)
3500 v.AddArg2(base, mem)
3505 func rewriteValueRISCV64_OpRISCV64MOVHUreg(v *Value) bool {
3508 // match: (MOVHUreg (MOVDconst [c]))
3509 // result: (MOVDconst [int64(uint16(c))])
3511 if v_0.Op != OpRISCV64MOVDconst {
3514 c := auxIntToInt64(v_0.AuxInt)
3515 v.reset(OpRISCV64MOVDconst)
3516 v.AuxInt = int64ToAuxInt(int64(uint16(c)))
3519 // match: (MOVHUreg x:(MOVBUload _ _))
3520 // result: (MOVDreg x)
3523 if x.Op != OpRISCV64MOVBUload {
3526 v.reset(OpRISCV64MOVDreg)
3530 // match: (MOVHUreg x:(MOVHUload _ _))
3531 // result: (MOVDreg x)
3534 if x.Op != OpRISCV64MOVHUload {
3537 v.reset(OpRISCV64MOVDreg)
3541 // match: (MOVHUreg x:(MOVBUreg _))
3542 // result: (MOVDreg x)
3545 if x.Op != OpRISCV64MOVBUreg {
3548 v.reset(OpRISCV64MOVDreg)
3552 // match: (MOVHUreg x:(MOVHUreg _))
3553 // result: (MOVDreg x)
3556 if x.Op != OpRISCV64MOVHUreg {
3559 v.reset(OpRISCV64MOVDreg)
3563 // match: (MOVHUreg <t> x:(MOVHload [off] {sym} ptr mem))
3564 // cond: x.Uses == 1 && clobber(x)
3565 // result: @x.Block (MOVHUload <t> [off] {sym} ptr mem)
3569 if x.Op != OpRISCV64MOVHload {
3572 off := auxIntToInt32(x.AuxInt)
3573 sym := auxToSym(x.Aux)
3576 if !(x.Uses == 1 && clobber(x)) {
3580 v0 := b.NewValue0(x.Pos, OpRISCV64MOVHUload, t)
3582 v0.AuxInt = int32ToAuxInt(off)
3583 v0.Aux = symToAux(sym)
3584 v0.AddArg2(ptr, mem)
3589 func rewriteValueRISCV64_OpRISCV64MOVHload(v *Value) bool {
3592 // match: (MOVHload [off1] {sym1} (MOVaddr [off2] {sym2} base) mem)
3593 // cond: is32Bit(int64(off1)+int64(off2)) && canMergeSym(sym1, sym2)
3594 // result: (MOVHload [off1+off2] {mergeSym(sym1,sym2)} base mem)
3596 off1 := auxIntToInt32(v.AuxInt)
3597 sym1 := auxToSym(v.Aux)
3598 if v_0.Op != OpRISCV64MOVaddr {
3601 off2 := auxIntToInt32(v_0.AuxInt)
3602 sym2 := auxToSym(v_0.Aux)
3605 if !(is32Bit(int64(off1)+int64(off2)) && canMergeSym(sym1, sym2)) {
3608 v.reset(OpRISCV64MOVHload)
3609 v.AuxInt = int32ToAuxInt(off1 + off2)
3610 v.Aux = symToAux(mergeSym(sym1, sym2))
3611 v.AddArg2(base, mem)
3614 // match: (MOVHload [off1] {sym} (ADDI [off2] base) mem)
3615 // cond: is32Bit(int64(off1)+off2)
3616 // result: (MOVHload [off1+int32(off2)] {sym} base mem)
3618 off1 := auxIntToInt32(v.AuxInt)
3619 sym := auxToSym(v.Aux)
3620 if v_0.Op != OpRISCV64ADDI {
3623 off2 := auxIntToInt64(v_0.AuxInt)
3626 if !(is32Bit(int64(off1) + off2)) {
3629 v.reset(OpRISCV64MOVHload)
3630 v.AuxInt = int32ToAuxInt(off1 + int32(off2))
3631 v.Aux = symToAux(sym)
3632 v.AddArg2(base, mem)
3637 func rewriteValueRISCV64_OpRISCV64MOVHreg(v *Value) bool {
3640 // match: (MOVHreg (MOVDconst [c]))
3641 // result: (MOVDconst [int64(int16(c))])
3643 if v_0.Op != OpRISCV64MOVDconst {
3646 c := auxIntToInt64(v_0.AuxInt)
3647 v.reset(OpRISCV64MOVDconst)
3648 v.AuxInt = int64ToAuxInt(int64(int16(c)))
3651 // match: (MOVHreg x:(MOVBload _ _))
3652 // result: (MOVDreg x)
3655 if x.Op != OpRISCV64MOVBload {
3658 v.reset(OpRISCV64MOVDreg)
3662 // match: (MOVHreg x:(MOVBUload _ _))
3663 // result: (MOVDreg x)
3666 if x.Op != OpRISCV64MOVBUload {
3669 v.reset(OpRISCV64MOVDreg)
3673 // match: (MOVHreg x:(MOVHload _ _))
3674 // result: (MOVDreg x)
3677 if x.Op != OpRISCV64MOVHload {
3680 v.reset(OpRISCV64MOVDreg)
3684 // match: (MOVHreg x:(MOVBreg _))
3685 // result: (MOVDreg x)
3688 if x.Op != OpRISCV64MOVBreg {
3691 v.reset(OpRISCV64MOVDreg)
3695 // match: (MOVHreg x:(MOVBUreg _))
3696 // result: (MOVDreg x)
3699 if x.Op != OpRISCV64MOVBUreg {
3702 v.reset(OpRISCV64MOVDreg)
3706 // match: (MOVHreg x:(MOVHreg _))
3707 // result: (MOVDreg x)
3710 if x.Op != OpRISCV64MOVHreg {
3713 v.reset(OpRISCV64MOVDreg)
3717 // match: (MOVHreg <t> x:(MOVHUload [off] {sym} ptr mem))
3718 // cond: x.Uses == 1 && clobber(x)
3719 // result: @x.Block (MOVHload <t> [off] {sym} ptr mem)
3723 if x.Op != OpRISCV64MOVHUload {
3726 off := auxIntToInt32(x.AuxInt)
3727 sym := auxToSym(x.Aux)
3730 if !(x.Uses == 1 && clobber(x)) {
3734 v0 := b.NewValue0(x.Pos, OpRISCV64MOVHload, t)
3736 v0.AuxInt = int32ToAuxInt(off)
3737 v0.Aux = symToAux(sym)
3738 v0.AddArg2(ptr, mem)
3743 func rewriteValueRISCV64_OpRISCV64MOVHstore(v *Value) bool {
3747 // match: (MOVHstore [off1] {sym1} (MOVaddr [off2] {sym2} base) val mem)
3748 // cond: is32Bit(int64(off1)+int64(off2)) && canMergeSym(sym1, sym2)
3749 // result: (MOVHstore [off1+off2] {mergeSym(sym1,sym2)} base val mem)
3751 off1 := auxIntToInt32(v.AuxInt)
3752 sym1 := auxToSym(v.Aux)
3753 if v_0.Op != OpRISCV64MOVaddr {
3756 off2 := auxIntToInt32(v_0.AuxInt)
3757 sym2 := auxToSym(v_0.Aux)
3761 if !(is32Bit(int64(off1)+int64(off2)) && canMergeSym(sym1, sym2)) {
3764 v.reset(OpRISCV64MOVHstore)
3765 v.AuxInt = int32ToAuxInt(off1 + off2)
3766 v.Aux = symToAux(mergeSym(sym1, sym2))
3767 v.AddArg3(base, val, mem)
3770 // match: (MOVHstore [off1] {sym} (ADDI [off2] base) val mem)
3771 // cond: is32Bit(int64(off1)+off2)
3772 // result: (MOVHstore [off1+int32(off2)] {sym} base val mem)
3774 off1 := auxIntToInt32(v.AuxInt)
3775 sym := auxToSym(v.Aux)
3776 if v_0.Op != OpRISCV64ADDI {
3779 off2 := auxIntToInt64(v_0.AuxInt)
3783 if !(is32Bit(int64(off1) + off2)) {
3786 v.reset(OpRISCV64MOVHstore)
3787 v.AuxInt = int32ToAuxInt(off1 + int32(off2))
3788 v.Aux = symToAux(sym)
3789 v.AddArg3(base, val, mem)
3792 // match: (MOVHstore [off] {sym} ptr (MOVDconst [0]) mem)
3793 // result: (MOVHstorezero [off] {sym} ptr mem)
3795 off := auxIntToInt32(v.AuxInt)
3796 sym := auxToSym(v.Aux)
3798 if v_1.Op != OpRISCV64MOVDconst || auxIntToInt64(v_1.AuxInt) != 0 {
3802 v.reset(OpRISCV64MOVHstorezero)
3803 v.AuxInt = int32ToAuxInt(off)
3804 v.Aux = symToAux(sym)
3808 // match: (MOVHstore [off] {sym} ptr (MOVHreg x) mem)
3809 // result: (MOVHstore [off] {sym} ptr x mem)
3811 off := auxIntToInt32(v.AuxInt)
3812 sym := auxToSym(v.Aux)
3814 if v_1.Op != OpRISCV64MOVHreg {
3819 v.reset(OpRISCV64MOVHstore)
3820 v.AuxInt = int32ToAuxInt(off)
3821 v.Aux = symToAux(sym)
3822 v.AddArg3(ptr, x, mem)
3825 // match: (MOVHstore [off] {sym} ptr (MOVWreg x) mem)
3826 // result: (MOVHstore [off] {sym} ptr x mem)
3828 off := auxIntToInt32(v.AuxInt)
3829 sym := auxToSym(v.Aux)
3831 if v_1.Op != OpRISCV64MOVWreg {
3836 v.reset(OpRISCV64MOVHstore)
3837 v.AuxInt = int32ToAuxInt(off)
3838 v.Aux = symToAux(sym)
3839 v.AddArg3(ptr, x, mem)
3842 // match: (MOVHstore [off] {sym} ptr (MOVHUreg x) mem)
3843 // result: (MOVHstore [off] {sym} ptr x mem)
3845 off := auxIntToInt32(v.AuxInt)
3846 sym := auxToSym(v.Aux)
3848 if v_1.Op != OpRISCV64MOVHUreg {
3853 v.reset(OpRISCV64MOVHstore)
3854 v.AuxInt = int32ToAuxInt(off)
3855 v.Aux = symToAux(sym)
3856 v.AddArg3(ptr, x, mem)
3859 // match: (MOVHstore [off] {sym} ptr (MOVWUreg x) mem)
3860 // result: (MOVHstore [off] {sym} ptr x mem)
3862 off := auxIntToInt32(v.AuxInt)
3863 sym := auxToSym(v.Aux)
3865 if v_1.Op != OpRISCV64MOVWUreg {
3870 v.reset(OpRISCV64MOVHstore)
3871 v.AuxInt = int32ToAuxInt(off)
3872 v.Aux = symToAux(sym)
3873 v.AddArg3(ptr, x, mem)
3878 func rewriteValueRISCV64_OpRISCV64MOVHstorezero(v *Value) bool {
3881 // match: (MOVHstorezero [off1] {sym1} (MOVaddr [off2] {sym2} ptr) mem)
3882 // cond: canMergeSym(sym1,sym2) && is32Bit(int64(off1)+int64(off2))
3883 // result: (MOVHstorezero [off1+off2] {mergeSym(sym1,sym2)} ptr mem)
3885 off1 := auxIntToInt32(v.AuxInt)
3886 sym1 := auxToSym(v.Aux)
3887 if v_0.Op != OpRISCV64MOVaddr {
3890 off2 := auxIntToInt32(v_0.AuxInt)
3891 sym2 := auxToSym(v_0.Aux)
3894 if !(canMergeSym(sym1, sym2) && is32Bit(int64(off1)+int64(off2))) {
3897 v.reset(OpRISCV64MOVHstorezero)
3898 v.AuxInt = int32ToAuxInt(off1 + off2)
3899 v.Aux = symToAux(mergeSym(sym1, sym2))
3903 // match: (MOVHstorezero [off1] {sym} (ADDI [off2] ptr) mem)
3904 // cond: is32Bit(int64(off1)+off2)
3905 // result: (MOVHstorezero [off1+int32(off2)] {sym} ptr mem)
3907 off1 := auxIntToInt32(v.AuxInt)
3908 sym := auxToSym(v.Aux)
3909 if v_0.Op != OpRISCV64ADDI {
3912 off2 := auxIntToInt64(v_0.AuxInt)
3915 if !(is32Bit(int64(off1) + off2)) {
3918 v.reset(OpRISCV64MOVHstorezero)
3919 v.AuxInt = int32ToAuxInt(off1 + int32(off2))
3920 v.Aux = symToAux(sym)
3926 func rewriteValueRISCV64_OpRISCV64MOVWUload(v *Value) bool {
3929 // match: (MOVWUload [off1] {sym1} (MOVaddr [off2] {sym2} base) mem)
3930 // cond: is32Bit(int64(off1)+int64(off2)) && canMergeSym(sym1, sym2)
3931 // result: (MOVWUload [off1+off2] {mergeSym(sym1,sym2)} base mem)
3933 off1 := auxIntToInt32(v.AuxInt)
3934 sym1 := auxToSym(v.Aux)
3935 if v_0.Op != OpRISCV64MOVaddr {
3938 off2 := auxIntToInt32(v_0.AuxInt)
3939 sym2 := auxToSym(v_0.Aux)
3942 if !(is32Bit(int64(off1)+int64(off2)) && canMergeSym(sym1, sym2)) {
3945 v.reset(OpRISCV64MOVWUload)
3946 v.AuxInt = int32ToAuxInt(off1 + off2)
3947 v.Aux = symToAux(mergeSym(sym1, sym2))
3948 v.AddArg2(base, mem)
3951 // match: (MOVWUload [off1] {sym} (ADDI [off2] base) mem)
3952 // cond: is32Bit(int64(off1)+off2)
3953 // result: (MOVWUload [off1+int32(off2)] {sym} base mem)
3955 off1 := auxIntToInt32(v.AuxInt)
3956 sym := auxToSym(v.Aux)
3957 if v_0.Op != OpRISCV64ADDI {
3960 off2 := auxIntToInt64(v_0.AuxInt)
3963 if !(is32Bit(int64(off1) + off2)) {
3966 v.reset(OpRISCV64MOVWUload)
3967 v.AuxInt = int32ToAuxInt(off1 + int32(off2))
3968 v.Aux = symToAux(sym)
3969 v.AddArg2(base, mem)
3974 func rewriteValueRISCV64_OpRISCV64MOVWUreg(v *Value) bool {
3977 // match: (MOVWUreg (MOVDconst [c]))
3978 // result: (MOVDconst [int64(uint32(c))])
3980 if v_0.Op != OpRISCV64MOVDconst {
3983 c := auxIntToInt64(v_0.AuxInt)
3984 v.reset(OpRISCV64MOVDconst)
3985 v.AuxInt = int64ToAuxInt(int64(uint32(c)))
3988 // match: (MOVWUreg x:(MOVBUload _ _))
3989 // result: (MOVDreg x)
3992 if x.Op != OpRISCV64MOVBUload {
3995 v.reset(OpRISCV64MOVDreg)
3999 // match: (MOVWUreg x:(MOVHUload _ _))
4000 // result: (MOVDreg x)
4003 if x.Op != OpRISCV64MOVHUload {
4006 v.reset(OpRISCV64MOVDreg)
4010 // match: (MOVWUreg x:(MOVWUload _ _))
4011 // result: (MOVDreg x)
4014 if x.Op != OpRISCV64MOVWUload {
4017 v.reset(OpRISCV64MOVDreg)
4021 // match: (MOVWUreg x:(MOVBUreg _))
4022 // result: (MOVDreg x)
4025 if x.Op != OpRISCV64MOVBUreg {
4028 v.reset(OpRISCV64MOVDreg)
4032 // match: (MOVWUreg x:(MOVHUreg _))
4033 // result: (MOVDreg x)
4036 if x.Op != OpRISCV64MOVHUreg {
4039 v.reset(OpRISCV64MOVDreg)
4043 // match: (MOVWUreg x:(MOVWUreg _))
4044 // result: (MOVDreg x)
4047 if x.Op != OpRISCV64MOVWUreg {
4050 v.reset(OpRISCV64MOVDreg)
4054 // match: (MOVWUreg <t> x:(MOVWload [off] {sym} ptr mem))
4055 // cond: x.Uses == 1 && clobber(x)
4056 // result: @x.Block (MOVWUload <t> [off] {sym} ptr mem)
4060 if x.Op != OpRISCV64MOVWload {
4063 off := auxIntToInt32(x.AuxInt)
4064 sym := auxToSym(x.Aux)
4067 if !(x.Uses == 1 && clobber(x)) {
4071 v0 := b.NewValue0(x.Pos, OpRISCV64MOVWUload, t)
4073 v0.AuxInt = int32ToAuxInt(off)
4074 v0.Aux = symToAux(sym)
4075 v0.AddArg2(ptr, mem)
4080 func rewriteValueRISCV64_OpRISCV64MOVWload(v *Value) bool {
4083 // match: (MOVWload [off1] {sym1} (MOVaddr [off2] {sym2} base) mem)
4084 // cond: is32Bit(int64(off1)+int64(off2)) && canMergeSym(sym1, sym2)
4085 // result: (MOVWload [off1+off2] {mergeSym(sym1,sym2)} base mem)
4087 off1 := auxIntToInt32(v.AuxInt)
4088 sym1 := auxToSym(v.Aux)
4089 if v_0.Op != OpRISCV64MOVaddr {
4092 off2 := auxIntToInt32(v_0.AuxInt)
4093 sym2 := auxToSym(v_0.Aux)
4096 if !(is32Bit(int64(off1)+int64(off2)) && canMergeSym(sym1, sym2)) {
4099 v.reset(OpRISCV64MOVWload)
4100 v.AuxInt = int32ToAuxInt(off1 + off2)
4101 v.Aux = symToAux(mergeSym(sym1, sym2))
4102 v.AddArg2(base, mem)
4105 // match: (MOVWload [off1] {sym} (ADDI [off2] base) mem)
4106 // cond: is32Bit(int64(off1)+off2)
4107 // result: (MOVWload [off1+int32(off2)] {sym} base mem)
4109 off1 := auxIntToInt32(v.AuxInt)
4110 sym := auxToSym(v.Aux)
4111 if v_0.Op != OpRISCV64ADDI {
4114 off2 := auxIntToInt64(v_0.AuxInt)
4117 if !(is32Bit(int64(off1) + off2)) {
4120 v.reset(OpRISCV64MOVWload)
4121 v.AuxInt = int32ToAuxInt(off1 + int32(off2))
4122 v.Aux = symToAux(sym)
4123 v.AddArg2(base, mem)
4128 func rewriteValueRISCV64_OpRISCV64MOVWreg(v *Value) bool {
4131 // match: (MOVWreg (MOVDconst [c]))
4132 // result: (MOVDconst [int64(int32(c))])
4134 if v_0.Op != OpRISCV64MOVDconst {
4137 c := auxIntToInt64(v_0.AuxInt)
4138 v.reset(OpRISCV64MOVDconst)
4139 v.AuxInt = int64ToAuxInt(int64(int32(c)))
4142 // match: (MOVWreg x:(MOVBload _ _))
4143 // result: (MOVDreg x)
4146 if x.Op != OpRISCV64MOVBload {
4149 v.reset(OpRISCV64MOVDreg)
4153 // match: (MOVWreg x:(MOVBUload _ _))
4154 // result: (MOVDreg x)
4157 if x.Op != OpRISCV64MOVBUload {
4160 v.reset(OpRISCV64MOVDreg)
4164 // match: (MOVWreg x:(MOVHload _ _))
4165 // result: (MOVDreg x)
4168 if x.Op != OpRISCV64MOVHload {
4171 v.reset(OpRISCV64MOVDreg)
4175 // match: (MOVWreg x:(MOVHUload _ _))
4176 // result: (MOVDreg x)
4179 if x.Op != OpRISCV64MOVHUload {
4182 v.reset(OpRISCV64MOVDreg)
4186 // match: (MOVWreg x:(MOVWload _ _))
4187 // result: (MOVDreg x)
4190 if x.Op != OpRISCV64MOVWload {
4193 v.reset(OpRISCV64MOVDreg)
4197 // match: (MOVWreg x:(MOVBreg _))
4198 // result: (MOVDreg x)
4201 if x.Op != OpRISCV64MOVBreg {
4204 v.reset(OpRISCV64MOVDreg)
4208 // match: (MOVWreg x:(MOVBUreg _))
4209 // result: (MOVDreg x)
4212 if x.Op != OpRISCV64MOVBUreg {
4215 v.reset(OpRISCV64MOVDreg)
4219 // match: (MOVWreg x:(MOVHreg _))
4220 // result: (MOVDreg x)
4223 if x.Op != OpRISCV64MOVHreg {
4226 v.reset(OpRISCV64MOVDreg)
4230 // match: (MOVWreg x:(MOVWreg _))
4231 // result: (MOVDreg x)
4234 if x.Op != OpRISCV64MOVWreg {
4237 v.reset(OpRISCV64MOVDreg)
4241 // match: (MOVWreg <t> x:(MOVWUload [off] {sym} ptr mem))
4242 // cond: x.Uses == 1 && clobber(x)
4243 // result: @x.Block (MOVWload <t> [off] {sym} ptr mem)
4247 if x.Op != OpRISCV64MOVWUload {
4250 off := auxIntToInt32(x.AuxInt)
4251 sym := auxToSym(x.Aux)
4254 if !(x.Uses == 1 && clobber(x)) {
4258 v0 := b.NewValue0(x.Pos, OpRISCV64MOVWload, t)
4260 v0.AuxInt = int32ToAuxInt(off)
4261 v0.Aux = symToAux(sym)
4262 v0.AddArg2(ptr, mem)
4267 func rewriteValueRISCV64_OpRISCV64MOVWstore(v *Value) bool {
4271 // match: (MOVWstore [off1] {sym1} (MOVaddr [off2] {sym2} base) val mem)
4272 // cond: is32Bit(int64(off1)+int64(off2)) && canMergeSym(sym1, sym2)
4273 // result: (MOVWstore [off1+off2] {mergeSym(sym1,sym2)} base val mem)
4275 off1 := auxIntToInt32(v.AuxInt)
4276 sym1 := auxToSym(v.Aux)
4277 if v_0.Op != OpRISCV64MOVaddr {
4280 off2 := auxIntToInt32(v_0.AuxInt)
4281 sym2 := auxToSym(v_0.Aux)
4285 if !(is32Bit(int64(off1)+int64(off2)) && canMergeSym(sym1, sym2)) {
4288 v.reset(OpRISCV64MOVWstore)
4289 v.AuxInt = int32ToAuxInt(off1 + off2)
4290 v.Aux = symToAux(mergeSym(sym1, sym2))
4291 v.AddArg3(base, val, mem)
4294 // match: (MOVWstore [off1] {sym} (ADDI [off2] base) val mem)
4295 // cond: is32Bit(int64(off1)+off2)
4296 // result: (MOVWstore [off1+int32(off2)] {sym} base val mem)
4298 off1 := auxIntToInt32(v.AuxInt)
4299 sym := auxToSym(v.Aux)
4300 if v_0.Op != OpRISCV64ADDI {
4303 off2 := auxIntToInt64(v_0.AuxInt)
4307 if !(is32Bit(int64(off1) + off2)) {
4310 v.reset(OpRISCV64MOVWstore)
4311 v.AuxInt = int32ToAuxInt(off1 + int32(off2))
4312 v.Aux = symToAux(sym)
4313 v.AddArg3(base, val, mem)
4316 // match: (MOVWstore [off] {sym} ptr (MOVDconst [0]) mem)
4317 // result: (MOVWstorezero [off] {sym} ptr mem)
4319 off := auxIntToInt32(v.AuxInt)
4320 sym := auxToSym(v.Aux)
4322 if v_1.Op != OpRISCV64MOVDconst || auxIntToInt64(v_1.AuxInt) != 0 {
4326 v.reset(OpRISCV64MOVWstorezero)
4327 v.AuxInt = int32ToAuxInt(off)
4328 v.Aux = symToAux(sym)
4332 // match: (MOVWstore [off] {sym} ptr (MOVWreg x) mem)
4333 // result: (MOVWstore [off] {sym} ptr x mem)
4335 off := auxIntToInt32(v.AuxInt)
4336 sym := auxToSym(v.Aux)
4338 if v_1.Op != OpRISCV64MOVWreg {
4343 v.reset(OpRISCV64MOVWstore)
4344 v.AuxInt = int32ToAuxInt(off)
4345 v.Aux = symToAux(sym)
4346 v.AddArg3(ptr, x, mem)
4349 // match: (MOVWstore [off] {sym} ptr (MOVWUreg x) mem)
4350 // result: (MOVWstore [off] {sym} ptr x mem)
4352 off := auxIntToInt32(v.AuxInt)
4353 sym := auxToSym(v.Aux)
4355 if v_1.Op != OpRISCV64MOVWUreg {
4360 v.reset(OpRISCV64MOVWstore)
4361 v.AuxInt = int32ToAuxInt(off)
4362 v.Aux = symToAux(sym)
4363 v.AddArg3(ptr, x, mem)
4368 func rewriteValueRISCV64_OpRISCV64MOVWstorezero(v *Value) bool {
4371 // match: (MOVWstorezero [off1] {sym1} (MOVaddr [off2] {sym2} ptr) mem)
4372 // cond: canMergeSym(sym1,sym2) && is32Bit(int64(off1)+int64(off2))
4373 // result: (MOVWstorezero [off1+off2] {mergeSym(sym1,sym2)} ptr mem)
4375 off1 := auxIntToInt32(v.AuxInt)
4376 sym1 := auxToSym(v.Aux)
4377 if v_0.Op != OpRISCV64MOVaddr {
4380 off2 := auxIntToInt32(v_0.AuxInt)
4381 sym2 := auxToSym(v_0.Aux)
4384 if !(canMergeSym(sym1, sym2) && is32Bit(int64(off1)+int64(off2))) {
4387 v.reset(OpRISCV64MOVWstorezero)
4388 v.AuxInt = int32ToAuxInt(off1 + off2)
4389 v.Aux = symToAux(mergeSym(sym1, sym2))
4393 // match: (MOVWstorezero [off1] {sym} (ADDI [off2] ptr) mem)
4394 // cond: is32Bit(int64(off1)+off2)
4395 // result: (MOVWstorezero [off1+int32(off2)] {sym} ptr mem)
4397 off1 := auxIntToInt32(v.AuxInt)
4398 sym := auxToSym(v.Aux)
4399 if v_0.Op != OpRISCV64ADDI {
4402 off2 := auxIntToInt64(v_0.AuxInt)
4405 if !(is32Bit(int64(off1) + off2)) {
4408 v.reset(OpRISCV64MOVWstorezero)
4409 v.AuxInt = int32ToAuxInt(off1 + int32(off2))
4410 v.Aux = symToAux(sym)
4416 func rewriteValueRISCV64_OpRISCV64OR(v *Value) bool {
4419 // match: (OR (MOVDconst [val]) x)
4420 // cond: is32Bit(val)
4421 // result: (ORI [val] x)
4423 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
4424 if v_0.Op != OpRISCV64MOVDconst {
4427 val := auxIntToInt64(v_0.AuxInt)
4429 if !(is32Bit(val)) {
4432 v.reset(OpRISCV64ORI)
4433 v.AuxInt = int64ToAuxInt(val)
4441 func rewriteValueRISCV64_OpRISCV64SLL(v *Value) bool {
4444 // match: (SLL x (MOVDconst [val]))
4445 // result: (SLLI [int64(val&63)] x)
4448 if v_1.Op != OpRISCV64MOVDconst {
4451 val := auxIntToInt64(v_1.AuxInt)
4452 v.reset(OpRISCV64SLLI)
4453 v.AuxInt = int64ToAuxInt(int64(val & 63))
4459 func rewriteValueRISCV64_OpRISCV64SRA(v *Value) bool {
4462 // match: (SRA x (MOVDconst [val]))
4463 // result: (SRAI [int64(val&63)] x)
4466 if v_1.Op != OpRISCV64MOVDconst {
4469 val := auxIntToInt64(v_1.AuxInt)
4470 v.reset(OpRISCV64SRAI)
4471 v.AuxInt = int64ToAuxInt(int64(val & 63))
4477 func rewriteValueRISCV64_OpRISCV64SRL(v *Value) bool {
4480 // match: (SRL x (MOVDconst [val]))
4481 // result: (SRLI [int64(val&63)] x)
4484 if v_1.Op != OpRISCV64MOVDconst {
4487 val := auxIntToInt64(v_1.AuxInt)
4488 v.reset(OpRISCV64SRLI)
4489 v.AuxInt = int64ToAuxInt(int64(val & 63))
4495 func rewriteValueRISCV64_OpRISCV64SUB(v *Value) bool {
4498 // match: (SUB x (MOVDconst [val]))
4499 // cond: is32Bit(-val)
4500 // result: (ADDI [-val] x)
4503 if v_1.Op != OpRISCV64MOVDconst {
4506 val := auxIntToInt64(v_1.AuxInt)
4507 if !(is32Bit(-val)) {
4510 v.reset(OpRISCV64ADDI)
4511 v.AuxInt = int64ToAuxInt(-val)
4515 // match: (SUB x (MOVDconst [0]))
4519 if v_1.Op != OpRISCV64MOVDconst || auxIntToInt64(v_1.AuxInt) != 0 {
4525 // match: (SUB (MOVDconst [0]) x)
4528 if v_0.Op != OpRISCV64MOVDconst || auxIntToInt64(v_0.AuxInt) != 0 {
4532 v.reset(OpRISCV64NEG)
4538 func rewriteValueRISCV64_OpRISCV64SUBW(v *Value) bool {
4541 // match: (SUBW x (MOVDconst [0]))
4542 // result: (ADDIW [0] x)
4545 if v_1.Op != OpRISCV64MOVDconst || auxIntToInt64(v_1.AuxInt) != 0 {
4548 v.reset(OpRISCV64ADDIW)
4549 v.AuxInt = int64ToAuxInt(0)
4553 // match: (SUBW (MOVDconst [0]) x)
4556 if v_0.Op != OpRISCV64MOVDconst || auxIntToInt64(v_0.AuxInt) != 0 {
4560 v.reset(OpRISCV64NEGW)
4566 func rewriteValueRISCV64_OpRISCV64XOR(v *Value) bool {
4569 // match: (XOR (MOVDconst [val]) x)
4570 // cond: is32Bit(val)
4571 // result: (XORI [val] x)
4573 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
4574 if v_0.Op != OpRISCV64MOVDconst {
4577 val := auxIntToInt64(v_0.AuxInt)
4579 if !(is32Bit(val)) {
4582 v.reset(OpRISCV64XORI)
4583 v.AuxInt = int64ToAuxInt(val)
4591 func rewriteValueRISCV64_OpRotateLeft16(v *Value) bool {
4595 typ := &b.Func.Config.Types
4596 // match: (RotateLeft16 <t> x (MOVDconst [c]))
4597 // result: (Or16 (Lsh16x64 <t> x (MOVDconst [c&15])) (Rsh16Ux64 <t> x (MOVDconst [-c&15])))
4601 if v_1.Op != OpRISCV64MOVDconst {
4604 c := auxIntToInt64(v_1.AuxInt)
4606 v0 := b.NewValue0(v.Pos, OpLsh16x64, t)
4607 v1 := b.NewValue0(v.Pos, OpRISCV64MOVDconst, typ.UInt64)
4608 v1.AuxInt = int64ToAuxInt(c & 15)
4610 v2 := b.NewValue0(v.Pos, OpRsh16Ux64, t)
4611 v3 := b.NewValue0(v.Pos, OpRISCV64MOVDconst, typ.UInt64)
4612 v3.AuxInt = int64ToAuxInt(-c & 15)
4619 func rewriteValueRISCV64_OpRotateLeft32(v *Value) bool {
4623 typ := &b.Func.Config.Types
4624 // match: (RotateLeft32 <t> x (MOVDconst [c]))
4625 // result: (Or32 (Lsh32x64 <t> x (MOVDconst [c&31])) (Rsh32Ux64 <t> x (MOVDconst [-c&31])))
4629 if v_1.Op != OpRISCV64MOVDconst {
4632 c := auxIntToInt64(v_1.AuxInt)
4634 v0 := b.NewValue0(v.Pos, OpLsh32x64, t)
4635 v1 := b.NewValue0(v.Pos, OpRISCV64MOVDconst, typ.UInt64)
4636 v1.AuxInt = int64ToAuxInt(c & 31)
4638 v2 := b.NewValue0(v.Pos, OpRsh32Ux64, t)
4639 v3 := b.NewValue0(v.Pos, OpRISCV64MOVDconst, typ.UInt64)
4640 v3.AuxInt = int64ToAuxInt(-c & 31)
4647 func rewriteValueRISCV64_OpRotateLeft64(v *Value) bool {
4651 typ := &b.Func.Config.Types
4652 // match: (RotateLeft64 <t> x (MOVDconst [c]))
4653 // result: (Or64 (Lsh64x64 <t> x (MOVDconst [c&63])) (Rsh64Ux64 <t> x (MOVDconst [-c&63])))
4657 if v_1.Op != OpRISCV64MOVDconst {
4660 c := auxIntToInt64(v_1.AuxInt)
4662 v0 := b.NewValue0(v.Pos, OpLsh64x64, t)
4663 v1 := b.NewValue0(v.Pos, OpRISCV64MOVDconst, typ.UInt64)
4664 v1.AuxInt = int64ToAuxInt(c & 63)
4666 v2 := b.NewValue0(v.Pos, OpRsh64Ux64, t)
4667 v3 := b.NewValue0(v.Pos, OpRISCV64MOVDconst, typ.UInt64)
4668 v3.AuxInt = int64ToAuxInt(-c & 63)
4675 func rewriteValueRISCV64_OpRotateLeft8(v *Value) bool {
4679 typ := &b.Func.Config.Types
4680 // match: (RotateLeft8 <t> x (MOVDconst [c]))
4681 // result: (Or8 (Lsh8x64 <t> x (MOVDconst [c&7])) (Rsh8Ux64 <t> x (MOVDconst [-c&7])))
4685 if v_1.Op != OpRISCV64MOVDconst {
4688 c := auxIntToInt64(v_1.AuxInt)
4690 v0 := b.NewValue0(v.Pos, OpLsh8x64, t)
4691 v1 := b.NewValue0(v.Pos, OpRISCV64MOVDconst, typ.UInt64)
4692 v1.AuxInt = int64ToAuxInt(c & 7)
4694 v2 := b.NewValue0(v.Pos, OpRsh8Ux64, t)
4695 v3 := b.NewValue0(v.Pos, OpRISCV64MOVDconst, typ.UInt64)
4696 v3.AuxInt = int64ToAuxInt(-c & 7)
4703 func rewriteValueRISCV64_OpRsh16Ux16(v *Value) bool {
4707 typ := &b.Func.Config.Types
4708 // match: (Rsh16Ux16 <t> x y)
4709 // result: (AND (SRL <t> (ZeroExt16to64 x) y) (Neg16 <t> (SLTIU <t> [64] (ZeroExt16to64 y))))
4714 v.reset(OpRISCV64AND)
4715 v0 := b.NewValue0(v.Pos, OpRISCV64SRL, t)
4716 v1 := b.NewValue0(v.Pos, OpZeroExt16to64, typ.UInt64)
4719 v2 := b.NewValue0(v.Pos, OpNeg16, t)
4720 v3 := b.NewValue0(v.Pos, OpRISCV64SLTIU, t)
4721 v3.AuxInt = int64ToAuxInt(64)
4722 v4 := b.NewValue0(v.Pos, OpZeroExt16to64, typ.UInt64)
4730 func rewriteValueRISCV64_OpRsh16Ux32(v *Value) bool {
4734 typ := &b.Func.Config.Types
4735 // match: (Rsh16Ux32 <t> x y)
4736 // result: (AND (SRL <t> (ZeroExt16to64 x) y) (Neg16 <t> (SLTIU <t> [64] (ZeroExt32to64 y))))
4741 v.reset(OpRISCV64AND)
4742 v0 := b.NewValue0(v.Pos, OpRISCV64SRL, t)
4743 v1 := b.NewValue0(v.Pos, OpZeroExt16to64, typ.UInt64)
4746 v2 := b.NewValue0(v.Pos, OpNeg16, t)
4747 v3 := b.NewValue0(v.Pos, OpRISCV64SLTIU, t)
4748 v3.AuxInt = int64ToAuxInt(64)
4749 v4 := b.NewValue0(v.Pos, OpZeroExt32to64, typ.UInt64)
4757 func rewriteValueRISCV64_OpRsh16Ux64(v *Value) bool {
4761 typ := &b.Func.Config.Types
4762 // match: (Rsh16Ux64 <t> x y)
4763 // result: (AND (SRL <t> (ZeroExt16to64 x) y) (Neg16 <t> (SLTIU <t> [64] y)))
4768 v.reset(OpRISCV64AND)
4769 v0 := b.NewValue0(v.Pos, OpRISCV64SRL, t)
4770 v1 := b.NewValue0(v.Pos, OpZeroExt16to64, typ.UInt64)
4773 v2 := b.NewValue0(v.Pos, OpNeg16, t)
4774 v3 := b.NewValue0(v.Pos, OpRISCV64SLTIU, t)
4775 v3.AuxInt = int64ToAuxInt(64)
4782 func rewriteValueRISCV64_OpRsh16Ux8(v *Value) bool {
4786 typ := &b.Func.Config.Types
4787 // match: (Rsh16Ux8 <t> x y)
4788 // result: (AND (SRL <t> (ZeroExt16to64 x) y) (Neg16 <t> (SLTIU <t> [64] (ZeroExt8to64 y))))
4793 v.reset(OpRISCV64AND)
4794 v0 := b.NewValue0(v.Pos, OpRISCV64SRL, t)
4795 v1 := b.NewValue0(v.Pos, OpZeroExt16to64, typ.UInt64)
4798 v2 := b.NewValue0(v.Pos, OpNeg16, t)
4799 v3 := b.NewValue0(v.Pos, OpRISCV64SLTIU, t)
4800 v3.AuxInt = int64ToAuxInt(64)
4801 v4 := b.NewValue0(v.Pos, OpZeroExt8to64, typ.UInt64)
4809 func rewriteValueRISCV64_OpRsh16x16(v *Value) bool {
4813 typ := &b.Func.Config.Types
4814 // match: (Rsh16x16 <t> x y)
4815 // result: (SRA <t> (SignExt16to64 x) (OR <y.Type> y (ADDI <y.Type> [-1] (SLTIU <y.Type> [64] (ZeroExt16to64 y)))))
4820 v.reset(OpRISCV64SRA)
4822 v0 := b.NewValue0(v.Pos, OpSignExt16to64, typ.Int64)
4824 v1 := b.NewValue0(v.Pos, OpRISCV64OR, y.Type)
4825 v2 := b.NewValue0(v.Pos, OpRISCV64ADDI, y.Type)
4826 v2.AuxInt = int64ToAuxInt(-1)
4827 v3 := b.NewValue0(v.Pos, OpRISCV64SLTIU, y.Type)
4828 v3.AuxInt = int64ToAuxInt(64)
4829 v4 := b.NewValue0(v.Pos, OpZeroExt16to64, typ.UInt64)
4838 func rewriteValueRISCV64_OpRsh16x32(v *Value) bool {
4842 typ := &b.Func.Config.Types
4843 // match: (Rsh16x32 <t> x y)
4844 // result: (SRA <t> (SignExt16to64 x) (OR <y.Type> y (ADDI <y.Type> [-1] (SLTIU <y.Type> [64] (ZeroExt32to64 y)))))
4849 v.reset(OpRISCV64SRA)
4851 v0 := b.NewValue0(v.Pos, OpSignExt16to64, typ.Int64)
4853 v1 := b.NewValue0(v.Pos, OpRISCV64OR, y.Type)
4854 v2 := b.NewValue0(v.Pos, OpRISCV64ADDI, y.Type)
4855 v2.AuxInt = int64ToAuxInt(-1)
4856 v3 := b.NewValue0(v.Pos, OpRISCV64SLTIU, y.Type)
4857 v3.AuxInt = int64ToAuxInt(64)
4858 v4 := b.NewValue0(v.Pos, OpZeroExt32to64, typ.UInt64)
4867 func rewriteValueRISCV64_OpRsh16x64(v *Value) bool {
4871 typ := &b.Func.Config.Types
4872 // match: (Rsh16x64 <t> x y)
4873 // result: (SRA <t> (SignExt16to64 x) (OR <y.Type> y (ADDI <y.Type> [-1] (SLTIU <y.Type> [64] y))))
4878 v.reset(OpRISCV64SRA)
4880 v0 := b.NewValue0(v.Pos, OpSignExt16to64, typ.Int64)
4882 v1 := b.NewValue0(v.Pos, OpRISCV64OR, y.Type)
4883 v2 := b.NewValue0(v.Pos, OpRISCV64ADDI, y.Type)
4884 v2.AuxInt = int64ToAuxInt(-1)
4885 v3 := b.NewValue0(v.Pos, OpRISCV64SLTIU, y.Type)
4886 v3.AuxInt = int64ToAuxInt(64)
4894 func rewriteValueRISCV64_OpRsh16x8(v *Value) bool {
4898 typ := &b.Func.Config.Types
4899 // match: (Rsh16x8 <t> x y)
4900 // result: (SRA <t> (SignExt16to64 x) (OR <y.Type> y (ADDI <y.Type> [-1] (SLTIU <y.Type> [64] (ZeroExt8to64 y)))))
4905 v.reset(OpRISCV64SRA)
4907 v0 := b.NewValue0(v.Pos, OpSignExt16to64, typ.Int64)
4909 v1 := b.NewValue0(v.Pos, OpRISCV64OR, y.Type)
4910 v2 := b.NewValue0(v.Pos, OpRISCV64ADDI, y.Type)
4911 v2.AuxInt = int64ToAuxInt(-1)
4912 v3 := b.NewValue0(v.Pos, OpRISCV64SLTIU, y.Type)
4913 v3.AuxInt = int64ToAuxInt(64)
4914 v4 := b.NewValue0(v.Pos, OpZeroExt8to64, typ.UInt64)
4923 func rewriteValueRISCV64_OpRsh32Ux16(v *Value) bool {
4927 typ := &b.Func.Config.Types
4928 // match: (Rsh32Ux16 <t> x y)
4929 // result: (AND (SRL <t> (ZeroExt32to64 x) y) (Neg32 <t> (SLTIU <t> [64] (ZeroExt16to64 y))))
4934 v.reset(OpRISCV64AND)
4935 v0 := b.NewValue0(v.Pos, OpRISCV64SRL, t)
4936 v1 := b.NewValue0(v.Pos, OpZeroExt32to64, typ.UInt64)
4939 v2 := b.NewValue0(v.Pos, OpNeg32, t)
4940 v3 := b.NewValue0(v.Pos, OpRISCV64SLTIU, t)
4941 v3.AuxInt = int64ToAuxInt(64)
4942 v4 := b.NewValue0(v.Pos, OpZeroExt16to64, typ.UInt64)
4950 func rewriteValueRISCV64_OpRsh32Ux32(v *Value) bool {
4954 typ := &b.Func.Config.Types
4955 // match: (Rsh32Ux32 <t> x y)
4956 // result: (AND (SRL <t> (ZeroExt32to64 x) y) (Neg32 <t> (SLTIU <t> [64] (ZeroExt32to64 y))))
4961 v.reset(OpRISCV64AND)
4962 v0 := b.NewValue0(v.Pos, OpRISCV64SRL, t)
4963 v1 := b.NewValue0(v.Pos, OpZeroExt32to64, typ.UInt64)
4966 v2 := b.NewValue0(v.Pos, OpNeg32, t)
4967 v3 := b.NewValue0(v.Pos, OpRISCV64SLTIU, t)
4968 v3.AuxInt = int64ToAuxInt(64)
4969 v4 := b.NewValue0(v.Pos, OpZeroExt32to64, typ.UInt64)
4977 func rewriteValueRISCV64_OpRsh32Ux64(v *Value) bool {
4981 typ := &b.Func.Config.Types
4982 // match: (Rsh32Ux64 <t> x y)
4983 // result: (AND (SRL <t> (ZeroExt32to64 x) y) (Neg32 <t> (SLTIU <t> [64] y)))
4988 v.reset(OpRISCV64AND)
4989 v0 := b.NewValue0(v.Pos, OpRISCV64SRL, t)
4990 v1 := b.NewValue0(v.Pos, OpZeroExt32to64, typ.UInt64)
4993 v2 := b.NewValue0(v.Pos, OpNeg32, t)
4994 v3 := b.NewValue0(v.Pos, OpRISCV64SLTIU, t)
4995 v3.AuxInt = int64ToAuxInt(64)
5002 func rewriteValueRISCV64_OpRsh32Ux8(v *Value) bool {
5006 typ := &b.Func.Config.Types
5007 // match: (Rsh32Ux8 <t> x y)
5008 // result: (AND (SRL <t> (ZeroExt32to64 x) y) (Neg32 <t> (SLTIU <t> [64] (ZeroExt8to64 y))))
5013 v.reset(OpRISCV64AND)
5014 v0 := b.NewValue0(v.Pos, OpRISCV64SRL, t)
5015 v1 := b.NewValue0(v.Pos, OpZeroExt32to64, typ.UInt64)
5018 v2 := b.NewValue0(v.Pos, OpNeg32, t)
5019 v3 := b.NewValue0(v.Pos, OpRISCV64SLTIU, t)
5020 v3.AuxInt = int64ToAuxInt(64)
5021 v4 := b.NewValue0(v.Pos, OpZeroExt8to64, typ.UInt64)
5029 func rewriteValueRISCV64_OpRsh32x16(v *Value) bool {
5033 typ := &b.Func.Config.Types
5034 // match: (Rsh32x16 <t> x y)
5035 // result: (SRA <t> (SignExt32to64 x) (OR <y.Type> y (ADDI <y.Type> [-1] (SLTIU <y.Type> [64] (ZeroExt16to64 y)))))
5040 v.reset(OpRISCV64SRA)
5042 v0 := b.NewValue0(v.Pos, OpSignExt32to64, typ.Int64)
5044 v1 := b.NewValue0(v.Pos, OpRISCV64OR, y.Type)
5045 v2 := b.NewValue0(v.Pos, OpRISCV64ADDI, y.Type)
5046 v2.AuxInt = int64ToAuxInt(-1)
5047 v3 := b.NewValue0(v.Pos, OpRISCV64SLTIU, y.Type)
5048 v3.AuxInt = int64ToAuxInt(64)
5049 v4 := b.NewValue0(v.Pos, OpZeroExt16to64, typ.UInt64)
5058 func rewriteValueRISCV64_OpRsh32x32(v *Value) bool {
5062 typ := &b.Func.Config.Types
5063 // match: (Rsh32x32 <t> x y)
5064 // result: (SRA <t> (SignExt32to64 x) (OR <y.Type> y (ADDI <y.Type> [-1] (SLTIU <y.Type> [64] (ZeroExt32to64 y)))))
5069 v.reset(OpRISCV64SRA)
5071 v0 := b.NewValue0(v.Pos, OpSignExt32to64, typ.Int64)
5073 v1 := b.NewValue0(v.Pos, OpRISCV64OR, y.Type)
5074 v2 := b.NewValue0(v.Pos, OpRISCV64ADDI, y.Type)
5075 v2.AuxInt = int64ToAuxInt(-1)
5076 v3 := b.NewValue0(v.Pos, OpRISCV64SLTIU, y.Type)
5077 v3.AuxInt = int64ToAuxInt(64)
5078 v4 := b.NewValue0(v.Pos, OpZeroExt32to64, typ.UInt64)
5087 func rewriteValueRISCV64_OpRsh32x64(v *Value) bool {
5091 typ := &b.Func.Config.Types
5092 // match: (Rsh32x64 <t> x y)
5093 // result: (SRA <t> (SignExt32to64 x) (OR <y.Type> y (ADDI <y.Type> [-1] (SLTIU <y.Type> [64] y))))
5098 v.reset(OpRISCV64SRA)
5100 v0 := b.NewValue0(v.Pos, OpSignExt32to64, typ.Int64)
5102 v1 := b.NewValue0(v.Pos, OpRISCV64OR, y.Type)
5103 v2 := b.NewValue0(v.Pos, OpRISCV64ADDI, y.Type)
5104 v2.AuxInt = int64ToAuxInt(-1)
5105 v3 := b.NewValue0(v.Pos, OpRISCV64SLTIU, y.Type)
5106 v3.AuxInt = int64ToAuxInt(64)
5114 func rewriteValueRISCV64_OpRsh32x8(v *Value) bool {
5118 typ := &b.Func.Config.Types
5119 // match: (Rsh32x8 <t> x y)
5120 // result: (SRA <t> (SignExt32to64 x) (OR <y.Type> y (ADDI <y.Type> [-1] (SLTIU <y.Type> [64] (ZeroExt8to64 y)))))
5125 v.reset(OpRISCV64SRA)
5127 v0 := b.NewValue0(v.Pos, OpSignExt32to64, typ.Int64)
5129 v1 := b.NewValue0(v.Pos, OpRISCV64OR, y.Type)
5130 v2 := b.NewValue0(v.Pos, OpRISCV64ADDI, y.Type)
5131 v2.AuxInt = int64ToAuxInt(-1)
5132 v3 := b.NewValue0(v.Pos, OpRISCV64SLTIU, y.Type)
5133 v3.AuxInt = int64ToAuxInt(64)
5134 v4 := b.NewValue0(v.Pos, OpZeroExt8to64, typ.UInt64)
5143 func rewriteValueRISCV64_OpRsh64Ux16(v *Value) bool {
5147 typ := &b.Func.Config.Types
5148 // match: (Rsh64Ux16 <t> x y)
5149 // result: (AND (SRL <t> x y) (Neg64 <t> (SLTIU <t> [64] (ZeroExt16to64 y))))
5154 v.reset(OpRISCV64AND)
5155 v0 := b.NewValue0(v.Pos, OpRISCV64SRL, t)
5157 v1 := b.NewValue0(v.Pos, OpNeg64, t)
5158 v2 := b.NewValue0(v.Pos, OpRISCV64SLTIU, t)
5159 v2.AuxInt = int64ToAuxInt(64)
5160 v3 := b.NewValue0(v.Pos, OpZeroExt16to64, typ.UInt64)
5168 func rewriteValueRISCV64_OpRsh64Ux32(v *Value) bool {
5172 typ := &b.Func.Config.Types
5173 // match: (Rsh64Ux32 <t> x y)
5174 // result: (AND (SRL <t> x y) (Neg64 <t> (SLTIU <t> [64] (ZeroExt32to64 y))))
5179 v.reset(OpRISCV64AND)
5180 v0 := b.NewValue0(v.Pos, OpRISCV64SRL, t)
5182 v1 := b.NewValue0(v.Pos, OpNeg64, t)
5183 v2 := b.NewValue0(v.Pos, OpRISCV64SLTIU, t)
5184 v2.AuxInt = int64ToAuxInt(64)
5185 v3 := b.NewValue0(v.Pos, OpZeroExt32to64, typ.UInt64)
5193 func rewriteValueRISCV64_OpRsh64Ux64(v *Value) bool {
5197 // match: (Rsh64Ux64 <t> x y)
5198 // result: (AND (SRL <t> x y) (Neg64 <t> (SLTIU <t> [64] y)))
5203 v.reset(OpRISCV64AND)
5204 v0 := b.NewValue0(v.Pos, OpRISCV64SRL, t)
5206 v1 := b.NewValue0(v.Pos, OpNeg64, t)
5207 v2 := b.NewValue0(v.Pos, OpRISCV64SLTIU, t)
5208 v2.AuxInt = int64ToAuxInt(64)
5215 func rewriteValueRISCV64_OpRsh64Ux8(v *Value) bool {
5219 typ := &b.Func.Config.Types
5220 // match: (Rsh64Ux8 <t> x y)
5221 // result: (AND (SRL <t> x y) (Neg64 <t> (SLTIU <t> [64] (ZeroExt8to64 y))))
5226 v.reset(OpRISCV64AND)
5227 v0 := b.NewValue0(v.Pos, OpRISCV64SRL, t)
5229 v1 := b.NewValue0(v.Pos, OpNeg64, t)
5230 v2 := b.NewValue0(v.Pos, OpRISCV64SLTIU, t)
5231 v2.AuxInt = int64ToAuxInt(64)
5232 v3 := b.NewValue0(v.Pos, OpZeroExt8to64, typ.UInt64)
5240 func rewriteValueRISCV64_OpRsh64x16(v *Value) bool {
5244 typ := &b.Func.Config.Types
5245 // match: (Rsh64x16 <t> x y)
5246 // result: (SRA <t> x (OR <y.Type> y (ADDI <y.Type> [-1] (SLTIU <y.Type> [64] (ZeroExt16to64 y)))))
5251 v.reset(OpRISCV64SRA)
5253 v0 := b.NewValue0(v.Pos, OpRISCV64OR, y.Type)
5254 v1 := b.NewValue0(v.Pos, OpRISCV64ADDI, y.Type)
5255 v1.AuxInt = int64ToAuxInt(-1)
5256 v2 := b.NewValue0(v.Pos, OpRISCV64SLTIU, y.Type)
5257 v2.AuxInt = int64ToAuxInt(64)
5258 v3 := b.NewValue0(v.Pos, OpZeroExt16to64, typ.UInt64)
5267 func rewriteValueRISCV64_OpRsh64x32(v *Value) bool {
5271 typ := &b.Func.Config.Types
5272 // match: (Rsh64x32 <t> x y)
5273 // result: (SRA <t> x (OR <y.Type> y (ADDI <y.Type> [-1] (SLTIU <y.Type> [64] (ZeroExt32to64 y)))))
5278 v.reset(OpRISCV64SRA)
5280 v0 := b.NewValue0(v.Pos, OpRISCV64OR, y.Type)
5281 v1 := b.NewValue0(v.Pos, OpRISCV64ADDI, y.Type)
5282 v1.AuxInt = int64ToAuxInt(-1)
5283 v2 := b.NewValue0(v.Pos, OpRISCV64SLTIU, y.Type)
5284 v2.AuxInt = int64ToAuxInt(64)
5285 v3 := b.NewValue0(v.Pos, OpZeroExt32to64, typ.UInt64)
5294 func rewriteValueRISCV64_OpRsh64x64(v *Value) bool {
5298 // match: (Rsh64x64 <t> x y)
5299 // result: (SRA <t> x (OR <y.Type> y (ADDI <y.Type> [-1] (SLTIU <y.Type> [64] y))))
5304 v.reset(OpRISCV64SRA)
5306 v0 := b.NewValue0(v.Pos, OpRISCV64OR, y.Type)
5307 v1 := b.NewValue0(v.Pos, OpRISCV64ADDI, y.Type)
5308 v1.AuxInt = int64ToAuxInt(-1)
5309 v2 := b.NewValue0(v.Pos, OpRISCV64SLTIU, y.Type)
5310 v2.AuxInt = int64ToAuxInt(64)
5318 func rewriteValueRISCV64_OpRsh64x8(v *Value) bool {
5322 typ := &b.Func.Config.Types
5323 // match: (Rsh64x8 <t> x y)
5324 // result: (SRA <t> x (OR <y.Type> y (ADDI <y.Type> [-1] (SLTIU <y.Type> [64] (ZeroExt8to64 y)))))
5329 v.reset(OpRISCV64SRA)
5331 v0 := b.NewValue0(v.Pos, OpRISCV64OR, y.Type)
5332 v1 := b.NewValue0(v.Pos, OpRISCV64ADDI, y.Type)
5333 v1.AuxInt = int64ToAuxInt(-1)
5334 v2 := b.NewValue0(v.Pos, OpRISCV64SLTIU, y.Type)
5335 v2.AuxInt = int64ToAuxInt(64)
5336 v3 := b.NewValue0(v.Pos, OpZeroExt8to64, typ.UInt64)
5345 func rewriteValueRISCV64_OpRsh8Ux16(v *Value) bool {
5349 typ := &b.Func.Config.Types
5350 // match: (Rsh8Ux16 <t> x y)
5351 // result: (AND (SRL <t> (ZeroExt8to64 x) y) (Neg8 <t> (SLTIU <t> [64] (ZeroExt16to64 y))))
5356 v.reset(OpRISCV64AND)
5357 v0 := b.NewValue0(v.Pos, OpRISCV64SRL, t)
5358 v1 := b.NewValue0(v.Pos, OpZeroExt8to64, typ.UInt64)
5361 v2 := b.NewValue0(v.Pos, OpNeg8, t)
5362 v3 := b.NewValue0(v.Pos, OpRISCV64SLTIU, t)
5363 v3.AuxInt = int64ToAuxInt(64)
5364 v4 := b.NewValue0(v.Pos, OpZeroExt16to64, typ.UInt64)
5372 func rewriteValueRISCV64_OpRsh8Ux32(v *Value) bool {
5376 typ := &b.Func.Config.Types
5377 // match: (Rsh8Ux32 <t> x y)
5378 // result: (AND (SRL <t> (ZeroExt8to64 x) y) (Neg8 <t> (SLTIU <t> [64] (ZeroExt32to64 y))))
5383 v.reset(OpRISCV64AND)
5384 v0 := b.NewValue0(v.Pos, OpRISCV64SRL, t)
5385 v1 := b.NewValue0(v.Pos, OpZeroExt8to64, typ.UInt64)
5388 v2 := b.NewValue0(v.Pos, OpNeg8, t)
5389 v3 := b.NewValue0(v.Pos, OpRISCV64SLTIU, t)
5390 v3.AuxInt = int64ToAuxInt(64)
5391 v4 := b.NewValue0(v.Pos, OpZeroExt32to64, typ.UInt64)
5399 func rewriteValueRISCV64_OpRsh8Ux64(v *Value) bool {
5403 typ := &b.Func.Config.Types
5404 // match: (Rsh8Ux64 <t> x y)
5405 // result: (AND (SRL <t> (ZeroExt8to64 x) y) (Neg8 <t> (SLTIU <t> [64] y)))
5410 v.reset(OpRISCV64AND)
5411 v0 := b.NewValue0(v.Pos, OpRISCV64SRL, t)
5412 v1 := b.NewValue0(v.Pos, OpZeroExt8to64, typ.UInt64)
5415 v2 := b.NewValue0(v.Pos, OpNeg8, t)
5416 v3 := b.NewValue0(v.Pos, OpRISCV64SLTIU, t)
5417 v3.AuxInt = int64ToAuxInt(64)
5424 func rewriteValueRISCV64_OpRsh8Ux8(v *Value) bool {
5428 typ := &b.Func.Config.Types
5429 // match: (Rsh8Ux8 <t> x y)
5430 // result: (AND (SRL <t> (ZeroExt8to64 x) y) (Neg8 <t> (SLTIU <t> [64] (ZeroExt8to64 y))))
5435 v.reset(OpRISCV64AND)
5436 v0 := b.NewValue0(v.Pos, OpRISCV64SRL, t)
5437 v1 := b.NewValue0(v.Pos, OpZeroExt8to64, typ.UInt64)
5440 v2 := b.NewValue0(v.Pos, OpNeg8, t)
5441 v3 := b.NewValue0(v.Pos, OpRISCV64SLTIU, t)
5442 v3.AuxInt = int64ToAuxInt(64)
5443 v4 := b.NewValue0(v.Pos, OpZeroExt8to64, typ.UInt64)
5451 func rewriteValueRISCV64_OpRsh8x16(v *Value) bool {
5455 typ := &b.Func.Config.Types
5456 // match: (Rsh8x16 <t> x y)
5457 // result: (SRA <t> (SignExt8to64 x) (OR <y.Type> y (ADDI <y.Type> [-1] (SLTIU <y.Type> [64] (ZeroExt16to64 y)))))
5462 v.reset(OpRISCV64SRA)
5464 v0 := b.NewValue0(v.Pos, OpSignExt8to64, typ.Int64)
5466 v1 := b.NewValue0(v.Pos, OpRISCV64OR, y.Type)
5467 v2 := b.NewValue0(v.Pos, OpRISCV64ADDI, y.Type)
5468 v2.AuxInt = int64ToAuxInt(-1)
5469 v3 := b.NewValue0(v.Pos, OpRISCV64SLTIU, y.Type)
5470 v3.AuxInt = int64ToAuxInt(64)
5471 v4 := b.NewValue0(v.Pos, OpZeroExt16to64, typ.UInt64)
5480 func rewriteValueRISCV64_OpRsh8x32(v *Value) bool {
5484 typ := &b.Func.Config.Types
5485 // match: (Rsh8x32 <t> x y)
5486 // result: (SRA <t> (SignExt8to64 x) (OR <y.Type> y (ADDI <y.Type> [-1] (SLTIU <y.Type> [64] (ZeroExt32to64 y)))))
5491 v.reset(OpRISCV64SRA)
5493 v0 := b.NewValue0(v.Pos, OpSignExt8to64, typ.Int64)
5495 v1 := b.NewValue0(v.Pos, OpRISCV64OR, y.Type)
5496 v2 := b.NewValue0(v.Pos, OpRISCV64ADDI, y.Type)
5497 v2.AuxInt = int64ToAuxInt(-1)
5498 v3 := b.NewValue0(v.Pos, OpRISCV64SLTIU, y.Type)
5499 v3.AuxInt = int64ToAuxInt(64)
5500 v4 := b.NewValue0(v.Pos, OpZeroExt32to64, typ.UInt64)
5509 func rewriteValueRISCV64_OpRsh8x64(v *Value) bool {
5513 typ := &b.Func.Config.Types
5514 // match: (Rsh8x64 <t> x y)
5515 // result: (SRA <t> (SignExt8to64 x) (OR <y.Type> y (ADDI <y.Type> [-1] (SLTIU <y.Type> [64] y))))
5520 v.reset(OpRISCV64SRA)
5522 v0 := b.NewValue0(v.Pos, OpSignExt8to64, typ.Int64)
5524 v1 := b.NewValue0(v.Pos, OpRISCV64OR, y.Type)
5525 v2 := b.NewValue0(v.Pos, OpRISCV64ADDI, y.Type)
5526 v2.AuxInt = int64ToAuxInt(-1)
5527 v3 := b.NewValue0(v.Pos, OpRISCV64SLTIU, y.Type)
5528 v3.AuxInt = int64ToAuxInt(64)
5536 func rewriteValueRISCV64_OpRsh8x8(v *Value) bool {
5540 typ := &b.Func.Config.Types
5541 // match: (Rsh8x8 <t> x y)
5542 // result: (SRA <t> (SignExt8to64 x) (OR <y.Type> y (ADDI <y.Type> [-1] (SLTIU <y.Type> [64] (ZeroExt8to64 y)))))
5547 v.reset(OpRISCV64SRA)
5549 v0 := b.NewValue0(v.Pos, OpSignExt8to64, typ.Int64)
5551 v1 := b.NewValue0(v.Pos, OpRISCV64OR, y.Type)
5552 v2 := b.NewValue0(v.Pos, OpRISCV64ADDI, y.Type)
5553 v2.AuxInt = int64ToAuxInt(-1)
5554 v3 := b.NewValue0(v.Pos, OpRISCV64SLTIU, y.Type)
5555 v3.AuxInt = int64ToAuxInt(64)
5556 v4 := b.NewValue0(v.Pos, OpZeroExt8to64, typ.UInt64)
5565 func rewriteValueRISCV64_OpSlicemask(v *Value) bool {
5568 // match: (Slicemask <t> x)
5569 // result: (NOT (SRAI <t> [63] (ADDI <t> [-1] x)))
5573 v.reset(OpRISCV64NOT)
5574 v0 := b.NewValue0(v.Pos, OpRISCV64SRAI, t)
5575 v0.AuxInt = int64ToAuxInt(63)
5576 v1 := b.NewValue0(v.Pos, OpRISCV64ADDI, t)
5577 v1.AuxInt = int64ToAuxInt(-1)
5584 func rewriteValueRISCV64_OpStore(v *Value) bool {
5588 // match: (Store {t} ptr val mem)
5589 // cond: t.Size() == 1
5590 // result: (MOVBstore ptr val mem)
5592 t := auxToType(v.Aux)
5596 if !(t.Size() == 1) {
5599 v.reset(OpRISCV64MOVBstore)
5600 v.AddArg3(ptr, val, mem)
5603 // match: (Store {t} ptr val mem)
5604 // cond: t.Size() == 2
5605 // result: (MOVHstore ptr val mem)
5607 t := auxToType(v.Aux)
5611 if !(t.Size() == 2) {
5614 v.reset(OpRISCV64MOVHstore)
5615 v.AddArg3(ptr, val, mem)
5618 // match: (Store {t} ptr val mem)
5619 // cond: t.Size() == 4 && !is32BitFloat(val.Type)
5620 // result: (MOVWstore ptr val mem)
5622 t := auxToType(v.Aux)
5626 if !(t.Size() == 4 && !is32BitFloat(val.Type)) {
5629 v.reset(OpRISCV64MOVWstore)
5630 v.AddArg3(ptr, val, mem)
5633 // match: (Store {t} ptr val mem)
5634 // cond: t.Size() == 8 && !is64BitFloat(val.Type)
5635 // result: (MOVDstore ptr val mem)
5637 t := auxToType(v.Aux)
5641 if !(t.Size() == 8 && !is64BitFloat(val.Type)) {
5644 v.reset(OpRISCV64MOVDstore)
5645 v.AddArg3(ptr, val, mem)
5648 // match: (Store {t} ptr val mem)
5649 // cond: t.Size() == 4 && is32BitFloat(val.Type)
5650 // result: (FMOVWstore ptr val mem)
5652 t := auxToType(v.Aux)
5656 if !(t.Size() == 4 && is32BitFloat(val.Type)) {
5659 v.reset(OpRISCV64FMOVWstore)
5660 v.AddArg3(ptr, val, mem)
5663 // match: (Store {t} ptr val mem)
5664 // cond: t.Size() == 8 && is64BitFloat(val.Type)
5665 // result: (FMOVDstore ptr val mem)
5667 t := auxToType(v.Aux)
5671 if !(t.Size() == 8 && is64BitFloat(val.Type)) {
5674 v.reset(OpRISCV64FMOVDstore)
5675 v.AddArg3(ptr, val, mem)
5680 func rewriteValueRISCV64_OpZero(v *Value) bool {
5684 config := b.Func.Config
5685 typ := &b.Func.Config.Types
5686 // match: (Zero [0] _ mem)
5689 if auxIntToInt64(v.AuxInt) != 0 {
5696 // match: (Zero [1] ptr mem)
5697 // result: (MOVBstore ptr (MOVDconst [0]) mem)
5699 if auxIntToInt64(v.AuxInt) != 1 {
5704 v.reset(OpRISCV64MOVBstore)
5705 v0 := b.NewValue0(v.Pos, OpRISCV64MOVDconst, typ.UInt64)
5706 v0.AuxInt = int64ToAuxInt(0)
5707 v.AddArg3(ptr, v0, mem)
5710 // match: (Zero [2] {t} ptr mem)
5711 // cond: t.Alignment()%2 == 0
5712 // result: (MOVHstore ptr (MOVDconst [0]) mem)
5714 if auxIntToInt64(v.AuxInt) != 2 {
5717 t := auxToType(v.Aux)
5720 if !(t.Alignment()%2 == 0) {
5723 v.reset(OpRISCV64MOVHstore)
5724 v0 := b.NewValue0(v.Pos, OpRISCV64MOVDconst, typ.UInt64)
5725 v0.AuxInt = int64ToAuxInt(0)
5726 v.AddArg3(ptr, v0, mem)
5729 // match: (Zero [2] ptr mem)
5730 // result: (MOVBstore [1] ptr (MOVDconst [0]) (MOVBstore ptr (MOVDconst [0]) mem))
5732 if auxIntToInt64(v.AuxInt) != 2 {
5737 v.reset(OpRISCV64MOVBstore)
5738 v.AuxInt = int32ToAuxInt(1)
5739 v0 := b.NewValue0(v.Pos, OpRISCV64MOVDconst, typ.UInt64)
5740 v0.AuxInt = int64ToAuxInt(0)
5741 v1 := b.NewValue0(v.Pos, OpRISCV64MOVBstore, types.TypeMem)
5742 v1.AddArg3(ptr, v0, mem)
5743 v.AddArg3(ptr, v0, v1)
5746 // match: (Zero [4] {t} ptr mem)
5747 // cond: t.Alignment()%4 == 0
5748 // result: (MOVWstore ptr (MOVDconst [0]) mem)
5750 if auxIntToInt64(v.AuxInt) != 4 {
5753 t := auxToType(v.Aux)
5756 if !(t.Alignment()%4 == 0) {
5759 v.reset(OpRISCV64MOVWstore)
5760 v0 := b.NewValue0(v.Pos, OpRISCV64MOVDconst, typ.UInt64)
5761 v0.AuxInt = int64ToAuxInt(0)
5762 v.AddArg3(ptr, v0, mem)
5765 // match: (Zero [4] {t} ptr mem)
5766 // cond: t.Alignment()%2 == 0
5767 // result: (MOVHstore [2] ptr (MOVDconst [0]) (MOVHstore ptr (MOVDconst [0]) mem))
5769 if auxIntToInt64(v.AuxInt) != 4 {
5772 t := auxToType(v.Aux)
5775 if !(t.Alignment()%2 == 0) {
5778 v.reset(OpRISCV64MOVHstore)
5779 v.AuxInt = int32ToAuxInt(2)
5780 v0 := b.NewValue0(v.Pos, OpRISCV64MOVDconst, typ.UInt64)
5781 v0.AuxInt = int64ToAuxInt(0)
5782 v1 := b.NewValue0(v.Pos, OpRISCV64MOVHstore, types.TypeMem)
5783 v1.AddArg3(ptr, v0, mem)
5784 v.AddArg3(ptr, v0, v1)
5787 // match: (Zero [4] ptr mem)
5788 // result: (MOVBstore [3] ptr (MOVDconst [0]) (MOVBstore [2] ptr (MOVDconst [0]) (MOVBstore [1] ptr (MOVDconst [0]) (MOVBstore ptr (MOVDconst [0]) mem))))
5790 if auxIntToInt64(v.AuxInt) != 4 {
5795 v.reset(OpRISCV64MOVBstore)
5796 v.AuxInt = int32ToAuxInt(3)
5797 v0 := b.NewValue0(v.Pos, OpRISCV64MOVDconst, typ.UInt64)
5798 v0.AuxInt = int64ToAuxInt(0)
5799 v1 := b.NewValue0(v.Pos, OpRISCV64MOVBstore, types.TypeMem)
5800 v1.AuxInt = int32ToAuxInt(2)
5801 v2 := b.NewValue0(v.Pos, OpRISCV64MOVBstore, types.TypeMem)
5802 v2.AuxInt = int32ToAuxInt(1)
5803 v3 := b.NewValue0(v.Pos, OpRISCV64MOVBstore, types.TypeMem)
5804 v3.AddArg3(ptr, v0, mem)
5805 v2.AddArg3(ptr, v0, v3)
5806 v1.AddArg3(ptr, v0, v2)
5807 v.AddArg3(ptr, v0, v1)
5810 // match: (Zero [8] {t} ptr mem)
5811 // cond: t.Alignment()%8 == 0
5812 // result: (MOVDstore ptr (MOVDconst [0]) mem)
5814 if auxIntToInt64(v.AuxInt) != 8 {
5817 t := auxToType(v.Aux)
5820 if !(t.Alignment()%8 == 0) {
5823 v.reset(OpRISCV64MOVDstore)
5824 v0 := b.NewValue0(v.Pos, OpRISCV64MOVDconst, typ.UInt64)
5825 v0.AuxInt = int64ToAuxInt(0)
5826 v.AddArg3(ptr, v0, mem)
5829 // match: (Zero [8] {t} ptr mem)
5830 // cond: t.Alignment()%4 == 0
5831 // result: (MOVWstore [4] ptr (MOVDconst [0]) (MOVWstore ptr (MOVDconst [0]) mem))
5833 if auxIntToInt64(v.AuxInt) != 8 {
5836 t := auxToType(v.Aux)
5839 if !(t.Alignment()%4 == 0) {
5842 v.reset(OpRISCV64MOVWstore)
5843 v.AuxInt = int32ToAuxInt(4)
5844 v0 := b.NewValue0(v.Pos, OpRISCV64MOVDconst, typ.UInt64)
5845 v0.AuxInt = int64ToAuxInt(0)
5846 v1 := b.NewValue0(v.Pos, OpRISCV64MOVWstore, types.TypeMem)
5847 v1.AddArg3(ptr, v0, mem)
5848 v.AddArg3(ptr, v0, v1)
5851 // match: (Zero [8] {t} ptr mem)
5852 // cond: t.Alignment()%2 == 0
5853 // result: (MOVHstore [6] ptr (MOVDconst [0]) (MOVHstore [4] ptr (MOVDconst [0]) (MOVHstore [2] ptr (MOVDconst [0]) (MOVHstore ptr (MOVDconst [0]) mem))))
5855 if auxIntToInt64(v.AuxInt) != 8 {
5858 t := auxToType(v.Aux)
5861 if !(t.Alignment()%2 == 0) {
5864 v.reset(OpRISCV64MOVHstore)
5865 v.AuxInt = int32ToAuxInt(6)
5866 v0 := b.NewValue0(v.Pos, OpRISCV64MOVDconst, typ.UInt64)
5867 v0.AuxInt = int64ToAuxInt(0)
5868 v1 := b.NewValue0(v.Pos, OpRISCV64MOVHstore, types.TypeMem)
5869 v1.AuxInt = int32ToAuxInt(4)
5870 v2 := b.NewValue0(v.Pos, OpRISCV64MOVHstore, types.TypeMem)
5871 v2.AuxInt = int32ToAuxInt(2)
5872 v3 := b.NewValue0(v.Pos, OpRISCV64MOVHstore, types.TypeMem)
5873 v3.AddArg3(ptr, v0, mem)
5874 v2.AddArg3(ptr, v0, v3)
5875 v1.AddArg3(ptr, v0, v2)
5876 v.AddArg3(ptr, v0, v1)
5879 // match: (Zero [3] ptr mem)
5880 // result: (MOVBstore [2] ptr (MOVDconst [0]) (MOVBstore [1] ptr (MOVDconst [0]) (MOVBstore ptr (MOVDconst [0]) mem)))
5882 if auxIntToInt64(v.AuxInt) != 3 {
5887 v.reset(OpRISCV64MOVBstore)
5888 v.AuxInt = int32ToAuxInt(2)
5889 v0 := b.NewValue0(v.Pos, OpRISCV64MOVDconst, typ.UInt64)
5890 v0.AuxInt = int64ToAuxInt(0)
5891 v1 := b.NewValue0(v.Pos, OpRISCV64MOVBstore, types.TypeMem)
5892 v1.AuxInt = int32ToAuxInt(1)
5893 v2 := b.NewValue0(v.Pos, OpRISCV64MOVBstore, types.TypeMem)
5894 v2.AddArg3(ptr, v0, mem)
5895 v1.AddArg3(ptr, v0, v2)
5896 v.AddArg3(ptr, v0, v1)
5899 // match: (Zero [6] {t} ptr mem)
5900 // cond: t.Alignment()%2 == 0
5901 // result: (MOVHstore [4] ptr (MOVDconst [0]) (MOVHstore [2] ptr (MOVDconst [0]) (MOVHstore ptr (MOVDconst [0]) mem)))
5903 if auxIntToInt64(v.AuxInt) != 6 {
5906 t := auxToType(v.Aux)
5909 if !(t.Alignment()%2 == 0) {
5912 v.reset(OpRISCV64MOVHstore)
5913 v.AuxInt = int32ToAuxInt(4)
5914 v0 := b.NewValue0(v.Pos, OpRISCV64MOVDconst, typ.UInt64)
5915 v0.AuxInt = int64ToAuxInt(0)
5916 v1 := b.NewValue0(v.Pos, OpRISCV64MOVHstore, types.TypeMem)
5917 v1.AuxInt = int32ToAuxInt(2)
5918 v2 := b.NewValue0(v.Pos, OpRISCV64MOVHstore, types.TypeMem)
5919 v2.AddArg3(ptr, v0, mem)
5920 v1.AddArg3(ptr, v0, v2)
5921 v.AddArg3(ptr, v0, v1)
5924 // match: (Zero [12] {t} ptr mem)
5925 // cond: t.Alignment()%4 == 0
5926 // result: (MOVWstore [8] ptr (MOVDconst [0]) (MOVWstore [4] ptr (MOVDconst [0]) (MOVWstore ptr (MOVDconst [0]) mem)))
5928 if auxIntToInt64(v.AuxInt) != 12 {
5931 t := auxToType(v.Aux)
5934 if !(t.Alignment()%4 == 0) {
5937 v.reset(OpRISCV64MOVWstore)
5938 v.AuxInt = int32ToAuxInt(8)
5939 v0 := b.NewValue0(v.Pos, OpRISCV64MOVDconst, typ.UInt64)
5940 v0.AuxInt = int64ToAuxInt(0)
5941 v1 := b.NewValue0(v.Pos, OpRISCV64MOVWstore, types.TypeMem)
5942 v1.AuxInt = int32ToAuxInt(4)
5943 v2 := b.NewValue0(v.Pos, OpRISCV64MOVWstore, types.TypeMem)
5944 v2.AddArg3(ptr, v0, mem)
5945 v1.AddArg3(ptr, v0, v2)
5946 v.AddArg3(ptr, v0, v1)
5949 // match: (Zero [16] {t} ptr mem)
5950 // cond: t.Alignment()%8 == 0
5951 // result: (MOVDstore [8] ptr (MOVDconst [0]) (MOVDstore ptr (MOVDconst [0]) mem))
5953 if auxIntToInt64(v.AuxInt) != 16 {
5956 t := auxToType(v.Aux)
5959 if !(t.Alignment()%8 == 0) {
5962 v.reset(OpRISCV64MOVDstore)
5963 v.AuxInt = int32ToAuxInt(8)
5964 v0 := b.NewValue0(v.Pos, OpRISCV64MOVDconst, typ.UInt64)
5965 v0.AuxInt = int64ToAuxInt(0)
5966 v1 := b.NewValue0(v.Pos, OpRISCV64MOVDstore, types.TypeMem)
5967 v1.AddArg3(ptr, v0, mem)
5968 v.AddArg3(ptr, v0, v1)
5971 // match: (Zero [24] {t} ptr mem)
5972 // cond: t.Alignment()%8 == 0
5973 // result: (MOVDstore [16] ptr (MOVDconst [0]) (MOVDstore [8] ptr (MOVDconst [0]) (MOVDstore ptr (MOVDconst [0]) mem)))
5975 if auxIntToInt64(v.AuxInt) != 24 {
5978 t := auxToType(v.Aux)
5981 if !(t.Alignment()%8 == 0) {
5984 v.reset(OpRISCV64MOVDstore)
5985 v.AuxInt = int32ToAuxInt(16)
5986 v0 := b.NewValue0(v.Pos, OpRISCV64MOVDconst, typ.UInt64)
5987 v0.AuxInt = int64ToAuxInt(0)
5988 v1 := b.NewValue0(v.Pos, OpRISCV64MOVDstore, types.TypeMem)
5989 v1.AuxInt = int32ToAuxInt(8)
5990 v2 := b.NewValue0(v.Pos, OpRISCV64MOVDstore, types.TypeMem)
5991 v2.AddArg3(ptr, v0, mem)
5992 v1.AddArg3(ptr, v0, v2)
5993 v.AddArg3(ptr, v0, v1)
5996 // match: (Zero [32] {t} ptr mem)
5997 // cond: t.Alignment()%8 == 0
5998 // result: (MOVDstore [24] ptr (MOVDconst [0]) (MOVDstore [16] ptr (MOVDconst [0]) (MOVDstore [8] ptr (MOVDconst [0]) (MOVDstore ptr (MOVDconst [0]) mem))))
6000 if auxIntToInt64(v.AuxInt) != 32 {
6003 t := auxToType(v.Aux)
6006 if !(t.Alignment()%8 == 0) {
6009 v.reset(OpRISCV64MOVDstore)
6010 v.AuxInt = int32ToAuxInt(24)
6011 v0 := b.NewValue0(v.Pos, OpRISCV64MOVDconst, typ.UInt64)
6012 v0.AuxInt = int64ToAuxInt(0)
6013 v1 := b.NewValue0(v.Pos, OpRISCV64MOVDstore, types.TypeMem)
6014 v1.AuxInt = int32ToAuxInt(16)
6015 v2 := b.NewValue0(v.Pos, OpRISCV64MOVDstore, types.TypeMem)
6016 v2.AuxInt = int32ToAuxInt(8)
6017 v3 := b.NewValue0(v.Pos, OpRISCV64MOVDstore, types.TypeMem)
6018 v3.AddArg3(ptr, v0, mem)
6019 v2.AddArg3(ptr, v0, v3)
6020 v1.AddArg3(ptr, v0, v2)
6021 v.AddArg3(ptr, v0, v1)
6024 // match: (Zero [s] {t} ptr mem)
6025 // cond: s%8 == 0 && s <= 8*128 && t.Alignment()%8 == 0 && !config.noDuffDevice
6026 // result: (DUFFZERO [8 * (128 - s/8)] ptr mem)
6028 s := auxIntToInt64(v.AuxInt)
6029 t := auxToType(v.Aux)
6032 if !(s%8 == 0 && s <= 8*128 && t.Alignment()%8 == 0 && !config.noDuffDevice) {
6035 v.reset(OpRISCV64DUFFZERO)
6036 v.AuxInt = int64ToAuxInt(8 * (128 - s/8))
6040 // match: (Zero [s] {t} ptr mem)
6041 // result: (LoweredZero [t.Alignment()] ptr (ADD <ptr.Type> ptr (MOVDconst [s-moveSize(t.Alignment(), config)])) mem)
6043 s := auxIntToInt64(v.AuxInt)
6044 t := auxToType(v.Aux)
6047 v.reset(OpRISCV64LoweredZero)
6048 v.AuxInt = int64ToAuxInt(t.Alignment())
6049 v0 := b.NewValue0(v.Pos, OpRISCV64ADD, ptr.Type)
6050 v1 := b.NewValue0(v.Pos, OpRISCV64MOVDconst, typ.UInt64)
6051 v1.AuxInt = int64ToAuxInt(s - moveSize(t.Alignment(), config))
6053 v.AddArg3(ptr, v0, mem)
6057 func rewriteBlockRISCV64(b *Block) bool {
6059 case BlockRISCV64BEQ:
6060 // match: (BEQ (MOVDconst [0]) cond yes no)
6061 // result: (BEQZ cond yes no)
6062 for b.Controls[0].Op == OpRISCV64MOVDconst {
6063 v_0 := b.Controls[0]
6064 if auxIntToInt64(v_0.AuxInt) != 0 {
6067 cond := b.Controls[1]
6068 b.resetWithControl(BlockRISCV64BEQZ, cond)
6071 // match: (BEQ cond (MOVDconst [0]) yes no)
6072 // result: (BEQZ cond yes no)
6073 for b.Controls[1].Op == OpRISCV64MOVDconst {
6074 cond := b.Controls[0]
6075 v_1 := b.Controls[1]
6076 if auxIntToInt64(v_1.AuxInt) != 0 {
6079 b.resetWithControl(BlockRISCV64BEQZ, cond)
6082 case BlockRISCV64BEQZ:
6083 // match: (BEQZ (SEQZ x) yes no)
6084 // result: (BNEZ x yes no)
6085 for b.Controls[0].Op == OpRISCV64SEQZ {
6086 v_0 := b.Controls[0]
6088 b.resetWithControl(BlockRISCV64BNEZ, x)
6091 // match: (BEQZ (SNEZ x) yes no)
6092 // result: (BEQZ x yes no)
6093 for b.Controls[0].Op == OpRISCV64SNEZ {
6094 v_0 := b.Controls[0]
6096 b.resetWithControl(BlockRISCV64BEQZ, x)
6099 // match: (BEQZ (SUB x y) yes no)
6100 // result: (BEQ x y yes no)
6101 for b.Controls[0].Op == OpRISCV64SUB {
6102 v_0 := b.Controls[0]
6105 b.resetWithControl2(BlockRISCV64BEQ, x, y)
6108 // match: (BEQZ (SLT x y) yes no)
6109 // result: (BGE x y yes no)
6110 for b.Controls[0].Op == OpRISCV64SLT {
6111 v_0 := b.Controls[0]
6114 b.resetWithControl2(BlockRISCV64BGE, x, y)
6117 // match: (BEQZ (SLTU x y) yes no)
6118 // result: (BGEU x y yes no)
6119 for b.Controls[0].Op == OpRISCV64SLTU {
6120 v_0 := b.Controls[0]
6123 b.resetWithControl2(BlockRISCV64BGEU, x, y)
6126 case BlockRISCV64BNE:
6127 // match: (BNE (MOVDconst [0]) cond yes no)
6128 // result: (BNEZ cond yes no)
6129 for b.Controls[0].Op == OpRISCV64MOVDconst {
6130 v_0 := b.Controls[0]
6131 if auxIntToInt64(v_0.AuxInt) != 0 {
6134 cond := b.Controls[1]
6135 b.resetWithControl(BlockRISCV64BNEZ, cond)
6138 // match: (BNE cond (MOVDconst [0]) yes no)
6139 // result: (BNEZ cond yes no)
6140 for b.Controls[1].Op == OpRISCV64MOVDconst {
6141 cond := b.Controls[0]
6142 v_1 := b.Controls[1]
6143 if auxIntToInt64(v_1.AuxInt) != 0 {
6146 b.resetWithControl(BlockRISCV64BNEZ, cond)
6149 case BlockRISCV64BNEZ:
6150 // match: (BNEZ (SEQZ x) yes no)
6151 // result: (BEQZ x yes no)
6152 for b.Controls[0].Op == OpRISCV64SEQZ {
6153 v_0 := b.Controls[0]
6155 b.resetWithControl(BlockRISCV64BEQZ, x)
6158 // match: (BNEZ (SNEZ x) yes no)
6159 // result: (BNEZ x yes no)
6160 for b.Controls[0].Op == OpRISCV64SNEZ {
6161 v_0 := b.Controls[0]
6163 b.resetWithControl(BlockRISCV64BNEZ, x)
6166 // match: (BNEZ (SUB x y) yes no)
6167 // result: (BNE x y yes no)
6168 for b.Controls[0].Op == OpRISCV64SUB {
6169 v_0 := b.Controls[0]
6172 b.resetWithControl2(BlockRISCV64BNE, x, y)
6175 // match: (BNEZ (SLT x y) yes no)
6176 // result: (BLT x y yes no)
6177 for b.Controls[0].Op == OpRISCV64SLT {
6178 v_0 := b.Controls[0]
6181 b.resetWithControl2(BlockRISCV64BLT, x, y)
6184 // match: (BNEZ (SLTU x y) yes no)
6185 // result: (BLTU x y yes no)
6186 for b.Controls[0].Op == OpRISCV64SLTU {
6187 v_0 := b.Controls[0]
6190 b.resetWithControl2(BlockRISCV64BLTU, x, y)
6194 // match: (If cond yes no)
6195 // result: (BNEZ cond yes no)
6197 cond := b.Controls[0]
6198 b.resetWithControl(BlockRISCV64BNEZ, cond)