blob: 62728cbc6e3f2e41929ba2ec053425d6475533d2 [file] [log] [blame]
/* { dg-do run { target aarch64*-*-* } } */
/* { dg-options "-O2 --save-temps -fno-inline" } */
/* { dg-require-effective-target aarch64_big_endian } */
extern void abort (void);
typedef struct bitfield
{
unsigned short eight: 8;
unsigned short four: 4;
unsigned short five: 5;
unsigned short seven: 7;
unsigned int sixteen: 16;
} bitfield;
bitfield
bfi1 (bitfield a)
{
/* { dg-final { scan-assembler "bfi\tx\[0-9\]+, x\[0-9\]+, 56, 8" } } */
a.eight = 3;
return a;
}
bitfield
bfi2 (bitfield a)
{
/* { dg-final { scan-assembler "bfi\tx\[0-9\]+, x\[0-9\]+, 43, 5" } } */
a.five = 7;
return a;
}
bitfield
movk (bitfield a)
{
/* { dg-final { scan-assembler "movk\tx\[0-9\]+, 0x1d6b, lsl 16" } } */
a.sixteen = 7531;
return a;
}
bitfield
set1 (bitfield a)
{
/* { dg-final { scan-assembler "orr\tx\[0-9\]+, x\[0-9\]+, 272678883688448" } } */
a.five = 0x1f;
return a;
}
bitfield
set0 (bitfield a)
{
/* { dg-final { scan-assembler "and\tx\[0-9\]+, x\[0-9\]+, -272678883688449" } } */
a.five = 0;
return a;
}
int
main (int argc, char** argv)
{
static bitfield a;
bitfield b = bfi1 (a);
bitfield c = bfi2 (b);
bitfield d = movk (c);
if (d.eight != 3)
abort ();
if (d.five != 7)
abort ();
if (d.sixteen != 7531)
abort ();
d = set1 (d);
if (d.five != 0x1f)
abort ();
d = set0 (d);
if (d.five != 0)
abort ();
return 0;
}