internal/simdgen: fix generated rules for shifts

the rewrite rules don't always apply in the friendliest
order, be sure that they are defined so they work for
all orders.

this generates dev.simd CL 695475

Change-Id: I80784b1df90108fa97ea6156cdc9259fd2696868
Reviewed-on: https://go-review.googlesource.com/c/arch/+/695455
Reviewed-by: Junyang Shao <shaojunyang@google.com>
LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com>
diff --git a/internal/simdgen/gen_simdrules.go b/internal/simdgen/gen_simdrules.go
index 9a0bfd5..b0fc7e6 100644
--- a/internal/simdgen/gen_simdrules.go
+++ b/internal/simdgen/gen_simdrules.go
@@ -32,9 +32,9 @@
 {{end}}
 {{define "maskInMaskOut"}}({{.GoOp}}{{.GoType}} {{.Args}} mask) => ({{.MaskOutConvert}} ({{.Asm}} {{.ArgsOut}} ({{.MaskInConvert}} <types.TypeMask> mask)))
 {{end}}
-{{define "sftimm"}}({{.GoOp}}{{.GoType}} x (MOVQconst [c])) => ({{.Asm}}const [uint8(c)] x)
+{{define "sftimm"}}({{.Asm}} x (MOVQconst [c])) => ({{.Asm}}const [uint8(c)] x)
 {{end}}
-{{define "masksftimm"}}({{.GoOp}}{{.GoType}} x (MOVQconst [c]) mask) => ({{.Asm}}const [uint8(c)] x ({{.MaskInConvert}} <types.TypeMask> mask))
+{{define "masksftimm"}}({{.Asm}} x (MOVQconst [c]) mask) => ({{.Asm}}const [uint8(c)] x mask)
 {{end}}
 `))
 )
@@ -176,22 +176,24 @@
 
 		if gOp.SpecialLower != nil {
 			if *gOp.SpecialLower == "sftimm" {
-				sftImmData := data
-				if tplName == "maskIn" {
-					sftImmData.tplName = "masksftimm"
-				} else {
-					sftImmData.tplName = "sftimm"
+				if data.GoType[0] == 'I' {
+					// only do these for signed types, it is a duplicate rewrite for unsigned
+					sftImmData := data
+					if tplName == "maskIn" {
+						sftImmData.tplName = "masksftimm"
+					} else {
+						sftImmData.tplName = "sftimm"
+					}
+					allData = append(allData, sftImmData)
 				}
-				allData = append(allData, sftImmData)
 			} else {
 				panic("simdgen sees unknwon special lower " + *gOp.SpecialLower + ", maybe implement it?")
 			}
-		} else {
-			// SpecialLower rules cannot use "...".
-			if tplName == "pureVreg" && data.Args == data.ArgsOut {
-				data.Args = "..."
-				data.ArgsOut = "..."
-			}
+		}
+
+		if tplName == "pureVreg" && data.Args == data.ArgsOut {
+			data.Args = "..."
+			data.ArgsOut = "..."
 		}
 		data.tplName = tplName
 		allData = append(allData, data)