From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail-lf1-x129.google.com (mail-lf1-x129.google.com [IPv6:2a00:1450:4864:20::129]) by sourceware.org (Postfix) with ESMTPS id 3B1553858C74 for ; Thu, 8 Sep 2022 18:26:40 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org 3B1553858C74 Authentication-Results: sourceware.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=gmail.com Received: by mail-lf1-x129.google.com with SMTP id i26so13421148lfp.11 for ; Thu, 08 Sep 2022 11:26:40 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=content-transfer-encoding:mime-version:message-id:date:subject:cc :to:from:sender:from:to:cc:subject:date; bh=qCtiEFeKqtBeKpSX8FI6VGNi//UgJ928LrKvU40qcA8=; b=YZ92CLOWu5Z2EkZcHpOz7/MyIv2lcc9m4l3fs6gZj3XarWqWF+21UnwgO65e0TwVmm XYAhLaF1o3tRHQ4CV+VfrlNb7oRvJOoYn9uwNb0FvlBXltDxhS/lvwhsC6yMl6VayETt vLyae2FuZiexs44kMeZA8NnrFCSHnYDis26cRwTOF/1pdxa0jAXilN71wRN8+KrjzsZ/ pIXC/sS8nDS/rSjmxqpVBprZUVZ1nVpyHpB/7nfa16/d8+fwX04EH9Ud4ikM+3fVexPD 2d5CXkqx+j0sSNSwOhO6euL39l3sWzQGLTLVYMSeNfi8PNkvozu0FNiG6hxQZt4zcmtp KvHw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=content-transfer-encoding:mime-version:message-id:date:subject:cc :to:from:sender:x-gm-message-state:from:to:cc:subject:date; bh=qCtiEFeKqtBeKpSX8FI6VGNi//UgJ928LrKvU40qcA8=; b=6SsNN1UDCjoL/vA7MVwCxsxXqYgiuFcGoljZyeygNzTubrEe68p5UfiHwbZbMCT2wT L2YAI4xmbrxqf/VEWIdToz3eqwRdSdsTYs9cxK3vfGsMBj+tMnRrGR7wTGZ0lVl2+VIb VxMdyLYT8eb/6aupe6ySGGPyxDLdPHg8x3iD0XXXkDyHL/h36yeozB9KE1GAITMXz4dD DDnCgdrtZQ2Ob7jRq3EpdlCVqlMxoDZNAxZvjUAMOQYz/6gv7edc//uApY0VGUxxcAWx gf8ZuQC6XhgAPBMLtcuJwj8dagAFNPLlmdzLRzEQql3E2z7AQ+Zn7uXbbn9Qm3sDjuxm /LgA== X-Gm-Message-State: ACgBeo0Tgh0XrVBzH6C6AclCCrniR1UitMaOntccq4+NyRzGR8MAlRYZ 56+4OIqQfyCrJyLS7QvgNJj4QvbWK44= X-Google-Smtp-Source: AA6agR7UrYUQsqLWAjuYSW83tnpIy6ulZVx04Z8rWU70wxAKBThwBMzghgxMrrExuzY45B7ARftBOw== X-Received: by 2002:ac2:544d:0:b0:494:7842:23c6 with SMTP id d13-20020ac2544d000000b00494784223c6mr3427420lfn.641.1662661598323; Thu, 08 Sep 2022 11:26:38 -0700 (PDT) Received: from localhost.localdomain (broadband-188-32-220-156.ip.moscow.rt.ru. [188.32.220.156]) by smtp.gmail.com with ESMTPSA id h5-20020ac250c5000000b0048a891e4d88sm3126243lfm.193.2022.09.08.11.26.37 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 08 Sep 2022 11:26:37 -0700 (PDT) Sender: Dmitry Selyutin From: Dmitry Selyutin To: binutils@sourceware.org Cc: Alan Modra , Luke Kenneth Casson Leighton , Dmitry Selyutin Subject: [PATCH] ppc/svp64: support svshape2 instruction Date: Thu, 8 Sep 2022 21:25:30 +0300 Message-Id: <20220908182530.118842-1-ghostmansd@gmail.com> X-Mailer: git-send-email 2.37.2 MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Spam-Status: No, score=-11.1 required=5.0 tests=BAYES_00,DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,FREEMAIL_FROM,GIT_PATCH_0,RCVD_IN_DNSWL_NONE,SPF_HELO_NONE,SPF_PASS,TXREP,T_SCC_BODY_TEXT_LINE autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on server2.sourceware.org List-Id: https://libre-soc.org/openpower/sv/ https://libre-soc.org/openpower/sv/remap/#svshape https://libre-soc.org/openpower/sv/remap/#svshape2 https://libre-soc.org/openpower/isa/simplev/ --- gas/testsuite/gas/ppc/svshape.s | 6 +++ opcodes/ppc-opc.c | 75 ++++++++++++++++++++++++++++++++- 2 files changed, 80 insertions(+), 1 deletion(-) diff --git a/gas/testsuite/gas/ppc/svshape.s b/gas/testsuite/gas/ppc/svshape.s index c83373ba372..39d4579a200 100644 --- a/gas/testsuite/gas/ppc/svshape.s +++ b/gas/testsuite/gas/ppc/svshape.s @@ -3,3 +3,9 @@ svshape 1,32,1,0,0 svshape 1,1,32,0,0 svshape 1,1,1,15,0 svshape 1,1,1,0,1 +svshape2 15,0,0,1,0,0 +svshape2 0,1,0,1,0,0 +svshape2 0,0,31,1,0,0 +svshape2 0,0,0,32,0,0 +svshape2 0,0,0,1,1,0 +svshape2 0,0,0,1,0,1 diff --git a/opcodes/ppc-opc.c b/opcodes/ppc-opc.c index 934b1bf4e85..fb7fb79cba4 100644 --- a/opcodes/ppc-opc.c +++ b/opcodes/ppc-opc.c @@ -2719,6 +2719,67 @@ extract_thds (uint64_t insn, return value; } + +static uint64_t +insert_SVrm (uint64_t insn, + int64_t value, + ppc_cpu_t dialect ATTRIBUTE_UNUSED, + const char **errmsg) +{ + /* + * 0b1000 and 0b1001 values are reserved for svshape2. + * svshape is SVM-form; svshape2 is SVM2-form. + * + * svshape XO: + * 0000-011001 + * 0001-011001 + * 0010-011001 + * 0011-011001 + * 0100-011001 + * 0101-011001 + * 0110-011001 + * 0111-011001 + * 1010-011001 + * 1011-011001 + * 1100-011001 + * 1101-011001 + * 1110-011001 + * 1111-011001 + * + * svshape2 XO: + * 100--011001 + * + * # 1.6.35 SVM-FORM + * |0 |6 |11 |16 |21 |25 |26 |31 | + * | PO | SVxd | SVyd | SVzd | SVrm |vf | XO | + * + * # 1.6.35.1 SVM2-FORM + * |0 |6 |10|11 |16 |21 |24|25 |26 |31 | + * | PO | offs |yx| rmm | SVd |XO |mm|sk | XO | + */ + if ((value == 8) || (value == 9)) + *errmsg = _("invalid SVrm value"); + + return insn | ((value & 0xf) << 7); +} + +static int64_t +extract_SVrm (uint64_t insn, + ppc_cpu_t dialect ATTRIBUTE_UNUSED, + int *invalid) +{ + int64_t value = (insn >> 21) & 0x1f; + + /* + * We should never meet the condition below in practice. + * svshape2 opcode and mask should always be matched first. + */ + if ((value == 8) || (value == 9)) + *invalid = 1; + + return value; +} + /* The operands table. @@ -3110,6 +3171,7 @@ const struct powerpc_operand powerpc_operands[] = /* The L field in a D or X form instruction. */ #define L IMM20 + 1 +#define yx10 L { 0x1, 21, NULL, NULL, 0 }, /* The optional L field in tlbie and tlbiel instructions. */ @@ -3864,13 +3926,16 @@ const struct powerpc_operand powerpc_operands[] = { 0x1f, 11, NULL, NULL, PPC_OPERAND_NONZERO }, #define SVrm SVzd + 1 - { 0xf, 7, NULL, NULL, 0 }, + { 0xf, 7, insert_SVrm, extract_SVrm, 0 }, #define mi1 SVrm + 1 { 0x3, 17, NULL, NULL, 0 }, #define mi2 mi1 + 1 { 0x3, 15, NULL, NULL, 0 }, + +#define SVo mi2 + 1 + { 0xf, 22, NULL, NULL, 0 }, }; const unsigned int num_powerpc_operands = (sizeof (powerpc_operands) @@ -4759,6 +4824,13 @@ const unsigned int num_powerpc_operands = (sizeof (powerpc_operands) | (((uint64_t)(xop)) & 0x3f)) #define SVM_MASK SVM (0x3f, 0x3f) +/* An SVM2 form instruction. */ +#define SVM2(op, xop) \ + (OP (op) \ + | (((((uint64_t)(xop)) >> 6) & 0x7) << 8) \ + | (((uint64_t)(xop)) & 0x3f)) +#define SVM2_MASK SVM2 (0x3f, 0x1ff) + /* An SVRM form instruction. */ #define SVRM(op, xop) \ (OP (op) \ @@ -6843,6 +6915,7 @@ const struct powerpc_opcode powerpc_opcodes[] = { {"svstep", SVL(22,19,0), SVL_MASK, SVP64, PPCVLE, {RT, SVi, vf}}, {"svstep.", SVL(22,19,1), SVL_MASK, SVP64, PPCVLE, {RT, SVi, vf}}, +{"svshape2", SVM2(22,281), SVM2_MASK, SVP64, PPCVLE, {SVo, yx10, rmm, SVd, sk, mm}}, {"svshape", SVM(22,25), SVM_MASK, SVP64, PPCVLE, {SVxd, SVyd, SVzd, SVrm, vf}}, {"setvl", SVL(22,27,0), SVL_MASK, SVP64, PPCVLE, {RT, RA, SVi, vf, vs, ms}}, -- 2.37.2