<p dir="ltr">LGTM. </p>
<br><div class="gmail_quote"><div dir="ltr">On Thu, May 11, 2017, 1:09 PM Guozhi Wei via Phabricator <<a href="mailto:reviews@reviews.llvm.org">reviews@reviews.llvm.org</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Carrot updated this revision to Diff 98669.<br>
Carrot added a comment.<br>
<br>
Add a test case for mtvsrdd.<br>
<br>
<br>
<a href="https://reviews.llvm.org/D32880" rel="noreferrer" target="_blank">https://reviews.llvm.org/D32880</a><br>
<br>
Files:<br>
  lib/Target/PowerPC/Disassembler/PPCDisassembler.cpp<br>
  lib/Target/PowerPC/PPCInstrVSX.td<br>
  test/CodeGen/PowerPC/mtvsrdd.ll<br>
  test/MC/Disassembler/PowerPC/ppc64-encoding-p9vector.txt<br>
<br>
<br>
Index: test/MC/Disassembler/PowerPC/ppc64-encoding-p9vector.txt<br>
===================================================================<br>
--- test/MC/Disassembler/PowerPC/ppc64-encoding-p9vector.txt<br>
+++ test/MC/Disassembler/PowerPC/ppc64-encoding-p9vector.txt<br>
@@ -0,0 +1,4 @@<br>
+# RUN: llvm-mc --disassemble %s -triple powerpc64le-unknown-unknown -mcpu=pwr9 | FileCheck %s<br>
+<br>
+# CHECK: mtvsrdd 6, 0, 3<br>
+0x66 0x1b 0xc0 0x7c<br>
Index: test/CodeGen/PowerPC/mtvsrdd.ll<br>
===================================================================<br>
--- test/CodeGen/PowerPC/mtvsrdd.ll<br>
+++ test/CodeGen/PowerPC/mtvsrdd.ll<br>
@@ -0,0 +1,22 @@<br>
+; RUN: llc -mcpu=pwr9 -ppc-vsr-nums-as-vr -mtriple=powerpc64le-unknown-unknown \<br>
+; RUN:   < %s | FileCheck %s<br>
+<br>
+; This test case checks r0 is used as constant 0 in instruction mtvsrdd.<br>
+<br>
+define <2 x i64> @const0(i64 %a) {<br>
+  %vecinit = insertelement <2 x i64> undef, i64 %a, i32 0<br>
+  %vecinit1 = insertelement <2 x i64> %vecinit, i64 0, i32 1<br>
+  ret <2 x i64> %vecinit1<br>
+; CHECK-LABEL: const0<br>
+; CHECK: mtvsrdd v2, 0, r3<br>
+}<br>
+<br>
+define <2 x i64> @noconst0(i64* %a, i64* %b) {<br>
+  %1 = load i64, i64* %a, align 8<br>
+  %2 = load i64, i64* %b, align 8<br>
+  %vecinit = insertelement <2 x i64> undef, i64 %2, i32 0<br>
+  %vecinit1 = insertelement <2 x i64> %vecinit, i64 %1, i32 1<br>
+  ret <2 x i64> %vecinit1<br>
+; CHECK-LABEL: noconst0<br>
+; CHECK: mtvsrdd v2, {{r[0-9]+}}, {{r[0-9]+}}<br>
+}<br>
Index: lib/Target/PowerPC/PPCInstrVSX.td<br>
===================================================================<br>
--- lib/Target/PowerPC/PPCInstrVSX.td<br>
+++ lib/Target/PowerPC/PPCInstrVSX.td<br>
@@ -1436,7 +1436,7 @@<br>
   def MTVSRWS: XX1_RS6_RD5_XO<31, 403, (outs vsrc:$XT), (ins gprc:$rA),<br>
                               "mtvsrws $XT, $rA", IIC_VecGeneral, []>;<br>
<br>
-  def MTVSRDD: XX1Form<31, 435, (outs vsrc:$XT), (ins g8rc:$rA, g8rc:$rB),<br>
+  def MTVSRDD: XX1Form<31, 435, (outs vsrc:$XT), (ins g8rc_nox0:$rA, g8rc:$rB),<br>
                        "mtvsrdd $XT, $rA, $rB", IIC_VecGeneral,<br>
                        []>, Requires<[In64BitMode]>;<br>
<br>
Index: lib/Target/PowerPC/Disassembler/PPCDisassembler.cpp<br>
===================================================================<br>
--- lib/Target/PowerPC/Disassembler/PPCDisassembler.cpp<br>
+++ lib/Target/PowerPC/Disassembler/PPCDisassembler.cpp<br>
@@ -204,6 +204,17 @@<br>
   PPC::X28, PPC::X29, PPC::X30, PPC::X31<br>
 };<br>
<br>
+static const unsigned G80Regs[] = {<br>
+  PPC::ZERO8, PPC::X1, PPC::X2, PPC::X3,<br>
+  PPC::X4, PPC::X5, PPC::X6, PPC::X7,<br>
+  PPC::X8, PPC::X9, PPC::X10, PPC::X11,<br>
+  PPC::X12, PPC::X13, PPC::X14, PPC::X15,<br>
+  PPC::X16, PPC::X17, PPC::X18, PPC::X19,<br>
+  PPC::X20, PPC::X21, PPC::X22, PPC::X23,<br>
+  PPC::X24, PPC::X25, PPC::X26, PPC::X27,<br>
+  PPC::X28, PPC::X29, PPC::X30, PPC::X31<br>
+};<br>
+<br>
 static const unsigned QFRegs[] = {<br>
   PPC::QF0, PPC::QF1, PPC::QF2, PPC::QF3,<br>
   PPC::QF4, PPC::QF5, PPC::QF6, PPC::QF7,<br>
@@ -301,6 +312,12 @@<br>
   return decodeRegisterClass(Inst, RegNo, G8Regs);<br>
 }<br>
<br>
+static DecodeStatus DecodeG8RC_NOX0RegisterClass(MCInst &Inst, uint64_t RegNo,<br>
+                                            uint64_t Address,<br>
+                                            const void *Decoder) {<br>
+  return decodeRegisterClass(Inst, RegNo, G80Regs);<br>
+}<br>
+<br>
 #define DecodePointerLikeRegClass0 DecodeGPRCRegisterClass<br>
 #define DecodePointerLikeRegClass1 DecodeGPRC_NOR0RegisterClass<br>
<br>
<br>
<br>
</blockquote></div>