Skip to content

Commit

Permalink
gdb: Enable finish command and inferior calls for _Float16 on amd64 a…
Browse files Browse the repository at this point in the history
…nd i386.

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  <[email protected]>

	* 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  <[email protected]>

	* gdb.arch/x86-avx512fp16-abi.c: New file.
	* gdb.arch/x86-avx512fp16-abi.exp: New file.
  • Loading branch information
felix-willgerodt committed Sep 3, 2021
1 parent 8661f70 commit 0b99a66
Show file tree
Hide file tree
Showing 4 changed files with 115 additions and 7 deletions.
12 changes: 6 additions & 6 deletions gdb/amd64-tdep.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;

Expand All @@ -749,16 +749,16 @@ 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;
T imag;
};
*/
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;
Expand Down
9 changes: 8 additions & 1 deletion gdb/i386-tdep.c
Original file line number Diff line number Diff line change
Expand Up @@ -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)
{
Expand Down
38 changes: 38 additions & 0 deletions gdb/testsuite/gdb.arch/x86-avx512fp16-abi.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
/* Test program for _Float16 parameters and return values.
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 <http://www.gnu.org/licenses/>. */
#include <complex.h>

_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;
}
63 changes: 63 additions & 0 deletions gdb/testsuite/gdb.arch/x86-avx512fp16-abi.exp
Original file line number Diff line number Diff line change
@@ -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 <http://www.gnu.org/licenses/>.

# 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

0 comments on commit 0b99a66

Please sign in to comment.