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_);
       });