| // Copyright 2023 Google LLC |
| // |
| // Licensed under the Apache License, Version 2.0 (the "License"); |
| // you may not use this file except in compliance with the License. |
| // You may obtain a copy of the License at |
| // |
| // https://www.apache.org/licenses/LICENSE-2.0 |
| // |
| // Unless required by applicable law or agreed to in writing, software |
| // distributed under the License is distributed on an "AS IS" BASIS, |
| // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| // See the License for the specific language governing permissions and |
| // limitations under the License. |
| |
| #ifndef MPACT_CHERIOT_RISCV_CHERIOT_VECTOR_REDUCTION_INSTRUCTIONS_H_ |
| #define MPACT_CHERIOT_RISCV_CHERIOT_VECTOR_REDUCTION_INSTRUCTIONS_H_ |
| |
| #include "mpact/sim/generic/instruction.h" |
| |
| namespace mpact { |
| namespace sim { |
| namespace cheriot { |
| |
| using Instruction = ::mpact::sim::generic::Instruction; |
| |
| // Each of these instruction semantic functions take 3 sources. Source 0 is |
| // vector register vs2, source 1 is vector register vs1, and source 2 is a |
| // vector mask operand. There is a single vector destination operand. |
| // Each reduction applies the reduction operation to the 0 element of source |
| // operand 1 (vs1), and all unmasked elements of source operand 0 (vs2). The |
| // result is written to the 0 element of destination operand vd. |
| |
| // Vector sum reduction. |
| void Vredsum(Instruction *inst); |
| // Vector and reduction. |
| void Vredand(Instruction *inst); |
| // Vector or reduction. |
| void Vredor(Instruction *inst); |
| // Vector xor reduction. |
| void Vredxor(Instruction *inst); |
| // Vector unsigned min reduction. |
| void Vredminu(Instruction *inst); |
| // Vector signed min reduction. |
| void Vredmin(Instruction *inst); |
| // Vector unsigned max reduction. |
| void Vredmaxu(Instruction *inst); |
| // Vector signed max reduction. |
| void Vredmax(Instruction *inst); |
| // Vector unsigned widening sum reduction. The result is 2 * SEW. |
| void Vwredsumu(Instruction *inst); |
| // vector signed widening sum reduction. The result is 2 * SEW. |
| void Vwredsum(Instruction *inst); |
| |
| } // namespace cheriot |
| } // namespace sim |
| } // namespace mpact |
| |
| #endif // MPACT_CHERIOT_RISCV_CHERIOT_VECTOR_REDUCTION_INSTRUCTIONS_H_ |