From patchwork Tue Dec 2 11:17:37 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: mengqinggang X-Patchwork-Id: 125755 Return-Path: X-Original-To: patchwork@sourceware.org Delivered-To: patchwork@sourceware.org Received: from vm01.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id 8B99E4BBCDB0 for ; Tue, 2 Dec 2025 11:23:08 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 8B99E4BBCDB0 X-Original-To: binutils@sourceware.org Delivered-To: binutils@sourceware.org Received: from mail.loongson.cn (mail.loongson.cn [114.242.206.163]) by sourceware.org (Postfix) with ESMTP id 03C884BB58DF for ; Tue, 2 Dec 2025 11:21:21 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org 03C884BB58DF Authentication-Results: sourceware.org; dmarc=none (p=none dis=none) header.from=loongson.cn Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=loongson.cn ARC-Filter: OpenARC Filter v1.0.0 sourceware.org 03C884BB58DF Authentication-Results: server2.sourceware.org; arc=none smtp.remote-ip=114.242.206.163 ARC-Seal: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1764674483; cv=none; b=blwLW2dUWs/EH9G5GMHPEPCmyBvIjvksA2XLpVaBiaWoJlaZc0keosITiFwu0jkp7i/9UpxNZqw9iC2ixfWiePJi8H6y6BQAv+am2DXf0NTJBHanIxqdVkVHsC62nOGuiZ6QL9IUD0Go/+eRrKzTfiBH2B7QO61VV7Q+IfIlt4o= ARC-Message-Signature: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1764674483; c=relaxed/simple; bh=VrKQeuJjny96K3rG1IEyuNRtfaXQIgwQ/MikPtXnHjk=; h=From:To:Subject:Date:Message-Id:MIME-Version; b=gn+GRwB6IGAoL7D+4i7kRR5ZAqTx0R/5vijX/2zTEetik1z82WL95wt6b/71yX9HEKVEA37OhI9v4+HfakHSHA+ojwGc0+hZ1+9g3bBWmtCTY2MHPvvwXc5RQu2eMaP4K4yj5i+QtKPJTsfp9r7Pe1uotCzWl9jMWBzGffBXYVU= ARC-Authentication-Results: i=1; server2.sourceware.org DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 03C884BB58DF Received: from loongson.cn (unknown [10.2.6.7]) by gateway (Coremail) with SMTP id _____8BxF9Gfyy5pC0kqAA--.25553S3; Tue, 02 Dec 2025 19:21:03 +0800 (CST) Received: from amd9754.. (unknown [10.2.6.7]) by front1 (Coremail) with SMTP id qMiowJBxpeSeyy5pbXxEAQ--.50048S2; Tue, 02 Dec 2025 19:21:03 +0800 (CST) From: mengqinggang To: binutils@sourceware.org Cc: xuchenghua@loongson.cn, chenglulu@loongson.cn, cailulu@loongson.cn, xry111@xry111.site, i.swmail@xen0n.name, maskray@google.com, luweining@loongson.cn, hejinyang@loongson.cn, c@jia.je, mengqinggang@loongson.cn Subject: [PATCH v2 04/12] LoongArch: Enable all instructions defaultly on LA32/LA64 Date: Tue, 2 Dec 2025 19:17:37 +0800 Message-Id: <20251202111745.1558349-5-mengqinggang@loongson.cn> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20251202111745.1558349-1-mengqinggang@loongson.cn> References: <20251202111745.1558349-1-mengqinggang@loongson.cn> MIME-Version: 1.0 X-CM-TRANSID: qMiowJBxpeSeyy5pbXxEAQ--.50048S2 X-CM-SenderInfo: 5phqw15lqjwttqj6z05rqj20fqof0/ X-Coremail-Antispam: 1Uk129KBjDUn29KB7ZKAUJUUUUU529EdanIXcx71UUUUU7KY7 ZEXasCq-sGcSsGvfJ3UbIjqfuFe4nvWSU5nxnvy29KBjDU0xBIdaVrnUUvcSsGvfC2Kfnx nUUI43ZEXa7xR_UUUUUUUUU== X-Spam-Status: No, score=-12.9 required=5.0 tests=BAYES_00, GIT_PATCH_0, KAM_DMARC_STATUS, RCVD_IN_DNSWL_BLOCKED, RCVD_IN_VALIDITY_RPBL_BLOCKED, RCVD_IN_VALIDITY_SAFE_BLOCKED, SPF_HELO_NONE, SPF_PASS, TXREP autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on sourceware.org X-BeenThere: binutils@sourceware.org X-Mailman-Version: 2.1.30 Precedence: list List-Id: Binutils mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: binutils-bounces~patchwork=sourceware.org@sourceware.org Glibc checks LSX/LASX support when configure. Kernel has float instructions but with -msoft-float option. --- gas/config/tc-loongarch.c | 85 +++++++++++++++++++-------------------- 1 file changed, 42 insertions(+), 43 deletions(-) diff --git a/gas/config/tc-loongarch.c b/gas/config/tc-loongarch.c index dc03956d792..a37cde9b38c 100644 --- a/gas/config/tc-loongarch.c +++ b/gas/config/tc-loongarch.c @@ -27,6 +27,7 @@ #include "opcode/loongarch.h" #include "obj-elf.h" #include "bfd/elfxx-loongarch.h" +#include "config.h" #include #include #include @@ -181,34 +182,24 @@ int md_parse_option (int c, const char *arg) { int ret = 1; - char lp64[256] = ""; - char ilp32[256] = ""; - - lp64['s'] = lp64['S'] = EF_LOONGARCH_ABI_SOFT_FLOAT; - lp64['f'] = lp64['F'] = EF_LOONGARCH_ABI_SINGLE_FLOAT; - lp64['d'] = lp64['D'] = EF_LOONGARCH_ABI_DOUBLE_FLOAT; - - ilp32['s'] = ilp32['S'] = EF_LOONGARCH_ABI_SOFT_FLOAT; - ilp32['f'] = ilp32['F'] = EF_LOONGARCH_ABI_SINGLE_FLOAT; - ilp32['d'] = ilp32['D'] = EF_LOONGARCH_ABI_DOUBLE_FLOAT; + char fabi[256] = ""; + fabi['s'] = fabi['S'] = EF_LOONGARCH_ABI_SOFT_FLOAT; + fabi['f'] = fabi['F'] = EF_LOONGARCH_ABI_SINGLE_FLOAT; + fabi['d'] = fabi['D'] = EF_LOONGARCH_ABI_DOUBLE_FLOAT; switch (c) { case OPTION_ABI: - if (strncasecmp (arg, "lp64", 4) == 0 && lp64[arg[4] & 0xff] != 0) + if (strncasecmp (arg, "lp64", 4) == 0 && fabi[arg[4] & 0xff] != 0) { LARCH_opts.ase_ilp32 = 1; LARCH_opts.ase_lp64 = 1; - LARCH_opts.ase_lsx = 1; - LARCH_opts.ase_lasx = 1; - LARCH_opts.ase_lvz = 1; - LARCH_opts.ase_lbt = 1; - LARCH_opts.ase_abi = lp64[arg[4] & 0xff]; + LARCH_opts.ase_abi = fabi[arg[4] & 0xff]; } - else if (strncasecmp (arg, "ilp32", 5) == 0 && ilp32[arg[5] & 0xff] != 0) + else if (strncasecmp (arg, "ilp32", 5) == 0 && fabi[arg[5] & 0xff] != 0) { - LARCH_opts.ase_abi = ilp32[arg[5] & 0xff]; LARCH_opts.ase_ilp32 = 1; + LARCH_opts.ase_abi = fabi[arg[5] & 0xff]; } else ret = 0; @@ -284,43 +275,51 @@ static struct htab *cfi_f_htab = NULL; void loongarch_after_parse_args () { - /* Set default ABI/ISA LP64D. */ + /* If no -mabi specified, set ABI by default_arch. */ if (!LARCH_opts.ase_ilp32) { if (strcmp (default_arch, "loongarch64") == 0) { - LARCH_opts.ase_abi = EF_LOONGARCH_ABI_DOUBLE_FLOAT; LARCH_opts.ase_ilp32 = 1; LARCH_opts.ase_lp64 = 1; - LARCH_opts.ase_lsx = 1; - LARCH_opts.ase_lasx = 1; - LARCH_opts.ase_lvz = 1; - LARCH_opts.ase_lbt = 1; } else if (strcmp (default_arch, "loongarch32") == 0) - { - LARCH_opts.ase_abi = EF_LOONGARCH_ABI_DOUBLE_FLOAT; LARCH_opts.ase_ilp32 = 1; - } else as_bad ("unknown default architecture `%s'", default_arch); } - LARCH_opts.ase_abi |= EF_LOONGARCH_OBJABI_V1; - /* Set default ISA double-float. */ - if (!LARCH_opts.ase_nf - && !LARCH_opts.ase_sf - && !LARCH_opts.ase_df) + /* Enable all instructions defaultly. + Glibc checks LSX/LASX support when configure. + Kernel has float instructions but with -msoft-float option. + TODO: SPlit la32/la64 instructions. + TODO: Instruction selection and macro expansion may need + to be controlled by different variables. */ + LARCH_opts.ase_sf = 1; + LARCH_opts.ase_df = 1; + LARCH_opts.ase_lsx = 1; + LARCH_opts.ase_lasx = 1; + LARCH_opts.ase_lvz = 1; + LARCH_opts.ase_lbt = 1; + + /* If no -mabi specified, set e_flags base ABI by target os. */ + if (!LARCH_opts.ase_abi) { - LARCH_opts.ase_sf = 1; - LARCH_opts.ase_df = 1; + if (strcmp (TARGET_OS, "linux-gnusf") == 0) + LARCH_opts.ase_abi = EF_LOONGARCH_ABI_SOFT_FLOAT; + else if (strcmp (TARGET_OS, "linux-gnuf32") == 0) + LARCH_opts.ase_abi = EF_LOONGARCH_ABI_SINGLE_FLOAT; + else if (strcmp (TARGET_OS, "linux-gnu") == 0) + LARCH_opts.ase_abi = EF_LOONGARCH_ABI_DOUBLE_FLOAT; + else + as_fatal (_("unsupport TARGET_OS %s"), TARGET_OS); } - size_t i; - - assert(LARCH_opts.ase_ilp32); + /* Set eflags ABI version to v1 (ABI 2.0). */ + LARCH_opts.ase_abi |= EF_LOONGARCH_OBJABI_V1; /* Init ilp32/lp64 registers names. */ + size_t i; if (!r_htab) r_htab = str_htab_create (); if (!r_deprecated_htab) @@ -390,12 +389,12 @@ loongarch_after_parse_args () str_hash_insert_int (f_deprecated_htab, loongarch_f_alias_deprecated[i], i, 0); - /* The .cfi directive supports register aliases without the "$" prefix. */ - for (i = 0; i < ARRAY_SIZE (loongarch_f_cfi_name); i++) - { - str_hash_insert_int (cfi_f_htab, loongarch_f_cfi_name[i], i, 0); - str_hash_insert_int (cfi_f_htab, loongarch_f_cfi_name_alias[i], i, 0); - } + /* The .cfi directive supports register aliases without the "$" prefix. */ + for (i = 0; i < ARRAY_SIZE (loongarch_f_cfi_name); i++) + { + str_hash_insert_int (cfi_f_htab, loongarch_f_cfi_name[i], i, 0); + str_hash_insert_int (cfi_f_htab, loongarch_f_cfi_name_alias[i], i, 0); + } if (!fc_htab) fc_htab = str_htab_create ();