1 /* 2 * Copyright (c) 2018, Oracle and/or its affiliates. All rights reserved. 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 4 * 5 * This code is free software; you can redistribute it and/or modify it 6 * under the terms of the GNU General Public License version 2 only, as 7 * published by the Free Software Foundation. Oracle designates this 8 * particular file as subject to the "Classpath" exception as provided 9 * by Oracle in the LICENSE file that accompanied this code. 10 * 11 * This code is distributed in the hope that it will be useful, but WITHOUT 12 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 13 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 14 * version 2 for more details (a copy is included in the LICENSE file that 15 * accompanied this code). 16 * 17 * You should have received a copy of the GNU General Public License version 18 * 2 along with this work; if not, write to the Free Software Foundation, 19 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. 20 * 21 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA 22 * or visit www.oracle.com if you need additional information or have 23 * questions. 24 */ 25 package jdk.incubator.vector; 26 27 import java.util.function.IntUnaryOperator; 28 29 abstract class AbstractShuffle<E> extends Vector.Shuffle<E> { 30 static final IntUnaryOperator IDENTITY = i -> i; 31 32 // Internal representation allows for a maximum index of 256 33 // Values are masked by (species().length() - 1) 34 final byte[] reorder; 35 36 AbstractShuffle(byte[] reorder) { 37 this.reorder = reorder; 38 } 39 40 public AbstractShuffle(int[] reorder) { 41 this(reorder, 0); 42 } 43 44 public AbstractShuffle(int[] reorder, int offset) { 45 byte[] a = new byte[species().length()]; 46 for (int i = 0; i < a.length; i++) { 47 a[i] = (byte) (reorder[offset + i] & (a.length - 1)); 48 } 49 this.reorder = a; 50 } 51 52 public AbstractShuffle(IntUnaryOperator f) { 53 byte[] a = new byte[species().length()]; 54 for (int i = 0; i < a.length; i++) { 55 a[i] = (byte) (f.applyAsInt(i) & (a.length - 1)); 56 } 57 this.reorder = a; 58 } 59 60 @Override 61 public void intoArray(int[] a, int offset) { 62 for (int i = 0; i < reorder.length; i++) { 63 a[i] = reorder[i]; 64 } 65 } 66 67 @Override 68 public int[] toArray() { 69 int[] a = new int[reorder.length]; 70 intoArray(a, 0); 71 return a; 72 } 73 74 @Override 75 public int getElement(int i) { 76 return reorder[i]; 77 } 78 79 }