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

Subversion Repositories eco32

Compare Revisions

  • This comparison shows the changes necessary to convert path
    /eco32/tags/eco32-0.23/hwtests/shtest
    from Rev 141 to Rev 157
    Reverse comparison

Rev 141 → Rev 157

/README
0,0 → 1,2
This is a test for shift instructions. A dot ('.') is sent on serial
line 0 to indicate success, a question mark ('?') for failure.
/Makefile
0,0 → 1,33
#
# Makefile for shtest ROM
#
 
BUILD = ../../build
 
.PHONY: all install run clean
 
all: shtest.exo
 
install: shtest.exo
 
shtest.exo: shtest.bin
$(BUILD)/bin/bin2exo -S2 0 shtest.bin shtest.exo
 
shtest.bin: shtest.o
$(BUILD)/bin/ld -h -rc 0xE0000000 -o shtest.bin shtest.o
 
shtest.o: shtest.s
$(BUILD)/bin/as -o shtest.o shtest.s
 
shtest.s: mkshtest
./mkshtest > shtest.s
 
mkshtest: mkshtest.c
gcc -m32 -g -Wall -o mkshtest mkshtest.c
 
run: shtest.bin
$(BUILD)/bin/sim -i -t 1 -r shtest.bin
 
clean:
rm -f *~ mkshtest shtest.s shtest.o
rm -f shtest.bin shtest.exo
/mkshtest.c
0,0 → 1,200
/*
* mkshtest.c -- generate shift test program
*/
 
 
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
 
 
#define N0 ((unsigned) 0x48E6F0B2)
#define N1 ((unsigned) 0xC8E6F0B3)
 
 
int chooseReg(void) {
int r;
 
r = (rand() >> 8) % 16;
return r + 8;
}
 
 
void chooseRegs(int *r1, int *r2, int *r3, int *r4) {
*r1 = chooseReg();
do {
*r2 = chooseReg();
} while (*r2 == *r1);
do {
*r3 = chooseReg();
} while (*r3 == *r2 || *r3 == *r1);
do {
*r4 = chooseReg();
} while (*r4 == *r3 || *r4 == *r2 || *r4 == *r1);
}
 
 
int newLabel(void) {
static int lbl = 1000;
return lbl++;
}
 
 
unsigned sar(unsigned n, int shamt) {
unsigned mask;
 
mask = (n & 0x80000000) ? ~((unsigned) 0xFFFFFFFF >> shamt) : 0x00000000;
return mask | (n >> shamt);
}
 
 
int main(void) {
int shamt;
int src;
int sha;
int dst;
int ref;
int lbl;
 
printf("\tadd\t$7,$0,'.'\n");
for (shamt = 0; shamt < 32; shamt++) {
/* sll, N0 */
printf("\t; sll, n0\n");
chooseRegs(&src, &sha, &dst, &ref);
printf("\tadd\t$%d,$0,0x%08X\n", src, N0);
printf("\tadd\t$%d,$0,%d\n", sha, shamt);
printf("\tsll\t$%d,$%d,$%d\n", dst, src, sha);
printf("\tadd\t$%d,$0,0x%08X\n", ref, N0 << shamt);
lbl = newLabel();
printf("\tbeq\t$%d,$%d,L%d\n", dst, ref, lbl);
printf("\tadd\t$7,$0,'?'\n");
printf("L%d:\n", lbl);
/* slli, N0 */
printf("\t; slli, n0\n");
chooseRegs(&src, &sha, &dst, &ref);
printf("\tadd\t$%d,$0,0x%08X\n", src, N0);
printf("\tsll\t$%d,$%d,%d\n", dst, src, shamt);
printf("\tadd\t$%d,$0,0x%08X\n", ref, N0 << shamt);
lbl = newLabel();
printf("\tbeq\t$%d,$%d,L%d\n", dst, ref, lbl);
printf("\tadd\t$7,$0,'?'\n");
printf("L%d:\n", lbl);
/* sll, N1 */
printf("\t; sll, n1\n");
chooseRegs(&src, &sha, &dst, &ref);
printf("\tadd\t$%d,$0,0x%08X\n", src, N1);
printf("\tadd\t$%d,$0,%d\n", sha, shamt);
printf("\tsll\t$%d,$%d,$%d\n", dst, src, sha);
printf("\tadd\t$%d,$0,0x%08X\n", ref, N1 << shamt);
lbl = newLabel();
printf("\tbeq\t$%d,$%d,L%d\n", dst, ref, lbl);
printf("\tadd\t$7,$0,'?'\n");
printf("L%d:\n", lbl);
/* slli, N1 */
printf("\t; slli, n1\n");
chooseRegs(&src, &sha, &dst, &ref);
printf("\tadd\t$%d,$0,0x%08X\n", src, N1);
printf("\tsll\t$%d,$%d,%d\n", dst, src, shamt);
printf("\tadd\t$%d,$0,0x%08X\n", ref, N1 << shamt);
lbl = newLabel();
printf("\tbeq\t$%d,$%d,L%d\n", dst, ref, lbl);
printf("\tadd\t$7,$0,'?'\n");
printf("L%d:\n", lbl);
 
/* slr, N0 */
printf("\t; slr, n0\n");
chooseRegs(&src, &sha, &dst, &ref);
printf("\tadd\t$%d,$0,0x%08X\n", src, N0);
printf("\tadd\t$%d,$0,%d\n", sha, shamt);
printf("\tslr\t$%d,$%d,$%d\n", dst, src, sha);
printf("\tadd\t$%d,$0,0x%08X\n", ref, N0 >> shamt);
lbl = newLabel();
printf("\tbeq\t$%d,$%d,L%d\n", dst, ref, lbl);
printf("\tadd\t$7,$0,'?'\n");
printf("L%d:\n", lbl);
/* slri, N0 */
printf("\t; slri, n0\n");
chooseRegs(&src, &sha, &dst, &ref);
printf("\tadd\t$%d,$0,0x%08X\n", src, N0);
printf("\tslr\t$%d,$%d,%d\n", dst, src, shamt);
printf("\tadd\t$%d,$0,0x%08X\n", ref, N0 >> shamt);
lbl = newLabel();
printf("\tbeq\t$%d,$%d,L%d\n", dst, ref, lbl);
printf("\tadd\t$7,$0,'?'\n");
printf("L%d:\n", lbl);
/* slr, N1 */
printf("\t; slr, n1\n");
chooseRegs(&src, &sha, &dst, &ref);
printf("\tadd\t$%d,$0,0x%08X\n", src, N1);
printf("\tadd\t$%d,$0,%d\n", sha, shamt);
printf("\tslr\t$%d,$%d,$%d\n", dst, src, sha);
printf("\tadd\t$%d,$0,0x%08X\n", ref, N1 >> shamt);
lbl = newLabel();
printf("\tbeq\t$%d,$%d,L%d\n", dst, ref, lbl);
printf("\tadd\t$7,$0,'?'\n");
printf("L%d:\n", lbl);
/* slri, N1 */
printf("\t; slri, n1\n");
chooseRegs(&src, &sha, &dst, &ref);
printf("\tadd\t$%d,$0,0x%08X\n", src, N1);
printf("\tslr\t$%d,$%d,%d\n", dst, src, shamt);
printf("\tadd\t$%d,$0,0x%08X\n", ref, N1 >> shamt);
lbl = newLabel();
printf("\tbeq\t$%d,$%d,L%d\n", dst, ref, lbl);
printf("\tadd\t$7,$0,'?'\n");
printf("L%d:\n", lbl);
 
/* sar, N0 */
printf("\t; sar, n0\n");
chooseRegs(&src, &sha, &dst, &ref);
printf("\tadd\t$%d,$0,0x%08X\n", src, N0);
printf("\tadd\t$%d,$0,%d\n", sha, shamt);
printf("\tsar\t$%d,$%d,$%d\n", dst, src, sha);
printf("\tadd\t$%d,$0,0x%08X\n", ref, sar(N0, shamt));
lbl = newLabel();
printf("\tbeq\t$%d,$%d,L%d\n", dst, ref, lbl);
printf("\tadd\t$7,$0,'?'\n");
printf("L%d:\n", lbl);
/* sari, N0 */
printf("\t; sari, n0\n");
chooseRegs(&src, &sha, &dst, &ref);
printf("\tadd\t$%d,$0,0x%08X\n", src, N0);
printf("\tsar\t$%d,$%d,%d\n", dst, src, shamt);
printf("\tadd\t$%d,$0,0x%08X\n", ref, sar(N0, shamt));
lbl = newLabel();
printf("\tbeq\t$%d,$%d,L%d\n", dst, ref, lbl);
printf("\tadd\t$7,$0,'?'\n");
printf("L%d:\n", lbl);
/* sar, N1 */
printf("\t; sar, n1\n");
chooseRegs(&src, &sha, &dst, &ref);
printf("\tadd\t$%d,$0,0x%08X\n", src, N1);
printf("\tadd\t$%d,$0,%d\n", sha, shamt);
printf("\tsar\t$%d,$%d,$%d\n", dst, src, sha);
printf("\tadd\t$%d,$0,0x%08X\n", ref, sar(N1, shamt));
lbl = newLabel();
printf("\tbeq\t$%d,$%d,L%d\n", dst, ref, lbl);
printf("\tadd\t$7,$0,'?'\n");
printf("L%d:\n", lbl);
/* sari, N1 */
printf("\t; sari, n1\n");
chooseRegs(&src, &sha, &dst, &ref);
printf("\tadd\t$%d,$0,0x%08X\n", src, N1);
printf("\tsar\t$%d,$%d,%d\n", dst, src, shamt);
printf("\tadd\t$%d,$0,0x%08X\n", ref, sar(N1, shamt));
lbl = newLabel();
printf("\tbeq\t$%d,$%d,L%d\n", dst, ref, lbl);
printf("\tadd\t$7,$0,'?'\n");
printf("L%d:\n", lbl);
}
printf("out:\n");
printf("\tadd\t$6,$0,0xF0300000\n");
printf("out1:\n");
printf("\tldw\t$5,$6,8\n");
printf("\tand\t$5,$5,1\n");
printf("\tbeq\t$5,$0,out1\n");
printf("\tstw\t$7,$6,12\n");
printf("halt:\n");
printf("\tj\thalt\n");
return 0;
}

powered by: WebSVN 2.1.0

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