| #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 |