mirror of
				https://github.com/golang/go.git
				synced 2025-11-04 02:30:57 +00:00 
			
		
		
		
	cmd/internal/obj/riscv: add support for vector reduction instructions
Add support for vector reduction instructions to the RISC-V assembler, including single-width integer reduction, widening integer reduction, single-width floating-point reduction and widening floating-point reduction. Change-Id: I8f17bef11389f3a017e0430275023fc5d75936e3 Reviewed-on: https://go-review.googlesource.com/c/go/+/646778 Reviewed-by: Meng Zhuo <mengzhuo1203@gmail.com> Reviewed-by: Mark Ryan <markdryan@rivosinc.com> LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com> Reviewed-by: Carlos Amedee <carlos@golang.org> Reviewed-by: Dmitri Shuralyov <dmitshur@google.com>
This commit is contained in:
		
							parent
							
								
									7785528c50
								
							
						
					
					
						commit
						2e60916f6e
					
				
					 4 changed files with 98 additions and 1 deletions
				
			
		
							
								
								
									
										40
									
								
								src/cmd/asm/internal/asm/testdata/riscv64.s
									
										
									
									
										vendored
									
									
								
							
							
						
						
									
										40
									
								
								src/cmd/asm/internal/asm/testdata/riscv64.s
									
										
									
									
										vendored
									
									
								
							| 
						 | 
					@ -1161,6 +1161,46 @@ start:
 | 
				
			||||||
	VFNCVTRODFFW	V2, V3				// d7912a4a
 | 
						VFNCVTRODFFW	V2, V3				// d7912a4a
 | 
				
			||||||
	VFNCVTRODFFW	V2, V0, V3			// d7912a48
 | 
						VFNCVTRODFFW	V2, V0, V3			// d7912a48
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// 31.14.1: Vector Single-Width Integer Reduction Instructions
 | 
				
			||||||
 | 
						VREDSUMVS	V1, V2, V3			// d7a12002
 | 
				
			||||||
 | 
						VREDSUMVS	V1, V2, V0, V3			// d7a12000
 | 
				
			||||||
 | 
						VREDMAXUVS	V1, V2, V3			// d7a1201a
 | 
				
			||||||
 | 
						VREDMAXUVS	V1, V2, V0, V3			// d7a12018
 | 
				
			||||||
 | 
						VREDMAXVS	V1, V2, V3			// d7a1201e
 | 
				
			||||||
 | 
						VREDMAXVS	V1, V2, V0, V3			// d7a1201c
 | 
				
			||||||
 | 
						VREDMINUVS	V1, V2, V3			// d7a12012
 | 
				
			||||||
 | 
						VREDMINUVS	V1, V2, V0, V3			// d7a12010
 | 
				
			||||||
 | 
						VREDMINVS	V1, V2, V3			// d7a12016
 | 
				
			||||||
 | 
						VREDMINVS	V1, V2, V0, V3			// d7a12014
 | 
				
			||||||
 | 
						VREDANDVS	V1, V2, V3			// d7a12006
 | 
				
			||||||
 | 
						VREDANDVS	V1, V2, V0, V3			// d7a12004
 | 
				
			||||||
 | 
						VREDORVS	V1, V2, V3			// d7a1200a
 | 
				
			||||||
 | 
						VREDORVS	V1, V2, V0, V3			// d7a12008
 | 
				
			||||||
 | 
						VREDXORVS	V1, V2, V3			// d7a1200e
 | 
				
			||||||
 | 
						VREDXORVS	V1, V2, V0, V3			// d7a1200c
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// 31.14.2: Vector Widening Integer Reduction Instructions
 | 
				
			||||||
 | 
						VWREDSUMUVS	V1, V2, V3			// d78120c2
 | 
				
			||||||
 | 
						VWREDSUMUVS	V1, V2, V0, V3			// d78120c0
 | 
				
			||||||
 | 
						VWREDSUMVS	V1, V2, V3			// d78120c6
 | 
				
			||||||
 | 
						VWREDSUMVS	V1, V2, V0, V3			// d78120c4
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// 31.14.3: Vector Single-Width Floating-Point Reduction Instructions
 | 
				
			||||||
 | 
						VFREDOSUMVS	V1, V2, V3			// d791200e
 | 
				
			||||||
 | 
						VFREDOSUMVS	V1, V2, V0, V3			// d791200c
 | 
				
			||||||
 | 
						VFREDUSUMVS	V1, V2, V3			// d7912006
 | 
				
			||||||
 | 
						VFREDUSUMVS	V1, V2, V0, V3			// d7912004
 | 
				
			||||||
 | 
						VFREDMAXVS	V1, V2, V3			// d791201e
 | 
				
			||||||
 | 
						VFREDMAXVS	V1, V2, V0, V3			// d791201c
 | 
				
			||||||
 | 
						VFREDMINVS	V1, V2, V3			// d7912016
 | 
				
			||||||
 | 
						VFREDMINVS	V1, V2, V0, V3			// d7912014
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// 31.14.4: Vector Widening Floating-Point Reduction Instructions
 | 
				
			||||||
 | 
						VFWREDOSUMVS	V1, V2, V3			// d79120ce
 | 
				
			||||||
 | 
						VFWREDOSUMVS	V1, V2, V0, V3			// d79120cc
 | 
				
			||||||
 | 
						VFWREDUSUMVS	V1, V2, V3			// d79120c6
 | 
				
			||||||
 | 
						VFWREDUSUMVS	V1, V2, V0, V3			// d79120c4
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	//
 | 
						//
 | 
				
			||||||
	// Privileged ISA
 | 
						// Privileged ISA
 | 
				
			||||||
	//
 | 
						//
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
							
								
								
									
										15
									
								
								src/cmd/asm/internal/asm/testdata/riscv64error.s
									
										
									
									
										vendored
									
									
								
							
							
						
						
									
										15
									
								
								src/cmd/asm/internal/asm/testdata/riscv64error.s
									
										
									
									
										vendored
									
									
								
							| 
						 | 
					@ -347,5 +347,20 @@ TEXT errors(SB),$0
 | 
				
			||||||
	VFNCVTFXW	V2, V4, V3			// ERROR "invalid vector mask register"
 | 
						VFNCVTFXW	V2, V4, V3			// ERROR "invalid vector mask register"
 | 
				
			||||||
	VFNCVTFFW	V2, V4, V3			// ERROR "invalid vector mask register"
 | 
						VFNCVTFFW	V2, V4, V3			// ERROR "invalid vector mask register"
 | 
				
			||||||
	VFNCVTRODFFW	V2, V4, V3			// ERROR "invalid vector mask register"
 | 
						VFNCVTRODFFW	V2, V4, V3			// ERROR "invalid vector mask register"
 | 
				
			||||||
 | 
						VREDSUMVS	V1, V2, V4, V3			// ERROR "invalid vector mask register"
 | 
				
			||||||
 | 
						VREDMAXUVS	V1, V2, V4, V3			// ERROR "invalid vector mask register"
 | 
				
			||||||
 | 
						VREDMAXVS	V1, V2, V4, V3			// ERROR "invalid vector mask register"
 | 
				
			||||||
 | 
						VREDMINUVS	V1, V2, V4, V3			// ERROR "invalid vector mask register"
 | 
				
			||||||
 | 
						VREDMINVS	V1, V2, V4, V3			// ERROR "invalid vector mask register"
 | 
				
			||||||
 | 
						VREDANDVS	V1, V2, V4, V3			// ERROR "invalid vector mask register"
 | 
				
			||||||
 | 
						VREDORVS	V1, V2, V4, V3			// ERROR "invalid vector mask register"
 | 
				
			||||||
 | 
						VREDXORVS	V1, V2, V4, V3			// ERROR "invalid vector mask register"
 | 
				
			||||||
 | 
						VWREDSUMUVS	V1, V2, V4, V3			// ERROR "invalid vector mask register"
 | 
				
			||||||
 | 
						VWREDSUMVS	V1, V2, V4, V3			// ERROR "invalid vector mask register"
 | 
				
			||||||
 | 
						VFREDOSUMVS	V1, V2, V4, V3			// ERROR "invalid vector mask register"
 | 
				
			||||||
 | 
						VFREDUSUMVS	V1, V2, V4, V3			// ERROR "invalid vector mask register"
 | 
				
			||||||
 | 
						VFREDMAXVS	V1, V2, V4, V3			// ERROR "invalid vector mask register"
 | 
				
			||||||
 | 
						VFREDMINVS	V1, V2, V4, V3			// ERROR "invalid vector mask register"
 | 
				
			||||||
 | 
						VFWREDOSUMVS	V1, V2, V4, V3			// ERROR "invalid vector mask register"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	RET
 | 
						RET
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -364,5 +364,21 @@ TEXT validation(SB),$0
 | 
				
			||||||
	VFNCVTFXW	X10, V3				// ERROR "expected vector register in vs2 position"
 | 
						VFNCVTFXW	X10, V3				// ERROR "expected vector register in vs2 position"
 | 
				
			||||||
	VFNCVTFFW	X10, V3				// ERROR "expected vector register in vs2 position"
 | 
						VFNCVTFFW	X10, V3				// ERROR "expected vector register in vs2 position"
 | 
				
			||||||
	VFNCVTRODFFW	X10, V3				// ERROR "expected vector register in vs2 position"
 | 
						VFNCVTRODFFW	X10, V3				// ERROR "expected vector register in vs2 position"
 | 
				
			||||||
 | 
						VREDSUMVS	X10, V2, V3			// ERROR "expected vector register in vs1 position"
 | 
				
			||||||
 | 
						VREDMAXUVS	X10, V2, V3			// ERROR "expected vector register in vs1 position"
 | 
				
			||||||
 | 
						VREDMAXVS	X10, V2, V3			// ERROR "expected vector register in vs1 position"
 | 
				
			||||||
 | 
						VREDMINUVS	X10, V2, V3			// ERROR "expected vector register in vs1 position"
 | 
				
			||||||
 | 
						VREDMINVS	X10, V2, V3			// ERROR "expected vector register in vs1 position"
 | 
				
			||||||
 | 
						VREDANDVS	X10, V2, V3			// ERROR "expected vector register in vs1 position"
 | 
				
			||||||
 | 
						VREDORVS	X10, V2, V3			// ERROR "expected vector register in vs1 position"
 | 
				
			||||||
 | 
						VREDXORVS	X10, V2, V3			// ERROR "expected vector register in vs1 position"
 | 
				
			||||||
 | 
						VWREDSUMUVS	X10, V2, V3			// ERROR "expected vector register in vs1 position"
 | 
				
			||||||
 | 
						VWREDSUMVS	X10, V2, V3			// ERROR "expected vector register in vs1 position"
 | 
				
			||||||
 | 
						VFREDOSUMVS	X10, V2, V3			// ERROR "expected vector register in vs1 position"
 | 
				
			||||||
 | 
						VFREDUSUMVS	X10, V2, V3			// ERROR "expected vector register in vs1 position"
 | 
				
			||||||
 | 
						VFREDMAXVS	X10, V2, V3			// ERROR "expected vector register in vs1 position"
 | 
				
			||||||
 | 
						VFREDMINVS	X10, V2, V3			// ERROR "expected vector register in vs1 position"
 | 
				
			||||||
 | 
						VFWREDOSUMVS	X10, V2, V3			// ERROR "expected vector register in vs1 position"
 | 
				
			||||||
 | 
						VFWREDUSUMVS	X10, V2, V3			// ERROR "expected vector register in vs1 position"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	RET
 | 
						RET
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -2585,6 +2585,30 @@ var instructions = [ALAST & obj.AMask]instructionData{
 | 
				
			||||||
	AVFNCVTFFW & obj.AMask:     {enc: rVVEncoding},
 | 
						AVFNCVTFFW & obj.AMask:     {enc: rVVEncoding},
 | 
				
			||||||
	AVFNCVTRODFFW & obj.AMask:  {enc: rVVEncoding},
 | 
						AVFNCVTRODFFW & obj.AMask:  {enc: rVVEncoding},
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// 31.14.1: Vector Single-Width Integer Reduction Instructions
 | 
				
			||||||
 | 
						AVREDSUMVS & obj.AMask:  {enc: rVVVEncoding},
 | 
				
			||||||
 | 
						AVREDMAXUVS & obj.AMask: {enc: rVVVEncoding},
 | 
				
			||||||
 | 
						AVREDMAXVS & obj.AMask:  {enc: rVVVEncoding},
 | 
				
			||||||
 | 
						AVREDMINUVS & obj.AMask: {enc: rVVVEncoding},
 | 
				
			||||||
 | 
						AVREDMINVS & obj.AMask:  {enc: rVVVEncoding},
 | 
				
			||||||
 | 
						AVREDANDVS & obj.AMask:  {enc: rVVVEncoding},
 | 
				
			||||||
 | 
						AVREDORVS & obj.AMask:   {enc: rVVVEncoding},
 | 
				
			||||||
 | 
						AVREDXORVS & obj.AMask:  {enc: rVVVEncoding},
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// 31.14.2: Vector Widening Integer Reduction Instructions
 | 
				
			||||||
 | 
						AVWREDSUMUVS & obj.AMask: {enc: rVVVEncoding},
 | 
				
			||||||
 | 
						AVWREDSUMVS & obj.AMask:  {enc: rVVVEncoding},
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// 31.14.3: Vector Single-Width Floating-Point Reduction Instructions
 | 
				
			||||||
 | 
						AVFREDOSUMVS & obj.AMask: {enc: rVVVEncoding},
 | 
				
			||||||
 | 
						AVFREDUSUMVS & obj.AMask: {enc: rVVVEncoding},
 | 
				
			||||||
 | 
						AVFREDMAXVS & obj.AMask:  {enc: rVVVEncoding},
 | 
				
			||||||
 | 
						AVFREDMINVS & obj.AMask:  {enc: rVVVEncoding},
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// 31.14.4: Vector Widening Floating-Point Reduction Instructions
 | 
				
			||||||
 | 
						AVFWREDOSUMVS & obj.AMask: {enc: rVVVEncoding},
 | 
				
			||||||
 | 
						AVFWREDUSUMVS & obj.AMask: {enc: rVVVEncoding},
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	//
 | 
						//
 | 
				
			||||||
	// Privileged ISA
 | 
						// Privileged ISA
 | 
				
			||||||
	//
 | 
						//
 | 
				
			||||||
| 
						 | 
					@ -3578,7 +3602,9 @@ func instructionsForProg(p *obj.Prog) []*instruction {
 | 
				
			||||||
		AVFMULVV, AVFMULVF, AVFDIVVV, AVFDIVVF, AVFRDIVVF, AVFWMULVV, AVFWMULVF,
 | 
							AVFMULVV, AVFMULVF, AVFDIVVV, AVFDIVVF, AVFRDIVVF, AVFWMULVV, AVFWMULVF,
 | 
				
			||||||
		AVFMINVV, AVFMINVF, AVFMAXVV, AVFMAXVF,
 | 
							AVFMINVV, AVFMINVF, AVFMAXVV, AVFMAXVF,
 | 
				
			||||||
		AVFSGNJVV, AVFSGNJVF, AVFSGNJNVV, AVFSGNJNVF, AVFSGNJXVV, AVFSGNJXVF,
 | 
							AVFSGNJVV, AVFSGNJVF, AVFSGNJNVV, AVFSGNJNVF, AVFSGNJXVV, AVFSGNJXVF,
 | 
				
			||||||
		AVMFEQVV, AVMFEQVF, AVMFNEVV, AVMFNEVF, AVMFLTVV, AVMFLTVF, AVMFLEVV, AVMFLEVF, AVMFGTVF, AVMFGEVF:
 | 
							AVMFEQVV, AVMFEQVF, AVMFNEVV, AVMFNEVF, AVMFLTVV, AVMFLTVF, AVMFLEVV, AVMFLEVF, AVMFGTVF, AVMFGEVF,
 | 
				
			||||||
 | 
							AVREDSUMVS, AVREDMAXUVS, AVREDMAXVS, AVREDMINUVS, AVREDMINVS, AVREDANDVS, AVREDORVS, AVREDXORVS,
 | 
				
			||||||
 | 
							AVWREDSUMUVS, AVWREDSUMVS, AVFREDOSUMVS, AVFREDUSUMVS, AVFREDMAXVS, AVFREDMINVS, AVFWREDOSUMVS, AVFWREDUSUMVS:
 | 
				
			||||||
		// Set mask bit
 | 
							// Set mask bit
 | 
				
			||||||
		switch {
 | 
							switch {
 | 
				
			||||||
		case ins.rs3 == obj.REG_NONE:
 | 
							case ins.rs3 == obj.REG_NONE:
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue