|| TYPE_LENGTH (type) > 2 * mips_saved_regsize (tdep))
|| TYPE_LENGTH (type) > 2 * mips_abi_regsize (gdbarch))
mips_n32n64_return_value (struct gdbarch *gdbarch,			  struct type *type, struct regcache *regcache,			  void *readbuf, const void *writebuf){  struct gdbarch_tdep *tdep = gdbarch_tdep (current_gdbarch);  if (TYPE_CODE (type) == TYPE_CODE_STRUCT      || TYPE_CODE (type) == TYPE_CODE_UNION      || TYPE_CODE (type) == TYPE_CODE_ARRAY      || TYPE_LENGTH (type) > 2 * mips_saved_regsize (tdep))    return RETURN_VALUE_STRUCT_CONVENTION;  else if (TYPE_CODE (type) == TYPE_CODE_FLT	   && tdep->mips_fpu_type != MIPS_FPU_NONE)    {      /* A floating-point value belongs in the least significant part         of FP0.  */      if (mips_debug)	fprintf_unfiltered (gdb_stderr, "Return float in $fp0\n");      mips_xfer_register (regcache,			  NUM_REGS + mips_regnum (current_gdbarch)->fp0,			  TYPE_LENGTH (type),			  TARGET_BYTE_ORDER, readbuf, writebuf, 0);      return RETURN_VALUE_REGISTER_CONVENTION;    }  else if (TYPE_CODE (type) == TYPE_CODE_STRUCT	   && TYPE_NFIELDS (type) <= 2	   && TYPE_NFIELDS (type) >= 1	   && ((TYPE_NFIELDS (type) == 1		&& (TYPE_CODE (TYPE_FIELD_TYPE (type, 0))		    == TYPE_CODE_FLT))	       || (TYPE_NFIELDS (type) == 2		   && (TYPE_CODE (TYPE_FIELD_TYPE (type, 0))		       == TYPE_CODE_FLT)		   && (TYPE_CODE (TYPE_FIELD_TYPE (type, 1))		       == TYPE_CODE_FLT)))	   && tdep->mips_fpu_type != MIPS_FPU_NONE)    {      /* A struct that contains one or two floats.  Each value is part         in the least significant part of their floating point         register..  */      int regnum;      int field;      for (field = 0, regnum = mips_regnum (current_gdbarch)->fp0;	   field < TYPE_NFIELDS (type); field++, regnum += 2)	{	  int offset = (FIELD_BITPOS (TYPE_FIELDS (type)[field])			/ TARGET_CHAR_BIT);	  if (mips_debug)	    fprintf_unfiltered (gdb_stderr, "Return float struct+%d\n",				offset);	  mips_xfer_register (regcache, NUM_REGS + regnum,			      TYPE_LENGTH (TYPE_FIELD_TYPE (type, field)),			      TARGET_BYTE_ORDER, readbuf, writebuf, offset);	}      return RETURN_VALUE_REGISTER_CONVENTION;    }  else if (TYPE_CODE (type) == TYPE_CODE_STRUCT	   || TYPE_CODE (type) == TYPE_CODE_UNION)    {      /* A structure or union.  Extract the left justified value,         regardless of the byte order.  I.e. DO NOT USE         mips_xfer_lower.  */      int offset;      int regnum;      for (offset = 0, regnum = V0_REGNUM;	   offset < TYPE_LENGTH (type);	   offset += register_size (current_gdbarch, regnum), regnum++)	{	  int xfer = register_size (current_gdbarch, regnum);	  if (offset + xfer > TYPE_LENGTH (type))	    xfer = TYPE_LENGTH (type) - offset;	  if (mips_debug)	    fprintf_unfiltered (gdb_stderr, "Return struct+%d:%d in $%d\n",				offset, xfer, regnum);	  mips_xfer_register (regcache, NUM_REGS + regnum, xfer,			      BFD_ENDIAN_UNKNOWN, readbuf, writebuf, offset);	}      return RETURN_VALUE_REGISTER_CONVENTION;    }  else    {      /* A scalar extract each part but least-significant-byte         justified.  */      int offset;      int regnum;      for (offset = 0, regnum = V0_REGNUM;	   offset < TYPE_LENGTH (type);	   offset += register_size (current_gdbarch, regnum), regnum++)	{	  int xfer = register_size (current_gdbarch, regnum);	  if (offset + xfer > TYPE_LENGTH (type))	    xfer = TYPE_LENGTH (type) - offset;	  if (mips_debug)	    fprintf_unfiltered (gdb_stderr, "Return scalar+%d:%d in $%d\n",				offset, xfer, regnum);	  mips_xfer_register (regcache, NUM_REGS + regnum, xfer,			      TARGET_BYTE_ORDER, readbuf, writebuf, offset);	}      return RETURN_VALUE_REGISTER_CONVENTION;    }}