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; }
/* * 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; }
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; }