/* { dg-options "-I ${srcdir}/../../more-hdrs -Wshorten-64-to-32 -Wno-long-long" } */
/* { dg-do run { target "powerpc*-*-darwin*" } } */
#include "ppc_intrinsics.h"
#include <stdlib.h>

int main( void )
{
  int intconst = 0x5;
  long long longlongconst = 0x5;
  int intloc, intloc1, intloc2;
  unsigned int uintloc, uintloc1, uintloc2;
  long longloc;
  long long longlongloc;
  int fails = 0;

  intloc = __cntlzw(intconst);
  if (intloc != 29)
    ++fails;

  longlongloc = __cntlzd(longlongconst);
  if (longlongloc != 61)
    ++fails;

  intloc = 0xffff;
  __rlwimi(intloc, 0x21876543, 8, 0, 23);
  if (intloc != 0x876543ff)
    ++fails;

  intloc = __rlwinm(0x21876543, 8, 0, 31);
  if (intloc != 0x87654321)
    ++fails;

  longloc = __rlwinm(0x45, 5, 24, 31);
  if (longloc != 0xa0)
    ++fails;

  longloc = __rlwnm(0x47, 5, 24, 31);
  if (longloc != 0xe0)
    ++fails;

  intloc1 = 1 << 20;
  intloc2 = 1 << 21;
  intloc = __mulhw (intloc1, intloc2);
  if (intloc != (1 << 9))
    ++fails;

  intloc1 = 0xfffe0000;
  intloc2 = 0xfffc0000;
  intloc = __mulhw (intloc1, intloc2);
  if (intloc != 8)
    ++fails;

  uintloc1 = 0xffffffff;
  uintloc2 = 0xfffffffe;
  uintloc = __mulhwu (uintloc1, uintloc2);
  if (uintloc != 0xfffffffd)
    ++fails;

  uintloc1 = 0xfffe0000;
  uintloc2 = 0xfffc0000;
  uintloc = __mulhwu (uintloc1, uintloc2);
  if (uintloc != 0xfffa0008)
    ++fails;

  return fails;
}
