<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 14 (filtered medium)"><base href="x-msg://22160/"><style><!--
/* Font Definitions */
@font-face
        {font-family:Helvetica;
        panose-1:2 11 6 4 2 2 2 2 2 4;}
@font-face
        {font-family:SimSun;
        panose-1:2 1 6 0 3 1 1 1 1 1;}
@font-face
        {font-family:SimSun;
        panose-1:2 1 6 0 3 1 1 1 1 1;}
@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;}
@font-face
        {font-family:"\@SimSun";
        panose-1:2 1 6 0 3 1 1 1 1 1;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
        {margin:0in;
        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;}
p.MsoAcetate, li.MsoAcetate, div.MsoAcetate
        {mso-style-priority:99;
        mso-style-link:"Balloon Text Char";
        margin:0in;
        margin-bottom:.0001pt;
        font-size:8.0pt;
        font-family:"Tahoma","sans-serif";}
span.apple-converted-space
        {mso-style-name:apple-converted-space;}
span.EmailStyle18
        {mso-style-type:personal-reply;
        font-family:"Calibri","sans-serif";
        color:#1F497D;}
span.BalloonTextChar
        {mso-style-name:"Balloon Text Char";
        mso-style-priority:99;
        mso-style-link:"Balloon Text";
        font-family:"Tahoma","sans-serif";}
.MsoChpDefault
        {mso-style-type:export-only;
        font-size:10.0pt;}
@page WordSection1
        {size:8.5in 11.0in;
        margin:1.0in 1.0in 1.0in 1.0in;}
div.WordSection1
        {page:WordSection1;}
--></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-US link=blue vlink=purple><div class=WordSection1><p class=MsoNormal><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'>Hi Wilson,<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'>Yes, hwdiv-arm does the job, cool!<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'><o:p> </o:p></span></p><p class=MsoNormal><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'>Weiming<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><p class=MsoNormal><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'>Qualcomm Innovation Center, Inc. is a member of Code Aurora Forum, hosted by The Linux Foundation</span><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'><o:p></o:p></span></p></div><p class=MsoNormal><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'><o:p> </o:p></span></p><div><div style='border:none;border-top:solid #B5C4DF 1.0pt;padding:3.0pt 0in 0in 0in'><p class=MsoNormal><b><span style='font-size:10.0pt;font-family:"Tahoma","sans-serif"'>From:</span></b><span style='font-size:10.0pt;font-family:"Tahoma","sans-serif"'> Bob Wilson [mailto:bob.wilson@apple.com] <br><b>Sent:</b> Saturday, September 29, 2012 5:27 PM<br><b>To:</b> weimingz@codeaurora.org<br><b>Cc:</b> 'Jim Grosbach'; llvm-commits@cs.uiuc.edu<br><b>Subject:</b> Re: [llvm-commits] Fix PR13936: Add sdiv/udiv in ARM mode for targets that support them<o:p></o:p></span></p></div></div><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>I think most, if not all of this, is already handled by svn r164899.  Can you check if we're still missing anything?<o:p></o:p></p><div><p class=MsoNormal><o:p> </o:p></p><div><div><p class=MsoNormal>On Sep 27, 2012, at 6:37 PM, Weiming Zhao <<a href="mailto:weimingz@codeaurora.org">weimingz@codeaurora.org</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 your review and suggestions.</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 addressed the issues that you mentioned.</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’m reusing the encoding of AMul, but I can’t completely remove the ADivI32 class because the coding format of them are defined differently on Bit 7-4, 12-15 and bit 20.</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'>Please help to review the attached patch.</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,</span><o:p></o:p></p></div><div><p class=MsoNormal><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'>Weiming</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><div><p class=MsoNormal><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'>Qualcomm Innovation Center, Inc. is a member of Code Aurora Forum, hosted by The Linux Foundation</span><o:p></o:p></p></div></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><div style='border:none;border-top:solid #B5C4DF 1.0pt;padding:3.0pt 0in 0in 0in'><div><p class=MsoNormal><b><span style='font-size:10.0pt;font-family:"Tahoma","sans-serif"'>From:</span></b><span class=apple-converted-space><span style='font-size:10.0pt;font-family:"Tahoma","sans-serif"'> </span></span><span style='font-size:10.0pt;font-family:"Tahoma","sans-serif"'>Jim Grosbach [mailto:grosbach@<a href="http://apple.com"><span style='color:purple'>apple.com</span></a>]<span class=apple-converted-space> </span><br><b>Sent:</b><span class=apple-converted-space> </span>Thursday, September 27, 2012 1:52 PM<br><b>To:</b><span class=apple-converted-space> </span><a href="mailto:weimingz@codeaurora.org"><span style='color:purple'>weimingz@codeaurora.org</span></a><br><b>Cc:</b><span class=apple-converted-space> </span><a href="mailto:llvm-commits@cs.uiuc.edu"><span style='color:purple'>llvm-commits@cs.uiuc.edu</span></a><br><b>Subject:</b><span class=apple-converted-space> </span>Re: [llvm-commits] Fix PR13936: Add sdiv/udiv in ARM mode for targets that support them</span><o:p></o:p></p></div></div></div><div><p class=MsoNormal> <o:p></o:p></p></div><div><div><p class=MsoNormal>Hello,<o:p></o:p></p></div></div><div><div><p class=MsoNormal> <o:p></o:p></p></div></div><div><div><p class=MsoNormal>Come comments inline:<o:p></o:p></p></div></div><blockquote style='margin-top:5.0pt;margin-bottom:5.0pt'><div><div><p class=MsoNormal> <o:p></o:p></p></div></div><div><div><p class=MsoNormal>Added support for signed/unsigned integer division (SDIV and UDIV),<o:p></o:p></p></div></div><div><div><p class=MsoNormal>which are optional for ARMv7-A/ARMv7-R in ARM mode.  By enabling<o:p></o:p></p></div></div><div><div><p class=MsoNormal>subtarget feature "hwdiv", sdiv/udiv will be emitted in ARM mode<o:p></o:p></p></div></div><div><div><p class=MsoNormal>to replace libcalls for integer division and modulo operations.<o:p></o:p></p></div></div></blockquote><div><div><p class=MsoNormal> <o:p></o:p></p></div></div><div><div><p class=MsoNormal>Cool!<o:p></o:p></p></div></div><div><p class=MsoNormal><br><br><br><o:p></o:p></p></div><div><div><p class=MsoNormal> <o:p></o:p></p></div></div><div><div><p class=MsoNormal>Note: Use LLVM integrated assembler or GNU AS 4.7. GNU AS 4.6 does not<o:p></o:p></p></div></div><div><div><p class=MsoNormal>support them.<o:p></o:p></p></div></div><div><div><p class=MsoNormal>---<o:p></o:p></p></div></div><div><div><p class=MsoNormal> lib/Target/ARM/ARMISelLowering.cpp |    6 ++++--<o:p></o:p></p></div></div><div><div><p class=MsoNormal> lib/Target/ARM/ARMInstrFormats.td  |   12 ++++++++++++<o:p></o:p></p></div></div><div><div><p class=MsoNormal> lib/Target/ARM/ARMInstrInfo.td     |   33 +++++++++++++++++++++++++++++++++<o:p></o:p></p></div></div><div><div><p class=MsoNormal> test/CodeGen/ARM/divhw.ll          |   36 ++++++++++++++++++++++++++++++++++++<o:p></o:p></p></div></div><div><div><p class=MsoNormal> test/CodeGen/Thumb2/divhw.ll       |   36 ++++++++++++++++++++++++++++++++++++<o:p></o:p></p></div></div><div><div><p class=MsoNormal> 5 files changed, 121 insertions(+), 2 deletions(-)<o:p></o:p></p></div></div><div><div><p class=MsoNormal> create mode 100755 test/CodeGen/ARM/divhw.ll<o:p></o:p></p></div></div><div><div><p class=MsoNormal> create mode 100755 test/CodeGen/Thumb2/divhw.ll<o:p></o:p></p></div></div><div><div><p class=MsoNormal> <o:p></o:p></p></div></div><div><div><p class=MsoNormal>diff --git a/lib/Target/ARM/ARMISelLowering.cpp b/lib/Target/ARM/ARMISelLowering.cpp<o:p></o:p></p></div></div><div><div><p class=MsoNormal>index dce9246..351c558 100644<o:p></o:p></p></div></div><div><div><p class=MsoNormal>--- a/lib/Target/ARM/ARMISelLowering.cpp<o:p></o:p></p></div></div><div><div><p class=MsoNormal>+++ b/lib/Target/ARM/ARMISelLowering.cpp<o:p></o:p></p></div></div><div><div><p class=MsoNormal>@@ -636,8 +636,10 @@ ARMTargetLowering::ARMTargetLowering(TargetMachine &TM)<o:p></o:p></p></div></div><div><div><p class=MsoNormal>     setOperationAction(ISD::BSWAP, MVT::i32, Expand);<o:p></o:p></p></div></div><div><div><p class=MsoNormal> <o:p></o:p></p></div></div><div><div><p class=MsoNormal>   // These are expanded into libcalls.<o:p></o:p></p></div></div><div><div><p class=MsoNormal>-  if (!Subtarget->hasDivide() || !Subtarget->isThumb2()) {<o:p></o:p></p></div></div><div><div><p class=MsoNormal>-    // v7M has a hardware divider<o:p></o:p></p></div></div><div><div><p class=MsoNormal>+  if (!Subtarget->hasDivide() ||<o:p></o:p></p></div></div><div><div><p class=MsoNormal>+     (!Subtarget->isThumb2() && Subtarget->isMClass())) {<o:p></o:p></p></div></div><div><div><p class=MsoNormal>+    // v7M has a hardware divider in Thumb mode.<o:p></o:p></p></div></div><div><div><p class=MsoNormal>+    // v7A and v7R have optional hardware divider in ARM mode.<o:p></o:p></p></div></div><div><div><p class=MsoNormal>     setOperationAction(ISD::SDIV,  MVT::i32, Expand);<o:p></o:p></p></div></div><div><div><p class=MsoNormal>     setOperationAction(ISD::UDIV,  MVT::i32, Expand);<o:p></o:p></p></div></div><div><div><p class=MsoNormal>   }<o:p></o:p></p></div></div><div><div><p class=MsoNormal>diff --git a/lib/Target/ARM/ARMInstrFormats.td b/lib/Target/ARM/ARMInstrFormats.td<o:p></o:p></p></div></div><div><div><p class=MsoNormal>index c8966fb..0a16dec 100644<o:p></o:p></p></div></div><div><div><p class=MsoNormal>--- a/lib/Target/ARM/ARMInstrFormats.td<o:p></o:p></p></div></div><div><div><p class=MsoNormal>+++ b/lib/Target/ARM/ARMInstrFormats.td<o:p></o:p></p></div></div><div><div><p class=MsoNormal>@@ -69,6 +69,7 @@ def NVExtFrm      : Format<39>;<o:p></o:p></p></div></div><div><div><p class=MsoNormal> def NVMulSLFrm    : Format<40>;<o:p></o:p></p></div></div><div><div><p class=MsoNormal> def NVTBLFrm      : Format<41>;<o:p></o:p></p></div></div><div><div><p class=MsoNormal> def DPSoRegImmFrm  : Format<42>;<o:p></o:p></p></div></div><div><div><p class=MsoNormal>+def DivFrm        : Format<43>;<o:p></o:p></p></div></div><div><div><p class=MsoNormal> <o:p></o:p></p></div></div><div><p class=MsoNormal>Why do we need a new format?<o:p></o:p></p></div><div><div><p class=MsoNormal><br><br><br><o:p></o:p></p></div><div><div><p class=MsoNormal> <o:p></o:p></p></div></div><div><div><p class=MsoNormal> // Misc flags.<o:p></o:p></p></div></div><div><div><p class=MsoNormal> <o:p></o:p></p></div></div><div><div><p class=MsoNormal>@@ -735,6 +736,17 @@ class AXI4<dag oops, dag iops, IndexMode im, Format f, InstrItinClass itin,<o:p></o:p></p></div></div><div><div><p class=MsoNormal>   let Inst{15-0}  = regs;<o:p></o:p></p></div></div><div><div><p class=MsoNormal> }<o:p></o:p></p></div></div><div><div><p class=MsoNormal> <o:p></o:p></p></div></div><div><div><p class=MsoNormal>+<o:p></o:p></p></div></div><div><div><p class=MsoNormal>+// Signed and Unsigned division.<o:p></o:p></p></div></div><div><div><p class=MsoNormal>+class AsDiv1I<bits<3> opcod, dag oops, dag iops, InstrItinClass itin,<o:p></o:p></p></div></div><div><div><p class=MsoNormal>+              string opc, string asm, list<dag> pattern><o:p></o:p></p></div></div><div><div><p class=MsoNormal>+  : I<oops, iops, AddrModeNone, 4, IndexModeNone, DivFrm, itin,<o:p></o:p></p></div></div><div><div><p class=MsoNormal>+       opc, asm, "", pattern> {<o:p></o:p></p></div></div><div><div><p class=MsoNormal>+  let Inst{7-4}   = 0b0001;<o:p></o:p></p></div></div><div><div><p class=MsoNormal>+  let Inst{22-20}   = opcod;<o:p></o:p></p></div></div><div><div><p class=MsoNormal>+  let Inst{27-23} = 0b01110;<o:p></o:p></p></div></div><div><div><p class=MsoNormal>+}<o:p></o:p></p></div></div><div><div><p class=MsoNormal>+<o:p></o:p></p></div></div><div><div><p class=MsoNormal> // Unsigned multiply, multiply-accumulate instructions.<o:p></o:p></p></div></div><div><div><p class=MsoNormal> class AMul1I<bits<7> opcod, dag oops, dag iops, InstrItinClass itin,<o:p></o:p></p></div></div><div><div><p class=MsoNormal>              string opc, string asm, list<dag> pattern><o:p></o:p></p></div></div><div><div><p class=MsoNormal>diff --git a/lib/Target/ARM/ARMInstrInfo.td b/lib/Target/ARM/ARMInstrInfo.td<o:p></o:p></p></div></div><div><div><p class=MsoNormal>index 20d7c1b..a2d0ef8 100644<o:p></o:p></p></div></div><div><div><p class=MsoNormal>--- a/lib/Target/ARM/ARMInstrInfo.td<o:p></o:p></p></div></div><div><div><p class=MsoNormal>+++ b/lib/Target/ARM/ARMInstrInfo.td<o:p></o:p></p></div></div><div><div><p class=MsoNormal>@@ -3389,6 +3389,39 @@ def  MVNi  : AsI1<0b1111, (outs GPR:$Rd), (ins so_imm:$imm), DPFrm,<o:p></o:p></p></div></div><div><div><p class=MsoNormal> def : ARMPat<(and   GPR:$src, so_imm_not:$imm),<o:p></o:p></p></div></div><div><div><p class=MsoNormal>              (BICri GPR:$src, so_imm_not:$imm)>;<o:p></o:p></p></div></div><div><div><p class=MsoNormal> <o:p></o:p></p></div></div><div><div><p class=MsoNormal>+<o:p></o:p></p></div></div><div><div><p class=MsoNormal>+//===----------------------------------------------------------------------===//<o:p></o:p></p></div></div><div><div><p class=MsoNormal>+// Division Instructions.<o:p></o:p></p></div></div><div><div><p class=MsoNormal>+// Signed and unsigned division, optional on v7a/r<o:p></o:p></p></div></div><div><div><p class=MsoNormal>+//<o:p></o:p></p></div></div><div><div><p class=MsoNormal>+<o:p></o:p></p></div></div><div><div><p class=MsoNormal>+class AsDiv1I32<bits<3> opcod, dag oops, dag iops, InstrItinClass itin,<o:p></o:p></p></div></div><div><div><p class=MsoNormal>+             string opc, string asm, list<dag> pattern><o:p></o:p></p></div></div><div><div><p class=MsoNormal>+  : AsDiv1I<opcod, oops, iops, itin, opc, asm, pattern> {<o:p></o:p></p></div></div><div><div><p class=MsoNormal>+  bits<4> Rd;<o:p></o:p></p></div></div><div><div><p class=MsoNormal>+  bits<4> Rm;<o:p></o:p></p></div></div><div><div><p class=MsoNormal>+  bits<4> Rn;<o:p></o:p></p></div></div><div><div><p class=MsoNormal>+  let Inst{19-16} = Rd;<o:p></o:p></p></div></div><div><div><p class=MsoNormal>+  let Inst{11-8}  = Rm;<o:p></o:p></p></div></div><div><div><p class=MsoNormal>+  let Inst{3-0}   = Rn;<o:p></o:p></p></div></div><div><div><p class=MsoNormal>+}<o:p></o:p></p></div></div><div><div><p class=MsoNormal>+<o:p></o:p></p></div></div><div><div><p class=MsoNormal> <o:p></o:p></p></div></div><div><div><p class=MsoNormal>Why have both AMul1I and AsDiv1I32? It seems they could be combined.<o:p></o:p></p></div></div><div><p class=MsoNormal><br><br><br><o:p></o:p></p></div><div><div><p class=MsoNormal>+def SDIV  : AsDiv1I32<0b001, (outs GPRnopc:$Rd), (ins GPRnopc:$Rn, GPRnopc:$Rm),<o:p></o:p></p></div></div><div><div><p class=MsoNormal>+                   IIC_iALUr, "sdiv", "\t$Rd, $Rn, $Rm",<o:p></o:p></p></div></div><div><div><p class=MsoNormal>+                   [(set GPRnopc:$Rd, (sdiv GPRnopc:$Rn, GPRnopc:$Rm))]>,<o:p></o:p></p></div></div><div><div><p class=MsoNormal>+                   Requires<[IsARM, HasDivide]> {<o:p></o:p></p></div></div><div><div><p class=MsoNormal>+  let Inst{15-12} = 0b1111;<o:p></o:p></p></div></div><div><div><p class=MsoNormal>+  let Unpredictable{15-12} = 0b1111;<o:p></o:p></p></div></div><div><div><p class=MsoNormal> <o:p></o:p></p></div></div><div><div><p class=MsoNormal>These bits are common for SDIV and UDIV, so can they be part of AMul1I rather than specified explicitly here?<o:p></o:p></p></div></div><div><div><p class=MsoNormal> <o:p></o:p></p></div></div><div><div><p class=MsoNormal>Likewise, the (ins) and (outs), format, itinerary, and asm operand string for SDIV and UDIV are identical, so can be shared in the format. We only need to parameterize the parts that actually vary between the two. In this case, that's the mnemonic and the operator for the pattern. These definitions can look like:<o:p></o:p></p></div></div><div><div><p class=MsoNormal> <o:p></o:p></p></div></div><div><div><p class=MsoNormal>def UDIV : AMulI<"udiv", udiv>; <o:p></o:p></p></div></div><div><div><p class=MsoNormal>def UDIV : AMulI<"udiv", sdiv>; <o:p></o:p></p></div></div><div><div><p class=MsoNormal> <o:p></o:p></p></div></div><div><p class=MsoNormal><br><br><br><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></div><div><div><p class=MsoNormal>+def UDIV  : AsDiv1I32<0b011, (outs GPRnopc:$Rd), (ins GPRnopc:$Rn, GPRnopc:$Rm),<o:p></o:p></p></div></div><div><div><p class=MsoNormal>+                   IIC_iALUr, "udiv", "\t$Rd, $Rn, $Rm",<o:p></o:p></p></div></div><div><div><p class=MsoNormal>+                   [(set GPRnopc:$Rd, (udiv GPRnopc:$Rn, GPRnopc:$Rm))]>,<o:p></o:p></p></div></div><div><div><p class=MsoNormal>+                   Requires<[IsARM, HasDivide]> {<o:p></o:p></p></div></div><div><div><p class=MsoNormal>+  let Inst{15-12} = 0b1111;<o:p></o:p></p></div></div><div><div><p class=MsoNormal>+  let Unpredictable{15-12} = 0b1111;<o:p></o:p></p></div></div><div><div><p class=MsoNormal>+}<o:p></o:p></p></div></div><div><div><p class=MsoNormal>+<o:p></o:p></p></div></div><div><div><p class=MsoNormal> //===----------------------------------------------------------------------===//<o:p></o:p></p></div></div><div><div><p class=MsoNormal> //  Multiply Instructions.<o:p></o:p></p></div></div><div><div><p class=MsoNormal> //<o:p></o:p></p></div></div><div><div><p class=MsoNormal>diff --git a/test/CodeGen/ARM/divhw.ll b/test/CodeGen/ARM/divhw.ll<o:p></o:p></p></div></div><div><div><p class=MsoNormal>new file mode 100755<o:p></o:p></p></div></div><div><div><p class=MsoNormal>index 0000000..dd21297<o:p></o:p></p></div></div><div><div><p class=MsoNormal>--- /dev/null<o:p></o:p></p></div></div><div><div><p class=MsoNormal>+++ b/test/CodeGen/ARM/divhw.ll<o:p></o:p></p></div></div><div><div><p class=MsoNormal>@@ -0,0 +1,36 @@<o:p></o:p></p></div></div><div><div><p class=MsoNormal>+; RUN: llc < %s -mtriple=armv7-none-linux-gnueabi -mattr=+hwdiv  | 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>+define i32 @f1(i32 %a, i32 %b) {<o:p></o:p></p></div></div><div><div><p class=MsoNormal>+entry:<o:p></o:p></p></div></div><div><div><p class=MsoNormal>+; CHECK: f1<o:p></o:p></p></div></div><div><div><p class=MsoNormal> <o:p></o:p></p></div></div><div><div><p class=MsoNormal>There should be a ':' following the function name on the check line to make sure that's what we find (not some other reference to 'f1').<o:p></o:p></p></div></div><div><p class=MsoNormal><br><br><br><o:p></o:p></p></div><div><div><p class=MsoNormal>+; CHECK: sdiv<o:p></o:p></p></div></div><div><div><p class=MsoNormal> <o:p></o:p></p></div></div><div><div><p class=MsoNormal>Please check the operands as well as the mnemonic.<o:p></o:p></p></div></div><div><div><p class=MsoNormal> <o:p></o:p></p></div></div><div><p class=MsoNormal><br><br><br><o:p></o:p></p></div><div><div><p class=MsoNormal>+        %tmp1 = sdiv i32 %a, %b<o:p></o:p></p></div></div><div><div><p class=MsoNormal>+        ret i32 %tmp1<o:p></o:p></p></div></div><div><div><p class=MsoNormal>+}<o:p></o:p></p></div></div><div><div><p class=MsoNormal>+<o:p></o:p></p></div></div><div><div><p class=MsoNormal>+define i32 @f2(i32 %a, i32 %b) {<o:p></o:p></p></div></div><div><div><p class=MsoNormal>+entry:<o:p></o:p></p></div></div><div><div><p class=MsoNormal>+; CHECK: f2<o:p></o:p></p></div></div><div><div><p class=MsoNormal>+; CHECK: udiv<o:p></o:p></p></div></div><div><div><p class=MsoNormal>+        %tmp1 = udiv i32 %a, %b<o:p></o:p></p></div></div><div><div><p class=MsoNormal>+        ret i32 %tmp1<o:p></o:p></p></div></div><div><div><p class=MsoNormal>+}<o:p></o:p></p></div></div><div><div><p class=MsoNormal>+<o:p></o:p></p></div></div><div><div><p class=MsoNormal>+define i32 @f3(i32 %a, i32 %b) {<o:p></o:p></p></div></div><div><div><p class=MsoNormal>+entry:<o:p></o:p></p></div></div><div><div><p class=MsoNormal>+; CHECK: f3<o:p></o:p></p></div></div><div><div><p class=MsoNormal>+; CHECK: sdiv<o:p></o:p></p></div></div><div><div><p class=MsoNormal>+; CHECK-NEXT: mls<o:p></o:p></p></div></div><div><div><p class=MsoNormal>+        %tmp1 = srem i32 %a, %b<o:p></o:p></p></div></div><div><div><p class=MsoNormal>+        ret i32 %tmp1<o:p></o:p></p></div></div><div><div><p class=MsoNormal>+}<o:p></o:p></p></div></div><div><div><p class=MsoNormal>+<o:p></o:p></p></div></div><div><div><p class=MsoNormal>+define i32 @f4(i32 %a, i32 %b) {<o:p></o:p></p></div></div><div><div><p class=MsoNormal>+entry:<o:p></o:p></p></div></div><div><div><p class=MsoNormal>+; CHECK: f4<o:p></o:p></p></div></div><div><div><p class=MsoNormal>+; CHECK: udiv<o:p></o:p></p></div></div><div><div><p class=MsoNormal>+; CHECK-NEXT: mls<o:p></o:p></p></div></div><div><div><p class=MsoNormal>+        %tmp1 = urem i32 %a, %b<o:p></o:p></p></div></div><div><div><p class=MsoNormal>+        ret i32 %tmp1<o:p></o:p></p></div></div><div><div><p class=MsoNormal>+}<o:p></o:p></p></div></div><div><div><p class=MsoNormal>+<o:p></o:p></p></div></div><div><div><p class=MsoNormal>diff --git a/test/CodeGen/Thumb2/divhw.ll b/test/CodeGen/Thumb2/divhw.ll<o:p></o:p></p></div></div><div><div><p class=MsoNormal>new file mode 100755<o:p></o:p></p></div></div><div><div><p class=MsoNormal>index 0000000..f99efd8<o:p></o:p></p></div></div><div><div><p class=MsoNormal>--- /dev/null<o:p></o:p></p></div></div><div><div><p class=MsoNormal>+++ b/test/CodeGen/Thumb2/divhw.ll<o:p></o:p></p></div></div><div><div><p class=MsoNormal>@@ -0,0 +1,36 @@<o:p></o:p></p></div></div><div><div><p class=MsoNormal>+; RUN: llc < %s -mtriple=thumbv7-none-linux-gnueabi -mattr=+hwdiv  | 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>+define i32 @f1(i32 %a, i32 %b) {<o:p></o:p></p></div></div><div><div><p class=MsoNormal>+entry:<o:p></o:p></p></div></div><div><div><p class=MsoNormal>+; CHECK: f1<o:p></o:p></p></div></div><div><div><p class=MsoNormal>+; CHECK: sdiv<o:p></o:p></p></div></div><div><div><p class=MsoNormal>+        %tmp1 = sdiv i32 %a, %b<o:p></o:p></p></div></div><div><div><p class=MsoNormal>+        ret i32 %tmp1<o:p></o:p></p></div></div><div><div><p class=MsoNormal>+}<o:p></o:p></p></div></div><div><div><p class=MsoNormal>+<o:p></o:p></p></div></div><div><div><p class=MsoNormal>+define i32 @f2(i32 %a, i32 %b) {<o:p></o:p></p></div></div><div><div><p class=MsoNormal>+entry:<o:p></o:p></p></div></div><div><div><p class=MsoNormal>+; CHECK: f2<o:p></o:p></p></div></div><div><div><p class=MsoNormal>+; CHECK: udiv<o:p></o:p></p></div></div><div><div><p class=MsoNormal>+        %tmp1 = udiv i32 %a, %b<o:p></o:p></p></div></div><div><div><p class=MsoNormal>+        ret i32 %tmp1<o:p></o:p></p></div></div><div><div><p class=MsoNormal>+}<o:p></o:p></p></div></div><div><div><p class=MsoNormal>+<o:p></o:p></p></div></div><div><div><p class=MsoNormal>+define i32 @f3(i32 %a, i32 %b) {<o:p></o:p></p></div></div><div><div><p class=MsoNormal>+entry:<o:p></o:p></p></div></div><div><div><p class=MsoNormal>+; CHECK: f3<o:p></o:p></p></div></div><div><div><p class=MsoNormal>+; CHECK: sdiv<o:p></o:p></p></div></div><div><div><p class=MsoNormal>+; CHECK-NEXT: mls<o:p></o:p></p></div></div><div><div><p class=MsoNormal>+        %tmp1 = srem i32 %a, %b<o:p></o:p></p></div></div><div><div><p class=MsoNormal>+        ret i32 %tmp1<o:p></o:p></p></div></div><div><div><p class=MsoNormal>+}<o:p></o:p></p></div></div><div><div><p class=MsoNormal>+<o:p></o:p></p></div></div><div><div><p class=MsoNormal>+define i32 @f4(i32 %a, i32 %b) {<o:p></o:p></p></div></div><div><div><p class=MsoNormal>+entry:<o:p></o:p></p></div></div><div><div><p class=MsoNormal>+; CHECK: f4<o:p></o:p></p></div></div><div><div><p class=MsoNormal>+; CHECK: udiv<o:p></o:p></p></div></div><div><div><p class=MsoNormal>+; CHECK-NEXT: mls<o:p></o:p></p></div></div><div><div><p class=MsoNormal>+        %tmp1 = urem i32 %a, %b<o:p></o:p></p></div></div><div><div><p class=MsoNormal>+        ret i32 %tmp1<o:p></o:p></p></div></div><div><div><p class=MsoNormal>+}<o:p></o:p></p></div></div><div><div><p class=MsoNormal>+<o:p></o:p></p></div></div><div><div><p class=MsoNormal>-- <o:p></o:p></p></div></div><div><div><p class=MsoNormal>1.7.8.3<o:p></o:p></p></div></div><div><div><p class=MsoNormal> <o:p></o:p></p></div></div><div><div><p class=MsoNormal> <o:p></o:p></p></div></div><div><div><p class=MsoNormal>There need to be encoding tests in the MC/ARM directory for these instructions so we test the assembler support for them, not just isel.<o:p></o:p></p></div></div><div><div><p class=MsoNormal> <o:p></o:p></p></div></div><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>On Sep 27, 2012, at 12:08 PM, Weiming Zhao <<a href="mailto:weimingz@codeaurora.org"><span style='color:purple'>weimingz@codeaurora.org</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"'>This patch fixes PR 13936 (<a href="http://llvm.org/bugs/show_bug.cgi?id=13936"><span style='color:purple'>http://llvm.org/bugs/show_bug.cgi?id=13936</span></a>)</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"'>According to ARM manual [1], ARM mode sdiv/udiv are optional in ARMv7-A and ARMv7-R on ARM mode.</span><o:p></o:p></p></div></div><div><div><p class=MsoNormal><span style='font-size:11.0pt;font-family:"Calibri","sans-serif"'>So, this patch adds the ARM mode sdiv/udiv definition and encoding  into</span><o:p></o:p></p></div></div><div><div><p class=MsoNormal><span style='font-size:11.0pt;font-family:"Calibri","sans-serif"'>existing td files and use the existing target-feature: hwdiv flag to guard it.</span><o:p></o:p></p></div></div><div><div><p class=MsoNormal><span style='font-size:11.0pt;font-family:"Calibri","sans-serif"'>So, we can avoid calls to RT lib if the hardware supports hw div.</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 the attached 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"'>Weiming</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"'>[1] Architecture Reference Manual ARMv7-A and ARMv7-R edition,</span><o:p></o:p></p></div></div><div><div><p class=MsoNormal><span style='font-size:11.0pt;font-family:"Calibri","sans-serif"'><a href="https://silver.arm.com/download/ARM_and_AMBA_Architecture/AR570-DA-70000-r0p0-00rel1/DDI0406C_b_arm_architecture_reference_manual.pdf"><span style='color:purple'>https://silver.arm.com/download/ARM_and_AMBA_Architecture/AR570-DA-70000-r0p0-00rel1/DDI0406C_b_arm_architecture_reference_manual.pdf</span></a></span><o:p></o:p></p></div></div><div><div><p class=MsoNormal><span style='font-size:11.0pt;font-family:"Calibri","sans-serif"'>, Page A8-600</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"'> </span><o:p></o:p></p></div></div><div><div><p class=MsoNormal><span style='font-size:11.0pt;font-family:"Calibri","sans-serif"'>Qualcomm Innovation Center, Inc. is a member of Code Aurora Forum, hosted by The Linux Foundation</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><p class=MsoNormal><span style='font-size:13.5pt;font-family:"Helvetica","sans-serif"'><0001-PR-13936-Added-hardware-integer-division-support-for.patch>_______________________________________________<br>llvm-commits mailing list<br><a href="mailto:llvm-commits@cs.uiuc.edu"><span style='color:purple'>llvm-commits@cs.uiuc.edu</span></a><br><a href="http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits"><span style='color:purple'>http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits</span></a></span><o:p></o:p></p></div></div></div><div><p class=MsoNormal> <o:p></o:p></p></div></div><p class=MsoNormal><span style='font-size:13.5pt;font-family:"Helvetica","sans-serif"'><0002-PR-13936-Added-hardware-integer-division-support-for.patch>_______________________________________________<br>llvm-commits mailing list<br><a href="mailto:llvm-commits@cs.uiuc.edu"><span style='color:purple'>llvm-commits@cs.uiuc.edu</span></a><br><a href="http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits"><span style='color:purple'>http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits</span></a><o:p></o:p></span></p></div></div><p class=MsoNormal><o:p> </o:p></p></div></div></body></html>