From patchwork Thu Oct 16 08:56:48 2014 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Kirill Batuzov X-Patchwork-Id: 400229 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from lists.gnu.org (lists.gnu.org [IPv6:2001:4830:134:3::11]) (using TLSv1 with cipher AES256-SHA (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id E5A811400D6 for ; Thu, 16 Oct 2014 19:58:07 +1100 (AEDT) Received: from localhost ([::1]:49287 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1Xegso-0002no-3f for incoming@patchwork.ozlabs.org; Thu, 16 Oct 2014 04:58:06 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:40060) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1Xegs2-0001Y7-Ow for qemu-devel@nongnu.org; Thu, 16 Oct 2014 04:57:24 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1Xegrr-0006V1-0P for qemu-devel@nongnu.org; Thu, 16 Oct 2014 04:57:18 -0400 Received: from smtp.ispras.ru ([83.149.199.79]:49264) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1Xegrq-0006UA-M2 for qemu-devel@nongnu.org; Thu, 16 Oct 2014 04:57:06 -0400 Received: from bulbul.intra.ispras.ru (unknown [83.149.199.91]) by smtp.ispras.ru (Postfix) with ESMTP id 060A6224A8; Thu, 16 Oct 2014 12:57:06 +0400 (MSK) From: Kirill Batuzov To: qemu-devel@nongnu.org Date: Thu, 16 Oct 2014 12:56:48 +0400 Message-Id: <4dce5b71278cdc92e789b1bbb48a986fa3b6c7b5.1413286807.git.batuzovk@ispras.ru> X-Mailer: git-send-email 1.7.10.4 In-Reply-To: References: <87k3571pb5.fsf@linaro.org> X-detected-operating-system: by eggs.gnu.org: GNU/Linux 3.x X-Received-From: 83.149.199.79 Cc: Richard Henderson , =?UTF-8?q?Alex=20Benn=C3=A9e?= , Kirill Batuzov Subject: [Qemu-devel] [PATCH RFC 1/7] tcg: add support for 128bit vector type X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.14 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org Sender: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org Introduce TCG_TYPE_V128 and corresponding TCGv_v128 for TCG temps. Add wrapper functions that work with temps of this new type. Signed-off-by: Kirill Batuzov --- tcg/tcg-op.h | 23 +++++++++++++++++++++++ tcg/tcg.c | 24 ++++++++++++++++++++++++ tcg/tcg.h | 28 ++++++++++++++++++++++++++++ 3 files changed, 75 insertions(+) diff --git a/tcg/tcg-op.h b/tcg/tcg-op.h index 019dd9b..81291fd 100644 --- a/tcg/tcg-op.h +++ b/tcg/tcg-op.h @@ -345,6 +345,29 @@ static inline void tcg_gen_op6ii_i64(TCGOpcode opc, TCGv_i64 arg1, *tcg_ctx.gen_opparam_ptr++ = arg6; } +static inline void tcg_gen_op1_v128(TCGOpcode opc, TCGv_v128 arg1) +{ + *tcg_ctx.gen_opc_ptr++ = opc; + *tcg_ctx.gen_opparam_ptr++ = GET_TCGV_V128(arg1); +} + +static inline void tcg_gen_op2_v128(TCGOpcode opc, TCGv_v128 arg1, + TCGv_v128 arg2) +{ + *tcg_ctx.gen_opc_ptr++ = opc; + *tcg_ctx.gen_opparam_ptr++ = GET_TCGV_V128(arg1); + *tcg_ctx.gen_opparam_ptr++ = GET_TCGV_V128(arg2); +} + +static inline void tcg_gen_op3_v128(TCGOpcode opc, TCGv_v128 arg1, + TCGv_v128 arg2, TCGv_v128 arg3) +{ + *tcg_ctx.gen_opc_ptr++ = opc; + *tcg_ctx.gen_opparam_ptr++ = GET_TCGV_V128(arg1); + *tcg_ctx.gen_opparam_ptr++ = GET_TCGV_V128(arg2); + *tcg_ctx.gen_opparam_ptr++ = GET_TCGV_V128(arg3); +} + static inline void tcg_add_param_i32(TCGv_i32 val) { *tcg_ctx.gen_opparam_ptr++ = GET_TCGV_I32(val); diff --git a/tcg/tcg.c b/tcg/tcg.c index 7a84b87..d01f357 100644 --- a/tcg/tcg.c +++ b/tcg/tcg.c @@ -542,6 +542,12 @@ TCGv_i64 tcg_global_mem_new_i64(int reg, intptr_t offset, const char *name) return MAKE_TCGV_I64(idx); } +TCGv_v128 tcg_global_mem_new_v128(int reg, intptr_t offset, const char *name) +{ + int idx = tcg_global_mem_new_internal(TCG_TYPE_V128, reg, offset, name); + return MAKE_TCGV_V128(idx); +} + static inline int tcg_temp_new_internal(TCGType type, int temp_local) { TCGContext *s = &tcg_ctx; @@ -612,6 +618,14 @@ TCGv_i64 tcg_temp_new_internal_i64(int temp_local) return MAKE_TCGV_I64(idx); } +TCGv_v128 tcg_temp_new_internal_v128(int temp_local) +{ + int idx; + + idx = tcg_temp_new_internal(TCG_TYPE_V128, temp_local); + return MAKE_TCGV_V128(idx); +} + static void tcg_temp_free_internal(int idx) { TCGContext *s = &tcg_ctx; @@ -644,6 +658,11 @@ void tcg_temp_free_i64(TCGv_i64 arg) tcg_temp_free_internal(GET_TCGV_I64(arg)); } +void tcg_temp_free_v128(TCGv_v128 arg) +{ + tcg_temp_free_internal(GET_TCGV_V128(arg)); +} + TCGv_i32 tcg_const_i32(int32_t val) { TCGv_i32 t0; @@ -1062,6 +1081,11 @@ char *tcg_get_arg_str_i64(TCGContext *s, char *buf, int buf_size, TCGv_i64 arg) return tcg_get_arg_str_idx(s, buf, buf_size, GET_TCGV_I64(arg)); } +char *tcg_get_arg_str_v128(TCGContext *s, char *buf, int buf_size, TCGv_v128 arg) +{ + return tcg_get_arg_str_idx(s, buf, buf_size, GET_TCGV_V128(arg)); +} + /* Find helper name. */ static inline const char *tcg_find_helper(TCGContext *s, uintptr_t val) { diff --git a/tcg/tcg.h b/tcg/tcg.h index 7285f71..01dbede 100644 --- a/tcg/tcg.h +++ b/tcg/tcg.h @@ -194,6 +194,7 @@ typedef struct TCGPool { typedef enum TCGType { TCG_TYPE_I32, TCG_TYPE_I64, + TCG_TYPE_V128, TCG_TYPE_COUNT, /* number of different types */ /* An alias for the size of the host register. */ @@ -286,6 +287,7 @@ typedef tcg_target_ulong TCGArg; typedef struct TCGv_i32_d *TCGv_i32; typedef struct TCGv_i64_d *TCGv_i64; typedef struct TCGv_ptr_d *TCGv_ptr; +typedef struct TCGv_v128_d *TCGv_v128; static inline TCGv_i32 QEMU_ARTIFICIAL MAKE_TCGV_I32(intptr_t i) { @@ -302,6 +304,11 @@ static inline TCGv_ptr QEMU_ARTIFICIAL MAKE_TCGV_PTR(intptr_t i) return (TCGv_ptr)i; } +static inline TCGv_v128 QEMU_ARTIFICIAL MAKE_TCGV_V128(intptr_t i) +{ + return (TCGv_v128)i; +} + static inline intptr_t QEMU_ARTIFICIAL GET_TCGV_I32(TCGv_i32 t) { return (intptr_t)t; @@ -317,6 +324,11 @@ static inline intptr_t QEMU_ARTIFICIAL GET_TCGV_PTR(TCGv_ptr t) return (intptr_t)t; } +static inline intptr_t QEMU_ARTIFICIAL GET_TCGV_V128(TCGv_v128 t) +{ + return (intptr_t)t; +} + #if TCG_TARGET_REG_BITS == 32 #define TCGV_LOW(t) MAKE_TCGV_I32(GET_TCGV_I64(t)) #define TCGV_HIGH(t) MAKE_TCGV_I32(GET_TCGV_I64(t) + 1) @@ -324,15 +336,18 @@ static inline intptr_t QEMU_ARTIFICIAL GET_TCGV_PTR(TCGv_ptr t) #define TCGV_EQUAL_I32(a, b) (GET_TCGV_I32(a) == GET_TCGV_I32(b)) #define TCGV_EQUAL_I64(a, b) (GET_TCGV_I64(a) == GET_TCGV_I64(b)) +#define TCGV_EQUAL_V128(a, b) (GET_TCGV_V128(a) == GET_TCGV_V128(b)) #define TCGV_EQUAL_PTR(a, b) (GET_TCGV_PTR(a) == GET_TCGV_PTR(b)) /* Dummy definition to avoid compiler warnings. */ #define TCGV_UNUSED_I32(x) x = MAKE_TCGV_I32(-1) #define TCGV_UNUSED_I64(x) x = MAKE_TCGV_I64(-1) +#define TCGV_UNUSED_V128(x) x = MAKE_TCGV_V128(-1) #define TCGV_UNUSED_PTR(x) x = MAKE_TCGV_PTR(-1) #define TCGV_IS_UNUSED_I32(x) (GET_TCGV_I32(x) == -1) #define TCGV_IS_UNUSED_I64(x) (GET_TCGV_I64(x) == -1) +#define TCGV_IS_UNUSED_V128(x) (GET_TCGV_V128(x) == -1) #define TCGV_IS_UNUSED_PTR(x) (GET_TCGV_PTR(x) == -1) /* call flags */ @@ -596,6 +611,19 @@ static inline TCGv_i64 tcg_temp_local_new_i64(void) void tcg_temp_free_i64(TCGv_i64 arg); char *tcg_get_arg_str_i64(TCGContext *s, char *buf, int buf_size, TCGv_i64 arg); +TCGv_v128 tcg_global_mem_new_v128(int reg, intptr_t offset, const char *name); +TCGv_v128 tcg_temp_new_internal_v128(int temp_local); +static inline TCGv_v128 tcg_temp_new_v128(void) +{ + return tcg_temp_new_internal_v128(0); +} +static inline TCGv_v128 tcg_temp_local_new_v128(void) +{ + return tcg_temp_new_internal_v128(1); +} +void tcg_temp_free_v128(TCGv_v128 arg); +char *tcg_get_arg_str_v128(TCGContext *s, char *buf, int buf_size, TCGv_v128 arg); + #if defined(CONFIG_DEBUG_TCG) /* If you call tcg_clear_temp_count() at the start of a section of * code which is not supposed to leak any TCG temporaries, then