244 lines
		
	
	
		
			5.2 KiB
		
	
	
	
		
			ArmAsm
		
	
	
	
			
		
		
	
	
			244 lines
		
	
	
		
			5.2 KiB
		
	
	
	
		
			ArmAsm
		
	
	
	
#include "macros.inc"
 | 
						|
 | 
						|
test_suite mac16
 | 
						|
 | 
						|
#define ext16(v) (((v) & 0xffff) | (((v) & 0x8000) * 0x1ffffffe))
 | 
						|
#define mul16(a, b) ((ext16(a) * ext16(b)))
 | 
						|
 | 
						|
.macro assert_acc_value v
 | 
						|
    rsr     a4, ACCLO
 | 
						|
    movi    a5, (\v) & 0xffffffff
 | 
						|
    assert  eq, a4, a5
 | 
						|
    rsr     a4, ACCHI
 | 
						|
    movi    a5, (\v) >> 32
 | 
						|
    sext    a5, a5, 7
 | 
						|
    assert  eq, a4, a5
 | 
						|
.endm
 | 
						|
 | 
						|
.macro init_reg sr, reg, val
 | 
						|
    .if (\sr)
 | 
						|
    movi    a4, \val
 | 
						|
    wsr     a4, \reg
 | 
						|
    .else
 | 
						|
    movi    \reg, \val
 | 
						|
    .endif
 | 
						|
.endm
 | 
						|
 | 
						|
.macro test_mulxx mulop, comb, s, t, a, b
 | 
						|
    init_reg \comb & 2, \s, \a
 | 
						|
    init_reg \comb & 1, \t, \b
 | 
						|
 | 
						|
    \mulop\().ll \s, \t
 | 
						|
    assert_acc_value mul16(\a, \b)
 | 
						|
 | 
						|
    \mulop\().lh \s, \t
 | 
						|
    assert_acc_value mul16(\a, (\b >> 16))
 | 
						|
 | 
						|
    \mulop\().hl \s, \t
 | 
						|
    assert_acc_value mul16((\a >> 16), \b)
 | 
						|
 | 
						|
    \mulop\().hh \s, \t
 | 
						|
    assert_acc_value mul16((\a >> 16), (\b >> 16))
 | 
						|
.endm
 | 
						|
 | 
						|
test mul_aa
 | 
						|
    test_mulxx mul.aa, 0, a2, a3, 0xf7315a5a, 0xa5a5137f
 | 
						|
test_end
 | 
						|
 | 
						|
test mul_ad
 | 
						|
    test_mulxx mul.ad, 1, a2, m2, 0xf7315a5a, 0xa5a5137f
 | 
						|
test_end
 | 
						|
 | 
						|
test mul_da
 | 
						|
    test_mulxx mul.da, 2, m1, a3, 0xf7315a5a, 0xa5a5137f
 | 
						|
test_end
 | 
						|
 | 
						|
test mul_dd
 | 
						|
    test_mulxx mul.dd, 3, m0, m3, 0xf7315a5a, 0xa5a5137f
 | 
						|
test_end
 | 
						|
 | 
						|
 | 
						|
.macro init_acc iv
 | 
						|
    movi    a4, (\iv) & 0xffffffff
 | 
						|
    wsr     a4, ACCLO
 | 
						|
    movi    a4, (\iv) >> 32
 | 
						|
    wsr     a4, ACCHI
 | 
						|
.endm
 | 
						|
 | 
						|
.macro test_mulxxx mulop, comb, s, t, a, b, iv, op
 | 
						|
    init_reg \comb & 2, \s, \a
 | 
						|
    init_reg \comb & 1, \t, \b
 | 
						|
 | 
						|
    init_acc \iv
 | 
						|
    \mulop\().ll \s, \t
 | 
						|
    assert_acc_value (\iv \op mul16(\a, \b))
 | 
						|
 | 
						|
    init_acc \iv
 | 
						|
    \mulop\().lh \s, \t
 | 
						|
    assert_acc_value (\iv \op mul16(\a, (\b >> 16)))
 | 
						|
 | 
						|
    init_acc \iv
 | 
						|
    \mulop\().hl \s, \t
 | 
						|
    assert_acc_value (\iv \op mul16((\a >> 16), \b))
 | 
						|
 | 
						|
    init_acc \iv
 | 
						|
    \mulop\().hh \s, \t
 | 
						|
    assert_acc_value (\iv \op mul16((\a >> 16), (\b >> 16)))
 | 
						|
.endm
 | 
						|
 | 
						|
 | 
						|
test mula_aa
 | 
						|
    test_mulxxx mula.aa, 0, a2, a3, 0xf7315a5a, 0xa5a5137f, 0xfff73155aa, +
 | 
						|
test_end
 | 
						|
 | 
						|
test mula_ad
 | 
						|
    test_mulxxx mula.ad, 1, a2, m2, 0xf7315a5a, 0xa5a5137f, 0xfff73155aa, +
 | 
						|
test_end
 | 
						|
 | 
						|
test mula_da
 | 
						|
    test_mulxxx mula.da, 2, m1, a3, 0xf7315a5a, 0xa5a5137f, 0x0ff73155aa, +
 | 
						|
test_end
 | 
						|
 | 
						|
test mula_dd
 | 
						|
    test_mulxxx mula.dd, 3, m0, m3, 0xf7315a5a, 0xa5a5137f, 0x0ff73155aa, +
 | 
						|
test_end
 | 
						|
 | 
						|
 | 
						|
test muls_aa
 | 
						|
    test_mulxxx muls.aa, 0, a2, a3, 0xf7315a5a, 0xa5a5137f, 0x0ff73155aa, -
 | 
						|
test_end
 | 
						|
 | 
						|
test muls_ad
 | 
						|
    test_mulxxx muls.ad, 1, a2, m2, 0xf7315a5a, 0xa5a5137f, 0x0ff73155aa, -
 | 
						|
test_end
 | 
						|
 | 
						|
test muls_da
 | 
						|
    test_mulxxx muls.da, 2, m1, a3, 0xf7315a5a, 0xa5a5137f, 0xfff73155aa, -
 | 
						|
test_end
 | 
						|
 | 
						|
test muls_dd
 | 
						|
    test_mulxxx muls.dd, 3, m0, m3, 0xf7315a5a, 0xa5a5137f, 0xfff73155aa, -
 | 
						|
test_end
 | 
						|
 | 
						|
test ldinc
 | 
						|
    movi    a2, 1f - 4
 | 
						|
    ldinc   m0, a2
 | 
						|
    movi    a3, 1f
 | 
						|
    assert  eq, a2, a3
 | 
						|
    rsr     a3, m0
 | 
						|
    movi    a4, 0x55aa137f
 | 
						|
    assert  eq, a3, a4
 | 
						|
    ldinc   m1, a2
 | 
						|
    movi    a3, 1f + 4
 | 
						|
    assert  eq, a2, a3
 | 
						|
    rsr     a3, m1
 | 
						|
    movi    a4, 0x12345678
 | 
						|
    assert  eq, a3, a4
 | 
						|
 | 
						|
.data
 | 
						|
1:  .word 0x55aa137f, 0x12345678, 0x137fa5a5
 | 
						|
.text
 | 
						|
test_end
 | 
						|
 | 
						|
test lddec
 | 
						|
    movi    a2, 1f
 | 
						|
    lddec   m2, a2
 | 
						|
    movi    a3, 1f - 4
 | 
						|
    assert  eq, a2, a3
 | 
						|
    rsr     a3, m2
 | 
						|
    movi    a4, 0x12345678
 | 
						|
    assert  eq, a3, a4
 | 
						|
    lddec   m3, a2
 | 
						|
    movi    a3, 1f - 8
 | 
						|
    assert  eq, a2, a3
 | 
						|
    rsr     a3, m3
 | 
						|
    movi    a4, 0x55aa137f
 | 
						|
    assert  eq, a3, a4
 | 
						|
.data
 | 
						|
    .word 0x55aa137f, 0x12345678
 | 
						|
1:
 | 
						|
.text
 | 
						|
test_end
 | 
						|
 | 
						|
 | 
						|
.macro test_mulxxx_ld mulop, ldop, comb, w, x, s, t, a, b, iv, op
 | 
						|
    init_reg \comb & 2, \s, \a
 | 
						|
    init_reg \comb & 1, \t, \b
 | 
						|
 | 
						|
    init_acc \iv
 | 
						|
    \mulop\().ll.\ldop \w, \x, \s, \t
 | 
						|
    assert_acc_value (\iv \op mul16(\a, \b))
 | 
						|
 | 
						|
    init_acc \iv
 | 
						|
    \mulop\().lh.\ldop \w, \x, \s, \t
 | 
						|
    assert_acc_value (\iv \op mul16(\a, (\b >> 16)))
 | 
						|
 | 
						|
    init_acc \iv
 | 
						|
    \mulop\().hl.\ldop \w, \x, \s, \t
 | 
						|
    assert_acc_value (\iv \op mul16((\a >> 16), \b))
 | 
						|
 | 
						|
    init_acc \iv
 | 
						|
    \mulop\().hh.\ldop \w, \x, \s, \t
 | 
						|
    assert_acc_value (\iv \op mul16((\a >> 16), (\b >> 16)))
 | 
						|
.endm
 | 
						|
 | 
						|
test mula_da_ldinc
 | 
						|
    movi    a2, 1f - 4
 | 
						|
    test_mulxxx_ld mula.da, ldinc, 2, m1, a2, m1, a3, \
 | 
						|
        0xf7315a5a, 0xa5a5137f, 0x0ff73155aa, +
 | 
						|
    movi    a3, 1f + 12
 | 
						|
    assert  eq, a2, a3
 | 
						|
    rsr     a2, m1
 | 
						|
    movi    a3, 0x12345678
 | 
						|
    assert  eq, a2, a3
 | 
						|
.data
 | 
						|
1:  .word 0xf7315a5a, 0xf7315a5a, 0xf7315a5a, 0x12345678
 | 
						|
.text
 | 
						|
test_end
 | 
						|
 | 
						|
test mula_dd_ldinc
 | 
						|
    movi    a2, 1f - 4
 | 
						|
    test_mulxxx_ld mula.dd, ldinc, 3, m2, a2, m1, m2, \
 | 
						|
        0xf7315a5a, 0xa5a5137f, 0x0ff73155aa, +
 | 
						|
    movi    a3, 1f + 12
 | 
						|
    assert  eq, a2, a3
 | 
						|
    rsr     a2, m2
 | 
						|
    movi    a3, 0x12345678
 | 
						|
    assert  eq, a2, a3
 | 
						|
.data
 | 
						|
1:  .word 0xa5a5137f, 0xa5a5137f, 0xa5a5137f, 0x12345678
 | 
						|
.text
 | 
						|
test_end
 | 
						|
 | 
						|
test mula_da_lddec
 | 
						|
    movi    a2, 1f
 | 
						|
    test_mulxxx_ld mula.da, lddec, 2, m1, a2, m1, a3, \
 | 
						|
        0xf7315a5a, 0xa5a5137f, 0x0ff73155aa, +
 | 
						|
    movi    a3, 1f - 16
 | 
						|
    assert  eq, a2, a3
 | 
						|
    rsr     a2, m1
 | 
						|
    movi    a3, 0x12345678
 | 
						|
    assert  eq, a2, a3
 | 
						|
.data
 | 
						|
    .word 0x12345678, 0xf7315a5a, 0xf7315a5a, 0xf7315a5a
 | 
						|
1:
 | 
						|
.text
 | 
						|
test_end
 | 
						|
 | 
						|
test mula_dd_lddec
 | 
						|
    movi    a2, 1f
 | 
						|
    test_mulxxx_ld mula.dd, lddec, 3, m2, a2, m1, m2, \
 | 
						|
        0xf7315a5a, 0xa5a5137f, 0x0ff73155aa, +
 | 
						|
    movi    a3, 1f - 16
 | 
						|
    assert  eq, a2, a3
 | 
						|
    rsr     a2, m2
 | 
						|
    movi    a3, 0x12345678
 | 
						|
    assert  eq, a2, a3
 | 
						|
.data
 | 
						|
    .word 0x12345678, 0xa5a5137f, 0xa5a5137f, 0xa5a5137f
 | 
						|
1:
 | 
						|
.text
 | 
						|
test_end
 | 
						|
 | 
						|
test_suite_end
 |