/* Test forcing 128-bit logical types into GPR registers.  */

#if defined(NO_ASM)
#define FORCE_REG1(X)
#define FORCE_REG2(X,Y)

#else
#if defined(USE_ALTIVEC)
#define REG_CLASS "+v"
#define PRINT_REG1 "# altivec reg %0"
#define PRINT_REG2 "# altivec reg %0, %1"

#elif defined(USE_FPR)
#define REG_CLASS "+d"
#define PRINT_REG1 "# fpr reg %0"
#define PRINT_REG2 "# fpr reg %0, %1"

#elif defined(USE_VSX)
#define REG_CLASS "+wa"
#define PRINT_REG1 "# vsx reg %x0"
#define PRINT_REG2 "# vsx reg %x0, %x1"

#else
#define REG_CLASS "+r"
#define PRINT_REG1 "# gpr reg %0"
#define PRINT_REG2 "# gpr reg %0, %1"
#endif

#define FORCE_REG1(X) __asm__ (PRINT_REG1 : REG_CLASS (X))
#define FORCE_REG2(X,Y) __asm__ (PRINT_REG2 : REG_CLASS (X), REG_CLASS (Y))
#endif

void ptr1 (TYPE *p)
{
  TYPE a = p[1];
  TYPE b = p[2];
  TYPE c;

  FORCE_REG2 (a, b);
  c = a & b;					/* AND */
  FORCE_REG1 (c);
  p[0] = c;
}

void ptr2 (TYPE *p)
{
  TYPE a = p[1];
  TYPE b = p[2];
  TYPE c;

  FORCE_REG2 (a, b);
  c = a | b;					/* OR */
  FORCE_REG1 (c);
  p[0] = c;
}

void ptr3 (TYPE *p)
{
  TYPE a = p[1];
  TYPE b = p[2];
  TYPE c;

  FORCE_REG2 (a, b);
  c = a ^ b;					/* XOR */
  FORCE_REG1 (c);
  p[0] = c;
}

void ptr4 (TYPE *p)
{
  TYPE a = p[1];
  TYPE b;

  FORCE_REG1 (a);
  b = ~a;					/* NOR */
  FORCE_REG1 (b);
  p[0] = b;
}

void ptr5 (TYPE *p)
{
  TYPE a = p[1];
  TYPE b = p[2];
  TYPE c;

  FORCE_REG2 (a, b);
  c = ~(a & b);					   /* NAND */
  FORCE_REG1 (c);
  p[0] = c;
}

void ptr6 (TYPE *p)
{
  TYPE a = p[1];
  TYPE b = p[2];
  TYPE c;

  FORCE_REG2 (a, b);
  c = ~(a | b);					   /* AND */
  FORCE_REG1 (c);
  p[0] = c;
}

void ptr7 (TYPE *p)
{
  TYPE a = p[1];
  TYPE b = p[2];
  TYPE c;

  FORCE_REG2 (a, b);
  c = ~(a ^ b);					   /* EQV */
  FORCE_REG1 (c);
  p[0] = c;
}

void ptr8 (TYPE *p)
{
  TYPE a = p[1];
  TYPE b = p[2];
  TYPE c;

  FORCE_REG2 (a, b);
  c = (~a) & b;					   /* ANDC */
  FORCE_REG1 (c);
  p[0] = c;
}

void ptr9 (TYPE *p)
{
  TYPE a = p[1];
  TYPE b = p[2];
  TYPE c;

  FORCE_REG2 (a, b);
  c = (~a) | b;					   /* ORC */
  FORCE_REG1 (c);
  p[0] = c;
}

void ptr10 (TYPE *p)
{
  TYPE a = p[1];
  TYPE b = p[2];
  TYPE c;

  FORCE_REG2 (a, b);
  c = (~a) ^ b;					   /* EQV */
  FORCE_REG1 (c);
  p[0] = c;
}

void ptr11 (TYPE *p)
{
  TYPE a = p[1];
  TYPE b = p[2];
  TYPE c;

  FORCE_REG2 (a, b);
  c = a & (~b);					   /* ANDC */
  FORCE_REG1 (c);
  p[0] = c;
}

void ptr12 (TYPE *p)
{
  TYPE a = p[1];
  TYPE b = p[2];
  TYPE c;

  FORCE_REG2 (a, b);
  c = a | (~b);					   /* ORC */
  FORCE_REG1 (c);
  p[0] = c;
}

void ptr13 (TYPE *p)
{
  TYPE a = p[1];
  TYPE b = p[2];
  TYPE c;

  FORCE_REG2 (a, b);
  c = a ^ (~b);					   /* AND */
  FORCE_REG1 (c);
  p[0] = c;
}