ph_swap.c 1.35 KB
////A: '--has-fpack --has-fhalf'
////C: '-daiteq-fpu-type=daifpu_php_divsqrt'

typedef half phalf __attribute__((ext_vector_type(2)));

typedef union fp32 {
/*
  struct {
    half up;
    half dn;
  } sth;
*/
  half h[2];
  phalf ph;
  float f;
  unsigned u;
} fp32;


#define opcode_FMOVHU(A, B, RES)                                               \
  RES.h[0]=A.h[0]; RES.h[1]=B.h[0]
#define opcode_FMOVHL(A, B, RES)                                               \
  RES.h[0]=A.h[1]; RES.h[1]=B.h[1]
#define opcode_FMOVHUL(A, B, RES)                                              \
  RES.h[0]=A.h[0]; RES.h[1]=B.h[1]
#define opcode_FMOVHLU(A, B, RES)                                              \
  RES.h[0]=A.h[1]; RES.h[1]=B.h[0]
#define opcode_FSWAPH(A, RES)                                                  \
  RES.h[0]=A.h[1]; RES.h[1]=A.h[0]
#define opcode_FMOVHZU(A, RES)                                                 \
  RES.h[0]=0.0H; RES.h[1]=A.h[0]
#define opcode_FMOVHZL(A, RES)                                                 \
  RES.h[0]=0.0H; RES.h[1]=A.h[1]


int main(void)
{
  volatile half d[10];
  volatile phalf o;

  fp32 opa, opb;
  fp32 result;

//  opa.h[0] = 1.2345h;
//  opa.h[1] = 34.567h;

//  opb.h[0] = 2.345h;
//  opb.h[1] = 7.897h;

  opcode_FSWAPH(opa, result);

  opcode_FMOVHZU(opb, result);
  opcode_FMOVHLU(opa, opb, result);

  return 0;
}