This is an archive of the discontinued LLVM Phabricator instance.

[ARM,MVE] Add intrinsics for scalar shifts.
ClosedPublic

Authored by simon_tatham on Nov 15 2019, 8:57 AM.

Details

Summary

This fills in the small family of MVE intrinsics that have nothing to
do with vectors: they implement bit-shift operations on 32- or 64-bit
values held in one or two general-purpose registers. Most of these
shift operations saturate if shifting left, and round to nearest if
shifting right, although LSLL and ASRL behave like ordinary shifts.

When these instructions take a variable shift count in a register,
they pay attention to its sign, so that (for example) LSLL or UQRSHLL
will shift left if given a positive number but right if given a
negative one. That makes even LSLL and ASRL different enough from
standard LLVM IR shift semantics that I couldn't see any better
alternative than to simply model the whole family as a set of
MVE-specific IR intrinsics.

(The immediate forms of LSLL and ASRL, on the other hand, do
behave exactly like a standard IR shift of a 64-bit value. In fact,
those forms don't have ACLE intrinsics defined at all, because you can
just write an ordinary C shift operation if you want one of those.)

The 64-bit shifts have to be instruction-selected in C++, because they
deliver two output values. But the 32-bit ones are simple enough that
I could write a DAG isel pattern directly into each Instruction
record.

Diff Detail

Event Timeline

simon_tatham created this revision.Nov 15 2019, 8:57 AM
Herald added projects: Restricted Project, Restricted Project. · View Herald TranscriptNov 15 2019, 8:57 AM
dmgreen accepted this revision.Nov 19 2019, 6:34 AM

That makes even LSLL and ASRL different enough from standard LLVM IR shift semantics that I couldn't see any better alternative than to simply model the whole family as a set of MVE-specific IR intrinsics.

Ah I see, that makes sense. I was wondering if the mapping of these would be simpler in one direction that the other.

Looks sensible to me

This revision is now accepted and ready to land.Nov 19 2019, 6:34 AM
This revision was automatically updated to reflect the committed changes.