[PATCH] Rewrite arm_neon.h generation from scratch

Jim Grosbach grosbach at apple.com
Wed Jun 4 17:20:18 PDT 2014


Woah. This sounds fantastic. I'm at WWDC this week so won't be able to give this an in depth review for a bit. Please don't mistake my silence as lack of interest! If I haven't responded in more depth by early next week, please ping me. 

Jim. 

> On Jun 4, 2014, at 3:39 AM, James Molloy <james.molloy at arm.com> wrote:
> 
> Hi all,
> 
> [Obvious stakeholders put on CC, feel free to add more]
> 
> NeonEmitter.cpp, the arm_neon.td tablegen backend, really needs improving. I
> wanted
> to change the behaviour slightly for big endian, but quickly realised that
> this may
> well be the hack that broke the camel's back. I tried to incrementally
> refactor it
> but to be honest it's beyond repair. The attached patch reimplements it from
> scratch.
> Luckily the testing coverage on this stuff is absolutely massive, both with
> regression tests and the "emperor" random test case generator.
> 
> The main change is that previously, in arm_neon.td a bunch of "Operation"s
> were
> defined with special names. NeonEmitter.cpp knew about these Operations and
> would emit code based on a huge switch. Actually this doesn't make much
> sense -
> the type information was held as strings, so type checking was impossible.
> Also
> TableGen's DAG type actually suits this sort of code generation very well
> (surprising that...)
> 
> So now every operation is defined in terms of TableGen DAGs. There are a
> bunch
> of operators to use, including "op" (a generic unary or binary operator),
> "call"
> (to call other intrinsics) and "shuffle" (take a guess...). One of the main
> advantages of this apart from making it more obvious what is going on, is
> that
> we have proper type inference. This has two obvious advantages:
> 
>  1) TableGen can error on bad intrinsic definitions easier, instead of just
>     generating wrong code.
>  2) Calls to other intrinsics are typechecked too. So
>     we no longer need to work out whether the thing we call needs to be the
> Q-lane
>     version or the D-lane version - TableGen knows that itself!
> 
> Here's an example: before:
> 
>  case OpAbdl: {
>    std::string abd = MangleName("vabd", typestr, ClassS) + "(__a, __b)";
>    if (typestr[0] != 'U') {
>      // vabd results are always unsigned and must be zero-extended.
>      std::string utype = "U" + typestr.str();
>      s += "(" + TypeString(proto[0], typestr) + ")";
>      abd = "(" + TypeString('d', utype) + ")" + abd;
>      s += Extend(utype, abd) + ";";
>    } else {
>      s += Extend(typestr, abd) + ";";
>    }
>    break;
>  }
> 
> after:
> 
>  def OP_ABDL     : Op<(cast "R", (call "vmovl", (cast $p0, "U",
>                                                       (call "vabd", $p0,
> $p1))))>;
> 
> As an example of what happens if you do something wrong now, here's what
> happens
> if you make $p0 unsigned before the call to "vabd" - that is, $p0 -> (cast
> "U", $p0):
> 
> arm_neon.td:574:1: error: No compatible intrinsic found - looking up
> intrinsic 'vabd(uint8x8_t, int8x8_t)'
> Available overloads:
>  - float64x2_t vabdq_v(float64x2_t, float64x2_t)
>  - float64x1_t vabd_v(float64x1_t, float64x1_t)
>  - float64_t vabdd_f64(float64_t, float64_t)
>  - float32_t vabds_f32(float32_t, float32_t)
> ... snip ...
> 
> This makes it seriously easy to work out what you've done wrong in fairly
> nasty
> intrinsics.
> 
> As part of this I've massively beefed up the documentation in arm_neon.td
> too.
> 
> Things still to do / on the radar:
>  - Testcase generation. This was implemented in the previous version and
> not in
>    the new one, because
>    - Autogenerated tests are not being run. The testcase in test/ differs
> from
>      the autogenerated version.
>    - There were a whole slew of special cases in the testcase generation
> that just
>      felt (and looked) like hacks.
>    If someone really feels strongly about this, I can try and reimplement
> it too.
>  - Big endian. That's coming soon and should be a very small diff on top of
> this one.
> 
> Cheers,
> 
> James
> 
> ---
> include/clang/Basic/arm_neon.td   |  653 +++--
> test/CodeGen/arm64_vcvtfp.c       |    2 +-
> test/Sema/arm-neon-types.c        |    2 +-
> test/Sema/arm64-neon-args.c       |    2 +-
> utils/TableGen/NeonEmitter.cpp    | 4833
> ++++++++++++++-----------------------
> utils/TableGen/TableGenBackends.h |    3 +
> 6 files changed, 2303 insertions(+), 3192 deletions(-)
> <0001-Move-SetTheory-from-utils-TableGen-into-lib-TableGen.patch>
> <0001-Rewrite-ARM-NEON-intrinsic-emission-completely.patch>



More information about the cfe-commits mailing list