[LLVMdev] Operand order in dag pattern matching in td files

Anitha B Gollamudi anitha.boyapati at gmail.com
Fri Nov 16 00:11:26 PST 2012


Hi,

I have a simple question w.r.t the order of operands used in dag
pattern matching in target files. Some of them seem intuitive. But I
want to get it clarified anyway. I am using a pattern from
X86InstrFMA.td in the below example. Consider FMA3 pattern
(simplified).

let Constraints = "$src1 = $dst" in {
multiclass fma3s_rm<bits<8> opc, string OpcodeStr, X86MemOperand x86memop,
                    RegisterClass RC, ValueType OpVT, PatFrag mem_frag,
                    SDPatternOperator OpNode = null_frag> {

  def r     : FMA3<opc, MRMSrcReg, (outs RC:$dst),
                   (ins RC:$src1, RC:$src2, RC:$src3),
                   !strconcat(OpcodeStr,
                              "\t{$src3, $src2, $dst|$dst, $src2, $src3}"),
                   [(set RC:$dst,
                     (OpVT (OpNode RC:$src2, RC:$src1, RC:$src3)))]>;


Given that it is an FMA pattern, the OpNode can be one of X86Fmadd,
X86Fmsub (among other opnodes). The respective operations are :
(a*b+c) and (a*b-c). My questions are:

1. Why does $src2 and not $src1 come first in (OpNode RC:$src2,
RC:$src1, RC:$src3) ?  In other words what is the difference between
(a) and (b):
   (a)    [(set RC:$dst, (OpVT (OpNode RC:$src2, RC:$src1, RC:$src3)))]
   (b)    [(set RC:$dst,(OpVT (OpNode RC:$src1, RC:$src2, RC:$src3)))]

2. Why happens when OpNode is null_frag?

-- 
 Anitha



More information about the llvm-dev mailing list