swar-swarctrl.c 1.46 KB
/* -----------------------------------------------------------------------------
 *  Copyright (C) 2018-2020 daiteq s.r.o.                http://www.daiteq.com
 *
 *  This program is distributed WITHOUT ANY WARRANTY; without even
 *  the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
 *  PURPOSE.
 *
 * -----------------------------------------------------------------------------
 *  Filename    : swar-swarctrl.c
 *  Authors     : Roman Bartosinski
 *  Description : simple test of clang/LLVM compiler with SWAR extension
 *  Release     :
 *  Version     :
 *  Date        :
 * -----------------------------------------------------------------------------
 */

//A: --has-swar
//C: -daiteq-swar-enable

typedef unsigned int su4x8b __attribute__((subword(8)));

#define LEN 3

su4x8b a, b, z;


void test_swarctrl(unsigned short arg)
{
  const unsigned short cw = 0x2800;
  unsigned short vw;

  z = a + b;

#pragma swar manual

asm("nop");
  __builtin_swarctrl(cw | 0x20);
asm("nop");
  __builtin_swarctrl(0x2400);
asm("nop");
  __builtin_swarctrl(cw);
asm("nop");
  __builtin_swarctrl(cw | 0x20);
asm("nop");

  for (int i=0;i<3;++i) {
    z = a + b;
  }

  __builtin_swarctrl(cw | 0x10);
//  z = swar(a,b);

  vw = arg;
  __builtin_swarctrl(vw);
//  z = swar(a,b); /* in LLVM correct bitcode for this version */
  *((unsigned *)&z) = swar(*((unsigned *)&a), *((unsigned *)&b));

}

int main(void)
{
  volatile unsigned short c = 0x2200;

  test_swarctrl(c);

  return 0;
}