This fixes an issue in some narrowing fp/int conversion functions where the SEW was set to the source width as opposed to the destination width. PiperOrigin-RevId: 845274708 Change-Id: I11b00e8665f652bcc2ca928d5d2715bc89cc95ae
diff --git a/riscv/riscv_vector_fp_unary_instructions.cc b/riscv/riscv_vector_fp_unary_instructions.cc index c777429..fbe3786 100644 --- a/riscv/riscv_vector_fp_unary_instructions.cc +++ b/riscv/riscv_vector_fp_unary_instructions.cc
@@ -475,12 +475,12 @@ } int sew = rv_vector->selected_element_width(); switch (sew) { - case 4: + case 2: return RiscVUnaryVectorOpWithFflags<uint16_t, float>( rv_vector, inst, [](float vs2) -> std::tuple<uint16_t, uint32_t> { return CvtHelper<float, uint16_t>(vs2); }); - case 8: + case 4: return RiscVUnaryVectorOpWithFflags<uint32_t, double>( rv_vector, inst, [](double vs2) -> std::tuple<uint32_t, uint32_t> { return CvtHelper<double, uint32_t>(vs2); @@ -503,12 +503,12 @@ } int sew = rv_vector->selected_element_width(); switch (sew) { - case 4: + case 2: return RiscVUnaryVectorOpWithFflags<int16_t, float>( rv_vector, inst, [](float vs2) -> std::tuple<int16_t, uint32_t> { return CvtHelper<float, int16_t>(vs2); }); - case 8: + case 4: return RiscVUnaryVectorOpWithFflags<int32_t, double>( rv_vector, inst, [](double vs2) -> std::tuple<int32_t, uint32_t> { return CvtHelper<double, int32_t>(vs2); @@ -532,7 +532,7 @@ int sew = rv_vector->selected_element_width(); ScopedFPStatus set_fpstatus(rv_fp->host_fp_interface()); switch (sew) { - case 8: + case 4: return RiscVUnaryVectorOp<float, double>( rv_vector, inst, [](double vs2) -> float { return static_cast<float>(vs2); }); @@ -557,7 +557,7 @@ // mantissa is either 1 or it is the logical or of all the bits to the right // in the original width mantissa. switch (sew) { - case 8: + case 4: return RiscVUnaryVectorOp<float, double>( rv_vector, inst, [](double vs2) -> float { if (FPTypeInfo<double>::IsNaN(vs2) || @@ -596,7 +596,7 @@ int sew = rv_vector->selected_element_width(); ScopedFPStatus set_fpstatus(rv_fp->host_fp_interface()); switch (sew) { - case 8: + case 4: return RiscVUnaryVectorOp<float, uint64_t>( rv_vector, inst, [](uint64_t vs2) -> float { return static_cast<float>(vs2); }); @@ -607,7 +607,7 @@ } } -// Narrowing conversion of signed integeer to floating point. +// Narrowing conversion of signed integer to floating point. void Vfncvtfxw(const Instruction* inst) { auto* rv_fp = static_cast<RiscVState*>(inst->state())->rv_fp(); auto* rv_vector = static_cast<RiscVState*>(inst->state())->rv_vector(); @@ -619,7 +619,7 @@ int sew = rv_vector->selected_element_width(); ScopedFPStatus set_fpstatus(rv_fp->host_fp_interface()); switch (sew) { - case 8: + case 4: return RiscVUnaryVectorOp<float, int64_t>( rv_vector, inst, [](int64_t vs2) -> float { return static_cast<float>(vs2); }); @@ -636,12 +636,12 @@ auto* rv_vector = rv_state->rv_vector(); int sew = rv_vector->selected_element_width(); switch (sew) { - case 4: + case 2: return RiscVUnaryVectorOpWithFflags<uint16_t, float>( rv_vector, inst, [](float vs2) -> std::tuple<uint16_t, uint32_t> { return CvtHelper<float, uint16_t>(vs2); }); - case 8: + case 4: return RiscVUnaryVectorOpWithFflags<uint32_t, double>( rv_vector, inst, [](double vs2) -> std::tuple<uint32_t, uint32_t> { return CvtHelper<double, uint32_t>(vs2); @@ -659,12 +659,12 @@ auto* rv_vector = rv_state->rv_vector(); int sew = rv_vector->selected_element_width(); switch (sew) { - case 4: + case 2: return RiscVUnaryVectorOpWithFflags<int16_t, float>( rv_vector, inst, [](float vs2) -> std::tuple<int16_t, uint32_t> { return CvtHelper<float, int16_t>(vs2); }); - case 8: + case 4: return RiscVUnaryVectorOpWithFflags<int32_t, double>( rv_vector, inst, [](double vs2) -> std::tuple<int32_t, uint32_t> { return CvtHelper<double, int32_t>(vs2);
diff --git a/riscv/test/riscv_vector_fp_unary_instructions_test.cc b/riscv/test/riscv_vector_fp_unary_instructions_test.cc index 1c5b142..04540fe 100644 --- a/riscv/test/riscv_vector_fp_unary_instructions_test.cc +++ b/riscv/test/riscv_vector_fp_unary_instructions_test.cc
@@ -684,7 +684,7 @@ TEST_F(RiscVFPUnaryInstructionsTest, Vfncvtfxuw) { SetSemanticFunction(&Vfncvtfxuw); UnaryOpTestHelperV<float, uint64_t>( - "Vfncvt.f.xu.w_64", /*sew*/ 64, instruction_, + "Vfncvt.f.xu.w_64", /*sew*/ 32, instruction_, [](uint64_t vs2) -> float { return static_cast<float>(vs2); }); } @@ -692,7 +692,7 @@ TEST_F(RiscVFPUnaryInstructionsTest, Vfncvtfxw) { SetSemanticFunction(&Vfncvtfxw); UnaryOpTestHelperV<float, int64_t>( - "Vfncvt.f.x.w_64", /*sew*/ 64, instruction_, + "Vfncvt.f.x.w_64", /*sew*/ 32, instruction_, [](int64_t vs2) -> float { return static_cast<float>(vs2); }); } @@ -700,7 +700,7 @@ TEST_F(RiscVFPUnaryInstructionsTest, Vfncvtffw) { SetSemanticFunction(&Vfncvtffw); UnaryOpTestHelperV<float, double>( - "Vfncvt.f.f.w_64", /*sew*/ 64, instruction_, + "Vfncvt.f.f.w_64", /*sew*/ 32, instruction_, [](double vs2) -> float { return static_cast<float>(vs2); }); } @@ -708,7 +708,7 @@ TEST_F(RiscVFPUnaryInstructionsTest, Vfncvtrodffw) { SetSemanticFunction(&Vfncvtrodffw); UnaryOpTestHelperV<float, double>( - "Vfncvt.rod.f.f.w_64", /*sew*/ 64, instruction_, [](double vs2) -> float { + "Vfncvt.rod.f.f.w_64", /*sew*/ 32, instruction_, [](double vs2) -> float { if (std::isnan(vs2) || std::isinf(vs2)) { return static_cast<float>(vs2); } @@ -731,7 +731,7 @@ SetSemanticFunction(&Vfncvtrtzxfw); rv_fp_->SetRoundingMode(FPRoundingMode::kRoundTowardsZero); UnaryOpWithFflagsFPTestHelperV<int16_t, float>( - "Vfncvt.rtz.x.f.w_32", /*sew*/ 32, instruction_, /*delta_position*/ 32, + "Vfncvt.rtz.x.f.w_32", /*sew*/ 16, instruction_, /*delta_position*/ 32, [this](float vs2) -> std::tuple<int16_t, uint32_t> { return ConvertHelper<float, int16_t>(vs2, this->rv_fp_); }); @@ -739,7 +739,7 @@ SetSemanticFunction(&Vfncvtrtzxfw); rv_fp_->SetRoundingMode(FPRoundingMode::kRoundTowardsZero); UnaryOpWithFflagsFPTestHelperV<int32_t, double>( - "Vfncvt.rtz.x.f.w_64", /*sew*/ 64, instruction_, /*delta_position*/ 64, + "Vfncvt.rtz.x.f.w_64", /*sew*/ 32, instruction_, /*delta_position*/ 64, [this](double vs2) -> std::tuple<int32_t, uint32_t> { return ConvertHelper<double, int32_t>(vs2, this->rv_fp_); }); @@ -750,7 +750,7 @@ SetSemanticFunction(&Vfncvtrtzxufw); rv_fp_->SetRoundingMode(FPRoundingMode::kRoundTowardsZero); UnaryOpWithFflagsFPTestHelperV<uint16_t, float>( - "Vfncvt.rtz.xu.f.w_32", /*sew*/ 32, instruction_, /*delta_position*/ 32, + "Vfncvt.rtz.xu.f.w_32", /*sew*/ 16, instruction_, /*delta_position*/ 32, [this](float vs2) -> std::tuple<uint16_t, uint32_t> { return ConvertHelper<float, uint16_t>(vs2, this->rv_fp_); }); @@ -758,7 +758,7 @@ SetSemanticFunction(&Vfncvtrtzxufw); rv_fp_->SetRoundingMode(FPRoundingMode::kRoundTowardsZero); UnaryOpWithFflagsFPTestHelperV<uint32_t, double>( - "Vfncvt.rtz.xu.f.w_64", /*sew*/ 64, instruction_, /*delta_position*/ 64, + "Vfncvt.rtz.xu.f.w_64", /*sew*/ 32, instruction_, /*delta_position*/ 64, [this](double vs2) -> std::tuple<uint32_t, uint32_t> { return ConvertHelper<double, uint32_t>(vs2, this->rv_fp_); }); @@ -768,14 +768,14 @@ TEST_F(RiscVFPUnaryInstructionsTest, Vfncvtxfw) { SetSemanticFunction(&Vfncvtxfw); UnaryOpWithFflagsFPTestHelperV<int16_t, float>( - "Vfncvt.x.f.w_32", /*sew*/ 32, instruction_, /*delta_position*/ 32, + "Vfncvt.x.f.w_32", /*sew*/ 16, instruction_, /*delta_position*/ 32, [this](float vs2) -> std::tuple<int16_t, uint32_t> { return ConvertHelper<float, int16_t>(vs2, this->rv_fp_); }); ResetInstruction(); SetSemanticFunction(&Vfncvtxfw); UnaryOpWithFflagsFPTestHelperV<int32_t, double>( - "Vfncvt.x.f.w_64", /*sew*/ 64, instruction_, /*delta_position*/ 32, + "Vfncvt.x.f.w_64", /*sew*/ 32, instruction_, /*delta_position*/ 64, [this](double vs2) -> std::tuple<int32_t, uint32_t> { return ConvertHelper<double, int32_t>(vs2, this->rv_fp_); }); @@ -785,14 +785,14 @@ TEST_F(RiscVFPUnaryInstructionsTest, Vfncvtxufw) { SetSemanticFunction(&Vfncvtxufw); UnaryOpWithFflagsFPTestHelperV<uint16_t, float>( - "Vfncvt.xu.f.w_32", /*sew*/ 32, instruction_, /*delta_position*/ 32, + "Vfncvt.xu.f.w_32", /*sew*/ 16, instruction_, /*delta_position*/ 32, [this](float vs2) -> std::tuple<uint16_t, uint32_t> { return ConvertHelper<float, uint16_t>(vs2, this->rv_fp_); }); ResetInstruction(); SetSemanticFunction(&Vfncvtxufw); UnaryOpWithFflagsFPTestHelperV<uint32_t, double>( - "Vfncvt.xu.f.w_64", /*sew*/ 64, instruction_, /*delta_position*/ 64, + "Vfncvt.xu.f.w_64", /*sew*/ 32, instruction_, /*delta_position*/ 64, [this](double vs2) -> std::tuple<uint32_t, uint32_t> { return ConvertHelper<double, uint32_t>(vs2, this->rv_fp_); });