[llvm] c726c92 - [SystemZ] Allow %r0 in address context for AsmParser

Ulrich Weigand via llvm-commits llvm-commits at lists.llvm.org
Tue Mar 31 10:49:45 PDT 2020


Author: Ulrich Weigand
Date: 2020-03-31T19:48:50+02:00
New Revision: c726c920e04046da29e403d55aa9c0e466b13959

URL: https://github.com/llvm/llvm-project/commit/c726c920e04046da29e403d55aa9c0e466b13959
DIFF: https://github.com/llvm/llvm-project/commit/c726c920e04046da29e403d55aa9c0e466b13959.diff

LOG: [SystemZ] Allow %r0 in address context for AsmParser

Registers used in any address (as well as in a few other contexts)
have special semantics when a "zero" register is used, which is
why the back-end defines extra register classes ADDR32, ADDR64 etc
to be used to prevent the register allocator from using %r0 there.

However, when writing assembler code "by hand", you sometimes need
to trigger that special semantics.  However, currently the AsmParser
will reject %r0 in those places.  In some cases it may be possible
to write that instruction differently - but in others it is currently
not possible at all.

This check in AsmParser simply seems overly strict, so this patch
just removes the check completely.  This brings the behaviour of
AsmParser in line with the GNU assembler as well.

Bugzilla: https://bugs.llvm.org/show_bug.cgi?id=45092

Added: 
    

Modified: 
    llvm/lib/Target/SystemZ/AsmParser/SystemZAsmParser.cpp
    llvm/test/MC/SystemZ/insn-bad-z13.s
    llvm/test/MC/SystemZ/insn-bad-z14.s
    llvm/test/MC/SystemZ/insn-bad-z196.s
    llvm/test/MC/SystemZ/insn-bad-zEC12.s
    llvm/test/MC/SystemZ/insn-bad.s
    llvm/test/MC/SystemZ/insn-good.s
    llvm/test/MC/SystemZ/regs-bad.s
    llvm/test/MC/SystemZ/tokens.s

Removed: 
    


################################################################################
diff  --git a/llvm/lib/Target/SystemZ/AsmParser/SystemZAsmParser.cpp b/llvm/lib/Target/SystemZ/AsmParser/SystemZAsmParser.cpp
index 8ad61dd0a1e8..3bf54edab3b1 100644
--- a/llvm/lib/Target/SystemZ/AsmParser/SystemZAsmParser.cpp
+++ b/llvm/lib/Target/SystemZ/AsmParser/SystemZAsmParser.cpp
@@ -53,8 +53,6 @@ enum RegisterKind {
   GRH32Reg,
   GR64Reg,
   GR128Reg,
-  ADDR32Reg,
-  ADDR64Reg,
   FP32Reg,
   FP64Reg,
   FP128Reg,
@@ -109,7 +107,7 @@ class SystemZOperand : public MCParsedAsmOperand {
 
   // Base + Disp + Index, where Base and Index are LLVM registers or 0.
   // MemKind says what type of memory this is and RegKind says what type
-  // the base register has (ADDR32Reg or ADDR64Reg).  Length is the operand
+  // the base register has (GR32Reg or GR64Reg).  Length is the operand
   // length for D(L,B)-style operands, otherwise it is null.
   struct MemOp {
     unsigned Base : 12;
@@ -348,8 +346,8 @@ class SystemZOperand : public MCParsedAsmOperand {
   bool isGRX32() const { return false; }
   bool isGR64() const { return isReg(GR64Reg); }
   bool isGR128() const { return isReg(GR128Reg); }
-  bool isADDR32() const { return isReg(ADDR32Reg); }
-  bool isADDR64() const { return isReg(ADDR64Reg); }
+  bool isADDR32() const { return isReg(GR32Reg); }
+  bool isADDR64() const { return isReg(GR64Reg); }
   bool isADDR128() const { return false; }
   bool isFP32() const { return isReg(FP32Reg); }
   bool isFP64() const { return isReg(FP64Reg); }
@@ -361,16 +359,16 @@ class SystemZOperand : public MCParsedAsmOperand {
   bool isAR32() const { return isReg(AR32Reg); }
   bool isCR64() const { return isReg(CR64Reg); }
   bool isAnyReg() const { return (isReg() || isImm(0, 15)); }
-  bool isBDAddr32Disp12() const { return isMemDisp12(BDMem, ADDR32Reg); }
-  bool isBDAddr32Disp20() const { return isMemDisp20(BDMem, ADDR32Reg); }
-  bool isBDAddr64Disp12() const { return isMemDisp12(BDMem, ADDR64Reg); }
-  bool isBDAddr64Disp20() const { return isMemDisp20(BDMem, ADDR64Reg); }
-  bool isBDXAddr64Disp12() const { return isMemDisp12(BDXMem, ADDR64Reg); }
-  bool isBDXAddr64Disp20() const { return isMemDisp20(BDXMem, ADDR64Reg); }
-  bool isBDLAddr64Disp12Len4() const { return isMemDisp12Len4(ADDR64Reg); }
-  bool isBDLAddr64Disp12Len8() const { return isMemDisp12Len8(ADDR64Reg); }
-  bool isBDRAddr64Disp12() const { return isMemDisp12(BDRMem, ADDR64Reg); }
-  bool isBDVAddr64Disp12() const { return isMemDisp12(BDVMem, ADDR64Reg); }
+  bool isBDAddr32Disp12() const { return isMemDisp12(BDMem, GR32Reg); }
+  bool isBDAddr32Disp20() const { return isMemDisp20(BDMem, GR32Reg); }
+  bool isBDAddr64Disp12() const { return isMemDisp12(BDMem, GR64Reg); }
+  bool isBDAddr64Disp20() const { return isMemDisp20(BDMem, GR64Reg); }
+  bool isBDXAddr64Disp12() const { return isMemDisp12(BDXMem, GR64Reg); }
+  bool isBDXAddr64Disp20() const { return isMemDisp20(BDXMem, GR64Reg); }
+  bool isBDLAddr64Disp12Len4() const { return isMemDisp12Len4(GR64Reg); }
+  bool isBDLAddr64Disp12Len8() const { return isMemDisp12Len8(GR64Reg); }
+  bool isBDRAddr64Disp12() const { return isMemDisp12(BDRMem, GR64Reg); }
+  bool isBDVAddr64Disp12() const { return isMemDisp12(BDVMem, GR64Reg); }
   bool isU1Imm() const { return isImm(0, 1); }
   bool isU2Imm() const { return isImm(0, 3); }
   bool isU3Imm() const { return isImm(0, 7); }
@@ -407,8 +405,7 @@ class SystemZAsmParser : public MCTargetAsmParser {
 
   bool parseRegister(Register &Reg, bool RestoreOnFailure = false);
 
-  bool parseRegister(Register &Reg, RegisterGroup Group, const unsigned *Regs,
-                     bool IsAddress = false);
+  bool parseRegister(Register &Reg, RegisterGroup Group, const unsigned *Regs);
 
   OperandMatchResultTy parseRegister(OperandVector &Operands,
                                      RegisterGroup Group, const unsigned *Regs,
@@ -477,10 +474,12 @@ class SystemZAsmParser : public MCTargetAsmParser {
     return parseRegister(Operands, RegGR, SystemZMC::GR128Regs, GR128Reg);
   }
   OperandMatchResultTy parseADDR32(OperandVector &Operands) {
-    return parseRegister(Operands, RegGR, SystemZMC::GR32Regs, ADDR32Reg);
+    // For the AsmParser, we will accept %r0 for ADDR32 as well.
+    return parseRegister(Operands, RegGR, SystemZMC::GR32Regs, GR32Reg);
   }
   OperandMatchResultTy parseADDR64(OperandVector &Operands) {
-    return parseRegister(Operands, RegGR, SystemZMC::GR64Regs, ADDR64Reg);
+    // For the AsmParser, we will accept %r0 for ADDR64 as well.
+    return parseRegister(Operands, RegGR, SystemZMC::GR64Regs, GR64Reg);
   }
   OperandMatchResultTy parseADDR128(OperandVector &Operands) {
     llvm_unreachable("Shouldn't be used as an operand");
@@ -516,22 +515,22 @@ class SystemZAsmParser : public MCTargetAsmParser {
     return parseAnyRegister(Operands);
   }
   OperandMatchResultTy parseBDAddr32(OperandVector &Operands) {
-    return parseAddress(Operands, BDMem, SystemZMC::GR32Regs, ADDR32Reg);
+    return parseAddress(Operands, BDMem, SystemZMC::GR32Regs, GR32Reg);
   }
   OperandMatchResultTy parseBDAddr64(OperandVector &Operands) {
-    return parseAddress(Operands, BDMem, SystemZMC::GR64Regs, ADDR64Reg);
+    return parseAddress(Operands, BDMem, SystemZMC::GR64Regs, GR64Reg);
   }
   OperandMatchResultTy parseBDXAddr64(OperandVector &Operands) {
-    return parseAddress(Operands, BDXMem, SystemZMC::GR64Regs, ADDR64Reg);
+    return parseAddress(Operands, BDXMem, SystemZMC::GR64Regs, GR64Reg);
   }
   OperandMatchResultTy parseBDLAddr64(OperandVector &Operands) {
-    return parseAddress(Operands, BDLMem, SystemZMC::GR64Regs, ADDR64Reg);
+    return parseAddress(Operands, BDLMem, SystemZMC::GR64Regs, GR64Reg);
   }
   OperandMatchResultTy parseBDRAddr64(OperandVector &Operands) {
-    return parseAddress(Operands, BDRMem, SystemZMC::GR64Regs, ADDR64Reg);
+    return parseAddress(Operands, BDRMem, SystemZMC::GR64Regs, GR64Reg);
   }
   OperandMatchResultTy parseBDVAddr64(OperandVector &Operands) {
-    return parseAddress(Operands, BDVMem, SystemZMC::GR64Regs, ADDR64Reg);
+    return parseAddress(Operands, BDVMem, SystemZMC::GR64Regs, GR64Reg);
   }
   OperandMatchResultTy parsePCRel12(OperandVector &Operands) {
     return parsePCRel(Operands, -(1LL << 12), (1LL << 12) - 1, false);
@@ -751,20 +750,17 @@ bool SystemZAsmParser::parseRegister(Register &Reg, bool RestoreOnFailure) {
 
 // Parse a register of group Group.  If Regs is nonnull, use it to map
 // the raw register number to LLVM numbering, with zero entries
-// indicating an invalid register.  IsAddress says whether the
-// register appears in an address context. Allow FP Group if expecting
+// indicating an invalid register.  Allow FP Group if expecting
 // RegV Group, since the f-prefix yields the FP group even while used
 // with vector instructions.
 bool SystemZAsmParser::parseRegister(Register &Reg, RegisterGroup Group,
-                                     const unsigned *Regs, bool IsAddress) {
+                                     const unsigned *Regs) {
   if (parseRegister(Reg))
     return true;
   if (Reg.Group != Group && !(Reg.Group == RegFP && Group == RegV))
     return Error(Reg.StartLoc, "invalid operand for instruction");
   if (Regs && Regs[Reg.Num] == 0)
     return Error(Reg.StartLoc, "invalid register pair");
-  if (Reg.Num == 0 && IsAddress)
-    return Error(Reg.StartLoc, "%r0 used in an address");
   if (Regs)
     Reg.Num = Regs[Reg.Num];
   return false;
@@ -778,8 +774,7 @@ SystemZAsmParser::parseRegister(OperandVector &Operands, RegisterGroup Group,
     return MatchOperand_NoMatch;
 
   Register Reg;
-  bool IsAddress = (Kind == ADDR32Reg || Kind == ADDR64Reg);
-  if (parseRegister(Reg, Group, Regs, IsAddress))
+  if (parseRegister(Reg, Group, Regs))
     return MatchOperand_ParseFail;
 
   Operands.push_back(SystemZOperand::createReg(Kind, Reg.Num,
@@ -900,9 +895,6 @@ SystemZAsmParser::parseAddressRegister(Register &Reg) {
   } else if (Reg.Group != RegGR) {
     Error(Reg.StartLoc, "invalid address register");
     return true;
-  } else if (Reg.Num == 0) {
-    Error(Reg.StartLoc, "%r0 used in an address");
-    return true;
   }
   return false;
 }

diff  --git a/llvm/test/MC/SystemZ/insn-bad-z13.s b/llvm/test/MC/SystemZ/insn-bad-z13.s
index c362b4b27ba3..4ae4fd99fbd4 100644
--- a/llvm/test/MC/SystemZ/insn-bad-z13.s
+++ b/llvm/test/MC/SystemZ/insn-bad-z13.s
@@ -33,8 +33,6 @@
 #CHECK: cdpt	%f0, -1(1,%r1), 0
 #CHECK: error: invalid operand
 #CHECK: cdpt	%f0, 4096(1,%r1), 0
-#CHECK: error: %r0 used in an address
-#CHECK: cdpt	%f0, 0(1,%r0), 0
 #CHECK: error: invalid use of indexed addressing
 #CHECK: cdpt	%f0, 0(%r1,%r2), 0
 #CHECK: error: unknown token in expression
@@ -48,7 +46,6 @@
 	cdpt	%f0, 0(257,%r1), 0
 	cdpt	%f0, -1(1,%r1), 0
 	cdpt	%f0, 4096(1,%r1), 0
-	cdpt	%f0, 0(1,%r0), 0
 	cdpt	%f0, 0(%r1,%r2), 0
 	cdpt	%f0, 0(-), 0
 
@@ -68,8 +65,6 @@
 #CHECK: cpdt	%f0, -1(1,%r1), 0
 #CHECK: error: invalid operand
 #CHECK: cpdt	%f0, 4096(1,%r1), 0
-#CHECK: error: %r0 used in an address
-#CHECK: cpdt	%f0, 0(1,%r0), 0
 #CHECK: error: invalid use of indexed addressing
 #CHECK: cpdt	%f0, 0(%r1,%r2), 0
 #CHECK: error: unknown token in expression
@@ -83,7 +78,6 @@
 	cpdt	%f0, 0(257,%r1), 0
 	cpdt	%f0, -1(1,%r1), 0
 	cpdt	%f0, 4096(1,%r1), 0
-	cpdt	%f0, 0(1,%r0), 0
 	cpdt	%f0, 0(%r1,%r2), 0
 	cpdt	%f0, 0(-), 0
 
@@ -103,8 +97,6 @@
 #CHECK: cpxt	%f0, -1(1,%r1), 0
 #CHECK: error: invalid operand
 #CHECK: cpxt	%f0, 4096(1,%r1), 0
-#CHECK: error: %r0 used in an address
-#CHECK: cpxt	%f0, 0(1,%r0), 0
 #CHECK: error: invalid use of indexed addressing
 #CHECK: cpxt	%f0, 0(%r1,%r2), 0
 #CHECK: error: unknown token in expression
@@ -120,7 +112,6 @@
 	cpxt	%f0, 0(257,%r1), 0
 	cpxt	%f0, -1(1,%r1), 0
 	cpxt	%f0, 4096(1,%r1), 0
-	cpxt	%f0, 0(1,%r0), 0
 	cpxt	%f0, 0(%r1,%r2), 0
 	cpxt	%f0, 0(-), 0
 	cpxt	%f15, 0(1), 0
@@ -141,8 +132,6 @@
 #CHECK: cxpt	%f0, -1(1,%r1), 0
 #CHECK: error: invalid operand
 #CHECK: cxpt	%f0, 4096(1,%r1), 0
-#CHECK: error: %r0 used in an address
-#CHECK: cxpt	%f0, 0(1,%r0), 0
 #CHECK: error: invalid use of indexed addressing
 #CHECK: cxpt	%f0, 0(%r1,%r2), 0
 #CHECK: error: unknown token in expression
@@ -158,7 +147,6 @@
 	cxpt	%f0, 0(257,%r1), 0
 	cxpt	%f0, -1(1,%r1), 0
 	cxpt	%f0, 4096(1,%r1), 0
-	cxpt	%f0, 0(1,%r0), 0
 	cxpt	%f0, 0(%r1,%r2), 0
 	cxpt	%f0, 0(-), 0
 	cxpt	%f15, 0(1), 0
@@ -1880,58 +1868,43 @@
 #CHECK: vlgv	%r0, %v0, -1, 0
 #CHECK: error: invalid operand
 #CHECK: vlgv	%r0, %v0, 4096, 0
-#CHECK: error: %r0 used in an address
-#CHECK: vlgv	%r0, %v0, 0(%r0), 0
 
 	vlgv	%r0, %v0, 0, -1
 	vlgv	%r0, %v0, 0, 16
 	vlgv	%r0, %v0, -1, 0
 	vlgv	%r0, %v0, 4096, 0
-	vlgv	%r0, %v0, 0(%r0), 0
 
 #CHECK: error: invalid operand
 #CHECK: vlgvb	%r0, %v0, -1
 #CHECK: error: invalid operand
 #CHECK: vlgvb	%r0, %v0, 4096
-#CHECK: error: %r0 used in an address
-#CHECK: vlgvb	%r0, %v0, 0(%r0)
 
 	vlgvb	%r0, %v0, -1
 	vlgvb	%r0, %v0, 4096
-	vlgvb	%r0, %v0, 0(%r0)
 
 #CHECK: error: invalid operand
 #CHECK: vlgvf	%r0, %v0, -1
 #CHECK: error: invalid operand
 #CHECK: vlgvf	%r0, %v0, 4096
-#CHECK: error: %r0 used in an address
-#CHECK: vlgvf	%r0, %v0, 0(%r0)
 
 	vlgvf	%r0, %v0, -1
 	vlgvf	%r0, %v0, 4096
-	vlgvf	%r0, %v0, 0(%r0)
 
 #CHECK: error: invalid operand
 #CHECK: vlgvg	%r0, %v0, -1
 #CHECK: error: invalid operand
 #CHECK: vlgvg	%r0, %v0, 4096
-#CHECK: error: %r0 used in an address
-#CHECK: vlgvg	%r0, %v0, 0(%r0)
 
 	vlgvg	%r0, %v0, -1
 	vlgvg	%r0, %v0, 4096
-	vlgvg	%r0, %v0, 0(%r0)
 
 #CHECK: error: invalid operand
 #CHECK: vlgvh	%r0, %v0, -1
 #CHECK: error: invalid operand
 #CHECK: vlgvh	%r0, %v0, 4096
-#CHECK: error: %r0 used in an address
-#CHECK: vlgvh	%r0, %v0, 0(%r0)
 
 	vlgvh	%r0, %v0, -1
 	vlgvh	%r0, %v0, 4096
-	vlgvh	%r0, %v0, 0(%r0)
 
 #CHECK: error: instruction requires: vector-packed-decimal
 #CHECK: vlip	%v0, 0, 0
@@ -1942,12 +1915,9 @@
 #CHECK: vll	%v0, %r0, -1
 #CHECK: error: invalid operand
 #CHECK: vll	%v0, %r0, 4096
-#CHECK: error: %r0 used in an address
-#CHECK: vll	%v0, %r0, 0(%r0)
 
 	vll	%v0, %r0, -1
 	vll	%v0, %r0, 4096
-	vll	%v0, %r0, 0(%r0)
 
 #CHECK: error: invalid operand
 #CHECK: vllez	%v0, 0, -1
@@ -2108,58 +2078,43 @@
 #CHECK: vlvg	%v0, %r0, -1, 0
 #CHECK: error: invalid operand
 #CHECK: vlvg	%v0, %r0, 4096, 0
-#CHECK: error: %r0 used in an address
-#CHECK: vlvg	%v0, %r0, 0(%r0), 0
 
 	vlvg	%v0, %r0, 0, -1
 	vlvg	%v0, %r0, 0, 16
 	vlvg	%v0, %r0, -1, 0
 	vlvg	%v0, %r0, 4096, 0
-	vlvg	%v0, %r0, 0(%r0), 0
 
 #CHECK: error: invalid operand
 #CHECK: vlvgb	%v0, %r0, -1
 #CHECK: error: invalid operand
 #CHECK: vlvgb	%v0, %r0, 4096
-#CHECK: error: %r0 used in an address
-#CHECK: vlvgb	%v0, %r0, 0(%r0)
 
 	vlvgb	%v0, %r0, -1
 	vlvgb	%v0, %r0, 4096
-	vlvgb	%v0, %r0, 0(%r0)
 
 #CHECK: error: invalid operand
 #CHECK: vlvgf	%v0, %r0, -1
 #CHECK: error: invalid operand
 #CHECK: vlvgf	%v0, %r0, 4096
-#CHECK: error: %r0 used in an address
-#CHECK: vlvgf	%v0, %r0, 0(%r0)
 
 	vlvgf	%v0, %r0, -1
 	vlvgf	%v0, %r0, 4096
-	vlvgf	%v0, %r0, 0(%r0)
 
 #CHECK: error: invalid operand
 #CHECK: vlvgg	%v0, %r0, -1
 #CHECK: error: invalid operand
 #CHECK: vlvgg	%v0, %r0, 4096
-#CHECK: error: %r0 used in an address
-#CHECK: vlvgg	%v0, %r0, 0(%r0)
 
 	vlvgg	%v0, %r0, -1
 	vlvgg	%v0, %r0, 4096
-	vlvgg	%v0, %r0, 0(%r0)
 
 #CHECK: error: invalid operand
 #CHECK: vlvgh	%v0, %r0, -1
 #CHECK: error: invalid operand
 #CHECK: vlvgh	%v0, %r0, 4096
-#CHECK: error: %r0 used in an address
-#CHECK: vlvgh	%v0, %r0, 0(%r0)
 
 	vlvgh	%v0, %r0, -1
 	vlvgh	%v0, %r0, 4096
-	vlvgh	%v0, %r0, 0(%r0)
 
 #CHECK: error: instruction requires: vector-packed-decimal
 #CHECK: vmp	%v0, %v0, %v0, 0, 0
@@ -2475,12 +2430,9 @@
 #CHECK: vstl	%v0, %r0, -1
 #CHECK: error: invalid operand
 #CHECK: vstl	%v0, %r0, 4096
-#CHECK: error: %r0 used in an address
-#CHECK: vstl	%v0, %r0, 0(%r0)
 
 	vstl	%v0, %r0, -1
 	vstl	%v0, %r0, 4096
-	vstl	%v0, %r0, 0(%r0)
 
 #CHECK: error: invalid operand
 #CHECK: vstm	%v0, %v0, -1

diff  --git a/llvm/test/MC/SystemZ/insn-bad-z14.s b/llvm/test/MC/SystemZ/insn-bad-z14.s
index f3c8414af7d8..568717a85c0e 100644
--- a/llvm/test/MC/SystemZ/insn-bad-z14.s
+++ b/llvm/test/MC/SystemZ/insn-bad-z14.s
@@ -634,25 +634,19 @@
 #CHECK: vlrl	%v0, -1, 0
 #CHECK: error: invalid operand
 #CHECK: vlrl	%v0, 4096, 0
-#CHECK: error: %r0 used in an address
-#CHECK: vlrl	%v0, 0(%r0), 0
 
 	vlrl	%v0, 0, -1
 	vlrl	%v0, 0, 256
 	vlrl	%v0, -1, 0
 	vlrl	%v0, 4096, 0
-	vlrl	%v0, 0(%r0), 0
 
 #CHECK: error: invalid operand
 #CHECK: vlrlr	%v0, %r0, -1
 #CHECK: error: invalid operand
 #CHECK: vlrlr	%v0, %r0, 4096
-#CHECK: error: %r0 used in an address
-#CHECK: vlrlr	%v0, %r0, 0(%r0)
 
 	vlrlr	%v0, %r0, -1
 	vlrlr	%v0, %r0, 4096
-	vlrlr	%v0, %r0, 0(%r0)
 
 #CHECK: error: invalid operand
 #CHECK: vmp	%v0, %v0, %v0, 0, -1
@@ -712,14 +706,11 @@
 #CHECK: vpkz	%v0, -1, 0
 #CHECK: error: invalid operand
 #CHECK: vpkz	%v0, 4096, 0
-#CHECK: error: %r0 used in an address
-#CHECK: vpkz	%v0, 0(%r0), 0
 
 	vpkz	%v0, 0, -1
 	vpkz	%v0, 0, 256
 	vpkz	%v0, -1, 0
 	vpkz	%v0, 4096, 0
-	vpkz	%v0, 0(%r0), 0
 
 #CHECK: error: invalid operand
 #CHECK: vpsop	%v0, %v0, 0, 0, -1
@@ -863,25 +854,19 @@
 #CHECK: vstrl	%v0, -1, 0
 #CHECK: error: invalid operand
 #CHECK: vstrl	%v0, 4096, 0
-#CHECK: error: %r0 used in an address
-#CHECK: vstrl	%v0, 0(%r0), 0
 
 	vstrl	%v0, 0, -1
 	vstrl	%v0, 0, 256
 	vstrl	%v0, -1, 0
 	vstrl	%v0, 4096, 0
-	vstrl	%v0, 0(%r0), 0
 
 #CHECK: error: invalid operand
 #CHECK: vstrlr	%v0, %r0, -1
 #CHECK: error: invalid operand
 #CHECK: vstrlr	%v0, %r0, 4096
-#CHECK: error: %r0 used in an address
-#CHECK: vstrlr	%v0, %r0, 0(%r0)
 
 	vstrlr	%v0, %r0, -1
 	vstrlr	%v0, %r0, 4096
-	vstrlr	%v0, %r0, 0(%r0)
 
 #CHECK: error: instruction requires: vector-enhancements-2
 #CHECK: vstrs	%v0, %v0, %v0, %v0, 0
@@ -914,14 +899,11 @@
 #CHECK: vupkz	%v0, -1, 0
 #CHECK: error: invalid operand
 #CHECK: vupkz	%v0, 4096, 0
-#CHECK: error: %r0 used in an address
-#CHECK: vupkz	%v0, 0(%r0), 0
 
 	vupkz	%v0, 0, -1
 	vupkz	%v0, 0, 256
 	vupkz	%v0, -1, 0
 	vupkz	%v0, 4096, 0
-	vupkz	%v0, 0(%r0), 0
 
 #CHECK: error: instruction requires: vector-enhancements-2
 #CHECK: wcefb	%v0, %v0, 0, 0

diff  --git a/llvm/test/MC/SystemZ/insn-bad-z196.s b/llvm/test/MC/SystemZ/insn-bad-z196.s
index 33059529f74b..04e53c3507e4 100644
--- a/llvm/test/MC/SystemZ/insn-bad-z196.s
+++ b/llvm/test/MC/SystemZ/insn-bad-z196.s
@@ -1260,56 +1260,44 @@
 #CHECK: slak	%r0,%r0,-524289
 #CHECK: error: invalid operand
 #CHECK: slak	%r0,%r0,524288
-#CHECK: error: %r0 used in an address
-#CHECK: slak	%r0,%r0,0(%r0)
 #CHECK: error: invalid use of indexed addressing
 #CHECK: slak	%r0,%r0,0(%r1,%r2)
 
 	slak	%r0,%r0,-524289
 	slak	%r0,%r0,524288
-	slak	%r0,%r0,0(%r0)
 	slak	%r0,%r0,0(%r1,%r2)
 
 #CHECK: error: invalid operand
 #CHECK: sllk	%r0,%r0,-524289
 #CHECK: error: invalid operand
 #CHECK: sllk	%r0,%r0,524288
-#CHECK: error: %r0 used in an address
-#CHECK: sllk	%r0,%r0,0(%r0)
 #CHECK: error: invalid use of indexed addressing
 #CHECK: sllk	%r0,%r0,0(%r1,%r2)
 
 	sllk	%r0,%r0,-524289
 	sllk	%r0,%r0,524288
-	sllk	%r0,%r0,0(%r0)
 	sllk	%r0,%r0,0(%r1,%r2)
 
 #CHECK: error: invalid operand
 #CHECK: srak	%r0,%r0,-524289
 #CHECK: error: invalid operand
 #CHECK: srak	%r0,%r0,524288
-#CHECK: error: %r0 used in an address
-#CHECK: srak	%r0,%r0,0(%r0)
 #CHECK: error: invalid use of indexed addressing
 #CHECK: srak	%r0,%r0,0(%r1,%r2)
 
 	srak	%r0,%r0,-524289
 	srak	%r0,%r0,524288
-	srak	%r0,%r0,0(%r0)
 	srak	%r0,%r0,0(%r1,%r2)
 
 #CHECK: error: invalid operand
 #CHECK: srlk	%r0,%r0,-524289
 #CHECK: error: invalid operand
 #CHECK: srlk	%r0,%r0,524288
-#CHECK: error: %r0 used in an address
-#CHECK: srlk	%r0,%r0,0(%r0)
 #CHECK: error: invalid use of indexed addressing
 #CHECK: srlk	%r0,%r0,0(%r1,%r2)
 
 	srlk	%r0,%r0,-524289
 	srlk	%r0,%r0,524288
-	srlk	%r0,%r0,0(%r0)
 	srlk	%r0,%r0,0(%r1,%r2)
 
 #CHECK: error: invalid operand

diff  --git a/llvm/test/MC/SystemZ/insn-bad-zEC12.s b/llvm/test/MC/SystemZ/insn-bad-zEC12.s
index 552180a7c610..b5cc6ebfd0be 100644
--- a/llvm/test/MC/SystemZ/insn-bad-zEC12.s
+++ b/llvm/test/MC/SystemZ/insn-bad-zEC12.s
@@ -83,8 +83,6 @@
 #CHECK: cdzt	%f0, -1(1,%r1), 0
 #CHECK: error: invalid operand
 #CHECK: cdzt	%f0, 4096(1,%r1), 0
-#CHECK: error: %r0 used in an address
-#CHECK: cdzt	%f0, 0(1,%r0), 0
 #CHECK: error: invalid use of indexed addressing
 #CHECK: cdzt	%f0, 0(%r1,%r2), 0
 #CHECK: error: unknown token in expression
@@ -98,7 +96,6 @@
 	cdzt	%f0, 0(257,%r1), 0
 	cdzt	%f0, -1(1,%r1), 0
 	cdzt	%f0, 4096(1,%r1), 0
-	cdzt	%f0, 0(1,%r0), 0
 	cdzt	%f0, 0(%r1,%r2), 0
 	cdzt	%f0, 0(-), 0
 
@@ -197,8 +194,6 @@
 #CHECK: cxzt	%f0, -1(1,%r1), 0
 #CHECK: error: invalid operand
 #CHECK: cxzt	%f0, 4096(1,%r1), 0
-#CHECK: error: %r0 used in an address
-#CHECK: cxzt	%f0, 0(1,%r0), 0
 #CHECK: error: invalid use of indexed addressing
 #CHECK: cxzt	%f0, 0(%r1,%r2), 0
 #CHECK: error: unknown token in expression
@@ -214,7 +209,6 @@
 	cxzt	%f0, 0(257,%r1), 0
 	cxzt	%f0, -1(1,%r1), 0
 	cxzt	%f0, 4096(1,%r1), 0
-	cxzt	%f0, 0(1,%r0), 0
 	cxzt	%f0, 0(%r1,%r2), 0
 	cxzt	%f0, 0(-), 0
 	cxzt	%f15, 0(1), 0
@@ -235,8 +229,6 @@
 #CHECK: czdt	%f0, -1(1,%r1), 0
 #CHECK: error: invalid operand
 #CHECK: czdt	%f0, 4096(1,%r1), 0
-#CHECK: error: %r0 used in an address
-#CHECK: czdt	%f0, 0(1,%r0), 0
 #CHECK: error: invalid use of indexed addressing
 #CHECK: czdt	%f0, 0(%r1,%r2), 0
 #CHECK: error: unknown token in expression
@@ -250,7 +242,6 @@
 	czdt	%f0, 0(257,%r1), 0
 	czdt	%f0, -1(1,%r1), 0
 	czdt	%f0, 4096(1,%r1), 0
-	czdt	%f0, 0(1,%r0), 0
 	czdt	%f0, 0(%r1,%r2), 0
 	czdt	%f0, 0(-), 0
 
@@ -270,8 +261,6 @@
 #CHECK: czxt	%f0, -1(1,%r1), 0
 #CHECK: error: invalid operand
 #CHECK: czxt	%f0, 4096(1,%r1), 0
-#CHECK: error: %r0 used in an address
-#CHECK: czxt	%f0, 0(1,%r0), 0
 #CHECK: error: invalid use of indexed addressing
 #CHECK: czxt	%f0, 0(%r1,%r2), 0
 #CHECK: error: unknown token in expression
@@ -287,7 +276,6 @@
 	czxt	%f0, 0(257,%r1), 0
 	czxt	%f0, -1(1,%r1), 0
 	czxt	%f0, 4096(1,%r1), 0
-	czxt	%f0, 0(1,%r0), 0
 	czxt	%f0, 0(%r1,%r2), 0
 	czxt	%f0, 0(-), 0
 	czxt	%f15, 0(1), 0

diff  --git a/llvm/test/MC/SystemZ/insn-bad.s b/llvm/test/MC/SystemZ/insn-bad.s
index 7dfbba743b60..c330fa496a25 100644
--- a/llvm/test/MC/SystemZ/insn-bad.s
+++ b/llvm/test/MC/SystemZ/insn-bad.s
@@ -328,10 +328,6 @@
 #CHECK: ap	0(1,%r1), -1(1,%r1)
 #CHECK: error: invalid operand
 #CHECK: ap	0(1,%r1), 4096(1,%r1)
-#CHECK: error: %r0 used in an address
-#CHECK: ap	0(1,%r0), 0(1,%r1)
-#CHECK: error: %r0 used in an address
-#CHECK: ap	0(1,%r1), 0(1,%r0)
 #CHECK: error: invalid use of indexed addressing
 #CHECK: ap	0(%r1,%r2), 0(1,%r1)
 #CHECK: error: invalid use of indexed addressing
@@ -351,8 +347,6 @@
 	ap	4096(1,%r1), 0(1,%r1)
 	ap	0(1,%r1), -1(1,%r1)
 	ap	0(1,%r1), 4096(1,%r1)
-	ap	0(1,%r0), 0(1,%r1)
-	ap	0(1,%r1), 0(1,%r0)
 	ap	0(%r1,%r2), 0(1,%r1)
 	ap	0(1,%r2), 0(%r1,%r2)
 	ap	0(-), 0(1)
@@ -1363,10 +1357,6 @@
 #CHECK: clc	0(1,%r1), -1(%r1)
 #CHECK: error: invalid operand
 #CHECK: clc	0(1,%r1), 4096(%r1)
-#CHECK: error: %r0 used in an address
-#CHECK: clc	0(1,%r0), 0(%r1)
-#CHECK: error: %r0 used in an address
-#CHECK: clc	0(1,%r1), 0(%r0)
 #CHECK: error: invalid use of indexed addressing
 #CHECK: clc	0(%r1,%r2), 0(%r1)
 #CHECK: error: invalid use of indexed addressing
@@ -1383,8 +1373,6 @@
 	clc	4096(1,%r1), 0(%r1)
 	clc	0(1,%r1), -1(%r1)
 	clc	0(1,%r1), 4096(%r1)
-	clc	0(1,%r0), 0(%r1)
-	clc	0(1,%r1), 0(%r0)
 	clc	0(%r1,%r2), 0(%r1)
 	clc	0(1,%r2), 0(%r1,%r2)
 	clc	0(-), 0
@@ -1904,10 +1892,6 @@
 #CHECK: cp	0(1,%r1), -1(1,%r1)
 #CHECK: error: invalid operand
 #CHECK: cp	0(1,%r1), 4096(1,%r1)
-#CHECK: error: %r0 used in an address
-#CHECK: cp	0(1,%r0), 0(1,%r1)
-#CHECK: error: %r0 used in an address
-#CHECK: cp	0(1,%r1), 0(1,%r0)
 #CHECK: error: invalid use of indexed addressing
 #CHECK: cp	0(%r1,%r2), 0(1,%r1)
 #CHECK: error: invalid use of indexed addressing
@@ -1927,8 +1911,6 @@
 	cp	4096(1,%r1), 0(1,%r1)
 	cp	0(1,%r1), -1(1,%r1)
 	cp	0(1,%r1), 4096(1,%r1)
-	cp	0(1,%r0), 0(1,%r1)
-	cp	0(1,%r1), 0(1,%r0)
 	cp	0(%r1,%r2), 0(1,%r1)
 	cp	0(1,%r2), 0(%r1,%r2)
 	cp	0(-), 0(1)
@@ -2472,10 +2454,6 @@
 #CHECK: dp	0(1,%r1), -1(1,%r1)
 #CHECK: error: invalid operand
 #CHECK: dp	0(1,%r1), 4096(1,%r1)
-#CHECK: error: %r0 used in an address
-#CHECK: dp	0(1,%r0), 0(1,%r1)
-#CHECK: error: %r0 used in an address
-#CHECK: dp	0(1,%r1), 0(1,%r0)
 #CHECK: error: invalid use of indexed addressing
 #CHECK: dp	0(%r1,%r2), 0(1,%r1)
 #CHECK: error: invalid use of indexed addressing
@@ -2495,8 +2473,6 @@
 	dp	4096(1,%r1), 0(1,%r1)
 	dp	0(1,%r1), -1(1,%r1)
 	dp	0(1,%r1), 4096(1,%r1)
-	dp	0(1,%r0), 0(1,%r1)
-	dp	0(1,%r1), 0(1,%r0)
 	dp	0(%r1,%r2), 0(1,%r1)
 	dp	0(1,%r2), 0(%r1,%r2)
 	dp	0(-), 0(1)
@@ -2611,10 +2587,6 @@
 #CHECK: ed	0(1,%r1), -1(%r1)
 #CHECK: error: invalid operand
 #CHECK: ed	0(1,%r1), 4096(%r1)
-#CHECK: error: %r0 used in an address
-#CHECK: ed	0(1,%r0), 0(%r1)
-#CHECK: error: %r0 used in an address
-#CHECK: ed	0(1,%r1), 0(%r0)
 #CHECK: error: invalid use of indexed addressing
 #CHECK: ed	0(%r1,%r2), 0(%r1)
 #CHECK: error: invalid use of indexed addressing
@@ -2631,8 +2603,6 @@
 	ed	4096(1,%r1), 0(%r1)
 	ed	0(1,%r1), -1(%r1)
 	ed	0(1,%r1), 4096(%r1)
-	ed	0(1,%r0), 0(%r1)
-	ed	0(1,%r1), 0(%r0)
 	ed	0(%r1,%r2), 0(%r1)
 	ed	0(1,%r2), 0(%r1,%r2)
 	ed	0(-), 0
@@ -2655,10 +2625,6 @@
 #CHECK: edmk	0(1,%r1), -1(%r1)
 #CHECK: error: invalid operand
 #CHECK: edmk	0(1,%r1), 4096(%r1)
-#CHECK: error: %r0 used in an address
-#CHECK: edmk	0(1,%r0), 0(%r1)
-#CHECK: error: %r0 used in an address
-#CHECK: edmk	0(1,%r1), 0(%r0)
 #CHECK: error: invalid use of indexed addressing
 #CHECK: edmk	0(%r1,%r2), 0(%r1)
 #CHECK: error: invalid use of indexed addressing
@@ -2675,8 +2641,6 @@
 	edmk	4096(1,%r1), 0(%r1)
 	edmk	0(1,%r1), -1(%r1)
 	edmk	0(1,%r1), 4096(%r1)
-	edmk	0(1,%r0), 0(%r1)
-	edmk	0(1,%r1), 0(%r0)
 	edmk	0(%r1,%r2), 0(%r1)
 	edmk	0(1,%r2), 0(%r1,%r2)
 	edmk	0(-), 0
@@ -4281,10 +4245,6 @@
 #CHECK: mp	0(1,%r1), -1(1,%r1)
 #CHECK: error: invalid operand
 #CHECK: mp	0(1,%r1), 4096(1,%r1)
-#CHECK: error: %r0 used in an address
-#CHECK: mp	0(1,%r0), 0(1,%r1)
-#CHECK: error: %r0 used in an address
-#CHECK: mp	0(1,%r1), 0(1,%r0)
 #CHECK: error: invalid use of indexed addressing
 #CHECK: mp	0(%r1,%r2), 0(1,%r1)
 #CHECK: error: invalid use of indexed addressing
@@ -4304,8 +4264,6 @@
 	mp	4096(1,%r1), 0(1,%r1)
 	mp	0(1,%r1), -1(1,%r1)
 	mp	0(1,%r1), 4096(1,%r1)
-	mp	0(1,%r0), 0(1,%r1)
-	mp	0(1,%r1), 0(1,%r0)
 	mp	0(%r1,%r2), 0(1,%r1)
 	mp	0(1,%r2), 0(%r1,%r2)
 	mp	0(-), 0(1)
@@ -4429,10 +4387,6 @@
 #CHECK: mvc	0(1,%r1), -1(%r1)
 #CHECK: error: invalid operand
 #CHECK: mvc	0(1,%r1), 4096(%r1)
-#CHECK: error: %r0 used in an address
-#CHECK: mvc	0(1,%r0), 0(%r1)
-#CHECK: error: %r0 used in an address
-#CHECK: mvc	0(1,%r1), 0(%r0)
 #CHECK: error: invalid use of indexed addressing
 #CHECK: mvc	0(%r1,%r2), 0(%r1)
 #CHECK: error: invalid use of indexed addressing
@@ -4449,8 +4403,6 @@
 	mvc	4096(1,%r1), 0(%r1)
 	mvc	0(1,%r1), -1(%r1)
 	mvc	0(1,%r1), 4096(%r1)
-	mvc	0(1,%r0), 0(%r1)
-	mvc	0(1,%r1), 0(%r0)
 	mvc	0(%r1,%r2), 0(%r1)
 	mvc	0(1,%r2), 0(%r1,%r2)
 	mvc	0(-), 0
@@ -4490,10 +4442,6 @@
 #CHECK: mvcin	0(1,%r1), -1(%r1)
 #CHECK: error: invalid operand
 #CHECK: mvcin	0(1,%r1), 4096(%r1)
-#CHECK: error: %r0 used in an address
-#CHECK: mvcin	0(1,%r0), 0(%r1)
-#CHECK: error: %r0 used in an address
-#CHECK: mvcin	0(1,%r1), 0(%r0)
 #CHECK: error: invalid use of indexed addressing
 #CHECK: mvcin	0(%r1,%r2), 0(%r1)
 #CHECK: error: invalid use of indexed addressing
@@ -4510,8 +4458,6 @@
 	mvcin	4096(1,%r1), 0(%r1)
 	mvcin	0(1,%r1), -1(%r1)
 	mvcin	0(1,%r1), 4096(%r1)
-	mvcin	0(1,%r0), 0(%r1)
-	mvcin	0(1,%r1), 0(%r0)
 	mvcin	0(%r1,%r2), 0(%r1)
 	mvcin	0(1,%r2), 0(%r1,%r2)
 	mvcin	0(-), 0
@@ -4526,10 +4472,6 @@
 #CHECK: mvck	0(%r1,%r1), -1(%r1), %r3
 #CHECK: error: invalid operand
 #CHECK: mvck	0(%r1,%r1), 4096(%r1), %r3
-#CHECK: error: %r0 used in an address
-#CHECK: mvck	0(%r1,%r0), 0(%r1), %r3
-#CHECK: error: %r0 used in an address
-#CHECK: mvck	0(%r1,%r1), 0(%r0), %r3
 #CHECK: error: invalid use of indexed addressing
 #CHECK: mvck	0(%r1,%r2), 0(%r1,%r2), %r3
 #CHECK: error: unknown token in expression
@@ -4540,8 +4482,6 @@
 	mvck	4096(%r1,%r1), 0(%r1), %r3
 	mvck	0(%r1,%r1), -1(%r1), %r3
 	mvck	0(%r1,%r1), 4096(%r1), %r3
-	mvck	0(%r1,%r0), 0(%r1), %r3
-	mvck	0(%r1,%r1), 0(%r0), %r3
 	mvck	0(%r1,%r2), 0(%r1,%r2), %r3
 	mvck	0(-), 0, %r3
 
@@ -4608,10 +4548,6 @@
 #CHECK: mvcp	0(%r1,%r1), -1(%r1), %r3
 #CHECK: error: invalid operand
 #CHECK: mvcp	0(%r1,%r1), 4096(%r1), %r3
-#CHECK: error: %r0 used in an address
-#CHECK: mvcp	0(%r1,%r0), 0(%r1), %r3
-#CHECK: error: %r0 used in an address
-#CHECK: mvcp	0(%r1,%r1), 0(%r0), %r3
 #CHECK: error: invalid use of indexed addressing
 #CHECK: mvcp	0(%r1,%r2), 0(%r1,%r2), %r3
 #CHECK: error: unknown token in expression
@@ -4622,8 +4558,6 @@
 	mvcp	4096(%r1,%r1), 0(%r1), %r3
 	mvcp	0(%r1,%r1), -1(%r1), %r3
 	mvcp	0(%r1,%r1), 4096(%r1), %r3
-	mvcp	0(%r1,%r0), 0(%r1), %r3
-	mvcp	0(%r1,%r1), 0(%r0), %r3
 	mvcp	0(%r1,%r2), 0(%r1,%r2), %r3
 	mvcp	0(-), 0, %r3
 
@@ -4637,10 +4571,6 @@
 #CHECK: mvcs	0(%r1,%r1), -1(%r1), %r3
 #CHECK: error: invalid operand
 #CHECK: mvcs	0(%r1,%r1), 4096(%r1), %r3
-#CHECK: error: %r0 used in an address
-#CHECK: mvcs	0(%r1,%r0), 0(%r1), %r3
-#CHECK: error: %r0 used in an address
-#CHECK: mvcs	0(%r1,%r1), 0(%r0), %r3
 #CHECK: error: invalid use of indexed addressing
 #CHECK: mvcs	0(%r1,%r2), 0(%r1,%r2), %r3
 #CHECK: error: unknown token in expression
@@ -4651,8 +4581,6 @@
 	mvcs	4096(%r1,%r1), 0(%r1), %r3
 	mvcs	0(%r1,%r1), -1(%r1), %r3
 	mvcs	0(%r1,%r1), 4096(%r1), %r3
-	mvcs	0(%r1,%r0), 0(%r1), %r3
-	mvcs	0(%r1,%r1), 0(%r0), %r3
 	mvcs	0(%r1,%r2), 0(%r1,%r2), %r3
 	mvcs	0(-), 0, %r3
 
@@ -4776,10 +4704,6 @@
 #CHECK: mvn	0(1,%r1), -1(%r1)
 #CHECK: error: invalid operand
 #CHECK: mvn	0(1,%r1), 4096(%r1)
-#CHECK: error: %r0 used in an address
-#CHECK: mvn	0(1,%r0), 0(%r1)
-#CHECK: error: %r0 used in an address
-#CHECK: mvn	0(1,%r1), 0(%r0)
 #CHECK: error: invalid use of indexed addressing
 #CHECK: mvn	0(%r1,%r2), 0(%r1)
 #CHECK: error: invalid use of indexed addressing
@@ -4796,8 +4720,6 @@
 	mvn	4096(1,%r1), 0(%r1)
 	mvn	0(1,%r1), -1(%r1)
 	mvn	0(1,%r1), 4096(%r1)
-	mvn	0(1,%r0), 0(%r1)
-	mvn	0(1,%r1), 0(%r0)
 	mvn	0(%r1,%r2), 0(%r1)
 	mvn	0(1,%r2), 0(%r1,%r2)
 	mvn	0(-), 0
@@ -4826,10 +4748,6 @@
 #CHECK: mvo	0(1,%r1), -1(1,%r1)
 #CHECK: error: invalid operand
 #CHECK: mvo	0(1,%r1), 4096(1,%r1)
-#CHECK: error: %r0 used in an address
-#CHECK: mvo	0(1,%r0), 0(1,%r1)
-#CHECK: error: %r0 used in an address
-#CHECK: mvo	0(1,%r1), 0(1,%r0)
 #CHECK: error: invalid use of indexed addressing
 #CHECK: mvo	0(%r1,%r2), 0(1,%r1)
 #CHECK: error: invalid use of indexed addressing
@@ -4849,8 +4767,6 @@
 	mvo	4096(1,%r1), 0(1,%r1)
 	mvo	0(1,%r1), -1(1,%r1)
 	mvo	0(1,%r1), 4096(1,%r1)
-	mvo	0(1,%r0), 0(1,%r1)
-	mvo	0(1,%r1), 0(1,%r0)
 	mvo	0(%r1,%r2), 0(1,%r1)
 	mvo	0(1,%r2), 0(%r1,%r2)
 	mvo	0(-), 0(1)
@@ -4873,10 +4789,6 @@
 #CHECK: mvz	0(1,%r1), -1(%r1)
 #CHECK: error: invalid operand
 #CHECK: mvz	0(1,%r1), 4096(%r1)
-#CHECK: error: %r0 used in an address
-#CHECK: mvz	0(1,%r0), 0(%r1)
-#CHECK: error: %r0 used in an address
-#CHECK: mvz	0(1,%r1), 0(%r0)
 #CHECK: error: invalid use of indexed addressing
 #CHECK: mvz	0(%r1,%r2), 0(%r1)
 #CHECK: error: invalid use of indexed addressing
@@ -4893,8 +4805,6 @@
 	mvz	4096(1,%r1), 0(%r1)
 	mvz	0(1,%r1), -1(%r1)
 	mvz	0(1,%r1), 4096(%r1)
-	mvz	0(1,%r0), 0(%r1)
-	mvz	0(1,%r1), 0(%r0)
 	mvz	0(%r1,%r2), 0(%r1)
 	mvz	0(1,%r2), 0(%r1,%r2)
 	mvz	0(-), 0
@@ -5021,10 +4931,6 @@
 #CHECK: nc	0(1,%r1), -1(%r1)
 #CHECK: error: invalid operand
 #CHECK: nc	0(1,%r1), 4096(%r1)
-#CHECK: error: %r0 used in an address
-#CHECK: nc	0(1,%r0), 0(%r1)
-#CHECK: error: %r0 used in an address
-#CHECK: nc	0(1,%r1), 0(%r0)
 #CHECK: error: invalid use of indexed addressing
 #CHECK: nc	0(%r1,%r2), 0(%r1)
 #CHECK: error: invalid use of indexed addressing
@@ -5041,8 +4947,6 @@
 	nc	4096(1,%r1), 0(%r1)
 	nc	0(1,%r1), -1(%r1)
 	nc	0(1,%r1), 4096(%r1)
-	nc	0(1,%r0), 0(%r1)
-	nc	0(1,%r1), 0(%r0)
 	nc	0(%r1,%r2), 0(%r1)
 	nc	0(1,%r2), 0(%r1,%r2)
 	nc	0(-), 0
@@ -5181,10 +5085,6 @@
 #CHECK: oc	0(1,%r1), -1(%r1)
 #CHECK: error: invalid operand
 #CHECK: oc	0(1,%r1), 4096(%r1)
-#CHECK: error: %r0 used in an address
-#CHECK: oc	0(1,%r0), 0(%r1)
-#CHECK: error: %r0 used in an address
-#CHECK: oc	0(1,%r1), 0(%r0)
 #CHECK: error: invalid use of indexed addressing
 #CHECK: oc	0(%r1,%r2), 0(%r1)
 #CHECK: error: invalid use of indexed addressing
@@ -5201,8 +5101,6 @@
 	oc	4096(1,%r1), 0(%r1)
 	oc	0(1,%r1), -1(%r1)
 	oc	0(1,%r1), 4096(%r1)
-	oc	0(1,%r0), 0(%r1)
-	oc	0(1,%r1), 0(%r0)
 	oc	0(%r1,%r2), 0(%r1)
 	oc	0(1,%r2), 0(%r1,%r2)
 	oc	0(-), 0
@@ -5339,10 +5237,6 @@
 #CHECK: pack	0(1,%r1), -1(1,%r1)
 #CHECK: error: invalid operand
 #CHECK: pack	0(1,%r1), 4096(1,%r1)
-#CHECK: error: %r0 used in an address
-#CHECK: pack	0(1,%r0), 0(1,%r1)
-#CHECK: error: %r0 used in an address
-#CHECK: pack	0(1,%r1), 0(1,%r0)
 #CHECK: error: invalid use of indexed addressing
 #CHECK: pack	0(%r1,%r2), 0(1,%r1)
 #CHECK: error: invalid use of indexed addressing
@@ -5362,8 +5256,6 @@
 	pack	4096(1,%r1), 0(1,%r1)
 	pack	0(1,%r1), -1(1,%r1)
 	pack	0(1,%r1), 4096(1,%r1)
-	pack	0(1,%r0), 0(1,%r1)
-	pack	0(1,%r1), 0(1,%r0)
 	pack	0(%r1,%r2), 0(1,%r1)
 	pack	0(1,%r2), 0(%r1,%r2)
 	pack	0(-), 0(1)
@@ -5441,10 +5333,6 @@
 #CHECK: pka	0(%r1), -1(1,%r1)
 #CHECK: error: invalid operand
 #CHECK: pka	0(%r1), 4096(1,%r1)
-#CHECK: error: %r0 used in an address
-#CHECK: pka	0(%r0), 0(1,%r1)
-#CHECK: error: %r0 used in an address
-#CHECK: pka	0(%r1), 0(1,%r0)
 #CHECK: error: invalid use of indexed addressing
 #CHECK: pka	0(%r1,%r2), 0(1,%r1)
 #CHECK: error: invalid use of indexed addressing
@@ -5461,8 +5349,6 @@
 	pka	4096(%r1), 0(1,%r1)
 	pka	0(%r1), -1(1,%r1)
 	pka	0(%r1), 4096(1,%r1)
-	pka	0(%r0), 0(1,%r1)
-	pka	0(%r1), 0(1,%r0)
 	pka	0(%r1,%r2), 0(1,%r1)
 	pka	0(%r2), 0(%r1,%r2)
 	pka	0, 0(-)
@@ -5485,10 +5371,6 @@
 #CHECK: pku	0(%r1), -1(1,%r1)
 #CHECK: error: invalid operand
 #CHECK: pku	0(%r1), 4096(1,%r1)
-#CHECK: error: %r0 used in an address
-#CHECK: pku	0(%r0), 0(1,%r1)
-#CHECK: error: %r0 used in an address
-#CHECK: pku	0(%r1), 0(1,%r0)
 #CHECK: error: invalid use of indexed addressing
 #CHECK: pku	0(%r1,%r2), 0(1,%r1)
 #CHECK: error: invalid use of indexed addressing
@@ -5618,28 +5500,22 @@
 #CHECK: rll	%r0,%r0,-524289
 #CHECK: error: invalid operand
 #CHECK: rll	%r0,%r0,524288
-#CHECK: error: %r0 used in an address
-#CHECK: rll	%r0,%r0,0(%r0)
 #CHECK: error: invalid use of indexed addressing
 #CHECK: rll	%r0,%r0,0(%r1,%r2)
 
 	rll	%r0,%r0,-524289
 	rll	%r0,%r0,524288
-	rll	%r0,%r0,0(%r0)
 	rll	%r0,%r0,0(%r1,%r2)
 
 #CHECK: error: invalid operand
 #CHECK: rllg	%r0,%r0,-524289
 #CHECK: error: invalid operand
 #CHECK: rllg	%r0,%r0,524288
-#CHECK: error: %r0 used in an address
-#CHECK: rllg	%r0,%r0,0(%r0)
 #CHECK: error: invalid use of indexed addressing
 #CHECK: rllg	%r0,%r0,0(%r1,%r2)
 
 	rllg	%r0,%r0,-524289
 	rllg	%r0,%r0,524288
-	rllg	%r0,%r0,0(%r0)
 	rllg	%r0,%r0,0(%r1,%r2)
 
 #CHECK: error: invalid operand
@@ -5924,28 +5800,22 @@
 #CHECK: sla	%r0,-1
 #CHECK: error: invalid operand
 #CHECK: sla	%r0,4096
-#CHECK: error: %r0 used in an address
-#CHECK: sla	%r0,0(%r0)
 #CHECK: error: invalid use of indexed addressing
 #CHECK: sla	%r0,0(%r1,%r2)
 
 	sla	%r0,-1
 	sla	%r0,4096
-	sla	%r0,0(%r0)
 	sla	%r0,0(%r1,%r2)
 
 #CHECK: error: invalid operand
 #CHECK: slag	%r0,%r0,-524289
 #CHECK: error: invalid operand
 #CHECK: slag	%r0,%r0,524288
-#CHECK: error: %r0 used in an address
-#CHECK: slag	%r0,%r0,0(%r0)
 #CHECK: error: invalid use of indexed addressing
 #CHECK: slag	%r0,%r0,0(%r1,%r2)
 
 	slag	%r0,%r0,-524289
 	slag	%r0,%r0,524288
-	slag	%r0,%r0,0(%r0)
 	slag	%r0,%r0,0(%r1,%r2)
 
 #CHECK: error: instruction requires: distinct-ops
@@ -5975,15 +5845,12 @@
 #CHECK: slda	%r0,-1
 #CHECK: error: invalid operand
 #CHECK: slda	%r0,4096
-#CHECK: error: %r0 used in an address
-#CHECK: slda	%r0,0(%r0)
 #CHECK: error: invalid use of indexed addressing
 #CHECK: slda	%r0,0(%r1,%r2)
 
 	slda	%r1,0
 	slda	%r0,-1
 	slda	%r0,4096
-	slda	%r0,0(%r0)
 	slda	%r0,0(%r1,%r2)
 
 #CHECK: error: invalid register pair
@@ -5992,15 +5859,12 @@
 #CHECK: sldl	%r0,-1
 #CHECK: error: invalid operand
 #CHECK: sldl	%r0,4096
-#CHECK: error: %r0 used in an address
-#CHECK: sldl	%r0,0(%r0)
 #CHECK: error: invalid use of indexed addressing
 #CHECK: sldl	%r0,0(%r1,%r2)
 
 	sldl	%r1,0
 	sldl	%r0,-1
 	sldl	%r0,4096
-	sldl	%r0,0(%r0)
 	sldl	%r0,0(%r1,%r2)
 
 #CHECK: error: invalid operand
@@ -6062,28 +5926,22 @@
 #CHECK: sll	%r0,-1
 #CHECK: error: invalid operand
 #CHECK: sll	%r0,4096
-#CHECK: error: %r0 used in an address
-#CHECK: sll	%r0,0(%r0)
 #CHECK: error: invalid use of indexed addressing
 #CHECK: sll	%r0,0(%r1,%r2)
 
 	sll	%r0,-1
 	sll	%r0,4096
-	sll	%r0,0(%r0)
 	sll	%r0,0(%r1,%r2)
 
 #CHECK: error: invalid operand
 #CHECK: sllg	%r0,%r0,-524289
 #CHECK: error: invalid operand
 #CHECK: sllg	%r0,%r0,524288
-#CHECK: error: %r0 used in an address
-#CHECK: sllg	%r0,%r0,0(%r0)
 #CHECK: error: invalid use of indexed addressing
 #CHECK: sllg	%r0,%r0,0(%r1,%r2)
 
 	sllg	%r0,%r0,-524289
 	sllg	%r0,%r0,524288
-	sllg	%r0,%r0,0(%r0)
 	sllg	%r0,%r0,0(%r1,%r2)
 
 #CHECK: error: instruction requires: distinct-ops
@@ -6142,10 +6000,6 @@
 #CHECK: sp	0(1,%r1), -1(1,%r1)
 #CHECK: error: invalid operand
 #CHECK: sp	0(1,%r1), 4096(1,%r1)
-#CHECK: error: %r0 used in an address
-#CHECK: sp	0(1,%r0), 0(1,%r1)
-#CHECK: error: %r0 used in an address
-#CHECK: sp	0(1,%r1), 0(1,%r0)
 #CHECK: error: invalid use of indexed addressing
 #CHECK: sp	0(%r1,%r2), 0(1,%r1)
 #CHECK: error: invalid use of indexed addressing
@@ -6165,8 +6019,6 @@
 	sp	4096(1,%r1), 0(1,%r1)
 	sp	0(1,%r1), -1(1,%r1)
 	sp	0(1,%r1), 4096(1,%r1)
-	sp	0(1,%r0), 0(1,%r1)
-	sp	0(1,%r1), 0(1,%r0)
 	sp	0(%r1,%r2), 0(1,%r1)
 	sp	0(1,%r2), 0(%r1,%r2)
 	sp	0(-), 0(1)
@@ -6256,8 +6108,6 @@
 #CHECK: sra	%r0,-1
 #CHECK: error: invalid operand
 #CHECK: sra	%r0,4096
-#CHECK: error: %r0 used in an address
-#CHECK: sra	%r0,0(%r0)
 #CHECK: error: invalid use of indexed addressing
 #CHECK: sra	%r0,0(%r1,%r2)
 
@@ -6270,8 +6120,6 @@
 #CHECK: srag	%r0,%r0,-524289
 #CHECK: error: invalid operand
 #CHECK: srag	%r0,%r0,524288
-#CHECK: error: %r0 used in an address
-#CHECK: srag	%r0,%r0,0(%r0)
 #CHECK: error: invalid use of indexed addressing
 #CHECK: srag	%r0,%r0,0(%r1,%r2)
 
@@ -6291,15 +6139,12 @@
 #CHECK: srda	%r0,-1
 #CHECK: error: invalid operand
 #CHECK: srda	%r0,4096
-#CHECK: error: %r0 used in an address
-#CHECK: srda	%r0,0(%r0)
 #CHECK: error: invalid use of indexed addressing
 #CHECK: srda	%r0,0(%r1,%r2)
 
 	srda	%r1,0
 	srda	%r0,-1
 	srda	%r0,4096
-	srda	%r0,0(%r0)
 	srda	%r0,0(%r1,%r2)
 
 #CHECK: error: invalid register pair
@@ -6308,15 +6153,12 @@
 #CHECK: srdl	%r0,-1
 #CHECK: error: invalid operand
 #CHECK: srdl	%r0,4096
-#CHECK: error: %r0 used in an address
-#CHECK: srdl	%r0,0(%r0)
 #CHECK: error: invalid use of indexed addressing
 #CHECK: srdl	%r0,0(%r1,%r2)
 
 	srdl	%r1,0
 	srdl	%r0,-1
 	srdl	%r0,4096
-	srdl	%r0,0(%r0)
 	srdl	%r0,0(%r1,%r2)
 
 #CHECK: error: invalid operand
@@ -6336,28 +6178,22 @@
 #CHECK: srl	%r0,-1
 #CHECK: error: invalid operand
 #CHECK: srl	%r0,4096
-#CHECK: error: %r0 used in an address
-#CHECK: srl	%r0,0(%r0)
 #CHECK: error: invalid use of indexed addressing
 #CHECK: srl	%r0,0(%r1,%r2)
 
 	srl	%r0,-1
 	srl	%r0,4096
-	srl	%r0,0(%r0)
 	srl	%r0,0(%r1,%r2)
 
 #CHECK: error: invalid operand
 #CHECK: srlg	%r0,%r0,-524289
 #CHECK: error: invalid operand
 #CHECK: srlg	%r0,%r0,524288
-#CHECK: error: %r0 used in an address
-#CHECK: srlg	%r0,%r0,0(%r0)
 #CHECK: error: invalid use of indexed addressing
 #CHECK: srlg	%r0,%r0,0(%r1,%r2)
 
 	srlg	%r0,%r0,-524289
 	srlg	%r0,%r0,524288
-	srlg	%r0,%r0,0(%r0)
 	srlg	%r0,%r0,0(%r1,%r2)
 
 #CHECK: error: instruction requires: distinct-ops
@@ -6410,10 +6246,6 @@
 #CHECK: srp	0(1,%r1), -1(%r1), 0
 #CHECK: error: invalid operand
 #CHECK: srp	0(1,%r1), 4096(%r1), 0
-#CHECK: error: %r0 used in an address
-#CHECK: srp	0(1,%r0), 0(%r1), 0
-#CHECK: error: %r0 used in an address
-#CHECK: srp	0(1,%r1), 0(%r0), 0
 #CHECK: error: invalid use of indexed addressing
 #CHECK: srp	0(%r1,%r2), 0(%r1), 0
 #CHECK: error: invalid use of indexed addressing
@@ -6434,8 +6266,6 @@
 	srp	4096(1,%r1), 0(%r1), 0
 	srp	0(1,%r1), -1(%r1), 0
 	srp	0(1,%r1), 4096(%r1), 0
-	srp	0(1,%r0), 0(%r1), 0
-	srp	0(1,%r1), 0(%r0), 0
 	srp	0(%r1,%r2), 0(%r1), 0
 	srp	0(1,%r2), 0(%r1,%r2), 0
 	srp	0(1), 0, -1
@@ -7242,8 +7072,6 @@
 #CHECK: tp	-1(1,%r1)
 #CHECK: error: invalid operand
 #CHECK: tp	4096(1,%r1)
-#CHECK: error: %r0 used in an address
-#CHECK: tp	0(1,%r0)
 #CHECK: error: invalid use of indexed addressing
 #CHECK: tp	0(%r1,%r2)
 #CHECK: error: unknown token in expression
@@ -7255,7 +7083,6 @@
 	tp	0(17,%r1)
 	tp	-1(1,%r1)
 	tp	4096(1,%r1)
-	tp	0(1,%r0)
 	tp	0(%r1,%r2)
 	tp	0(-)
 
@@ -7305,10 +7132,6 @@
 #CHECK: tr	0(1,%r1), -1(%r1)
 #CHECK: error: invalid operand
 #CHECK: tr	0(1,%r1), 4096(%r1)
-#CHECK: error: %r0 used in an address
-#CHECK: tr	0(1,%r0), 0(%r1)
-#CHECK: error: %r0 used in an address
-#CHECK: tr	0(1,%r1), 0(%r0)
 #CHECK: error: invalid use of indexed addressing
 #CHECK: tr	0(%r1,%r2), 0(%r1)
 #CHECK: error: invalid use of indexed addressing
@@ -7325,8 +7148,6 @@
 	tr	4096(1,%r1), 0(%r1)
 	tr	0(1,%r1), -1(%r1)
 	tr	0(1,%r1), 4096(%r1)
-	tr	0(1,%r0), 0(%r1)
-	tr	0(1,%r1), 0(%r0)
 	tr	0(%r1,%r2), 0(%r1)
 	tr	0(1,%r2), 0(%r1,%r2)
 	tr	0(-), 0
@@ -7409,10 +7230,6 @@
 #CHECK: trt	0(1,%r1), -1(%r1)
 #CHECK: error: invalid operand
 #CHECK: trt	0(1,%r1), 4096(%r1)
-#CHECK: error: %r0 used in an address
-#CHECK: trt	0(1,%r0), 0(%r1)
-#CHECK: error: %r0 used in an address
-#CHECK: trt	0(1,%r1), 0(%r0)
 #CHECK: error: invalid use of indexed addressing
 #CHECK: trt	0(%r1,%r2), 0(%r1)
 #CHECK: error: invalid use of indexed addressing
@@ -7429,8 +7246,6 @@
 	trt	4096(1,%r1), 0(%r1)
 	trt	0(1,%r1), -1(%r1)
 	trt	0(1,%r1), 4096(%r1)
-	trt	0(1,%r0), 0(%r1)
-	trt	0(1,%r1), 0(%r0)
 	trt	0(%r1,%r2), 0(%r1)
 	trt	0(1,%r2), 0(%r1,%r2)
 	trt	0(-), 0
@@ -7475,10 +7290,6 @@
 #CHECK: trtr	0(1,%r1), -1(%r1)
 #CHECK: error: invalid operand
 #CHECK: trtr	0(1,%r1), 4096(%r1)
-#CHECK: error: %r0 used in an address
-#CHECK: trtr	0(1,%r0), 0(%r1)
-#CHECK: error: %r0 used in an address
-#CHECK: trtr	0(1,%r1), 0(%r0)
 #CHECK: error: invalid use of indexed addressing
 #CHECK: trtr	0(%r1,%r2), 0(%r1)
 #CHECK: error: invalid use of indexed addressing
@@ -7495,8 +7306,6 @@
 	trtr	4096(1,%r1), 0(%r1)
 	trtr	0(1,%r1), -1(%r1)
 	trtr	0(1,%r1), 4096(%r1)
-	trtr	0(1,%r0), 0(%r1)
-	trtr	0(1,%r1), 0(%r0)
 	trtr	0(%r1,%r2), 0(%r1)
 	trtr	0(1,%r2), 0(%r1,%r2)
 	trtr	0(-), 0
@@ -7569,10 +7378,6 @@
 #CHECK: unpk	0(1,%r1), -1(1,%r1)
 #CHECK: error: invalid operand
 #CHECK: unpk	0(1,%r1), 4096(1,%r1)
-#CHECK: error: %r0 used in an address
-#CHECK: unpk	0(1,%r0), 0(1,%r1)
-#CHECK: error: %r0 used in an address
-#CHECK: unpk	0(1,%r1), 0(1,%r0)
 #CHECK: error: invalid use of indexed addressing
 #CHECK: unpk	0(%r1,%r2), 0(1,%r1)
 #CHECK: error: invalid use of indexed addressing
@@ -7592,8 +7397,6 @@
 	unpk	4096(1,%r1), 0(1,%r1)
 	unpk	0(1,%r1), -1(1,%r1)
 	unpk	0(1,%r1), 4096(1,%r1)
-	unpk	0(1,%r0), 0(1,%r1)
-	unpk	0(1,%r1), 0(1,%r0)
 	unpk	0(%r1,%r2), 0(1,%r1)
 	unpk	0(1,%r2), 0(%r1,%r2)
 	unpk	0(-), 0(1)
@@ -7616,10 +7419,6 @@
 #CHECK: unpka	0(1,%r1), -1(%r1)
 #CHECK: error: invalid operand
 #CHECK: unpka	0(1,%r1), 4096(%r1)
-#CHECK: error: %r0 used in an address
-#CHECK: unpka	0(1,%r0), 0(%r1)
-#CHECK: error: %r0 used in an address
-#CHECK: unpka	0(1,%r1), 0(%r0)
 #CHECK: error: invalid use of indexed addressing
 #CHECK: unpka	0(%r1,%r2), 0(%r1)
 #CHECK: error: invalid use of indexed addressing
@@ -7636,8 +7435,6 @@
 	unpka	4096(1,%r1), 0(%r1)
 	unpka	0(1,%r1), -1(%r1)
 	unpka	0(1,%r1), 4096(%r1)
-	unpka	0(1,%r0), 0(%r1)
-	unpka	0(1,%r1), 0(%r0)
 	unpka	0(%r1,%r2), 0(%r1)
 	unpka	0(1,%r2), 0(%r1,%r2)
 	unpka	0(-), 0
@@ -7660,10 +7457,6 @@
 #CHECK: unpku	0(1,%r1), -1(%r1)
 #CHECK: error: invalid operand
 #CHECK: unpku	0(1,%r1), 4096(%r1)
-#CHECK: error: %r0 used in an address
-#CHECK: unpku	0(1,%r0), 0(%r1)
-#CHECK: error: %r0 used in an address
-#CHECK: unpku	0(1,%r1), 0(%r0)
 #CHECK: error: invalid use of indexed addressing
 #CHECK: unpku	0(%r1,%r2), 0(%r1)
 #CHECK: error: invalid use of indexed addressing
@@ -7680,8 +7473,6 @@
 	unpku	4096(1,%r1), 0(%r1)
 	unpku	0(1,%r1), -1(%r1)
 	unpku	0(1,%r1), 4096(%r1)
-	unpku	0(1,%r0), 0(%r1)
-	unpku	0(1,%r1), 0(%r0)
 	unpku	0(%r1,%r2), 0(%r1)
 	unpku	0(1,%r2), 0(%r1,%r2)
 	unpku	0(-), 0
@@ -7712,10 +7503,6 @@
 #CHECK: xc	0(1,%r1), -1(%r1)
 #CHECK: error: invalid operand
 #CHECK: xc	0(1,%r1), 4096(%r1)
-#CHECK: error: %r0 used in an address
-#CHECK: xc	0(1,%r0), 0(%r1)
-#CHECK: error: %r0 used in an address
-#CHECK: xc	0(1,%r1), 0(%r0)
 #CHECK: error: invalid use of indexed addressing
 #CHECK: xc	0(%r1,%r2), 0(%r1)
 #CHECK: error: invalid use of indexed addressing
@@ -7732,8 +7519,6 @@
 	xc	4096(1,%r1), 0(%r1)
 	xc	0(1,%r1), -1(%r1)
 	xc	0(1,%r1), 4096(%r1)
-	xc	0(1,%r0), 0(%r1)
-	xc	0(1,%r1), 0(%r0)
 	xc	0(%r1,%r2), 0(%r1)
 	xc	0(1,%r2), 0(%r1,%r2)
 	xc	0(-), 0
@@ -7838,10 +7623,6 @@
 #CHECK: zap	0(1,%r1), -1(1,%r1)
 #CHECK: error: invalid operand
 #CHECK: zap	0(1,%r1), 4096(1,%r1)
-#CHECK: error: %r0 used in an address
-#CHECK: zap	0(1,%r0), 0(1,%r1)
-#CHECK: error: %r0 used in an address
-#CHECK: zap	0(1,%r1), 0(1,%r0)
 #CHECK: error: invalid use of indexed addressing
 #CHECK: zap	0(%r1,%r2), 0(1,%r1)
 #CHECK: error: invalid use of indexed addressing
@@ -7861,8 +7642,6 @@
 	zap	4096(1,%r1), 0(1,%r1)
 	zap	0(1,%r1), -1(1,%r1)
 	zap	0(1,%r1), 4096(1,%r1)
-	zap	0(1,%r0), 0(1,%r1)
-	zap	0(1,%r1), 0(1,%r0)
 	zap	0(%r1,%r2), 0(1,%r1)
 	zap	0(1,%r2), 0(%r1,%r2)
 	zap	0(-), 0(1)

diff  --git a/llvm/test/MC/SystemZ/insn-good.s b/llvm/test/MC/SystemZ/insn-good.s
index 5b93ef917fd3..3c5b34abe0a9 100644
--- a/llvm/test/MC/SystemZ/insn-good.s
+++ b/llvm/test/MC/SystemZ/insn-good.s
@@ -765,12 +765,12 @@
 	bal	%r14, 4095(%r1,%r15)
 	bal	%r15, 4095(%r15,%r1)
 
-#CHECK: balr	%r0, %r1                # encoding: [0x05,0x01]
+#CHECK: balr	%r0, %r0                # encoding: [0x05,0x00]
 #CHECK: balr	%r0, %r15               # encoding: [0x05,0x0f]
 #CHECK: balr	%r14, %r9               # encoding: [0x05,0xe9]
 #CHECK: balr	%r15, %r1               # encoding: [0x05,0xf1]
 
-	balr	%r0,%r1
+	balr	%r0,%r0
 	balr	%r0,%r15
 	balr	%r14,%r9
 	balr	%r15,%r1
@@ -789,22 +789,22 @@
 	bas	%r14, 4095(%r1,%r15)
 	bas	%r15, 4095(%r15,%r1)
 
-#CHECK: basr	%r0, %r1                # encoding: [0x0d,0x01]
+#CHECK: basr	%r0, %r0                # encoding: [0x0d,0x00]
 #CHECK: basr	%r0, %r15               # encoding: [0x0d,0x0f]
 #CHECK: basr	%r14, %r9               # encoding: [0x0d,0xe9]
 #CHECK: basr	%r15, %r1               # encoding: [0x0d,0xf1]
 
-	basr	%r0,%r1
+	basr	%r0,%r0
 	basr	%r0,%r15
 	basr	%r14,%r9
 	basr	%r15,%r1
 
-#CHECK: bassm	%r0, %r1                # encoding: [0x0c,0x01]
+#CHECK: bassm	%r0, %r0                # encoding: [0x0c,0x00]
 #CHECK: bassm	%r0, %r15               # encoding: [0x0c,0x0f]
 #CHECK: bassm	%r14, %r9               # encoding: [0x0c,0xe9]
 #CHECK: bassm	%r15, %r1               # encoding: [0x0c,0xf1]
 
-	bassm	%r0,%r1
+	bassm	%r0,%r0
 	bassm	%r0,%r15
 	bassm	%r14,%r9
 	bassm	%r15,%r1
@@ -829,12 +829,12 @@
 	bsg	%r15,%r0
 	bsg	%r7,%r8
 
-#CHECK: bsm	%r0, %r1                # encoding: [0x0b,0x01]
+#CHECK: bsm	%r0, %r0                # encoding: [0x0b,0x00]
 #CHECK: bsm	%r0, %r15               # encoding: [0x0b,0x0f]
 #CHECK: bsm	%r14, %r9               # encoding: [0x0b,0xe9]
 #CHECK: bsm	%r15, %r1               # encoding: [0x0b,0xf1]
 
-	bsm	%r0,%r1
+	bsm	%r0,%r0
 	bsm	%r0,%r15
 	bsm	%r14,%r9
 	bsm	%r15,%r1
@@ -960,95 +960,125 @@
 	bcr	0, %r15
 
 #CHECK:	bcr	1, %r7			# encoding: [0x07,0x17]
+#CHECK:	bor	%r0			# encoding: [0x07,0x10]
 #CHECK:	bor	%r15			# encoding: [0x07,0x1f]
 
 	bcr	1, %r7
+	bor	%r0
 	bor	%r15
 
 #CHECK:	bcr	2, %r7			# encoding: [0x07,0x27]
+#CHECK:	bhr	%r0			# encoding: [0x07,0x20]
 #CHECK:	bhr	%r15			# encoding: [0x07,0x2f]
 
 	bcr	2, %r7
+	bhr	%r0
 	bhr	%r15
 
 #CHECK:	bcr	3, %r7			# encoding: [0x07,0x37]
+#CHECK:	bnler	%r0			# encoding: [0x07,0x30]
 #CHECK:	bnler	%r15			# encoding: [0x07,0x3f]
 
 	bcr	3, %r7
+	bnler	%r0
 	bnler	%r15
 
 #CHECK:	bcr	4, %r7			# encoding: [0x07,0x47]
+#CHECK:	blr	%r0			# encoding: [0x07,0x40]
 #CHECK:	blr	%r15			# encoding: [0x07,0x4f]
 
 	bcr	4, %r7
+	blr	%r0
 	blr	%r15
 
 #CHECK:	bcr	5, %r7			# encoding: [0x07,0x57]
+#CHECK:	bnher	%r0			# encoding: [0x07,0x50]
 #CHECK:	bnher	%r15			# encoding: [0x07,0x5f]
 
 	bcr	5, %r7
+	bnher	%r0
 	bnher	%r15
 
 #CHECK:	bcr	6, %r7			# encoding: [0x07,0x67]
+#CHECK:	blhr	%r0			# encoding: [0x07,0x60]
 #CHECK:	blhr	%r15			# encoding: [0x07,0x6f]
 
 	bcr	6, %r7
+	blhr	%r0
 	blhr	%r15
 
 #CHECK:	bcr	7, %r7			# encoding: [0x07,0x77]
+#CHECK:	bner	%r0			# encoding: [0x07,0x70]
 #CHECK:	bner	%r15			# encoding: [0x07,0x7f]
 
 	bcr	7, %r7
+	bner	%r0
 	bner	%r15
 
 #CHECK:	bcr	8, %r7			# encoding: [0x07,0x87]
+#CHECK:	ber	%r0			# encoding: [0x07,0x80]
 #CHECK:	ber	%r15			# encoding: [0x07,0x8f]
 
 	bcr	8, %r7
+	ber	%r0
 	ber	%r15
 
 #CHECK:	bcr	9, %r7			# encoding: [0x07,0x97]
+#CHECK:	bnlhr	%r0			# encoding: [0x07,0x90]
 #CHECK:	bnlhr	%r15			# encoding: [0x07,0x9f]
 
 	bcr	9, %r7
+	bnlhr	%r0
 	bnlhr	%r15
 
 #CHECK:	bcr	10, %r7			# encoding: [0x07,0xa7]
+#CHECK:	bher	%r0			# encoding: [0x07,0xa0]
 #CHECK:	bher	%r15			# encoding: [0x07,0xaf]
 
 	bcr	10, %r7
+	bher	%r0
 	bher	%r15
 
 #CHECK:	bcr	11, %r7			# encoding: [0x07,0xb7]
+#CHECK:	bnlr	%r0			# encoding: [0x07,0xb0]
 #CHECK:	bnlr	%r15			# encoding: [0x07,0xbf]
 
 	bcr	11, %r7
+	bnlr	%r0
 	bnlr	%r15
 
 #CHECK:	bcr	12, %r7			# encoding: [0x07,0xc7]
+#CHECK:	bler	%r0			# encoding: [0x07,0xc0]
 #CHECK:	bler	%r15			# encoding: [0x07,0xcf]
 
 	bcr	12, %r7
+	bler	%r0
 	bler	%r15
 
 #CHECK:	bcr	13, %r7			# encoding: [0x07,0xd7]
+#CHECK:	bnhr	%r0			# encoding: [0x07,0xd0]
 #CHECK:	bnhr	%r15			# encoding: [0x07,0xdf]
 
 	bcr	13, %r7
+	bnhr	%r0
 	bnhr	%r15
 
 #CHECK:	bcr	14, %r7			# encoding: [0x07,0xe7]
+#CHECK:	bnor	%r0			# encoding: [0x07,0xe0]
 #CHECK:	bnor	%r15			# encoding: [0x07,0xef]
 
 	bcr	14, %r7
+	bnor	%r0
 	bnor	%r15
 
 #CHECK:	bcr	15, %r7			# encoding: [0x07,0xf7]
+#CHECK: br	%r0                     # encoding: [0x07,0xf0]
 #CHECK: br	%r1                     # encoding: [0x07,0xf1]
 #CHECK: br	%r14                    # encoding: [0x07,0xfe]
 #CHECK: br	%r15                    # encoding: [0x07,0xff]
 
 	bcr	15, %r7
+	br	%r0
 	br	%r1
 	br	%r14
 	br	%r15
@@ -8002,17 +8032,23 @@
 
 #CHECK: l	%r0, 0                  # encoding: [0x58,0x00,0x00,0x00]
 #CHECK: l	%r0, 4095               # encoding: [0x58,0x00,0x0f,0xff]
+#CHECK: l	%r0, 0(%r0)             # encoding: [0x58,0x00,0x00,0x00]
 #CHECK: l	%r0, 0(%r1)             # encoding: [0x58,0x00,0x10,0x00]
 #CHECK: l	%r0, 0(%r15)            # encoding: [0x58,0x00,0xf0,0x00]
+#CHECK: l	%r0, 4095(%r0,%r15)     # encoding: [0x58,0x00,0xff,0xff]
 #CHECK: l	%r0, 4095(%r1,%r15)     # encoding: [0x58,0x01,0xff,0xff]
+#CHECK: l	%r0, 4095(%r15,%r0)     # encoding: [0x58,0x0f,0x0f,0xff]
 #CHECK: l	%r0, 4095(%r15,%r1)     # encoding: [0x58,0x0f,0x1f,0xff]
 #CHECK: l	%r15, 0                 # encoding: [0x58,0xf0,0x00,0x00]
 
 	l	%r0, 0
 	l	%r0, 4095
+	l	%r0, 0(%r0)
 	l	%r0, 0(%r1)
 	l	%r0, 0(%r15)
+	l	%r0, 4095(%r0,%r15)
 	l	%r0, 4095(%r1,%r15)
+	l	%r0, 4095(%r15,%r0)
 	l	%r0, 4095(%r15,%r1)
 	l	%r15, 0
 

diff  --git a/llvm/test/MC/SystemZ/regs-bad.s b/llvm/test/MC/SystemZ/regs-bad.s
index f4cdb69821d2..c4d16ef4cc3d 100644
--- a/llvm/test/MC/SystemZ/regs-bad.s
+++ b/llvm/test/MC/SystemZ/regs-bad.s
@@ -297,20 +297,3 @@
 	.cfi_offset %arid,0
 
 	.cfi_endproc
-
-#CHECK: error: %r0 used in an address
-#CHECK: sll	%r2,8(%r0)
-#CHECK: error: %r0 used in an address
-#CHECK: br	%r0
-#CHECK: error: %r0 used in an address
-#CHECK: l	%r1,8(%r0)
-#CHECK: error: %r0 used in an address
-#CHECK: l	%r1,8(%r0,%r15)
-#CHECK: error: %r0 used in an address
-#CHECK: l	%r1,8(%r15,%r0)
-
-	sll	%r2,8(%r0)
-	br	%r0
-	l	%r1,8(%r0)
-	l	%r1,8(%r0,%r15)
-	l	%r1,8(%r15,%r0)

diff  --git a/llvm/test/MC/SystemZ/tokens.s b/llvm/test/MC/SystemZ/tokens.s
index 7cea21a1e5c5..177378615ed4 100644
--- a/llvm/test/MC/SystemZ/tokens.s
+++ b/llvm/test/MC/SystemZ/tokens.s
@@ -9,24 +9,18 @@
 #CHECK: foo	100(200), 300
 #CHECK: error: register expected
 #CHECK: foo	100(200,), 300
-#CHECK: error: %r0 used in an address
-#CHECK: foo	100(200,%r0), 300
 #CHECK: error: invalid instruction
 #CHECK: foo	100(200,%r1), 300
 #CHECK: error: invalid address register
 #CHECK: foo	100(%a0), 200
 #CHECK: error: invalid instruction
 #CHECK: foo	100(%r0), 200
-#CHECK: error: %r0 used in an address
-#CHECK: foo	100(%v1,%r0), 200
 #CHECK: error: invalid instruction
 #CHECK: foo	100(%v0,%r1), 200
 #CHECK: error: invalid instruction
 #CHECK: foo	100(%v31), 200
 #CHECK: error: invalid address register
 #CHECK: foo	100(%r1,%a0), 200
-#CHECK: error: %r0 used in an address
-#CHECK: foo	100(%r1,%r0), 200
 #CHECK: error: unexpected token in address
 #CHECK: foo	100(%r1,%r2, 200
 #CHECK: error: invalid instruction
@@ -68,15 +62,12 @@
 	foo	100(, 200
 	foo	100(200), 300
 	foo	100(200,), 300
-	foo	100(200,%r0), 300
 	foo	100(200,%r1), 300
 	foo	100(%a0), 200
 	foo	100(%r0), 200
-	foo	100(%v1,%r0), 200
 	foo	100(%v0,%r1), 200
 	foo	100(%v31), 200
 	foo	100(%r1,%a0), 200
-	foo	100(%r1,%r0), 200
 	foo	100(%r1,%r2, 200
 	foo	100(%r1,%r2), 200
 	foo	100(%r1,%r2)(, 200


        


More information about the llvm-commits mailing list