llvm-project/clang/test/CodeGen/arm-mve-intrinsics
Simon Tatham bd0f271c9e [ARM][MVE] Add intrinsics for immediate shifts. (reland)
This adds the family of `vshlq_n` and `vshrq_n` ACLE intrinsics, which
shift every lane of a vector left or right by a compile-time
immediate. They mostly work by expanding to the IR `shl`, `lshr` and
`ashr` operations, with their second operand being a vector splat of
the immediate.

There's a fiddly special case, though. ACLE specifies that the
immediate in `vshrq_n` can take values up to //and including// the bit
size of the vector lane. But LLVM IR thinks that shifting right by the
full size of the lane is UB, and feels free to replace the `lshr` with
an `undef` half way through the optimization pipeline. Hence, to keep
this legal in source code, I have to detect it at codegen time.
Logical (unsigned) right shifts by the element size are handled by
simply emitting the zero vector; arithmetic ones are converted into a
shift of one bit less, which will always give the same output.

In order to do that check, I also had to enhance the tablegen
MveEmitter so that it can cope with converting a builtin function's
operand into a bare integer to pass to a code-generating subfunction.
Previously the only bare integers it knew how to handle were flags
generated from within `arm_mve.td`.

Reviewers: dmgreen, miyuki, MarkMurrayARM, ostannard

Reviewed By: dmgreen, MarkMurrayARM

Subscribers: echristo, hokein, rdhindsa, kristof.beyls, hiraditya, cfe-commits, llvm-commits

Tags: #clang, #llvm

Differential Revision: https://reviews.llvm.org/D71065
2019-12-11 10:10:09 +00:00
..
admin.c [ARM,MVE] Add intrinsics for 'administrative' vector operations. 2019-11-15 09:53:43 +00:00
compare.c [ARM,MVE] Add intrinsics for vector comparisons. 2019-11-18 10:39:30 +00:00
get-set-lane.c [ARM,MVE] Add intrinsics for vector get/set lane. 2019-11-15 09:53:58 +00:00
load-store.c [ARM,MVE] Add intrinsics for vector get/set lane. 2019-11-15 09:53:58 +00:00
predicates.c [ARM,MVE] Add intrinsics to deal with predicates. 2019-12-02 16:20:30 +00:00
scalar-shifts.c [ARM,MVE] Add intrinsics for scalar shifts. 2019-11-19 14:47:29 +00:00
scatter-gather.c [ARM,MVE] Add intrinsics for vector get/set lane. 2019-11-15 09:53:58 +00:00
vabdq.c [ARM][MVE][Intrinsics] Add MVE VABD intrinsics. Add unit tests. 2019-11-27 16:52:04 +00:00
vadc.c [ARM,MVE] Add intrinsics for vector get/set lane. 2019-11-15 09:53:58 +00:00
vaddq.c [ARM,MVE] Add intrinsics for vector get/set lane. 2019-11-15 09:53:58 +00:00
vandq.c [ARM][MVE][Intrinsics] Add MVE VAND/VORR/VORN/VEOR/VBIC intrinsics. Add unit tests. 2019-11-27 16:52:05 +00:00
vbicq.c [ARM][MVE][Intrinsics] Add MVE VAND/VORR/VORN/VEOR/VBIC intrinsics. Add unit tests. 2019-11-27 16:52:05 +00:00
vcaddq.c [ARM][MVE] Refactor complex vector intrinsics [NFCI] 2019-12-10 16:21:52 +00:00
vcmlaq.c [ARM][MVE] Add complex vector intrinsics 2019-12-09 12:05:59 +00:00
vcmulq.c [ARM][MVE] Add complex vector intrinsics 2019-12-09 12:05:59 +00:00
vcvt.c [ARM,MVE] Add intrinsics for vector get/set lane. 2019-11-15 09:53:58 +00:00
vector-shift-imm.c [ARM][MVE] Add intrinsics for immediate shifts. (reland) 2019-12-11 10:10:09 +00:00
veorq.c [ARM][MVE][Intrinsics] Add MVE VAND/VORR/VORN/VEOR/VBIC intrinsics. Add unit tests. 2019-11-27 16:52:05 +00:00
vhaddq.c [ARM][MVE][Intrinsics] Add VQADDQ, VHADDQ, VRHADDQ, VQSUBQ, VHSUBQ, VQDMULHQ, VQRDMULHQ intrinsics. 2019-12-09 17:41:47 +00:00
vhcaddq.c [ARM][MVE] Refactor complex vector intrinsics [NFCI] 2019-12-10 16:21:52 +00:00
vhsubq.c [ARM][MVE][Intrinsics] Add VQADDQ, VHADDQ, VRHADDQ, VQSUBQ, VHSUBQ, VQDMULHQ, VQRDMULHQ intrinsics. 2019-12-09 17:41:47 +00:00
vld24.c [ARM,MVE] Add intrinsics for vector get/set lane. 2019-11-15 09:53:58 +00:00
vldr.c [ARM,MVE] Add intrinsics for vector get/set lane. 2019-11-15 09:53:58 +00:00
vmaxnmq.c [ARM][MVE][Intrinsics] Add VMINQ/VMAXQ/VMINNMQ/VMAXNMQ intrinsics. 2019-12-02 11:18:53 +00:00
vmaxq.c [ARM][MVE][Intrinsics] Add VMINQ/VMAXQ/VMINNMQ/VMAXNMQ intrinsics. 2019-12-02 11:18:53 +00:00
vminnmq.c [ARM][MVE][Intrinsics] Add VMINQ/VMAXQ/VMINNMQ/VMAXNMQ intrinsics. 2019-12-02 11:18:53 +00:00
vminq.c [ARM][MVE][Intrinsics] Add VMINQ/VMAXQ/VMINNMQ/VMAXNMQ intrinsics. 2019-12-02 11:18:53 +00:00
vminvq.c [ARM,MVE] Add intrinsics for vector get/set lane. 2019-11-15 09:53:58 +00:00
vmulhq.c [ARM][MVE][Intrinsics] Add VMULH/VRMULH intrinsics. 2019-12-04 14:27:12 +00:00
vmullbq.c [ARM][MVE][Intrinsics] Add VMULL[BT]Q_(INT|POLY) intrinsics. 2019-12-09 17:41:47 +00:00
vmulltq.c [ARM][MVE][Intrinsics] Add VMULL[BT]Q_(INT|POLY) intrinsics. 2019-12-09 17:41:47 +00:00
vmulq.c [ARM][MVE][Intrinsics] Add MVE VMUL intrinsics. Remove annoying "t1" from VMUL* instructions. Add unit tests. 2019-11-27 16:52:05 +00:00
vornq.c [ARM][MVE][Intrinsics] Add MVE VAND/VORR/VORN/VEOR/VBIC intrinsics. Add unit tests. 2019-11-27 16:52:05 +00:00
vorrq.c [ARM][MVE][Intrinsics] Add MVE VAND/VORR/VORN/VEOR/VBIC intrinsics. Add unit tests. 2019-11-27 16:52:05 +00:00
vqaddq.c [ARM][MVE][Intrinsics] Add VQADDQ, VHADDQ, VRHADDQ, VQSUBQ, VHSUBQ, VQDMULHQ, VQRDMULHQ intrinsics. 2019-12-09 17:41:47 +00:00
vqdmulhq.c [ARM][MVE][Intrinsics] Add VQADDQ, VHADDQ, VRHADDQ, VQSUBQ, VHSUBQ, VQDMULHQ, VQRDMULHQ intrinsics. 2019-12-09 17:41:47 +00:00
vqrdmulhq.c [ARM][MVE][Intrinsics] Add VQADDQ, VHADDQ, VRHADDQ, VQSUBQ, VHSUBQ, VQDMULHQ, VQRDMULHQ intrinsics. 2019-12-09 17:41:47 +00:00
vqsubq.c [ARM][MVE][Intrinsics] Add VQADDQ, VHADDQ, VRHADDQ, VQSUBQ, VHSUBQ, VQDMULHQ, VQRDMULHQ intrinsics. 2019-12-09 17:41:47 +00:00
vrhaddq.c [ARM][MVE][Intrinsics] Add VQADDQ, VHADDQ, VRHADDQ, VQSUBQ, VHSUBQ, VQDMULHQ, VQRDMULHQ intrinsics. 2019-12-09 17:41:47 +00:00
vrmulhq.c [ARM][MVE][Intrinsics] Add VMULH/VRMULH intrinsics. 2019-12-04 14:27:12 +00:00