| #include "macros.inc" | 
 |  | 
 | test_suite shift | 
 |  | 
 | .macro test_shift prefix, dst, src, v, imm | 
 |     \prefix\()_set \dst, \src, \v, \imm | 
 |     \prefix\()_ver \dst, \v, \imm | 
 | .endm | 
 |  | 
 | .macro test_shift_sd prefix, v, imm | 
 |     test_shift \prefix, a3, a2, \v, \imm | 
 |     test_shift \prefix, a2, a2, \v, \imm | 
 | .endm | 
 |  | 
 | .macro tests_imm_shift prefix, v | 
 |     test_shift_sd \prefix, \v, 1 | 
 |     test_shift_sd \prefix, \v, 2 | 
 |     test_shift_sd \prefix, \v, 7 | 
 |     test_shift_sd \prefix, \v, 8 | 
 |     test_shift_sd \prefix, \v, 15 | 
 |     test_shift_sd \prefix, \v, 16 | 
 |     test_shift_sd \prefix, \v, 31 | 
 | .endm | 
 |  | 
 | .macro tests_shift prefix, v | 
 |     test_shift_sd \prefix, \v, 0 | 
 |     tests_imm_shift \prefix, \v | 
 |     test_shift_sd \prefix, \v, 32 | 
 | .endm | 
 |  | 
 |  | 
 | .macro slli_set dst, src, v, imm | 
 |     movi    \src, \v | 
 |     slli    \dst, \src, \imm | 
 | .endm | 
 |  | 
 | .macro slli_ver dst, v, imm | 
 |     mov     a2, \dst | 
 |     movi    a3, ((\v) << (\imm)) & 0xffffffff | 
 |     assert  eq, a2, a3 | 
 | .endm | 
 |  | 
 | test slli | 
 |     tests_imm_shift slli, 0xa3c51249 | 
 | test_end | 
 |  | 
 |  | 
 | .macro srai_set dst, src, v, imm | 
 |     movi    \src, \v | 
 |     srai    \dst, \src, \imm | 
 | .endm | 
 |  | 
 | .macro srai_ver dst, v, imm | 
 |     mov     a2, \dst | 
 |     .if (\imm) | 
 |     movi    a3, (((\v) >> (\imm)) & 0xffffffff) | \ | 
 |                 ~((((\v) & 0x80000000) >> ((\imm) - 1)) - 1) | 
 |     .else | 
 |     movi    a3, \v | 
 |     .endif | 
 |     assert  eq, a2, a3 | 
 | .endm | 
 |  | 
 | test srai | 
 |     tests_imm_shift srai, 0x49a3c512 | 
 |     tests_imm_shift srai, 0xa3c51249 | 
 | test_end | 
 |  | 
 |  | 
 | .macro srli_set dst, src, v, imm | 
 |     movi    \src, \v | 
 |     srli    \dst, \src, \imm | 
 | .endm | 
 |  | 
 | .macro srli_ver dst, v, imm | 
 |     mov     a2, \dst | 
 |     movi    a3, (((\v) >> (\imm)) & 0xffffffff) | 
 |     assert  eq, a2, a3 | 
 | .endm | 
 |  | 
 | test srli | 
 |     tests_imm_shift srli, 0x49a3c512 | 
 |     tests_imm_shift srli, 0xa3c51249 | 
 | test_end | 
 |  | 
 |  | 
 | .macro sll_set dst, src, v, imm | 
 |     movi    a2, \imm | 
 |     ssl     a2 | 
 |     movi    \src, \v | 
 |     sll     \dst, \src | 
 | .endm | 
 |  | 
 | .macro sll_sar_set dst, src, v, imm | 
 |     movi    a2, 32 - \imm | 
 |     wsr     a2, sar | 
 |     movi    \src, \v | 
 |     sll     \dst, \src | 
 | .endm | 
 |  | 
 | .macro sll_ver dst, v, imm | 
 |     slli_ver \dst, \v, (\imm) & 0x1f | 
 | .endm | 
 |  | 
 | .macro sll_sar_ver dst, v, imm | 
 |     slli_ver \dst, \v, \imm | 
 | .endm | 
 |  | 
 | test sll | 
 |     tests_shift sll, 0xa3c51249 | 
 |     tests_shift sll_sar, 0xa3c51249 | 
 | test_end | 
 |  | 
 |  | 
 | .macro srl_set dst, src, v, imm | 
 |     movi    a2, \imm | 
 |     ssr     a2 | 
 |     movi    \src, \v | 
 |     srl     \dst, \src | 
 | .endm | 
 |  | 
 | .macro srl_sar_set dst, src, v, imm | 
 |     movi    a2, \imm | 
 |     wsr     a2, sar | 
 |     movi    \src, \v | 
 |     srl     \dst, \src | 
 | .endm | 
 |  | 
 | .macro srl_ver dst, v, imm | 
 |     srli_ver \dst, \v, (\imm) & 0x1f | 
 | .endm | 
 |  | 
 | .macro srl_sar_ver dst, v, imm | 
 |     srli_ver \dst, \v, \imm | 
 | .endm | 
 |  | 
 | test srl | 
 |     tests_shift srl, 0xa3c51249 | 
 |     tests_shift srl_sar, 0xa3c51249 | 
 |     tests_shift srl, 0x49a3c512 | 
 |     tests_shift srl_sar, 0x49a3c512 | 
 | test_end | 
 |  | 
 |  | 
 | .macro sra_set dst, src, v, imm | 
 |     movi    a2, \imm | 
 |     ssr     a2 | 
 |     movi    \src, \v | 
 |     sra     \dst, \src | 
 | .endm | 
 |  | 
 | .macro sra_sar_set dst, src, v, imm | 
 |     movi    a2, \imm | 
 |     wsr     a2, sar | 
 |     movi    \src, \v | 
 |     sra     \dst, \src | 
 | .endm | 
 |  | 
 | .macro sra_ver dst, v, imm | 
 |     srai_ver \dst, \v, (\imm) & 0x1f | 
 | .endm | 
 |  | 
 | .macro sra_sar_ver dst, v, imm | 
 |     srai_ver \dst, \v, \imm | 
 | .endm | 
 |  | 
 | test sra | 
 |     tests_shift sra, 0xa3c51249 | 
 |     tests_shift sra_sar, 0xa3c51249 | 
 |     tests_shift sra, 0x49a3c512 | 
 |     tests_shift sra_sar, 0x49a3c512 | 
 | test_end | 
 |  | 
 |  | 
 | .macro src_set dst, src, v, imm | 
 |     movi    a2, \imm | 
 |     ssr     a2 | 
 |     movi    \src, (\v) & 0xffffffff | 
 |     movi    a4, (\v) >> 32 | 
 |     src     \dst, a4, \src | 
 | .endm | 
 |  | 
 | .macro src_sar_set dst, src, v, imm | 
 |     movi    a2, \imm | 
 |     wsr     a2, sar | 
 |     movi    \src, (\v) & 0xffffffff | 
 |     movi    a4, (\v) >> 32 | 
 |     src     \dst, a4, \src | 
 | .endm | 
 |  | 
 | .macro src_ver dst, v, imm | 
 |     src_sar_ver \dst, \v, (\imm) & 0x1f | 
 | .endm | 
 |  | 
 | .macro src_sar_ver dst, v, imm | 
 |     mov     a2, \dst | 
 |     movi    a3, ((\v) >> (\imm)) & 0xffffffff | 
 |     assert  eq, a2, a3 | 
 | .endm | 
 |  | 
 | test src | 
 |     tests_shift src, 0xa3c51249215c3a94 | 
 |     tests_shift src_sar, 0xa3c51249215c3a94 | 
 | test_end | 
 |  | 
 | test_suite_end |