/* { dg-do compile } */
/* { dg-options "-O2" } */

short ior_1(unsigned short x) {
  return (signed char)(((x&0xf0)>>4) | ((x&0x0f)<<4));
}

short xor_1(unsigned short x) {
  return (signed char)(((x&0xf0)>>4) ^ ((x&0x0f)<<4));
}

short sum_1(unsigned short x) {
  return (signed char)(((x&0xf0)>>4) + ((x&0x0f)<<4));
}

short ior_2(unsigned short x) {
  return (signed char)(((x&0x0f)<<4) | ((x&0xf0)>>4));
}

short xor_2(unsigned short x) {
  return (signed char)(((x&0x0f)<<4) ^ ((x&0xf0)>>4));
}

short sum_2(unsigned short x) {
  return (signed char)(((x&0x0f)<<4) + ((x&0xf0)>>4));
}

/* { dg-final { scan-assembler-times "cbw" 6 } } */