[binutils-gdb] s390: Error if vector index register omitted in assembly

Jens Remus jremus@sourceware.org
Mon Jan 27 15:49:42 GMT 2025


https://sourceware.org/git/gitweb.cgi?p=binutils-gdb.git;h=c76c8e20985d4c5106fa538c6f80661e1c2be007

commit c76c8e20985d4c5106fa538c6f80661e1c2be007
Author: Jens Remus <jremus@linux.ibm.com>
Date:   Mon Jan 27 16:48:58 2025 +0100

    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>

Diff:
---
 gas/config/tc-s390.c                               | 12 +++++--
 gas/testsuite/gas/s390/zarch-base-index-0-err.l    | 18 ++++++++---
 gas/testsuite/gas/s390/zarch-base-index-0-err.s    | 10 +++++-
 gas/testsuite/gas/s390/zarch-base-index-0.d        | 10 +-----
 gas/testsuite/gas/s390/zarch-base-index-0.s        | 18 +++++------
 .../gas/s390/zarch-omitted-base-index-err.l        | 37 ++++++++++++----------
 .../gas/s390/zarch-omitted-base-index-err.s        |  3 ++
 gas/testsuite/gas/s390/zarch-omitted-base-index.d  |  5 +--
 gas/testsuite/gas/s390/zarch-omitted-base-index.s  |  6 ++--
 gas/testsuite/gas/s390/zarch-warn-areg-zero.l      |  2 --
 gas/testsuite/gas/s390/zarch-warn-areg-zero.s      | 18 +++++------
 11 files changed, 80 insertions(+), 59 deletions(-)

diff --git a/gas/config/tc-s390.c b/gas/config/tc-s390.c
index 274bd944bab..cb3de9d2e6c 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 26187c93d4b..53d6ac506d2 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 472d24ef627..d8938346322 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 95d12cfc1f2..c7e99415b69 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 e34c626707e..f5db661e6bf 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 9ff6392915e..ffbbcf3a9ce 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 0114c640375..934fc4cd734 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 c57a0ebffb2..57b42fb4550 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 1d4d434c948..fe2b381410e 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 eed8cc60111..3bdef5a9ec0 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 26174475e17..dcd4cdb264b 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


More information about the Binutils-cvs mailing list