float_sub_union.c 1.01 KB
////C: '-msoft-fp-single' 
//C: '-O3 -daiteq-fpu-type=none -msoft-float'
////A: '--has-fhalf'

#include <stdint.h>


typedef struct data_item {
  unsigned opa;
  unsigned opb;
  unsigned reference;
} data_item_t;

data_item_t data[] = {
  {0x8683F7FF, 0xC07F3FFF, 0xC07F3FFF},
  {0x00000000, 0x3C072C85, 0x3C072C85},
  {0x9EDE38F7, 0x3E7F7F7F, 0x3E7F7F7F},
  {0xDF7EFFFF, 0x00000000, 0xDF7EFFFF},
  {0x4F951295, 0x41E00002, 0x4F951295},
  {0x00000000, 0x00000000, 0x00000000},
  {0xC2800040, 0x4FFFDFF7, 0x4FFFDFF7},
  {0x00000000, 0xBFFFFFCF, 0xBFFFFFCF},
  {0x015E834A, 0xC700FFBF, 0xC700FFBF},
};

#define N  (sizeof(data)/sizeof(data_item_t))

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

union uf32 {
  float     f;
  uint32_t  u;
  int32_t   i;
  half      h[2];
  phalf     ph;
};

int main(void)
{
  union uf32 a, b, z;
  int r = 0;

  for (unsigned i=0;i<N;++i) {
    a.u = data[i].opa;
    b.u = data[i].opb;
    z.u = 0;
    
    z.f = a.f - b.f;
    
    if (z.u!=data[i].reference) r++;
  }

  return r;
}