| #include "macros.inc" |
| |
| test_suite load_store |
| |
| .macro load_ok_test op, type, data, value |
| .data |
| .align 4 |
| 1: |
| \type \data |
| .previous |
| |
| reset_ps |
| set_vector kernel, 0 |
| movi a3, 1b |
| addi a4, a4, 1 |
| mov a5, a4 |
| \op a5, a3, 0 |
| movi a6, \value |
| assert eq, a5, a6 |
| .endm |
| |
| #if XCHAL_UNALIGNED_LOAD_EXCEPTION |
| .macro load_unaligned_test will_trap, op, type, data, value |
| .data |
| .align 4 |
| .byte 0 |
| 1: |
| \type \data |
| .previous |
| |
| reset_ps |
| .ifeq \will_trap |
| set_vector kernel, 0 |
| .else |
| set_vector kernel, 2f |
| .endif |
| movi a3, 1b |
| addi a4, a4, 1 |
| mov a5, a4 |
| 1: |
| \op a5, a3, 0 |
| .ifeq \will_trap |
| movi a6, \value |
| assert eq, a5, a6 |
| .else |
| test_fail |
| 2: |
| rsr a6, exccause |
| movi a7, 9 |
| assert eq, a6, a7 |
| rsr a6, epc1 |
| movi a7, 1b |
| assert eq, a6, a7 |
| rsr a6, excvaddr |
| assert eq, a6, a3 |
| assert eq, a5, a4 |
| .endif |
| reset_ps |
| .endm |
| #else |
| .macro load_unaligned_test will_trap, op, type, data, value |
| .data |
| .align 4 |
| 1: |
| \type \data |
| .previous |
| |
| reset_ps |
| set_vector kernel, 0 |
| movi a3, 1b + 1 |
| addi a4, a4, 1 |
| mov a5, a4 |
| \op a5, a3, 0 |
| movi a6, \value |
| assert eq, a5, a6 |
| .endm |
| #endif |
| |
| .macro store_ok_test op, type, value |
| .data |
| .align 4 |
| .byte 0, 0, 0, 0x55 |
| 1: |
| \type 0 |
| 2: |
| .byte 0xaa |
| .previous |
| |
| reset_ps |
| set_vector kernel, 0 |
| movi a3, 1b |
| movi a5, \value |
| \op a5, a3, 0 |
| movi a3, 2b |
| l8ui a5, a3, 0 |
| movi a6, 0xaa |
| assert eq, a5, a6 |
| movi a3, 1b - 1 |
| l8ui a5, a3, 0 |
| movi a6, 0x55 |
| assert eq, a5, a6 |
| .endm |
| |
| #if XCHAL_UNALIGNED_STORE_EXCEPTION |
| .macro store_unaligned_test will_trap, op, nop, type, value |
| .data |
| .align 4 |
| .byte 0x55 |
| 1: |
| \type 0 |
| 2: |
| .byte 0xaa |
| .previous |
| |
| reset_ps |
| .ifeq \will_trap |
| set_vector kernel, 0 |
| .else |
| set_vector kernel, 4f |
| .endif |
| movi a3, 1b |
| movi a5, \value |
| 3: |
| \op a5, a3, 0 |
| .ifne \will_trap |
| test_fail |
| 4: |
| rsr a6, exccause |
| movi a7, 9 |
| assert eq, a6, a7 |
| rsr a6, epc1 |
| movi a7, 3b |
| assert eq, a6, a7 |
| rsr a6, excvaddr |
| assert eq, a6, a3 |
| l8ui a5, a3, 0 |
| assert eqi, a5, 0 |
| .endif |
| reset_ps |
| movi a3, 2b |
| l8ui a5, a3, 0 |
| movi a6, 0xaa |
| assert eq, a5, a6 |
| movi a3, 1b - 1 |
| l8ui a5, a3, 0 |
| movi a6, 0x55 |
| assert eq, a5, a6 |
| .endm |
| #else |
| .macro store_unaligned_test will_trap, sop, lop, type, value |
| .data |
| .align 4 |
| .byte 0x55 |
| 1: |
| \type 0 |
| .previous |
| |
| reset_ps |
| set_vector kernel, 0 |
| movi a3, 1b |
| movi a5, \value |
| \sop a5, a3, 0 |
| movi a3, 1b - 1 |
| \lop a6, a3, 0 |
| assert eq, a5, a6 |
| .endm |
| #endif |
| |
| test load_ok |
| load_ok_test l16si, .short, 0x00001234, 0x00001234 |
| load_ok_test l16si, .short, 0x000089ab, 0xffff89ab |
| load_ok_test l16ui, .short, 0x00001234, 0x00001234 |
| load_ok_test l16ui, .short, 0x000089ab, 0x000089ab |
| load_ok_test l32i, .word, 0x12345678, 0x12345678 |
| #if XCHAL_HAVE_RELEASE_SYNC |
| load_ok_test l32ai, .word, 0x12345678, 0x12345678 |
| #endif |
| test_end |
| |
| #undef WILL_TRAP |
| #if XCHAL_UNALIGNED_LOAD_HW |
| #define WILL_TRAP 0 |
| #else |
| #define WILL_TRAP 1 |
| #endif |
| |
| test load_unaligned |
| load_unaligned_test WILL_TRAP, l16si, .short, 0x00001234, 0x00001234 |
| load_unaligned_test WILL_TRAP, l16si, .short, 0x000089ab, 0xffff89ab |
| load_unaligned_test WILL_TRAP, l16ui, .short, 0x00001234, 0x00001234 |
| load_unaligned_test WILL_TRAP, l16ui, .short, 0x000089ab, 0x000089ab |
| load_unaligned_test WILL_TRAP, l32i, .word, 0x12345678, 0x12345678 |
| #if XCHAL_HAVE_RELEASE_SYNC |
| load_unaligned_test 1, l32ai, .word, 0x12345678, 0x12345678 |
| #endif |
| test_end |
| |
| test store_ok |
| store_ok_test s16i, .short, 0x00001234 |
| store_ok_test s32i, .word, 0x12345678 |
| #if XCHAL_HAVE_RELEASE_SYNC |
| store_ok_test s32ri, .word, 0x12345678 |
| #endif |
| test_end |
| |
| #undef WILL_TRAP |
| #if XCHAL_UNALIGNED_STORE_HW |
| #define WILL_TRAP 0 |
| #else |
| #define WILL_TRAP 1 |
| #endif |
| |
| test store_unaligned |
| store_unaligned_test WILL_TRAP, s16i, l16ui, .short, 0x00001234 |
| store_unaligned_test WILL_TRAP, s32i, l32i, .word, 0x12345678 |
| #if XCHAL_HAVE_RELEASE_SYNC |
| store_unaligned_test 1, s32ri, l32i, .word, 0x12345678 |
| #endif |
| test_end |
| |
| test_suite_end |