From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mga17.intel.com (mga17.intel.com [192.55.52.151]) by sourceware.org (Postfix) with ESMTPS id 54B02393AC08 for ; Thu, 29 Jul 2021 08:39:37 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org 54B02393AC08 X-IronPort-AV: E=McAfee;i="6200,9189,10059"; a="193111456" X-IronPort-AV: E=Sophos;i="5.84,278,1620716400"; d="scan'208";a="193111456" Received: from fmsmga007.fm.intel.com ([10.253.24.52]) by fmsmga107.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 29 Jul 2021 01:39:36 -0700 X-IronPort-AV: E=Sophos;i="5.84,278,1620716400"; d="scan'208";a="438159068" Received: from mulvlfelix.iul.intel.com (HELO localhost) ([172.28.48.31]) by fmsmga007-auth.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 29 Jul 2021 01:39:35 -0700 From: Felix Willgerodt To: gdb-patches@sourceware.org Subject: [PATCH 2/2] gdb: Enable finish command and inferior calls for _Float16 on amd64 and i386. Date: Thu, 29 Jul 2021 10:38:33 +0200 Message-Id: <20210729083833.2483704-3-felix.willgerodt@intel.com> X-Mailer: git-send-email 2.25.4 In-Reply-To: <20210729083833.2483704-1-felix.willgerodt@intel.com> References: <20210729083833.2483704-1-felix.willgerodt@intel.com> MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit X-Spam-Status: No, score=-9.4 required=5.0 tests=BAYES_00, GIT_PATCH_0, KAM_DMARC_NONE, KAM_DMARC_STATUS, KAM_LAZY_DOMAIN_SECURITY, KAM_SHORT, SPF_HELO_NONE, SPF_NONE, TXREP autolearn=ham autolearn_force=no version=3.4.4 X-Spam-Checker-Version: SpamAssassin 3.4.4 (2020-01-24) on server2.sourceware.org X-BeenThere: gdb-patches@sourceware.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Gdb-patches mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Thu, 29 Jul 2021 08:39:39 -0000 Values of type _Float16 and _Float16 _Complex can now be used on CPUs with AVX512-FP16 support. Return values of those types are located in XMM0. Compiler support for gcc and clang is in progress, see e.g.: https://gcc.gnu.org/pipermail/gcc-patches/2021-July/574117.html gdb/ChangeLog: 2021-07-21 Felix Willgerodt * amd64-tdep.c (amd64_classify): Classify _Float16 and _Float16 _Complex as AMD64_SSE. * i386-tdep.c (i386_extract_return_value): Read _Float16 and _Float16 _Complex from xmm0. gdb/testsuite/ChangeLog: 2021-07-21 Felix Willgerodt * gdb.arch/x86-avx512fp16-abi.c: New file. * gdb.arch/x86-avx512fp16-abi.exp: New file. --- gdb/amd64-tdep.c | 12 ++-- gdb/i386-tdep.c | 9 ++- gdb/testsuite/gdb.arch/x86-avx512fp16-abi.c | 38 +++++++++++ gdb/testsuite/gdb.arch/x86-avx512fp16-abi.exp | 63 +++++++++++++++++++ 4 files changed, 115 insertions(+), 7 deletions(-) create mode 100644 gdb/testsuite/gdb.arch/x86-avx512fp16-abi.c create mode 100644 gdb/testsuite/gdb.arch/x86-avx512fp16-abi.exp diff --git a/gdb/amd64-tdep.c b/gdb/amd64-tdep.c index c028e1bd0f6..129f07e598d 100644 --- a/gdb/amd64-tdep.c +++ b/gdb/amd64-tdep.c @@ -728,10 +728,10 @@ amd64_classify (struct type *type, enum amd64_reg_class theclass[2]) && (len == 1 || len == 2 || len == 4 || len == 8)) theclass[0] = AMD64_INTEGER; - /* Arguments of types float, double, _Decimal32, _Decimal64 and __m64 - are in class SSE. */ + /* Arguments of types _Float16, float, double, _Decimal32, _Decimal64 and + __m64 are in class SSE. */ else if ((code == TYPE_CODE_FLT || code == TYPE_CODE_DECFLOAT) - && (len == 4 || len == 8)) + && (len == 2 || len == 4 || len == 8)) /* FIXME: __m64 . */ theclass[0] = AMD64_SSE; @@ -749,8 +749,8 @@ amd64_classify (struct type *type, enum amd64_reg_class theclass[2]) /* Class X87 and X87UP. */ theclass[0] = AMD64_X87, theclass[1] = AMD64_X87UP; - /* Arguments of complex T where T is one of the types float or - double get treated as if they are implemented as: + /* Arguments of complex T - where T is one of the types _Float16, float or + double - get treated as if they are implemented as: struct complexT { T real; @@ -758,7 +758,7 @@ amd64_classify (struct type *type, enum amd64_reg_class theclass[2]) }; */ - else if (code == TYPE_CODE_COMPLEX && len == 8) + else if (code == TYPE_CODE_COMPLEX && (len == 8 || len == 4)) theclass[0] = AMD64_SSE; else if (code == TYPE_CODE_COMPLEX && len == 16) theclass[0] = theclass[1] = AMD64_SSE; diff --git a/gdb/i386-tdep.c b/gdb/i386-tdep.c index c2835a2458d..6c7f7f7592d 100644 --- a/gdb/i386-tdep.c +++ b/gdb/i386-tdep.c @@ -2818,7 +2818,14 @@ i386_extract_return_value (struct gdbarch *gdbarch, struct type *type, int len = TYPE_LENGTH (type); gdb_byte buf[I386_MAX_REGISTER_SIZE]; - if (type->code () == TYPE_CODE_FLT) + /* _FLoat16 and _Float16 _Complex values are returned via xmm0. */ + if (((type->code () == TYPE_CODE_FLT) && len == 2) + || ((type->code () == TYPE_CODE_COMPLEX) && len == 4)) + { + regcache->raw_read (I387_XMM0_REGNUM (tdep), valbuf); + return; + } + else if (type->code () == TYPE_CODE_FLT) { if (tdep->st0_regnum < 0) { diff --git a/gdb/testsuite/gdb.arch/x86-avx512fp16-abi.c b/gdb/testsuite/gdb.arch/x86-avx512fp16-abi.c new file mode 100644 index 00000000000..c5b188ea546 --- /dev/null +++ b/gdb/testsuite/gdb.arch/x86-avx512fp16-abi.c @@ -0,0 +1,38 @@ +/* Test program for bfloat16 of AVX 512 registers. + + Copyright 2021 Free Software Foundation, Inc. + + This file is part of GDB. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program 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 General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ +#include + +_Float16 +square (_Float16 num) { + return num * num; /* BP1. */ +} + +_Float16 _Complex +plus (_Float16 _Complex num) { + return num + (2.5 + 0.5I); /* BP2. */ +} + +int +main () +{ + _Float16 a = square (1.25); + _Float16 _Complex b = 6.25 + I; + _Float16 _Complex ret = plus (b); /* BP3. */ + return 0; +} diff --git a/gdb/testsuite/gdb.arch/x86-avx512fp16-abi.exp b/gdb/testsuite/gdb.arch/x86-avx512fp16-abi.exp new file mode 100644 index 00000000000..61cd189a3dd --- /dev/null +++ b/gdb/testsuite/gdb.arch/x86-avx512fp16-abi.exp @@ -0,0 +1,63 @@ +# Copyright 2021 Free Software Foundation, Inc. + +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 3 of the License, or +# (at your option) any later version. +# +# This program 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 General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +# Test support for _Float16 parameters and return values. + +if { [skip_avx512fp16_tests] } { + unsupported "target does not support AVX512fp16" + return -1 +} + +standard_testfile + +if { [prepare_for_testing "failed to prepare" ${testfile} ${srcfile} \ + {debug additional_flags="-mavx512fp16"}] } { + return -1 +} + +if { ![runto_main] } { + unsupported "could not run to main" + return -1 +} + +gdb_test "p square(2.2)" "= 4\\.8359" + +set line1 [gdb_get_line_number "BP1"] +set line2 [gdb_get_line_number "BP2"] +set line3 [gdb_get_line_number "BP3"] +gdb_breakpoint $line1 +gdb_breakpoint $line3 + +gdb_continue_to_breakpoint "line1" ".*$srcfile:$line1.*" + +with_test_prefix "real" { + gdb_test "p num" "= 1\\.25" + gdb_test "ptype num" "type = _Float16" + gdb_test "finish" "Value returned is.*= 1\\.5625" +} + +gdb_continue_to_breakpoint "line3" ".*$srcfile:$line3.*" +gdb_test "p plus(b)" "= 8\\.75 \\+ 1\\.5i" + +gdb_breakpoint $line2 +gdb_continue_to_breakpoint "line2" ".*$srcfile:$line2.*" + +with_test_prefix "complex" { + gdb_test "p num" "= 6\\.25 \\+ 1i" + gdb_test "ptype num" "type = complex _Float16" + gdb_test "finish" "Value returned is.*= 8\\.75 \\+ 1\\.5i" +} + +gdb_continue_to_end -- 2.25.4 Intel Deutschland GmbH Registered Address: Am Campeon 10, 85579 Neubiberg, Germany Tel: +49 89 99 8853-0, www.intel.de Managing Directors: Christin Eisenschmid, Sharon Heck, Tiffany Doon Silva Chairperson of the Supervisory Board: Nicole Lau Registered Office: Munich Commercial Register: Amtsgericht Muenchen HRB 186928