Fix vector clear issue.
Fix riscv host shift issue. Add tcg_gen_bswap_tl. -----BEGIN PGP SIGNATURE----- iQFRBAABCgA7FiEEekgeeIaLTbaoWgXAZN846K9+IV8FAl/zTWgdHHJpY2hhcmQu aGVuZGVyc29uQGxpbmFyby5vcmcACgkQZN846K9+IV+HqggAt1GEQZ0elUybCP64 5dAwDKULCd/bjpnb1bZnHUWhX7vFwiF8so3+esPvEHEWBRTbClaXa6Q5/eMDnpUn vvc6RQn0fzaXygD11sfcS1M9p/4pcSVtJfA2I3W1Ytp0cfGetgTRkHhVfkjOnaIP 4dkRy2nYkTMQ9J+ydEXRi9lOdjabZDScrEegO7snFwAzAwsLbaRpekAQToJxYW0g lvm9Pt5P9ffwCaCPKPNGcfLdKMJjiFCsdRYoWV8N7ajkSImxbscdNGAeUb16kBfh RW9scQtrwV0do9GHjADDh6Wx3d+F2skCmc5pk2divwJKwrAXcPgP6C8a8K8b0vZR f51kiA== =ql7h -----END PGP SIGNATURE----- Merge remote-tracking branch 'remotes/rth-gitlab/tags/pull-tcg-20210104' into staging Fix vector clear issue. Fix riscv host shift issue. Add tcg_gen_bswap_tl. # gpg: Signature made Mon 04 Jan 2021 17:16:24 GMT # gpg: using RSA key 7A481E78868B4DB6A85A05C064DF38E8AF7E215F # gpg: issuer "richard.henderson@linaro.org" # gpg: Good signature from "Richard Henderson <richard.henderson@linaro.org>" [full] # Primary key fingerprint: 7A48 1E78 868B 4DB6 A85A 05C0 64DF 38E8 AF7E 215F * remotes/rth-gitlab/tags/pull-tcg-20210104: tcg: Add tcg_gen_bswap_tl alias tcg/riscv: Fix illegal shift instructions tcg: Use memset for large vector byte replication Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
This commit is contained in:
commit
52d2546460
@ -28,6 +28,17 @@ DEF_HELPER_FLAGS_1(lookup_tb_ptr, TCG_CALL_NO_WG_SE, ptr, env)
|
||||
|
||||
DEF_HELPER_FLAGS_1(exit_atomic, TCG_CALL_NO_WG, noreturn, env)
|
||||
|
||||
#ifndef IN_HELPER_PROTO
|
||||
/*
|
||||
* Pass calls to memset directly to libc, without a thunk in qemu.
|
||||
* Do not re-declare memset, especially since we fudge the type here;
|
||||
* we assume sizeof(void *) == sizeof(size_t), which is true for
|
||||
* all supported hosts.
|
||||
*/
|
||||
#define helper_memset memset
|
||||
DEF_HELPER_FLAGS_3(memset, TCG_CALL_NO_RWG, ptr, ptr, int, ptr)
|
||||
#endif /* IN_HELPER_PROTO */
|
||||
|
||||
#ifdef CONFIG_SOFTMMU
|
||||
|
||||
DEF_HELPER_FLAGS_5(atomic_cmpxchgb, TCG_CALL_NO_WG,
|
||||
|
@ -35,11 +35,15 @@ dh_ctype(ret) HELPER(name) (dh_ctype(t1), dh_ctype(t2), dh_ctype(t3), \
|
||||
dh_ctype(t4), dh_ctype(t5), dh_ctype(t6), \
|
||||
dh_ctype(t7));
|
||||
|
||||
#define IN_HELPER_PROTO
|
||||
|
||||
#include "helper.h"
|
||||
#include "trace/generated-helpers.h"
|
||||
#include "tcg-runtime.h"
|
||||
#include "plugin-helpers.h"
|
||||
|
||||
#undef IN_HELPER_PROTO
|
||||
|
||||
#undef DEF_HELPER_FLAGS_0
|
||||
#undef DEF_HELPER_FLAGS_1
|
||||
#undef DEF_HELPER_FLAGS_2
|
||||
|
@ -1085,6 +1085,7 @@ void tcg_gen_stl_vec(TCGv_vec r, TCGv_ptr base, TCGArg offset, TCGType t);
|
||||
#define tcg_gen_bswap16_tl tcg_gen_bswap16_i64
|
||||
#define tcg_gen_bswap32_tl tcg_gen_bswap32_i64
|
||||
#define tcg_gen_bswap64_tl tcg_gen_bswap64_i64
|
||||
#define tcg_gen_bswap_tl tcg_gen_bswap64_i64
|
||||
#define tcg_gen_concat_tl_i64 tcg_gen_concat32_i64
|
||||
#define tcg_gen_extr_i64_tl tcg_gen_extr32_i64
|
||||
#define tcg_gen_andc_tl tcg_gen_andc_i64
|
||||
@ -1197,6 +1198,7 @@ void tcg_gen_stl_vec(TCGv_vec r, TCGv_ptr base, TCGArg offset, TCGType t);
|
||||
#define tcg_gen_ext32s_tl tcg_gen_mov_i32
|
||||
#define tcg_gen_bswap16_tl tcg_gen_bswap16_i32
|
||||
#define tcg_gen_bswap32_tl tcg_gen_bswap32_i32
|
||||
#define tcg_gen_bswap_tl tcg_gen_bswap32_i32
|
||||
#define tcg_gen_concat_tl_i64 tcg_gen_concat_i32_i64
|
||||
#define tcg_gen_extr_i64_tl tcg_gen_extr_i64_i32
|
||||
#define tcg_gen_andc_tl tcg_gen_andc_i32
|
||||
|
@ -1462,14 +1462,14 @@ static void tcg_out_op(TCGContext *s, TCGOpcode opc,
|
||||
|
||||
case INDEX_op_shl_i32:
|
||||
if (c2) {
|
||||
tcg_out_opc_imm(s, OPC_SLLIW, a0, a1, a2);
|
||||
tcg_out_opc_imm(s, OPC_SLLIW, a0, a1, a2 & 0x1f);
|
||||
} else {
|
||||
tcg_out_opc_reg(s, OPC_SLLW, a0, a1, a2);
|
||||
}
|
||||
break;
|
||||
case INDEX_op_shl_i64:
|
||||
if (c2) {
|
||||
tcg_out_opc_imm(s, OPC_SLLI, a0, a1, a2);
|
||||
tcg_out_opc_imm(s, OPC_SLLI, a0, a1, a2 & 0x3f);
|
||||
} else {
|
||||
tcg_out_opc_reg(s, OPC_SLL, a0, a1, a2);
|
||||
}
|
||||
@ -1477,14 +1477,14 @@ static void tcg_out_op(TCGContext *s, TCGOpcode opc,
|
||||
|
||||
case INDEX_op_shr_i32:
|
||||
if (c2) {
|
||||
tcg_out_opc_imm(s, OPC_SRLIW, a0, a1, a2);
|
||||
tcg_out_opc_imm(s, OPC_SRLIW, a0, a1, a2 & 0x1f);
|
||||
} else {
|
||||
tcg_out_opc_reg(s, OPC_SRLW, a0, a1, a2);
|
||||
}
|
||||
break;
|
||||
case INDEX_op_shr_i64:
|
||||
if (c2) {
|
||||
tcg_out_opc_imm(s, OPC_SRLI, a0, a1, a2);
|
||||
tcg_out_opc_imm(s, OPC_SRLI, a0, a1, a2 & 0x3f);
|
||||
} else {
|
||||
tcg_out_opc_reg(s, OPC_SRL, a0, a1, a2);
|
||||
}
|
||||
@ -1492,14 +1492,14 @@ static void tcg_out_op(TCGContext *s, TCGOpcode opc,
|
||||
|
||||
case INDEX_op_sar_i32:
|
||||
if (c2) {
|
||||
tcg_out_opc_imm(s, OPC_SRAIW, a0, a1, a2);
|
||||
tcg_out_opc_imm(s, OPC_SRAIW, a0, a1, a2 & 0x1f);
|
||||
} else {
|
||||
tcg_out_opc_reg(s, OPC_SRAW, a0, a1, a2);
|
||||
}
|
||||
break;
|
||||
case INDEX_op_sar_i64:
|
||||
if (c2) {
|
||||
tcg_out_opc_imm(s, OPC_SRAI, a0, a1, a2);
|
||||
tcg_out_opc_imm(s, OPC_SRAI, a0, a1, a2 & 0x3f);
|
||||
} else {
|
||||
tcg_out_opc_reg(s, OPC_SRA, a0, a1, a2);
|
||||
}
|
||||
|
@ -547,6 +547,9 @@ static void do_dup(unsigned vece, uint32_t dofs, uint32_t oprsz,
|
||||
in_c = dup_const(vece, in_c);
|
||||
if (in_c == 0) {
|
||||
oprsz = maxsz;
|
||||
vece = MO_8;
|
||||
} else if (in_c == dup_const(MO_8, in_c)) {
|
||||
vece = MO_8;
|
||||
}
|
||||
}
|
||||
|
||||
@ -628,6 +631,35 @@ static void do_dup(unsigned vece, uint32_t dofs, uint32_t oprsz,
|
||||
/* Otherwise implement out of line. */
|
||||
t_ptr = tcg_temp_new_ptr();
|
||||
tcg_gen_addi_ptr(t_ptr, cpu_env, dofs);
|
||||
|
||||
/*
|
||||
* This may be expand_clr for the tail of an operation, e.g.
|
||||
* oprsz == 8 && maxsz == 64. The size of the clear is misaligned
|
||||
* wrt simd_desc and will assert. Simply pass all replicated byte
|
||||
* stores through to memset.
|
||||
*/
|
||||
if (oprsz == maxsz && vece == MO_8) {
|
||||
TCGv_ptr t_size = tcg_const_ptr(oprsz);
|
||||
TCGv_i32 t_val;
|
||||
|
||||
if (in_32) {
|
||||
t_val = in_32;
|
||||
} else if (in_64) {
|
||||
t_val = tcg_temp_new_i32();
|
||||
tcg_gen_extrl_i64_i32(t_val, in_64);
|
||||
} else {
|
||||
t_val = tcg_const_i32(in_c);
|
||||
}
|
||||
gen_helper_memset(t_ptr, t_ptr, t_val, t_size);
|
||||
|
||||
if (!in_32) {
|
||||
tcg_temp_free_i32(t_val);
|
||||
}
|
||||
tcg_temp_free_ptr(t_size);
|
||||
tcg_temp_free_ptr(t_ptr);
|
||||
return;
|
||||
}
|
||||
|
||||
t_desc = tcg_const_i32(simd_desc(oprsz, maxsz, 0));
|
||||
|
||||
if (vece == MO_64) {
|
||||
|
Loading…
Reference in New Issue
Block a user