aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJens Remus <jremus@linux.ibm.com>2025-01-27 16:48:58 +0100
committerJens Remus <jremus@linux.ibm.com>2025-01-27 16:48:58 +0100
commitc76c8e20985d4c5106fa538c6f80661e1c2be007 (patch)
tree1eb13be9dd9ce975daf61e1f7a2180c92f7642e9
parentd77c7ae0835aec204d7d3247e187103f78d81290 (diff)
downloadgdb-c76c8e20985d4c5106fa538c6f80661e1c2be007.zip
gdb-c76c8e20985d4c5106fa538c6f80661e1c2be007.tar.gz
gdb-c76c8e20985d4c5106fa538c6f80661e1c2be007.tar.bz2
s390: Error if vector index register omitted in assembly
Vector index registers are currently only used in the VRV instruction format. Unlike general purpose index registers an operand value of zero (e.g. %v0, 0, or omitted) does not imply a zero value: "For VRV format instructions, a vector element is used in the formation of the intermediate value. This vector element is an unsigned binary integer value that is added to the base address and 12-bit displacement to form a 64-bit intermediate sum. The vector element is designated by a vector register and an element index. A zero V field accesses the element in vector register zero and does not imply a zero value." [1] Therefore require vector index register operands to be specified in assembler source. That is do require coding of D(VX,B) instead of allowing to omit VX=0 as D(,B), D(B), or D. Emit an error message if a mandatory vector index register is omitted: Error: operand <n>: missing vector index register operand Note that this change is not backwards compatible. But any code that omitted the specification of the vector index register is likely to be in error. Therefore it is favorable to report an error than to stay backward compatible. [1]: IBM z/Architecture Principles of Operation, SA22-7832-13, IBM z16, https://publibfp.dhe.ibm.com/epubs/pdf/a227832d.pdf gas/ * config/tc-s390.c (md_gather_operands): Do not allow vector index register operands to be optionally omitted. gas/testsuite/ * gas/s390/zarch-base-index-0.d (vgef): Remove tests with omitted vector index register operands. * gas/s390/zarch-base-index-0.s (vgef): Move tests with omitted vector index register operands ... * gas/s390/zarch-base-index-0-err.s (vgef): ... to here. * gas/s390/zarch-base-index-0-err.l (vgef): Expect error for omitted vector index register operands. * gas/s390/zarch-omitted-base-index.d (vgef): Remove tests with omitted vector index register operands. * gas/s390/zarch-omitted-base-index.s (vgef): Move tests with omitted vector index register operands ... * gas/s390/zarch-omitted-base-index-err.s (vgef): ... to here. * gas/s390/zarch-omitted-base-index-err.l (vgef): Expect error for omitted vector index register operands. * gas/s390/zarch-warn-areg-zero.l (vgef): Remove tests with omitted vector index register operands. * gas/s390/zarch-warn-areg-zero.s (vgef): Likewise. Signed-off-by: Jens Remus <jremus@linux.ibm.com>
-rw-r--r--gas/config/tc-s390.c12
-rw-r--r--gas/testsuite/gas/s390/zarch-base-index-0-err.l18
-rw-r--r--gas/testsuite/gas/s390/zarch-base-index-0-err.s10
-rw-r--r--gas/testsuite/gas/s390/zarch-base-index-0.d10
-rw-r--r--gas/testsuite/gas/s390/zarch-base-index-0.s18
-rw-r--r--gas/testsuite/gas/s390/zarch-omitted-base-index-err.l37
-rw-r--r--gas/testsuite/gas/s390/zarch-omitted-base-index-err.s3
-rw-r--r--gas/testsuite/gas/s390/zarch-omitted-base-index.d5
-rw-r--r--gas/testsuite/gas/s390/zarch-omitted-base-index.s6
-rw-r--r--gas/testsuite/gas/s390/zarch-warn-areg-zero.l2
-rw-r--r--gas/testsuite/gas/s390/zarch-warn-areg-zero.s18
11 files changed, 80 insertions, 59 deletions
diff --git a/gas/config/tc-s390.c b/gas/config/tc-s390.c
index 274bd94..cb3de9d 100644
--- a/gas/config/tc-s390.c
+++ b/gas/config/tc-s390.c
@@ -1452,6 +1452,11 @@ md_gather_operands (char *str,
if (omitted_index && (operand->flags & S390_OPERAND_INDEX))
{
+ /* Do not skip an omitted vector index register in D(VX,B). */
+ if (operand->flags & S390_OPERAND_VR)
+ as_bad (_("operand %d: missing vector index register operand"),
+ operand_number);
+
/* Skip omitted optional index register operand in D(X,B) due to
D(,B) or D(B). Skip comma, if D(,B). */
if (*str == ',')
@@ -1675,9 +1680,12 @@ md_gather_operands (char *str,
/* There is no opening parentheses. Check if operands of
parenthesized block can be skipped. Only index and base
register operands as well as optional operands may be
- skipped. A length operand may not be skipped. */
+ skipped. Neither vector index nor length operands may
+ be skipped. */
operand = s390_operands + *(++opindex_ptr);
- if (!(operand->flags & (S390_OPERAND_INDEX|S390_OPERAND_BASE)))
+ if (!(((operand->flags & S390_OPERAND_INDEX) &&
+ !(operand->flags & S390_OPERAND_VR))
+ || (operand->flags & S390_OPERAND_BASE)))
as_bad (_("operand %d: syntax error; missing '(' after displacement"),
operand_number);
diff --git a/gas/testsuite/gas/s390/zarch-base-index-0-err.l b/gas/testsuite/gas/s390/zarch-base-index-0-err.l
index 26187c9..53d6ac5 100644
--- a/gas/testsuite/gas/s390/zarch-base-index-0-err.l
+++ b/gas/testsuite/gas/s390/zarch-base-index-0-err.l
@@ -68,7 +68,17 @@
.*:42: Error: operand 1: syntax error; expected ','
.*:43: Error: operand 1: syntax error; missing '\(' after displacement
.*:43: Error: operand 2: syntax error; missing '\(' after displacement
-.*:46: Error: bad expression
-.*:46: Error: operand 2: syntax error; missing '\)' after base register
-.*:47: Error: bad expression
-.*:47: Error: operand 2: syntax error; missing '\)' after base register
+.*:46: Error: operand 2: missing vector index register operand
+.*:47: Error: operand 2: missing vector index register operand
+.*:48: Error: operand 2: missing vector index register operand
+.*:49: Error: operand 2: missing vector index register operand
+.*:50: Error: operand 2: missing vector index register operand
+.*:50: Error: bad expression
+.*:50: Error: operand 2: syntax error; missing '\)' after base register
+.*:51: Error: operand 2: missing vector index register operand
+.*:51: Error: bad expression
+.*:51: Error: operand 2: syntax error; missing '\)' after base register
+.*:52: Error: operand 2: syntax error; missing '\(' after displacement
+.*:53: Error: operand 2: syntax error; missing '\(' after displacement
+.*:54: Error: operand 2: syntax error; missing '\(' after displacement
+.*:55: Error: operand 2: syntax error; missing '\(' after displacement
diff --git a/gas/testsuite/gas/s390/zarch-base-index-0-err.s b/gas/testsuite/gas/s390/zarch-base-index-0-err.s
index 472d24e..d893834 100644
--- a/gas/testsuite/gas/s390/zarch-base-index-0-err.s
+++ b/gas/testsuite/gas/s390/zarch-base-index-0-err.s
@@ -43,5 +43,13 @@ foo:
unpk 16,32 # syntax error: missing lengths
# V1,D2(VX2,B2),M3
- vgef %v1,16(,),0 # syntax error: explicitly omitted index & base
+ vgef %v1,16(,%r3),0 # syntax error: omitted vector index
+ vgef %v1,16(%r3),0 # syntax error: omitted vector index
+ vgef %v1,16(,%r0),0 # syntax error: omitted vector index
+ vgef %v1,16(,0),0 # syntax error: omitted vector index
+ vgef %v1,16(,),0 # syntax error: omitted vector index & base
vgef %v1,16(),0 # syntax error: empty parentheses
+ vgef %v1,16,0 # syntax error: omitted vector index & base
+ vgef %v0,16,0 # syntax error: omitted vector index & base
+ vgef 0,16,0 # syntax error: omitted vector index & base
+ vgef 0,0,0 # syntax error: omitted vector index & base
diff --git a/gas/testsuite/gas/s390/zarch-base-index-0.d b/gas/testsuite/gas/s390/zarch-base-index-0.d
index 95d12cf..c7e9941 100644
--- a/gas/testsuite/gas/s390/zarch-base-index-0.d
+++ b/gas/testsuite/gas/s390/zarch-base-index-0.d
@@ -83,8 +83,6 @@ Disassembly of section .text:
.*: e7 12 30 10 00 13 [ ]*vgef %v1,16\(%v2,%r3\),0
.*: e7 10 30 10 00 13 [ ]*vgef %v1,16\(%v0,%r3\),0
.*: e7 10 30 10 00 13 [ ]*vgef %v1,16\(%v0,%r3\),0
-.*: e7 10 30 10 00 13 [ ]*vgef %v1,16\(%v0,%r3\),0
-.*: e7 10 30 10 00 13 [ ]*vgef %v1,16\(%v0,%r3\),0
.*: e7 12 00 10 00 13 [ ]*vgef %v1,16\(%v2,0\),0
.*: e7 12 00 10 00 13 [ ]*vgef %v1,16\(%v2,0\),0
.*: e7 12 00 10 00 13 [ ]*vgef %v1,16\(%v2,0\),0
@@ -94,10 +92,4 @@ Disassembly of section .text:
.*: e7 10 00 10 00 13 [ ]*vgef %v1,16\(%v0,0\),0
.*: e7 10 00 10 00 13 [ ]*vgef %v1,16\(%v0,0\),0
.*: e7 10 00 10 00 13 [ ]*vgef %v1,16\(%v0,0\),0
-.*: e7 10 00 10 00 13 [ ]*vgef %v1,16\(%v0,0\),0
-.*: e7 10 00 10 00 13 [ ]*vgef %v1,16\(%v0,0\),0
-.*: e7 10 00 10 00 13 [ ]*vgef %v1,16\(%v0,0\),0
-.*: e7 00 00 10 00 13 [ ]*vgef %v0,16\(%v0,0\),0
-.*: e7 00 00 10 00 13 [ ]*vgef %v0,16\(%v0,0\),0
-.*: e7 00 00 00 00 13 [ ]*vgef %v0,0\(%v0,0\),0
-.*: 07 07 [ ]*nopr %r7
+#?.*: 07 07 [ ]*nopr %r7
diff --git a/gas/testsuite/gas/s390/zarch-base-index-0.s b/gas/testsuite/gas/s390/zarch-base-index-0.s
index e34c6267..f5db661 100644
--- a/gas/testsuite/gas/s390/zarch-base-index-0.s
+++ b/gas/testsuite/gas/s390/zarch-base-index-0.s
@@ -95,8 +95,8 @@ foo:
vgef %v1,16(%v2,%r3),0
vgef %v1,16(%v0,%r3),0
vgef %v1,16(0,%r3),0
- vgef %v1,16(,%r3),0
- vgef %v1,16(%r3),0
+# vgef %v1,16(,%r3),0 # syntax error: omitted vector index
+# vgef %v1,16(%r3),0 # syntax error: omitted vector index
vgef %v1,16(%v2,%r0),0
vgef %v1,16(%v2,0),0
vgef %v1,16(%v2,),0
@@ -106,11 +106,11 @@ foo:
vgef %v1,16(0,%r0),0
vgef %v1,16(0,0),0
vgef %v1,16(0,),0
- vgef %v1,16(,%r0),0
- vgef %v1,16(,0),0
-# vgef %v1,16(,),0 # syntax error: explicitly omitted index & base
+# vgef %v1,16(,%r0),0 # syntax error: omitted vector index
+# vgef %v1,16(,0),0 # syntax error: omitted vector index
+# vgef %v1,16(,),0 # syntax error: omitted vector index & base
# vgef %v1,16(),0 # syntax error: empty parentheses
- vgef %v1,16,0
- vgef %v0,16,0
- vgef 0,16,0
- vgef 0,0,0
+# vgef %v1,16,0 # syntax error: omitted vector index & base
+# vgef %v0,16,0 # syntax error: omitted vector index & base
+# vgef 0,16,0 # syntax error: omitted vector index & base
+# vgef 0,0,0 # syntax error: omitted vector index & base
diff --git a/gas/testsuite/gas/s390/zarch-omitted-base-index-err.l b/gas/testsuite/gas/s390/zarch-omitted-base-index-err.l
index 9ff6392..ffbbcf3 100644
--- a/gas/testsuite/gas/s390/zarch-omitted-base-index-err.l
+++ b/gas/testsuite/gas/s390/zarch-omitted-base-index-err.l
@@ -3,19 +3,24 @@
.*:5: Error: operand 3: syntax error; missing '\)' after base register
.*:8: Error: bad expression
.*:8: Error: operand 2: syntax error; missing '\)' after base register
-.*:11: Warning: operand 2: expected general register name as base register
-.*:12: Error: bad expression
-.*:12: Error: operand 2: syntax error; missing '\)' after base register
-.*:15: Error: operand 1: missing length operand
-.*:16: Error: operand 1: missing length operand
-.*:17: Error: operand 1: invalid length field specified
-.*:18: Error: bad expression
-.*:18: Error: operand 1: operand out of range \(0 is not between 1 and 256\)
-.*:18: Error: operand 1: operand out of range \(32 is not between 0 and 15\)
-.*:18: Error: operand 1: syntax error; missing '\)' after base register
-.*:18: Error: operand 1: syntax error; expected ','
-.*:18: Error: bad expression
-.*:18: Error: found 'r', expected: '\)'
-.*:18: Error: operand 1: syntax error; missing '\)' after base register
-.*:18: Error: junk at end of line: `r2\)'
-.*:19: Error: operand 1: syntax error; missing '\(' after displacement
+.*:11: Error: operand 2: missing vector index register operand
+.*:12: Error: operand 2: missing vector index register operand
+.*:13: Error: operand 2: missing vector index register operand
+.*:13: Warning: operand 2: expected general register name as base register
+.*:14: Error: operand 2: missing vector index register operand
+.*:14: Error: bad expression
+.*:14: Error: operand 2: syntax error; missing '\)' after base register
+.*:15: Error: operand 2: syntax error; missing '\(' after displacement
+.*:18: Error: operand 1: missing length operand
+.*:19: Error: operand 1: missing length operand
+.*:20: Error: operand 1: invalid length field specified
+.*:21: Error: bad expression
+.*:21: Error: operand 1: operand out of range \(0 is not between 1 and 256\)
+.*:21: Error: operand 1: operand out of range \(32 is not between 0 and 15\)
+.*:21: Error: operand 1: syntax error; missing '\)' after base register
+.*:21: Error: operand 1: syntax error; expected ','
+.*:21: Error: bad expression
+.*:21: Error: found 'r', expected: '\)'
+.*:21: Error: operand 1: syntax error; missing '\)' after base register
+.*:21: Error: junk at end of line: `r2\)'
+.*:22: Error: operand 1: syntax error; missing '\(' after displacement
diff --git a/gas/testsuite/gas/s390/zarch-omitted-base-index-err.s b/gas/testsuite/gas/s390/zarch-omitted-base-index-err.s
index 0114c64..934fc4c 100644
--- a/gas/testsuite/gas/s390/zarch-omitted-base-index-err.s
+++ b/gas/testsuite/gas/s390/zarch-omitted-base-index-err.s
@@ -8,8 +8,11 @@ foo:
a %r1,16()
# V1,D2(VX2,B2),M3
+ vgef %v1,16(,%r3),0
+ vgef %v1,16(%r3),0
vgef %v1,16(%v2),0
vgef %v1,16(),0
+ vgef %v1,16,0
# D1(L1,B1),D2(B2)
mvc 16(,%r1),32(%r2)
diff --git a/gas/testsuite/gas/s390/zarch-omitted-base-index.d b/gas/testsuite/gas/s390/zarch-omitted-base-index.d
index c57a0eb..57b42fb 100644
--- a/gas/testsuite/gas/s390/zarch-omitted-base-index.d
+++ b/gas/testsuite/gas/s390/zarch-omitted-base-index.d
@@ -15,11 +15,8 @@ Disassembly of section .text:
.*: 5a 10 00 10 [ ]*a %r1,16
.*: e7 12 30 10 00 13 [ ]*vgef %v1,16\(%v2,%r3\),0
.*: e7 12 00 10 00 13 [ ]*vgef %v1,16\(%v2,0\),0
-.*: e7 10 30 10 00 13 [ ]*vgef %v1,16\(%v0,%r3\),0
-.*: e7 10 30 10 00 13 [ ]*vgef %v1,16\(%v0,%r3\),0
-.*: e7 10 00 10 00 13 [ ]*vgef %v1,16\(%v0,0\),0
.*: d2 00 10 10 20 20 [ ]*mvc 16\(1,%r1\),32\(%r2\)
.*: d2 00 10 10 00 20 [ ]*mvc 16\(1,%r1\),32
.*: d2 00 00 10 20 20 [ ]*mvc 16\(1,0\),32\(%r2\)
.*: d2 00 00 10 00 20 [ ]*mvc 16\(1,0\),32
-.*: 07 07 [ ]*nopr %r7
+#?.*: 07 07 [ ]*nopr %r7
diff --git a/gas/testsuite/gas/s390/zarch-omitted-base-index.s b/gas/testsuite/gas/s390/zarch-omitted-base-index.s
index 1d4d434..fe2b381 100644
--- a/gas/testsuite/gas/s390/zarch-omitted-base-index.s
+++ b/gas/testsuite/gas/s390/zarch-omitted-base-index.s
@@ -15,9 +15,9 @@ foo:
# V1,D2(VX2,B2),M3
vgef %v1,16(%v2,%r3),0
vgef %v1,16(%v2,),0
- vgef %v1,16(,%r3),0
- vgef %v1,16(%r3),0
- vgef %v1,16,0
+# vgef %v1,16(,%r3),0 # syntax error: omitted vector indx
+# vgef %v1,16(%r3),0 # syntax error: omitted vector index
+# vgef %v1,16,0 # syntax error: omitted vector index & base
# D1(L1,B1),D2(B2)
mvc 16(1,%r1),32(%r2)
diff --git a/gas/testsuite/gas/s390/zarch-warn-areg-zero.l b/gas/testsuite/gas/s390/zarch-warn-areg-zero.l
index eed8cc6..3bdef5a 100644
--- a/gas/testsuite/gas/s390/zarch-warn-areg-zero.l
+++ b/gas/testsuite/gas/s390/zarch-warn-areg-zero.l
@@ -63,5 +63,3 @@
.*:104: Warning: operand 2: base register specified but zero
.*:106: Warning: operand 2: base register specified but zero
.*:107: Warning: operand 2: base register specified but zero
-.*:109: Warning: operand 2: base register specified but zero
-.*:110: Warning: operand 2: base register specified but zero
diff --git a/gas/testsuite/gas/s390/zarch-warn-areg-zero.s b/gas/testsuite/gas/s390/zarch-warn-areg-zero.s
index 2617447..dcd4cdb 100644
--- a/gas/testsuite/gas/s390/zarch-warn-areg-zero.s
+++ b/gas/testsuite/gas/s390/zarch-warn-areg-zero.s
@@ -95,8 +95,8 @@ foo:
vgef %v1,16(%v2,%r3),0
vgef %v1,16(%v0,%r3),0
vgef %v1,16(0,%r3),0
- vgef %v1,16(,%r3),0
- vgef %v1,16(%r3),0
+# vgef %v1,16(,%r3),0 # syntax error: omitted vector index
+# vgef %v1,16(%r3),0 # syntax error: omitted vector index
vgef %v1,16(%v2,%r0),0
vgef %v1,16(%v2,0),0
vgef %v1,16(%v2,),0
@@ -106,11 +106,11 @@ foo:
vgef %v1,16(0,%r0),0
vgef %v1,16(0,0),0
vgef %v1,16(0,),0
- vgef %v1,16(,%r0),0
- vgef %v1,16(,0),0
-# vgef %v1,16(,),0 # syntax error: explicitly omitted index & base
+# vgef %v1,16(,%r0),0 # syntax error: omitted vector index
+# vgef %v1,16(,0),0 # syntax error: omitted vector index
+# vgef %v1,16(,),0 # syntax error: omitted vector index & base
# vgef %v1,16(),0 # syntax error: empty parentheses
- vgef %v1,16,0
- vgef %v0,16,0
- vgef 0,16,0
- vgef 0,0,0
+# vgef %v1,16,0 # syntax error: omitted vector index & base
+# vgef %v0,16,0 # syntax error: omitted vector index & base
+# vgef 0,16,0 # syntax error: omitted vector index & base
+# vgef 0,0,0 # syntax error: omitted vector index & base