From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail-vk1-xa2a.google.com (mail-vk1-xa2a.google.com [IPv6:2607:f8b0:4864:20::a2a]) by sourceware.org (Postfix) with ESMTPS id DDBA13858C56 for ; Wed, 2 Nov 2022 17:19:27 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org DDBA13858C56 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-vk1-xa2a.google.com with SMTP id i15so9324163vka.0 for ; Wed, 02 Nov 2022 10:19:27 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=cc:to:subject:message-id:date:from:in-reply-to:references :mime-version:from:to:cc:subject:date:message-id:reply-to; bh=z7Q06E/sUgDMKoNHqmWCjyRVAWpSPLy1Kq7AwJgLBHU=; b=l9O9ywdavI8Ct217N3wBY1QSRCLrXbrK04BrI1leKVaDknpuRxnuX6Mn80QIT6VqY+ gW/8aPmAPKVp9rXFpDTga2wO0UoWeMYTX1yhtQFk5+IMeF7lYQrL2P+RRUCI4XqIMOd5 esxjdmdhcU98zJFu0uBSg02zNAfgKW/T48zIBDAr6oR0zdoiyouZDX8Ea84D6EYdnhD8 aNzeveMmqD+w2bjFiBqG2bG6ywwq+fYqUdIw/Xj8ySTIqpmcQK7oScQLcPxsGR1YAJKX GH4Rh/yipPepo6tX//dT3D5+Ei8lO2XLkCeQYIAzIboIVQ23KJ8xoReT2uhaRL1SOXft 3MCA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=cc:to:subject:message-id:date:from:in-reply-to:references :mime-version:x-gm-message-state:from:to:cc:subject:date:message-id :reply-to; bh=z7Q06E/sUgDMKoNHqmWCjyRVAWpSPLy1Kq7AwJgLBHU=; b=j8WlrKhY8KS+ZbNqaEX6Wb+RvsaziFm9AD0hENJYuyimYRU6/MmFmprAPj4dk3kmrv pLvbR9zII37pWXlkBagQQn0GMOiG3FVjyQBhsdGLvKg9WS0d7tyIDKOK61AseOezd/mH aQ4VrjwzC1pMcoNBISS5a+oEA5svvfZTBqD4aJsEfexK8BB39rwlucQkZsfJEV1Rocbl r11qM4/9ANqjAMb59sWFiJLvlkzJrCbQSWXK3CktkfO/wVxvV/nsXmAIpJqQeHvH3k1t 77P/f5LSIg1u5jTNVsINbQ7v0iVXaPWaOlBdZjCIwC4mEecCT7r1kg7MDqPTvZRMNzPO L4IQ== X-Gm-Message-State: ACrzQf1C57KiqDW+BiP3UnWEdGBXnhzRcZmet7ZADnqytN2lOwNaraDn 4x/nBAJfCkNFvRzYDYnogwKhrarOtBdMldKntyM= X-Google-Smtp-Source: AMsMyM6lM0ebalHDs6f1xCXozdT0y2py43lLpzZLnb6NOfribwOSD0nvpQ0j+lUC2bkEwxHSRNUKD/n1Wc7/Q5m/gWA= X-Received: by 2002:a1f:1dc6:0:b0:3ab:5e82:64fb with SMTP id d189-20020a1f1dc6000000b003ab5e8264fbmr13119640vkd.11.1667409566887; Wed, 02 Nov 2022 10:19:26 -0700 (PDT) MIME-Version: 1.0 References: <20221102125235.2325572-1-jiawei@iscas.ac.cn> <20221102125235.2325572-3-jiawei@iscas.ac.cn> In-Reply-To: <20221102125235.2325572-3-jiawei@iscas.ac.cn> From: Kito Cheng Date: Wed, 2 Nov 2022 10:19:15 -0700 Message-ID: Subject: Re: [RFC] RISC-V: Add profile supports. To: jiawei Cc: gcc-patches@gcc.gnu.org, philipp.tomsich@vrull.eu, wuwei2016@iscas.ac.cn, kito.cheng@sifive.com Content-Type: text/plain; charset="UTF-8" X-Spam-Status: No, score=-8.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 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: Could you add some test cases? --- Parsing logic is kind of too adhoc, I would prefer using something like the following code to prevent magic pointer arithmetic like p+6: something like this: Table of all profile names = {"RVA20U64", riscv_profile::RVA20U64, ...} const char *rva20u64[] = {"m", "a", "f", "d",... NULL}; table of profile content = { {riscv_profile::RVA20U64, rva20u64}, .. } parse march () { if march is startswith else if ((profile = parse_proile(march)) != risv_profile::NOT_PROFILE) handle_profile (profile) else error } handle_profile (profile) { use table of profile content to update ext. } On Wed, Nov 2, 2022 at 5:54 AM jiawei wrote: >handle_profile > Add two new function to handle profile input, > "parse_profile" will check if a input into -march is > legal, if it is then "handle_profile" will check the > profile's type[I/M/A], year[20/22] and mode[U/S/M], > set different extensions combine, just deal mandatory > part currently. > > gcc/ChangeLog: > > * common/config/riscv/riscv-common.cc > (riscv_subset_list::parse_profile): Check if profile name is valid or not. > (riscv_subset_list::parse_std_ext): If input of -march option is > a profile,skip first ISA check. > (riscv_subset_list::parse): Handle rofile input in -march. > (riscv_subset_list::handle_profile): Handle differen profiles > expand to extensions. > * config/riscv/riscv-subset.h: New function prototypes. > > > --- > gcc/common/config/riscv/riscv-common.cc | 95 +++++++++++++++++++++++-- > gcc/config/riscv/riscv-subset.h | 5 +- > 2 files changed, 94 insertions(+), 6 deletions(-) > > diff --git a/gcc/common/config/riscv/riscv-common.cc b/gcc/common/config/riscv/riscv-common.cc > index 602491c638d..da06bd89144 100644 > --- a/gcc/common/config/riscv/riscv-common.cc > +++ b/gcc/common/config/riscv/riscv-common.cc > @@ -777,6 +777,35 @@ riscv_subset_list::parsing_subset_version (const char *ext, > return p; > } > > +/* Parsing function for profile. > + > + Return Value: > + Points to the end of profile. > + > + Arguments: > + `p`: Current parsing position. */ > + > +const char * > +riscv_subset_list::parse_profile (const char *p) > +{ > + if(*p == 'I' || *p == 'M' || *p == 'A'){ > + p++; > + if(startswith (p, "20") || startswith (p, "22")) > + p += 2; > + if (*p == 'U' || *p == 'S' || *p == 'M') > + p++; > + if(startswith (p, "64") || startswith (p, "32")){ > + p += 2; > + riscv_subset_list::handle_profile(p-6, p-4, p-3); > + return p; > + } > + } > + else > + error_at (m_loc, "%<-march=%s%>: Invalid profile.", m_arch); > + return NULL; > +} > + > + > /* Parsing function for standard extensions.parse_std_ext > It's sort of too adhoc parsing the profile name, I would prefer using something like the following code to prevent magic pointer arithmetic like p+6. something Table of all profile names = {"RVA20U64", riscv_profile::RVA20U64, ...} const char *rva20u64[] = {"m", "a", "f", "d",... NULL}; table of profile content = { {riscv_profile::RVA20U64, rva20u64}, .. } parse march () { if march is startswith else if ((profile = parse_proile(march)) != risv_profile::NOT_PROFILE) handle_profile (profile) else error } handle_profile (profile) { ad } > Return Value: > @@ -786,7 +815,7 @@ riscv_subset_list::parsing_subset_version (const char *ext, > `p`: Current parsing position. */ > > const char * > -riscv_subset_list::parse_std_ext (const char *p) > +riscv_subset_list::parse_std_ext (const char *p, bool isprofile) > { > const char *all_std_exts = riscv_supported_std_ext (); > const char *std_exts = all_std_exts; > @@ -795,8 +824,8 @@ riscv_subset_list::parse_std_ext (const char *p) > unsigned minor_version = 0; > char std_ext = '\0'; > bool explicit_version_p = false; > - > - /* First letter must start with i, e or g. */ > + if (!isprofile){ > + /* First letter must start with i, e or g. */ > switch (*p) > { > case 'i': > @@ -850,6 +879,7 @@ riscv_subset_list::parse_std_ext (const char *p) > "% or %", m_arch); > return NULL; > } > +} > > while (p != NULL && *p) > { > @@ -1093,6 +1123,7 @@ riscv_subset_list::parse (const char *arch, location_t loc) > riscv_subset_list *subset_list = new riscv_subset_list (arch, loc); > riscv_subset_t *itr; > const char *p = arch; > + bool isprofile = false; > if (startswith (p, "rv32")) > { > subset_list->m_xlen = 32; > @@ -1103,15 +1134,26 @@ riscv_subset_list::parse (const char *arch, location_t loc) > subset_list->m_xlen = 64; > p += 4; > } > + else if (startswith (p, "RV")) > + { > + if (startswith (p+6, "64")) > + subset_list->m_xlen = 64; > + else > + subset_list->m_xlen = 32; > + p += 2; > + /* Parsing profile name. */ > + p = subset_list->parse_profile (p); > + isprofile = true;handle_profile > + } > else > { > - error_at (loc, "%<-march=%s%>: ISA string must begin with rv32 or rv64", > + error_at (loc, "%<-march=%s%>: ISA string must begin with rv32 , rv64 or a profile", > arch); > goto fail; > } > > /* Parsing standard extension. */ > - p = subset_list->parse_std_ext (p); > + p = subset_list->parse_std_ext (p,isprofile); > > if (p == NULL) > goto fail; > @@ -1349,6 +1391,49 @@ riscv_handle_option (struct gcc_options *opts, > } > } > > +/* Expand profile with defined mandatory extensions, > + M-type/mode is emtpy and set as base right now. */ > +void riscv_subset_list::handle_profile(const char *profile_type, > + const char *profile_year, > + const char *profile_mode) > +{ > + add ("i", false); > + if(*profile_type == 'A'){ > + add ("m", false); > + add ("a", false); > + add ("f", false); > + add ("d", false); > + add ("c", false); > + add ("ziccamoa", false); > + add ("ziccif", false); > + add ("zicclsm", false); > + add ("ziccrse", false); > + add ("zicntr", false); > + add ("zicsr", false); > + > + if(*profile_mode == 'S') > + add ("zifencei", false); > + > + if(*profile_year == '2') > + { > + add ("zihintpause", false); > + add ("zihpm", false); > + add ("zba", false); > + add ("zbb", false); > + add ("zbs", false); > + add ("zicbom", false); > + add ("zicbop", false); > + add ("zicboz", false); > + add ("zfhmin", false); > + add ("zkt", false); > + if(*profile_mode == 'S'){ > + add ("svpbmt", false); > + add ("svinval", false); > + } > + } > + } > +} > + > /* Expand arch string with implied extensions. */ > > const char * > diff --git a/gcc/config/riscv/riscv-subset.h b/gcc/config/riscv/riscv-subset.h > index 0bb3a9d29d0..303be5ed9ed 100644 > --- a/gcc/config/riscv/riscv-subset.h > +++ b/gcc/config/riscv/riscv-subset.h > @@ -62,13 +62,16 @@ private: > const char *parsing_subset_version (const char *, const char *, unsigned *, > unsigned *, bool, bool *); > > - const char *parse_std_ext (const char *); > + const char *parse_profile (const char *); > + > + const char *parse_std_ext (const char *, bool); > > const char *parse_multiletter_ext (const char *, const char *, > const char *); > > void handle_implied_ext (riscv_subset_t *); > void handle_combine_ext (); > + void handle_profile(const char *, const char *, const char *); > > public: > ~riscv_subset_list (); > -- > 2.25.1 >