[LLVMdev] Regular Expressions
Chris Lattner
clattner at apple.com
Sat Jun 13 10:25:48 PDT 2009
On Jun 11, 2009, at 2:01 PM, David Greene wrote:
> On Thursday 11 June 2009 12:28, Chris Lattner wrote:
>>>
>>> Yes. I want TableGen to be able to infer lots of stuff
>>> programmatically.
>>> This helps tremendously when specifying things like, oh, AVX. :)
>>
>> I don't see how this relates to regex's, and really don't want to
>> suck
>> in an external regex library. Can you give an example of how this
>> would help?
>
> Sure:
>
> [Top-level specification]
> defm CVTSI2SS :
> sse1_avx_fp_cvt_scalar_xs_scalar64_xs_node_sintrinsic_rm<
> 0x2D, "cvtsi2ss", sint_to_fp, "cvtsi2ss", "f32", "i32">;
>
> [Meanwhile, down in the guts...]
>
> class fp_cvt_scalar_VXSnrr<
> // Parent: avx_fp_cvt_scalar_xs_node_rm_DEF_V#NAME#_128rr
> bits<8> opc,
> string OpcodeStr,
> SDNode OpNode,
> string DstType,
> string SrcType,
> int CustomPatterns = 0,
> list<dag> patterns = [],
> string asm = ""
>> : fp_unary_vxs_n_rm_rr<
> opc,
> !cast<RegisterClass>(!patsubst("^f([0-9]+)","FR$1",!
> patsubst("^i([0-9]+)","GR$1",DstType))),
> [...]
Very clever.
> Basically, the code keys off type strings to deduce register classes
> and
> other such things. This makes specifying things like converts much
> easier
> because one doesn't need to pass a bunch of additional parameters
> around to
> specify register classes, etc. when it is entirely obvious what they
> should be
> given other parameters.
>
> I'm trying to reduce the number of classes/parameters to deal with
> so I
> can eventually get rid of the Perl script that's generating most of
> this
> stuff right now. This kind of pattern matching and substitution
> really
> helps simplify things to a point where I can imagine manually
> maintaining
> a smaller amount of information.
Right, I definitely agree with your goal of reducing redundancy in
the .td files! :)
However, I don't see any reason to base this off of strings. Instead
of passing down "f32" as a string, why not do something like this
pseudo code:
class X86ValueType {
RegisterClass RegClass;
...
}
def X86_f32 : X86ValueType {
let RegClass = FR32;
... };
def X86_i32 : X86ValueType { ... };
Then change fp_cvt_scalar_VXSnrr to be something like this:
> class fp_cvt_scalar_VXSnrr<
> // Parent: avx_fp_cvt_scalar_xs_node_rm_DEF_V#NAME#_128rr
> bits<8> opc,
> string OpcodeStr,
> SDNode OpNode,
> X86ValueType DstType,
> X86ValueType SrcType,
> int CustomPatterns = 0,
> list<dag> patterns = [],
> string asm = ""
>> : fp_unary_vxs_n_rm_rr<
> opc, DstType.RegClass,
This lets you encode whatever you want as properties of the dependent
class, makes everything "type safe", and eliminates string munging.
Would something like this work?
-Chris
More information about the llvm-dev
mailing list