forked from mirror/qemu
You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
248 lines
5.2 KiB
ArmAsm
248 lines
5.2 KiB
ArmAsm
#include "macros.inc"
|
|
|
|
test_suite mac16
|
|
|
|
#if XCHAL_HAVE_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
|
|
|
|
#endif
|
|
|
|
test_suite_end
|