/* Check that the compiler properly uses 16-bit encodings where available.  */
/* { dg-do compile } */
/* { dg-require-effective-target arm_thumb2_ok } */
/* { dg-options "-Os -fno-builtin -mthumb" } */

int
f (int a, int b)
{
  return a + b;
}

/* { dg-final { scan-assembler "add	r0, r0, r1" } } */

int
f2 (int a, int b, int c)
{
  return b + c;
}

/* { dg-final { scan-assembler "adds	r0, r1, r2" } } */
int
g1 (int a)
{
  return a + 255;
}

/* { dg-final { scan-assembler "adds	r0, r0, #255" } } */

int
g2 (int a)
{
  return a + 256;
}

/* { dg-final { scan-assembler "add	r0, r0, #256" } } */

int
g3 (int a)
{
  return a - 255;
}

/* { dg-final { scan-assembler "subs	r0, r0, #255" } } */

int
g4 (int a)
{
  return a - 256;
}

/* { dg-final { scan-assembler "sub	r0, r0, #256" } } */

int
h1 (int a, int b)
{
  return b + 7;
}

/* { dg-final { scan-assembler "adds	r0, r1, #7" } } */

int
h2 (int a, int b)
{
  return b + 8;
}

/* { dg-final { scan-assembler "add	r0, r1, #8" } } */

int
h3 (int a, int b)
{
  return b - 7;
}

/* { dg-final { scan-assembler "subs	r0, r1, #7" } } */

int
h4 (int a, int b)
{
  return b - 8;
}

/* { dg-final { scan-assembler "sub	r0, r1, #8" } } */

int
i (int a, int b)
{
  return b;
}

/* { dg-final { scan-assembler "mov	r0, r1" } } */

int
j1 ()
{
  return 255;
}

/* { dg-final { scan-assembler "movs	r0, #255" } } */

int
j2 ()
{
  return 256;
}

/* { dg-final { scan-assembler "mov	r0, #256" } } */

int
k (int a, int b)
{
  return b << 15;
}

/* { dg-final { scan-assembler "lsls	r0, r1, #15" } } */

int
l1 (int a, int b)
{
  return a << b;
}

/* { dg-final { scan-assembler "lsls	r0, r0, r1" } } */

int
l2 (int a, int b, int c)
{
  return b << c;
}

/* { dg-final { scan-assembler "lsl	r0, r1, r2" } } */

int
m (int a, int b)
{
  return b >> 15;
}

/* { dg-final { scan-assembler "asrs	r0, r1, #15" } } */

int
n1 (int a, int b)
{
  return a >> b;
}

/* { dg-final { scan-assembler "asrs	r0, r0, r1" } } */

int
n2 (int a, int b, int c)
{
  return b >> c;
}

/* { dg-final { scan-assembler "asr	r0, r1, r2" } } */

unsigned int
o (unsigned int a, unsigned int b)
{
  return b >> 15;
}

/* { dg-final { scan-assembler "lsrs	r0, r1, #15" } } */

unsigned int
p1 (unsigned int a, unsigned int b)
{
  return a >> b;
}

/* { dg-final { scan-assembler "lsrs	r0, r0, r1" } } */

unsigned int
p2 (unsigned int a, unsigned int b, unsigned int c)
{
  return b >> c;
}

/* { dg-final { scan-assembler "lsr	r0, r1, r2" } } */

int
q (int a, int b)
{
  return b * a;
}

/* { dg-final { scan-assembler "muls	r0, r1, r0" } } */

int
r (int a, int b)
{
  return ~b;
}

/* { dg-final { scan-assembler "mvns	r0, r1" } } */

int
s (int a, int b)
{
  return -b;
}

/* { dg-final { scan-assembler "rsbs	r0, r1, #0" } } */
