/*
  !!DESCRIPTION!!
  !!ORIGIN!!      SDCC regression tests
  !!LICENCE!!     GPL, read COPYING.GPL
*/

#include <stdio.h>
#include <limits.h>

unsigned char success=0;
unsigned char failures=0;
unsigned char dummy=0;

unsigned int uint0 = 0;
unsigned int uint1 = 0;
unsigned char uchar0 = 0;
unsigned char uchar1 = 0;
unsigned long ulong0 = 0;

void done()
{
  dummy++;
}

/* uchar0 = 0xff; */
void and_lit2uchar(void)
{
  if(uchar0 != 0xff)
    failures++;

  uchar0 &= 0x7f;

  if(uchar0 != 0x7f)
    failures++;

  uchar0 &= 0x3f;

  if(uchar0 != 0x3f)
    failures++;

  uchar0 &= 0xdf;

  if(uchar0 != 0x1f)
    failures++;
}

void and_lit2uint(void)
{
  if(uint0 != 0xffff)
    failures++;

  uint0 &= 0x7fff;

  if(uint0 != 0x7fff)
    failures++;

  uint0 &= 0x3fff;

  if(uint0 != 0x3fff)
    failures++;

  uint0 &= 0xdfff;

  if(uint0 != 0x1fff)
    failures++;

  uint0 &= 0xff7f;

  if(uint0 != 0x1f7f)
    failures++;

  uint0 &= 0x0f0f;

  if(uint0 != 0x0f0f)
    failures++;

  uint0 &= 0xfefe;

  if(uint0 != 0x0e0e)
    failures++;

  uint0 &= 0xf0f0;

  if(uint0 != 0)
    failures++;
}

void and_lit2ulong(void)
{
  if(ulong0 != 0xffffffff)
    failures++;

  ulong0 &= 0x7fffffff;

  if(ulong0 != 0x7fffffff)
    failures++;

  ulong0 &= 0xff00ffff;

  if(ulong0 != 0x7f00ffff)
    failures++;

  ulong0 &= 0xfeff00ff;

  if(ulong0 != 0x7e0000ff)
    failures++;
}

/*-----------*/
void and_uchar2uchar(void)
{
  uchar0 &= uchar1;

  if(uchar0 != 0x0f)
    failures++;

  uchar1 &= 0xf7;

  uchar0 = uchar1 & 0xfe;

  if(uchar0 != 0x06)
    failures++;
}

int main(void)
{
  uchar0 = 0xff;
  and_lit2uchar();

  uint0 = 0xffff;
  and_lit2uint();

  ulong0 = 0xffffffff;
  and_lit2ulong();

  uchar0 = 0xff;
  uchar1 = 0x0f;
  and_uchar2uchar();

  success = failures;
  done();
  printf("failures: %d\n",failures);

  return failures;
}
