x86_64-bitfield4.c   [plain text]


/* APPLE LOCAL file radar 6131435 */
/* { dg-do compile { target { { i?86-*-* x86_64-*-* } && lp64 } } } */
/* { dg-options "-O2" } */
/* { dg-final { scan-assembler "movb" } } */
/* { dg-final { scan-assembler "movw" } } */
/* { dg-final { scan-assembler "andw" } } */
#define  ARRAY_LENGTH  16
union bitfield {
  struct {
    unsigned int field0 : 6;
    unsigned int field1 : 6;
    unsigned int field2 : 6;
    unsigned int field3 : 6;
    unsigned int field4 : 3;
    unsigned int field5 : 4;
    unsigned int field6 : 1;
  } bitfields, bits;
  unsigned int	 u32All;
  signed int	 i32All;
  float	         f32All;
};

typedef struct program_t {
  union bitfield array[ARRAY_LENGTH];
} program;

void foo(program* prog, unsigned int fmt1)
{
  unsigned int shift = 0;
  unsigned int texCount = 0;
  unsigned int i;
	
  for (i = 0; i < 8; i++)
  {
    prog->array[i].bitfields.field0 = texCount;
    prog->array[i].bitfields.field1 = texCount + 1;
    prog->array[i].bitfields.field2 = texCount + 2;
    prog->array[i].bitfields.field3 = texCount + 3;
    texCount += (fmt1 >> shift) & 0x7;
    shift    += 3;
  }
}
/* APPLE LOCAL file radar 4287182 */