This is an archive of the discontinued LLVM Phabricator instance.

[ARM,MVE] Add intrinsics for vector get/set lane.
ClosedPublic

Authored by simon_tatham on Nov 13 2019, 8:34 AM.

Details

Summary

This adds the vgetq_lane and vsetq_lane families, to copy between
a scalar and a specified lane of a vector.

One of the new vgetq_lane intrinsics returns a float16_t, which
causes a compile error if %clang_cc1 doesn't get the option
-fallow-half-arguments-and-returns. The driver passes that option to
cc1 already, but I've had to edit all the explicit cc1 command lines
in the existing MVE intrinsics tests.

A couple of fixes are included for the code I wrote up front in
MveEmitter to support lane-index immediates (and which nothing has
tested until now): the type was wrong (uint32_t instead of int)
and the range was off by one.

I've also added a method of bypassing the default promotion to i32
that is done by the MveEmitter code generation: it's sensible to
promote short scalars like i16 to i32 if they're going to be
passed to custom IR intrinsics representing a machine instruction
operating on GPRs, but not if they're going to be passed to standard
IR operations like insertelement which expect the exact type.

Event Timeline

simon_tatham created this revision.Nov 13 2019, 8:34 AM
Herald added a project: Restricted Project. · View Herald TranscriptNov 13 2019, 8:34 AM
dmgreen accepted this revision.Nov 14 2019, 1:27 AM

Thanks. LGTM.

This revision is now accepted and ready to land.Nov 14 2019, 1:27 AM
This revision was automatically updated to reflect the committed changes.