Skip to content

Commit

Permalink
[GSOC] integrated support for Zvkg instructions
Browse files Browse the repository at this point in the history
[GSOC] removed wrong valid vlen constraint for Zvkg
  • Loading branch information
SyedHassanUlHaq committed Aug 18, 2024
1 parent 0f188dd commit c5a91da
Show file tree
Hide file tree
Showing 8 changed files with 73 additions and 12 deletions.
2 changes: 1 addition & 1 deletion Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -55,7 +55,7 @@ CONFIGS = configs/

SPIKE = spike
PATCHER_SPIKE = build/pspike
MARCH = rv${XLEN}gcv_zvbb
MARCH = rv${XLEN}gcv_zvbb_zvkg
MABI = lp64d

ifeq ($(XLEN), 32)
Expand Down
2 changes: 2 additions & 0 deletions Makefrag
Original file line number Diff line number Diff line change
Expand Up @@ -409,6 +409,8 @@ tests = \
vfwsub_wf-0 \
vfwsub_wf-1 \
vfwsub_wv-0 \
vghsh_vv-0 \
vgmul_vv-0 \
vid_v-0 \
vid_v-1 \
viota_m-0 \
Expand Down
19 changes: 19 additions & 0 deletions configs/vghsh.vv.toml
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
name = "vghsh.vv"
format = "vd,vs2,vs1"

[tests]
base = [
[0x0, 0x0],
[0x1, 0x2],
[0x3, 0xf]
]

sew32 = [
[0xfffffff8, 0x00000000],
[0xffffff80, 0xfffffff8],
[0x00007fff, 0x00000000],
[0x00007fff, 0x000007ff],
[0x00007fff, 0x00000001],
[0xffffffff, 0x00000000],
[0xffffffff, 0xffffffff]
]
19 changes: 19 additions & 0 deletions configs/vgmul.vv.toml
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
name = "vgmul.vv"
format = "vd,vs2"

[tests]
base = [
[0x0, 0x0],
[0x1, 0x2],
[0x3, 0xf]
]

sew32 = [
[0xfffffff8, 0x00000000],
[0xffffff80, 0xfffffff8],
[0x00007fff, 0x00000000],
[0x00007fff, 0x000007ff],
[0x00007fff, 0x00000001],
[0xffffffff, 0x00000000],
[0xffffffff, 0xffffffff]
]
2 changes: 1 addition & 1 deletion generator/insn_util.go
Original file line number Diff line number Diff line change
Expand Up @@ -179,4 +179,4 @@ func getVRegs(lmul1 LMUL, v0 bool, seed string) (int, int, int) {
})

return availableOptions[0], availableOptions[1], availableOptions[2]
}
}
26 changes: 18 additions & 8 deletions generator/insn_vdvs2.go
Original file line number Diff line number Diff line change
Expand Up @@ -9,16 +9,28 @@ import (
)

func (i *Insn) genCodeVdVs2(pos int) []string {
s := regexp.MustCompile(`vmv(\d)r.v`)
nr, err := strconv.Atoi(s.FindStringSubmatch(i.Name)[1])
if err != nil {
log.Fatal("unreachable")
zvkg_insn := strings.HasPrefix(i.Name, "vg")
sew32_only := iff(zvkg_insn, []SEW{32}, allSEWs)

var nr int
var err error

if match := regexp.MustCompile(`vmv(\d+)r.v`).FindStringSubmatch(i.Name); len(match) > 1 {
nr, err = strconv.Atoi(match[1])
if err != nil {
log.Fatalf("Error parsing register number: %v", err)
}
}

combinations := i.combinations([]LMUL{LMUL(nr)}, allSEWs, []bool{false}, i.vxrms())

combinations := i.combinations(iff(zvkg_insn, []LMUL{1, 2, 4, 8}, []LMUL{LMUL(nr)}), iff(zvkg_insn, sew32_only, allSEWs), []bool{false}, i.vxrms())
res := make([]string, 0, len(combinations))

for _, c := range combinations[pos:] {
if zvkg_insn && c.Vl % 4 != 0 {
c.Vl = (c.Vl + 3) / 4 * 4
}

builder := strings.Builder{}
builder.WriteString(c.initialize())

Expand All @@ -32,16 +44,14 @@ func (i *Insn) genCodeVdVs2(pos int) []string {

builder.WriteString("# -------------- TEST BEGIN --------------\n")
builder.WriteString(i.gVsetvli(c.Vl, c.SEW, c.LMUL))
builder.WriteString(fmt.Sprintf("%s v%d, v%d\n",
i.Name, vd, vs2))
builder.WriteString(fmt.Sprintf("%s v%d, v%d\n", i.Name, vd, vs2))
builder.WriteString("# -------------- TEST END --------------\n")

builder.WriteString(i.gResultDataAddr())
builder.WriteString(i.gStoreRegisterGroupIntoResultData(vd, c.LMUL, c.SEW))
builder.WriteString(i.gMagicInsn(vd, c.LMUL))

res = append(res, builder.String())

}

return res
Expand Down
12 changes: 11 additions & 1 deletion generator/insn_vdvs2vs1.go
Original file line number Diff line number Diff line change
Expand Up @@ -6,9 +6,19 @@ import (
)

func (i *Insn) genCodeVdVs2Vs1(pos int) []string {
combinations := i.combinations(allLMULs, allSEWs, []bool{false}, i.vxrms())
zvkg_insn := strings.HasPrefix(i.Name, "vg")
sew32_only := iff(zvkg_insn, []SEW{32}, allSEWs)
combinations := i.combinations(
iff(zvkg_insn, []LMUL{1, 2, 4, 8}, allLMULs),
iff(zvkg_insn, sew32_only, allSEWs),
[]bool{false},
i.vxrms(),
)
res := make([]string, 0, len(combinations))
for _, c := range combinations[pos:] {
if zvkg_insn && c.Vl % 4 != 0 {
c.Vl = (c.Vl + 3) / 4 * 4
}
builder := strings.Builder{}
builder.WriteString(c.initialize())

Expand Down
3 changes: 2 additions & 1 deletion main.go
Original file line number Diff line number Diff line change
Expand Up @@ -100,6 +100,7 @@ func main() {
}
insn, err := generator.ReadInsnFromToml(contents, option)
fatalIf(err)

if insn.Name != strings.Replace(file.Name(), ".toml", "", -1) {
fatalIf(errors.New("filename and instruction name unmatched"))
}
Expand Down Expand Up @@ -130,4 +131,4 @@ func writeTo(path string, name string, contents string) {
fatalIf(err)
err = os.WriteFile(filepath.Join(path, name), []byte(contents), 0644)
fatalIf(err)
}
}

0 comments on commit c5a91da

Please sign in to comment.