OpenCores
URL https://opencores.org/ocsvn/or1k/or1k/trunk

Subversion Repositories or1k

[/] [or1k/] [branches/] [stable_0_2_x/] [or1ksim/] [testbench/] [inst_set_test.c] - Rev 576

Go to most recent revision | Compare with Previous | Blame | View Log

/* This is a complex instruction test for OR1200 */
/* trap, movhi, mul, nop, rfe, sys instructions not tested*/
 
#include "support.h"
 
volatile unsigned long test = 0xdeaddead;
 
#define TEST_32(c1,c2,val1,val2,op) \
  test ^= ((c1##(val1)) op (c2##(val2)));  test ^= ((c1##(val2)) op (c2##(val1)));\
  test ^= ((c1##(val1)) op (c2##(val2)));  test ^= ((c1##(val2)) op (c2##(val1)));\
  test ^= ((c1##(val1)) op (c2##(val2)));  test ^= ((c1##(val2)) op (c2##(val1)));\
  test ^= ((c1##(val1)) op (c2##(val2)));  test ^= ((c1##(val2)) op (c2##(val1)));\
  test ^= ((c1##(val1)) op (c2##(val2)));  test ^= ((c1##(val2)) op (c2##(val1)));\
  test ^= ((c1##(val1)) op (c2##(val2)));  test ^= ((c1##(val2)) op (c2##(val1)));\
  test ^= ((c1##(val1)) op (c2##(val2)));  test ^= ((c1##(val2)) op (c2##(val1)));\
  test ^= ((c1##(val1)) op (c2##(val2)));  test ^= ((c1##(val2)) op (c2##(val1)));\
 
#define TEST_CASTS(val1,val2,op)\
  TEST_32((unsigned long), (unsigned long), val1, val2, op);\
  TEST_32((unsigned long), (signed long), val1, val2, op);\
  TEST_32((unsigned long), (unsigned short), val1, val2, op);\
  TEST_32((unsigned long), (signed short), val1, val2, op);\
  TEST_32((unsigned long), (unsigned char), val1, val2, op);\
  TEST_32((unsigned long), (signed char), val1, val2, op);\
    \
  TEST_32((unsigned short), (unsigned long), val1, val2, op);\
  TEST_32((unsigned short), (signed long), val1, val2, op);\
  TEST_32((unsigned short), (unsigned short), val1, val2, op);\
  TEST_32((unsigned short), (signed short), val1, val2, op);\
  TEST_32((unsigned short), (unsigned char), val1, val2, op);\
  TEST_32((unsigned short), (signed char), val1, val2, op);\
    \
  TEST_32((unsigned char), (unsigned long), val1, val2, op);\
  TEST_32((unsigned char), (signed long), val1, val2, op);\
  TEST_32((unsigned char), (unsigned short), val1, val2, op);\
  TEST_32((unsigned char), (signed short), val1, val2, op)\
  TEST_32((unsigned char), (unsigned char), val1, val2, op);\
  TEST_32((unsigned char), (signed char), val1, val2, op);
 
 
void add_test ()
{     
  int i, j;                                          
  TEST_CASTS(0x12345678, 0x12345678, +);
  TEST_CASTS(0x12345678, 0x87654321, +);
  TEST_CASTS(0x87654321, 0x12345678, +);
  TEST_CASTS(0x87654321, 0x87654321, +);
 
  TEST_CASTS(0x1234, -0x1234, +);
  TEST_CASTS(0x1234, -0x1234, +);
  TEST_CASTS(-0x1234, 0x1234, +);
  TEST_CASTS(-0x1234, -0x1234, +);
 
  for (i = -1; i <= 1; i++)
    for (j = -1; j <= 1; j++)
      TEST_CASTS (i, j, +);
  report (test);
}
 
void and_test ()
{     
/*  TEST_CASTS(0x12345678, 0x12345678, &);
  TEST_CASTS(0x12345678, 0x87654321, &);
  TEST_CASTS(0x87654321, 0x12345678, &);
  TEST_CASTS(0x87654321, 0x87654321, &);
 
  TEST_CASTS(0x12345678, 0x0, &);
  TEST_CASTS(0x12345678, 0xffffffff, &);
  TEST_CASTS(0x87654321, 0x80000000, &);
  TEST_CASTS(0x87654321, 0x08000000, &);
 
  TEST_CASTS(0x12345678, 0x12345678, &&);
  TEST_CASTS(0x12345678, 0x87654321, &&);
  TEST_CASTS(0x87654321, 0x12345678, &&);
  TEST_CASTS(0x87654321, 0x87654321, &&);
 
  TEST_CASTS(0x12345678, 0x0, &&);
  TEST_CASTS(0x12345678, 0xffffffff, &&);
  TEST_CASTS(0x87654321, 0x80000000, &&);
  TEST_CASTS(0x87654321, 0x08000000, &&);
  report (test);*/
}
 
void branch_test ()
{
        /* bf, bnf, j, jal, jalr, jr, sfeq, sfges, sfgeu, sfgts, sfgtu, sfles, sfleu, sflts, sfltu, sfne */
  report (test);
}
 
void load_store_test ()
{
  volatile long a;
  volatile short b;
  volatile char c;
  unsigned long *pa = (unsigned long *)&a;
  unsigned short *pb = (unsigned short *)&b;
  unsigned char *pc = (unsigned char *)&c;
 
  test ^= a = 0xdeadbeef;
  test ^= b = 0x12345678;
  test ^= c = 0x87654321;
  test ^= a = b;
  test ^= b = c;
  test ^= a;
  test ^= (unsigned long)a;
  test ^= (unsigned short)a;
  test ^= (unsigned char)a;
 
  test ^= (unsigned long)b;
  test ^= (unsigned short)b;
  test ^= (unsigned char)b;
 
  test ^= (unsigned long)c;
  test ^= (unsigned short)c;
  test ^= (unsigned char)c;
 
  test ^= *pa = 0xabcdef12;
  test ^= *pb = 0x12345678;
  test ^= *pc = 0xdeadbeef;
 
  test ^= (signed long)c;
  test ^= (signed short)c;
  test ^= (signed char)c;
 
  test ^= (signed long)a;
  test ^= (signed short)a;
  test ^= (signed char)a;
 
  test ^= (signed long)b;
  test ^= (signed short)b;
  test ^= (signed char)b;
 
  test ^= *pa = 0xaabbccdd;
  test ^= *pb = 0x56789012;
  test ^= *pc = 0xb055b055;
 
  test ^= (unsigned long)b;
  test ^= (signed long)c;
  test ^= (unsigned long)a;
  test ^= (unsigned short)c;
  test ^= (unsigned short)a;
  test ^= (unsigned char)c;
  test ^= (unsigned short)b;
  test ^= (unsigned char)b;
  test ^= (unsigned char)a;
  report (test);
}
 
void or_test ()
{     
/*  TEST_CASTS(0x12345678, 0x12345678, |);
  TEST_CASTS(0x12345678, 0x87654321, |);
  TEST_CASTS(0x87654321, 0x12345678, |);
  TEST_CASTS(0x87654321, 0x87654321, |);
 
  TEST_CASTS(0x12345678, 0x0, |);
  TEST_CASTS(0x12345678, 0xffffffff, |);
  TEST_CASTS(0x87654321, 0x80000000, |);
  TEST_CASTS(0x87654321, 0x08000000, |);
 
  TEST_CASTS(0x12345678, 0x12345678, ||);
  TEST_CASTS(0x12345678, 0x87654321, ||);
  TEST_CASTS(0x87654321, 0x12345678, ||);
  TEST_CASTS(0x87654321, 0x87654321, ||);
 
  TEST_CASTS(0x12345678, 0x0, ||);
  TEST_CASTS(0x12345678, 0xffffffff, ||);
  TEST_CASTS(0x87654321, 0x80000000, ||);
  TEST_CASTS(0x87654321, 0x08000000, ||);*/
  report (test);
}
 
void xor_test ()
{     
/*  TEST_CASTS(0x12345678, 0x12345678, ^);
  TEST_CASTS(0x12345678, 0x87654321, ^);
  TEST_CASTS(0x87654321, 0x12345678, ^);
  TEST_CASTS(0x87654321, 0x87654321, ^);
 
  TEST_CASTS(0x12345678, 0x0, ^);
  TEST_CASTS(0x12345678, 0xffffffff, ^);
  TEST_CASTS(0x87654321, 0x80000000, ^);
  TEST_CASTS(0x87654321, 0x08000000, ^);*/
  report (test);
}
 
void sll_test ()
{
  int i;
  for (i = -1; i < 40; i++)
    TEST_CASTS(0xdeaf1234, i, <<);
  for (i = -1; i < 33; i++)
    TEST_CASTS(0x12345678, i, <<);
  for (i = -1; i < 33; i++)
    TEST_CASTS(0xdea12345, i, <<);
 
  test ^= (unsigned long)0xabcd4321 << test;
  test ^= (signed long)0xabcd4321 << test;
  test ^= (unsigned long)0xabcd << test;
  test ^= (signed long)0xabcd << test;
  report (test);
}
 
void srl_sra_test ()
{
  int i;
  for (i = -1; i < 40; i++)
    TEST_CASTS(0xdeaf1234, i, >>);
  for (i = -1; i < 33; i++)
    TEST_CASTS(0x12345678, i, >>);
  for (i = -1; i < 33; i++)
    TEST_CASTS(0xdea12345, i, >>);
 
  test ^= (unsigned long)0xabcd4321 >> test;
  test ^= (signed long)0xabcd4321 >> test;
  test ^= (unsigned long)0xabcd >> test;
  test ^= (signed long)0xabcd >> test;
  report (test);
}
 
 
void ror_test ()
{
  unsigned long a;
  int i;
  for (i = -1; i < 40; i++) {
    asm ("l.ror %0, %1, %2" : "=r" (a) : "r" (0x12345678), "r" (i));
    test ^= a;
    asm ("l.ror %0, %1, %2" : "=r" (a) : "r" (0xabcdef), "r" (i));
    test ^= a;
  }
  asm ("l.ror %0, %1, %2" : "=r" (a) : "r" (0x12345678), "r" (0x12345678));
  test ^= a;
  report (test);
}
 
void sub_test ()
{     
/*  int i, j;                                          
  TEST_CASTS(0x12345678, 0x12345678, -);
  TEST_CASTS(0x12345678, 0x87654321, -);
  TEST_CASTS(0x87654321, 0x12345678, -);
  TEST_CASTS(0x87654321, 0x87654321, -);
 
  TEST_CASTS(0x1234, -0x1234, -);
  TEST_CASTS(0x1234, -0x1234, -);
  TEST_CASTS(-0x1234, 0x1234, -);
  TEST_CASTS(-0x1234, -0x1234, -);
 
  for (i = -1; i <= 1; i++)
    for (j = -1; j <= 1; j++)
      TEST_CASTS (i, j, -);
  report (test);*/
}
 
int main ()
{
  add_test ();
  and_test ();
  branch_test ();
  load_store_test ();
  or_test ();
  sll_test ();
  srl_sra_test ();
  xor_test ();
  sub_test ();
  return 0;
}
 

Go to most recent revision | Compare with Previous | Blame | View Log

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.