/* cbasic.c. Test of Or1ksim basic C program functionality
|
/* cbasic.c. Test of Or1ksim basic C program functionality
|
|
|
Copyright (C) 1999-2006 OpenCores
|
Copyright (C) 1999-2006 OpenCores
|
Copyright (C) 2010 Embecosm Limited
|
Copyright (C) 2010 Embecosm Limited
|
|
|
Contributors various OpenCores participants
|
Contributors various OpenCores participants
|
Contributor Jeremy Bennett <jeremy.bennett@embecosm.com>
|
Contributor Jeremy Bennett <jeremy.bennett@embecosm.com>
|
|
|
This file is part of OpenRISC 1000 Architectural Simulator.
|
This file is part of OpenRISC 1000 Architectural Simulator.
|
|
|
This program is free software; you can redistribute it and/or modify it
|
This program is free software; you can redistribute it and/or modify it
|
under the terms of the GNU General Public License as published by the Free
|
under the terms of the GNU General Public License as published by the Free
|
Software Foundation; either version 3 of the License, or (at your option)
|
Software Foundation; either version 3 of the License, or (at your option)
|
any later version.
|
any later version.
|
|
|
This program is distributed in the hope that it will be useful, but WITHOUT
|
This program is distributed in the hope that it will be useful, but WITHOUT
|
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
more details.
|
more details.
|
|
|
You should have received a copy of the GNU General Public License along
|
You should have received a copy of the GNU General Public License along
|
with this program. If not, see <http: www.gnu.org/licenses/>. */
|
with this program. If not, see <http: www.gnu.org/licenses/>. */
|
|
|
/* ----------------------------------------------------------------------------
|
/* ----------------------------------------------------------------------------
|
This code is commented throughout for use with Doxygen.
|
This code is commented throughout for use with Doxygen.
|
--------------------------------------------------------------------------*/
|
--------------------------------------------------------------------------*/
|
|
|
/* Test basic c functionality. */
|
/* Test basic c functionality. */
|
|
|
#define DEBUG 0
|
#define DEBUG 0
|
#define DBGFINE 0
|
#define DBGFINE 0
|
|
|
#include "support.h"
|
#include "support.h"
|
|
|
signed long test_cond(int i)
|
signed long test_cond(int i)
|
{
|
{
|
switch(i) {
|
switch(i) {
|
case 1:
|
case 1:
|
i += 1;
|
i += 1;
|
break;
|
break;
|
case -1:
|
case -1:
|
i -= 10;
|
i -= 10;
|
break;
|
break;
|
default:
|
default:
|
return i;
|
return i;
|
}
|
}
|
|
|
if (i == 2) /* normaly i == 2 */
|
if (i == 2) /* normaly i == 2 */
|
i += 1;
|
i += 1;
|
else
|
else
|
i -= 10;
|
i -= 10;
|
|
|
if (i > 2) /* normaly i == 3 */
|
if (i > 2) /* normaly i == 3 */
|
i += 1;
|
i += 1;
|
else
|
else
|
i -=10;
|
i -=10;
|
|
|
if (i >= 4) /* normaly i == 4 */
|
if (i >= 4) /* normaly i == 4 */
|
i += 1;
|
i += 1;
|
else
|
else
|
i -= 10;
|
i -= 10;
|
|
|
if (i <= 5) /* normaly i == 5 */
|
if (i <= 5) /* normaly i == 5 */
|
i += 1;
|
i += 1;
|
else
|
else
|
i -= 10;
|
i -= 10;
|
|
|
if (i < 7) /* normaly i == 6 */
|
if (i < 7) /* normaly i == 6 */
|
i += 1;
|
i += 1;
|
else
|
else
|
i -= 10;
|
i -= 10;
|
|
|
if (i != 666) /* normaly i == 7 */
|
if (i != 666) /* normaly i == 7 */
|
i += 1;
|
i += 1;
|
else
|
else
|
i -= 10;
|
i -= 10;
|
|
|
return i; /* with initial i == 1 return 8 */
|
return i; /* with initial i == 1 return 8 */
|
}
|
}
|
|
|
signed long test_loops(int i)
|
signed long test_loops(int i)
|
{
|
{
|
int j = 0;
|
int j = 0;
|
|
|
for(; i < 10; i++)
|
for(; i < 10; i++)
|
j += 2;
|
j += 2;
|
|
|
do {
|
do {
|
i -= 3;
|
i -= 3;
|
} while (j--);
|
} while (j--);
|
|
|
return i;
|
return i;
|
}
|
}
|
|
|
signed long test_arith(int i)
|
signed long test_arith(int i)
|
{
|
{
|
int mul = 0, div = 0;
|
int mul = 0, div = 0;
|
int j;
|
int j;
|
|
|
for(j = i; j < 40; j++) {
|
for(j = i; j < 40; j++) {
|
|
|
mul += j*j*i;
|
mul += j*j*i;
|
#if 0
|
#if 0
|
report(mul);
|
report(mul);
|
#endif
|
#endif
|
div += mul / (j+5);
|
div += mul / (j+5);
|
#if 0
|
#if 0
|
report(div);
|
report(div);
|
#endif
|
#endif
|
}
|
}
|
|
|
report (mul+div);
|
report (mul+div);
|
return (mul + div);
|
return (mul + div);
|
}
|
}
|
|
|
signed long test_bitop(int i)
|
signed long test_bitop(int i)
|
{
|
{
|
int shl = 0, shr = 0, bit = 0;
|
int shl = 0, shr = 0, bit = 0;
|
int j;
|
int j;
|
|
|
for(j = i; j < 35; j++) {
|
for(j = i; j < 35; j++) {
|
shl += 1 << j;
|
shl += 1 << j;
|
#if 0
|
#if 0
|
printf("%u. shl:%08lx", j, shl);
|
printf("%u. shl:%08lx", j, shl);
|
report(shl);
|
report(shl);
|
#endif
|
#endif
|
shr += 0x80000000 >> j;
|
shr += 0x80000000 >> j;
|
#if 0
|
#if 0
|
printf(" shr:%08lx", shr);
|
printf(" shr:%08lx", shr);
|
report(shr);
|
report(shr);
|
#endif
|
#endif
|
bit += ((~j ^ 0x11223344) & 0x33557788) + (j | 0x11223344);
|
bit += ((~j ^ 0x11223344) & 0x33557788) + (j | 0x11223344);
|
#if 0
|
#if 0
|
printf(" bit:%08lx\n", bit);
|
printf(" bit:%08lx\n", bit);
|
report(bit);
|
report(bit);
|
#endif
|
#endif
|
}
|
}
|
|
|
return (shl + shr + bit);
|
return (shl + shr + bit);
|
}
|
}
|
|
|
signed long test_types(int i)
|
signed long test_types(int i)
|
{
|
{
|
unsigned char uc;
|
unsigned char uc;
|
signed char sc;
|
signed char sc;
|
unsigned short us;
|
unsigned short us;
|
signed short ss;
|
signed short ss;
|
unsigned long ul;
|
unsigned long ul;
|
signed long sl;
|
signed long sl;
|
|
|
int j;
|
int j;
|
|
|
i ^= 0x10203040;
|
i ^= 0x10203040;
|
|
|
for(j = 0; j < 10; j++) {
|
for(j = 0; j < 10; j++) {
|
uc = i;
|
uc = i;
|
sc = i;
|
sc = i;
|
us = i;
|
us = i;
|
ss = i;
|
ss = i;
|
ul = i;
|
ul = i;
|
sl = i;
|
sl = i;
|
#if 0
|
#if 0
|
printf("%u. i:%08lx ", j, i);
|
printf("%u. i:%08lx ", j, i);
|
printf("uc:%08lx sc:%08lx ", uc, sc);
|
printf("uc:%08lx sc:%08lx ", uc, sc);
|
report(uc);
|
report(uc);
|
report(sc);
|
report(sc);
|
printf("us:%08lx ss:%08lx ", us, ss);
|
printf("us:%08lx ss:%08lx ", us, ss);
|
report(us);
|
report(us);
|
report(ss);
|
report(ss);
|
printf("ul:%08lx sl:%08lx\n", ul, sl);
|
printf("ul:%08lx sl:%08lx\n", ul, sl);
|
report(ul);
|
report(ul);
|
report(sl);
|
report(sl);
|
#endif
|
#endif
|
i = uc + sc + us + ss + ul + sl;
|
i = uc + sc + us + ss + ul + sl;
|
}
|
}
|
|
|
return i;
|
return i;
|
}
|
}
|
|
|
signed long test_array(int i)
|
signed long test_array(int i)
|
{
|
{
|
char a1[] = "This test string MUST NOT be modified...";
|
char a1[] = "This test string MUST NOT be modified...";
|
char a2[100];
|
char a2[100];
|
|
|
report(a1[5]);
|
report(a1[5]);
|
memcpy(a2, a1, 40);
|
memcpy(a2, a1, 40);
|
report(a1[5]);
|
report(a1[5]);
|
report(a2[5]);
|
report(a2[5]);
|
report(i);
|
report(i);
|
/* register reload test */
|
/* register reload test */
|
i += a2[0] + a2[1] + a2[2] + a2[3] + a2[4] + a2[5] + a2[6] + a2[7]
|
i += a2[0] + a2[1] + a2[2] + a2[3] + a2[4] + a2[5] + a2[6] + a2[7]
|
+ a2[8] + a2[9] + a2[10] + a2[11] + a2[12] + a2[13] + a2[14] + a2[15]
|
+ a2[8] + a2[9] + a2[10] + a2[11] + a2[12] + a2[13] + a2[14] + a2[15]
|
+ a2[16] + a2[17] + a2[18] + a2[19] + a2[20] + a2[21] + a2[22] + a2[23]
|
+ a2[16] + a2[17] + a2[18] + a2[19] + a2[20] + a2[21] + a2[22] + a2[23]
|
+ a2[24] + a2[25] + a2[26] + a2[27] + a2[28] + a2[29] + a2[30] + a2[31]
|
+ a2[24] + a2[25] + a2[26] + a2[27] + a2[28] + a2[29] + a2[30] + a2[31]
|
+ a2[32] + a2[33] + a2[34] + a2[35] + a2[36] + a2[37] + a2[38] + a2[39];
|
+ a2[32] + a2[33] + a2[34] + a2[35] + a2[36] + a2[37] + a2[38] + a2[39];
|
report(i);
|
report(i);
|
|
|
return i;
|
return i;
|
}
|
}
|
|
|
int main()
|
int main()
|
{
|
{
|
signed long result1 = 0;
|
signed long result1 = 0;
|
signed long result2 = 0;
|
signed long result2 = 0;
|
signed long result3 = 0;
|
signed long result3 = 0;
|
|
|
#if DEBUG
|
#if DEBUG
|
printf("Start...\n");
|
printf("Start...\n");
|
#endif
|
#endif
|
result1 = test_cond(1);
|
result1 = test_cond(1);
|
result2 = test_cond(-1);
|
result2 = test_cond(-1);
|
result3 -= result1 + result2;
|
result3 -= result1 + result2;
|
report(result2);
|
report(result2);
|
#if DEBUG
|
#if DEBUG
|
printf("After test_cond: 0x%08lx 0x%08lx\n", result1, result2);
|
printf("After test_cond: 0x%08lx 0x%08lx\n", result1, result2);
|
#endif
|
#endif
|
|
|
result1 = test_loops(1);
|
result1 = test_loops(1);
|
result2 = test_loops(-1);
|
result2 = test_loops(-1);
|
result3 -= result1 + result2;
|
result3 -= result1 + result2;
|
report(result2);
|
report(result2);
|
#if DEBUG
|
#if DEBUG
|
printf("After test_loops: 0x%08lx 0x%08lx\n", result1, result2);
|
printf("After test_loops: 0x%08lx 0x%08lx\n", result1, result2);
|
#endif
|
#endif
|
|
|
result1 = test_arith(1);
|
result1 = test_arith(1);
|
result2 = test_arith(-1);
|
result2 = test_arith(-1);
|
result3 -= result1 + result2;
|
result3 -= result1 + result2;
|
report(result2);
|
report(result2);
|
#if DEBUG
|
#if DEBUG
|
printf("After test_arith: 0x%08lx 0x%08lx\n", result1, result2);
|
printf("After test_arith: 0x%08lx 0x%08lx\n", result1, result2);
|
#endif
|
#endif
|
|
|
result1 = test_bitop(1);
|
result1 = test_bitop(1);
|
result2 = test_bitop(-1);
|
result2 = test_bitop(-1);
|
result3 -= result1 + result2;
|
result3 -= result1 + result2;
|
report(result2);
|
report(result2);
|
#if DEBUG
|
#if DEBUG
|
printf("After test_bitop: 0x%08lx 0x%08lx\n", result1, result2);
|
printf("After test_bitop: 0x%08lx 0x%08lx\n", result1, result2);
|
#endif
|
#endif
|
|
|
result1 = test_types(1);
|
result1 = test_types(1);
|
result2 = test_types(-1);
|
result2 = test_types(-1);
|
result3 -= result1 + result2;
|
result3 -= result1 + result2;
|
report(result2);
|
report(result2);
|
#if DEBUG
|
#if DEBUG
|
printf("After test_types: 0x%08lx 0x%08lx\n", result1, result2);
|
printf("After test_types: 0x%08lx 0x%08lx\n", result1, result2);
|
#endif
|
#endif
|
result1 = test_array(1);
|
result1 = test_array(1);
|
result2 = test_array(-1);
|
result2 = test_array(-1);
|
result3 -= result1 + result2;
|
result3 -= result1 + result2;
|
report(result2);
|
report(result2);
|
#if DEBUG
|
#if DEBUG
|
printf("After test_array: 0x%08lx 0x%08lx\n", result1, result2);
|
printf("After test_array: 0x%08lx 0x%08lx\n", result1, result2);
|
#endif
|
#endif
|
|
|
#ifdef XXX
|
#ifdef XXX
|
#warning xxx
|
#warning xxx
|
#endif
|
#endif
|
|
|
printf("RESULT: 0x%08lx\n", result3 ^ 0x4bad2569 ^ 0xdeaddead);
|
printf("RESULT: 0x%08lx\n", result3 ^ 0x4bad2569 ^ 0xdeaddead);
|
report(result3 ^ 0x4bad2569 ^ 0xdeaddead);
|
report(result3 ^ 0x4bad2569 ^ 0xdeaddead);
|
|
|
exit(0);
|
exit(0);
|
}
|
}
|
|
|