git-svn-id: http://moon:8086/svn/mips@130 a8ebac50-d88d-4704-bea3-6648445a41b3
This commit is contained in:
2017-01-24 17:09:47 +00:00
parent db2fa45751
commit 5d894028fb
39 changed files with 7758 additions and 0 deletions
+249
View File
@@ -0,0 +1,249 @@
.file "exception.s"
.section .kdata,"a"
.align 2
_k_stack: .space 256, 0
_k_msg1: .asciiz "Exception at "
_k_msg2: .asciiz "EPC : "
_k_msg3: .asciiz "Cause : "
_k_msg4: .asciiz "Status : "
_k_msg5: .asciiz "BadVAddr : "
_k_crlf: .asciiz "\r\n"
_k_hextbl: .ascii "0123456789ABCDEF"
.section .ktext,"ax"
.align 2
.equ LED_STAT, 0x80000000
.equ UART_DATA, 0x80000004
.equ UART_STAT, 0x80000008
.macro kpush reg
addiu $sp, 4
sw \reg, 0($sp)
.endm
.macro kpop reg
lw \reg, 0($sp)
addiu $sp, -4
.endm
_exc_handler:
sw $sp, _k_stack
la $sp, _k_stack
kpush $8
kpush $9
kpush $10
kpush $11
kpush $12
kpush $31
.set noreorder
# Get BadVAddr
mfc0 $10, $8
kpush $10
# Get Status
mfc0 $10, $12
kpush $10
# Get Cause
mfc0 $10, $13
kpush $10
srl $10, 29
andi $11, $10, 4
# Get EPC
mfc0 $10, $14
kpush $10
# Get real EPC
addu $10, $11
kpush $10
# Print CRLF
la $11, _k_crlf
jal _kputs
nop
# Print real EPC
la $11, _k_msg1
jal _kputs
nop
kpop $10
jal _kprint_word
nop
la $11, _k_crlf
jal _kputs
nop
# Print EPC
la $11, _k_msg2
jal _kputs
nop
kpop $10
jal _kprint_word
nop
la $11, _k_crlf
jal _kputs
nop
# Print Cause
la $11, _k_msg3
jal _kputs
nop
kpop $10
jal _kprint_word
nop
la $11, _k_crlf
jal _kputs
nop
# Print Status
la $11, _k_msg4
jal _kputs
nop
kpop $10
jal _kprint_word
nop
la $11, _k_crlf
jal _kputs
nop
# Print BadVAddr
la $11, _k_msg5
jal _kputs
nop
kpop $10
jal _kprint_word
nop
la $11, _k_crlf
jal _kputs
nop
# Set Error LED and ExcCode LEDs
# Get Cause
mfc0 $26, $13
li $27, LED_STAT
srl $26, 2
andi $26, 0x000F
or $26, $27
sw $26, 0($27)
# wait for exception = 0
$w4x: mfc0 $26, $13
nop
srl $26, 8
andi $26, 1
bnez $26, $w4x
nop
# Get return address
mfc0 $26, $14
kpop $31
kpop $12
kpop $11
kpop $10
kpop $9
kpop $8
lw $sp, _k_stack
# Return
jr $26
rfe
.set reorder
# word = $10
_kprint_word:
.set noreorder
kpush $31
kpush $10
srl $10, 16
jal _kprint_halfword
nop
kpop $10
jal _kprint_halfword
nop
kpop $31
jr $31
nop
.set noreorder
# halfword = $10
_kprint_halfword:
.set noreorder
kpush $31
kpush $10
srl $10, 8
jal _kprint_byte
nop
kpop $10
jal _kprint_byte
nop
kpop $31
jr $31
nop
.set noreorder
# byte = $10
_kprint_byte:
.set noreorder
kpush $31
kpush $10
srl $10, 4
jal _kprint_nibble
nop
kpop $10
jal _kprint_nibble
nop
kpop $31
jr $31
nop
.set noreorder
_kprint_nibble:
.set noreorder
kpush $31
kpush $10
la $12, _k_hextbl
andi $10, 0xF
addu $12, $10
lbu $10, 0($12)
jal _ksaus
nop
kpop $10
kpop $31
jr $31
nop
.set noreorder
# char = $10
_ksaus:
.set noreorder
li $8, UART_STAT
lbu $8, 0($8)
li $9, UART_DATA
andi $8, 0x02
bnez $8, _ksaus
nop
j $31
sb $10, 0($9)
.set reorder
_kputs:
.set noreorder
kpush $11
kpush $31
$kpl: lbu $10, 0($11)
addiu $11, 1
blez $10, $kpex
nop
jal _ksaus
nop
j $kpl
nop
$kpex: kpop $31
kpop $11
jr $31
nop
.set reorder
+96
View File
@@ -0,0 +1,96 @@
//#include <stdio.h>
//#include <stdlib.h>
//#include <string.h>
int faculty(int f0, int *pDst, int len)
{
int i=0;
pDst[i++] = f0;
for (; i < len; i++)
{
pDst[i] = pDst[i-1] * i;
}
return i;
}
#define NUM_ELEMENTS 20
void saus(char c)
{
volatile char *pUART_stat = (char*)0x80000008;
volatile char *pUART_data = (char*)0x80000004;
while((0x02 & *pUART_stat) != 0);
*pUART_data = c;
}
int sputs(char *pStr)
{
char *start;
start = pStr;
while(*pStr)
saus(*(pStr++));
return pStr - start;
}
void print_word(int word)
{
int i;
unsigned char c, nibble;
for (i=0; i < 8; i++)
{
nibble = (char)((word >> 28) & 0xF);
word <<= 4;
if (nibble < 10)
c = nibble + '0';
else
c = nibble + 'A' - 10;
saus(c);
}
}
int main (void)
{
int buf[NUM_ELEMENTS], result, i, j, cnt;
volatile int *pReg = (int*)0x80000000;
volatile char *pUART_data = (char*)0x80000004;
volatile char *pUART_ctrl = (char*)0x80000008;
volatile char *pUART_baud = (char*)0x80000009;
char msg[] = "MIPS R3000 CPU\r\nReady\r\n";
*pUART_baud = 0x35;
*pUART_ctrl = 0x55;
cnt = 0;
memset(buf, 0, sizeof(buf));
sputs(msg);
buf[NUM_ELEMENTS-1] = 1;
while (1)
{
result = faculty(buf[NUM_ELEMENTS-1], buf, NUM_ELEMENTS);
for (i=0; i < NUM_ELEMENTS; i++)
{
print_word(buf[i]);
saus(13);
saus(10);
}
cnt++;
while(1);
}
}
+255
View File
@@ -0,0 +1,255 @@
.file 1 "faculty.c"
.set nobopt
.text
.align 2
.globl faculty
.ent faculty
faculty:
.frame $sp,0,$31 # vars= 0, regs= 0/0, args= 0, gp= 0
.mask 0x00000000,0
.fmask 0x00000000,0
li $7,1 # 0x1
slt $2,$7,$6
.set noreorder
.set nomacro
beq $2,$0,$L7
sw $4,0($5)
.set macro
.set reorder
addiu $5,$5,4
$L5:
lw $2,-4($5)
mult $2,$7
addiu $7,$7,1
slt $3,$7,$6
mflo $2
sw $2,0($5)
.set noreorder
.set nomacro
bne $3,$0,$L5
addiu $5,$5,4
.set macro
.set reorder
$L7:
.set noreorder
.set nomacro
j $31
move $2,$7
.set macro
.set reorder
.end faculty
.align 2
.globl saus
.ent saus
saus:
.frame $sp,0,$31 # vars= 0, regs= 0/0, args= 0, gp= 0
.mask 0x00000000,0
.fmask 0x00000000,0
li $2,-2147483648 # 0xffffffff80000000
sll $4,$4,24
sra $4,$4,24
ori $5,$2,0x4
ori $3,$2,0x8
$L10:
lbu $2,0($3)
andi $2,$2,0x2
bne $2,$0,$L10
sb $4,0($5)
j $31
.end saus
.align 2
.globl sputs
.ent sputs
sputs:
.frame $sp,32,$31 # vars= 0, regs= 3/0, args= 16, gp= 0
.mask 0x80030000,-8
.fmask 0x00000000,0
addiu $sp,$sp,-32
sw $17,20($sp)
sw $16,16($sp)
sw $31,24($sp)
move $16,$4
lb $4,0($4)
.set noreorder
.set nomacro
j $L18
move $17,$16
.set macro
.set reorder
$L19:
.set noreorder
.set nomacro
jal saus
addiu $16,$16,1
.set macro
.set reorder
lb $4,0($16)
$L18:
.set noreorder
.set nomacro
bne $4,$0,$L19
subu $2,$16,$17
.set macro
.set reorder
lw $31,24($sp)
lw $17,20($sp)
lw $16,16($sp)
.set noreorder
.set nomacro
j $31
addiu $sp,$sp,32
.set macro
.set reorder
.end sputs
.align 2
.globl print_word
.ent print_word
print_word:
.frame $sp,32,$31 # vars= 0, regs= 3/0, args= 16, gp= 0
.mask 0x80030000,-8
.fmask 0x00000000,0
addiu $sp,$sp,-32
sw $17,20($sp)
sw $16,16($sp)
sw $31,24($sp)
move $16,$4
li $17,7 # 0x7
srl $3,$16,28
$L29:
sltu $2,$3,10
addiu $17,$17,-1
sll $16,$16,4
.set noreorder
.set nomacro
bne $2,$0,$L25
addiu $4,$3,48
.set macro
.set reorder
addiu $4,$3,55
$L25:
jal saus
.set noreorder
.set nomacro
bgez $17,$L29
srl $3,$16,28
.set macro
.set reorder
lw $31,24($sp)
lw $17,20($sp)
lw $16,16($sp)
.set noreorder
.set nomacro
j $31
addiu $sp,$sp,32
.set macro
.set reorder
.end print_word
.section .rodata.str1.4,"aMS",@progbits,1
.align 2
$LC0:
.ascii "MIPS R3000 CPU\r\n"
.ascii "Ready\r\n\000"
.text
.align 2
.globl main
.ent main
main:
.frame $sp,136,$31 # vars= 104, regs= 3/0, args= 16, gp= 0
.mask 0x80030000,-8
.fmask 0x00000000,0
lw $2,$LC0
lw $3,$LC0+4
addiu $sp,$sp,-136
sw $2,96($sp)
sw $3,100($sp)
lw $2,$LC0+8
lw $3,$LC0+12
sw $2,104($sp)
sw $3,108($sp)
lw $2,$LC0+16
lw $3,$LC0+20
li $7,-2147483648 # 0xffffffff80000000
ori $8,$7,0x9
sw $2,112($sp)
sw $3,116($sp)
ori $7,$7,0x8
li $3,85
sw $16,120($sp)
li $2,53
addiu $16,$sp,16
sb $2,0($8)
move $4,$16
sb $3,0($7)
move $5,$0
li $6,80 # 0x50
sw $31,128($sp)
.set noreorder
.set nomacro
jal memset
sw $17,124($sp)
.set macro
.set reorder
.set noreorder
.set nomacro
jal sputs
addiu $4,$sp,96
.set macro
.set reorder
li $3,1 # 0x1
sw $3,92($sp)
li $4,1 # 0x1
move $5,$16
li $6,20 # 0x14
.set noreorder
.set nomacro
jal faculty
move $17,$16
.set macro
.set reorder
li $16,19 # 0x13
$L36:
lw $4,0($17)
.set noreorder
.set nomacro
jal print_word
addiu $16,$16,-1
.set macro
.set reorder
.set noreorder
.set nomacro
jal saus
li $4,13 # 0xd
.set macro
.set reorder
.set noreorder
.set nomacro
jal saus
li $4,10 # 0xa
.set macro
.set reorder
.set noreorder
.set nomacro
bgez $16,$L36
addiu $17,$17,4
.set macro
.set reorder
$L37:
j $L37
.end main
+179
View File
@@ -0,0 +1,179 @@
//#include <stdio.h>
#include <stdlib.h>
//#include <string.h>
int fibonacci(int f0, int f1, int *pDst, int len)
{
int i;
i = 0;
pDst[i++] = f0;
pDst[i++] = f1;
for (; i < len; i++)
{
pDst[i] = pDst[i-2] + pDst[i-1];
}
return i;
}
#define NUM_ELEMENTS 100
#define NUM_RUNS 1000
typedef struct _sstat_t
{
char v1;
int v2;
char v3;
short v4;
} __attribute__ ((__packed__)) stat_t;
void test_func(stat_t *pObj)
{
int *pReg = (int*)0x80000000;
*pReg = (int)pObj->v4;
}
char sein(void)
{
volatile char *pUART_stat = (char*)0x80000008;
volatile char *pUART_data = (char*)0x80000004;
while(!(0x10 & *pUART_stat));
return *pUART_data;
}
void saus(char c)
{
volatile char *pUART_stat = (char*)0x80000008;
volatile char *pUART_data = (char*)0x80000004;
while((0x02 & *pUART_stat) != 0);
*pUART_data = c;
}
int sputs(char *pStr)
{
char *start;
start = pStr;
while(*pStr)
saus(*(pStr++));
return pStr - start;
}
void print_word(int word)
{
int i;
unsigned char c, nibble;
for (i=0; i < 8; i++)
{
nibble = (char)((word >> 28) & 0xF);
word <<= 4;
if (nibble < 10)
c = nibble + '0';
else
c = nibble + 'A' - 10;
saus(c);
}
}
int main (void)
{
int buf[NUM_ELEMENTS], result, i, j, diff, num_right_elements, num_right_runs;
int fill, cnt, *pReg = (int*)0x80000000;
volatile char *pUART_data = (char*)0x80000004;
volatile char *pUART_ctrl = (char*)0x80000008;
volatile char *pUART_baud = (char*)0x80000009;
int testbuf[2] = {0x12345678, 0x5555aaaa};
stat_t stat = {0x0D, 0xFF5A3FC1, 0x1E, 0x0F07};
char msg[] = "MIPS R3000 CPU\r\nReady\r\n";
char msg2[32];
char baud;
char *pPtr;
long long product;
int op1, op2;
div_t div_res;
*pUART_baud = 0x35;
*pUART_ctrl = 0x55;
cnt = 0;
fill = 0xAAAAAAAA;
memset(msg2, 0, sizeof(msg2));
memcpy(msg2, msg, strlen(msg));
srand(0x19701031);
for (i=0; i < sizeof(msg2)-1; i++)
msg2[i] = sein();
sputs(msg2);
test_func(&stat);
// div_res = div(testbuf[1], testbuf[0]);
while (1)
{
num_right_runs = 0;
for (i=0; i < NUM_RUNS; i++)
{
for (j=0; j < NUM_ELEMENTS; j++)
buf[j] = fill;
fill = ((fill ^ i) - 1) << 1;
num_right_elements = 2;
result = fibonacci(i, i+1, buf, NUM_ELEMENTS);
for (j=2; j < NUM_ELEMENTS; j++)
{
diff = buf[j] - buf[j-1];
if (diff == buf[j-2])
num_right_elements++;
}
if (num_right_elements == NUM_ELEMENTS)
num_right_runs++;
}
if (num_right_runs == NUM_RUNS)
{
*pReg = cnt & 0x3FFFFFFF;
cnt++;
}
else
{
*pReg = 0x40000000 | cnt;
saus('X');
}
op1 = (int)-cnt;
op2 = (int)((op1 & 8) << 28) ^ rand();
product = (long long)op1 * (long long)op2;
print_word((int)op1);
saus(' ');
saus('x');
saus(' ');
print_word((int)op2);
saus(' ');
saus('=');
saus(' ');
print_word((int)(product >> 32));
print_word((int)product);
saus(13);
saus(10);
}
return 0;
}
+555
View File
@@ -0,0 +1,555 @@
.file 1 "fibonacci.c"
.set nobopt
.text
.align 2
.globl fibonacci
.ent fibonacci
fibonacci:
.frame $sp,0,$31 # vars= 0, regs= 0/0, args= 0, gp= 0
.mask 0x00000000,0
.fmask 0x00000000,0
li $8,2 # 0x2
slt $2,$8,$7
sw $4,0($6)
.set noreorder
.set nomacro
beq $2,$0,$L7
sw $5,4($6)
.set macro
.set reorder
addiu $6,$6,8
$L5:
lw $2,-8($6)
lw $3,-4($6)
addiu $8,$8,1
addu $2,$2,$3
slt $4,$8,$7
sw $2,0($6)
.set noreorder
.set nomacro
bne $4,$0,$L5
addiu $6,$6,4
.set macro
.set reorder
$L7:
.set noreorder
.set nomacro
j $31
move $2,$8
.set macro
.set reorder
.end fibonacci
.align 2
.globl test_func
.ent test_func
test_func:
.frame $sp,0,$31 # vars= 0, regs= 0/0, args= 0, gp= 0
.mask 0x00000000,0
.fmask 0x00000000,0
lbu $2,7($4)
lbu $3,6($4)
sll $2,$2,8
or $2,$2,$3
sll $2,$2,16
sra $2,$2,16
li $3,-2147483648 # 0xffffffff80000000
.set noreorder
.set nomacro
j $31
sw $2,0($3)
.set macro
.set reorder
.end test_func
.align 2
.globl sein
.ent sein
sein:
.frame $sp,0,$31 # vars= 0, regs= 0/0, args= 0, gp= 0
.mask 0x00000000,0
.fmask 0x00000000,0
li $2,-2147483648 # 0xffffffff80000000
ori $4,$2,0x4
ori $3,$2,0x8
$L11:
lbu $2,0($3)
andi $2,$2,0x10
beq $2,$0,$L11
lbu $2,0($4)
sll $2,$2,24
.set noreorder
.set nomacro
j $31
sra $2,$2,24
.set macro
.set reorder
.end sein
.align 2
.globl saus
.ent saus
saus:
.frame $sp,0,$31 # vars= 0, regs= 0/0, args= 0, gp= 0
.mask 0x00000000,0
.fmask 0x00000000,0
li $2,-2147483648 # 0xffffffff80000000
sll $4,$4,24
sra $4,$4,24
ori $5,$2,0x4
ori $3,$2,0x8
$L14:
lbu $2,0($3)
andi $2,$2,0x2
bne $2,$0,$L14
sb $4,0($5)
j $31
.end saus
.align 2
.globl sputs
.ent sputs
sputs:
.frame $sp,32,$31 # vars= 0, regs= 3/0, args= 16, gp= 0
.mask 0x80030000,-8
.fmask 0x00000000,0
addiu $sp,$sp,-32
sw $17,20($sp)
sw $16,16($sp)
sw $31,24($sp)
move $16,$4
lb $4,0($4)
.set noreorder
.set nomacro
j $L22
move $17,$16
.set macro
.set reorder
$L23:
.set noreorder
.set nomacro
jal saus
addiu $16,$16,1
.set macro
.set reorder
lb $4,0($16)
$L22:
.set noreorder
.set nomacro
bne $4,$0,$L23
subu $2,$16,$17
.set macro
.set reorder
lw $31,24($sp)
lw $17,20($sp)
lw $16,16($sp)
.set noreorder
.set nomacro
j $31
addiu $sp,$sp,32
.set macro
.set reorder
.end sputs
.align 2
.globl print_word
.ent print_word
print_word:
.frame $sp,32,$31 # vars= 0, regs= 3/0, args= 16, gp= 0
.mask 0x80030000,-8
.fmask 0x00000000,0
addiu $sp,$sp,-32
sw $17,20($sp)
sw $16,16($sp)
sw $31,24($sp)
move $16,$4
li $17,7 # 0x7
srl $3,$16,28
$L33:
sltu $2,$3,10
addiu $17,$17,-1
sll $16,$16,4
.set noreorder
.set nomacro
bne $2,$0,$L29
addiu $4,$3,48
.set macro
.set reorder
addiu $4,$3,55
$L29:
jal saus
.set noreorder
.set nomacro
bgez $17,$L33
srl $3,$16,28
.set macro
.set reorder
lw $31,24($sp)
lw $17,20($sp)
lw $16,16($sp)
.set noreorder
.set nomacro
j $31
addiu $sp,$sp,32
.set macro
.set reorder
.end print_word
.section .sdata,"aw",@progbits
.align 2
$LC0:
.word 305419896
.word 1431677610
.section .rodata.str1.4,"aMS",@progbits,1
.align 2
$LC2:
.ascii "MIPS R3000 CPU\r\n"
.ascii "Ready\r\n\000"
.section .sdata
.align 2
$LC1:
.byte 13
.4byte -10862655
.byte 30
.half 3847
.text
.align 2
.globl main
.ent main
main:
.frame $sp,536,$31 # vars= 480, regs= 10/0, args= 16, gp= 0
.mask 0xc0ff0000,-4
.fmask 0x00000000,0
lw $2,$LC0
addiu $sp,$sp,-536
lw $3,$LC0+4
sw $2,416($sp)
lw $2,$LC2
lwl $4,$LC1+3
lwl $5,$LC1+7
sw $3,420($sp)
sw $2,432($sp)
lw $3,$LC2+4
lw $2,$LC2+8
lwr $5,$LC1+4
lwr $4,$LC1
sw $3,436($sp)
sw $2,440($sp)
lw $3,$LC2+12
lw $2,$LC2+16
sw $31,532($sp)
sw $5,428($sp)
sw $23,524($sp)
sw $22,520($sp)
sw $21,516($sp)
sw $20,512($sp)
sw $18,504($sp)
sw $17,500($sp)
sw $16,496($sp)
sw $4,424($sp)
sw $3,444($sp)
sw $fp,528($sp)
sw $19,508($sp)
sw $2,448($sp)
lw $3,$LC2+20
li $23,-2147483648 # 0xffffffff80000000
ori $7,$23,0x9
sw $3,452($sp)
ori $6,$23,0x8
li $3,85
addiu $16,$sp,432
li $2,53
sb $2,0($7)
move $4,$16
sb $3,0($6)
li $2,-1431699456 # 0xffffffffaaaa0000
sw $0,456($sp)
sw $0,460($sp)
sw $0,464($sp)
sw $0,468($sp)
sw $0,472($sp)
sw $0,476($sp)
sw $0,480($sp)
sw $0,484($sp)
ori $20,$2,0xaaaa
.set noreorder
.set nomacro
jal strlen
addiu $18,$sp,456
.set macro
.set reorder
move $6,$2
move $5,$16
.set noreorder
.set nomacro
jal memcpy
move $4,$18
.set macro
.set reorder
li $4,426770432 # 0x19700000
.set noreorder
.set nomacro
jal srand
ori $4,$4,0x1031
.set macro
.set reorder
move $22,$0
move $17,$0
addiu $21,$sp,16
$L38:
addu $16,$21,$17
.set noreorder
.set nomacro
jal sein
addiu $17,$17,1
.set macro
.set reorder
sltu $3,$17,31
.set noreorder
.set nomacro
bne $3,$0,$L38
sb $2,440($16)
.set macro
.set reorder
.set noreorder
.set nomacro
jal sputs
move $4,$18
.set macro
.set reorder
.set noreorder
.set nomacro
jal test_func
addiu $4,$sp,424
.set macro
.set reorder
li $fp,100 # 0x64
move $18,$0
move $17,$0
$L54:
move $2,$21
li $6,99 # 0x63
$L47:
addiu $6,$6,-1
sw $20,0($2)
.set noreorder
.set nomacro
bgez $6,$L47
addiu $2,$2,4
.set macro
.set reorder
xor $2,$20,$17
addiu $16,$17,1
addiu $2,$2,-1
move $5,$16
addiu $6,$sp,16
li $7,100 # 0x64
move $4,$17
.set noreorder
.set nomacro
jal fibonacci
sll $20,$2,1
.set macro
.set reorder
li $7,2 # 0x2
addiu $5,$21,8
.set noreorder
.set nomacro
j $L52
li $6,97 # 0x61
.set macro
.set reorder
$L50:
bltz $6,$L65
$L52:
lw $2,0($5)
lw $3,-4($5)
lw $4,-8($5)
subu $2,$2,$3
addiu $6,$6,-1
.set noreorder
.set nomacro
bne $4,$2,$L50
addiu $5,$5,4
.set macro
.set reorder
.set noreorder
.set nomacro
bgez $6,$L52
addiu $7,$7,1
.set macro
.set reorder
$L65:
beq $7,$fp,$L66
$L43:
slt $2,$16,1000
.set noreorder
.set nomacro
bne $2,$0,$L54
move $17,$16
.set macro
.set reorder
li $2,1000 # 0x3e8
.set noreorder
.set nomacro
bne $18,$2,$L55
li $3,1073676288 # 0x3fff0000
.set macro
.set reorder
ori $3,$3,0xffff
and $2,$22,$3
sw $2,0($23)
addiu $22,$22,1
subu $16,$0,$22
$L67:
.set noreorder
.set nomacro
jal rand
andi $17,$16,0x8
.set macro
.set reorder
sll $17,$17,28
xor $17,$17,$2
mult $16,$17
mflo $18
mfhi $19
.set noreorder
.set nomacro
jal print_word
move $4,$16
.set macro
.set reorder
.set noreorder
.set nomacro
jal saus
li $4,32 # 0x20
.set macro
.set reorder
.set noreorder
.set nomacro
jal saus
li $4,120 # 0x78
.set macro
.set reorder
.set noreorder
.set nomacro
jal saus
li $4,32 # 0x20
.set macro
.set reorder
.set noreorder
.set nomacro
jal print_word
move $4,$17
.set macro
.set reorder
.set noreorder
.set nomacro
jal saus
li $4,32 # 0x20
.set macro
.set reorder
.set noreorder
.set nomacro
jal saus
li $4,61 # 0x3d
.set macro
.set reorder
.set noreorder
.set nomacro
jal saus
li $4,32 # 0x20
.set macro
.set reorder
.set noreorder
.set nomacro
jal print_word
sra $4,$19,0
.set macro
.set reorder
.set noreorder
.set nomacro
jal print_word
move $4,$18
.set macro
.set reorder
.set noreorder
.set nomacro
jal saus
li $4,13 # 0xd
.set macro
.set reorder
.set noreorder
.set nomacro
jal saus
li $4,10 # 0xa
.set macro
.set reorder
move $18,$0
.set noreorder
.set nomacro
j $L54
move $17,$0
.set macro
.set reorder
$L66:
.set noreorder
.set nomacro
j $L43
addiu $18,$18,1
.set macro
.set reorder
$L55:
li $2,1073741824 # 0x40000000
or $2,$22,$2
li $4,88 # 0x58
.set noreorder
.set nomacro
jal saus
sw $2,0($23)
.set macro
.set reorder
.set noreorder
.set nomacro
j $L67
subu $16,$0,$22
.set macro
.set reorder
.end main
+24
View File
@@ -0,0 +1,24 @@
MEMORY
{
imem : ORIGIN = 0x00000000, LENGTH = 0x00002000 /* 8K */
}
SECTIONS
{
.stext 0x00000000 :
{
*(.stext)
} > imem
.ktext 0x00000180 :
{
*(.ktext)
} > imem
.text 0x00000200 :
{
*(.text)
} > imem
}
+28
View File
@@ -0,0 +1,28 @@
.file "init.s"
.text
.align 2
.globl _init
.extern end
_init:
.set noreorder
# set uart
la $26, sys_uart_baud
addiu $27, $0, baudrate
sb $27, 0($26)
# set stack pointer
la $sp, end
# jump main
la $26, main
jalr $26
_terminate:
nop
j _terminate
nop
.set reorder
+7
View File
@@ -0,0 +1,7 @@
#!/bin/sh
TARGET=$(basename $1 .c)
xtclsh.exe $TARGET.RAM.tcl
xtclsh.exe $TARGET.ROM.tcl
+251
View File
@@ -0,0 +1,251 @@
.file "exception.s"
.section .kdata,"a"
.align 2
_k_stack: .space 256, 0
_k_msg1: .asciiz "Exception at "
_k_msg2: .asciiz "EPC : "
_k_msg3: .asciiz "Cause : "
_k_msg4: .asciiz "Status : "
_k_msg5: .asciiz "BadVAddr : "
_k_crlf: .asciiz "\r\n"
_k_hextbl: .ascii "0123456789ABCDEF"
.section .ktext,"ax"
.align 2
.globl _kputs
.macro kpush reg
addiu $sp, 4
sw \reg, 0($sp)
.endm
.macro kpop reg
lw \reg, 0($sp)
addiu $sp, -4
.endm
_exc_handler:
sw $sp, _k_stack
la $sp, _k_stack
kpush $8
kpush $9
kpush $10
kpush $11
kpush $12
kpush $31
.set noreorder
# Get BadVAddr
mfc0 $10, $8
kpush $10
# Get Status
mfc0 $10, $12
kpush $10
# Get Cause
mfc0 $10, $13
kpush $10
srl $10, 29
andi $11, $10, 4
# Get EPC
mfc0 $10, $14
kpush $10
# Get real EPC
addu $10, $11
kpush $10
# set uart
la $26, sys_uart_baud
addiu $27, $0, baudrate
sb $27, 0($26)
# Print CRLF
la $11, _k_crlf
jal _kputs
nop
# Print real EPC
la $11, _k_msg1
jal _kputs
nop
kpop $10
jal _kprint_word
nop
la $11, _k_crlf
jal _kputs
nop
# Print EPC
la $11, _k_msg2
jal _kputs
nop
kpop $10
jal _kprint_word
nop
la $11, _k_crlf
jal _kputs
nop
# Print Cause
la $11, _k_msg3
jal _kputs
nop
kpop $10
jal _kprint_word
nop
la $11, _k_crlf
jal _kputs
nop
# Print Status
la $11, _k_msg4
jal _kputs
nop
kpop $10
jal _kprint_word
nop
la $11, _k_crlf
jal _kputs
nop
# Print BadVAddr
la $11, _k_msg5
jal _kputs
nop
kpop $10
jal _kprint_word
nop
la $11, _k_crlf
jal _kputs
nop
# Set Error LED and ExcCode LEDs
# Get Cause
mfc0 $26, $13
la $27, sys_led_port
srl $26, 2
andi $26, 0x000F
or $26, $27
sw $26, 0($27)
# wait for all interrupts = 0
$w4x: mfc0 $26, $13
nop
srl $26, 8
andi $26, 0xFF
bnez $26, $w4x
nop
# Get return address
mfc0 $26, $14
kpop $31
kpop $12
kpop $11
kpop $10
kpop $9
kpop $8
lw $sp, _k_stack
# Return
jr $26
rfe
.set reorder
# word = $10
_kprint_word:
.set noreorder
kpush $31
kpush $10
srl $10, 16
jal _kprint_halfword
nop
kpop $10
jal _kprint_halfword
nop
kpop $31
jr $31
nop
.set noreorder
# halfword = $10
_kprint_halfword:
.set noreorder
kpush $31
kpush $10
srl $10, 8
jal _kprint_byte
nop
kpop $10
jal _kprint_byte
nop
kpop $31
jr $31
nop
.set noreorder
# byte = $10
_kprint_byte:
.set noreorder
kpush $31
kpush $10
srl $10, 4
jal _kprint_nibble
nop
kpop $10
jal _kprint_nibble
nop
kpop $31
jr $31
nop
.set noreorder
_kprint_nibble:
.set noreorder
kpush $31
kpush $10
la $12, _k_hextbl
andi $10, 0xF
addu $12, $10
lbu $10, 0($12)
jal _ksaus
nop
kpop $10
kpop $31
jr $31
nop
.set noreorder
# char = $10
_ksaus:
.set noreorder
la $8, sys_uart_stat
lbu $8, 0($8)
la $9, sys_uart_data
andi $8, 0x02
bnez $8, _ksaus
nop
j $31
sb $10, 0($9)
.set reorder
_kputs:
.set noreorder
kpush $11
kpush $31
$kpl: lbu $10, 0($11)
addiu $11, 1
blez $10, $kpex
nop
jal _ksaus
nop
j $kpl
nop
$kpex: kpop $31
kpop $11
jr $31
nop
.set reorder
+47
View File
@@ -0,0 +1,47 @@
MEMORY
{
imem : ORIGIN = 0x00400000, LENGTH = 0x00004000 /* 8K */
dmem : ORIGIN = 0x00000000, LENGTH = 0x00002000 /* 8K */
}
end = 0x7FFFEFFC;
baudrate = 0x0D;
sys_led_port = 0x80000000;
sys_uart_baud = 0x80000009;
sys_uart_stat = 0x80000008;
sys_uart_data = 0x80000004;
sys_timer_sec = 0x80000014;
sys_timer_usec = 0x80000010;
SECTIONS
{
.stext 0x00400000 :
{
*(.stext)
} > imem
.ktext 0x00400180 :
{
*(.ktext)
} > imem
.text . :
{
*(.text)
} > imem
.data 0x00000000 : ALIGN(2)
{
*(.rodata*) *(.data) *(.sdata) *(.sbss) *(.kdata)
} > dmem
.bss . :
{
*(.bss)
} > dmem
.eh_frame . :
{
*(.eh_frame)
} > dmem
}
+64
View File
@@ -0,0 +1,64 @@
//#include <stdio.h>
//#include <stdlib.h>
//#include <string.h>
int main (void)
{
__asm
(
".set noreorder\n"
"li $8, 0x81234678\n"
"li $15, 0x10000000\n"
"li $16, 0xAAAAAAAA\n"
"li $17, 0xBBBBBBBB\n"
"li $18, 0xCCCCCCCC\n"
"li $19, 0xDDDDDDDD\n"
"li $24, 0x11111111\n"
"li $25, 0x22222222\n"
"li $26, 0x33333333\n"
"li $27, 0x44444444\n"
"sw $8, 0($15)\n"
"nop\n"
"lwl $16, 0($15)\n"
"lwl $17, 1($15)\n"
"lwl $18, 2($15)\n"
"lwl $19, 3($15)\n"
"nop\n"
"lwr $24, 0($15)\n"
"lwr $25, 1($15)\n"
"lwr $26, 2($15)\n"
"lwr $27, 3($15)\n"
"nop\n"
"lbu $16, 0($15)\n"
"lbu $17, 1($15)\n"
"lbu $18, 2($15)\n"
"lbu $19, 3($15)\n"
"nop\n"
"lb $16, 0($15)\n"
"lb $17, 1($15)\n"
"lb $18, 2($15)\n"
"lb $19, 3($15)\n"
"nop\n"
"swl $8, 4($15)\n"
"swl $8, 9($15)\n"
"swl $8, 14($15)\n"
"swl $8, 19($15)\n"
"nop\n"
"swr $8, 20($15)\n"
"swr $8, 25($15)\n"
"swr $8, 30($15)\n"
"swr $8, 35($15)\n"
"nop\n"
"sb $8, 4($15)\n"
"sb $8, 5($15)\n"
"sb $8, 6($15)\n"
"sb $8, 7($15)\n"
"nop\n"
".set reorder\n"
);
}
+64
View File
@@ -0,0 +1,64 @@
.file 1 "load_store.c"
.set nobopt
.text
.align 2
.globl main
.ent main
main:
.frame $sp,0,$31 # vars= 0, regs= 0/0, args= 0, gp= 0
.mask 0x00000000,0
.fmask 0x00000000,0
#APP
.set noreorder
li $8, 0x81234678
li $15, 0x10000000
li $16, 0xAAAAAAAA
li $17, 0xBBBBBBBB
li $18, 0xCCCCCCCC
li $19, 0xDDDDDDDD
li $24, 0x11111111
li $25, 0x22222222
li $26, 0x33333333
li $27, 0x44444444
sw $8, 0($15)
nop
lwl $16, 0($15)
lwl $17, 1($15)
lwl $18, 2($15)
lwl $19, 3($15)
nop
lwr $24, 0($15)
lwr $25, 1($15)
lwr $26, 2($15)
lwr $27, 3($15)
nop
lbu $16, 0($15)
lbu $17, 1($15)
lbu $18, 2($15)
lbu $19, 3($15)
nop
lb $16, 0($15)
lb $17, 1($15)
lb $18, 2($15)
lb $19, 3($15)
nop
swl $8, 4($15)
swl $8, 9($15)
swl $8, 14($15)
swl $8, 19($15)
nop
swr $8, 20($15)
swr $8, 25($15)
swr $8, 30($15)
swr $8, 35($15)
nop
sb $8, 4($15)
sb $8, 5($15)
sb $8, 6($15)
sb $8, 7($15)
nop
.set reorder
#NO_APP
j $31
.end main
+30
View File
@@ -0,0 +1,30 @@
#!/bin/sh
TARGET=$(basename $1 .c)
TARGET_CPU=r3000
ROM_WORDADDR_WIDTH=12
RAM_WORDADDR_WIDTH=11
echo Building $TARGET...
mipsel-elf-as.exe -march=$TARGET_CPU startup.s -o startup.o
mipsel-elf-as.exe -march=$TARGET_CPU init.s -o init.o
mipsel-elf-as.exe -march=$TARGET_CPU kernel.s -o kernel.o
#mipsel-elf-gcc -O2 -march=$TARGET_CPU $TARGET.c -o $TARGET.s -L $LIBDIR
mipsel-elf-gcc -msoft-float -O2 -c utils.c -o utils.o
mipsel-elf-gcc -msoft-float -O2 -c $TARGET.c -o $TARGET.o
mipsel-elf-ld.exe -G 0 -M -T link.ld startup.o init.o kernel.o utils.o $TARGET.o -o $TARGET.elf -L /usr/local/mipsel-elf/lib -L /usr/local/lib/gcc/mipsel-elf/3.4.6 -lc -lgcc >$TARGET.map
mipsel-elf-objdump.exe -d $TARGET.elf > $TARGET.dis
mipsel-elf-objcopy.exe -j .stext -j .ktext -j .text $TARGET.elf -O binary $TARGET.ROM.bin
mipsel-elf-objcopy.exe -j .data $TARGET.elf -O binary $TARGET.RAM.bin
./romgen.exe $TARGET.ROM.bin $ROM_WORDADDR_WIDTH
./ramgen.exe $TARGET.RAM.bin $RAM_WORDADDR_WIDTH
#xtclsh.exe $TARGET.RAM.tcl
#xtclsh.exe $TARGET.ROM.tcl
echo done.
+31
View File
@@ -0,0 +1,31 @@
main:
j lab
# nop
# break 52
lab:
li, $8, 0x81234678
# SB
li, $15, 0x10000000
li $16, 0x00400014
mtc0, $16, $14
nop
nop
rfe
# Address error exception
sw $8, 1($15)
sw $8, 2($15)
sw $8, 3($15)
# Address error exception
sh $8, 1($15)
# Address error exception
sh $8, 3($15)
nop
nop
nop
+86
View File
@@ -0,0 +1,86 @@
SB (tested by SPIM)
VA(1..0) DMEM_WE ROL
0 0001 0
1 0010 1
2 0100 2
3 1000 3
SH (tested by SPIM)
VA(1..0) DMEM_WE ROL
0 0011 0
2 1100 2
SWL (tested by SPIM)
VA(1..0) DMEM_WE ROL
0 0001 1
1 0011 2
2 0111 3
3 1111 0
SWR (tested by SPIM)
VA(1..0) DMEM_WE ROL
0 1111 0
1 1110 1
2 1100 2
3 1000 3
LB (tested by SPIM)
VA(1..0) REG_WE ROR
0 1111 0
1 1111 1
2 1111 2
3 1111 3
LH (tested by SPIM)
VA(1..0) REG_WE ROR
0 1111 0
2 1111 2
LWL (tested by SPIM)
VA(1..0) REG_WE ROR
0 1000 1
1 1100 2
2 1110 3
3 1111 0
LWR (tested by SPIM)
VA(1..0) REG_WE ROR
0 1111 0
1 0111 1
2 0011 2
3 0001 3
*SHIFTER* SB SH SWL SWR SW
shift_byp 0 0 0 0 1
shift_off 0 0 1 0 x
SHL = VA + shift_off
*Byte Enable* SB SH SWL SWR SW
be_byp 0 0 0 0 1
quarter_word_en 1 0 0 0 x
half_word_en 0 1 0 0 x
align_left x x 0 1 x
*SHIFTER* LB LH LWL LWR LW
shift_byp 0 0 0 0 1
shift_off 0 0 1 0 x
SHL = VA + shift_off
*Byte Enable* LB LH LWL LWR LW
be_byp 1 1 0 0 1
align_left x x 1 0 x
* Sign ext*
se_byp = shift_byp and (shift_byp and not be_byp)
00 11
01 10
10 01
11 00
+134
View File
@@ -0,0 +1,134 @@
//#include <stdio.h>
#include <stdlib.h>
//#include <string.h>
#define NUM_ELEMENTS 100
#define NUM_RUNS 1000
char sein(void)
{
volatile char *pUART_stat = (char*)0x80000008;
volatile char *pUART_data = (char*)0x80000004;
while(!(0x10 & *pUART_stat));
return *pUART_data;
}
void saus(char c)
{
volatile char *pUART_stat = (char*)0x80000008;
volatile char *pUART_data = (char*)0x80000004;
while((0x02 & *pUART_stat) != 0);
*pUART_data = c;
}
int sputs(char *pStr)
{
char *start;
start = pStr;
while(*pStr)
saus(*(pStr++));
return pStr - start;
}
void print_byte(char byte)
{
int i;
unsigned char c, nibble;
for (i=0; i < 2; i++)
{
nibble = (char)((byte >> 4) & 0xF);
byte <<= 4;
if (nibble < 10)
c = nibble + '0';
else
c = nibble + 'A' - 10;
saus(c);
}
}
void print_word(int word)
{
int i;
unsigned char c, nibble;
for (i=0; i < 4; i++)
{
c = (char) (word >> 24);
print_byte(c);
word <<= 8;
}
}
int main (void)
{
int cnt, i, j;
int mix, *pReg = (int*)0x80000000;
volatile char *pUART_data = (char*)0x80000004;
volatile char *pUART_ctrl = (char*)0x80000008;
volatile char *pUART_baud = (char*)0x80000009;
char msg[] = "MIPS R3000 CPU\r\nMul/Div Test\r\n";
int s1, s2, sp, st;
div_t div_res;
*pUART_baud = 0x35;
*pUART_ctrl = 0x55;
srand(0x19701031);
sputs(msg);
cnt = 0;
while(1)
{
for (i=0; i < 1000; i++)
{
for (j=1; j < 1000; j++)
{
mix = (int)rand();
mix = (mix << 8) ^ (mix << 16);
s1 = (int)rand() ^ mix;
mix = (int)rand();
mix = (mix << 8) ^ (mix << 16);
s2 = (int)rand() ^ mix;
// s1 = i;
// s2 = j;
div_res = div(s1, s2);
// print_word(s1);
// sputs(" / ");
// print_word(s2);
// sputs(" = ");
// print_word(div_res.quot);
// sputs(" R: ");
// print_word(div_res.rem);
// sputs(" -- ");
sp = s2*div_res.quot;
st = div_res.rem + sp;
if (st != s1)
{
sputs("Failed: ");
sputs("d*quot = ");
print_word(sp);
sputs("\r\n");
return -1;
}
}
}
sputs("Iteration ");
print_word(cnt++);
sputs(": Passed\r\n");
}
}
+391
View File
@@ -0,0 +1,391 @@
.file 1 "muldiv.c"
.set nobopt
.text
.align 2
.globl sein
.ent sein
sein:
.frame $sp,0,$31 # vars= 0, regs= 0/0, args= 0, gp= 0
.mask 0x00000000,0
.fmask 0x00000000,0
li $2,-2147483648 # 0xffffffff80000000
ori $4,$2,0x4
ori $3,$2,0x8
$L2:
lbu $2,0($3)
andi $2,$2,0x10
beq $2,$0,$L2
lbu $2,0($4)
sll $2,$2,24
.set noreorder
.set nomacro
j $31
sra $2,$2,24
.set macro
.set reorder
.end sein
.align 2
.globl saus
.ent saus
saus:
.frame $sp,0,$31 # vars= 0, regs= 0/0, args= 0, gp= 0
.mask 0x00000000,0
.fmask 0x00000000,0
li $2,-2147483648 # 0xffffffff80000000
sll $4,$4,24
sra $4,$4,24
ori $5,$2,0x4
ori $3,$2,0x8
$L6:
lbu $2,0($3)
andi $2,$2,0x2
bne $2,$0,$L6
sb $4,0($5)
j $31
.end saus
.align 2
.globl sputs
.ent sputs
sputs:
.frame $sp,32,$31 # vars= 0, regs= 3/0, args= 16, gp= 0
.mask 0x80030000,-8
.fmask 0x00000000,0
addiu $sp,$sp,-32
sw $17,20($sp)
sw $16,16($sp)
sw $31,24($sp)
move $16,$4
lb $4,0($4)
.set noreorder
.set nomacro
j $L14
move $17,$16
.set macro
.set reorder
$L15:
.set noreorder
.set nomacro
jal saus
addiu $16,$16,1
.set macro
.set reorder
lb $4,0($16)
$L14:
.set noreorder
.set nomacro
bne $4,$0,$L15
subu $2,$16,$17
.set macro
.set reorder
lw $31,24($sp)
lw $17,20($sp)
lw $16,16($sp)
.set noreorder
.set nomacro
j $31
addiu $sp,$sp,32
.set macro
.set reorder
.end sputs
.align 2
.globl print_byte
.ent print_byte
print_byte:
.frame $sp,32,$31 # vars= 0, regs= 3/0, args= 16, gp= 0
.mask 0x80030000,-8
.fmask 0x00000000,0
addiu $sp,$sp,-32
sw $16,16($sp)
sll $16,$4,24
sw $17,20($sp)
sw $31,24($sp)
sra $16,$16,24
li $17,1 # 0x1
sra $2,$16,4
$L25:
andi $5,$2,0xf
sll $2,$16,4
sll $16,$2,24
sltu $3,$5,10
addiu $17,$17,-1
sra $16,$16,24
.set noreorder
.set nomacro
bne $3,$0,$L21
addiu $4,$5,48
.set macro
.set reorder
addiu $4,$5,55
$L21:
jal saus
.set noreorder
.set nomacro
bgez $17,$L25
sra $2,$16,4
.set macro
.set reorder
lw $31,24($sp)
lw $17,20($sp)
lw $16,16($sp)
.set noreorder
.set nomacro
j $31
addiu $sp,$sp,32
.set macro
.set reorder
.end print_byte
.align 2
.globl print_word
.ent print_word
print_word:
.frame $sp,32,$31 # vars= 0, regs= 3/0, args= 16, gp= 0
.mask 0x80030000,-8
.fmask 0x00000000,0
addiu $sp,$sp,-32
sw $17,20($sp)
sw $16,16($sp)
sw $31,24($sp)
move $16,$4
li $17,3 # 0x3
$L30:
sra $4,$16,24
.set noreorder
.set nomacro
jal print_byte
addiu $17,$17,-1
.set macro
.set reorder
.set noreorder
.set nomacro
bgez $17,$L30
sll $16,$16,8
.set macro
.set reorder
lw $31,24($sp)
lw $17,20($sp)
lw $16,16($sp)
.set noreorder
.set nomacro
j $31
addiu $sp,$sp,32
.set macro
.set reorder
.end print_word
.section .rodata.str1.4,"aMS",@progbits,1
.align 2
$LC0:
.ascii "MIPS R3000 CPU\r\n"
.ascii "Mul/Div Test\r\n\000"
.align 2
$LC1:
.ascii "Failed: \000"
.align 2
$LC2:
.ascii "d*quot = \000"
.align 2
$LC3:
.ascii "\r\n\000"
.align 2
$LC4:
.ascii "Iteration \000"
.align 2
$LC5:
.ascii ": Passed\r\n\000"
.text
.align 2
.globl main
.ent main
main:
.frame $sp,88,$31 # vars= 40, regs= 7/0, args= 16, gp= 0
.mask 0x803f0000,-8
.fmask 0x00000000,0
lw $2,$LC0
addiu $sp,$sp,-88
sw $2,16($sp)
lw $3,$LC0+4
lw $2,$LC0+8
sw $3,20($sp)
sw $2,24($sp)
lw $3,$LC0+12
lw $2,$LC0+16
sw $3,28($sp)
sw $2,32($sp)
lw $3,$LC0+20
lw $2,$LC0+24
sw $3,36($sp)
sw $2,40($sp)
lhu $3,$LC0+28
lbu $2,$LC0+30
li $5,-2147483648 # 0xffffffff80000000
ori $6,$5,0x9
sh $3,44($sp)
sb $2,46($sp)
ori $5,$5,0x8
li $3,53
li $2,85
li $4,426770432 # 0x19700000
sb $3,0($6)
ori $4,$4,0x1031
sb $2,0($5)
sw $31,80($sp)
sw $21,76($sp)
sw $19,68($sp)
sw $20,72($sp)
sw $18,64($sp)
sw $17,60($sp)
.set noreorder
.set nomacro
jal srand
sw $16,56($sp)
.set macro
.set reorder
.set noreorder
.set nomacro
jal sputs
addiu $4,$sp,16
.set macro
.set reorder
move $21,$0
addiu $19,$sp,48
move $20,$0
$L44:
.set noreorder
.set nomacro
j $L43
li $18,1 # 0x1
.set macro
.set reorder
$L51:
beq $3,$0,$L50
$L43:
.set noreorder
.set nomacro
jal rand
addiu $18,$18,1
.set macro
.set reorder
sll $3,$2,16
sll $2,$2,8
.set noreorder
.set nomacro
jal rand
xor $16,$2,$3
.set macro
.set reorder
.set noreorder
.set nomacro
jal rand
xor $17,$2,$16
.set macro
.set reorder
sll $3,$2,16
sll $2,$2,8
.set noreorder
.set nomacro
jal rand
xor $16,$2,$3
.set macro
.set reorder
xor $16,$2,$16
move $6,$16
move $4,$19
.set noreorder
.set nomacro
jal div
move $5,$17
.set macro
.set reorder
lw $2,48($sp)
mult $2,$16
lw $2,52($sp)
mflo $16
addu $2,$2,$16
.set noreorder
.set nomacro
beq $2,$17,$L51
slt $3,$18,1000
.set macro
.set reorder
la $4,$LC1
jal sputs
la $4,$LC2
jal sputs
.set noreorder
.set nomacro
jal print_word
move $4,$16
.set macro
.set reorder
la $4,$LC3
jal sputs
lw $31,80($sp)
lw $21,76($sp)
lw $20,72($sp)
lw $19,68($sp)
lw $18,64($sp)
lw $17,60($sp)
lw $16,56($sp)
li $2,-1 # 0xffffffffffffffff
.set noreorder
.set nomacro
j $31
addiu $sp,$sp,88
.set macro
.set reorder
$L50:
addiu $20,$20,1
slt $2,$20,1000
bne $2,$0,$L44
la $4,$LC4
.set noreorder
.set nomacro
jal sputs
move $20,$0
.set macro
.set reorder
.set noreorder
.set nomacro
jal print_word
move $4,$21
.set macro
.set reorder
la $4,$LC5
.set noreorder
.set nomacro
jal sputs
addiu $21,$21,1
.set macro
.set reorder
.set noreorder
.set nomacro
j $L43
li $18,1 # 0x1
.set macro
.set reorder
.end main
+27
View File
@@ -0,0 +1,27 @@
0x12345678 x 0x87654321
HI = f76c768d LO = 70b88d78 signed
HI = 09a0cd05 LO = 70b88d78 unsigned
0x87654321 x 0x12345678
HI = f76c768d LO = 70b88d78 signed
HI = 09a0cd05 LO = 70b88d78 unsigned
0x12345678 x 0x12345678
HI = 014b66dc LO = 1df4d840 signed
HI = 014b66dc LO = 1df4d840 unsigned
0x87654321 x 0x87654321
HI = 38d16e98 LO = d7a44a41 signed
HI = 479bf4da LO = d7a44a41 unsigned
p1 * n2 = not(p1 * (1 + not(n2)))
n1 * p1 = not((1 + not(n1)) * p2)
p1 * p2 = p1 * p2
n1 * n2 = not(n1) * not(n2);
12345678 * ( 87654321 not and FFFFFFFF ) = + 12345677 =
+2482
View File
File diff suppressed because it is too large Load Diff
+556
View File
@@ -0,0 +1,556 @@
.file 1 "rmd160_test.c"
.set nobopt
.text
.align 2
.globl saus
.ent saus
saus:
.frame $sp,0,$31 # vars= 0, regs= 0/0, args= 0, gp= 0
.mask 0x00000000,0
.fmask 0x00000000,0
li $2,-2147483648 # 0xffffffff80000000
sll $4,$4,24
sra $4,$4,24
ori $5,$2,0x4
ori $3,$2,0x8
$L2:
lbu $2,0($3)
andi $2,$2,0x2
bne $2,$0,$L2
sb $4,0($5)
j $31
.end saus
.align 2
.globl sputs
.ent sputs
sputs:
.frame $sp,32,$31 # vars= 0, regs= 3/0, args= 16, gp= 0
.mask 0x80030000,-8
.fmask 0x00000000,0
addiu $sp,$sp,-32
sw $17,20($sp)
sw $16,16($sp)
sw $31,24($sp)
move $16,$4
lb $4,0($4)
.set noreorder
.set nomacro
j $L11
move $17,$16
.set macro
.set reorder
$L12:
.set noreorder
.set nomacro
jal saus
addiu $16,$16,1
.set macro
.set reorder
lb $4,0($16)
$L11:
.set noreorder
.set nomacro
bne $4,$0,$L12
subu $2,$16,$17
.set macro
.set reorder
lw $31,24($sp)
lw $17,20($sp)
lw $16,16($sp)
.set noreorder
.set nomacro
j $31
addiu $sp,$sp,32
.set macro
.set reorder
.end sputs
.align 2
.globl print_byte
.ent print_byte
print_byte:
.frame $sp,32,$31 # vars= 0, regs= 3/0, args= 16, gp= 0
.mask 0x80030000,-8
.fmask 0x00000000,0
addiu $sp,$sp,-32
sw $16,16($sp)
sll $16,$4,24
sw $17,20($sp)
sw $31,24($sp)
sra $16,$16,24
li $17,1 # 0x1
sra $2,$16,4
$L22:
andi $5,$2,0xf
sll $2,$16,4
sll $16,$2,24
sltu $3,$5,10
addiu $17,$17,-1
sra $16,$16,24
.set noreorder
.set nomacro
bne $3,$0,$L18
addiu $4,$5,48
.set macro
.set reorder
addiu $4,$5,55
$L18:
jal saus
.set noreorder
.set nomacro
bgez $17,$L22
sra $2,$16,4
.set macro
.set reorder
lw $31,24($sp)
lw $17,20($sp)
lw $16,16($sp)
.set noreorder
.set nomacro
j $31
addiu $sp,$sp,32
.set macro
.set reorder
.end print_byte
.align 2
.globl print_word
.ent print_word
print_word:
.frame $sp,32,$31 # vars= 0, regs= 3/0, args= 16, gp= 0
.mask 0x80030000,-8
.fmask 0x00000000,0
addiu $sp,$sp,-32
sw $17,20($sp)
sw $16,16($sp)
sw $31,24($sp)
move $16,$4
li $17,3 # 0x3
$L27:
sra $4,$16,24
.set noreorder
.set nomacro
jal print_byte
addiu $17,$17,-1
.set macro
.set reorder
.set noreorder
.set nomacro
bgez $17,$L27
sll $16,$16,8
.set macro
.set reorder
lw $31,24($sp)
lw $17,20($sp)
lw $16,16($sp)
.set noreorder
.set nomacro
j $31
addiu $sp,$sp,32
.set macro
.set reorder
.end print_word
.lcomm hashcode.0,20
.align 2
.globl RMD
.ent RMD
RMD:
.frame $sp,128,$31 # vars= 88, regs= 6/0, args= 16, gp= 0
.mask 0x801f0000,-4
.fmask 0x00000000,0
addiu $sp,$sp,-128
sw $16,104($sp)
move $16,$4
addiu $4,$sp,16
sw $31,124($sp)
sw $20,120($sp)
sw $18,112($sp)
sw $17,108($sp)
.set noreorder
.set nomacro
jal MDinit
sw $19,116($sp)
.set macro
.set reorder
.set noreorder
.set nomacro
jal strlen
move $4,$16
.set macro
.set reorder
move $18,$2
sltu $2,$2,64
move $17,$18
.set noreorder
.set nomacro
bne $2,$0,$L44
addiu $20,$sp,16
.set macro
.set reorder
addiu $19,$sp,40
addiu $5,$20,24
$L50:
li $11,15 # 0xf
$L37:
lbu $2,3($16)
lbu $3,2($16)
lbu $4,1($16)
sll $3,$3,16
sll $2,$2,24
or $2,$2,$3
sll $4,$4,8
lbu $3,0($16)
or $2,$2,$4
or $2,$2,$3
addiu $11,$11,-1
sw $2,0($5)
addiu $16,$16,4
.set noreorder
.set nomacro
bgez $11,$L37
addiu $5,$5,4
.set macro
.set reorder
addiu $17,$17,-64
addiu $4,$sp,16
.set noreorder
.set nomacro
jal compress
move $5,$19
.set macro
.set reorder
sltu $2,$17,64
.set noreorder
.set nomacro
beq $2,$0,$L50
addiu $5,$20,24
.set macro
.set reorder
$L44:
move $5,$16
move $6,$18
addiu $4,$sp,16
.set noreorder
.set nomacro
jal MDfinish
move $7,$0
.set macro
.set reorder
move $11,$0
la $15,hashcode.0
la $13,hashcode.0+1
la $14,hashcode.0+2
la $12,hashcode.0+3
$L42:
srl $2,$11,2
sll $2,$2,2
addu $2,$2,$20
lw $3,0($2)
addu $7,$11,$15
addu $8,$11,$13
addu $9,$11,$14
addu $10,$11,$12
addiu $11,$11,4
srl $6,$3,24
srl $2,$3,8
srl $4,$3,16
sltu $5,$11,20
sb $3,0($7)
sb $2,0($8)
sb $4,0($9)
.set noreorder
.set nomacro
bne $5,$0,$L42
sb $6,0($10)
.set macro
.set reorder
lw $31,124($sp)
lw $20,120($sp)
lw $19,116($sp)
lw $18,112($sp)
lw $17,108($sp)
lw $16,104($sp)
la $2,hashcode.0
.set noreorder
.set nomacro
j $31
addiu $sp,$sp,128
.set macro
.set reorder
.end RMD
.section .rodata.str1.4,"aMS",@progbits,1
.align 2
$LC0:
.ascii "\r\n\000"
.align 2
$LC1:
.ascii "* message: \000"
.align 2
$LC2:
.ascii " hashcode: \000"
.text
.align 2
.globl RMDstring
.ent RMDstring
RMDstring:
.frame $sp,40,$31 # vars= 8, regs= 3/0, args= 16, gp= 0
.mask 0x80030000,-8
.fmask 0x00000000,0
lbu $3,$LC0+2
lhu $2,$LC0
addiu $sp,$sp,-40
sw $31,32($sp)
sb $3,18($sp)
sw $17,28($sp)
sw $16,24($sp)
sh $2,16($sp)
.set noreorder
.set nomacro
jal RMD
move $16,$5
.set macro
.set reorder
addiu $4,$sp,16
.set noreorder
.set nomacro
jal sputs
move $17,$2
.set macro
.set reorder
la $4,$LC1
jal sputs
.set noreorder
.set nomacro
jal sputs
move $4,$16
.set macro
.set reorder
.set noreorder
.set nomacro
jal sputs
addiu $4,$sp,16
.set macro
.set reorder
la $4,$LC2
.set noreorder
.set nomacro
jal sputs
move $16,$0
.set macro
.set reorder
addu $2,$17,$16
$L58:
lb $4,0($2)
.set noreorder
.set nomacro
jal print_byte
addiu $16,$16,1
.set macro
.set reorder
sltu $2,$16,20
.set noreorder
.set nomacro
bne $2,$0,$L58
addu $2,$17,$16
.set macro
.set reorder
.set noreorder
.set nomacro
jal sputs
addiu $4,$sp,16
.set macro
.set reorder
lw $31,32($sp)
lw $17,28($sp)
lw $16,24($sp)
.set noreorder
.set nomacro
j $31
addiu $sp,$sp,40
.set macro
.set reorder
.end RMDstring
.rdata
.align 2
$LC3:
.byte -1
.byte 35
.byte -100
.byte -42
.byte 89
.byte -118
.byte 121
.byte 46
.byte -89
.byte -85
.byte 108
.byte -8
.byte 117
.byte -74
.byte 53
.byte 94
.byte 93
.byte -128
.byte 106
.byte 54
.section .rodata.str1.4
.align 2
$LC4:
.ascii "MIPS R3000 CPU\000"
.align 2
$LC5:
.ascii "Failed\r\n\000"
.text
.align 2
.globl main
.ent main
main:
.frame $sp,88,$31 # vars= 48, regs= 5/0, args= 16, gp= 0
.mask 0x800f0000,-8
.fmask 0x00000000,0
lwl $2,$LC3+3
lwl $3,$LC3+7
lwr $2,$LC3
lwr $3,$LC3+4
lwl $4,$LC3+11
lwl $5,$LC3+15
lwl $6,$LC3+19
addiu $sp,$sp,-88
lwr $4,$LC3+8
lwr $5,$LC3+12
lwr $6,$LC3+16
sw $2,16($sp)
sw $3,20($sp)
lw $2,$LC4
lw $3,$LC4+4
sw $19,76($sp)
sw $18,72($sp)
sw $17,68($sp)
sw $4,24($sp)
sw $5,28($sp)
sw $2,40($sp)
sw $31,80($sp)
sw $16,64($sp)
sw $6,32($sp)
sw $3,44($sp)
lw $2,$LC4+8
lhu $3,$LC4+12
sw $2,48($sp)
lbu $2,$LC4+14
sh $3,52($sp)
sb $2,54($sp)
lbu $3,$LC0+2
lhu $2,$LC0
li $4,-2147483648 # 0xffffffff80000000
sh $2,56($sp)
sb $3,58($sp)
ori $5,$4,0x9
li $2,53
ori $4,$4,0x8
li $3,85
sb $2,0($5)
move $18,$0
sb $3,0($4)
addiu $19,$sp,56
addiu $17,$sp,40
$L60:
.set noreorder
.set nomacro
jal print_word
move $4,$18
.set macro
.set reorder
.set noreorder
.set nomacro
jal sputs
move $4,$19
.set macro
.set reorder
addiu $18,$18,1
.set noreorder
.set nomacro
j $L66
li $16,32249 # 0x7df9
.set macro
.set reorder
$L64:
.set noreorder
.set nomacro
bltz $16,$L70
move $4,$17
.set macro
.set reorder
$L66:
.set noreorder
.set nomacro
jal RMD
move $4,$17
.set macro
.set reorder
move $4,$2
addiu $5,$sp,16
.set noreorder
.set nomacro
jal memcmp
li $6,20 # 0x14
.set macro
.set reorder
la $4,$LC5
.set noreorder
.set nomacro
beq $2,$0,$L64
addiu $16,$16,-1
.set macro
.set reorder
jal sputs
.set noreorder
.set nomacro
bgez $16,$L66
move $4,$17
.set macro
.set reorder
$L70:
.set noreorder
.set nomacro
jal RMDstring
move $5,$17
.set macro
.set reorder
j $L60
.end main
+50
View File
@@ -0,0 +1,50 @@
main:
li, $8, 0x81234678
# SB
li, $15, 0x10000000
sw $8, 0($15)
mfc0 $9, $12
li $10, 0x02000000
or $9, $9, $10
mtc0 $9, $12
lwl $16, 0($15)
lwl $17, 1($15)
lwl $18, 2($15)
lwl $19, 3($15)
nop
lwr $24, 0($15)
lwr $25, 1($15)
lwr $26, 2($15)
lwr $27, 3($15)
nop
lbu $16, 0($15)
lbu $17, 1($15)
lbu $18, 2($15)
lbu $19, 3($15)
nop
lb $24, 0($15)
lb $25, 1($15)
lb $26, 2($15)
lb $27, 3($15)
nop
swl $8, 4($15)
swl $8, 9($15)
swl $8, 14($15)
swl $8, 19($15)
nop
swr $8, 20($15)
swr $8, 25($15)
swr $8, 30($15)
swr $8, 35($15)
nop
sb $8, 0($15)
sb $8, 1($15)
sb $8, 2($15)
sb $8, 3($15)
nop
nop
nop
+27
View File
@@ -0,0 +1,27 @@
.file "startup.s"
.section .stext,"ax"
.extern _init
.align 2
_start:
.set noreorder
# Set Kernel mode
li $26, 0x1040040C
mtc0 $26, $12
li $26, 0x00000000
mtc0 $26, $13
mfc0 $26, $15
nop
mtc0 $26, $31
# jump init
la $26, _init
jr $26
# set user mode
rfe
.set reorder
+39
View File
@@ -0,0 +1,39 @@
.text
.globl main
.globl __start
__start: j main
main: lui $1, 0x1234
ori $1, $1, 0x5678
andi $1, $1, 0xF00F
addi $1, -0x5004
loop: addi $1, -1
bgtz $1, loop
lui $2, 0
ori $2, 1
lui $1, 0
ori $1, 4
loop2: sub $1, $1, $2
bgtz $1, loop2
lui $31, 0x0040
jr $31
sll $0, $0, 0
sll $0, $0, 0
sll $0, $0, 0
sll $0, $0, 0
sll $0, $0, 0
sll $0, $0, 0
sll $0, $0, 0
sll $0, $0, 0
sll $0, $0, 0
sll $0, $0, 0
sll $0, $0, 0
sll $0, $0, 0
sll $0, $0, 0
sll $0, $0, 0
sll $0, $0, 0
sll $0, $0, 0
sll $0, $0, 0
+40
View File
@@ -0,0 +1,40 @@
.text
.globl main
.globl __start
__start: j main
main: lui $1, 0x1234
ori $1, $1, 0x5678
lui $3, 0x5555
ori $3, $3, 0xAAAA
lui $2, 0x1000
sw $1, 0($2)
sw $3, 4($2)
sw $2, 0($2)
sw $1, 4($2)
lw $1, 4($2)
lw $4, 0($2)
lui $5, 0x0001
lui $6, 0x0002
lui $7, 0x0003
lui $8, 0x0004
add $4, $4, $5
sll $0, $0, 0
sll $0, $0, 0
sll $0, $0, 0
sll $0, $0, 0
sll $0, $0, 0
j main
sll $0, $0, 0
sll $0, $0, 0
sll $0, $0, 0
sll $0, $0, 0
sll $0, $0, 0
sll $0, $0, 0
sll $0, $0, 0
sll $0, $0, 0
sll $0, $0, 0
sll $0, $0, 0
+40
View File
@@ -0,0 +1,40 @@
.text
.globl main
.globl __start
__start: j main
main: lui $1, 0x1234
ori $1, $1, 0x5A5A
sll $1, $1, 1
sll $1, $1, 4
sll $1, $1, 2
sll $1, $1, 1
sll $1, $1, 8
srl $1, $1, 2
srl $1, $1, 5
srl $1, $1, 1
srl $1, $1, 8
xori $1, $1, 0xFFFF
lui $31, 0x0040
jr $31
xor $1, $1, $31
sll $0, $0, 0
sll $0, $0, 0
sll $0, $0, 0
sll $0, $0, 0
sll $0, $0, 0
sll $0, $0, 0
sll $0, $0, 0
sll $0, $0, 0
sll $0, $0, 0
sll $0, $0, 0
sll $0, $0, 0
sll $0, $0, 0
sll $0, $0, 0
sll $0, $0, 0
sll $0, $0, 0
sll $0, $0, 0
sll $0, $0, 0
+34
View File
@@ -0,0 +1,34 @@
.text
.globl main
.globl __start
__start: j main
main: sll $0, $0, 0
lui $1, 0x1000
addi $2, $1, 0
lui $7, 0x1234
lui $5, 0x0001
sw $7, 0($1)
lw $3, 0($2)
add $8, $3, $5
add $9, $3, $5
add $10, $3, $5
add $11, $3, $5
sll $0, $0, 0
sll $0, $0, 0
sll $0, $0, 0
j main
sll $0, $0, 0
sll $0, $0, 0
sll $0, $0, 0
sll $0, $0, 0
sll $0, $0, 0
sll $0, $0, 0
sll $0, $0, 0
sll $0, $0, 0
sll $0, $0, 0
sll $0, $0, 0
sll $0, $0, 0
+39
View File
@@ -0,0 +1,39 @@
.text
.globl main
.globl __start
__start: j main
main: lui $1, 0x8000
lui $2, 0
lui $3, 0
ori $2, 1
ori $3, 3
srl $1, $1, 1
sll $1, $1, 1
sra $1, $1, 1
sra $1, $1, 3
sllv $4, $1, $3
srav $5, $1, $2
srav $6, $1, $3
lui $31, 0x0040
jr $31
sll $0, $0, 0
sll $0, $0, 0
sll $0, $0, 0
sll $0, $0, 0
sll $0, $0, 0
sll $0, $0, 0
sll $0, $0, 0
sll $0, $0, 0
sll $0, $0, 0
sll $0, $0, 0
sll $0, $0, 0
sll $0, $0, 0
sll $0, $0, 0
sll $0, $0, 0
sll $0, $0, 0
sll $0, $0, 0
sll $0, $0, 0
+31
View File
@@ -0,0 +1,31 @@
.text
.globl main
.globl __start
__start: j main
main: lui $8, 0
loop: sll $0, $0, 0
jal subr1
la $2, subr2
jalr $15, $2
sll $0, $0, 0
j loop
subr1: addi $8, 1
sll $0, $0, 0
jr $31
subr2: addi $8, 16
sll $0, $0, 0
jr $15
sll $0, $0, 0
sll $0, $0, 0
sll $0, $0, 0
sll $0, $0, 0
sll $0, $0, 0
sll $0, $0, 0
sll $0, $0, 0
sll $0, $0, 0
sll $0, $0, 0
+17
View File
@@ -0,0 +1,17 @@
main: li $2, 0x12345678
li $3, 0x87654321
mult $2, $3
multu $2, $3
mult $3, $2
multu $3, $2
mult $2, $2
multu $2, $2
mult $3, $3
multu $3, $3
sll $0, $0, 0
j main
sll $0, $0, 0
+76
View File
@@ -0,0 +1,76 @@
.text
.globl main
.globl __start
__start: j main
main: li $2, 0x12345678
li $4, 0x12345678
li $6, 0x12345678
li $8, 0x12345678
li $3, 0x77654321
li $5, 0x77654321
li $7, 0x77654321
li $9, 0x77654321
addu $15, $2, $3
addu $15, $3, $2
addu $15, $2, $2
addu $15, $3, $3
sll $0, $0, 0
subu $15, $2, $3
subu $15, $3, $2
subu $15, $2, $2
subu $15, $3, $3
sll $0, $0, 0
addiu $4, 0x1234
addiu $8, -0x1234
addiu $5, 0x1234
addiu $9, -0x1234
sll $0, $0, 0
add $15, $2, $3
add $15, $3, $2
add $15, $2, $2
add $15, $3, $3
sll $0, $0, 0
sub $15, $2, $3
sub $15, $3, $2
sub $15, $2, $2
sub $15, $3, $3
sll $0, $0, 0
addi $2, 0x1234
addi $6, -0x1234
addi $3, 0x1234
addi $7, -0x1234
sll $0, $0, 0
j main
sll $0, $0, 0
sll $0, $0, 0
sll $0, $0, 0
sll $0, $0, 0
sll $0, $0, 0
sll $0, $0, 0
sll $0, $0, 0
sll $0, $0, 0
sll $0, $0, 0
sll $0, $0, 0
sll $0, $0, 0
sll $0, $0, 0
sll $0, $0, 0
sll $0, $0, 0
sll $0, $0, 0
sll $0, $0, 0
sll $0, $0, 0
+17
View File
@@ -0,0 +1,17 @@
main:
li $8, 0x12345678
li $9, 0x87654321
mthi $8
mfhi $10
addu $16, $10, $9
mtlo $9
mflo $11
multu $8, $9
# addu $17, $11, $8
nop
nop
nop
nop
+57
View File
@@ -0,0 +1,57 @@
# .ktext 0x80000180
.text 0x00410000
.globl main
main: li $2, 0x12345678
li $3, 0x23456789
li $4, 0x87654321
li $5, 0x98765432
li $8, 0x10000000
sll $0, $0, 0
sltu $15, $2, $2
sltu $15, $2, $3
sltu $15, $2, $4
sltu $15, $2, $5
sltu $15, $3, $2
sltu $15, $3, $3
sltu $15, $3, $4
sltu $15, $3, $5
sltu $15, $4, $2
sltu $15, $4, $3
sltu $15, $4, $4
sltu $15, $4, $5
sltu $15, $5, $2
sltu $15, $5, $3
sltu $15, $5, $4
sltu $15, $5, $5
sll $0, $0, 0
slt $15, $2, $2
slt $15, $2, $3
slt $15, $2, $4
slt $15, $2, $5
slt $15, $3, $2
slt $15, $3, $3
slt $15, $3, $4
slt $15, $3, $5
slt $15, $4, $2
slt $15, $4, $3
slt $15, $4, $4
slt $15, $4, $5
slt $15, $5, $2
slt $15, $5, $3
slt $15, $5, $4
slt $15, $5, $5
sll $0, $0, 0
j main
sll $0, $0, 0
+57
View File
@@ -0,0 +1,57 @@
# .ktext 0x80000180
.text 0x00410000
.globl main
main: li $2, 0x12345678
li $3, 0x23456789
li $4, 0x87654321
li $5, 0x98765432
li $8, 0x10000000
sll $0, $0, 0
sltiu $15, $2, 0x1234
sltiu $15, $2, 0x2345
sltiu $15, $2, -0x1234
sltiu $15, $2, -0x2345
sltiu $15, $3, 0x1234
sltiu $15, $3, 0x2345
sltiu $15, $3, -0x1234
sltiu $15, $3, -0x2345
sltiu $15, $4, 0x1234
sltiu $15, $4, 0x2345
sltiu $15, $4, -0x1234
sltiu $15, $4, -0x2345
sltiu $15, $5, 0x1234
sltiu $15, $5, 0x2345
sltiu $15, $5, -0x1234
sltiu $15, $5, -0x2345
sll $0, $0, 0
slti $15, $2, 0x1234
slti $15, $2, 0x2345
slti $15, $2, -0x1234
slti $15, $2, -0x2345
slti $15, $3, 0x1234
slti $15, $3, 0x2345
slti $15, $3, -0x1234
slti $15, $3, -0x2345
slti $15, $4, 0x1234
slti $15, $4, 0x2345
slti $15, $4, -0x1234
slti $15, $4, -0x2345
slti $15, $5, 0x1234
slti $15, $5, 0x2345
slti $15, $5, -0x1234
slti $15, $5, -0x2345
sll $0, $0, 0
j main
sll $0, $0, 0
+57
View File
@@ -0,0 +1,57 @@
# .ktext 0x80000180
.text 0x00410000
.globl main
main: li $2, 0x12345678
li $3, 0x23456789
li $4, 0x87654321
li $5, 0x98765432
li $8, 0x10000000
sll $0, $0, 0
subu $15, $2, $2
subu $15, $2, $3
subu $15, $2, $4
subu $15, $2, $5
subu $15, $3, $2
subu $15, $3, $3
subu $15, $3, $4
subu $15, $3, $5
subu $15, $4, $2
subu $15, $4, $3
subu $15, $4, $4
subu $15, $4, $5
subu $15, $5, $2
subu $15, $5, $3
subu $15, $5, $4
subu $15, $5, $5
sll $0, $0, 0
sub $15, $2, $2
sub $15, $2, $3
sub $15, $2, $4
sub $15, $2, $5
sub $15, $3, $2
sub $15, $3, $3
sub $15, $3, $4
sub $15, $3, $5
sub $15, $4, $2
sub $15, $4, $3
sub $15, $4, $4
sub $15, $4, $5
sub $15, $5, $2
sub $15, $5, $3
sub $15, $5, $4
sub $15, $5, $5
sll $0, $0, 0
j main
sll $0, $0, 0
+322
View File
@@ -0,0 +1,322 @@
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include "utils.h"
#define NO_ERROR 0x00000000
#define ERROR 0x80000000
#define IS_ERROR(e) ((e & ERROR) == ERROR)
#define TEST10_ERROR (ERROR | 0x10)
#define TEST11_ERROR (ERROR | 0x11)
#define TEST12_ERROR (ERROR | 0x12)
int fibonacci(int f0, int f1, int *pDst, int len)
{
int i;
i = 0;
pDst[i++] = f0;
pDst[i++] = f1;
for (; i < len; i++)
{
pDst[i] = pDst[i-2] + pDst[i-1];
}
return i;
}
int StatusRegister_read(void)
{
__asm
(
".set noreorder\n"
"mfc0 $2, $12\n"
".set reorder\n"
);
}
int RevisionRegister_read(void)
{
__asm
(
".set noreorder\n"
"mfc0 $2, $15\n"
".set reorder\n"
);
}
void PrintCPUinfo(void)
{
int result, rev_id;
char *cpu_type_str[7] = {"invalid", "R2000", "R3000", "R6000", "R4000", "reserved", "R6000A"};
// Print Status register
result = StatusRegister_read();
sputs("Status : ");
print_word(result);
sputs("\r\n");
// Print Revision
result = RevisionRegister_read();
rev_id = (result >> 8) & 0xFF;
sputs("CPU type: ");
if ((rev_id > 0) && (rev_id < 0x07))
{
sputs(cpu_type_str[rev_id]);
sputs(" Rev.");
rev_id = result & 0xFF;
print_byte((char)rev_id);
}
else
sputs("Unknown");
sputs("\r\n");
}
int Test10_LoadStore()
{
int *buf, i, result, data, err;
volatile int *pPtr;
buf = (int*)malloc(32*sizeof(int));
while(1)
{
err = TEST10_ERROR;
// Basic Load/Store
pPtr = buf;
*pPtr++ = 0x00000000;
*pPtr++ = 0x55555555;
*pPtr++ = 0xAAAAAAAA;
*pPtr++ = 0xFFFFFFFF;
pPtr = buf;
if (*pPtr++ != 0x00000000)
break;
if (*pPtr++ != 0x55555555)
break;
if (*pPtr++ != 0xAAAAAAAA)
break;
if (*pPtr++ != 0xFFFFFFFF)
break;
// Filling from left
pPtr = buf;
data = 0x00000000;
for (i=0; i < 32; i++)
{
*pPtr++ = data;
data = data >> 1 | 0x80000000;
}
pPtr = buf;
data = 0x00000000;
for (i=0; i < 32; i++)
{
if (*pPtr++ != data)
break;
data = data >> 1 | 0x80000000;
}
if (i != 32)
break;
// Filling from right
pPtr = buf;
data = 0x00000000;
for (i=0; i < 32; i++)
{
*pPtr++ = data;
data = data << 1 | 1;
}
pPtr = buf;
data = 0x00000000;
for (i=0; i < 32; i++)
{
if (*pPtr++ != data)
break;
data = data << 1 | 1;
}
if (i != 32)
break;
// Walking ones
pPtr = buf;
data = 0x00000001;
for (i=0; i < 32; i++)
{
*pPtr++ = data;
data = data << 1;
}
pPtr = buf;
data = 0x00000001;
for (i=0; i < 32; i++)
{
if (*pPtr++ != data)
break;
data = data << 1;
}
if (i != 32)
break;
// Walking zeros
pPtr = buf;
data = 0xFFFFFFFE;
for (i=0; i < 32; i++)
{
*pPtr++ = data;
data = data << 1 | 1;
}
pPtr = buf;
data = 0xFFFFFFFE;
for (i=0; i < 32; i++)
{
if (*pPtr++ != data)
break;
data = data << 1 | 1;
}
if (i != 32)
break;
err = NO_ERROR;
break;
}
free(buf);
return err;
}
#define NUM_ELEMENTS 20
#define NUM_RUNS 3
int Test11_AddSub()
{
int buf[NUM_ELEMENTS], result, i, j, diff, fill, num_right_elements, num_right_runs;
fill = 0xAAAAAAAA;
num_right_runs = 0;
for (i=0; i < NUM_RUNS; i++)
{
for (j=0; j < NUM_ELEMENTS; j++)
buf[j] = fill;
fill = ((fill ^ i) - 1) << 1;
num_right_elements = 2;
result = fibonacci(i, i+1, buf, NUM_ELEMENTS);
for (j=2; j < NUM_ELEMENTS; j++)
{
diff = buf[j] - buf[j-1];
if (diff == buf[j-2])
num_right_elements++;
}
if (num_right_elements == NUM_ELEMENTS)
num_right_runs++;
}
if (num_right_runs != NUM_RUNS)
return TEST11_ERROR;
return NO_ERROR;
}
int Test12_MulDiv()
{
int mix, i, j;
int s1, s2, sp, st;
div_t div_res;
srand(0x19701031);
for (i=0; i < 100; i++)
{
for (j=1; j < 1000; j++)
{
mix = (int)rand();
mix = (mix << 8) ^ (mix << 16);
s1 = (int)rand() ^ mix;
mix = (int)rand();
mix = (mix << 8) ^ (mix << 16);
s2 = (int)rand() ^ mix;
div_res = div(s1, s2);
sp = s2*div_res.quot;
st = div_res.rem + sp;
if (st != s1)
return TEST12_ERROR;
}
}
return NO_ERROR;
}
int main (void)
{
int result, i, j, cnt;
volatile char *pUART_baud = (char*)0x80000009;
volatile int *pReg = (int*)0x80000000;
volatile int *pReg_usec = (int*)0x80000010;
volatile int *pReg_sec = (int*)0x80000014;
time_t clock;
struct tm *pDate;
// *pUART_baud = 0x35/4;
PrintCPUinfo();
cnt = 0;
// *pReg_sec = 0x12345678;
while (1)
{
*pReg = cnt & 0x3FFFFFFF;
result = Test10_LoadStore();
if (IS_ERROR(result))
break;
result = Test11_AddSub();
if (IS_ERROR(result))
break;
result = Test12_MulDiv();
if (IS_ERROR(result))
break;
// printf("Iteration %d: Passed\r\n", cnt++);
sputs("Iteration ");
print_word(cnt++);
sputs(": Passed\r\n");
clock = time(NULL);
pDate = gmtime(&clock);
print_byte(pDate->tm_hour);
sputs(":");
print_byte(pDate->tm_min);
sputs(":");
print_byte(pDate->tm_sec);
sputs("\r\n");
}
*pReg = 0x40000000 | cnt;
sputs("Failed with error ");
print_word(result);
sputs(" \r\n");
return 1;
}
+924
View File
@@ -0,0 +1,924 @@
.file 1 "testbench.c"
.set nobopt
.text
.align 2
.globl fibonacci
.ent fibonacci
fibonacci:
.frame $sp,0,$31 # vars= 0, regs= 0/0, args= 0, gp= 0
.mask 0x00000000,0
.fmask 0x00000000,0
li $8,2 # 0x2
slt $2,$8,$7
sw $4,0($6)
.set noreorder
.set nomacro
beq $2,$0,$L7
sw $5,4($6)
.set macro
.set reorder
addiu $6,$6,8
$L5:
lw $2,-8($6)
lw $3,-4($6)
addiu $8,$8,1
addu $2,$2,$3
slt $4,$8,$7
sw $2,0($6)
.set noreorder
.set nomacro
bne $4,$0,$L5
addiu $6,$6,4
.set macro
.set reorder
$L7:
.set noreorder
.set nomacro
j $31
move $2,$8
.set macro
.set reorder
.end fibonacci
.align 2
.globl StatusRegister_read
.ent StatusRegister_read
StatusRegister_read:
.frame $sp,0,$31 # vars= 0, regs= 0/0, args= 0, gp= 0
.mask 0x00000000,0
.fmask 0x00000000,0
#APP
.set noreorder
mfc0 $2, $12
.set reorder
#NO_APP
j $31
.end StatusRegister_read
.align 2
.globl RevisionRegister_read
.ent RevisionRegister_read
RevisionRegister_read:
.frame $sp,0,$31 # vars= 0, regs= 0/0, args= 0, gp= 0
.mask 0x00000000,0
.fmask 0x00000000,0
#APP
.set noreorder
mfc0 $2, $15
.set reorder
#NO_APP
j $31
.end RevisionRegister_read
.section .rodata.str1.4,"aMS",@progbits,1
.align 2
$LC0:
.ascii "invalid\000"
.align 2
$LC1:
.ascii "R2000\000"
.align 2
$LC2:
.ascii "R3000\000"
.align 2
$LC3:
.ascii "R6000\000"
.align 2
$LC4:
.ascii "R4000\000"
.align 2
$LC5:
.ascii "reserved\000"
.align 2
$LC6:
.ascii "R6000A\000"
.rdata
.align 2
$LC7:
.word $LC0
.word $LC1
.word $LC2
.word $LC3
.word $LC4
.word $LC5
.word $LC6
.section .rodata.str1.4
.align 2
$LC8:
.ascii "Status : \000"
.align 2
$LC9:
.ascii "\r\n\000"
.align 2
$LC10:
.ascii "CPU type: \000"
.align 2
$LC12:
.ascii "Unknown\000"
.align 2
$LC11:
.ascii " Rev.\000"
.text
.align 2
.globl PrintCPUinfo
.ent PrintCPUinfo
PrintCPUinfo:
.frame $sp,64,$31 # vars= 32, regs= 3/0, args= 16, gp= 0
.mask 0x80030000,-8
.fmask 0x00000000,0
lw $2,$LC7
addiu $sp,$sp,-64
lw $3,$LC7+4
sw $2,16($sp)
lw $2,$LC7+8
sw $3,20($sp)
sw $2,24($sp)
lw $3,$LC7+12
lw $2,$LC7+16
sw $3,28($sp)
sw $2,32($sp)
lw $3,$LC7+20
lw $2,$LC7+24
sw $3,36($sp)
sw $31,56($sp)
sw $17,52($sp)
sw $16,48($sp)
.set noreorder
.set nomacro
jal StatusRegister_read
sw $2,40($sp)
.set macro
.set reorder
la $4,$LC8
.set noreorder
.set nomacro
jal sputs
move $17,$2
.set macro
.set reorder
.set noreorder
.set nomacro
jal print_word
move $4,$17
.set macro
.set reorder
la $4,$LC9
jal sputs
jal RevisionRegister_read
sra $16,$2,8
andi $16,$16,0xff
la $4,$LC10
.set noreorder
.set nomacro
jal sputs
move $17,$2
.set macro
.set reorder
sll $3,$16,2
addiu $16,$16,-1
sltu $16,$16,6
la $4,$LC12
.set noreorder
.set nomacro
beq $16,$0,$L12
addu $2,$sp,$3
.set macro
.set reorder
lw $4,16($2)
jal sputs
la $4,$LC11
jal sputs
sll $4,$17,24
.set noreorder
.set nomacro
jal print_byte
sra $4,$4,24
.set macro
.set reorder
la $4,$LC9
jal sputs
lw $31,56($sp)
lw $17,52($sp)
lw $16,48($sp)
.set noreorder
.set nomacro
j $31
addiu $sp,$sp,64
.set macro
.set reorder
$L12:
jal sputs
la $4,$LC9
jal sputs
lw $31,56($sp)
lw $17,52($sp)
lw $16,48($sp)
.set noreorder
.set nomacro
j $31
addiu $sp,$sp,64
.set macro
.set reorder
.end PrintCPUinfo
.align 2
.globl Test10_LoadStore
.ent Test10_LoadStore
Test10_LoadStore:
.frame $sp,24,$31 # vars= 0, regs= 2/0, args= 16, gp= 0
.mask 0x80010000,-4
.fmask 0x00000000,0
addiu $sp,$sp,-24
li $4,128 # 0x80
sw $31,20($sp)
.set noreorder
.set nomacro
jal malloc
sw $16,16($sp)
.set macro
.set reorder
move $4,$2
li $2,1431633920 # 0x55550000
li $3,-1431699456 # 0xffffffffaaaa0000
ori $5,$2,0x5555
ori $6,$3,0xaaaa
li $7,-1 # 0xffffffffffffffff
sw $0,0($4)
sw $5,4($4)
sw $6,8($4)
sw $7,12($4)
lw $3,0($4)
li $2,-2147483648 # 0xffffffff80000000
.set noreorder
.set nomacro
bne $3,$0,$L16
ori $16,$2,0x10
.set macro
.set reorder
lw $2,4($4)
beq $2,$5,$L73
$L16:
jal free
move $2,$16
lw $31,20($sp)
lw $16,16($sp)
.set noreorder
.set nomacro
j $31
addiu $sp,$sp,24
.set macro
.set reorder
$L73:
lw $2,8($4)
bne $2,$6,$L16
lw $2,12($4)
.set noreorder
.set nomacro
bne $2,$7,$L16
move $3,$4
.set macro
.set reorder
move $5,$0
li $7,-2147483648 # 0xffffffff80000000
li $6,31 # 0x1f
$L24:
sra $2,$5,1
addiu $6,$6,-1
sw $5,0($3)
addiu $3,$3,4
.set noreorder
.set nomacro
bgez $6,$L24
or $5,$2,$7
.set macro
.set reorder
move $3,$4
move $5,$0
move $6,$0
.set noreorder
.set nomacro
j $L29
li $8,-2147483648 # 0xffffffff80000000
.set macro
.set reorder
$L74:
addiu $6,$6,1
slt $2,$6,32
.set noreorder
.set nomacro
beq $2,$0,$L26
or $5,$7,$8
.set macro
.set reorder
$L29:
lw $2,0($3)
sra $7,$5,1
.set noreorder
.set nomacro
beq $2,$5,$L74
addiu $3,$3,4
.set macro
.set reorder
$L26:
li $2,32 # 0x20
.set noreorder
.set nomacro
bne $6,$2,$L16
move $3,$4
.set macro
.set reorder
move $5,$0
li $6,31 # 0x1f
$L34:
sll $2,$5,1
addiu $6,$6,-1
sw $5,0($3)
addiu $3,$3,4
.set noreorder
.set nomacro
bgez $6,$L34
ori $5,$2,0x1
.set macro
.set reorder
move $3,$4
move $5,$0
.set noreorder
.set nomacro
j $L39
move $6,$0
.set macro
.set reorder
$L75:
addiu $6,$6,1
slt $2,$6,32
.set noreorder
.set nomacro
beq $2,$0,$L36
ori $5,$7,0x1
.set macro
.set reorder
$L39:
lw $2,0($3)
sll $7,$5,1
.set noreorder
.set nomacro
beq $2,$5,$L75
addiu $3,$3,4
.set macro
.set reorder
$L36:
li $2,32 # 0x20
.set noreorder
.set nomacro
bne $6,$2,$L16
move $3,$4
.set macro
.set reorder
li $5,1 # 0x1
li $6,31 # 0x1f
$L44:
addiu $6,$6,-1
sw $5,0($3)
addiu $3,$3,4
.set noreorder
.set nomacro
bgez $6,$L44
sll $5,$5,1
.set macro
.set reorder
move $3,$4
li $5,1 # 0x1
.set noreorder
.set nomacro
j $L49
move $6,$0
.set macro
.set reorder
$L76:
addiu $6,$6,1
slt $2,$6,32
.set noreorder
.set nomacro
beq $2,$0,$L46
sll $5,$5,1
.set macro
.set reorder
$L49:
lw $2,0($3)
.set noreorder
.set nomacro
beq $2,$5,$L76
addiu $3,$3,4
.set macro
.set reorder
$L46:
li $2,32 # 0x20
.set noreorder
.set nomacro
bne $6,$2,$L16
move $3,$4
.set macro
.set reorder
li $5,-2 # 0xfffffffffffffffe
li $6,31 # 0x1f
$L54:
sll $2,$5,1
addiu $6,$6,-1
sw $5,0($3)
addiu $3,$3,4
.set noreorder
.set nomacro
bgez $6,$L54
ori $5,$2,0x1
.set macro
.set reorder
move $3,$4
li $5,-2 # 0xfffffffffffffffe
.set noreorder
.set nomacro
j $L59
move $6,$0
.set macro
.set reorder
$L77:
addiu $6,$6,1
slt $2,$6,32
.set noreorder
.set nomacro
beq $2,$0,$L56
ori $5,$7,0x1
.set macro
.set reorder
$L59:
lw $2,0($3)
sll $7,$5,1
.set noreorder
.set nomacro
beq $2,$5,$L77
addiu $3,$3,4
.set macro
.set reorder
$L56:
li $2,32 # 0x20
bne $6,$2,$L16
.set noreorder
.set nomacro
j $L16
move $16,$0
.set macro
.set reorder
.end Test10_LoadStore
.align 2
.globl Test11_AddSub
.ent Test11_AddSub
Test11_AddSub:
.frame $sp,120,$31 # vars= 80, regs= 5/0, args= 16, gp= 0
.mask 0x800f0000,-8
.fmask 0x00000000,0
addiu $sp,$sp,-120
li $2,-1431699456 # 0xffffffffaaaa0000
sw $19,108($sp)
sw $18,104($sp)
sw $16,96($sp)
sw $31,112($sp)
sw $17,100($sp)
ori $16,$2,0xaaaa
move $19,$0
move $4,$0
addiu $18,$sp,16
$L92:
move $2,$18
li $6,19 # 0x13
$L85:
addiu $6,$6,-1
sw $16,0($2)
.set noreorder
.set nomacro
bgez $6,$L85
addiu $2,$2,4
.set macro
.set reorder
xor $2,$16,$4
addiu $17,$4,1
addiu $2,$2,-1
move $5,$17
addiu $6,$sp,16
li $7,20 # 0x14
.set noreorder
.set nomacro
jal fibonacci
sll $16,$2,1
.set macro
.set reorder
li $7,2 # 0x2
addiu $5,$18,8
.set noreorder
.set nomacro
j $L90
li $6,17 # 0x11
.set macro
.set reorder
$L88:
bltz $6,$L100
$L90:
lw $2,0($5)
lw $3,-4($5)
lw $4,-8($5)
subu $2,$2,$3
addiu $6,$6,-1
.set noreorder
.set nomacro
bne $4,$2,$L88
addiu $5,$5,4
.set macro
.set reorder
.set noreorder
.set nomacro
bgez $6,$L90
addiu $7,$7,1
.set macro
.set reorder
$L100:
li $6,20 # 0x14
beq $7,$6,$L101
$L81:
slt $2,$17,3
.set noreorder
.set nomacro
bne $2,$0,$L92
move $4,$17
.set macro
.set reorder
li $2,3 # 0x3
.set noreorder
.set nomacro
bne $19,$2,$L102
move $3,$0
.set macro
.set reorder
lw $31,112($sp)
lw $19,108($sp)
lw $18,104($sp)
lw $17,100($sp)
lw $16,96($sp)
move $2,$3
.set noreorder
.set nomacro
j $31
addiu $sp,$sp,120
.set macro
.set reorder
$L101:
.set noreorder
.set nomacro
j $L81
addiu $19,$19,1
.set macro
.set reorder
$L102:
li $2,-2147483648 # 0xffffffff80000000
ori $3,$2,0x11
lw $31,112($sp)
lw $19,108($sp)
lw $18,104($sp)
lw $17,100($sp)
lw $16,96($sp)
move $2,$3
.set noreorder
.set nomacro
j $31
addiu $sp,$sp,120
.set macro
.set reorder
.end Test11_AddSub
.align 2
.globl Test12_MulDiv
.ent Test12_MulDiv
Test12_MulDiv:
.frame $sp,48,$31 # vars= 8, regs= 5/0, args= 16, gp= 0
.mask 0x800f0000,-8
.fmask 0x00000000,0
li $4,426770432 # 0x19700000
addiu $sp,$sp,-48
ori $4,$4,0x1031
sw $19,36($sp)
sw $31,40($sp)
sw $18,32($sp)
sw $17,28($sp)
sw $16,24($sp)
.set noreorder
.set nomacro
jal srand
move $19,$0
.set macro
.set reorder
.set noreorder
.set nomacro
j $L111
li $18,1 # 0x1
.set macro
.set reorder
$L109:
beq $4,$0,$L117
$L111:
.set noreorder
.set nomacro
jal rand
addiu $18,$18,1
.set macro
.set reorder
sll $3,$2,16
sll $2,$2,8
.set noreorder
.set nomacro
jal rand
xor $16,$2,$3
.set macro
.set reorder
.set noreorder
.set nomacro
jal rand
xor $17,$2,$16
.set macro
.set reorder
sll $3,$2,16
sll $2,$2,8
.set noreorder
.set nomacro
jal rand
xor $16,$2,$3
.set macro
.set reorder
xor $16,$2,$16
addiu $4,$sp,16
move $5,$17
.set noreorder
.set nomacro
jal div
move $6,$16
.set macro
.set reorder
lw $3,16($sp)
lw $2,20($sp)
mult $3,$16
mflo $3
addu $2,$2,$3
.set noreorder
.set nomacro
beq $2,$17,$L109
slt $4,$18,1000
.set macro
.set reorder
li $2,-2147483648 # 0xffffffff80000000
ori $2,$2,0x12
$L103:
lw $31,40($sp)
lw $19,36($sp)
lw $18,32($sp)
lw $17,28($sp)
lw $16,24($sp)
.set noreorder
.set nomacro
j $31
addiu $sp,$sp,48
.set macro
.set reorder
$L117:
addiu $19,$19,1
slt $2,$19,100
.set noreorder
.set nomacro
bne $2,$0,$L111
li $18,1 # 0x1
.set macro
.set reorder
.set noreorder
.set nomacro
j $L103
move $2,$0
.set macro
.set reorder
.end Test12_MulDiv
.section .rodata.str1.4
.align 2
$LC13:
.ascii "Iteration %d: Passed\r\n\000"
.align 2
$LC14:
.ascii "Iteration \000"
.align 2
$LC15:
.ascii ": Passed\r\n\000"
.align 2
$LC16:
.ascii ":\000"
.align 2
$LC17:
.ascii "Failed with error \000"
.align 2
$LC18:
.ascii " \r\n\000"
.text
.align 2
.globl main
.ent main
main:
.frame $sp,48,$31 # vars= 8, regs= 5/0, args= 16, gp= 0
.mask 0x800f0000,-8
.fmask 0x00000000,0
li $3,-2147483648 # 0xffffffff80000000
li $2,13
ori $3,$3,0x9
addiu $sp,$sp,-48
sb $2,0($3)
sw $19,36($sp)
sw $18,32($sp)
sw $17,28($sp)
sw $31,40($sp)
.set noreorder
.set nomacro
jal PrintCPUinfo
sw $16,24($sp)
.set macro
.set reorder
li $2,1073676288 # 0x3fff0000
ori $19,$2,0xffff
li $18,-2147483648 # 0xffffffff80000000
.set noreorder
.set nomacro
j $L119
move $17,$0
.set macro
.set reorder
$L124:
jal Test11_AddSub
.set noreorder
.set nomacro
bltz $2,$L120
move $16,$2
.set macro
.set reorder
jal Test12_MulDiv
move $16,$2
la $4,$LC13
.set noreorder
.set nomacro
bltz $2,$L120
move $5,$17
.set macro
.set reorder
.set noreorder
.set nomacro
jal printf
addiu $17,$17,1
.set macro
.set reorder
la $4,$LC14
jal sputs
.set noreorder
.set nomacro
jal print_word
move $4,$17
.set macro
.set reorder
la $4,$LC15
.set noreorder
.set nomacro
jal sputs
addiu $17,$17,1
.set macro
.set reorder
.set noreorder
.set nomacro
jal time
move $4,$0
.set macro
.set reorder
addiu $4,$sp,16
.set noreorder
.set nomacro
jal gmtime
sw $2,16($sp)
.set macro
.set reorder
lb $4,8($2)
.set noreorder
.set nomacro
jal print_byte
move $16,$2
.set macro
.set reorder
la $4,$LC16
jal sputs
lb $4,4($16)
jal print_byte
la $4,$LC16
jal sputs
lb $4,0($16)
jal print_byte
la $4,$LC9
jal sputs
$L119:
and $2,$17,$19
sw $2,0($18)
jal Test10_LoadStore
.set noreorder
.set nomacro
bgez $2,$L124
move $16,$2
.set macro
.set reorder
$L120:
li $2,1073741824 # 0x40000000
or $2,$17,$2
la $4,$LC17
sw $2,0($18)
jal sputs
.set noreorder
.set nomacro
jal print_word
move $4,$16
.set macro
.set reorder
la $4,$LC18
jal sputs
lw $31,40($sp)
lw $19,36($sp)
lw $18,32($sp)
lw $17,28($sp)
lw $16,24($sp)
li $2,1 # 0x1
.set noreorder
.set nomacro
j $31
addiu $sp,$sp,48
.set macro
.set reorder
.end main
+179
View File
@@ -0,0 +1,179 @@
#include <sys/times.h>
#include <sys/time.h>
#include <sys/stat.h>
#include <stdlib.h>
char readchar(void)
{
volatile char *pUART_stat = (char*)0x80000008;
volatile char *pUART_data = (char*)0x80000004;
while(!(0x10 & *pUART_stat));
return *pUART_data;
}
void writechar(char c)
{
volatile char *pUART_stat = (char*)0x80000008;
volatile char *pUART_data = (char*)0x80000004;
while((0x02 & *pUART_stat) != 0);
*pUART_data = c;
}
clock_t times(struct tms *buffer)
{
volatile long *pReg_usec = (long*)0x80000010;
volatile long *pReg_sec = (long*)0x80000014;
long sec;
sec = *pReg_sec;
if (buffer)
{
buffer->tms_utime = sec;
buffer->tms_stime = 0;
buffer->tms_cutime = 0;
buffer->tms_cstime = 0;
}
return (clock_t)sec;
}
int gettimeofday(struct timeval *tp, void *tzp)
{
volatile long *pReg_usec = (long*)0x80000010;
volatile long *pReg_sec = (long*)0x80000014;
if (tp)
{
tp->tv_sec = *pReg_sec;
tp->tv_usec = *pReg_usec;
}
return 0;
}
int settimeofday(const struct timeval *tp, const struct timezone *tzp)
{
volatile long *pReg_usec = (long*)0x80000010;
volatile long *pReg_sec = (long*)0x80000014;
div_t res;
res = div(tp->tv_usec, 1E6);
if (tp)
{
*pReg_usec = res.rem;
*pReg_sec = tp->tv_sec + res.quot;
}
return 0;
}
caddr_t sbrk(int incr)
{
extern char end;
static char *heap_end;
char *prev_heap_end;
if (heap_end == 0)
heap_end = &end;
prev_heap_end = heap_end;
// if (heap_end + incr > stack_ptr)
// {
// _write(1, "Heap and stack collision\n", 25);
// abort();
// }
heap_end += incr;
return (caddr_t) prev_heap_end;
}
int fstat(int file, struct stat *st)
{
st->st_mode = S_IFCHR;
return 0;
}
int lseek(int file, int ptr, int dir)
{
return 0;
}
int open(const char *name, int flags, int mode)
{
return -1;
}
int close(int file)
{
return -1;
}
int read(int file, char *ptr, int len)
{
return 0;
}
int write(int file, char *ptr, int len)
{
int i;
for (i=0; i < len; i++)
writechar(*ptr++);
return i;
}
int isatty(int file)
{
return 1;
}
int sputs(char *pStr)
{
char *start;
start = pStr;
while(*pStr)
writechar(*(pStr++));
return pStr - start;
}
void print_byte(char byte)
{
int i;
unsigned char c, nibble;
for (i=0; i < 2; i++)
{
nibble = (char)((byte >> 4) & 0xF);
byte <<= 4;
if (nibble < 10)
c = nibble + '0';
else
c = nibble + 'A' - 10;
writechar(c);
}
}
void print_word(int word)
{
int i;
unsigned char c, nibble;
for (i=0; i < 4; i++)
{
c = (char) (word >> 24);
print_byte(c);
word <<= 8;
}
}
+12
View File
@@ -0,0 +1,12 @@
#ifndef UTILS_H
#define UTILS_H
char readchar(void);
void writechar(char c);
int write(int file, char *ptr, int len);
int sputs(char *pStr);
void print_byte(char byte);
void print_word(int word);
#endif // UTILS_H
+184
View File
@@ -0,0 +1,184 @@
.file 1 "utils.c"
.set nobopt
.text
.align 2
.globl sein
.ent sein
sein:
.frame $sp,0,$31 # vars= 0, regs= 0/0, args= 0, gp= 0
.mask 0x00000000,0
.fmask 0x00000000,0
li $2,-2147483648 # 0xffffffff80000000
ori $4,$2,0x4
ori $3,$2,0x8
$L2:
lbu $2,0($3)
andi $2,$2,0x10
beq $2,$0,$L2
lbu $2,0($4)
sll $2,$2,24
.set noreorder
.set nomacro
j $31
sra $2,$2,24
.set macro
.set reorder
.end sein
.align 2
.globl saus
.ent saus
saus:
.frame $sp,0,$31 # vars= 0, regs= 0/0, args= 0, gp= 0
.mask 0x00000000,0
.fmask 0x00000000,0
li $2,-2147483648 # 0xffffffff80000000
sll $4,$4,24
sra $4,$4,24
ori $5,$2,0x4
ori $3,$2,0x8
$L6:
lbu $2,0($3)
andi $2,$2,0x2
bne $2,$0,$L6
sb $4,0($5)
j $31
.end saus
.align 2
.globl sputs
.ent sputs
sputs:
.frame $sp,32,$31 # vars= 0, regs= 3/0, args= 16, gp= 0
.mask 0x80030000,-8
.fmask 0x00000000,0
addiu $sp,$sp,-32
sw $17,20($sp)
sw $16,16($sp)
sw $31,24($sp)
move $16,$4
lb $4,0($4)
.set noreorder
.set nomacro
j $L14
move $17,$16
.set macro
.set reorder
$L15:
.set noreorder
.set nomacro
jal saus
addiu $16,$16,1
.set macro
.set reorder
lb $4,0($16)
$L14:
.set noreorder
.set nomacro
bne $4,$0,$L15
subu $2,$16,$17
.set macro
.set reorder
lw $31,24($sp)
lw $17,20($sp)
lw $16,16($sp)
.set noreorder
.set nomacro
j $31
addiu $sp,$sp,32
.set macro
.set reorder
.end sputs
.align 2
.globl print_byte
.ent print_byte
print_byte:
.frame $sp,32,$31 # vars= 0, regs= 3/0, args= 16, gp= 0
.mask 0x80030000,-8
.fmask 0x00000000,0
addiu $sp,$sp,-32
sw $16,16($sp)
sll $16,$4,24
sw $17,20($sp)
sw $31,24($sp)
sra $16,$16,24
li $17,1 # 0x1
sra $2,$16,4
$L25:
andi $5,$2,0xf
sll $2,$16,4
sll $16,$2,24
sltu $3,$5,10
addiu $17,$17,-1
sra $16,$16,24
.set noreorder
.set nomacro
bne $3,$0,$L21
addiu $4,$5,48
.set macro
.set reorder
addiu $4,$5,55
$L21:
jal saus
.set noreorder
.set nomacro
bgez $17,$L25
sra $2,$16,4
.set macro
.set reorder
lw $31,24($sp)
lw $17,20($sp)
lw $16,16($sp)
.set noreorder
.set nomacro
j $31
addiu $sp,$sp,32
.set macro
.set reorder
.end print_byte
.align 2
.globl print_word
.ent print_word
print_word:
.frame $sp,32,$31 # vars= 0, regs= 3/0, args= 16, gp= 0
.mask 0x80030000,-8
.fmask 0x00000000,0
addiu $sp,$sp,-32
sw $17,20($sp)
sw $16,16($sp)
sw $31,24($sp)
move $16,$4
li $17,3 # 0x3
$L30:
sra $4,$16,24
.set noreorder
.set nomacro
jal print_byte
addiu $17,$17,-1
.set macro
.set reorder
.set noreorder
.set nomacro
bgez $17,$L30
sll $16,$16,8
.set macro
.set reorder
lw $31,24($sp)
lw $17,20($sp)
lw $16,16($sp)
.set noreorder
.set nomacro
j $31
addiu $sp,$sp,32
.set macro
.set reorder
.end print_word