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