#
/*
 * VideoCore IV assembler test file
 * © 2013 David Given
 * This file is redistributable under the terms of the 3-clause BSD license.
 * See the file 'Copying' in the root of the distribution for the full text.
 */

.sect .text
.sect .rom
.sect .data
.sect .bss
.sect .text

main:
	nop
	rti

	b r0
	b r31
	bl r0
	bl r31
	tbb r0
	tbb r15
	tbs r0
	tbs r15

	nop

	mov r0, r1
    cmn r0, r1
    add r0, r1
	bic r0, r1
	mul r0, r1
	eor r0, r1
	sub r0, r1
	and r0, r1
	mvn r0, r1
	ror r0, r1
	cmp r0, r1
	rsb r0, r1
	btst r0, r1
	or r0, r1
	extu r0, r1
	max r0, r1
	bset r0, r1
	min r0, r1
	bclr r0, r1
	adds2 r0, r1
	bchg r0, r1
	adds4 r0, r1
	adds8 r0, r1
	adds16 r0, r1
	exts r0, r1
	neg r0, r1
	lsr r0, r1
	clz r0, r1
	lsl r0, r1
	brev r0, r1
	asr r0, r1
	abs r0, r1

	nop

	mov.f r0, r1
    cmn.f r0, r1
    add.f r0, r1
	bic.f r0, r1
	mul.f r0, r1
	eor.f r0, r1
	sub.f r0, r1
	and.f r0, r1
	mvn.f r0, r1
	ror.f r0, r1
	cmp.f r0, r1
	rsb.f r0, r1
	btst.f r0, r1
	or.f r0, r1
	extu.f r0, r1
	max.f r0, r1
	bset.f r0, r1
	min.f r0, r1
	bclr.f r0, r1
	adds2.f r0, r1
	bchg.f r0, r1
	adds4.f r0, r1
	adds8.f r0, r1
	adds16.f r0, r1
	exts.f r0, r1
	neg.f r0, r1
	lsr.f r0, r1
	clz.f r0, r1
	lsl.f r0, r1
	brev.f r0, r1
	asr.f r0, r1
	abs.f r0, r1

	nop

	mov r0, r1, r2
    cmn r0, r1, r2
    add r0, r1, r2
	bic r0, r1, r2
	mul r0, r1, r2
	eor r0, r1, r2
	sub r0, r1, r2
	and r0, r1, r2
	mvn r0, r1, r2
	ror r0, r1, r2
	cmp r0, r1, r2
	rsb r0, r1, r2
	btst r0, r1, r2
	or r0, r1, r2
	extu r0, r1, r2
	max r0, r1, r2
	bset r0, r1, r2
	min r0, r1, r2
	bclr r0, r1, r2
	adds2 r0, r1, r2
	bchg r0, r1, r2
	adds4 r0, r1, r2
	adds8 r0, r1, r2
	adds16 r0, r1, r2
	exts r0, r1, r2
	neg r0, r1, r2
	lsr r0, r1, r2
	clz r0, r1, r2
	lsl r0, r1, r2
	brev r0, r1, r2
	asr r0, r1, r2
	abs r0, r1, r2

	nop

	mov r0, #0x1f
    cmn r0, #0x1f
    add r0, #0x1f
	bic r0, #0x1f
	mul r0, #0x1f
	eor r0, #0x1f
	sub r0, #0x1f
	and r0, #0x1f
	mvn r0, #0x1f
	ror r0, #0x1f
	cmp r0, #0x1f
	rsb r0, #0x1f
	btst r0, #0x1f
	or r0, #0x1f
	extu r0, #0x1f
	max r0, #0x1f
	bset r0, #0x1f
	min r0, #0x1f
	bclr r0, #0x1f
	adds2 r0, #0x1f
	bchg r0, #0x1f
	adds4 r0, #0x1f
	adds8 r0, #0x1f
	adds16 r0, #0x1f
	exts r0, #0x1f
	neg r0, #0x1f
	lsr r0, #0x1f
	clz r0, #0x1f
	lsl r0, #0x1f
	brev r0, #0x1f
	asr r0, #0x1f
	abs r0, #0x1f

	nop

	mov.f r0, #0x1f
    cmn.f r0, #0x1f
    add.f r0, #0x1f
	bic.f r0, #0x1f
	mul.f r0, #0x1f
	eor.f r0, #0x1f
	sub.f r0, #0x1f
	and.f r0, #0x1f
	mvn.f r0, #0x1f
	ror.f r0, #0x1f
	cmp.f r0, #0x1f
	rsb.f r0, #0x1f
	btst.f r0, #0x1f
	or.f r0, #0x1f
	extu.f r0, #0x1f
	max.f r0, #0x1f
	bset.f r0, #0x1f
	min.f r0, #0x1f
	bclr.f r0, #0x1f
	adds2.f r0, #0x1f
	bchg.f r0, #0x1f
	adds4.f r0, #0x1f
	adds8.f r0, #0x1f
	adds16.f r0, #0x1f
	exts.f r0, #0x1f
	neg.f r0, #0x1f
	lsr.f r0, #0x1f
	clz.f r0, #0x1f
	lsl.f r0, #0x1f
	brev.f r0, #0x1f
	asr.f r0, #0x1f
	abs.f r0, #0x1f

	add r0, #0x12345678
	add r0, r1, #0x12345678
	sub r0, #0x12345678

	nop

	fadd r0, r1, r2
	fsub r0, r1, r2
	fmul r0, r1, r2
	fdiv r0, r1, r2
	fcmp r0, r1, r2
	fabs r0, r1, r2
	frsb r0, r1, r2
	fmax r0, r1, r2
	frcp r0, r1, r2
	frsqrt r0, r1, r2
	fnmul r0, r1, r2
	fmin r0, r1, r2
	fld1 r0, r1, r2
	fld0 r0, r1, r2
	log2 r0, r1, r2
	exp2 r0, r1, r2
	divs r0, r1, r2
	divu r0, r1, r2
	divs r0, r1, #31
	divu r0, r1, #31
	adds256 r0, r1, r2

	nop

	fadd.f r0, r1, r2
	fsub.f r0, r1, r2
	fmul.f r0, r1, r2
	fdiv.f r0, r1, r2
	fcmp.f r0, r1, r2
	fabs.f r0, r1, r2
	frsb.f r0, r1, r2
	fmax.f r0, r1, r2
	frcp.f r0, r1, r2
	frsqrt.f r0, r1, r2
	fnmul.f r0, r1, r2
	fmin.f r0, r1, r2
	fld1.f r0, r1, r2
	fld0.f r0, r1, r2
	log2.f r0, r1, r2
	exp2.f r0, r1, r2
	divs.f r0, r1, r2
	divu.f r0, r1, r2
	divs.f r0, r1, #31
	divu.f r0, r1, #31
	adds256.f r0, r1, r2

label:
	b label
	b forward
	b label
	b main
	b.f label
	b.f forward
	b.f main
	bl label
	bl forward
	bl main
forward:

	push r0
	push r0, lr
	push r0-r5
	push r0-r5, lr
	push r6
	push r16
	push r24
	push lr

	pop r0
	pop r0, pc
	pop r0-r5
	pop r0-r5, pc
	pop r6
	pop r16
	pop r24
	pop pc

	nop

    ld r0, (sp)
    st r0, (sp)
    ld r0, 4(sp)
    st r0, 4(sp)
    ld r0, -4(sp)
    st r0, -4(sp)
    ld r0, 5(sp)
    st r0, 5(sp)
    ld r0, -5(sp)
    st r0, -5(sp)

    ld r0, (r1)
    st r0, (r1)
    ld r16, (r1)
    st r16, (r1)
    ldh r0, (r1)
    sth r0, (r1)
    ldb r0, (r1)
    stb r0, (r1)
    ldhs r0, (r1)
    sths r0, (r1)
    ldh r16, (r1)
    sth r16, (r1)
    ldb r16, (r1)
    stb r16, (r1)
    ldhs r16, (r1)
    sths r16, (r1)
    ld r0, 0x3c (r1)
    st r0, 0x3c (r1)
    ld r0, 0xfff (r1)
    st r0, 0xfff (r1)
    ld r1, 0xffff (r0)
    st r1, 0xffff (r0)
    ld r0, -1 (r1)
    st r0, -1 (r1)
    ld r16, 0x3c (r1)
    st r16, 0x3c (r1)
    ld r16, 0xfff (r1)
    st r16, 0xfff (r1)
    ld r16, 0xffff (r0)
    st r16, 0xffff (r0)
    ld r16, -1 (r1)
    st r16, -1 (r1)

	ld.f r0, (r1)
	st.f r0, (r1)
	ld.f r0, 8 (r1)
	st.f r0, 8 (r1)

	ld r0, (r1, r2)
	st r0, (r1, r2)
	ld.f r0, (pc, pc)
	st.f r0, (pc, pc)

near:
	ld r0, (r1)++
	st r0, (r1)++
	ld.f pc, (pc)++
	st.f pc, (pc)++

	ld r0, near
	ld r0, main
	st r0, near
	st r0, main
	ldb r0, near
	ldb r0, main
	stb r0, near
	stb r0, main

	b.eq r0, r1, near
	b r0, r1, near
	addcmpb r0, r1, r2, .
	addcmpb r0, #1, r2, .
	addcmpb r0, r1, #1, .
	addcmpb r0, #1, #2, .