#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