case F_REG_M: case FPUL_M: case FPSCR_M:  if (user->type != arg - F_REG_M + F_REG_N) goto fail; reg_m = user->reg; break;
get_specific (opcode, operands)     sh_opcode_info *opcode;     sh_operand_info *operands;{  sh_opcode_info *this_try = opcode;  char *name = opcode->name;  int n = 0;  while (opcode->name)    {      this_try = opcode++;      if (this_try->name != name)	{	  /* We've looked so far down the table that we've run out of	     opcodes with the same name */	  return 0;	}      /* look at both operands needed by the opcodes and provided by         the user - since an arg test will often fail on the same arg         again and again, we'll try and test the last failing arg the         first on each opcode try */      for (n = 0; this_try->arg[n]; n++)	{	  sh_operand_info *user = operands + n;	  sh_arg_type arg = this_try->arg[n];	  switch (arg)	    {	    case A_IMM:	    case A_BDISP12:	    case A_BDISP8:	    case A_DISP_GBR:	    case A_DISP_PC:	    case A_MACH:	    case A_PR:	    case A_MACL:	      if (user->type != arg)		goto fail;	      break;	    case A_R0:	      /* opcode needs r0 */	      if (user->type != A_REG_N || user->reg != 0)		goto fail;	      break;	    case A_R0_GBR:	      if (user->type != A_R0_GBR || user->reg != 0)		goto fail;	      break;	    case A_REG_N:	    case A_INC_N:	    case A_DEC_N:	    case A_IND_N:	    case A_IND_R0_REG_N:	    case A_DISP_REG_N:	      /* Opcode needs rn */	      if (user->type != arg)		goto fail;	      reg_n = user->reg;	      break;	    case A_GBR:	    case A_SR:	    case A_VBR:	      if (user->type != arg)		goto fail;	      break;	    case A_REG_M:	    case A_INC_M:	    case A_DEC_M:	    case A_IND_M:	    case A_IND_R0_REG_M:	    case A_DISP_REG_M:	      /* Opcode needs rn */	      if (user->type != arg - A_REG_M + A_REG_N)		goto fail;	      reg_m = user->reg;	      break;		    default:	      printf ("unhandled %d\n", arg);	      goto fail;	    }	}      return this_try;    fail:;    }  return 0;}