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

Subversion Repositories eco32

[/] [eco32/] [trunk/] [hwtests/] [shtest/] [mkshtest.c] - Rev 14

Compare with Previous | Blame | View Log

/*
 * 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;
}
 

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.