|
1 |
| -// Copyright (c) 2020, 2021, Oracle and/or its affiliates. All rights reserved. |
2 |
| -// Copyright (c) 2020, 2021, Arm Limited. All rights reserved. |
| 1 | +// Copyright (c) 2020, 2022, Oracle and/or its affiliates. All rights reserved. |
| 2 | +// Copyright (c) 2020, 2022, Arm Limited. All rights reserved. |
3 | 3 | // DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
4 | 4 | //
|
5 | 5 | // This code is free software; you can redistribute it and/or modify it
|
@@ -5649,3 +5649,79 @@ instruct vmask_tolong16B(iRegLNoSp dst, vecX src) %{
|
5649 | 5649 | %}
|
5650 | 5650 | ins_pipe(pipe_slow);
|
5651 | 5651 | %}
|
| 5652 | + |
| 5653 | +//------------------------- CountLeadingZerosV ----------------------------- |
| 5654 | + |
| 5655 | +instruct countLeadingZerosVD(vecD dst, vecD src) %{ |
| 5656 | + predicate(n->as_Vector()->length_in_bytes() == 8); |
| 5657 | + match(Set dst (CountLeadingZerosV src)); |
| 5658 | + ins_cost(INSN_COST); |
| 5659 | + format %{ "countLeadingZerosV $dst, $src\t# vector (8B/4H/2S)" %} |
| 5660 | + ins_encode %{ |
| 5661 | + BasicType bt = Matcher::vector_element_basic_type(this); |
| 5662 | + Assembler::SIMD_Arrangement size = __ esize2arrangement((unsigned)type2aelembytes(bt), false); |
| 5663 | + __ clz(as_FloatRegister($dst$$reg), size, as_FloatRegister($src$$reg)); |
| 5664 | + %} |
| 5665 | + ins_pipe(pipe_slow); |
| 5666 | +%} |
| 5667 | + |
| 5668 | +instruct countLeadingZerosVX(vecX dst, vecX src) %{ |
| 5669 | + predicate(n->as_Vector()->length_in_bytes() == 16); |
| 5670 | + match(Set dst (CountLeadingZerosV src)); |
| 5671 | + ins_cost(INSN_COST); |
| 5672 | + format %{ "countLeadingZerosV $dst, $src\t# vector (16B/8H/4S/2D)" %} |
| 5673 | + ins_encode %{ |
| 5674 | + BasicType bt = Matcher::vector_element_basic_type(this); |
| 5675 | + Assembler::SIMD_Arrangement size = __ esize2arrangement((unsigned)type2aelembytes(bt), true); |
| 5676 | + if (bt != T_LONG) { |
| 5677 | + __ clz(as_FloatRegister($dst$$reg), size, as_FloatRegister($src$$reg)); |
| 5678 | + } else { |
| 5679 | + __ umov(rscratch1, as_FloatRegister($src$$reg), __ D, 0); |
| 5680 | + __ clz(rscratch1, rscratch1); |
| 5681 | + __ mov(as_FloatRegister($dst$$reg), __ D, 0, rscratch1); |
| 5682 | + __ umov(rscratch1, as_FloatRegister($src$$reg), __ D, 1); |
| 5683 | + __ clz(rscratch1, rscratch1); |
| 5684 | + __ mov(as_FloatRegister($dst$$reg), __ D, 1, rscratch1); |
| 5685 | + } |
| 5686 | + %} |
| 5687 | + ins_pipe(pipe_slow); |
| 5688 | +%} |
| 5689 | + |
| 5690 | +//------------------------- CountTrailingZerosV ---------------------------- |
| 5691 | + |
| 5692 | +instruct countTrailingZerosVD(vecD dst, vecD src) %{ |
| 5693 | + predicate(n->as_Vector()->length_in_bytes() == 8); |
| 5694 | + match(Set dst (CountTrailingZerosV src)); |
| 5695 | + ins_cost(3 * INSN_COST); |
| 5696 | + format %{ "countTrailingZerosV $dst, $src\t# vector (8B/4H/2S)" %} |
| 5697 | + ins_encode %{ |
| 5698 | + BasicType bt = Matcher::vector_element_basic_type(this); |
| 5699 | + Assembler::SIMD_Arrangement size = __ esize2arrangement((unsigned)type2aelembytes(bt), false); |
| 5700 | + __ neon_reverse_bits(as_FloatRegister($dst$$reg), as_FloatRegister($src$$reg), bt, false); |
| 5701 | + __ clz(as_FloatRegister($dst$$reg), size, as_FloatRegister($dst$$reg)); |
| 5702 | + %} |
| 5703 | + ins_pipe(pipe_slow); |
| 5704 | +%} |
| 5705 | + |
| 5706 | +instruct countTrailingZerosVX(vecX dst, vecX src) %{ |
| 5707 | + predicate(n->as_Vector()->length_in_bytes() == 16); |
| 5708 | + match(Set dst (CountTrailingZerosV src)); |
| 5709 | + ins_cost(3 * INSN_COST); |
| 5710 | + format %{ "countTrailingZerosV $dst, $src\t# vector (16B/8H/4S/2D)" %} |
| 5711 | + ins_encode %{ |
| 5712 | + BasicType bt = Matcher::vector_element_basic_type(this); |
| 5713 | + Assembler::SIMD_Arrangement size = __ esize2arrangement((unsigned)type2aelembytes(bt), true); |
| 5714 | + __ neon_reverse_bits(as_FloatRegister($dst$$reg), as_FloatRegister($src$$reg), bt, true); |
| 5715 | + if (bt != T_LONG) { |
| 5716 | + __ clz(as_FloatRegister($dst$$reg), size, as_FloatRegister($dst$$reg)); |
| 5717 | + } else { |
| 5718 | + __ umov(rscratch1, as_FloatRegister($dst$$reg), __ D, 0); |
| 5719 | + __ clz(rscratch1, rscratch1); |
| 5720 | + __ mov(as_FloatRegister($dst$$reg), __ D, 0, rscratch1); |
| 5721 | + __ umov(rscratch1, as_FloatRegister($dst$$reg), __ D, 1); |
| 5722 | + __ clz(rscratch1, rscratch1); |
| 5723 | + __ mov(as_FloatRegister($dst$$reg), __ D, 1, rscratch1); |
| 5724 | + } |
| 5725 | + %} |
| 5726 | + ins_pipe(pipe_slow); |
| 5727 | +%} |
0 commit comments