RISC-V: Fix build with GCC-8

Message ID 20260623095221.1792011-1-zhuangqiubin@linux.spacemit.com
State New
Headers
Series RISC-V: Fix build with GCC-8 |

Commit Message

Mark Zhuang June 23, 2026, 9:52 a.m. UTC
  From: Mark Zhuang <mark.zhuang@spacemit.com>

GCC 8.5.0 rejects a declaration right after a case label.
Add braces to fix it.
---
 gas/config/tc-riscv.c | 335 ++++++++++++++++++++++--------------------
 opcodes/riscv-dis.c   |  16 +-
 2 files changed, 182 insertions(+), 169 deletions(-)
  

Comments

Andrew Burgess June 23, 2026, 10:18 a.m. UTC | #1
Mark Zhuang <zhuangqiubin@linux.spacemit.com> writes:

> From: Mark Zhuang <mark.zhuang@spacemit.com>
>
> GCC 8.5.0 rejects a declaration right after a case label.
> Add braces to fix it.

I cannot approve this patch, but I also ran into this issue building GDB
because of the opcodes/ part, and your fix looks good to me (and fixes
my build), so +1 here.

Thanks,
Andrew


> ---
>  gas/config/tc-riscv.c | 335 ++++++++++++++++++++++--------------------
>  opcodes/riscv-dis.c   |  16 +-
>  2 files changed, 182 insertions(+), 169 deletions(-)
>
> diff --git a/gas/config/tc-riscv.c b/gas/config/tc-riscv.c
> index 5ffa2ef1f1d..cec3c1f65a2 100644
> --- a/gas/config/tc-riscv.c
> +++ b/gas/config/tc-riscv.c
> @@ -1791,49 +1791,53 @@ validate_riscv_insn (const struct riscv_opcode *opc, int length)
>  		}
>  		break;
>  	    case 'p': /* Vendor-specific (SpacemiT) operands.  */
> -	      size_t n;
> -	      size_t s;
> -	      switch (*++oparg)
> -		{
> -		case 'V':
> -		  switch (*++oparg)
> -		    {
> -		    case 'd':
> -		      USE_BITS (OP_MASK_SPACEMIT_IME_VD, OP_SH_SPACEMIT_IME_VD);
> +	      {
> +		size_t n;
> +		size_t s;
> +		switch (*++oparg)
> +		  {
> +		    case 'V':
> +		      switch (*++oparg)
> +			{
> +			  case 'd':
> +			    USE_BITS (OP_MASK_SPACEMIT_IME_VD,
> +				      OP_SH_SPACEMIT_IME_VD);
> +			    break;
> +			  case 's':
> +			    USE_BITS (OP_MASK_SPACEMIT_IME_VS1,
> +				      OP_SH_SPACEMIT_IME_VS1);
> +			    break;
> +			  case 'm':
> +			    USE_BITS (OP_MASK_SPACEMIT_IME_VMASK,
> +				      OP_SH_SPACEMIT_IME_VMASK);
> +			    break;
> +			  default:
> +			    goto unknown_validate_operand;
> +			}
>  		      break;
> -		    case 's':
> -		      USE_BITS (OP_MASK_SPACEMIT_IME_VS1,
> -				OP_SH_SPACEMIT_IME_VS1);
> +		    case 'u': /* Integer immediate, 'XpuN@S' ...
> +				 N-bit unsigned immediate at bit S.  */
> +		      n = strtol (oparg + 1, (char **)&oparg, 10);
> +		      if (*oparg != '@')
> +			goto unknown_validate_operand;
> +		      s = strtol (oparg + 1, (char **)&oparg, 10);
> +		      oparg--;
> +		      USE_IMM (n, s);
>  		      break;
> -		    case 'm':
> -		      USE_BITS (OP_MASK_SPACEMIT_IME_VMASK,
> -				OP_SH_SPACEMIT_IME_VMASK);
> +		    case 'n':
> +		    case 'b':
> +		      used_bits |= ENCODE_SPACEMIT_IME_UIMM2_SP (-1U);
> +		      break;
> +		    case 'w':
> +		    case 'x':
> +		      USE_BITS (OP_MASK_SPACEMIT_IME_WI,
> +				OP_SH_SPACEMIT_IME_WI);
>  		      break;
>  		    default:
>  		      goto unknown_validate_operand;
> -		    }
> -		  break;
> -		case 'u': /* Integer immediate, 'XpuN@S' ...
> -			     N-bit unsigned immediate at bit S.  */
> -		  n = strtol (oparg + 1, (char **)&oparg, 10);
> -		  if (*oparg != '@')
> -		    goto unknown_validate_operand;
> -		  s = strtol (oparg + 1, (char **)&oparg, 10);
> -		  oparg--;
> -		  USE_IMM (n, s);
> -		  break;
> -		case 'n':
> -		case 'b':
> -		  used_bits |= ENCODE_SPACEMIT_IME_UIMM2_SP (-1U);
> -		  break;
> -		case 'w':
> -		case 'x':
> -		  USE_BITS (OP_MASK_SPACEMIT_IME_WI, OP_SH_SPACEMIT_IME_WI);
> -		  break;
> -		default:
> -		  goto unknown_validate_operand;
> -		}
> -	      break;
> +		  }
> +		break;
> +	      }
>  	    default:
>  	      goto unknown_validate_operand;
>  	    }
> @@ -4309,144 +4313,149 @@ riscv_ip (char *str, struct riscv_cl_insn *ip, expressionS *imm_expr,
>  		  break;
>  
>  		case 'p': /* Vendor-specific (SpacemiT) operands.  */
> -		  size_t n;
> -		  size_t s;
> -		  switch (*++oparg)
> -		    {
> -		    case 'V':
> -		      switch (*++oparg)
> -			{
> -			case 'd':
> -			  if (!reg_lookup (&asarg, RCLASS_VECR, &regno))
> -			    break;
> -			  if ((regno & 0x1) != 0)
> +		  {
> +		    size_t n;
> +		    size_t s;
> +		    switch (*++oparg)
> +		      {
> +			case 'V':
> +			  switch (*++oparg)
>  			    {
> -			      error.msg
> -				= _("illegal operands (vd must be even)");
> -			      error.missing_ext = NULL;
> -			      goto out;
> +			      case 'd':
> +				if (!reg_lookup (&asarg, RCLASS_VECR, &regno))
> +				  break;
> +				if ((regno & 0x1) != 0)
> +				  {
> +				    error.msg
> +				      = _("illegal operands (vd must be even)");
> +				    error.missing_ext = NULL;
> +				    goto out;
> +				  }
> +				INSERT_OPERAND (SPACEMIT_IME_VD, *ip, regno>>1);
> +				continue;
> +			      case 's':
> +				if (!reg_lookup (&asarg, RCLASS_VECR, &regno))
> +				  break;
> +				if ((regno & 0x1) != 0)
> +				  {
> +				    error.msg
> +				      = _("illegal operands "
> +					  "(vs1 must be even)");
> +				    error.missing_ext = NULL;
> +				    goto out;
> +				  }
> +				INSERT_OPERAND (SPACEMIT_IME_VS1,
> +						*ip, regno>>1);
> +				continue;
> +			      case 'm':
> +				if (!reg_lookup (&asarg, RCLASS_VECR, &regno))
> +				  break;
> +				if (regno >= 2)
> +				  {
> +				    error.msg
> +				      = _("illegal operands "
> +					  "(mask must be v0/v1)");
> +				    error.missing_ext = NULL;
> +				    goto out;
> +				  }
> +				INSERT_OPERAND (SPACEMIT_IME_VMASK, *ip, regno);
> +				continue;
> +			      default:
> +				goto unknown_riscv_ip_operand;
>  			    }
> -			  INSERT_OPERAND (SPACEMIT_IME_VD, *ip, regno>>1);
> +			  break;
> +			case 'u': /* Integer immediate, 'XpuN@S' ...
> +				     N-bit unsigned immediate at bit S.  */
> +			  n = strtol (oparg + 1, (char **)&oparg, 10);
> +			  if (*oparg != '@')
> +			    goto unknown_riscv_ip_operand;
> +			  s = strtol (oparg + 1, (char **)&oparg, 10);
> +			  oparg--;
> +			  my_getExpression (imm_expr, asarg, force_reloc);
> +			  check_absolute_expr (ip, imm_expr, false);
> +			  if (!VALIDATE_U_IMM (imm_expr->X_add_number, n))
> +			    as_bad (_("improper immediate value (%"PRIu64")"),
> +				    imm_expr->X_add_number);
> +			  INSERT_IMM (n, s, *ip, imm_expr->X_add_number);
> +			  imm_expr->X_op = O_absent;
> +			  asarg = expr_parse_end;
>  			  continue;
> -			case 's':
> -			  if (!reg_lookup (&asarg, RCLASS_VECR, &regno))
> +			case 'n': /* Xpn: stride (0-1), paired with Xpx.  */
> +			  my_getExpression (imm_expr, asarg, force_reloc);
> +			  check_absolute_expr (ip, imm_expr, false);
> +			  if (imm_expr->X_add_number < 0
> +			      || imm_expr->X_add_number >= 2)
>  			    break;
> -			  if ((regno & 0x1) != 0)
> +			  ip->insn_opcode
> +			    |= ENCODE_SPACEMIT_IME_UIMM2_SP
> +				 (imm_expr->X_add_number);
> +			  imm_expr->X_op = O_absent;
> +			  asarg = expr_parse_end;
> +			  continue;
> +			case 'b': /* Xpb: stride (0-3), paired with Xpw.  */
> +			  my_getExpression (imm_expr, asarg, force_reloc);
> +			  check_absolute_expr (ip, imm_expr, false);
> +			  if (imm_expr->X_add_number < 0
> +			      || imm_expr->X_add_number >= 4)
>  			    {
> -			      error.msg
> -				= _("illegal operands (vs1 must be even)");
> -			      error.missing_ext = NULL;
> -			      goto out;
> +			      as_bad (_("bad value for stride field,"
> +					" value must be 0..3"));
> +			      break;
>  			    }
> -			  INSERT_OPERAND (SPACEMIT_IME_VS1, *ip, regno>>1);
> +			  ip->insn_opcode
> +			    |= ENCODE_SPACEMIT_IME_UIMM2_SP
> +				 (imm_expr->X_add_number);
> +			  imm_expr->X_op = O_absent;
> +			  asarg = expr_parse_end;
>  			  continue;
> -			case 'm':
> -			  if (!reg_lookup (&asarg, RCLASS_VECR, &regno))
> -			    break;
> -			  if (regno >= 2)
> +			case 'w':
> +			  /* Xpw: optional data-width suffix, i8 only (WI=3).
> +			     If omitted, defaults to i8.  */
> +			  if (*asarg == ',')
>  			    {
> -			      error.msg
> -				= _("illegal operands (mask must be v0/v1)");
> -			      error.missing_ext = NULL;
> -			      goto out;
> +			      if (strcmp (asarg + 1, "i8") != 0)
> +				{
> +				  error.msg
> +				    = _("illegal operands (invalid data type)");
> +				  error.missing_ext = NULL;
> +				  goto out;
> +				}
> +			      asarg += 3;
>  			    }
> -			  INSERT_OPERAND (SPACEMIT_IME_VMASK, *ip, regno);
> +			  else if (*asarg != '\0')
> +			    goto unknown_riscv_ip_operand;
> +			  regno = 3;
> +			  INSERT_OPERAND (SPACEMIT_IME_WI, *ip, regno);
>  			  continue;
> -			default:
> -			  goto unknown_riscv_ip_operand;
> -			}
> -		      break;
> -		    case 'u': /* Integer immediate, 'XpuN@S' ...
> -				 N-bit unsigned immediate at bit S.  */
> -		      n = strtol (oparg + 1, (char **)&oparg, 10);
> -		      if (*oparg != '@')
> -			goto unknown_riscv_ip_operand;
> -		      s = strtol (oparg + 1, (char **)&oparg, 10);
> -		      oparg--;
> -		      my_getExpression (imm_expr, asarg, force_reloc);
> -		      check_absolute_expr (ip, imm_expr, false);
> -		      if (!VALIDATE_U_IMM (imm_expr->X_add_number, n))
> -			as_bad (_("improper immediate value (%"PRIu64")"),
> -				imm_expr->X_add_number);
> -		      INSERT_IMM (n, s, *ip, imm_expr->X_add_number);
> -		      imm_expr->X_op = O_absent;
> -		      asarg = expr_parse_end;
> -		      continue;
> -		    case 'n': /* Xpn: stride (0-1), paired with Xpx.  */
> -		      my_getExpression (imm_expr, asarg, force_reloc);
> -		      check_absolute_expr (ip, imm_expr, false);
> -		      if (imm_expr->X_add_number < 0
> -			  || imm_expr->X_add_number >= 2)
> -			break;
> -		      ip->insn_opcode
> -			|= ENCODE_SPACEMIT_IME_UIMM2_SP
> -			     (imm_expr->X_add_number);
> -		      imm_expr->X_op = O_absent;
> -		      asarg = expr_parse_end;
> -		      continue;
> -		    case 'b': /* Xpb: stride (0-3), paired with Xpw.  */
> -		      my_getExpression (imm_expr, asarg, force_reloc);
> -		      check_absolute_expr (ip, imm_expr, false);
> -		      if (imm_expr->X_add_number < 0
> -			  || imm_expr->X_add_number >= 4)
> -			{
> -			  as_bad (_("bad value for stride field,"
> -				    " value must be 0..3"));
> -			  break;
> -			}
> -		      ip->insn_opcode
> -			|= ENCODE_SPACEMIT_IME_UIMM2_SP
> -			     (imm_expr->X_add_number);
> -		      imm_expr->X_op = O_absent;
> -		      asarg = expr_parse_end;
> -		      continue;
> -		    case 'w':
> -		      /* Xpw: optional data-width suffix, i8 only (WI=3).
> -			 If omitted, defaults to i8.  */
> -		      if (*asarg == ',')
> -			{
> -			  if (strcmp (asarg + 1, "i8") != 0)
> +			case 'x':
> +			  /* Xpx: optional data-width suffix, i4 or i8 (WI=2/3).
> +			     If omitted, defaults to i8.  */
> +			  if (*asarg == ',')
>  			    {
> -			      error.msg
> -				= _("illegal operands (invalid data type)");
> -			      error.missing_ext = NULL;
> -			      goto out;
> +			      if (strcmp (asarg + 1, "i4") == 0)
> +				regno = 2;
> +			      else if (strcmp (asarg + 1, "i8") == 0)
> +				regno = 3;
> +			      else
> +				{
> +				  error.msg
> +				    = _("illegal operands (invalid data type)");
> +				  error.missing_ext = NULL;
> +				  goto out;
> +				}
> +			      asarg += 3;
>  			    }
> -			  asarg += 3;
> -			}
> -		      else if (*asarg != '\0')
> -			goto unknown_riscv_ip_operand;
> -		      regno = 3;
> -		      INSERT_OPERAND (SPACEMIT_IME_WI, *ip, regno);
> -		      continue;
> -		    case 'x':
> -		      /* Xpx: optional data-width suffix, i4 or i8 (WI=2/3).
> -			 If omitted, defaults to i8.  */
> -		      if (*asarg == ',')
> -			{
> -			  if (strcmp (asarg + 1, "i4") == 0)
> -			    regno = 2;
> -			  else if (strcmp (asarg + 1, "i8") == 0)
> -			    regno = 3;
> +			  else if (*asarg != '\0')
> +			    goto unknown_riscv_ip_operand;
>  			  else
> -			    {
> -			      error.msg
> -				= _("illegal operands (invalid data type)");
> -			      error.missing_ext = NULL;
> -			      goto out;
> -			    }
> -			  asarg += 3;
> -			}
> -		      else if (*asarg != '\0')
> -			goto unknown_riscv_ip_operand;
> -		      else
> -			regno = 3;
> -		      INSERT_OPERAND (SPACEMIT_IME_WI, *ip, regno);
> -		      continue;
> -		    default:
> -		      goto unknown_riscv_ip_operand;
> -		    }
> -		  break;
> +			    regno = 3;
> +			  INSERT_OPERAND (SPACEMIT_IME_WI, *ip, regno);
> +			  continue;
> +			default:
> +			  goto unknown_riscv_ip_operand;
> +		      }
> +		    break;
> +		  }
>  		default:
>  		  goto unknown_riscv_ip_operand;
>  		}
> diff --git a/opcodes/riscv-dis.c b/opcodes/riscv-dis.c
> index ca0d9bfd121..edb9ce04778 100644
> --- a/opcodes/riscv-dis.c
> +++ b/opcodes/riscv-dis.c
> @@ -924,14 +924,18 @@ print_insn_args (const char *oparg, insn_t l, bfd_vma pc, disassemble_info *info
>  		  switch (*++oparg)
>  		    {
>  		    case 'd':
> -		      unsigned vd = EXTRACT_OPERAND (SPACEMIT_IME_VD, l) * 2;
> -		      print (info->stream, dis_style_register, "%s",
> -			     riscv_vecr_names_numeric[vd]);
> +		      {
> +			unsigned vd = EXTRACT_OPERAND (SPACEMIT_IME_VD, l) * 2;
> +			print (info->stream, dis_style_register, "%s",
> +			       riscv_vecr_names_numeric[vd]);
> +		      }
>  		      break;
>  		    case 's':
> -		      unsigned vs = EXTRACT_OPERAND (SPACEMIT_IME_VS1, l) * 2;
> -		      print (info->stream, dis_style_register, "%s",
> -			     riscv_vecr_names_numeric[vs]);
> +		      {
> +			unsigned vs = EXTRACT_OPERAND (SPACEMIT_IME_VS1, l) * 2;
> +			print (info->stream, dis_style_register, "%s",
> +			       riscv_vecr_names_numeric[vs]);
> +		      }
>  		      break;
>  		    case 'm':
>  		      {
> -- 
> 2.34.1
  
Jan Beulich June 23, 2026, 10:54 a.m. UTC | #2
On 23.06.2026 11:52, Mark Zhuang wrote:
> --- a/gas/config/tc-riscv.c
> +++ b/gas/config/tc-riscv.c
> @@ -1791,49 +1791,53 @@ validate_riscv_insn (const struct riscv_opcode *opc, int length)
>  		}
>  		break;
>  	    case 'p': /* Vendor-specific (SpacemiT) operands.  */
> -	      size_t n;
> -	      size_t s;
> -	      switch (*++oparg)
> -		{
> -		case 'V':
> -		  switch (*++oparg)
> -		    {
> -		    case 'd':
> -		      USE_BITS (OP_MASK_SPACEMIT_IME_VD, OP_SH_SPACEMIT_IME_VD);
> +	      {
> +		size_t n;
> +		size_t s;
> +		switch (*++oparg)
> +		  {
> +		    case 'V':
> +		      switch (*++oparg)
> +			{
> +			  case 'd':
> +			    USE_BITS (OP_MASK_SPACEMIT_IME_VD,
> +				      OP_SH_SPACEMIT_IME_VD);
> +			    break;
> +			  case 's':
> +			    USE_BITS (OP_MASK_SPACEMIT_IME_VS1,
> +				      OP_SH_SPACEMIT_IME_VS1);
> +			    break;
> +			  case 'm':
> +			    USE_BITS (OP_MASK_SPACEMIT_IME_VMASK,
> +				      OP_SH_SPACEMIT_IME_VMASK);
> +			    break;
> +			  default:
> +			    goto unknown_validate_operand;
> +			}
>  		      break;
> -		    case 's':
> -		      USE_BITS (OP_MASK_SPACEMIT_IME_VS1,
> -				OP_SH_SPACEMIT_IME_VS1);
> +		    case 'u': /* Integer immediate, 'XpuN@S' ...
> +				 N-bit unsigned immediate at bit S.  */
> +		      n = strtol (oparg + 1, (char **)&oparg, 10);
> +		      if (*oparg != '@')
> +			goto unknown_validate_operand;
> +		      s = strtol (oparg + 1, (char **)&oparg, 10);
> +		      oparg--;
> +		      USE_IMM (n, s);
>  		      break;

Both variables are used only here, if I'm not mistaken. Can't we go with
less churn and less excessively deep indentation by limiting the change
to just this inner case block (moving the decls here)?

> @@ -4309,144 +4313,149 @@ riscv_ip (char *str, struct riscv_cl_insn *ip, expressionS *imm_expr,
>  		  break;
>  
>  		case 'p': /* Vendor-specific (SpacemiT) operands.  */
> -		  size_t n;
> -		  size_t s;
> -		  switch (*++oparg)
> -		    {
> -		    case 'V':
> -		      switch (*++oparg)
> -			{
> -			case 'd':
> -			  if (!reg_lookup (&asarg, RCLASS_VECR, &regno))
> -			    break;
> -			  if ((regno & 0x1) != 0)
> +		  {
> +		    size_t n;
> +		    size_t s;
> +		    switch (*++oparg)
> +		      {
> +			case 'V':
> +			  switch (*++oparg)
>  			    {
> -			      error.msg
> -				= _("illegal operands (vd must be even)");
> -			      error.missing_ext = NULL;
> -			      goto out;
> +			      case 'd':
> +				if (!reg_lookup (&asarg, RCLASS_VECR, &regno))
> +				  break;
> +				if ((regno & 0x1) != 0)
> +				  {
> +				    error.msg
> +				      = _("illegal operands (vd must be even)");
> +				    error.missing_ext = NULL;
> +				    goto out;
> +				  }
> +				INSERT_OPERAND (SPACEMIT_IME_VD, *ip, regno>>1);
> +				continue;
> +			      case 's':
> +				if (!reg_lookup (&asarg, RCLASS_VECR, &regno))
> +				  break;
> +				if ((regno & 0x1) != 0)
> +				  {
> +				    error.msg
> +				      = _("illegal operands "
> +					  "(vs1 must be even)");
> +				    error.missing_ext = NULL;
> +				    goto out;
> +				  }
> +				INSERT_OPERAND (SPACEMIT_IME_VS1,
> +						*ip, regno>>1);
> +				continue;
> +			      case 'm':
> +				if (!reg_lookup (&asarg, RCLASS_VECR, &regno))
> +				  break;
> +				if (regno >= 2)
> +				  {
> +				    error.msg
> +				      = _("illegal operands "
> +					  "(mask must be v0/v1)");
> +				    error.missing_ext = NULL;
> +				    goto out;
> +				  }
> +				INSERT_OPERAND (SPACEMIT_IME_VMASK, *ip, regno);
> +				continue;
> +			      default:
> +				goto unknown_riscv_ip_operand;
>  			    }
> -			  INSERT_OPERAND (SPACEMIT_IME_VD, *ip, regno>>1);
> +			  break;
> +			case 'u': /* Integer immediate, 'XpuN@S' ...
> +				     N-bit unsigned immediate at bit S.  */
> +			  n = strtol (oparg + 1, (char **)&oparg, 10);
> +			  if (*oparg != '@')
> +			    goto unknown_riscv_ip_operand;
> +			  s = strtol (oparg + 1, (char **)&oparg, 10);
> +			  oparg--;
> +			  my_getExpression (imm_expr, asarg, force_reloc);
> +			  check_absolute_expr (ip, imm_expr, false);
> +			  if (!VALIDATE_U_IMM (imm_expr->X_add_number, n))
> +			    as_bad (_("improper immediate value (%"PRIu64")"),
> +				    imm_expr->X_add_number);
> +			  INSERT_IMM (n, s, *ip, imm_expr->X_add_number);
> +			  imm_expr->X_op = O_absent;
> +			  asarg = expr_parse_end;
>  			  continue;

Similarly here then.

Jan
  

Patch

diff --git a/gas/config/tc-riscv.c b/gas/config/tc-riscv.c
index 5ffa2ef1f1d..cec3c1f65a2 100644
--- a/gas/config/tc-riscv.c
+++ b/gas/config/tc-riscv.c
@@ -1791,49 +1791,53 @@  validate_riscv_insn (const struct riscv_opcode *opc, int length)
 		}
 		break;
 	    case 'p': /* Vendor-specific (SpacemiT) operands.  */
-	      size_t n;
-	      size_t s;
-	      switch (*++oparg)
-		{
-		case 'V':
-		  switch (*++oparg)
-		    {
-		    case 'd':
-		      USE_BITS (OP_MASK_SPACEMIT_IME_VD, OP_SH_SPACEMIT_IME_VD);
+	      {
+		size_t n;
+		size_t s;
+		switch (*++oparg)
+		  {
+		    case 'V':
+		      switch (*++oparg)
+			{
+			  case 'd':
+			    USE_BITS (OP_MASK_SPACEMIT_IME_VD,
+				      OP_SH_SPACEMIT_IME_VD);
+			    break;
+			  case 's':
+			    USE_BITS (OP_MASK_SPACEMIT_IME_VS1,
+				      OP_SH_SPACEMIT_IME_VS1);
+			    break;
+			  case 'm':
+			    USE_BITS (OP_MASK_SPACEMIT_IME_VMASK,
+				      OP_SH_SPACEMIT_IME_VMASK);
+			    break;
+			  default:
+			    goto unknown_validate_operand;
+			}
 		      break;
-		    case 's':
-		      USE_BITS (OP_MASK_SPACEMIT_IME_VS1,
-				OP_SH_SPACEMIT_IME_VS1);
+		    case 'u': /* Integer immediate, 'XpuN@S' ...
+				 N-bit unsigned immediate at bit S.  */
+		      n = strtol (oparg + 1, (char **)&oparg, 10);
+		      if (*oparg != '@')
+			goto unknown_validate_operand;
+		      s = strtol (oparg + 1, (char **)&oparg, 10);
+		      oparg--;
+		      USE_IMM (n, s);
 		      break;
-		    case 'm':
-		      USE_BITS (OP_MASK_SPACEMIT_IME_VMASK,
-				OP_SH_SPACEMIT_IME_VMASK);
+		    case 'n':
+		    case 'b':
+		      used_bits |= ENCODE_SPACEMIT_IME_UIMM2_SP (-1U);
+		      break;
+		    case 'w':
+		    case 'x':
+		      USE_BITS (OP_MASK_SPACEMIT_IME_WI,
+				OP_SH_SPACEMIT_IME_WI);
 		      break;
 		    default:
 		      goto unknown_validate_operand;
-		    }
-		  break;
-		case 'u': /* Integer immediate, 'XpuN@S' ...
-			     N-bit unsigned immediate at bit S.  */
-		  n = strtol (oparg + 1, (char **)&oparg, 10);
-		  if (*oparg != '@')
-		    goto unknown_validate_operand;
-		  s = strtol (oparg + 1, (char **)&oparg, 10);
-		  oparg--;
-		  USE_IMM (n, s);
-		  break;
-		case 'n':
-		case 'b':
-		  used_bits |= ENCODE_SPACEMIT_IME_UIMM2_SP (-1U);
-		  break;
-		case 'w':
-		case 'x':
-		  USE_BITS (OP_MASK_SPACEMIT_IME_WI, OP_SH_SPACEMIT_IME_WI);
-		  break;
-		default:
-		  goto unknown_validate_operand;
-		}
-	      break;
+		  }
+		break;
+	      }
 	    default:
 	      goto unknown_validate_operand;
 	    }
@@ -4309,144 +4313,149 @@  riscv_ip (char *str, struct riscv_cl_insn *ip, expressionS *imm_expr,
 		  break;
 
 		case 'p': /* Vendor-specific (SpacemiT) operands.  */
-		  size_t n;
-		  size_t s;
-		  switch (*++oparg)
-		    {
-		    case 'V':
-		      switch (*++oparg)
-			{
-			case 'd':
-			  if (!reg_lookup (&asarg, RCLASS_VECR, &regno))
-			    break;
-			  if ((regno & 0x1) != 0)
+		  {
+		    size_t n;
+		    size_t s;
+		    switch (*++oparg)
+		      {
+			case 'V':
+			  switch (*++oparg)
 			    {
-			      error.msg
-				= _("illegal operands (vd must be even)");
-			      error.missing_ext = NULL;
-			      goto out;
+			      case 'd':
+				if (!reg_lookup (&asarg, RCLASS_VECR, &regno))
+				  break;
+				if ((regno & 0x1) != 0)
+				  {
+				    error.msg
+				      = _("illegal operands (vd must be even)");
+				    error.missing_ext = NULL;
+				    goto out;
+				  }
+				INSERT_OPERAND (SPACEMIT_IME_VD, *ip, regno>>1);
+				continue;
+			      case 's':
+				if (!reg_lookup (&asarg, RCLASS_VECR, &regno))
+				  break;
+				if ((regno & 0x1) != 0)
+				  {
+				    error.msg
+				      = _("illegal operands "
+					  "(vs1 must be even)");
+				    error.missing_ext = NULL;
+				    goto out;
+				  }
+				INSERT_OPERAND (SPACEMIT_IME_VS1,
+						*ip, regno>>1);
+				continue;
+			      case 'm':
+				if (!reg_lookup (&asarg, RCLASS_VECR, &regno))
+				  break;
+				if (regno >= 2)
+				  {
+				    error.msg
+				      = _("illegal operands "
+					  "(mask must be v0/v1)");
+				    error.missing_ext = NULL;
+				    goto out;
+				  }
+				INSERT_OPERAND (SPACEMIT_IME_VMASK, *ip, regno);
+				continue;
+			      default:
+				goto unknown_riscv_ip_operand;
 			    }
-			  INSERT_OPERAND (SPACEMIT_IME_VD, *ip, regno>>1);
+			  break;
+			case 'u': /* Integer immediate, 'XpuN@S' ...
+				     N-bit unsigned immediate at bit S.  */
+			  n = strtol (oparg + 1, (char **)&oparg, 10);
+			  if (*oparg != '@')
+			    goto unknown_riscv_ip_operand;
+			  s = strtol (oparg + 1, (char **)&oparg, 10);
+			  oparg--;
+			  my_getExpression (imm_expr, asarg, force_reloc);
+			  check_absolute_expr (ip, imm_expr, false);
+			  if (!VALIDATE_U_IMM (imm_expr->X_add_number, n))
+			    as_bad (_("improper immediate value (%"PRIu64")"),
+				    imm_expr->X_add_number);
+			  INSERT_IMM (n, s, *ip, imm_expr->X_add_number);
+			  imm_expr->X_op = O_absent;
+			  asarg = expr_parse_end;
 			  continue;
-			case 's':
-			  if (!reg_lookup (&asarg, RCLASS_VECR, &regno))
+			case 'n': /* Xpn: stride (0-1), paired with Xpx.  */
+			  my_getExpression (imm_expr, asarg, force_reloc);
+			  check_absolute_expr (ip, imm_expr, false);
+			  if (imm_expr->X_add_number < 0
+			      || imm_expr->X_add_number >= 2)
 			    break;
-			  if ((regno & 0x1) != 0)
+			  ip->insn_opcode
+			    |= ENCODE_SPACEMIT_IME_UIMM2_SP
+				 (imm_expr->X_add_number);
+			  imm_expr->X_op = O_absent;
+			  asarg = expr_parse_end;
+			  continue;
+			case 'b': /* Xpb: stride (0-3), paired with Xpw.  */
+			  my_getExpression (imm_expr, asarg, force_reloc);
+			  check_absolute_expr (ip, imm_expr, false);
+			  if (imm_expr->X_add_number < 0
+			      || imm_expr->X_add_number >= 4)
 			    {
-			      error.msg
-				= _("illegal operands (vs1 must be even)");
-			      error.missing_ext = NULL;
-			      goto out;
+			      as_bad (_("bad value for stride field,"
+					" value must be 0..3"));
+			      break;
 			    }
-			  INSERT_OPERAND (SPACEMIT_IME_VS1, *ip, regno>>1);
+			  ip->insn_opcode
+			    |= ENCODE_SPACEMIT_IME_UIMM2_SP
+				 (imm_expr->X_add_number);
+			  imm_expr->X_op = O_absent;
+			  asarg = expr_parse_end;
 			  continue;
-			case 'm':
-			  if (!reg_lookup (&asarg, RCLASS_VECR, &regno))
-			    break;
-			  if (regno >= 2)
+			case 'w':
+			  /* Xpw: optional data-width suffix, i8 only (WI=3).
+			     If omitted, defaults to i8.  */
+			  if (*asarg == ',')
 			    {
-			      error.msg
-				= _("illegal operands (mask must be v0/v1)");
-			      error.missing_ext = NULL;
-			      goto out;
+			      if (strcmp (asarg + 1, "i8") != 0)
+				{
+				  error.msg
+				    = _("illegal operands (invalid data type)");
+				  error.missing_ext = NULL;
+				  goto out;
+				}
+			      asarg += 3;
 			    }
-			  INSERT_OPERAND (SPACEMIT_IME_VMASK, *ip, regno);
+			  else if (*asarg != '\0')
+			    goto unknown_riscv_ip_operand;
+			  regno = 3;
+			  INSERT_OPERAND (SPACEMIT_IME_WI, *ip, regno);
 			  continue;
-			default:
-			  goto unknown_riscv_ip_operand;
-			}
-		      break;
-		    case 'u': /* Integer immediate, 'XpuN@S' ...
-				 N-bit unsigned immediate at bit S.  */
-		      n = strtol (oparg + 1, (char **)&oparg, 10);
-		      if (*oparg != '@')
-			goto unknown_riscv_ip_operand;
-		      s = strtol (oparg + 1, (char **)&oparg, 10);
-		      oparg--;
-		      my_getExpression (imm_expr, asarg, force_reloc);
-		      check_absolute_expr (ip, imm_expr, false);
-		      if (!VALIDATE_U_IMM (imm_expr->X_add_number, n))
-			as_bad (_("improper immediate value (%"PRIu64")"),
-				imm_expr->X_add_number);
-		      INSERT_IMM (n, s, *ip, imm_expr->X_add_number);
-		      imm_expr->X_op = O_absent;
-		      asarg = expr_parse_end;
-		      continue;
-		    case 'n': /* Xpn: stride (0-1), paired with Xpx.  */
-		      my_getExpression (imm_expr, asarg, force_reloc);
-		      check_absolute_expr (ip, imm_expr, false);
-		      if (imm_expr->X_add_number < 0
-			  || imm_expr->X_add_number >= 2)
-			break;
-		      ip->insn_opcode
-			|= ENCODE_SPACEMIT_IME_UIMM2_SP
-			     (imm_expr->X_add_number);
-		      imm_expr->X_op = O_absent;
-		      asarg = expr_parse_end;
-		      continue;
-		    case 'b': /* Xpb: stride (0-3), paired with Xpw.  */
-		      my_getExpression (imm_expr, asarg, force_reloc);
-		      check_absolute_expr (ip, imm_expr, false);
-		      if (imm_expr->X_add_number < 0
-			  || imm_expr->X_add_number >= 4)
-			{
-			  as_bad (_("bad value for stride field,"
-				    " value must be 0..3"));
-			  break;
-			}
-		      ip->insn_opcode
-			|= ENCODE_SPACEMIT_IME_UIMM2_SP
-			     (imm_expr->X_add_number);
-		      imm_expr->X_op = O_absent;
-		      asarg = expr_parse_end;
-		      continue;
-		    case 'w':
-		      /* Xpw: optional data-width suffix, i8 only (WI=3).
-			 If omitted, defaults to i8.  */
-		      if (*asarg == ',')
-			{
-			  if (strcmp (asarg + 1, "i8") != 0)
+			case 'x':
+			  /* Xpx: optional data-width suffix, i4 or i8 (WI=2/3).
+			     If omitted, defaults to i8.  */
+			  if (*asarg == ',')
 			    {
-			      error.msg
-				= _("illegal operands (invalid data type)");
-			      error.missing_ext = NULL;
-			      goto out;
+			      if (strcmp (asarg + 1, "i4") == 0)
+				regno = 2;
+			      else if (strcmp (asarg + 1, "i8") == 0)
+				regno = 3;
+			      else
+				{
+				  error.msg
+				    = _("illegal operands (invalid data type)");
+				  error.missing_ext = NULL;
+				  goto out;
+				}
+			      asarg += 3;
 			    }
-			  asarg += 3;
-			}
-		      else if (*asarg != '\0')
-			goto unknown_riscv_ip_operand;
-		      regno = 3;
-		      INSERT_OPERAND (SPACEMIT_IME_WI, *ip, regno);
-		      continue;
-		    case 'x':
-		      /* Xpx: optional data-width suffix, i4 or i8 (WI=2/3).
-			 If omitted, defaults to i8.  */
-		      if (*asarg == ',')
-			{
-			  if (strcmp (asarg + 1, "i4") == 0)
-			    regno = 2;
-			  else if (strcmp (asarg + 1, "i8") == 0)
-			    regno = 3;
+			  else if (*asarg != '\0')
+			    goto unknown_riscv_ip_operand;
 			  else
-			    {
-			      error.msg
-				= _("illegal operands (invalid data type)");
-			      error.missing_ext = NULL;
-			      goto out;
-			    }
-			  asarg += 3;
-			}
-		      else if (*asarg != '\0')
-			goto unknown_riscv_ip_operand;
-		      else
-			regno = 3;
-		      INSERT_OPERAND (SPACEMIT_IME_WI, *ip, regno);
-		      continue;
-		    default:
-		      goto unknown_riscv_ip_operand;
-		    }
-		  break;
+			    regno = 3;
+			  INSERT_OPERAND (SPACEMIT_IME_WI, *ip, regno);
+			  continue;
+			default:
+			  goto unknown_riscv_ip_operand;
+		      }
+		    break;
+		  }
 		default:
 		  goto unknown_riscv_ip_operand;
 		}
diff --git a/opcodes/riscv-dis.c b/opcodes/riscv-dis.c
index ca0d9bfd121..edb9ce04778 100644
--- a/opcodes/riscv-dis.c
+++ b/opcodes/riscv-dis.c
@@ -924,14 +924,18 @@  print_insn_args (const char *oparg, insn_t l, bfd_vma pc, disassemble_info *info
 		  switch (*++oparg)
 		    {
 		    case 'd':
-		      unsigned vd = EXTRACT_OPERAND (SPACEMIT_IME_VD, l) * 2;
-		      print (info->stream, dis_style_register, "%s",
-			     riscv_vecr_names_numeric[vd]);
+		      {
+			unsigned vd = EXTRACT_OPERAND (SPACEMIT_IME_VD, l) * 2;
+			print (info->stream, dis_style_register, "%s",
+			       riscv_vecr_names_numeric[vd]);
+		      }
 		      break;
 		    case 's':
-		      unsigned vs = EXTRACT_OPERAND (SPACEMIT_IME_VS1, l) * 2;
-		      print (info->stream, dis_style_register, "%s",
-			     riscv_vecr_names_numeric[vs]);
+		      {
+			unsigned vs = EXTRACT_OPERAND (SPACEMIT_IME_VS1, l) * 2;
+			print (info->stream, dis_style_register, "%s",
+			       riscv_vecr_names_numeric[vs]);
+		      }
 		      break;
 		    case 'm':
 		      {