VectorAPI VectorInsert Intrinsic
Vladimir Ivanov
vladimir.x.ivanov at oracle.com
Wed Jun 6 07:52:26 UTC 2018
Additionally:
+instruct rvinsert64B(vecZ dst, vecZ src, vecZ tmp, rRegI val, immI idx) %{
+ predicate(UseAVX > 0 &&
n->bottom_type()->is_vect()->element_basic_type() == T_BYTE);
+instruct rvinsert32S(vecZ dst, vecZ src, vecZ tmp, rRegI val, immI idx) %{
+ predicate(UseAVX > 0 &&
n->bottom_type()->is_vect()->element_basic_type() == T_SHORT);
+instruct rvinsert16I(vecZ dst, vecZ src, vecZ tmp, rRegI val, immI idx) %{
+ predicate(UseAVX > 0 &&
n->bottom_type()->is_vect()->element_basic_type() == T_INT);
+instruct rvinsert8L(vecZ dst, vecZ src, vecZ tmp, rRegL val, immI idx) %{
+ predicate(UseAVX > 0 &&
n->bottom_type()->is_vect()->element_basic_type() == T_LONG);
+ instruct rvinsert16F(vecZ dst, vecZ src, vecZ tmp, regF val, immI idx) %{
+ predicate(UseAVX > 0 &&
n->bottom_type()->is_vect()->element_basic_type() == T_FLOAT);
+ instruct rvinsert8D(vecZ dst, vecZ src, vecZ tmp, regD val, rRegL
tmp1, immI idx) %{
+ predicate(UseAVX > 0 &&
n->bottom_type()->is_vect()->element_basic_type() == T_DOUBLE);
Shouldn't UseAVX > 2 be used instead?
Also, I suspect *_avx rules are never used.
+instruct rvinsert16B(vecX dst, vecX src, rRegI val, immI idx) %{
+ predicate(UseSSE > 3 &&
n->bottom_type()->is_vect()->element_basic_type() == T_BYTE);
+instruct rvinsert16B_avx(vecX dst, vecX src, rRegI val, immI idx) %{
+ predicate(UseAVX > 0 &&
n->bottom_type()->is_vect()->element_basic_type() == T_BYTE);
Both predicates are true when UseAVX > 0 and the first matching one is
used always. Don't you need "UseSSE > 3 && UseAVX == 0" in the first case?
Best regards,
Vladimir Ivanov
On 06/06/2018 02:30, Vladimir Ivanov wrote:
>
>> http://cr.openjdk.java.net/~srukmannagar/VectorAPI_vectorInsert/webrev.00/
>>
>
> Overall, looks good!
>
> +instruct rvinsert32B(vecY dst, vecY src, vecY tmp, rRegI val, immI idx) %{
> ...
> + if(id <= 15) {
> ...
> + __ vpinsrb($tmp$$XMMRegister, $tmp$$XMMRegister, $val$$Register,
> id - 16);
> ...
>
> + instruct rvinsert8D(vecZ dst, vecZ src, vecZ tmp, regD val, rRegL
> tmp1, immI idx) %{
> + } else if(id <= 5) {
> ...
> + __ vpinsrq($tmp$$XMMRegister, $tmp$$XMMRegister,
> $tmp1$$Register, id - 6);
>
> "id - 16", "id - 6". Looks like copy-paste errors.
>
>
>
> +instruct rvinsert8B(vecD dst, vecD src, rRegI val, immI idx) %{
> ...
> + int id = 0x7 & $idx$$constant;
>
> I'd prefer to see "immU3 idx" instead. idx should always be in-bound and
> it's validated on JDK side before calling intrinsic.
>
>
> On a more general topic: what are the plans for optimizing variable
> indexed element accesses? It would be unfortunate if a non-constant
> index usage caused vector boxing.
>
> I remember I played with dispatch tables [1] and it worked ok. Are there
> better alternatives available?
>
> Best regards,
> Vladimir Ivanov
>
> [1]
> http://hg.openjdk.java.net/panama/dev/file/dd9ee9434abe/test/jdk/panama/snippets/VectorUtils.java#l300
>
More information about the panama-dev
mailing list