<html xmlns:v="urn:schemas-microsoft-com:vml" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:w="urn:schemas-microsoft-com:office:word" xmlns:m="http://schemas.microsoft.com/office/2004/12/omml" xmlns="http://www.w3.org/TR/REC-html40">

<head>
<meta http-equiv=Content-Type content="text/html; charset=us-ascii">
<meta name=Generator content="Microsoft Word 12 (filtered medium)">
<base href="x-msg://18157/">
<style>
<!--
 /* Font Definitions */
 @font-face
        {font-family:Helvetica;
        panose-1:2 11 6 4 2 2 2 2 2 4;}
@font-face
        {font-family:Helvetica;
        panose-1:2 11 6 4 2 2 2 2 2 4;}
@font-face
        {font-family:Calibri;
        panose-1:2 15 5 2 2 2 4 3 2 4;}
@font-face
        {font-family:Tahoma;
        panose-1:2 11 6 4 3 5 4 4 2 4;}
 /* Style Definitions */
 p.MsoNormal, li.MsoNormal, div.MsoNormal
        {margin:0cm;
        margin-bottom:.0001pt;
        font-size:12.0pt;
        font-family:"Times New Roman","serif";}
a:link, span.MsoHyperlink
        {mso-style-priority:99;
        color:blue;
        text-decoration:underline;}
a:visited, span.MsoHyperlinkFollowed
        {mso-style-priority:99;
        color:purple;
        text-decoration:underline;}
span.apple-tab-span
        {mso-style-name:apple-tab-span;}
span.apple-converted-space
        {mso-style-name:apple-converted-space;}
span.EmailStyle19
        {mso-style-type:personal-reply;
        font-family:"Calibri","sans-serif";
        color:#1F497D;}
.MsoChpDefault
        {mso-style-type:export-only;
        font-size:10.0pt;}
@page Section1
        {size:612.0pt 792.0pt;
        margin:72.0pt 72.0pt 72.0pt 72.0pt;}
div.Section1
        {page:Section1;}
-->
</style>
<!--[if gte mso 9]><xml>
 <o:shapedefaults v:ext="edit" spidmax="1026" />
</xml><![endif]--><!--[if gte mso 9]><xml>
 <o:shapelayout v:ext="edit">
  <o:idmap v:ext="edit" data="1" />
 </o:shapelayout></xml><![endif]-->
</head>

<body lang=EN-GB link=blue vlink=purple style='word-wrap: break-word;
-webkit-nbsp-mode: space;-webkit-line-break: after-white-space'>

<div class=Section1>

<p class=MsoNormal><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";
color:#1F497D'>Hi Jim,<o:p></o:p></span></p>

<p class=MsoNormal><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";
color:#1F497D'><o:p> </o:p></span></p>

<p class=MsoNormal><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";
color:#1F497D'>I’ve followed your remarks and made some modifications to
the patch. The new <o:p></o:p></span></p>

<p class=MsoNormal><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";
color:#1F497D'>version is attached. The new patch makes much more use of the
existing <o:p></o:p></span></p>

<p class=MsoNormal><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";
color:#1F497D'>infrastructure.<o:p></o:p></span></p>

<p class=MsoNormal><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";
color:#1F497D'><o:p> </o:p></span></p>

<p class=MsoNormal><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";
color:#1F497D'>The FSTM/FLDM instructions only use D registers. The misleading
comment<o:p></o:p></span></p>

<p class=MsoNormal><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";
color:#1F497D'>was removed.<o:p></o:p></span></p>

<p class=MsoNormal><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";
color:#1F497D'><o:p> </o:p></span></p>

<p class=MsoNormal><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";
color:#1F497D'>Please review.<o:p></o:p></span></p>

<p class=MsoNormal><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";
color:#1F497D'><o:p> </o:p></span></p>

<p class=MsoNormal><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";
color:#1F497D'>Thanks,<o:p></o:p></span></p>

<p class=MsoNormal><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";
color:#1F497D'>Silviu<o:p></o:p></span></p>

<p class=MsoNormal><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";
color:#1F497D'><o:p> </o:p></span></p>

<p class=MsoNormal><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";
color:#1F497D'><o:p> </o:p></span></p>

<div style='border:none;border-left:solid blue 1.5pt;padding:0cm 0cm 0cm 4.0pt'>

<div>

<div style='border:none;border-top:solid #B5C4DF 1.0pt;padding:3.0pt 0cm 0cm 0cm'>

<p class=MsoNormal><b><span lang=EN-US style='font-size:10.0pt;font-family:
"Tahoma","sans-serif"'>From:</span></b><span lang=EN-US style='font-size:10.0pt;
font-family:"Tahoma","sans-serif"'> Jim Grosbach [mailto:grosbach@apple.com] <br>
<b>Sent:</b> 22 June 2012 20:43<br>
<b>To:</b> Silviu Baranga<br>
<b>Cc:</b> llvm-commits@cs.uiuc.edu<br>
<b>Subject:</b> Re: [PATCH]Add support for fstmx/fldmx instructions on the ARM
backend<o:p></o:p></span></p>

</div>

</div>

<p class=MsoNormal><o:p> </o:p></p>

<p class=MsoNormal>Hi Silviu<o:p></o:p></p>

<div>

<p class=MsoNormal><o:p> </o:p></p>

</div>

<div>

<p class=MsoNormal>OK.  More detailed comments on the specifics below.<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal><o:p> </o:p></p>

</div>

<div>

<p class=MsoNormal><o:p> </o:p></p>

<div>

<div>

<p class=MsoNormal>On May 24, 2012, at 5:21 AM, Silviu Baranga <<a
href="mailto:silbar01@arm.com">silbar01@arm.com</a>> wrote:<o:p></o:p></p>

</div>

<p class=MsoNormal><br>
<br>
<o:p></o:p></p>

<div>

<div>

<p class=MsoNormal><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";
color:#1F497D'>Hi Jim,</span><o:p></o:p></p>

</div>

<div>

<p class=MsoNormal><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";
color:#1F497D'> </span><o:p></o:p></p>

</div>

<div>

<p class=MsoNormal><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";
color:#1F497D'>Thanks for the review.</span><o:p></o:p></p>

</div>

<div>

<p class=MsoNormal><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";
color:#1F497D'> </span><o:p></o:p></p>

</div>

<div>

<p class=MsoNormal><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";
color:#1F497D'>These instructions also support the “DB” suffix, and
having</span><o:p></o:p></p>

</div>

<div>

<p class=MsoNormal><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";
color:#1F497D'>either IA/DB is a required part of the syntax.</span><o:p></o:p></p>

</div>

<div>

<p class=MsoNormal><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";
color:#1F497D'> </span><o:p></o:p></p>

</div>

<div>

<p class=MsoNormal><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";
color:#1F497D'>The tests from fstmx-arm.txt were supposed to test that</span><o:p></o:p></p>

</div>

<div>

<p class=MsoNormal><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";
color:#1F497D'>some invalid bit patterns are not decoded as vstm/vldm</span><o:p></o:p></p>

</div>

<div>

<p class=MsoNormal><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";
color:#1F497D'>instructions (which is  the current behaviour).</span><o:p></o:p></p>

</div>

<div>

<p class=MsoNormal><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";
color:#1F497D'>Those bit patterns are invalid because they have an odd</span><o:p></o:p></p>

</div>

<div>

<p class=MsoNormal><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";
color:#1F497D'>imm8 field (so they are not vstm/vldm instructions) and</span><o:p></o:p></p>

</div>

<div>

<p class=MsoNormal><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";
color:#1F497D'>the value of the 22nd bit is 1 (so they are not fstmx/fldmx</span><o:p></o:p></p>

</div>

<div>

<p class=MsoNormal><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";
color:#1F497D'>instructions).</span><o:p></o:p></p>

</div>

<div>

<p class=MsoNormal><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";
color:#1F497D'> </span><o:p></o:p></p>

</div>

<div>

<p class=MsoNormal><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";
color:#1F497D'>I’ve removed the fstmx-arm.txt test, and added instead</span><o:p></o:p></p>

</div>

<div>

<p class=MsoNormal><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";
color:#1F497D'>the invalid-fstmx.txt test file (the new patch is attached).</span><o:p></o:p></p>

</div>

</div>

<div>

<p class=MsoNormal><o:p> </o:p></p>

</div>

<div>

<blockquote style='margin-top:5.0pt;margin-bottom:5.0pt'>

<div>

<p class=MsoNormal>Index: test/MC/ARM/simple-fp-encoding.s<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal>===================================================================<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal>--- test/MC/ARM/simple-fp-encoding.s<span
class=apple-tab-span>        </span>(revision
156615)<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal>+++ test/MC/ARM/simple-fp-encoding.s<span
class=apple-tab-span>     </span>(working copy)<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal>@@ -352,3 +352,12 @@<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal> <o:p></o:p></p>

</div>

<div>

<p class=MsoNormal> @ CHECK: vmov.i32<span class=apple-tab-span>          </span>d4,
#0x0        @ encoding: [0x10,0x40,0x80,0xf2]<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal> @ CHECK: vmov.i32<span class=apple-tab-span>          </span>d4,
#0x42000000 @ encoding: [0x12,0x46,0x84,0xf2]<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal>+<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal>+        fldmiaxeq r0, {d4,d5}<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal>+        fstmiaxeq r4, {d8,d9}<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal>+        fldmdbxne r5!, {d4,d5,d6}<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal>+        fstmdbxne r7!, {d2-d4}<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal>+@ CHECK: fldmiaxeq r0, {d4-d5}        
 @ encoding: [0x05,0x4b,0x90,0x0c]<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal>+@ CHECK: fstmiaxeq r4, {d8-d9}        
 @ encoding: [0x05,0x8b,0x84,0x0c]<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal>+@ CHECK: fldmdbxne r5!, {d4-d6}        
@ encoding: [0x07,0x4b,0x35,0x1d]<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal>+@ CHECK: fstmdbxne r7!, {d2-d4}        
@ encoding: [0x07,0x2b,0x27,0x1d]<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal>Index: test/MC/Disassembler/ARM/invalid-fstmx.txt<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal>===================================================================<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal>--- test/MC/Disassembler/ARM/invalid-fstmx.txt<span
class=apple-tab-span>    </span>(revision 0)<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal>+++ test/MC/Disassembler/ARM/invalid-fstmx.txt<span
class=apple-tab-span> </span>(revision 0)<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal>@@ -0,0 +1,4 @@<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal>+# RUN: llvm-mc --disassemble %s -triple=armv7-linux-gnueabi
|& FileCheck %s<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal>+<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal>+0x0d 0x0b 0xc7 0x0c<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal>+# CHECK: invalid instruction encoding<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal>Index: test/MC/Disassembler/ARM/fp-encoding.txt<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal>===================================================================<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal>--- test/MC/Disassembler/ARM/fp-encoding.txt<span
class=apple-tab-span>      </span>(revision 156615)<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal>+++ test/MC/Disassembler/ARM/fp-encoding.txt<span
class=apple-tab-span>   </span>(working copy)<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal>@@ -238,3 +238,16 @@<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal> # CHECK: vcvtr.s32.f32  s0, s1<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal> # CHECK: vcvtr.u32.f64  s0, d0<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal> # CHECK: vcvtr.u32.f32  s0, s1<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal>+<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal>+0x0f 0x3b 0xb7 0x0c<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal>+0x0d 0x4b 0x96 0x0c<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal>+0x09 0x1b 0x38 0xed<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal>+0x07 0x2b 0x83 0xec<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal>+0x05 0x5b 0xa3 0x0c<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal>+0x0f 0x3b 0x20 0x1d<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal>+# CHECK: fldmiaxeq r7!, {d3-d9}<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal>+# CHECK: fldmiaxeq r6, {d4-d9}<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal>+# CHECK: fldmdbx   r8!, {d1-d4}<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal>+# CHECK: fstmiax   r3, {d2-d4}<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal>+# CHECK: fstmiaxeq r3!, {d5-d6}<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal>+# CHECK: fstmdbxne r0!, {d3-d9}<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal>Index: utils/TableGen/EDEmitter.cpp<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal>===================================================================<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal>--- utils/TableGen/EDEmitter.cpp<span class=apple-tab-span>     </span>(revision
156615)<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal>+++ utils/TableGen/EDEmitter.cpp<span class=apple-tab-span>  </span>(working
copy)<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal>@@ -700,6 +700,7 @@<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal>   MISC("addr_offset_none",
"kOperandTypeARMAddrMode7");           // R<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal>   MISC("reglist",
"kOperandTypeARMRegisterList");          
      // I, R, ...<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal>   MISC("dpr_reglist",
"kOperandTypeARMDPRRegisterList");        
 // I, R, ...<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal>+  MISC("dpr_reglist_fmx",
"kOperandTypeARMDPRRegisterList");      // I, R, ...<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal>   MISC("spr_reglist",
"kOperandTypeARMSPRRegisterList");        
 // I, R, ...<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal>   MISC("it_mask",
"kOperandTypeThumbITMask");            
        // I<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal>   MISC("t2addrmode_reg",
"kOperandTypeThumb2AddrModeReg");        // R<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal>Index: lib/Target/ARM/AsmParser/ARMAsmParser.cpp<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal>===================================================================<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal>--- lib/Target/ARM/AsmParser/ARMAsmParser.cpp<span
class=apple-tab-span>            </span>(revision
156615)<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal>+++ lib/Target/ARM/AsmParser/ARMAsmParser.cpp<span
class=apple-tab-span>         </span>(working
copy)<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal>@@ -849,6 +849,26 @@<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal>   bool isReg() const { return Kind == k_Register;
}<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal>   bool isRegList() const { return Kind ==
k_RegisterList; }<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal>   bool isDPRRegList() const { return Kind ==
k_DPRRegisterList; }<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal>+  bool isDPRRegListFMX() const {<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal>+    // We need to check that we don't use a D reg
with an index greater<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal>+    // then 15.<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal>+    if (Kind != k_DPRRegisterList)<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal>+      return false;<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal>+    const SmallVectorImpl<unsigned>
&list = getRegList();<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal>+    for (SmallVectorImpl<unsigned>::const_iterator
I = list.begin(), <o:p></o:p></p>

</div>

<div>

<p class=MsoNormal>+                
                     
       E = list.end();<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal>+                
                     
       I != E;<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal>+                
                     
       ++I){<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal>+      // We only allow D registers smaller
then 16.<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal>+      if
(!(ARMMCRegisterClasses[ARM::DPRRegClassID].contains(*I))) <o:p></o:p></p>

</div>

<div>

<p class=MsoNormal>+        return false;<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal>+      if (getARMRegisterNumbering(*I) >
15) return false; <o:p></o:p></p>

</div>

</blockquote>

<div>

<p class=MsoNormal><o:p> </o:p></p>

</div>

<div>

<p class=MsoNormal>We have the DPR_VFP2 register class for the low 16 DPR
registers. You can just update the .contains() check instead.<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal><o:p> </o:p></p>

</div>

<div>

<p class=MsoNormal>Relatedly, the name of the operand type shouldn't reflect
the instructions, but the nature of the registers. Since this is a list of
DPR_VFP2 registers, "DPR_VFP2RegList" seems to make a certain amount
of sense.<o:p></o:p></p>

</div>

<p class=MsoNormal><br>
<br>
<o:p></o:p></p>

<div>

<p class=MsoNormal>+    }<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal>+    // No registers were transfered.<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal><o:p> </o:p></p>

</div>

<div>

<p class=MsoNormal>"transferred". That said, I'm not sure what this
comment means. No transference is occurring here.<o:p></o:p></p>

</div>

<p class=MsoNormal><br>
<br>
<o:p></o:p></p>

<div>

<p class=MsoNormal>+    if (list.size() == 0) return false;<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal><o:p> </o:p></p>

</div>

<div>

<p class=MsoNormal>This can be an assert() at the top of the function if it's
here at all. An empty register list should result in an error in parsing and
never be created as an asmoperand.<o:p></o:p></p>

</div>

<p class=MsoNormal><br>
<br>
<o:p></o:p></p>

<div>

<p class=MsoNormal>+    <o:p></o:p></p>

</div>

<div>

<p class=MsoNormal>+    return true;<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal>+  }<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal>   bool isSPRRegList() const { return Kind ==
k_SPRRegisterList; }<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal>   bool isToken() const { return Kind == k_Token;
}<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal>   bool isMemBarrierOpt() const { return Kind ==
k_MemBarrierOpt; }<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal>@@ -1472,6 +1492,16 @@<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal>     addRegListOperands(Inst, N);<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal>   }<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal> <o:p></o:p></p>

</div>

<div>

<p class=MsoNormal>+  void addDPRRegListFMXOperands(MCInst &Inst,
unsigned N) const {<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal>+    const SmallVectorImpl<unsigned>
&RegList = getRegList();<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal>+    assert(RegList.size() > 0 &&
"Register list size must be greater then 0.");<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal>+<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal>+    // Add the operand indicating the first
register.<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal>+  
 Inst.addOperand(MCOperand::CreateReg(RegList[0]));<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal>+    // Add the immediate operand indicating the
number of registers used.<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal>+  
 Inst.addOperand(MCOperand::CreateImm(RegList.size()));<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal>+  }<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal>+<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal><o:p> </o:p></p>

</div>

<div>

<p class=MsoNormal>Why is this represented differently than the existing
register lists for vldm/vstm? That adds a lot of unnecessary complexity to the
patch. Just use the existing infrastructure.<o:p></o:p></p>

</div>

<p class=MsoNormal><br>
<br>
<o:p></o:p></p>

<div>

<p class=MsoNormal>   void addSPRRegListOperands(MCInst &Inst,
unsigned N) const {<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal>     addRegListOperands(Inst, N);<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal>   }<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal>Index: lib/Target/ARM/InstPrinter/ARMInstPrinter.cpp<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal>===================================================================<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal>--- lib/Target/ARM/InstPrinter/ARMInstPrinter.cpp<span
class=apple-tab-span>            </span>(revision
156615)<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal>+++ lib/Target/ARM/InstPrinter/ARMInstPrinter.cpp<span
class=apple-tab-span>         </span>(working
copy)<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal>@@ -603,6 +603,27 @@<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal>   O << ", asr #" << Imm;<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal> }<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal> <o:p></o:p></p>

</div>

<div>

<p class=MsoNormal>+void ARMInstPrinter::printRegisterFMXList(const MCInst *MI,
unsigned OpNum,<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal>+                  
                   
raw_ostream &O) {<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal>+  unsigned BaseReg =
MI->getOperand(OpNum).getReg();<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal>+  unsigned NumRegs = MI->getOperand(OpNum +
1).getImm();<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal>+<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal>+  O << "{";<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal>+  // We will write this with the - format, since the
upper registers may not<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal>+  // exist.<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal>+  switch(NumRegs){<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal>+    case 0:<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal>+      break;<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal>+    case 1:<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal>+      O << getRegisterName(BaseReg);<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal>+      break;<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal>+    default:<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal>+      O << getRegisterName(BaseReg);<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal>+      O << "-d" <<
getARMRegisterNumbering(BaseReg) + NumRegs - 1;<o:p></o:p></p>

</div>

<blockquote style='margin-top:5.0pt;margin-bottom:5.0pt'>

<div>

<p class=MsoNormal>+  }<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal>+  O << "}";<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal>+}<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal>+<o:p></o:p></p>

</div>

</blockquote>

<div>

<p class=MsoNormal><o:p> </o:p></p>

</div>

<div>

<p class=MsoNormal>This can go away and the operand can just reference the
existing printRegisterList().<o:p></o:p></p>

</div>

<p class=MsoNormal><br>
<br>
<o:p></o:p></p>

<div>

<p class=MsoNormal> void ARMInstPrinter::printRegisterList(const MCInst
*MI, unsigned OpNum,<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal>               
                     
  raw_ostream &O) {<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal>   O << "{";<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal>Index: lib/Target/ARM/InstPrinter/ARMInstPrinter.h<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal>===================================================================<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal>--- lib/Target/ARM/InstPrinter/ARMInstPrinter.h<span
class=apple-tab-span>    </span>(revision 156615)<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal>+++ lib/Target/ARM/InstPrinter/ARMInstPrinter.h<span
class=apple-tab-span> </span>(working copy)<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal>@@ -114,6 +114,8 @@<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal>               
                     
 raw_ostream &O);<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal>   void printSBitModifierOperand(const MCInst *MI,
unsigned OpNum,<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal>               
                 raw_ostream
&O);<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal>+  void printRegisterFMXList(const MCInst *MI, unsigned
OpNum,<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal>+                
                     
raw_ostream &O);<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal>   void printRegisterList(const MCInst *MI,
unsigned OpNum, raw_ostream &O);<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal>   void printNoHashImmediate(const MCInst *MI,
unsigned OpNum, raw_ostream &O);<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal>   void printPImmediate(const MCInst *MI, unsigned
OpNum, raw_ostream &O);<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal>Index: lib/Target/ARM/ARMInstrVFP.td<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal>===================================================================<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal>--- lib/Target/ARM/ARMInstrVFP.td<span class=apple-tab-span>          </span>(revision
156615)<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal>+++ lib/Target/ARM/ARMInstrVFP.td<span class=apple-tab-span>       </span>(working
copy)<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal>@@ -118,7 +118,7 @@<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal>               
          InstrItinClass itin, InstrItinClass
itin_upd> {<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal>   // Double Precision<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal>   def DIA :<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal>-    AXDI4<(outs), (ins GPR:$Rn, pred:$p,
dpr_reglist:$regs, variable_ops),<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal>+    AXDI4_D<(outs), (ins GPR:$Rn, pred:$p,
dpr_reglist:$regs, variable_ops),<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal>           IndexModeNone,
itin,<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal>           !strconcat(asm,
"ia${p}\t$Rn, $regs"), "", []> {<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal>     let Inst{24-23} = 0b01;    
  // Increment After<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal>@@ -126,7 +126,7 @@<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal>     let Inst{20}    = L_bit;<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal>   }<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal>   def DIA_UPD :<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal>-    AXDI4<(outs GPR:$wb), (ins GPR:$Rn,
pred:$p, dpr_reglist:$regs,<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal>+    AXDI4_D<(outs GPR:$wb), (ins GPR:$Rn,
pred:$p, dpr_reglist:$regs,<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal>               
                variable_ops),<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal>           IndexModeUpd,
itin_upd,<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal>           !strconcat(asm,
"ia${p}\t$Rn!, $regs"), "$Rn = $wb", []> {<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal>@@ -135,7 +135,7 @@<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal>     let Inst{20}    = L_bit;<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal>   }<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal>   def DDB_UPD :<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal>-    AXDI4<(outs GPR:$wb), (ins GPR:$Rn,
pred:$p, dpr_reglist:$regs,<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal>+    AXDI4_D<(outs GPR:$wb), (ins GPR:$Rn,
pred:$p, dpr_reglist:$regs,<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal>               
                variable_ops),<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal>           IndexModeUpd,
itin_upd,<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal>           !strconcat(asm,
"db${p}\t$Rn!, $regs"), "$Rn = $wb", []> {<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal>@@ -216,7 +216,41 @@<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal>               
          (VLDMDIA_UPD SP, pred:$p,
dpr_reglist:$r)>;<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal> <o:p></o:p></p>

</div>

<div>

<p class=MsoNormal> // FLDMX, FSTMX - mixing S/D registers for pre-armv6
cores<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal>+// These instructions are deprecated, so we don't want them
to get selected.<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal> <o:p></o:p></p>

</div>

<div>

<p class=MsoNormal><o:p> </o:p></p>

</div>

<div>

<p class=MsoNormal>This comment confuses me. Are these instructions able to
reference the S registers as well as the D registers? Nothing in this patch
handles that, as far as I can tell. Everything talks about D registers.<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal><o:p> </o:p></p>

</div>

<p class=MsoNormal><br>
<br>
<o:p></o:p></p>

<div>

<p class=MsoNormal>+multiclass vfp_fldst_mult<string asm, bit L_bit,<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal>+                
        InstrItinClass itin, InstrItinClass itin_upd> {<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal>+  // Double Precision<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal>+  def DIA :<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal>+    AXDI4_F<(outs), (ins GPR:$Rn, pred:$p,
dpr_reglist_fmx:$regs, variable_ops),<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal>+          IndexModeNone, itin,<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal>+          !strconcat(asm,
"iax${p}\t$Rn, $regs"), "", []> {<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal>+    let Inst{24-23} = 0b01;      
// Increment After<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal>+    let Inst{21}    = 0;    
     // No writeback<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal>+    let Inst{20}    = L_bit;<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal>+  }<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal>+  def DIA_UPD :<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal>+    AXDI4_F<(outs GPR:$wb), (ins GPR:$Rn,
pred:$p, dpr_reglist_fmx:$regs,<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal>+                
              variable_ops),<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal>+          IndexModeUpd, itin_upd,<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal>+          !strconcat(asm,
"iax${p}\t$Rn!, $regs"), "$Rn = $wb", []> {<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal>+    let Inst{24-23} = 0b01;      
// Increment After<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal>+    let Inst{21}    = 1;    
     // Writeback<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal>+    let Inst{20}    = L_bit;<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal>+  }<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal>+  def DDB_UPD :<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal>+    AXDI4_F<(outs GPR:$wb), (ins GPR:$Rn,
pred:$p, dpr_reglist_fmx:$regs,<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal>+                
              variable_ops),<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal>+          IndexModeUpd, itin_upd,<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal>+          !strconcat(asm,
"dbx${p}\t$Rn!, $regs"), "$Rn = $wb", []> {<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal>+    let Inst{24-23} = 0b10;      
// Decrement Before<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal>+    let Inst{21}    = 1;    
     // Writeback<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal>+    let Inst{20}    = L_bit;<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal>+  }<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal>+}<o:p></o:p></p>

</div>

<blockquote style='margin-top:5.0pt;margin-bottom:5.0pt'>

<div>

<p class=MsoNormal>+<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal>+defm FLDM : vfp_fldst_mult<"fldm", 1,
NoItinerary, NoItinerary>;<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal>+defm FSTM : vfp_fldst_mult<"fstm", 0,
NoItinerary, NoItinerary>;<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal> //===----------------------------------------------------------------------===//<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal> // FP Binary Operations.<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal> //<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal>Index: lib/Target/ARM/ARMInstrInfo.td<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal>===================================================================<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal>--- lib/Target/ARM/ARMInstrInfo.td<span
class=apple-tab-span>           </span>(revision
156615)<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal>+++ lib/Target/ARM/ARMInstrInfo.td<span
class=apple-tab-span>        </span>(working
copy)<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal>@@ -386,6 +386,14 @@<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal>   let DecoderMethod =
"DecodeDPRRegListOperand";<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal> }<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal> <o:p></o:p></p>

</div>

<div>

<p class=MsoNormal>+def DPRRegListFMXAsmOperand : AsmOperandClass {let Name =
"DPRRegListFMX"; }<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal>+def dpr_reglist_fmx : Operand<i32> {<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal>+  let EncoderMethod =
"getRegisterFMXListOpValue";<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal>+  let ParserMatchClass = DPRRegListFMXAsmOperand;<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal>+  let PrintMethod = "printRegisterFMXList";<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal>+  let DecoderMethod =
"DecodeDPRRegFMXListOperand";<o:p></o:p></p>

</div>

</blockquote>

<div>

<p class=MsoNormal><o:p> </o:p></p>

</div>

<div>

<p class=MsoNormal>Other than the AsmOperandClass, these can all refer to the
same functions as for the normal DPRRegList.<o:p></o:p></p>

</div>

<p class=MsoNormal><br>
<br>
<o:p></o:p></p>

<div>

<p class=MsoNormal>+}<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal>+<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal> def SPRRegListAsmOperand : AsmOperandClass { let Name
= "SPRRegList"; }<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal> def spr_reglist : Operand<i32> {<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal>   let EncoderMethod =
"getRegisterListOpValue";<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal>Index: lib/Target/ARM/ARMCodeEmitter.cpp<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal>===================================================================<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal>--- lib/Target/ARM/ARMCodeEmitter.cpp<span
class=apple-tab-span>  </span>(revision 156615)<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal>+++ lib/Target/ARM/ARMCodeEmitter.cpp<span
class=apple-tab-span>           </span>(working
copy)<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal>@@ -320,6 +320,8 @@<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal>     unsigned getNEONVcvtImm32OpValue(const
MachineInstr &MI, unsigned Op)<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal>       const { return 0; }<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal> <o:p></o:p></p>

</div>

<div>

<p class=MsoNormal>+    unsigned getRegisterFMXListOpValue(const
MachineInstr &MI, unsigned Op)<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal>+      const { return 0; }<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal>     unsigned getRegisterListOpValue(const
MachineInstr &MI, unsigned Op)<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal>       const { return 0; }<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal> <o:p></o:p></p>

</div>

<div>

<p class=MsoNormal>Index: lib/Target/ARM/ARMInstrFormats.td<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal>===================================================================<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal>--- lib/Target/ARM/ARMInstrFormats.td<span
class=apple-tab-span>     </span>(revision 156615)<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal>+++ lib/Target/ARM/ARMInstrFormats.td<span
class=apple-tab-span>  </span>(working copy)<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal>@@ -1426,16 +1426,32 @@<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal> <o:p></o:p></p>

</div>

<div>

<p class=MsoNormal>   // Encode instruction operands.<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal>   let Inst{19-16} = Rn;<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal>-  let Inst{22}    = regs{12};<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal>   let Inst{15-12} = regs{11-8};<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal>-  let Inst{7-0}   = regs{7-0};<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal>-<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal>+  let Inst{7-1} = regs{7-1};<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal><o:p> </o:p></p>

</div>

<div>

<p class=MsoNormal>Where do the bits being removed here get set for the old
instructions from the vfp_ldst_mult multiclass?<o:p></o:p></p>

</div>

<p class=MsoNormal><br>
<br>
<o:p></o:p></p>

<div>

<p class=MsoNormal>   // TODO: Mark the instructions with the
appropriate subtarget info.<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal>   let Inst{27-25} = 0b110;<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal>   let Inst{11-9}  = 0b101;<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal>   let Inst{8}     = 1;    
     // Double precision<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal>+  <o:p></o:p></p>

</div>

<div>

<p class=MsoNormal>+  let regs{0} = 0;<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal><o:p> </o:p></p>

</div>

<div>

<p class=MsoNormal>What is this supposed to be doing? We shouldn't be changing
the value of regs here. Operand values should be considered to be const.<o:p></o:p></p>

</div>

<p class=MsoNormal><br>
<br>
<o:p></o:p></p>

<div>

<p class=MsoNormal> }<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal> <o:p></o:p></p>

</div>

<div>

<p class=MsoNormal>+class AXDI4_D<dag oops, dag iops, IndexMode im,
InstrItinClass itin,<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal>+              string
asm, string cstr, list<dag> pattern><o:p></o:p></p>

</div>

<div>

<p class=MsoNormal>+  : AXDI4<oops, iops, im, itin, asm, cstr,
pattern> {<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal>+  let Inst{22} = regs{12};<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal>+  let Inst{12} = regs{8};<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal><o:p> </o:p></p>

</div>

<div>

<p class=MsoNormal>Inst{12} is still set in the base class. Why set it again
here?<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal><o:p> </o:p></p>

</div>

<blockquote style='margin-top:5.0pt;margin-bottom:5.0pt'>

<div>

<p class=MsoNormal>+  let Inst{0} = 0;<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal>+}<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal>+<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal>+class AXDI4_F<dag oops, dag iops, IndexMode im,
InstrItinClass itin,<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal>+              string
asm, string cstr, list<dag> pattern><o:p></o:p></p>

</div>

<div>

<p class=MsoNormal>+  : AXDI4<oops, iops, im, itin, asm, cstr,
pattern> {<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal>+  let Inst{22} = 0;<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal>+  let Inst{0} = 1;<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal>+  let regs{12} = 0;<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal>+}<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal>+<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal> class AXSI4<dag oops, dag iops, IndexMode im,
InstrItinClass itin,<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal>             string asm,
string cstr, list<dag> pattern><o:p></o:p></p>

</div>

<div>

<p class=MsoNormal>   : VFPXI<oops, iops, AddrMode4, 4, im,<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal>Index: lib/Target/ARM/MCTargetDesc/ARMMCCodeEmitter.cpp<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal>===================================================================<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal>--- lib/Target/ARM/MCTargetDesc/ARMMCCodeEmitter.cpp<span
class=apple-tab-span>       </span>(revision
156615)<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal>+++ lib/Target/ARM/MCTargetDesc/ARMMCCodeEmitter.cpp<span
class=apple-tab-span>    </span>(working copy)<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal>@@ -283,7 +283,9 @@<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal> <o:p></o:p></p>

</div>

<div>

<p class=MsoNormal>   unsigned getBitfieldInvertedMaskOpValue(const
MCInst &MI, unsigned Op,<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal>               
                     
 SmallVectorImpl<MCFixup> &Fixups) const;<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal>-<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal>+  <o:p></o:p></p>

</div>

<div>

<p class=MsoNormal>+  unsigned getRegisterFMXListOpValue(const MCInst
&MI, unsigned Op,<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal>+                
                   
SmallVectorImpl<MCFixup> &Fixups) const;<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal>   unsigned getRegisterListOpValue(const MCInst
&MI, unsigned Op,<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal>               
                 
 SmallVectorImpl<MCFixup> &Fixups) const;<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal>   unsigned getAddrMode6AddressOpValue(const
MCInst &MI, unsigned Op,<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal>@@ -1335,6 +1337,21 @@<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal>   return lsb | (msb << 5);<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal> }<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal> <o:p></o:p></p>

</div>

<div>

<p class=MsoNormal>+unsigned ARMMCCodeEmitter:: getRegisterFMXListOpValue(const
MCInst &MI, <o:p></o:p></p>

</div>

<div>

<p class=MsoNormal>+                
     unsigned Op, SmallVectorImpl<MCFixup> &Fixups)
const {<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal>+<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal>+  unsigned Reg = MI.getOperand(Op).getReg();<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal>+  unsigned NumRegs = MI.getOperand(Op + 1).getImm();<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal>+<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal>+  unsigned RegNo = getARMRegisterNumbering(Reg);<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal>+  unsigned Binary = 0;<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal>+<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal>+  Binary |= (RegNo & 0x1f) << 8;<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal>+  Binary |= NumRegs * 2;<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal>+<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal>+  return Binary;<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal>+}<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal>+<o:p></o:p></p>

</div>

</blockquote>

<div>

<p class=MsoNormal><o:p> </o:p></p>

</div>

<div>

<p class=MsoNormal>This can just use the encoder already present for DPR lists.
No need for a new one.<o:p></o:p></p>

</div>

<p class=MsoNormal><br>
<br>
<o:p></o:p></p>

<div>

<p class=MsoNormal> unsigned ARMMCCodeEmitter::<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal> getRegisterListOpValue(const MCInst &MI, unsigned
Op,<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal>               
        SmallVectorImpl<MCFixup> &Fixups) const {<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal>Index: lib/Target/ARM/Disassembler/ARMDisassembler.cpp<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal>===================================================================<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal>--- lib/Target/ARM/Disassembler/ARMDisassembler.cpp<span
class=apple-tab-span>    </span>(revision 156615)<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal>+++ lib/Target/ARM/Disassembler/ARMDisassembler.cpp<span
class=apple-tab-span> </span>(working copy)<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal>@@ -197,7 +197,10 @@<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal>               
                uint64_t Address, const
void *Decoder);<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal> static DecodeStatus DecodeDPRRegListOperand(MCInst
&Inst, unsigned Val,<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal>               
                uint64_t Address, const
void *Decoder);<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal>+static DecodeStatus DecodeDPRRegFMXListOperand(MCInst
&Inst, unsigned Val,<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal>+                
              uint64_t Address, const void
*Decoder);<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal> <o:p></o:p></p>

</div>

<div>

<p class=MsoNormal>+<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal> static DecodeStatus DecodeBitfieldMaskOperand(MCInst
&Inst, unsigned Insn,<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal>               
                uint64_t Address, const
void *Decoder);<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal> static DecodeStatus DecodeCopMemInstruction(MCInst
&Inst, unsigned Insn,<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal>@@ -1237,18 +1240,38 @@<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal>   return S;<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal> }<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal> <o:p></o:p></p>

</div>

<div>

<p class=MsoNormal>+static DecodeStatus DecodeDPRRegFMXListOperand(MCInst
&Inst, unsigned Val,<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal>+                
              uint64_t Address, const void
*Decoder){<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal>+  DecodeStatus S = MCDisassembler::Success;<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal>+<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal>+  unsigned Vd = fieldFromInstruction32(Val, 8, 4);<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal>+  int regs = fieldFromInstruction32(Val, 1, 7);<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal>+<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal>+  if (regs == 0 || Vd + regs > 16)<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal>+    S = MCDisassembler::SoftFail;<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal>+<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal>+  if (!Check(S, DecodeDPRRegisterClass(Inst, Vd,
Address, Decoder)))<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal>+      return MCDisassembler::Fail;<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal>+<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal>+  Inst.addOperand(MCOperand::CreateImm(regs));<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal>+  <o:p></o:p></p>

</div>

<div>

<p class=MsoNormal>+  return S;<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal>+}<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal>+<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal><o:p> </o:p></p>

</div>

<div>

<p class=MsoNormal>Likewise.<o:p></o:p></p>

</div>

<p class=MsoNormal><br>
<br>
<o:p></o:p></p>

<div>

<p class=MsoNormal> static DecodeStatus DecodeDPRRegListOperand(MCInst
&Inst, unsigned Val,<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal>               
                  uint64_t
Address, const void *Decoder) {<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal>   DecodeStatus S = MCDisassembler::Success;<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal> <o:p></o:p></p>

</div>

<div>

<p class=MsoNormal>   unsigned Vd = fieldFromInstruction32(Val, 8,
5);<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal>-  unsigned regs = fieldFromInstruction32(Val, 0, 8);<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal>+  int regs = fieldFromInstruction32(Val, 1, 7);<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal> <o:p></o:p></p>

</div>

<div>

<p class=MsoNormal>-  regs = regs >> 1;<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal>+  if (regs == 0 || regs > 16 || Vd+regs >
32) <o:p></o:p></p>

</div>

<div>

<p class=MsoNormal>+    S = MCDisassembler::SoftFail;<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal> <o:p></o:p></p>

</div>

<div>

<p class=MsoNormal>   if (!Check(S, DecodeDPRRegisterClass(Inst, Vd,
Address, Decoder)))<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal>       return MCDisassembler::Fail;<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal>-  for (unsigned i = 0; i < (regs - 1); ++i) {<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal>+ <o:p></o:p></p>

</div>

<div>

<p class=MsoNormal>+  for (int i = 0; i < (regs - 1); ++i) {<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal>     if (!Check(S, DecodeDPRRegisterClass(Inst,
++Vd, Address, Decoder)))<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal>       return MCDisassembler::Fail;<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal>   }<o:p></o:p></p>

</div>

<div>

<div>

<p class=MsoNormal><o:p> </o:p></p>

</div>

</div>

</div>

<div>

<p class=MsoNormal><o:p> </o:p></p>

</div>

<p class=MsoNormal><br>
<br>
<o:p></o:p></p>

<div>

<div>

<p class=MsoNormal><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";
color:#1F497D'> </span><o:p></o:p></p>

</div>

<div>

<p class=MsoNormal><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";
color:#1F497D'>Thanks,</span><o:p></o:p></p>

</div>

<div>

<p class=MsoNormal><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";
color:#1F497D'>Silviu</span><o:p></o:p></p>

</div>

<div>

<p class=MsoNormal><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";
color:#1F497D'> </span><o:p></o:p></p>

</div>

<div style='border:none;border-left:solid blue 1.5pt;padding:0cm 0cm 0cm 4.0pt'>

<div>

<div style='border:none;border-top:solid #B5C4DF 1.0pt;padding:3.0pt 0cm 0cm 0cm'>

<div>

<p class=MsoNormal><b><span lang=EN-US style='font-size:10.0pt;font-family:
"Tahoma","sans-serif"'>From:</span></b><span class=apple-converted-space><span
lang=EN-US style='font-size:10.0pt;font-family:"Tahoma","sans-serif"'> </span></span><span
lang=EN-US style='font-size:10.0pt;font-family:"Tahoma","sans-serif"'>Jim
Grosbach [mailto:grosbach@<a href="http://apple.com">apple.com</a>]<span
class=apple-converted-space> </span><br>
<b>Sent:</b><span class=apple-converted-space> </span>22 May 2012 17:32<br>
<b>To:</b><span class=apple-converted-space> </span>Silviu Baranga<br>
<b>Cc:</b><span class=apple-converted-space> </span><a
href="mailto:llvm-commits@cs.uiuc.edu">llvm-commits@cs.uiuc.edu</a><br>
<b>Subject:</b><span class=apple-converted-space> </span>Re: [PATCH]Add
support for fstmx/fldmx instructions on the ARM backend</span><o:p></o:p></p>

</div>

</div>

</div>

<div>

<p class=MsoNormal> <o:p></o:p></p>

</div>

<div>

<p class=MsoNormal>Hi Silviu,<o:p></o:p></p>

</div>

<div>

<div>

<p class=MsoNormal> <o:p></o:p></p>

</div>

</div>

<div>

<div>

<p class=MsoNormal>Do these instructions only support the "IA"
suffix? Is that suffix always a required part of the syntax?<o:p></o:p></p>

</div>

</div>

<div>

<div>

<p class=MsoNormal> <o:p></o:p></p>

</div>

</div>

<div>

<div>

<div>

<p class=MsoNormal>Index: test/MC/Disassembler/ARM/fstmx-arm.txt<o:p></o:p></p>

</div>

</div>

<div>

<div>

<p class=MsoNormal>===================================================================<o:p></o:p></p>

</div>

</div>

<div>

<div>

<p class=MsoNormal>--- test/MC/Disassembler/ARM/fstmx-arm.txt<span
class=apple-tab-span>        </span><span
class=apple-converted-space> </span>(revision 0)<o:p></o:p></p>

</div>

</div>

<div>

<div>

<p class=MsoNormal>+++ test/MC/Disassembler/ARM/fstmx-arm.txt<span
class=apple-tab-span>     </span><span
class=apple-converted-space> </span>(revision 0)<o:p></o:p></p>

</div>

</div>

<div>

<div>

<p class=MsoNormal>@@ -0,0 +1,9 @@<o:p></o:p></p>

</div>

</div>

<div>

<div>

<p class=MsoNormal>+# RUN: echo "0x0d 0x0b 0xc7 0x0c" | llvm-mc
--disassemble -triple=armv7-linux-gnueabi |& FileCheck %s<o:p></o:p></p>

</div>

</div>

<div>

<div>

<p class=MsoNormal>+# RUN: echo "0x0b 0x5b 0xd2 0x0c" | llvm-mc
--disassemble -triple=armv7-linux-gnueabi |& FileCheck %s<o:p></o:p></p>

</div>

</div>

<div>

<div>

<p class=MsoNormal>+# RUN: echo "0x07 0x1b 0x69 0x0d" | llvm-mc
--disassemble -triple=armv7-linux-gnueabi |& FileCheck %s<o:p></o:p></p>

</div>

</div>

<div>

<div>

<p class=MsoNormal>+# RUN: echo "0x09 0xeb 0x37 0x0d" | llvm-mc
--disassemble -triple=armv7-linux-gnueabi |& FileCheck %s<o:p></o:p></p>

</div>

</div>

<div>

<div>

<p class=MsoNormal>+# RUN: echo "0x0d 0xfb 0xa4 0x0c" | llvm-mc
--disassemble -triple=armv7-linux-gnueabi |& FileCheck %s<o:p></o:p></p>

</div>

</div>

<div>

<div>

<p class=MsoNormal>+# RUN: echo "0x0b 0x3b 0xfb 0x0c" | llvm-mc
--disassemble -triple=armv7-linux-gnueabi |& FileCheck %s<o:p></o:p></p>

</div>

</div>

<div>

<div>

<p class=MsoNormal>+<o:p></o:p></p>

</div>

</div>

<div>

<div>

<p class=MsoNormal>+# CHECK-NOT: vstm<o:p></o:p></p>

</div>

</div>

<div>

<div>

<p class=MsoNormal>+# CHECK-NOT: vldm<o:p></o:p></p>

</div>

</div>

</div>

<div>

<div>

<p class=MsoNormal> <o:p></o:p></p>

</div>

</div>

<div>

<div>

<p class=MsoNormal>Why all the separate run lines with 'echo' instead of having
the bytes in the file directly, one instruction per line, like the other tests?
Additionally, this should be checking what the disassembly should be, not just
what it should not be. i.e., CHECK lines as well as CHECK-NOT. Relatedly, what
is this testing that the entries in fl-encoding.txt do not cover?<o:p></o:p></p>

</div>

</div>

<div>

<div>

<p class=MsoNormal> <o:p></o:p></p>

</div>

</div>

<div>

<div>

<p class=MsoNormal>-Jim<o:p></o:p></p>

</div>

</div>

<div>

<div>

<p class=MsoNormal> <o:p></o:p></p>

</div>

</div>

<div>

<div>

<div>

<div>

<p class=MsoNormal>On May 22, 2012, at 4:05 AM, Silviu Baranga <<a
href="mailto:silbar01@arm.com"><span style='color:purple'>silbar01@arm.com</span></a>>
wrote:<o:p></o:p></p>

</div>

</div>

<div>

<p class=MsoNormal><br>
<br>
<br>
<o:p></o:p></p>

</div>

<div>

<div>

<div>

<p class=MsoNormal><span style='font-size:11.0pt;font-family:"Calibri","sans-serif"'>Hi,</span><o:p></o:p></p>

</div>

</div>

<div>

<div>

<p class=MsoNormal><span style='font-size:11.0pt;font-family:"Calibri","sans-serif"'> </span><o:p></o:p></p>

</div>

</div>

<div>

<div>

<p class=MsoNormal><span style='font-size:11.0pt;font-family:"Calibri","sans-serif"'>The
fstmx/fldmx ARM instructions are currently not implemented in the ARM backend.</span><o:p></o:p></p>

</div>

</div>

<div>

<div>

<p class=MsoNormal><span style='font-size:11.0pt;font-family:"Calibri","sans-serif"'>Although
these instructions are deprecated, they should still be supported for assembly
and</span><o:p></o:p></p>

</div>

</div>

<div>

<div>

<p class=MsoNormal><span style='font-size:11.0pt;font-family:"Calibri","sans-serif"'>disassembly
purposes.</span><o:p></o:p></p>

</div>

</div>

<div>

<div>

<p class=MsoNormal><span style='font-size:11.0pt;font-family:"Calibri","sans-serif"'> </span><o:p></o:p></p>

</div>

</div>

<div>

<div>

<p class=MsoNormal><span style='font-size:11.0pt;font-family:"Calibri","sans-serif"'>The
patch adds support for these instructions and also fixes a problem with the</span><o:p></o:p></p>

</div>

</div>

<div>

<div>

<p class=MsoNormal><span style='font-size:11.0pt;font-family:"Calibri","sans-serif"'>vstm/vldm
instructions which were colliding with the fstmx/fldmx encoding space.</span><o:p></o:p></p>

</div>

</div>

<div>

<div>

<p class=MsoNormal><span style='font-size:11.0pt;font-family:"Calibri","sans-serif"'> </span><o:p></o:p></p>

</div>

</div>

<div>

<div>

<p class=MsoNormal><span style='font-size:11.0pt;font-family:"Calibri","sans-serif"'>Please
review this patch.</span><o:p></o:p></p>

</div>

</div>

<div>

<div>

<p class=MsoNormal><span style='font-size:11.0pt;font-family:"Calibri","sans-serif"'> </span><o:p></o:p></p>

</div>

</div>

<div>

<div>

<p class=MsoNormal><span style='font-size:11.0pt;font-family:"Calibri","sans-serif"'>Thanks,</span><o:p></o:p></p>

</div>

</div>

<div>

<div>

<p class=MsoNormal><span style='font-size:11.0pt;font-family:"Calibri","sans-serif"'>Silviu</span><o:p></o:p></p>

</div>

</div>

<div>

<p class=MsoNormal><span style='font-size:13.5pt;font-family:"Helvetica","sans-serif"'><fstmx.diff></span><o:p></o:p></p>

</div>

</div>

</div>

<div>

<p class=MsoNormal> <o:p></o:p></p>

</div>

</div>

</div>

<p class=MsoNormal><span style='font-size:13.5pt;font-family:"Helvetica","sans-serif"'><fstmx.diff><o:p></o:p></span></p>

</div>

</div>

<p class=MsoNormal><o:p> </o:p></p>

</div>

</div>

</div>

</body>

</html>