mirror of
https://github.com/qemu/qemu.git
synced 2025-08-04 08:23:09 +00:00

Add instructions of RR opcode format, that have 0xb as the first opcode. Add helper functions, for hword and byte arithmetics: * add_h_ssov/suov: Add two halfword and saturate on overflow. * sub_h_ssov/suov: Sub two halfword and saturate on overflow. * absdif_h_ssov: Compute absolute difference for halfwords and saturate on overflow. * abs_h_ssov/suov: Compute absolute value for two halfwords and saturate on overflow. * abs_b/h: Compute absolute value for four/two bytes/halfwords * absdif_b/h: Compute absolute difference for four/two bytes/halfwords * add_b/h: Add four/two bytes/halfwords. * sub_b/h: Sub four/two bytes/halfwords. * eq_b/h: Compare four/two bytes/halfwords with four/two bytes/halfwords on equality and set all bits of to either one ore zero. * eqany_b/h: Compare four/two bytes/halfwords with four/two bytes/halfwords on equality. * lt_b/bu/h/hu: Compare four/two bytes/halfwords with four/two bytes/halfwords on less than signed and unsigned. * max_b/bu/h/hu: Calculate max for four/two bytes/halfwords signed and unsigned. * min_b/bu/h/hu: Calculate min for four/two bytes/halfwords signed and unsigned. Add helper function abs_ssov, that computes the absolute value for a 32 bit integer and saturates on overflow. Add microcode generator functions: * gen_sub_CC: Caluclates sub and sets the carry bit. * gen_subc_CC: Caluclates sub and carry and sets the carry bit * gen_abs: Compute absolute value for a 32 bit integer. * gen_cond_w: Compares two 32 bit values on cond and sets result either zero or all bits one. OPC2_32_RR_MIN switched with OPC2_32_RR_MIN_U. Signed-off-by: Bastian Koppelmann <kbastian@mail.uni-paderborn.de> Reviewed-by: Richard Henderson <rth@twiddle.net>
82 lines
3.5 KiB
C
82 lines
3.5 KiB
C
/*
|
|
* Copyright (c) 2012-2014 Bastian Koppelmann C-Lab/University Paderborn
|
|
*
|
|
* This library is free software; you can redistribute it and/or
|
|
* modify it under the terms of the GNU Lesser General Public
|
|
* License as published by the Free Software Foundation; either
|
|
* version 2 of the License, or (at your option) any later version.
|
|
*
|
|
* This library is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
* Lesser General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU Lesser General Public
|
|
* License along with this library; if not, see <http://www.gnu.org/licenses/>.
|
|
*/
|
|
|
|
/* Arithmetic */
|
|
DEF_HELPER_3(add_ssov, i32, env, i32, i32)
|
|
DEF_HELPER_3(add_suov, i32, env, i32, i32)
|
|
DEF_HELPER_3(add_h_ssov, i32, env, i32, i32)
|
|
DEF_HELPER_3(add_h_suov, i32, env, i32, i32)
|
|
DEF_HELPER_3(sub_ssov, i32, env, i32, i32)
|
|
DEF_HELPER_3(sub_suov, i32, env, i32, i32)
|
|
DEF_HELPER_3(sub_h_ssov, i32, env, i32, i32)
|
|
DEF_HELPER_3(sub_h_suov, i32, env, i32, i32)
|
|
DEF_HELPER_3(mul_ssov, i32, env, i32, i32)
|
|
DEF_HELPER_3(mul_suov, i32, env, i32, i32)
|
|
DEF_HELPER_3(sha_ssov, i32, env, i32, i32)
|
|
DEF_HELPER_3(absdif_ssov, i32, env, i32, i32)
|
|
DEF_HELPER_4(madd32_ssov, i32, env, i32, i32, i32)
|
|
DEF_HELPER_4(madd32_suov, i32, env, i32, i32, i32)
|
|
DEF_HELPER_4(madd64_ssov, i64, env, i32, i64, i32)
|
|
DEF_HELPER_4(madd64_suov, i64, env, i32, i64, i32)
|
|
DEF_HELPER_4(msub32_ssov, i32, env, i32, i32, i32)
|
|
DEF_HELPER_4(msub32_suov, i32, env, i32, i32, i32)
|
|
DEF_HELPER_4(msub64_ssov, i64, env, i32, i64, i32)
|
|
DEF_HELPER_4(msub64_suov, i64, env, i32, i64, i32)
|
|
DEF_HELPER_3(absdif_h_ssov, i32, env, i32, i32)
|
|
DEF_HELPER_2(abs_ssov, i32, env, i32)
|
|
DEF_HELPER_2(abs_h_ssov, i32, env, i32)
|
|
/* hword/byte arithmetic */
|
|
DEF_HELPER_2(abs_b, i32, env, i32)
|
|
DEF_HELPER_2(abs_h, i32, env, i32)
|
|
DEF_HELPER_3(absdif_b, i32, env, i32, i32)
|
|
DEF_HELPER_3(absdif_h, i32, env, i32, i32)
|
|
DEF_HELPER_3(add_b, i32, env, i32, i32)
|
|
DEF_HELPER_3(add_h, i32, env, i32, i32)
|
|
DEF_HELPER_3(sub_b, i32, env, i32, i32)
|
|
DEF_HELPER_3(sub_h, i32, env, i32, i32)
|
|
DEF_HELPER_FLAGS_2(eq_b, TCG_CALL_NO_RWG_SE, i32, i32, i32)
|
|
DEF_HELPER_FLAGS_2(eq_h, TCG_CALL_NO_RWG_SE, i32, i32, i32)
|
|
DEF_HELPER_FLAGS_2(eqany_b, TCG_CALL_NO_RWG_SE, i32, i32, i32)
|
|
DEF_HELPER_FLAGS_2(eqany_h, TCG_CALL_NO_RWG_SE, i32, i32, i32)
|
|
DEF_HELPER_FLAGS_2(lt_b, TCG_CALL_NO_RWG_SE, i32, i32, i32)
|
|
DEF_HELPER_FLAGS_2(lt_bu, TCG_CALL_NO_RWG_SE, i32, i32, i32)
|
|
DEF_HELPER_FLAGS_2(lt_h, TCG_CALL_NO_RWG_SE, i32, i32, i32)
|
|
DEF_HELPER_FLAGS_2(lt_hu, TCG_CALL_NO_RWG_SE, i32, i32, i32)
|
|
DEF_HELPER_FLAGS_2(max_b, TCG_CALL_NO_RWG_SE, i32, i32, i32)
|
|
DEF_HELPER_FLAGS_2(max_bu, TCG_CALL_NO_RWG_SE, i32, i32, i32)
|
|
DEF_HELPER_FLAGS_2(max_h, TCG_CALL_NO_RWG_SE, i32, i32, i32)
|
|
DEF_HELPER_FLAGS_2(max_hu, TCG_CALL_NO_RWG_SE, i32, i32, i32)
|
|
DEF_HELPER_FLAGS_2(min_b, TCG_CALL_NO_RWG_SE, i32, i32, i32)
|
|
DEF_HELPER_FLAGS_2(min_bu, TCG_CALL_NO_RWG_SE, i32, i32, i32)
|
|
DEF_HELPER_FLAGS_2(min_h, TCG_CALL_NO_RWG_SE, i32, i32, i32)
|
|
DEF_HELPER_FLAGS_2(min_hu, TCG_CALL_NO_RWG_SE, i32, i32, i32)
|
|
/* CSA */
|
|
DEF_HELPER_2(call, void, env, i32)
|
|
DEF_HELPER_1(ret, void, env)
|
|
DEF_HELPER_2(bisr, void, env, i32)
|
|
DEF_HELPER_1(rfe, void, env)
|
|
DEF_HELPER_2(ldlcx, void, env, i32)
|
|
DEF_HELPER_2(lducx, void, env, i32)
|
|
DEF_HELPER_2(stlcx, void, env, i32)
|
|
DEF_HELPER_2(stucx, void, env, i32)
|
|
/* Address mode helper */
|
|
DEF_HELPER_1(br_update, i32, i32)
|
|
DEF_HELPER_2(circ_update, i32, i32, i32)
|
|
/* PSW cache helper */
|
|
DEF_HELPER_2(psw_write, void, env, i32)
|
|
DEF_HELPER_1(psw_read, i32, env)
|