Space for test results may be allocated in IRAM which is only word-accessible. Use full 32-bit words to access test results. Signed-off-by: Max Filippov <jcmvbkbc@gmail.com>
		
			
				
	
	
		
			123 lines
		
	
	
		
			1.7 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			123 lines
		
	
	
		
			1.7 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
#include "core-isa.h"
 | 
						|
 | 
						|
.macro test_suite name
 | 
						|
.data
 | 
						|
status: .word result
 | 
						|
result: .space 1024
 | 
						|
.text
 | 
						|
.global main
 | 
						|
.align 4
 | 
						|
main:
 | 
						|
.endm
 | 
						|
 | 
						|
.macro reset_ps
 | 
						|
    movi    a2, 0x4000f
 | 
						|
    wsr     a2, ps
 | 
						|
    isync
 | 
						|
.endm
 | 
						|
 | 
						|
.macro test_suite_end
 | 
						|
    reset_ps
 | 
						|
    movi    a0, status
 | 
						|
    l32i    a2, a0, 0
 | 
						|
    movi    a0, result
 | 
						|
    sub     a2, a2, a0
 | 
						|
    movi    a3, 0
 | 
						|
    beqz    a2, 2f
 | 
						|
1:
 | 
						|
    l32i    a1, a0, 0
 | 
						|
    or      a3, a3, a1
 | 
						|
    addi    a0, a0, 4
 | 
						|
    addi    a2, a2, -1
 | 
						|
    bnez    a2, 1b
 | 
						|
2:
 | 
						|
    exit
 | 
						|
.endm
 | 
						|
 | 
						|
.macro print text
 | 
						|
.data
 | 
						|
97: .ascii "\text\n"
 | 
						|
98:
 | 
						|
    .align 4
 | 
						|
.text
 | 
						|
    movi    a2, 4
 | 
						|
    movi    a3, 2
 | 
						|
    movi    a4, 97b
 | 
						|
    movi    a5, 98b
 | 
						|
    sub     a5, a5, a4
 | 
						|
    simcall
 | 
						|
.endm
 | 
						|
 | 
						|
.macro test_init
 | 
						|
.endm
 | 
						|
 | 
						|
.macro test name
 | 
						|
#ifdef DEBUG
 | 
						|
    print test_\name
 | 
						|
#endif
 | 
						|
    test_init
 | 
						|
test_\name:
 | 
						|
.global test_\name
 | 
						|
.endm
 | 
						|
 | 
						|
.macro test_end
 | 
						|
99:
 | 
						|
    reset_ps
 | 
						|
    movi    a2, status
 | 
						|
    l32i    a3, a2, 0
 | 
						|
    addi    a3, a3, 4
 | 
						|
    s32i    a3, a2, 0
 | 
						|
.endm
 | 
						|
 | 
						|
.macro exit
 | 
						|
    movi    a2, 1
 | 
						|
    simcall
 | 
						|
.endm
 | 
						|
 | 
						|
.macro test_fail
 | 
						|
    movi    a2, status
 | 
						|
    l32i    a2, a2, 0
 | 
						|
    movi    a3, 1
 | 
						|
    s32i    a3, a2, 0
 | 
						|
#ifdef DEBUG
 | 
						|
    print   failed
 | 
						|
#endif
 | 
						|
    j       99f
 | 
						|
.endm
 | 
						|
 | 
						|
.macro assert cond, arg1, arg2
 | 
						|
    b\cond  \arg1, \arg2, 90f
 | 
						|
    test_fail
 | 
						|
90:
 | 
						|
    nop
 | 
						|
.endm
 | 
						|
 | 
						|
.macro set_vector vector, addr
 | 
						|
    movi    a2, handler_\vector
 | 
						|
    movi    a3, \addr
 | 
						|
    s32i    a3, a2, 0
 | 
						|
.endm
 | 
						|
 | 
						|
.macro dump r
 | 
						|
#ifdef DEBUG
 | 
						|
.data
 | 
						|
.align 4
 | 
						|
1: .word 0
 | 
						|
.text
 | 
						|
    movi    a4, 1b
 | 
						|
    s32i    a2, a4, 0
 | 
						|
    movi    a2, 4
 | 
						|
    movi    a3, 1
 | 
						|
    movi    a5, 4
 | 
						|
    simcall
 | 
						|
    movi    a4, 1b
 | 
						|
    l32i    a2, a4, 0
 | 
						|
#endif
 | 
						|
.endm
 | 
						|
 | 
						|
#define glue(a, b) _glue(a, b)
 | 
						|
#define _glue(a, b) a ## b
 | 
						|
 | 
						|
#define glue3(a, b, c) _glue3(a, b, c)
 | 
						|
#define _glue3(a, b, c) a ## b ## c
 |