riscv64: fix objdump related tests

The TestObjdumpRISCV64TestDecodeGNUSyntaxdata and
TestObjdumpRISCV64TestDecodeGoSyntaxdata was failed due to lack of
.riscv.attributes in elf file, this patch adds these extension's
attributes and allow `inst` output mismatch.

Fix: golang/go#70864

Change-Id: I6bcac3e6a3bd0ec3cc66356998914a1aa8d7c468
Reviewed-on: https://go-review.googlesource.com/c/arch/+/636735
Reviewed-by: David Chase <drchase@google.com>
Reviewed-by: Meng Zhuo <mengzhuo1203@gmail.com>
Reviewed-by: Carlos Amedee <carlos@golang.org>
LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com>
diff --git a/riscv64/riscv64asm/ext_test.go b/riscv64/riscv64asm/ext_test.go
index fa6961f..25e2bf7 100644
--- a/riscv64/riscv64asm/ext_test.go
+++ b/riscv64/riscv64asm/ext_test.go
@@ -148,6 +148,9 @@
 				}
 				suffix += " (allowed mismatch)"
 			}
+			if strings.Contains(text, "unknown") && strings.Contains(dec.text, ".insn") {
+				return
+			}
 			totalErrors++
 			cmp := fmt.Sprintf("decode(%x) = %q, %d, want %q, %d%s\n", enc, text, len(enc), dec.text, dec.nenc, suffix)
 
diff --git a/riscv64/riscv64asm/gnu.go b/riscv64/riscv64asm/gnu.go
index d6b3dc0..3ee0449 100644
--- a/riscv64/riscv64asm/gnu.go
+++ b/riscv64/riscv64asm/gnu.go
@@ -42,6 +42,11 @@
 			}
 		}
 
+		if inst.Op == ANDI && inst.Args[2].(Simm).Imm == 255 {
+			op = "zext.b"
+			args = args[:len(args)-1]
+		}
+
 		if inst.Op == ADDIW && inst.Args[2].(Simm).Imm == 0 {
 			op = "sext.w"
 			args = args[:len(args)-1]
diff --git a/riscv64/riscv64asm/objdumpext_test.go b/riscv64/riscv64asm/objdumpext_test.go
index 4f1f21a..1dc0964 100644
--- a/riscv64/riscv64asm/objdumpext_test.go
+++ b/riscv64/riscv64asm/objdumpext_test.go
@@ -277,7 +277,7 @@
 		Type:      uint32(0x70000003), // SHT_RISCV_ATTRIBUTES
 		Addr:      0,
 		Off:       uint64(off2 + (off3-off2)*4 + strtabsize),
-		Size:      102,
+		Size:      114,
 		Addralign: 1,
 	}
 	binary.Write(&buf, binary.LittleEndian, &sect)
@@ -293,7 +293,7 @@
 	buf.WriteString("\x00.text\x00.riscv.attributes\x00.shstrtab\x00")
 	// Contents of .riscv.attributes section
 	// which specify the extension and priv spec version. (1.11)
-	buf.WriteString("Ae\x00\x00\x00riscv\x00\x01[\x00\x00\x00\x05rv64i2p1_m2pp_a2p1_f2p2_d2p2_q2p2_zibsr2p0_zifencei2p0_zmmul1p0_zfh1p0_zfhmin1p0\x00\x08\x01\x0a\x0b")
+	buf.WriteString("Aq\x00\x00\x00riscv\x00\x01g\x00\x00\x00\x05rv64i2p0_m2p0_a2p0_f2p0_d2p0_q2p0_c2p0_zmmul1p0_zfh1p0_zfhmin1p0_zba1p0_zbb1p0_zbc1p0_zbs1p0\x00\x08\x01\x0a\x0b")
 	f.Write(buf.Bytes())
 	return nil
 }