[PATCH 2/3] s390: gas: Support vector register names in CFI directives
Jens Remus
jremus@linux.ibm.com
Mon Jan 12 15:30:38 GMT 2026
Convert vector register names v0-v31 to DWARF register numbers when used
in CFI directives. Convert a vector register number (0..31) to its
respective DWARF register number (16..31, 68..83) as specified in the
s390 64-bit (s390x) ELF ABI [1] as follows:
Right rotate the least significant three bits and add 16 for register
numbers 0..15 or 68 for register numbers 16..31.
Add a test case for the use of vector register (VR) names in CFI
directives.
[1]: s390x ELF ABI, https://github.com/IBM/s390x-abi/releases
gas/
* config/tc-s390.c (tc_s390_regname_to_dw2regnum): Convert
vector register names (v0..v31) to DWARF register numbers.
gas/testsuite/
* gas/s390/cfi-regnames.d: Add test for VR names in in CFI
directives.
* gas/s390/cfi-regnames.s: Likewise.
* gas/s390/cfi-regnames-err.l: Likewise.
* gas/s390/cfi-regnames-err.s: Likewise.
Signed-off-by: Jens Remus <jremus@linux.ibm.com>
---
gas/config/tc-s390.c | 12 ++++++-----
gas/testsuite/gas/s390/cfi-regnames-err.l | 3 +++
gas/testsuite/gas/s390/cfi-regnames-err.s | 3 +++
gas/testsuite/gas/s390/cfi-regnames.d | 26 +++++++++++++++++++++++
gas/testsuite/gas/s390/cfi-regnames.s | 24 +++++++++++++++++++++
5 files changed, 63 insertions(+), 5 deletions(-)
diff --git a/gas/config/tc-s390.c b/gas/config/tc-s390.c
index 55cd43db3a16..03af15b8056f 100644
--- a/gas/config/tc-s390.c
+++ b/gas/config/tc-s390.c
@@ -2878,16 +2878,18 @@ tc_s390_regname_to_dw2regnum (char *regname)
if (regname[0] != 'c' && regname[0] != 'a')
{
regnum = reg_name_search (regname);
- if (regname[0] == 'f' && regnum != -1)
+ if ((regname[0] == 'f' || regname[0] == 'v') && regnum != -1)
{
- /* Convert from floating-point register number (0..15)
- * to DWARF floating point register number (15..31):
- * Right rotate the least significant three bits and add 16. */
+ /* Convert from floating-point register number (0..15) and
+ * vector register number (0..31) to DWARF register number
+ * (15..31, 68..83): Right rotate the least significant
+ * three bits. For floating-point registers add 16. For
+ * vector registers 0..15 add 16 and for 16..31 add 86. */
int dw2_regnum;
dw2_regnum = (regnum & 0b110) >> 1;
dw2_regnum |= (regnum & 0b1) << 2;
dw2_regnum |= (regnum & 0b1000);
- dw2_regnum += 16;
+ dw2_regnum += (regnum < 16) ? 16 : 68;
regnum = dw2_regnum;
}
}
diff --git a/gas/testsuite/gas/s390/cfi-regnames-err.l b/gas/testsuite/gas/s390/cfi-regnames-err.l
index 7944f9b78fcb..3cc4998e0efe 100644
--- a/gas/testsuite/gas/s390/cfi-regnames-err.l
+++ b/gas/testsuite/gas/s390/cfi-regnames-err.l
@@ -6,3 +6,6 @@
# Invalid floating-point register names
.*:7: Error: bad register expression
.*:8: Error: bad register expression
+# Invalid vector register names
+.*:10: Error: bad register expression
+.*:11: Error: bad register expression
diff --git a/gas/testsuite/gas/s390/cfi-regnames-err.s b/gas/testsuite/gas/s390/cfi-regnames-err.s
index 55eae2cf1513..02cca7878aac 100644
--- a/gas/testsuite/gas/s390/cfi-regnames-err.s
+++ b/gas/testsuite/gas/s390/cfi-regnames-err.s
@@ -6,4 +6,7 @@
# Invalid floating-point register names
.cfi_register f0, f16
.cfi_register %f0, %f16
+# Invalid vector register names
+ .cfi_register v0, v32
+ .cfi_register %v0, %v32
.cfi_endproc
diff --git a/gas/testsuite/gas/s390/cfi-regnames.d b/gas/testsuite/gas/s390/cfi-regnames.d
index 8e4740587350..cb5efeab364f 100644
--- a/gas/testsuite/gas/s390/cfi-regnames.d
+++ b/gas/testsuite/gas/s390/cfi-regnames.d
@@ -34,3 +34,29 @@ Contents of the .eh_frame section:
DW_CFA_register: r27 \(f14\) in r31 \(f15\)
DW_CFA_nop
DW_CFA_nop
+
+# Vector register (VR) names v0..v31
+00000070 0000000000000044 00000074 FDE cie=00000000 pc=0000000000000008..000000000000000c
+ DW_CFA_advance_loc: 2 to 000000000000000a
+ DW_CFA_register: r16 \(f0\) in r20 \(f1\)
+ DW_CFA_register: r17 \(f2\) in r21 \(f3\)
+ DW_CFA_register: r18 \(f4\) in r22 \(f5\)
+ DW_CFA_register: r19 \(f6\) in r23 \(f7\)
+ DW_CFA_register: r24 \(f8\) in r28 \(f9\)
+ DW_CFA_register: r25 \(f10\) in r29 \(f11\)
+ DW_CFA_register: r26 \(f12\) in r30 \(f13\)
+ DW_CFA_register: r27 \(f14\) in r31 \(f15\)
+ DW_CFA_register: r68 \(v16\) in r72 \(v17\)
+ DW_CFA_register: r69 \(v18\) in r73 \(v19\)
+ DW_CFA_register: r70 \(v20\) in r74 \(v21\)
+ DW_CFA_register: r71 \(v22\) in r75 \(v23\)
+ DW_CFA_register: r76 \(v24\) in r80 \(v25\)
+ DW_CFA_register: r77 \(v26\) in r81 \(v27\)
+ DW_CFA_register: r78 \(v28\) in r82 \(v29\)
+ DW_CFA_register: r79 \(v30\) in r83 \(v31\)
+ DW_CFA_nop
+ DW_CFA_nop
+ DW_CFA_nop
+ DW_CFA_nop
+ DW_CFA_nop
+ DW_CFA_nop
diff --git a/gas/testsuite/gas/s390/cfi-regnames.s b/gas/testsuite/gas/s390/cfi-regnames.s
index cd11d4da450f..86c67870d66f 100644
--- a/gas/testsuite/gas/s390/cfi-regnames.s
+++ b/gas/testsuite/gas/s390/cfi-regnames.s
@@ -31,3 +31,27 @@ fpr:
.word 0
.cfi_endproc
.size fpr, .-fpr
+# Vector register (VR) names v0..v31
+ .type vr, @function
+vr:
+ .cfi_startproc
+ .word 0
+ .cfi_register v0, v1
+ .cfi_register v2, v3
+ .cfi_register v4, v5
+ .cfi_register v6, v7
+ .cfi_register v8, v9
+ .cfi_register v10, v11
+ .cfi_register v12, v13
+ .cfi_register v14, v15
+ .cfi_register v16, v17
+ .cfi_register v18, v19
+ .cfi_register v20, v21
+ .cfi_register v22, v23
+ .cfi_register v24, v25
+ .cfi_register v26, v27
+ .cfi_register v28, v29
+ .cfi_register v30, v31
+ .word 0
+ .cfi_endproc
+ .size vr, .-vr
--
2.51.0
More information about the Binutils
mailing list