@@ -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);
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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)
@@ -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
@@ -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)
@@ -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
@@ -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