Exemple #1
0
pwr_tBoolean
pdr_float(PDR *pdrs,
          float *fp)
{
    if ((pdrs->x_handy -= sizeof(float)) < 0)
        return FALSE;

    if (pdrs->x_op == PDR_DECODE) {

        if (pdrs->src.b.ft != pdrs->trg.b.ft) {
            if (pdrs->src.b.ft == co_eFT_ieeeS)
                co_vaxf2ieee(pdrs->src.b.bo, pdrs->trg.b.bo, pdrs->x_private, (char *)fp);
            else
                co_ieee2vaxf(pdrs->src.b.bo, pdrs->trg.b.bo, pdrs->x_private, (char *)fp);
                
        }
        else if (pdrs->trg.b.bo != pdrs->src.b.bo) {
                ENDIAN_SWAP_INT((int *)fp, (int *)pdrs->x_private);
        } else {
                *(int *)fp = *(int *)pdrs->x_private;
        }
    }


    /* Encode */
    else {
        if (pdrs->src.b.ft != pdrs->trg.b.ft) {
            if (pdrs->src.b.ft == co_eFT_ieeeS)
                co_vaxf2ieee(pdrs->src.b.bo, pdrs->trg.b.bo, (const char*)fp, pdrs->x_private);
            else
                co_ieee2vaxf(pdrs->src.b.bo, pdrs->trg.b.bo, (const char*)fp, pdrs->x_private);
                
        }
        else if (pdrs->trg.b.bo != pdrs->src.b.bo) {
            ENDIAN_SWAP_INT((int *)pdrs->x_private, (int *)fp);
        } else {
            *(int *)pdrs->x_private = *(int *)fp;
        }
        
    }
    

    pdrs->x_private += sizeof(float);

    return TRUE;    
}
Exemple #2
0
/*
 * When encoded, pdr_mFormat should always be stored as big endian.
 * When decoded, the source must be big endian.
 *
 */
pwr_tBoolean
pdr_co_mFormat(PDR *pdrs, co_mFormat *objp)
{
    if ((pdrs->x_handy -= sizeof(int)) < 0)
        return (FALSE);

    if (pdrs->x_op == PDR_DECODE) {
        if (pdrs->trg.b.bo != co_eBO_little) {
            ENDIAN_SWAP_INT(objp, (int *)pdrs->x_private);
        } else {
           *(int *)objp = *(int *)pdrs->x_private;
        }
    } else {
        if (pdrs->src.b.bo != co_eBO_big) {
            ENDIAN_SWAP_INT((int *)pdrs->x_private, objp);
        } else {
            *(int *)pdrs->x_private = *(int *)(objp);
        }
    }

    pdrs->x_private += sizeof(int);

    return TRUE;
}
Exemple #3
0
static pwr_tBoolean
dlinux_sfloat (
  char			*p,
  gdb_sAttribute	*ap
)
{
  union vax_f_le	*vp;
  union i3e_s_le	i3e;

  for (i = ap->elem; i > 0; i--) {
    vp = ((union vax_f_le *)tp);
    ENDIAN_SWAP_INT(&i3e.i, sp);
    
    /* PPC some times sets the sign bit for zero (-0), which isn't valid
     * for f-float. ML 971025
     */ 
    if (i3e.i == 0x80000000)
      i3e.i = 0; /* Clear sign bit */

    if (i3e.b.f22_0 == 0x0 && i3e.b.exp == 0xff) {  /* High value.  */
      vp->b.f22_16 = 0x7f;
      vp->b.exp	   = 0xff;
      vp->b.f15_0  = 0xffff;
    } else if (i3e.b.f22_0 == 0x0 && i3e.b.exp == 0x00) {  /* Low value.  */
      vp->i = 0;
    } else {
      vp->b.exp	   = i3e.v.exp - I3E_S_BIAS + VAX_F_BIAS;
      vp->b.f22_16 = i3e.v.f22_16;
      vp->b.f15_0  = i3e.v.f15_0;
    }

    vp->b.sign = i3e.b.sign;

    tp += sizeof(float);
    sp += sizeof(float);
    *size -= sizeof(float);
  }

  return TRUE;
}