From 22c49dc3ebb65f7c0c61708c96c226c25b81a4e3 Mon Sep 17 00:00:00 2001 From: Damien Maier <91182145+damienmaier@users.noreply.github.com> Date: Sun, 4 Feb 2024 21:38:55 +0000 Subject: [PATCH] fix rotate functions for PR --- accel/tcg/tcg-runtime-sym-common.c | 27 +++++++++++++++++++++++++++ accel/tcg/tcg-runtime-sym-common.h | 4 +++- accel/tcg/tcg-runtime-sym-vec.c | 8 ++++---- 3 files changed, 34 insertions(+), 5 deletions(-) diff --git a/accel/tcg/tcg-runtime-sym-common.c b/accel/tcg/tcg-runtime-sym-common.c index 6c3aeba9f6..06c98aea27 100644 --- a/accel/tcg/tcg-runtime-sym-common.c +++ b/accel/tcg/tcg-runtime-sym-common.c @@ -65,4 +65,31 @@ target_ulong get_pc(CPUArchState *env) cpu_get_tb_cpu_state(env, &pc, &cs_base, &flags); return pc; +} + +void *sym_rotate_left(void *arg1_expr, void *arg2_expr) { + /* The implementation follows the alternative implementation of + * tcg_gen_rotl_i64 in tcg-op.c (which handles architectures that don't + * support rotl directly). */ + + uint8_t bits = _sym_bits_helper(arg1_expr); + return _sym_build_or( + _sym_build_shift_left(arg1_expr, arg2_expr), + _sym_build_logical_shift_right( + arg1_expr, + _sym_build_sub(_sym_build_integer(bits, bits), arg2_expr))); +} + +void *sym_rotate_right(void *arg1_expr, void *arg2_expr) { + + /* The implementation follows the alternative implementation of + * tcg_gen_rotr_i64 in tcg-op.c (which handles architectures that don't + * support rotr directly). */ + + uint8_t bits = _sym_bits_helper(arg1_expr); + return _sym_build_or( + _sym_build_logical_shift_right(arg1_expr, arg2_expr), + _sym_build_shift_left( + arg1_expr, + _sym_build_sub(_sym_build_integer(bits, bits), arg2_expr))); } \ No newline at end of file diff --git a/accel/tcg/tcg-runtime-sym-common.h b/accel/tcg/tcg-runtime-sym-common.h index 9e090b01ee..dfe998d8c5 100644 --- a/accel/tcg/tcg-runtime-sym-common.h +++ b/accel/tcg/tcg-runtime-sym-common.h @@ -1,2 +1,4 @@ void *build_and_push_path_constraint(CPUArchState *env, void *arg1_expr, void *arg2_expr, uint32_t comparison_operator, uint8_t is_taken); -target_ulong get_pc(CPUArchState *env); \ No newline at end of file +target_ulong get_pc(CPUArchState *env); +void *sym_rotate_left(void *arg1_expr, void *arg2_expr); +void *sym_rotate_right(void *arg1_expr, void *arg2_expr); diff --git a/accel/tcg/tcg-runtime-sym-vec.c b/accel/tcg/tcg-runtime-sym-vec.c index 1e2b62f6b7..c86db98cbf 100644 --- a/accel/tcg/tcg-runtime-sym-vec.c +++ b/accel/tcg/tcg-runtime-sym-vec.c @@ -250,12 +250,12 @@ void *HELPER(sym_arithmetic_shift_right_vec)(void *arg1, void *arg1_expr, void * void * HELPER(sym_rotate_left_vec)(void *arg1, void *arg1_expr, void *arg2, void *arg2_expr, uint64_t size, uint64_t vece) { - return build_expression_for_vector_vector_op(arg1, arg1_expr, arg2, arg2_expr, size, vece, _sym_build_rotate_left); + return build_expression_for_vector_vector_op(arg1, arg1_expr, arg2, arg2_expr, size, vece, sym_rotate_left); } void * HELPER(sym_rotate_right_vec)(void *arg1, void *arg1_expr, void *arg2, void *arg2_expr, uint64_t size, uint64_t vece) { - return build_expression_for_vector_vector_op(arg1, arg1_expr, arg2, arg2_expr, size, vece, _sym_build_rotate_right); + return build_expression_for_vector_vector_op(arg1, arg1_expr, arg2, arg2_expr, size, vece,sym_rotate_right); } void *HELPER(sym_shift_left_vec_int32)(void *arg1, void *arg1_expr, uint32_t arg2, void *arg2_expr, uint64_t size, @@ -279,12 +279,12 @@ HELPER(sym_arithmetic_shift_right_vec_int32)(void *arg1, void *arg1_expr, uint32 void *HELPER(sym_rotate_left_vec_int32)(void *arg1, void *arg1_expr, uint32_t arg2, void *arg2_expr, uint64_t size, uint64_t vece) { - return build_expression_for_vector_int32_op(arg1, arg1_expr, arg2, arg2_expr, size, vece, _sym_build_rotate_left); + return build_expression_for_vector_int32_op(arg1, arg1_expr, arg2, arg2_expr, size, vece,sym_rotate_left); } void *HELPER(sym_rotate_right_vec_int32)(void *arg1, void *arg1_expr, uint32_t arg2, void *arg2_expr, uint64_t size, uint64_t vece) { - return build_expression_for_vector_int32_op(arg1, arg1_expr, arg2, arg2_expr, size, vece, _sym_build_rotate_right); + return build_expression_for_vector_int32_op(arg1, arg1_expr, arg2, arg2_expr, size, vece, sym_rotate_right); } /*