Skip to content

riscv64: Implement Remaining Vector Instructions聽#7186

Description

@afonso360

馃憢 Hey,

This is a general issue for tracking the missing instructions from the RISC-V Vector extension. We have implemented most of them, however there are a couple of categories that are still missing

Widening and Narrowing Operations

I have Implemented Vector Widening Integer Add/Subtract in #6542 and #6555.

I also have a branch that contains Vector Widening Integer Multiply Instructions in riscv-simd-widening-mul, however before merging that I think it we should rework our approach towards these instructions.

Matching one of these instructions includes a lot of rules mostly due to how many combinations we can perform with {s,u}widen_{low,high}, so before adding any more instruction I think we need to add an extractor that can match all of these patterns.

As an example vwmulsu.vv requires 8 rules to match all combinations of {s,u}widen_{low,high}.

Vector Multiple Register Move

We have implemented vmv1r.v as our move instruction, this instruction moves one register into another. However we also have vmv2r.v / vmv4r.v / vmv8r.v. These instructions move n consecutive registers.

As an example, vmv2r.v v10, v12 copies v10=v12; v11=v13.

These instructions have a constraint that the source and destination registers must be "aligned" to the number of the instruction. vmv2r.v v11, v15 would be an illegal instruction.

Vector Reduction Operations

I'm not entirely sure how we can best match these operations. We don't have the equivalent instructions in cranelift.

These instructions do a operation on an entire vector register, such as a sum and return a scalar value. We have two of these implemented vredminu and vredmaxu that are used when lowering vany_true or vall_true.

Special Load / Store Addressing Modes

We currently implement Vector Unit-Stride Instructions for all our Loads and Stores. These are fairly simple in that they load vl elements that are a fixed number of bits apart. These match the semantics of the load and store instructions in cranelift.

The remaining Addressing Modes might be beneficial, but I have no idea how we could match them. Some of these might not be that useful.

Vector Integer Division

We don't actually support vector sdiv / udiv, nevertheless RISC-V includes instructions for them in Vector Integer Divide Instructions. I'm including this here mostly for completeness.

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions