]> git.ipfire.org Git - thirdparty/binutils-gdb.git/commitdiff
s390: Error if vector index register omitted in assembly
authorJens Remus <jremus@linux.ibm.com>
Mon, 27 Jan 2025 15:48:58 +0000 (16:48 +0100)
committerJens Remus <jremus@linux.ibm.com>
Mon, 27 Jan 2025 15:48:58 +0000 (16:48 +0100)
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>
gas/config/tc-s390.c
gas/testsuite/gas/s390/zarch-base-index-0-err.l
gas/testsuite/gas/s390/zarch-base-index-0-err.s
gas/testsuite/gas/s390/zarch-base-index-0.d
gas/testsuite/gas/s390/zarch-base-index-0.s
gas/testsuite/gas/s390/zarch-omitted-base-index-err.l
gas/testsuite/gas/s390/zarch-omitted-base-index-err.s
gas/testsuite/gas/s390/zarch-omitted-base-index.d
gas/testsuite/gas/s390/zarch-omitted-base-index.s
gas/testsuite/gas/s390/zarch-warn-areg-zero.l
gas/testsuite/gas/s390/zarch-warn-areg-zero.s

index 274bd944bab7d0fe010ed7b305ffded1d4b55234..cb3de9d2e6c0b6c7e1f13cd5c05beb644d1967a8 100644 (file)
@@ -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);
 
index 26187c93d4b357dcd89451dd04020ede4be41923..53d6ac506d2d123e4e1d9373bed323ec15aee3f4 100644 (file)
 .*: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
index 472d24ef62730b0023e4acbf1aca5c2680dcc510..d89383463222f4f46e7c72f210c7ea0e432a93a0 100644 (file)
@@ -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
index 95d12cfc1f250286d649ef0e2fdf9b2c3a88cdfb..c7e99415b69387940a777c0a7f83a6241d2507a8 100644 (file)
@@ -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
index e34c626707e2bf8c63b571e8cd56756d69b655eb..f5db661e6bfbf96b6d78ac67372c479f9ef3b791 100644 (file)
@@ -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
index 9ff6392915e7314c99fa20da66cd5fdda21ef573..ffbbcf3a9cebe1d98dbb6bfd159101d8bb8a3ca2 100644 (file)
@@ -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
index 0114c640375628e570c6d68b61bc0a8030046387..934fc4cd734c799213d645ecb2d8fde3f8c68d32 100644 (file)
@@ -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)
index c57a0ebffb2713fe883c29b9cdb6a62ed076e133..57b42fb4550ff11e108756acc4fdfa5b9ed83ec2 100644 (file)
@@ -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
index 1d4d434c9483346f83599b565004740a734bf149..fe2b381410e812bb00b15f080315706e8708b99a 100644 (file)
@@ -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)
index eed8cc6011163f6cbce1b9b94be424417b2d86b5..3bdef5a9ec0299a4f37d8dc529f891a47ffaf7a8 100644 (file)
@@ -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
index 26174475e17e49cc95431a152e9822926bf196d2..dcd4cdb264b175d6f6f0ea00d0ced0f7e2e41cda 100644 (file)
@@ -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