SYS_exit = 1
SYS_write = 4

	.bss
	.space 64
_stack:

	.data
pass_text:
	.string "pass\n"
fail_text:
	.string "fail\n"

	.text
	.global	_start
_start:
	movhi   hi(_stack),	r0,	sp
	movea   lo(_stack),	sp,	sp
	jr	start_test

	.macro	seti	val reg
	movhi	hi(\val),r0,\reg
	movea	lo(\val),\reg,\reg
	.endm

_pass_1:
	mov	SYS_write,r6
	mov	1,r7
	seti	pass_text,r8
	mov	5,r9
	trap	31

	mov	0, r7
	jr	_exit

_fail_1:
	mov	SYS_write,r6
	mov	1,r7
	seti	fail_text,r8
	mov	5,r9
	trap	31

	mov	1, r7
	jr	_exit

_exit:
	mov	SYS_exit, r6
	mov	0, r8
	mov	0, r9
	trap	31

_pass:
	jr	_pass_1

_fail:
	jr	_fail_1

	.macro	pass
	jr	_pass
	.endm
	.macro	fail
	jr	_fail
	.endm

	# These pass or fail if the given flag is set or not set
	# Currently, it assumed that the code of any test is going to
	# be less than 256 bytes.  Else, we'll have to use a
	# branch-around-jump design instead.

	.macro	pass_c
	bc	_pass
	.endm
	.macro	fail_c
	bc	_fail
	.endm
	.macro	pass_nc
	bnc	_pass
	.endm
	.macro	fail_nc
	bnc	_fail
	.endm

	.macro	pass_z
	bz	_pass
	.endm
	.macro	fail_z
	bz	_fail
	.endm
	.macro	pass_nz
	bnz	_pass
	.endm
	.macro	fail_nz
	bnz	_fail
	.endm

	.macro	pass_v
	bv	_pass
	.endm
	.macro	fail_v
	bv	_fail
	.endm
	.macro	pass_nv
	bnv	_pass
	.endm
	.macro	fail_nv
	bnv	_fail
	.endm

	.macro	pass_s
	bn	_pass
	.endm
	.macro	fail_s
	bn	_fail
	.endm
	.macro	pass_ns
	bp	_pass
	.endm
	.macro	fail_ns
	bp	_fail
	.endm

	.macro	pass_sat
	bsa	_pass
	.endm
	.macro	fail_sat
	bsa	_fail
	.endm
	.macro	pass_nsat
	bsa	1f
	br	_pass
1:
	.endm
	.macro	fail_nsat
	bsa	1f
	br	_fail
1:
	.endm

	# These pass/fail if the given register has/hasn't the specified value in it.

	.macro	pass_req	reg val
	seti	\val,r10
	cmp	r10,\reg
	be	_pass
	.endm

	.macro	pass_rne	reg val
	seti	\val,r10
	cmp	r10,\reg
	bne	_pass
	.endm

	.macro	fail_req	reg val
	seti	\val,r10
	cmp	r10,\reg
	be	_fail
	.endm

	.macro	fail_rne	reg val
	seti	\val,r10
	cmp	r10,\reg
	bne	_fail
	.endm

# convenience version
	.macro	reg	reg val
	seti	\val,r10
	cmp	r10,\reg
	bne	_fail
	.endm

z    = 1
nz   = 0
s    = 2
ns   = 0
v    = 4
nv   = 0
c    = 8
nc   = 0
sat  = 16
nsat = 0

# sat c v s z

	.macro	flags	fval
	stsr	psw, r10
	movea	+(\fval), r0, r9
	andi	31, r10, r10
	cmp	r9, r10
	bne	_fail
	.endm

	.macro	noflags
	stsr	psw, r10
	andi	~0x1f, r10, r10
	ldsr	r10, psw
	.endm

	.macro	allflags
	stsr	psw, r10
	ori	0x1f, r10, r10
	ldsr	r10, psw
	.endm

start_test: