Skip to content

Commit b8b60e2

Browse files
author
Jens Remus
committed
s390: Relax risbg[n]z, risb{h|l}gz, {rns|ros|rxs}bgt operand constraints
This leverages commit ("s390: Simplify (dis)assembly of insn operands with const bits") to relax the operand constraints of the immediate operand that contains the constant Z- or T-bit of the following extended mnemonics: risbgz, risbgnz, risbhgz, risblgz, rnsbgt, rosbgt, rxsbgt Previously those instructions were the only ones where the assembler on s390 restricted the specification of the subject I3/I4 operand values exactly according to their specification to an unsigned 6- or 5-bit unsigned integer. For any other instructions the assembler allows to specify any operand value allowed by the instruction format, regardless of whether the instruction specification is more restrictive. Allow to specify the subject I3/I4 operand as unsigned 8-bit integer with the constant operand bits being ORed during assembly. Relax the instructions subject significant operand bit masks to only consider the Z/T-bit as significant, so that the instructions get disassembled as their *z or *t flavor regardless of whether any reserved bits are set in addition to the Z/T-bit. Adapt the rnsbg, rosbg, and rxsbg test cases not to inadvertently set the T-bit in operand I3, as they otherwise get disassembled as their rnsbgt, rosbgt, and rxsbgt counterpart. This aligns GNU Assembler to LLVM Assembler. opcodes/ * s390-opc.c (U6_18, U5_27, U6_26): Remove. (INSTR_RIE_RRUUU2, INSTR_RIE_RRUUU3, INSTR_RIE_RRUUU4): Define as INSTR_RIE_RRUUU while retaining insn fmt mask. (MASK_RIE_RRUUU2, MASK_RIE_RRUUU3, MASK_RIE_RRUUU4): Treat only Z/T-bit of I3/I4 operand as significant. gas/testsuite/ * gas/s390/zarch-z10.s (rnsbg, rosbg, rxsbg): Do not set T-bit. Reported-by: Dominik Steenken <dost@de.ibm.com> Suggested-by: Ulrich Weigand <ulrich.weigand@de.ibm.com> Signed-off-by: Jens Remus <jremus@linux.ibm.com>
1 parent a3f1e7c commit b8b60e2

File tree

3 files changed

+21
-27
lines changed

3 files changed

+21
-27
lines changed

gas/testsuite/gas/s390/zarch-z10.d

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -359,20 +359,20 @@ Disassembly of section .text:
359359
.*: c2 60 ff fe 79 60 [ ]*msgfi %r6,-100000
360360
.*: e3 a6 75 b3 01 36 [ ]*pfd 10,5555\(%r6,%r7\)
361361
*([\da-f]+): c6 a2 00 00 00 00 [ ]*pfdrl 10,\1 <foo\+0x\1>
362-
.*: ec 67 d2 dc e6 54 [ ]*rnsbg %r6,%r7,210,220,230
363-
.*: ec 67 d2 dc 00 54 [ ]*rnsbg %r6,%r7,210,220
362+
.*: ec 67 6e dc e6 54 [ ]*rnsbg %r6,%r7,110,220,230
363+
.*: ec 67 6e dc 00 54 [ ]*rnsbg %r6,%r7,110,220
364364
.*: ec 67 92 dc e6 54 [ ]*rnsbgt %r6,%r7,18,220,230
365365
.*: ec 67 92 dc 00 54 [ ]*rnsbgt %r6,%r7,18,220
366366
.*: ec 67 92 1c 26 54 [ ]*rnsbgt %r6,%r7,18,28,38
367367
.*: ec 67 92 1c 00 54 [ ]*rnsbgt %r6,%r7,18,28
368-
.*: ec 67 d2 dc e6 57 [ ]*rxsbg %r6,%r7,210,220,230
369-
.*: ec 67 d2 dc 00 57 [ ]*rxsbg %r6,%r7,210,220
368+
.*: ec 67 6e dc e6 57 [ ]*rxsbg %r6,%r7,110,220,230
369+
.*: ec 67 6e dc 00 57 [ ]*rxsbg %r6,%r7,110,220
370370
.*: ec 67 92 dc e6 57 [ ]*rxsbgt %r6,%r7,18,220,230
371371
.*: ec 67 92 dc 00 57 [ ]*rxsbgt %r6,%r7,18,220
372372
.*: ec 67 92 1c 26 57 [ ]*rxsbgt %r6,%r7,18,28,38
373373
.*: ec 67 92 1c 00 57 [ ]*rxsbgt %r6,%r7,18,28
374-
.*: ec 67 d2 dc e6 56 [ ]*rosbg %r6,%r7,210,220,230
375-
.*: ec 67 d2 dc 00 56 [ ]*rosbg %r6,%r7,210,220
374+
.*: ec 67 6e dc e6 56 [ ]*rosbg %r6,%r7,110,220,230
375+
.*: ec 67 6e dc 00 56 [ ]*rosbg %r6,%r7,110,220
376376
.*: ec 67 92 dc e6 56 [ ]*rosbgt %r6,%r7,18,220,230
377377
.*: ec 67 92 dc 00 56 [ ]*rosbgt %r6,%r7,18,220
378378
.*: ec 67 92 1c 26 56 [ ]*rosbgt %r6,%r7,18,28,38

gas/testsuite/gas/s390/zarch-z10.s

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -353,20 +353,20 @@ foo:
353353
msgfi %r6,-100000
354354
pfd 10,5555(%r6,%r7)
355355
pfdrl 10,.
356-
rnsbg %r6,%r7,210,220,230
357-
rnsbg %r6,%r7,210,220
356+
rnsbg %r6,%r7,110,220,230
357+
rnsbg %r6,%r7,110,220
358358
rnsbg %r6,%r7,146,220,230
359359
rnsbg %r6,%r7,146,220
360360
rnsbgt %r6,%r7,18,28,38
361361
rnsbgt %r6,%r7,18,28
362-
rxsbg %r6,%r7,210,220,230
363-
rxsbg %r6,%r7,210,220
362+
rxsbg %r6,%r7,110,220,230
363+
rxsbg %r6,%r7,110,220
364364
rxsbg %r6,%r7,146,220,230
365365
rxsbg %r6,%r7,146,220
366366
rxsbgt %r6,%r7,18,28,38
367367
rxsbgt %r6,%r7,18,28
368-
rosbg %r6,%r7,210,220,230
369-
rosbg %r6,%r7,210,220
368+
rosbg %r6,%r7,110,220,230
369+
rosbg %r6,%r7,110,220
370370
rosbg %r6,%r7,146,220,230
371371
rosbg %r6,%r7,146,220
372372
rosbgt %r6,%r7,18,28,38

opcodes/s390-opc.c

Lines changed: 9 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -216,15 +216,9 @@ const struct s390_operand s390_operands[] =
216216
{ 4, 36, 0 },
217217
#define U8_8 (U4_36 + 1) /* 8 bit unsigned value starting at 8 */
218218
{ 8, 8, 0 },
219-
#define U6_18 (U8_8 + 1) /* 6 bit unsigned value starting at 18 */
220-
{ 6, 18, 0 },
221-
#define U8_16 (U6_18 + 1) /* 8 bit unsigned value starting at 16 */
219+
#define U8_16 (U8_8 + 1) /* 8 bit unsigned value starting at 16 */
222220
{ 8, 16, 0 },
223-
#define U5_27 (U8_16 + 1) /* 5 bit unsigned value starting at 27 */
224-
{ 5, 27, 0 },
225-
#define U6_26 (U5_27 + 1) /* 6 bit unsigned value starting at 26 */
226-
{ 6, 26, 0 },
227-
#define U8_24 (U6_26 + 1) /* 8 bit unsigned value starting at 24 */
221+
#define U8_24 (U8_16 + 1) /* 8 bit unsigned value starting at 24 */
228222
{ 8, 24, 0 },
229223
#define U8_28 (U8_24 + 1) /* 8 bit unsigned value starting at 28 */
230224
{ 8, 28, 0 },
@@ -288,7 +282,7 @@ unused_s390_operands_static_asserts (void)
288282
p - pc relative
289283
r - general purpose register
290284
re - gpr extended operand, a valid general purpose register pair
291-
u - unsigned integer, 4, 6, 8, 16 or 32 bit
285+
u - unsigned integer, 4, 8, 16 or 32 bit
292286
m - mode field, 4 bit
293287
0 - operand skipped.
294288
The order of the letters reflects the layout of the format in
@@ -324,9 +318,9 @@ unused_s390_operands_static_asserts (void)
324318
#define INSTR_RIE_R0U0 6, { R_8,U16_16,0,0,0,0 } /* e.g. clfitne */
325319
#define INSTR_RIE_RUI0 6, { R_8,I16_16,U4_12,0,0,0 } /* e.g. lochi */
326320
#define INSTR_RIE_RRUUU 6, { R_8,R_12,U8_16,U8_24,U8_32,0 } /* e.g. rnsbg */
327-
#define INSTR_RIE_RRUUU2 6, { R_8,R_12,U8_16,U6_26,U8_32,0 } /* e.g. risbgz */
328-
#define INSTR_RIE_RRUUU3 6, { R_8,R_12,U8_16,U5_27,U8_32,0 } /* e.g. risbhg */
329-
#define INSTR_RIE_RRUUU4 6, { R_8,R_12,U6_18,U8_24,U8_32,0 } /* e.g. rnsbgt */
321+
#define INSTR_RIE_RRUUU2 INSTR_RIE_RRUUU /* e.g. risbgz */
322+
#define INSTR_RIE_RRUUU3 INSTR_RIE_RRUUU /* e.g. risbhg */
323+
#define INSTR_RIE_RRUUU4 INSTR_RIE_RRUUU /* e.g. rnsbgt */
330324
#define INSTR_RIL_0P 6, { J32_16,0,0,0,0 } /* e.g. jg */
331325
#define INSTR_RIL_RP 6, { R_8,J32_16,0,0,0,0 } /* e.g. brasl */
332326
#define INSTR_RIL_UP 6, { U4_8,J32_16,0,0,0,0 } /* e.g. brcl */
@@ -551,9 +545,9 @@ unused_s390_operands_static_asserts (void)
551545
#define MASK_RIE_R0U0 { 0xff, 0x0f, 0x00, 0x00, 0xff, 0xff }
552546
#define MASK_RIE_RUI0 { 0xff, 0x00, 0x00, 0x00, 0xff, 0xff }
553547
#define MASK_RIE_RRUUU { 0xff, 0x00, 0x00, 0x00, 0x00, 0xff }
554-
#define MASK_RIE_RRUUU2 { 0xff, 0x00, 0x00, 0xc0, 0x00, 0xff }
555-
#define MASK_RIE_RRUUU3 { 0xff, 0x00, 0x00, 0xe0, 0x00, 0xff }
556-
#define MASK_RIE_RRUUU4 { 0xff, 0x00, 0xc0, 0x00, 0x00, 0xff }
548+
#define MASK_RIE_RRUUU2 { 0xff, 0x00, 0x00, 0x80, 0x00, 0xff }
549+
#define MASK_RIE_RRUUU3 { 0xff, 0x00, 0x00, 0x80, 0x00, 0xff }
550+
#define MASK_RIE_RRUUU4 { 0xff, 0x00, 0x80, 0x00, 0x00, 0xff }
557551
#define MASK_RIL_0P { 0xff, 0xff, 0x00, 0x00, 0x00, 0x00 }
558552
#define MASK_RIL_RP { 0xff, 0x0f, 0x00, 0x00, 0x00, 0x00 }
559553
#define MASK_RIL_UP { 0xff, 0x0f, 0x00, 0x00, 0x00, 0x00 }

0 commit comments

Comments
 (0)