From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:37973) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1ZTuTE-0003uG-Ja for qemu-devel@nongnu.org; Mon, 24 Aug 2015 12:19:44 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1ZTuTA-0003Hy-Hx for qemu-devel@nongnu.org; Mon, 24 Aug 2015 12:19:40 -0400 Received: from mail-qg0-x235.google.com ([2607:f8b0:400d:c04::235]:33355) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1ZTuTA-0003Hm-Bh for qemu-devel@nongnu.org; Mon, 24 Aug 2015 12:19:36 -0400 Received: by qgeh99 with SMTP id h99so30340851qge.0 for ; Mon, 24 Aug 2015 09:19:36 -0700 (PDT) Sender: Richard Henderson From: Richard Henderson Date: Mon, 24 Aug 2015 09:17:59 -0700 Message-Id: <1440433079-14458-34-git-send-email-rth@twiddle.net> In-Reply-To: <1440433079-14458-1-git-send-email-rth@twiddle.net> References: <1440433079-14458-1-git-send-email-rth@twiddle.net> Subject: [Qemu-devel] [PATCH v14 33/33] target-tilegx: Handle v1shl, v1shru, v1shrs List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-devel@nongnu.org Cc: walt@tilera.com, cmetcalf@ezchip.com, xili_gchen_5257@hotmail.com, peter.maydell@linaro.org Signed-off-by: Richard Henderson --- target-tilegx/Makefile.objs | 2 +- target-tilegx/helper.h | 4 +++ target-tilegx/simd_helper.c | 63 +++++++++++++++++++++++++++++++++++++++++++++ target-tilegx/translate.c | 17 +++++++++++- 4 files changed, 84 insertions(+), 2 deletions(-) create mode 100644 target-tilegx/simd_helper.c diff --git a/target-tilegx/Makefile.objs b/target-tilegx/Makefile.objs index 8b3dc76..0db778f 100644 --- a/target-tilegx/Makefile.objs +++ b/target-tilegx/Makefile.objs @@ -1 +1 @@ -obj-y += cpu.o translate.o helper.o +obj-y += cpu.o translate.o helper.o simd_helper.o diff --git a/target-tilegx/helper.h b/target-tilegx/helper.h index 644d313..766f5f2 100644 --- a/target-tilegx/helper.h +++ b/target-tilegx/helper.h @@ -4,3 +4,7 @@ DEF_HELPER_FLAGS_1(cnttz, TCG_CALL_NO_RWG_SE, i64, i64) DEF_HELPER_FLAGS_1(pcnt, TCG_CALL_NO_RWG_SE, i64, i64) DEF_HELPER_FLAGS_1(revbits, TCG_CALL_NO_RWG_SE, i64, i64) DEF_HELPER_FLAGS_3(shufflebytes, TCG_CALL_NO_RWG_SE, i64, i64, i64, i64) + +DEF_HELPER_FLAGS_2(v1shl, TCG_CALL_NO_RWG_SE, i64, i64, i64) +DEF_HELPER_FLAGS_2(v1shru, TCG_CALL_NO_RWG_SE, i64, i64, i64) +DEF_HELPER_FLAGS_2(v1shrs, TCG_CALL_NO_RWG_SE, i64, i64, i64) diff --git a/target-tilegx/simd_helper.c b/target-tilegx/simd_helper.c new file mode 100644 index 0000000..7670d4a --- /dev/null +++ b/target-tilegx/simd_helper.c @@ -0,0 +1,63 @@ +/* + * QEMU TILE-Gx helpers + * + * Copyright (c) 2015 Chen Gang + * + * 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.1 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 + * + */ + +#include "cpu.h" +#include "qemu-common.h" +#include "exec/helper-proto.h" + + +uint64_t helper_v1shl(uint64_t a, uint64_t b) +{ + uint64_t r = 0; + int i; + + for (i = 0; i < 64; i += 8) { + uint64_t m = 0xffULL << i; + uint64_t be = (b >> i) & 7; + r |= ((a & m) << be) & m; + } + return r; +} + +uint64_t helper_v1shru(uint64_t a, uint64_t b) +{ + uint64_t r = 0; + int i; + + for (i = 0; i < 64; i += 8) { + uint64_t m = 0xffULL << i; + uint64_t be = (b >> i) & 7; + r |= ((a & m) >> be) & m; + } + return r; +} + +uint64_t helper_v1shrs(uint64_t a, uint64_t b) +{ + uint64_t r = 0; + int i; + + for (i = 0; i < 64; i += 8) { + uint64_t ae = (int8_t)(a >> i); + uint64_t be = (b >> i) & 7; + r |= ((ae >> be) & 0xff) << i; + } + return r; +} diff --git a/target-tilegx/translate.c b/target-tilegx/translate.c index e417c2a..f841553 100644 --- a/target-tilegx/translate.c +++ b/target-tilegx/translate.c @@ -1054,12 +1054,22 @@ static TileExcp gen_rrr_opcode(DisasContext *dc, unsigned opext, case OE_RRR(V1MZ, 0, X1): case OE_RRR(V1SADAU, 0, X0): case OE_RRR(V1SADU, 0, X0): + return TILEGX_EXCP_OPCODE_UNIMPLEMENTED; case OE_RRR(V1SHL, 0, X0): case OE_RRR(V1SHL, 0, X1): + gen_helper_v1shl(tdest, tsrca, tsrcb); + mnemonic = "v1shl"; + break; case OE_RRR(V1SHRS, 0, X0): case OE_RRR(V1SHRS, 0, X1): + gen_helper_v1shrs(tdest, tsrca, tsrcb); + mnemonic = "v1shrs"; + break; case OE_RRR(V1SHRU, 0, X0): case OE_RRR(V1SHRU, 0, X1): + gen_helper_v1shru(tdest, tsrca, tsrcb); + mnemonic = "v1shru"; + break; case OE_RRR(V1SUBUC, 0, X0): case OE_RRR(V1SUBUC, 0, X1): case OE_RRR(V1SUB, 0, X0): @@ -1176,6 +1186,7 @@ static TileExcp gen_rri_opcode(DisasContext *dc, unsigned opext, const char *mnemonic; TCGMemOp memop; int i2, i3; + TCGv t0; switch (opext) { case OE(ADDI_OPCODE_Y0, 0, Y0): @@ -1378,7 +1389,11 @@ static TileExcp gen_rri_opcode(DisasContext *dc, unsigned opext, break; case OE_SH(V1SHRSI, X0): case OE_SH(V1SHRSI, X1): - return TILEGX_EXCP_OPCODE_UNIMPLEMENTED; + t0 = tcg_const_tl(V1_IMM(imm & 7)); + gen_helper_v1shrs(tdest, tsrca, t0); + tcg_temp_free(t0); + mnemonic = "v1shrsi"; + break; case OE_SH(V1SHRUI, X0): case OE_SH(V1SHRUI, X1): i2 = imm & 7; -- 2.4.3