<html>
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
</head>
<body>
<style>
    font{
        line-height: 1.6;
    }
    ul,ol{
        padding-left: 20px;
        list-style-position: inside;
    }
</style>
<div style="font-family:微软雅黑,Verdana,"Microsoft Yahei",SimSun,sans-serif; line-height:1.6;">
    <div>Hi,</div><div><span style="line-height: 1.6;">I have some questions about instructions again.</span></div><div><span style="line-height: 1.6;">I have add a DAG successfully,I think.Because what I do can be c</span><span style="line-height: 1.6;">ompiled to LLVM IR and binary file.</span></div><div><span style="line-height: 1.6;">I guess,</span><span style="line-height: 22.4px;"> </span><span style="line-height: 22.4px;">the schedule</span><span style="line-height: 1.6;"> of an instruction tells the machine how to do . I don't konw if it's right.</span></div><div><span style="line-height: 1.6;">For example,there is the </span>definition <span style="line-height: 1.6;">of </span><span style="line-height: 22.4px;">IMUL32rr in X86InstrArithmetic.td</span><span style="line-height: 22.4px;">. "</span><span style="line-height: 22.4px;">WriteIMul32Reg</span><span style="line-height: 22.4px;">" is the most important and the defines the </span><span style="line-height: 22.4px;">multiplication</span><span style="line-height: 22.4px;">.</span></div><div><div style="line-height: 1.6;">def IMUL32rr : I<0xAF, MRMSrcReg, (outs GR32:$dst), (ins GR32:$src1,GR32:$src2),<span style="line-height: 1.6;">"imul{l}\t{$src2, $dst|$dst, $src2}",</span><span style="line-height: 1.6;">   [(set GR32:$dst, EFLAGS,</span><span style="line-height: 1.6;"> (X86smul_flag GR32:$src1, GR32:$src2))]>,</span><span style="line-height: 1.6;">Sched<[WriteIMul32Reg]>, TB, OpSize32;</span></div><div style="line-height: 1.6;"><span style="line-height: 1.6;">And in X86ScheduleXXX.td ,there is </span><span style="line-height: 22.4px;">definition of Ports and so on.</span></div><div style="line-height: 1.6;"><br></div><div style="line-height: 1.6;">My questions are here,as following:</div><div style="line-height: 1.6;">1.whether <span style="line-height: 22.4px;">the schedule</span><span style="line-height: 1.6;"> of an instruction defines the machine how to do.</span></div><div style="line-height: 1.6;">2.Why is there no "add" or "sub" instructions(<span style="line-height: 22.4px;">"</span><span style="line-height: 22.4px;">ALU insturctions</span><span style="line-height: 22.4px;">"</span><span style="line-height: 1.6;">) in </span><span style="line-height: 22.4px;">X86InstrArithmetic.td? How "</span><span style="line-height: 22.4px;">ALU insturctions</span><span style="line-height: 22.4px;">" define?</span></div><div style="line-height: 1.6;">3. I use the <span style="line-height: 22.4px;">WriteIMul32Reg in my insturction.</span><span style="line-height: 1.6;">In my imagination, my instruction should also be multiplication.But it doesn't work.(my </span><span style="line-height: 22.4px;">instruction can be </span><span style="line-height: 1.6;">c</span><span style="line-height: 1.6;">ompiled but can't run</span><span style="line-height: 1.6;">) .why  can't </span><span style="line-height: 22.4px;">it</span><span style="line-height: 1.6;"> run? I think, it's no different with "</span><span style="line-height: 22.4px;">IMUL32rr</span><span style="line-height: 22.4px;"> </span><span style="line-height: 1.6;">"</span><span style="line-height: 22.4px;">.</span></div><div style="line-height: 1.6;">Here is the result :</div><div style="line-height: 1.6;"><span style="line-height: 22.4px;">test.c shows as </span><span style="line-height: 22.4px;">following:(the main content )</span></div><div style="line-height: 1.6;"><span style="line-height: 22.4px;">int a,b;</span></div><div style="line-height: 1.6;"><span style="line-height: 22.4px;">a=1;b=1;</span></div><div style=""><span style="line-height: 22.4px;">a=</span>a=__builtin_x86_max_qb (a,b); <span style="line-height: 22.4px;">(the main </span><span style="line-height: 22.4px;">content</span><span style="line-height: 22.4px;"> </span><span style="line-height: 22.4px;"> )</span></div><div style="line-height: 1.6;"><span style="line-height: 22.4px;">test.ll shows as following:</span></div><div style="line-height: 1.6;"><span style="line-height: 22.4px;"><div style="line-height: 1.6;">  %0 = load i32, i32* %a, align 4</div><div style="line-height: 1.6;">  %1 = load i32, i32* %b, align 4</div><div style="line-height: 1.6;">  %2 = call i32 @llvm.x86.max.qb(i32 %1, i32 %2)</div><div style="line-height: 1.6;">  store i32 %2, i32* %a, align 4  </div><div style="line-height: 1.6;">when lli test.ll ,it goes wrong.</div></span></div><div style="line-height: 1.6;"><br></div><div style="line-height: 1.6;">Here is my all code:</div><div style="line-height: 1.6;">1. In llvm/include/llvm/IR/IntrinsicsX86.td : </div><div style="line-height: 1.6;"><span style="line-height: 1.6;">let TargetPrefix = </span><span class="hljs-string" style="line-height: 1.6;">"x86"</span><span style="line-height: 1.6;"> in { </span></div><div><div style="line-height: 1.6;"><span style="line-height: 1.6;">def int_x86_max_qb: GCCBuiltin<"__builtin_x86_max_qb">,</span></div><div style="line-height: 1.6;">  Intrinsic<[llvm_i32_ty], [llvm_i32_ty, llvm_i32_ty], [Commutative]>;</div><div style="line-height: 1.6;">}</div><div style="line-height: 1.6;">2. In llvm//tools/clang/include/clang/Basic/BuiltinsX86.def:  </div><div style="line-height: 1.6;">BUILTIN(__builtin_x86_max_qb, "iii", "") </div><div style="line-height: 1.6;">3.In llvm/lib/Target/X86/X86ISelLowering.h:</div><div style="line-height: 1.6;">max_qb,</div><div style=""><span style="line-height: 1.6;">4.In </span><span style="line-height: 22.4px;">llvm/lib/Target/X86/</span>X86IntrinsicsInfo.h:(IntrinsicsWithoutChain)</div><div style="line-height: 1.6;">X86_INTRINSIC_DATA(max_qb, INTR_TYPE_2OP, X86ISD::max_qb, 0),</div><div style="line-height: 1.6;">5.In<span style="line-height: 1.6;"> </span><span style="line-height: 22.4px;">llvm/lib/Target/X86/</span><span style="line-height: 1.6;">X86InstrInfo.td:</span></div><div><div style="line-height: 1.6;">def X86max_qb : SDNode<"X86ISD::max_qb", SDTBinaryArithWithFlags,</div><div style="line-height: 1.6;">                          [SDNPCommutative]>;</div><div style="line-height: 1.6;">6.In X86InstrArithmetic.td: </div><div><div>let Defs = [EFLAGS] in {</div><div style="">    let Constraints = "$src1 = $dst" in {</div><div style="">        let isCommutable = 1 in {</div><div>                def max_qb : I<0xF0,MRMSrcReg, (outs  GR32:$dst), (ins GR32:$src1,GR32:$src2),<span style="line-height: 1.6;"> "max_qb{w}\t {$dst, $src1,$src2|$dst, $src2,$src1}", [(set GR32:$dst,EFLAGS,(X86max_qb GR32:$src1, GR32:$src2))]>, Sched<[WriteIMul32Reg]>,</span><span style="line-height: 1.6;">OpSize32 ;</span></div><div style=""><span style="line-height: 1.6;">    </span><span style="line-height: 1.6;">    </span><span style="line-height: 1.6;">}</span></div><div style=""><span style="line-height: 1.6;">    </span><span style="line-height: 1.6;">}</span></div><div style=""><span style="line-height: 1.6;">}</span></div><div style=""><span style="line-height: 1.6;"><br></span></div><div style=""><span style="line-height: 1.6;">I know,</span>this email is too long to read easily. But I hope you can read over and help me. </div></div></div><div style="line-height: 1.6;"><span style="line-height: 1.6;">Thanks </span><span style="line-height: 1.6;">sincerely</span><span style="line-height: 1.6;">,</span></div><div style="line-height: 1.6;"><span style="line-height: 1.6;">Tianhao Shen</span></div><span style="line-height: 1.6;"><div style="line-height: 1.6;"><br></div></span></div></div><div><span style="line-height: 1.6;"><br></span></div><div><span style="line-height: 1.6;"><br></span></div><!--😀-->
</div>
</body>
</html>