1 /*
   2  * Copyright (c) 2017, 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.nio.ByteBuffer;
  28 import java.nio.ByteOrder;
  29 import java.nio.IntBuffer;
  30 import java.nio.ReadOnlyBufferException;
  31 import java.util.Arrays;
  32 import java.util.Objects;
  33 import java.util.function.IntUnaryOperator;
  34 
  35 import jdk.internal.misc.Unsafe;
  36 import jdk.internal.vm.annotation.ForceInline;
  37 import static jdk.incubator.vector.VectorIntrinsics.*;
  38 
  39 @SuppressWarnings("cast")
  40 final class Int256Vector extends IntVector {
  41     static final Int256Species SPECIES = new Int256Species();
  42 
  43     static final Int256Vector ZERO = new Int256Vector();
  44 
  45     static final int LENGTH = SPECIES.length();
  46 
  47     // Index vector species
  48     private static final IntVector.IntSpecies INDEX_SPEC;
  49     static {
  50         int bitSize = Vector.bitSizeForVectorLength(int.class, LENGTH);
  51         Vector.Shape shape = Shape.forBitSize(bitSize);
  52         INDEX_SPEC = (IntVector.IntSpecies) Species.of(int.class, shape);
  53     }
  54     private final int[] vec; // Don't access directly, use getElements() instead.
  55 
  56     private int[] getElements() {
  57         return VectorIntrinsics.maybeRebox(this).vec;
  58     }
  59 
  60     Int256Vector() {
  61         vec = new int[SPECIES.length()];
  62     }
  63 
  64     Int256Vector(int[] v) {
  65         vec = v;
  66     }
  67 
  68     @Override
  69     public int length() { return LENGTH; }
  70 
  71     // Unary operator
  72 
  73     @Override
  74     Int256Vector uOp(FUnOp f) {
  75         int[] vec = getElements();
  76         int[] res = new int[length()];
  77         for (int i = 0; i < length(); i++) {
  78             res[i] = f.apply(i, vec[i]);
  79         }
  80         return new Int256Vector(res);
  81     }
  82 
  83     @Override
  84     Int256Vector uOp(Mask<Integer> o, FUnOp f) {
  85         int[] vec = getElements();
  86         int[] res = new int[length()];
  87         boolean[] mbits = ((Int256Mask)o).getBits();
  88         for (int i = 0; i < length(); i++) {
  89             res[i] = mbits[i] ? f.apply(i, vec[i]) : vec[i];
  90         }
  91         return new Int256Vector(res);
  92     }
  93 
  94     // Binary operator
  95 
  96     @Override
  97     Int256Vector bOp(Vector<Integer> o, FBinOp f) {
  98         int[] res = new int[length()];
  99         int[] vec1 = this.getElements();
 100         int[] vec2 = ((Int256Vector)o).getElements();
 101         for (int i = 0; i < length(); i++) {
 102             res[i] = f.apply(i, vec1[i], vec2[i]);
 103         }
 104         return new Int256Vector(res);
 105     }
 106 
 107     @Override
 108     Int256Vector bOp(Vector<Integer> o1, Mask<Integer> o2, FBinOp f) {
 109         int[] res = new int[length()];
 110         int[] vec1 = this.getElements();
 111         int[] vec2 = ((Int256Vector)o1).getElements();
 112         boolean[] mbits = ((Int256Mask)o2).getBits();
 113         for (int i = 0; i < length(); i++) {
 114             res[i] = mbits[i] ? f.apply(i, vec1[i], vec2[i]) : vec1[i];
 115         }
 116         return new Int256Vector(res);
 117     }
 118 
 119     // Trinary operator
 120 
 121     @Override
 122     Int256Vector tOp(Vector<Integer> o1, Vector<Integer> o2, FTriOp f) {
 123         int[] res = new int[length()];
 124         int[] vec1 = this.getElements();
 125         int[] vec2 = ((Int256Vector)o1).getElements();
 126         int[] vec3 = ((Int256Vector)o2).getElements();
 127         for (int i = 0; i < length(); i++) {
 128             res[i] = f.apply(i, vec1[i], vec2[i], vec3[i]);
 129         }
 130         return new Int256Vector(res);
 131     }
 132 
 133     @Override
 134     Int256Vector tOp(Vector<Integer> o1, Vector<Integer> o2, Mask<Integer> o3, FTriOp f) {
 135         int[] res = new int[length()];
 136         int[] vec1 = getElements();
 137         int[] vec2 = ((Int256Vector)o1).getElements();
 138         int[] vec3 = ((Int256Vector)o2).getElements();
 139         boolean[] mbits = ((Int256Mask)o3).getBits();
 140         for (int i = 0; i < length(); i++) {
 141             res[i] = mbits[i] ? f.apply(i, vec1[i], vec2[i], vec3[i]) : vec1[i];
 142         }
 143         return new Int256Vector(res);
 144     }
 145 
 146     @Override
 147     int rOp(int v, FBinOp f) {
 148         int[] vec = getElements();
 149         for (int i = 0; i < length(); i++) {
 150             v = f.apply(i, v, vec[i]);
 151         }
 152         return v;
 153     }
 154 
 155     @Override
 156     @ForceInline
 157     public <F> Vector<F> cast(Species<F> s) {
 158         Objects.requireNonNull(s);
 159         if (s.length() != LENGTH)
 160             throw new IllegalArgumentException("Vector length this species length differ");
 161 
 162         return VectorIntrinsics.cast(
 163             Int256Vector.class,
 164             int.class, LENGTH,
 165             s.vectorType(),
 166             s.elementType(), LENGTH,
 167             this, s,
 168             (species, vector) -> vector.castDefault(species)
 169         );
 170     }
 171 
 172     @SuppressWarnings("unchecked")
 173     @ForceInline
 174     private <F> Vector<F> castDefault(Species<F> s) {
 175         int limit = s.length();
 176 
 177         Class<?> stype = s.elementType();
 178         if (stype == byte.class) {
 179             byte[] a = new byte[limit];
 180             for (int i = 0; i < limit; i++) {
 181                 a[i] = (byte) this.get(i);
 182             }
 183             return (Vector) ByteVector.fromArray((ByteVector.ByteSpecies) s, a, 0);
 184         } else if (stype == short.class) {
 185             short[] a = new short[limit];
 186             for (int i = 0; i < limit; i++) {
 187                 a[i] = (short) this.get(i);
 188             }
 189             return (Vector) ShortVector.fromArray((ShortVector.ShortSpecies) s, a, 0);
 190         } else if (stype == int.class) {
 191             int[] a = new int[limit];
 192             for (int i = 0; i < limit; i++) {
 193                 a[i] = (int) this.get(i);
 194             }
 195             return (Vector) IntVector.fromArray((IntVector.IntSpecies) s, a, 0);
 196         } else if (stype == long.class) {
 197             long[] a = new long[limit];
 198             for (int i = 0; i < limit; i++) {
 199                 a[i] = (long) this.get(i);
 200             }
 201             return (Vector) LongVector.fromArray((LongVector.LongSpecies) s, a, 0);
 202         } else if (stype == float.class) {
 203             float[] a = new float[limit];
 204             for (int i = 0; i < limit; i++) {
 205                 a[i] = (float) this.get(i);
 206             }
 207             return (Vector) FloatVector.fromArray((FloatVector.FloatSpecies) s, a, 0);
 208         } else if (stype == double.class) {
 209             double[] a = new double[limit];
 210             for (int i = 0; i < limit; i++) {
 211                 a[i] = (double) this.get(i);
 212             }
 213             return (Vector) DoubleVector.fromArray((DoubleVector.DoubleSpecies) s, a, 0);
 214         } else {
 215             throw new UnsupportedOperationException("Bad lane type for casting.");
 216         }
 217     }
 218 
 219     @Override
 220     @ForceInline
 221     @SuppressWarnings("unchecked")
 222     public <F> Vector<F> reinterpret(Species<F> s) {
 223         Objects.requireNonNull(s);
 224 
 225         if(s.elementType().equals(int.class)) {
 226             return (Vector<F>) reshape((Species<Integer>)s);
 227         }
 228         if(s.bitSize() == bitSize()) {
 229             return reinterpretType(s);
 230         }
 231 
 232         return defaultReinterpret(s);
 233     }
 234 
 235     @ForceInline
 236     private <F> Vector<F> reinterpretType(Species<F> s) {
 237         Objects.requireNonNull(s);
 238 
 239         Class<?> stype = s.elementType();
 240         if (stype == byte.class) {
 241             return VectorIntrinsics.reinterpret(
 242                 Int256Vector.class,
 243                 int.class, LENGTH,
 244                 Byte256Vector.class,
 245                 byte.class, Byte256Vector.LENGTH,
 246                 this, s,
 247                 (species, vector) -> vector.defaultReinterpret(species)
 248             );
 249         } else if (stype == short.class) {
 250             return VectorIntrinsics.reinterpret(
 251                 Int256Vector.class,
 252                 int.class, LENGTH,
 253                 Short256Vector.class,
 254                 short.class, Short256Vector.LENGTH,
 255                 this, s,
 256                 (species, vector) -> vector.defaultReinterpret(species)
 257             );
 258         } else if (stype == int.class) {
 259             return VectorIntrinsics.reinterpret(
 260                 Int256Vector.class,
 261                 int.class, LENGTH,
 262                 Int256Vector.class,
 263                 int.class, Int256Vector.LENGTH,
 264                 this, s,
 265                 (species, vector) -> vector.defaultReinterpret(species)
 266             );
 267         } else if (stype == long.class) {
 268             return VectorIntrinsics.reinterpret(
 269                 Int256Vector.class,
 270                 int.class, LENGTH,
 271                 Long256Vector.class,
 272                 long.class, Long256Vector.LENGTH,
 273                 this, s,
 274                 (species, vector) -> vector.defaultReinterpret(species)
 275             );
 276         } else if (stype == float.class) {
 277             return VectorIntrinsics.reinterpret(
 278                 Int256Vector.class,
 279                 int.class, LENGTH,
 280                 Float256Vector.class,
 281                 float.class, Float256Vector.LENGTH,
 282                 this, s,
 283                 (species, vector) -> vector.defaultReinterpret(species)
 284             );
 285         } else if (stype == double.class) {
 286             return VectorIntrinsics.reinterpret(
 287                 Int256Vector.class,
 288                 int.class, LENGTH,
 289                 Double256Vector.class,
 290                 double.class, Double256Vector.LENGTH,
 291                 this, s,
 292                 (species, vector) -> vector.defaultReinterpret(species)
 293             );
 294         } else {
 295             throw new UnsupportedOperationException("Bad lane type for casting.");
 296         }
 297     }
 298 
 299     @Override
 300     @ForceInline
 301     public IntVector reshape(Species<Integer> s) {
 302         Objects.requireNonNull(s);
 303         if (s.bitSize() == 64 && (s instanceof Int64Vector.Int64Species)) {
 304             Int64Vector.Int64Species ts = (Int64Vector.Int64Species)s;
 305             return VectorIntrinsics.reinterpret(
 306                 Int256Vector.class,
 307                 int.class, LENGTH,
 308                 Int64Vector.class,
 309                 int.class, Int64Vector.LENGTH,
 310                 this, ts,
 311                 (species, vector) -> (IntVector) vector.defaultReinterpret(species)
 312             );
 313         } else if (s.bitSize() == 128 && (s instanceof Int128Vector.Int128Species)) {
 314             Int128Vector.Int128Species ts = (Int128Vector.Int128Species)s;
 315             return VectorIntrinsics.reinterpret(
 316                 Int256Vector.class,
 317                 int.class, LENGTH,
 318                 Int128Vector.class,
 319                 int.class, Int128Vector.LENGTH,
 320                 this, ts,
 321                 (species, vector) -> (IntVector) vector.defaultReinterpret(species)
 322             );
 323         } else if (s.bitSize() == 256 && (s instanceof Int256Vector.Int256Species)) {
 324             Int256Vector.Int256Species ts = (Int256Vector.Int256Species)s;
 325             return VectorIntrinsics.reinterpret(
 326                 Int256Vector.class,
 327                 int.class, LENGTH,
 328                 Int256Vector.class,
 329                 int.class, Int256Vector.LENGTH,
 330                 this, ts,
 331                 (species, vector) -> (IntVector) vector.defaultReinterpret(species)
 332             );
 333         } else if (s.bitSize() == 512 && (s instanceof Int512Vector.Int512Species)) {
 334             Int512Vector.Int512Species ts = (Int512Vector.Int512Species)s;
 335             return VectorIntrinsics.reinterpret(
 336                 Int256Vector.class,
 337                 int.class, LENGTH,
 338                 Int512Vector.class,
 339                 int.class, Int512Vector.LENGTH,
 340                 this, ts,
 341                 (species, vector) -> (IntVector) vector.defaultReinterpret(species)
 342             );
 343         } else if ((s.bitSize() > 0) && (s.bitSize() <= 2048)
 344                 && (s.bitSize() % 128 == 0) && (s instanceof IntMaxVector.IntMaxSpecies)) {
 345             IntMaxVector.IntMaxSpecies ts = (IntMaxVector.IntMaxSpecies)s;
 346             return VectorIntrinsics.reinterpret(
 347                 Int256Vector.class,
 348                 int.class, LENGTH,
 349                 IntMaxVector.class,
 350                 int.class, IntMaxVector.LENGTH,
 351                 this, ts,
 352                 (species, vector) -> (IntVector) vector.defaultReinterpret(species)
 353             );
 354         } else {
 355             throw new InternalError("Unimplemented size");
 356         }
 357     }
 358 
 359     // Binary operations with scalars
 360 
 361     @Override
 362     @ForceInline
 363     public IntVector add(int o) {
 364         return add(SPECIES.broadcast(o));
 365     }
 366 
 367     @Override
 368     @ForceInline
 369     public IntVector add(int o, Mask<Integer> m) {
 370         return add(SPECIES.broadcast(o), m);
 371     }
 372 
 373     @Override
 374     @ForceInline
 375     public IntVector sub(int o) {
 376         return sub(SPECIES.broadcast(o));
 377     }
 378 
 379     @Override
 380     @ForceInline
 381     public IntVector sub(int o, Mask<Integer> m) {
 382         return sub(SPECIES.broadcast(o), m);
 383     }
 384 
 385     @Override
 386     @ForceInline
 387     public IntVector mul(int o) {
 388         return mul(SPECIES.broadcast(o));
 389     }
 390 
 391     @Override
 392     @ForceInline
 393     public IntVector mul(int o, Mask<Integer> m) {
 394         return mul(SPECIES.broadcast(o), m);
 395     }
 396 
 397     @Override
 398     @ForceInline
 399     public IntVector min(int o) {
 400         return min(SPECIES.broadcast(o));
 401     }
 402 
 403     @Override
 404     @ForceInline
 405     public IntVector max(int o) {
 406         return max(SPECIES.broadcast(o));
 407     }
 408 
 409     @Override
 410     @ForceInline
 411     public Mask<Integer> equal(int o) {
 412         return equal(SPECIES.broadcast(o));
 413     }
 414 
 415     @Override
 416     @ForceInline
 417     public Mask<Integer> notEqual(int o) {
 418         return notEqual(SPECIES.broadcast(o));
 419     }
 420 
 421     @Override
 422     @ForceInline
 423     public Mask<Integer> lessThan(int o) {
 424         return lessThan(SPECIES.broadcast(o));
 425     }
 426 
 427     @Override
 428     @ForceInline
 429     public Mask<Integer> lessThanEq(int o) {
 430         return lessThanEq(SPECIES.broadcast(o));
 431     }
 432 
 433     @Override
 434     @ForceInline
 435     public Mask<Integer> greaterThan(int o) {
 436         return greaterThan(SPECIES.broadcast(o));
 437     }
 438 
 439     @Override
 440     @ForceInline
 441     public Mask<Integer> greaterThanEq(int o) {
 442         return greaterThanEq(SPECIES.broadcast(o));
 443     }
 444 
 445     @Override
 446     @ForceInline
 447     public IntVector blend(int o, Mask<Integer> m) {
 448         return blend(SPECIES.broadcast(o), m);
 449     }
 450 
 451 
 452     @Override
 453     @ForceInline
 454     public IntVector and(int o) {
 455         return and(SPECIES.broadcast(o));
 456     }
 457 
 458     @Override
 459     @ForceInline
 460     public IntVector and(int o, Mask<Integer> m) {
 461         return and(SPECIES.broadcast(o), m);
 462     }
 463 
 464     @Override
 465     @ForceInline
 466     public IntVector or(int o) {
 467         return or(SPECIES.broadcast(o));
 468     }
 469 
 470     @Override
 471     @ForceInline
 472     public IntVector or(int o, Mask<Integer> m) {
 473         return or(SPECIES.broadcast(o), m);
 474     }
 475 
 476     @Override
 477     @ForceInline
 478     public IntVector xor(int o) {
 479         return xor(SPECIES.broadcast(o));
 480     }
 481 
 482     @Override
 483     @ForceInline
 484     public IntVector xor(int o, Mask<Integer> m) {
 485         return xor(SPECIES.broadcast(o), m);
 486     }
 487 
 488     @Override
 489     @ForceInline
 490     public Int256Vector neg() {
 491         return (Int256Vector)zero(SPECIES).sub(this);
 492     }
 493 
 494     // Unary operations
 495 
 496     @ForceInline
 497     @Override
 498     public Int256Vector neg(Mask<Integer> m) {
 499         return blend(neg(), m);
 500     }
 501 
 502     @Override
 503     @ForceInline
 504     public Int256Vector abs() {
 505         return VectorIntrinsics.unaryOp(
 506             VECTOR_OP_ABS, Int256Vector.class, int.class, LENGTH,
 507             this,
 508             v1 -> v1.uOp((i, a) -> (int) Math.abs(a)));
 509     }
 510 
 511     @ForceInline
 512     @Override
 513     public Int256Vector abs(Mask<Integer> m) {
 514         return blend(abs(), m);
 515     }
 516 
 517 
 518     @Override
 519     @ForceInline
 520     public Int256Vector not() {
 521         return VectorIntrinsics.unaryOp(
 522             VECTOR_OP_NOT, Int256Vector.class, int.class, LENGTH,
 523             this,
 524             v1 -> v1.uOp((i, a) -> (int) ~a));
 525     }
 526 
 527     @ForceInline
 528     @Override
 529     public Int256Vector not(Mask<Integer> m) {
 530         return blend(not(), m);
 531     }
 532     // Binary operations
 533 
 534     @Override
 535     @ForceInline
 536     public Int256Vector add(Vector<Integer> o) {
 537         Objects.requireNonNull(o);
 538         Int256Vector v = (Int256Vector)o;
 539         return VectorIntrinsics.binaryOp(
 540             VECTOR_OP_ADD, Int256Vector.class, int.class, LENGTH,
 541             this, v,
 542             (v1, v2) -> v1.bOp(v2, (i, a, b) -> (int)(a + b)));
 543     }
 544 
 545     @Override
 546     @ForceInline
 547     public Int256Vector add(Vector<Integer> v, Mask<Integer> m) {
 548         return blend(add(v), m);
 549     }
 550 
 551     @Override
 552     @ForceInline
 553     public Int256Vector sub(Vector<Integer> o) {
 554         Objects.requireNonNull(o);
 555         Int256Vector v = (Int256Vector)o;
 556         return VectorIntrinsics.binaryOp(
 557             VECTOR_OP_SUB, Int256Vector.class, int.class, LENGTH,
 558             this, v,
 559             (v1, v2) -> v1.bOp(v2, (i, a, b) -> (int)(a - b)));
 560     }
 561 
 562     @Override
 563     @ForceInline
 564     public Int256Vector sub(Vector<Integer> v, Mask<Integer> m) {
 565         return blend(sub(v), m);
 566     }
 567 
 568     @Override
 569     @ForceInline
 570     public Int256Vector mul(Vector<Integer> o) {
 571         Objects.requireNonNull(o);
 572         Int256Vector v = (Int256Vector)o;
 573         return VectorIntrinsics.binaryOp(
 574             VECTOR_OP_MUL, Int256Vector.class, int.class, LENGTH,
 575             this, v,
 576             (v1, v2) -> v1.bOp(v2, (i, a, b) -> (int)(a * b)));
 577     }
 578 
 579     @Override
 580     @ForceInline
 581     public Int256Vector mul(Vector<Integer> v, Mask<Integer> m) {
 582         return blend(mul(v), m);
 583     }
 584 
 585     @Override
 586     @ForceInline
 587     public Int256Vector min(Vector<Integer> o) {
 588         Objects.requireNonNull(o);
 589         Int256Vector v = (Int256Vector)o;
 590         return (Int256Vector) VectorIntrinsics.binaryOp(
 591             VECTOR_OP_MIN, Int256Vector.class, int.class, LENGTH,
 592             this, v,
 593             (v1, v2) -> v1.bOp(v2, (i, a, b) -> (int) Math.min(a, b)));
 594     }
 595 
 596     @Override
 597     @ForceInline
 598     public Int256Vector min(Vector<Integer> v, Mask<Integer> m) {
 599         return blend(min(v), m);
 600     }
 601 
 602     @Override
 603     @ForceInline
 604     public Int256Vector max(Vector<Integer> o) {
 605         Objects.requireNonNull(o);
 606         Int256Vector v = (Int256Vector)o;
 607         return VectorIntrinsics.binaryOp(
 608             VECTOR_OP_MAX, Int256Vector.class, int.class, LENGTH,
 609             this, v,
 610             (v1, v2) -> v1.bOp(v2, (i, a, b) -> (int) Math.max(a, b)));
 611         }
 612 
 613     @Override
 614     @ForceInline
 615     public Int256Vector max(Vector<Integer> v, Mask<Integer> m) {
 616         return blend(max(v), m);
 617     }
 618 
 619     @Override
 620     @ForceInline
 621     public Int256Vector and(Vector<Integer> o) {
 622         Objects.requireNonNull(o);
 623         Int256Vector v = (Int256Vector)o;
 624         return VectorIntrinsics.binaryOp(
 625             VECTOR_OP_AND, Int256Vector.class, int.class, LENGTH,
 626             this, v,
 627             (v1, v2) -> v1.bOp(v2, (i, a, b) -> (int)(a & b)));
 628     }
 629 
 630     @Override
 631     @ForceInline
 632     public Int256Vector or(Vector<Integer> o) {
 633         Objects.requireNonNull(o);
 634         Int256Vector v = (Int256Vector)o;
 635         return VectorIntrinsics.binaryOp(
 636             VECTOR_OP_OR, Int256Vector.class, int.class, LENGTH,
 637             this, v,
 638             (v1, v2) -> v1.bOp(v2, (i, a, b) -> (int)(a | b)));
 639     }
 640 
 641     @Override
 642     @ForceInline
 643     public Int256Vector xor(Vector<Integer> o) {
 644         Objects.requireNonNull(o);
 645         Int256Vector v = (Int256Vector)o;
 646         return VectorIntrinsics.binaryOp(
 647             VECTOR_OP_XOR, Int256Vector.class, int.class, LENGTH,
 648             this, v,
 649             (v1, v2) -> v1.bOp(v2, (i, a, b) -> (int)(a ^ b)));
 650     }
 651 
 652     @Override
 653     @ForceInline
 654     public Int256Vector and(Vector<Integer> v, Mask<Integer> m) {
 655         return blend(and(v), m);
 656     }
 657 
 658     @Override
 659     @ForceInline
 660     public Int256Vector or(Vector<Integer> v, Mask<Integer> m) {
 661         return blend(or(v), m);
 662     }
 663 
 664     @Override
 665     @ForceInline
 666     public Int256Vector xor(Vector<Integer> v, Mask<Integer> m) {
 667         return blend(xor(v), m);
 668     }
 669 
 670     @Override
 671     @ForceInline
 672     public Int256Vector shiftL(int s) {
 673         return VectorIntrinsics.broadcastInt(
 674             VECTOR_OP_LSHIFT, Int256Vector.class, int.class, LENGTH,
 675             this, s,
 676             (v, i) -> v.uOp((__, a) -> (int) (a << i)));
 677     }
 678 
 679     @Override
 680     @ForceInline
 681     public Int256Vector shiftL(int s, Mask<Integer> m) {
 682         return blend(shiftL(s), m);
 683     }
 684 
 685     @Override
 686     @ForceInline
 687     public Int256Vector shiftR(int s) {
 688         return VectorIntrinsics.broadcastInt(
 689             VECTOR_OP_URSHIFT, Int256Vector.class, int.class, LENGTH,
 690             this, s,
 691             (v, i) -> v.uOp((__, a) -> (int) (a >>> i)));
 692     }
 693 
 694     @Override
 695     @ForceInline
 696     public Int256Vector shiftR(int s, Mask<Integer> m) {
 697         return blend(shiftR(s), m);
 698     }
 699 
 700     @Override
 701     @ForceInline
 702     public Int256Vector aShiftR(int s) {
 703         return VectorIntrinsics.broadcastInt(
 704             VECTOR_OP_RSHIFT, Int256Vector.class, int.class, LENGTH,
 705             this, s,
 706             (v, i) -> v.uOp((__, a) -> (int) (a >> i)));
 707     }
 708 
 709     @Override
 710     @ForceInline
 711     public Int256Vector aShiftR(int s, Mask<Integer> m) {
 712         return blend(aShiftR(s), m);
 713     }
 714 
 715     @Override
 716     @ForceInline
 717     public Int256Vector shiftL(Vector<Integer> s) {
 718         Int256Vector shiftv = (Int256Vector)s;
 719         // As per shift specification for Java, mask the shift count.
 720         shiftv = shiftv.and(species().broadcast(0x1f));
 721         return VectorIntrinsics.binaryOp(
 722             VECTOR_OP_LSHIFT, Int256Vector.class, int.class, LENGTH,
 723             this, shiftv,
 724             (v1, v2) -> v1.bOp(v2,(i,a, b) -> (int) (a << b)));
 725     }
 726 
 727     @Override
 728     @ForceInline
 729     public Int256Vector shiftR(Vector<Integer> s) {
 730         Int256Vector shiftv = (Int256Vector)s;
 731         // As per shift specification for Java, mask the shift count.
 732         shiftv = shiftv.and(species().broadcast(0x1f));
 733         return VectorIntrinsics.binaryOp(
 734             VECTOR_OP_URSHIFT, Int256Vector.class, int.class, LENGTH,
 735             this, shiftv,
 736             (v1, v2) -> v1.bOp(v2,(i,a, b) -> (int) (a >>> b)));
 737     }
 738 
 739     @Override
 740     @ForceInline
 741     public Int256Vector aShiftR(Vector<Integer> s) {
 742         Int256Vector shiftv = (Int256Vector)s;
 743         // As per shift specification for Java, mask the shift count.
 744         shiftv = shiftv.and(species().broadcast(0x1f));
 745         return VectorIntrinsics.binaryOp(
 746             VECTOR_OP_RSHIFT, Int256Vector.class, int.class, LENGTH,
 747             this, shiftv,
 748             (v1, v2) -> v1.bOp(v2,(i,a, b) -> (int) (a >> b)));
 749     }
 750     // Ternary operations
 751 
 752 
 753     // Type specific horizontal reductions
 754 
 755     @Override
 756     @ForceInline
 757     public int addAll() {
 758         return (int) VectorIntrinsics.reductionCoerced(
 759             VECTOR_OP_ADD, Int256Vector.class, int.class, LENGTH,
 760             this,
 761             v -> (long) v.rOp((int) 0, (i, a, b) -> (int) (a + b)));
 762     }
 763 
 764     @Override
 765     @ForceInline
 766     public int andAll() {
 767         return (int) VectorIntrinsics.reductionCoerced(
 768             VECTOR_OP_AND, Int256Vector.class, int.class, LENGTH,
 769             this,
 770             v -> (long) v.rOp((int) -1, (i, a, b) -> (int) (a & b)));
 771     }
 772 
 773     @Override
 774     @ForceInline
 775     public int andAll(Mask<Integer> m) {
 776         return SPECIES.broadcast((int) -1).blend(this, m).andAll();
 777     }
 778 
 779     @Override
 780     @ForceInline
 781     public int minAll() {
 782         return (int) VectorIntrinsics.reductionCoerced(
 783             VECTOR_OP_MIN, Int256Vector.class, int.class, LENGTH,
 784             this,
 785             v -> (long) v.rOp(Integer.MAX_VALUE , (i, a, b) -> (int) Math.min(a, b)));
 786     }
 787 
 788     @Override
 789     @ForceInline
 790     public int maxAll() {
 791         return (int) VectorIntrinsics.reductionCoerced(
 792             VECTOR_OP_MAX, Int256Vector.class, int.class, LENGTH,
 793             this,
 794             v -> (long) v.rOp(Integer.MIN_VALUE , (i, a, b) -> (int) Math.max(a, b)));
 795     }
 796 
 797     @Override
 798     @ForceInline
 799     public int mulAll() {
 800         return (int) VectorIntrinsics.reductionCoerced(
 801             VECTOR_OP_MUL, Int256Vector.class, int.class, LENGTH,
 802             this,
 803             v -> (long) v.rOp((int) 1, (i, a, b) -> (int) (a * b)));
 804     }
 805 
 806     @Override
 807     @ForceInline
 808     public int orAll() {
 809         return (int) VectorIntrinsics.reductionCoerced(
 810             VECTOR_OP_OR, Int256Vector.class, int.class, LENGTH,
 811             this,
 812             v -> (long) v.rOp((int) 0, (i, a, b) -> (int) (a | b)));
 813     }
 814 
 815     @Override
 816     @ForceInline
 817     public int orAll(Mask<Integer> m) {
 818         return SPECIES.broadcast((int) 0).blend(this, m).orAll();
 819     }
 820 
 821     @Override
 822     @ForceInline
 823     public int xorAll() {
 824         return (int) VectorIntrinsics.reductionCoerced(
 825             VECTOR_OP_XOR, Int256Vector.class, int.class, LENGTH,
 826             this,
 827             v -> (long) v.rOp((int) 0, (i, a, b) -> (int) (a ^ b)));
 828     }
 829 
 830     @Override
 831     @ForceInline
 832     public int xorAll(Mask<Integer> m) {
 833         return SPECIES.broadcast((int) 0).blend(this, m).xorAll();
 834     }
 835 
 836 
 837     @Override
 838     @ForceInline
 839     public int addAll(Mask<Integer> m) {
 840         return SPECIES.broadcast((int) 0).blend(this, m).addAll();
 841     }
 842 
 843 
 844     @Override
 845     @ForceInline
 846     public int mulAll(Mask<Integer> m) {
 847         return SPECIES.broadcast((int) 1).blend(this, m).mulAll();
 848     }
 849 
 850     @Override
 851     @ForceInline
 852     public int minAll(Mask<Integer> m) {
 853         return SPECIES.broadcast(Integer.MAX_VALUE).blend(this, m).minAll();
 854     }
 855 
 856     @Override
 857     @ForceInline
 858     public int maxAll(Mask<Integer> m) {
 859         return SPECIES.broadcast(Integer.MIN_VALUE).blend(this, m).maxAll();
 860     }
 861 
 862     @Override
 863     @ForceInline
 864     public Shuffle<Integer> toShuffle() {
 865         int[] a = toArray();
 866         int[] sa = new int[a.length];
 867         for (int i = 0; i < a.length; i++) {
 868             sa[i] = (int) a[i];
 869         }
 870         return IntVector.shuffleFromArray(SPECIES, sa, 0);
 871     }
 872 
 873     // Memory operations
 874 
 875     private static final int ARRAY_SHIFT         = 31 - Integer.numberOfLeadingZeros(Unsafe.ARRAY_INT_INDEX_SCALE);
 876     private static final int BOOLEAN_ARRAY_SHIFT = 31 - Integer.numberOfLeadingZeros(Unsafe.ARRAY_BOOLEAN_INDEX_SCALE);
 877 
 878     @Override
 879     @ForceInline
 880     public void intoArray(int[] a, int ix) {
 881         Objects.requireNonNull(a);
 882         ix = VectorIntrinsics.checkIndex(ix, a.length, LENGTH);
 883         intoArrayWithoutCheck(a, ix);
 884     }
 885 
 886     @ForceInline
 887     private void intoArrayWithoutCheck(int[] a, int ix) {
 888         VectorIntrinsics.store(Int256Vector.class, int.class, LENGTH,
 889                                a, (((long) ix) << ARRAY_SHIFT) + Unsafe.ARRAY_INT_BASE_OFFSET,
 890                                this,
 891                                a, ix,
 892                                (arr, idx, v) -> v.forEach((i, e) -> arr[idx + i] = e));
 893     }
 894 
 895     @Override
 896     @ForceInline
 897     public final void intoArray(int[] a, int ax, Mask<Integer> m) {
 898         Objects.requireNonNull(a);
 899         if (ax + LENGTH <= a.length) {
 900             IntVector oldVal = IntVector.fromArrayWithoutCheck(SPECIES, a, ax);
 901             IntVector newVal = oldVal.blend(this, m);
 902             ((Int256Vector)newVal).intoArrayWithoutCheck(a, ax);
 903         } else {
 904             forEach(m, (i, e) -> a[ax + i] = e);
 905         }
 906     }
 907 
 908     @Override
 909     @ForceInline
 910     public void intoArray(int[] a, int ix, int[] b, int iy) {
 911         Objects.requireNonNull(a);
 912         Objects.requireNonNull(b);
 913 
 914         // Index vector: vix[0:n] = i -> ix + indexMap[iy + i]
 915         IntVector vix = IntVector.fromArray(INDEX_SPEC, b, iy).add(ix);
 916 
 917         vix = VectorIntrinsics.checkIndex(vix, a.length);
 918 
 919         intoArrayWithoutCheck(a, ix, b, iy, vix);
 920     }
 921 
 922     @ForceInline
 923     private void intoArrayWithoutCheck(int[] a, int ix, int[] b, int iy, IntVector vix) {
 924         VectorIntrinsics.storeWithMap(Int256Vector.class, int.class, LENGTH, Int256Vector.class,
 925                                a, Unsafe.ARRAY_INT_BASE_OFFSET, vix,
 926                                this,
 927                                a, ix, b, iy,
 928                                (arr, idx, v, indexMap, idy) -> v.forEach((i, e) -> arr[idx+indexMap[idy+i]] = e));
 929     }
 930 
 931     @Override
 932     @ForceInline
 933     public final void intoArray(int[] a, int ax, Mask<Integer> m, int[] b, int iy) {
 934         Objects.requireNonNull(a);
 935         Objects.requireNonNull(b);
 936 
 937         // Index vector: vix[0:n] = i -> ax + b[iy + i]
 938         IntVector vix = IntVector.fromArray(INDEX_SPEC, b, iy).add(ax);
 939 
 940         if(vix.lessThan(0).anyTrue() || vix.greaterThanEq(a.length).anyTrue()) {
 941             forEach(m, (i, e) -> a[ax + b[iy+i]] = e);
 942         } else {
 943             IntVector oldVal = IntVector.fromArrayWithoutCheck(SPECIES, a, ax, b, iy, vix);
 944             IntVector newVal = oldVal.blend(this, m);
 945             ((Int256Vector)newVal).intoArrayWithoutCheck(a, ax, b, iy, vix);
 946         }
 947     }
 948 
 949     @Override
 950     @ForceInline
 951     public void intoByteArray(byte[] a, int ix) {
 952         Objects.requireNonNull(a);
 953         ix = VectorIntrinsics.checkIndex(ix, a.length, bitSize() / Byte.SIZE);
 954         VectorIntrinsics.store(Int256Vector.class, int.class, LENGTH,
 955                                a, ((long) ix) + Unsafe.ARRAY_BYTE_BASE_OFFSET,
 956                                this,
 957                                a, ix,
 958                                (c, idx, v) -> {
 959                                    ByteBuffer bbc = ByteBuffer.wrap(c, idx, c.length - idx).order(ByteOrder.nativeOrder());
 960                                    IntBuffer tb = bbc.asIntBuffer();
 961                                    v.forEach((i, e) -> tb.put(e));
 962                                });
 963     }
 964 
 965     @Override
 966     @ForceInline
 967     public final void intoByteArray(byte[] a, int ix, Mask<Integer> m) {
 968         Int256Vector oldVal = (Int256Vector) IntVector.fromByteArray(SPECIES, a, ix);
 969         Int256Vector newVal = oldVal.blend(this, m);
 970         newVal.intoByteArray(a, ix);
 971     }
 972 
 973     @Override
 974     @ForceInline
 975     public void intoByteBuffer(ByteBuffer bb, int ix) {
 976         if (bb.order() != ByteOrder.nativeOrder()) {
 977             throw new IllegalArgumentException();
 978         }
 979         if (bb.isReadOnly()) {
 980             throw new ReadOnlyBufferException();
 981         }
 982         ix = VectorIntrinsics.checkIndex(ix, bb.limit(), bitSize() / Byte.SIZE);
 983         VectorIntrinsics.store(Int256Vector.class, int.class, LENGTH,
 984                                U.getReference(bb, BYTE_BUFFER_HB), ix + U.getLong(bb, BUFFER_ADDRESS),
 985                                this,
 986                                bb, ix,
 987                                (c, idx, v) -> {
 988                                    ByteBuffer bbc = c.duplicate().position(idx).order(ByteOrder.nativeOrder());
 989                                    IntBuffer tb = bbc.asIntBuffer();
 990                                    v.forEach((i, e) -> tb.put(e));
 991                                });
 992     }
 993 
 994     @Override
 995     @ForceInline
 996     public void intoByteBuffer(ByteBuffer bb, int ix, Mask<Integer> m) {
 997         Int256Vector oldVal = (Int256Vector) IntVector.fromByteBuffer(SPECIES, bb, ix);
 998         Int256Vector newVal = oldVal.blend(this, m);
 999         newVal.intoByteBuffer(bb, ix);
1000     }
1001 
1002     //
1003 
1004     @Override
1005     public String toString() {
1006         return Arrays.toString(getElements());
1007     }
1008 
1009     @Override
1010     public boolean equals(Object o) {
1011         if (this == o) return true;
1012         if (o == null || this.getClass() != o.getClass()) return false;
1013 
1014         Int256Vector that = (Int256Vector) o;
1015         return this.equal(that).allTrue();
1016     }
1017 
1018     @Override
1019     public int hashCode() {
1020         return Arrays.hashCode(vec);
1021     }
1022 
1023     // Binary test
1024 
1025     @Override
1026     Int256Mask bTest(Vector<Integer> o, FBinTest f) {
1027         int[] vec1 = getElements();
1028         int[] vec2 = ((Int256Vector)o).getElements();
1029         boolean[] bits = new boolean[length()];
1030         for (int i = 0; i < length(); i++){
1031             bits[i] = f.apply(i, vec1[i], vec2[i]);
1032         }
1033         return new Int256Mask(bits);
1034     }
1035 
1036     // Comparisons
1037 
1038     @Override
1039     @ForceInline
1040     public Int256Mask equal(Vector<Integer> o) {
1041         Objects.requireNonNull(o);
1042         Int256Vector v = (Int256Vector)o;
1043 
1044         return VectorIntrinsics.compare(
1045             BT_eq, Int256Vector.class, Int256Mask.class, int.class, LENGTH,
1046             this, v,
1047             (v1, v2) -> v1.bTest(v2, (i, a, b) -> a == b));
1048     }
1049 
1050     @Override
1051     @ForceInline
1052     public Int256Mask notEqual(Vector<Integer> o) {
1053         Objects.requireNonNull(o);
1054         Int256Vector v = (Int256Vector)o;
1055 
1056         return VectorIntrinsics.compare(
1057             BT_ne, Int256Vector.class, Int256Mask.class, int.class, LENGTH,
1058             this, v,
1059             (v1, v2) -> v1.bTest(v2, (i, a, b) -> a != b));
1060     }
1061 
1062     @Override
1063     @ForceInline
1064     public Int256Mask lessThan(Vector<Integer> o) {
1065         Objects.requireNonNull(o);
1066         Int256Vector v = (Int256Vector)o;
1067 
1068         return VectorIntrinsics.compare(
1069             BT_lt, Int256Vector.class, Int256Mask.class, int.class, LENGTH,
1070             this, v,
1071             (v1, v2) -> v1.bTest(v2, (i, a, b) -> a < b));
1072     }
1073 
1074     @Override
1075     @ForceInline
1076     public Int256Mask lessThanEq(Vector<Integer> o) {
1077         Objects.requireNonNull(o);
1078         Int256Vector v = (Int256Vector)o;
1079 
1080         return VectorIntrinsics.compare(
1081             BT_le, Int256Vector.class, Int256Mask.class, int.class, LENGTH,
1082             this, v,
1083             (v1, v2) -> v1.bTest(v2, (i, a, b) -> a <= b));
1084     }
1085 
1086     @Override
1087     @ForceInline
1088     public Int256Mask greaterThan(Vector<Integer> o) {
1089         Objects.requireNonNull(o);
1090         Int256Vector v = (Int256Vector)o;
1091 
1092         return (Int256Mask) VectorIntrinsics.compare(
1093             BT_gt, Int256Vector.class, Int256Mask.class, int.class, LENGTH,
1094             this, v,
1095             (v1, v2) -> v1.bTest(v2, (i, a, b) -> a > b));
1096     }
1097 
1098     @Override
1099     @ForceInline
1100     public Int256Mask greaterThanEq(Vector<Integer> o) {
1101         Objects.requireNonNull(o);
1102         Int256Vector v = (Int256Vector)o;
1103 
1104         return VectorIntrinsics.compare(
1105             BT_ge, Int256Vector.class, Int256Mask.class, int.class, LENGTH,
1106             this, v,
1107             (v1, v2) -> v1.bTest(v2, (i, a, b) -> a >= b));
1108     }
1109 
1110     // Foreach
1111 
1112     @Override
1113     void forEach(FUnCon f) {
1114         int[] vec = getElements();
1115         for (int i = 0; i < length(); i++) {
1116             f.apply(i, vec[i]);
1117         }
1118     }
1119 
1120     @Override
1121     void forEach(Mask<Integer> o, FUnCon f) {
1122         boolean[] mbits = ((Int256Mask)o).getBits();
1123         forEach((i, a) -> {
1124             if (mbits[i]) { f.apply(i, a); }
1125         });
1126     }
1127 
1128 
1129     Float256Vector toFP() {
1130         int[] vec = getElements();
1131         float[] res = new float[this.species().length()];
1132         for(int i = 0; i < this.species().length(); i++){
1133             res[i] = Float.intBitsToFloat(vec[i]);
1134         }
1135         return new Float256Vector(res);
1136     }
1137 
1138     @Override
1139     public Int256Vector rotateEL(int j) {
1140         int[] vec = getElements();
1141         int[] res = new int[length()];
1142         for (int i = 0; i < length(); i++){
1143             res[(j + i) % length()] = vec[i];
1144         }
1145         return new Int256Vector(res);
1146     }
1147 
1148     @Override
1149     public Int256Vector rotateER(int j) {
1150         int[] vec = getElements();
1151         int[] res = new int[length()];
1152         for (int i = 0; i < length(); i++){
1153             int z = i - j;
1154             if(j < 0) {
1155                 res[length() + z] = vec[i];
1156             } else {
1157                 res[z] = vec[i];
1158             }
1159         }
1160         return new Int256Vector(res);
1161     }
1162 
1163     @Override
1164     public Int256Vector shiftEL(int j) {
1165         int[] vec = getElements();
1166         int[] res = new int[length()];
1167         for (int i = 0; i < length() - j; i++) {
1168             res[i] = vec[i + j];
1169         }
1170         return new Int256Vector(res);
1171     }
1172 
1173     @Override
1174     public Int256Vector shiftER(int j) {
1175         int[] vec = getElements();
1176         int[] res = new int[length()];
1177         for (int i = 0; i < length() - j; i++){
1178             res[i + j] = vec[i];
1179         }
1180         return new Int256Vector(res);
1181     }
1182 
1183     @Override
1184     @ForceInline
1185     public Int256Vector rearrange(Vector<Integer> v,
1186                                   Shuffle<Integer> s, Mask<Integer> m) {
1187         return this.rearrange(s).blend(v.rearrange(s), m);
1188     }
1189 
1190     @Override
1191     @ForceInline
1192     public Int256Vector rearrange(Shuffle<Integer> o1) {
1193         Objects.requireNonNull(o1);
1194         Int256Shuffle s =  (Int256Shuffle)o1;
1195 
1196         return VectorIntrinsics.rearrangeOp(
1197             Int256Vector.class, Int256Shuffle.class, int.class, LENGTH,
1198             this, s,
1199             (v1, s_) -> v1.uOp((i, a) -> {
1200                 int ei = s_.getElement(i);
1201                 return v1.get(ei);
1202             }));
1203     }
1204 
1205     @Override
1206     @ForceInline
1207     public Int256Vector blend(Vector<Integer> o1, Mask<Integer> o2) {
1208         Objects.requireNonNull(o1);
1209         Objects.requireNonNull(o2);
1210         Int256Vector v = (Int256Vector)o1;
1211         Int256Mask   m = (Int256Mask)o2;
1212 
1213         return VectorIntrinsics.blend(
1214             Int256Vector.class, Int256Mask.class, int.class, LENGTH,
1215             this, v, m,
1216             (v1, v2, m_) -> v1.bOp(v2, (i, a, b) -> m_.getElement(i) ? b : a));
1217     }
1218 
1219     // Accessors
1220 
1221     @Override
1222     public int get(int i) {
1223         if (i < 0 || i >= LENGTH) {
1224             throw new IllegalArgumentException("Index " + i + " must be zero or positive, and less than " + LENGTH);
1225         }
1226         return (int) VectorIntrinsics.extract(
1227                                 Int256Vector.class, int.class, LENGTH,
1228                                 this, i,
1229                                 (vec, ix) -> {
1230                                     int[] vecarr = vec.getElements();
1231                                     return (long)vecarr[ix];
1232                                 });
1233     }
1234 
1235     @Override
1236     public Int256Vector with(int i, int e) {
1237         if (i < 0 || i >= LENGTH) {
1238             throw new IllegalArgumentException("Index " + i + " must be zero or positive, and less than " + LENGTH);
1239         }
1240         return VectorIntrinsics.insert(
1241                                 Int256Vector.class, int.class, LENGTH,
1242                                 this, i, (long)e,
1243                                 (v, ix, bits) -> {
1244                                     int[] res = v.getElements().clone();
1245                                     res[ix] = (int)bits;
1246                                     return new Int256Vector(res);
1247                                 });
1248     }
1249 
1250     // Mask
1251 
1252     static final class Int256Mask extends AbstractMask<Integer> {
1253         static final Int256Mask TRUE_MASK = new Int256Mask(true);
1254         static final Int256Mask FALSE_MASK = new Int256Mask(false);
1255 
1256         private final boolean[] bits; // Don't access directly, use getBits() instead.
1257 
1258         public Int256Mask(boolean[] bits) {
1259             this(bits, 0);
1260         }
1261 
1262         public Int256Mask(boolean[] bits, int offset) {
1263             boolean[] a = new boolean[species().length()];
1264             for (int i = 0; i < a.length; i++) {
1265                 a[i] = bits[offset + i];
1266             }
1267             this.bits = a;
1268         }
1269 
1270         public Int256Mask(boolean val) {
1271             boolean[] bits = new boolean[species().length()];
1272             Arrays.fill(bits, val);
1273             this.bits = bits;
1274         }
1275 
1276         boolean[] getBits() {
1277             return VectorIntrinsics.maybeRebox(this).bits;
1278         }
1279 
1280         @Override
1281         Int256Mask uOp(MUnOp f) {
1282             boolean[] res = new boolean[species().length()];
1283             boolean[] bits = getBits();
1284             for (int i = 0; i < species().length(); i++) {
1285                 res[i] = f.apply(i, bits[i]);
1286             }
1287             return new Int256Mask(res);
1288         }
1289 
1290         @Override
1291         Int256Mask bOp(Mask<Integer> o, MBinOp f) {
1292             boolean[] res = new boolean[species().length()];
1293             boolean[] bits = getBits();
1294             boolean[] mbits = ((Int256Mask)o).getBits();
1295             for (int i = 0; i < species().length(); i++) {
1296                 res[i] = f.apply(i, bits[i], mbits[i]);
1297             }
1298             return new Int256Mask(res);
1299         }
1300 
1301         @Override
1302         public Int256Species species() {
1303             return SPECIES;
1304         }
1305 
1306         @Override
1307         public Int256Vector toVector() {
1308             int[] res = new int[species().length()];
1309             boolean[] bits = getBits();
1310             for (int i = 0; i < species().length(); i++) {
1311                 // -1 will result in the most significant bit being set in
1312                 // addition to some or all other bits
1313                 res[i] = (int) (bits[i] ? -1 : 0);
1314             }
1315             return new Int256Vector(res);
1316         }
1317 
1318         // Unary operations
1319 
1320         @Override
1321         @ForceInline
1322         public Int256Mask not() {
1323             return (Int256Mask) VectorIntrinsics.unaryOp(
1324                                              VECTOR_OP_NOT, Int256Mask.class, int.class, LENGTH,
1325                                              this,
1326                                              (m1) -> m1.uOp((i, a) -> !a));
1327         }
1328 
1329         // Binary operations
1330 
1331         @Override
1332         @ForceInline
1333         public Int256Mask and(Mask<Integer> o) {
1334             Objects.requireNonNull(o);
1335             Int256Mask m = (Int256Mask)o;
1336             return VectorIntrinsics.binaryOp(VECTOR_OP_AND, Int256Mask.class, int.class, LENGTH,
1337                                              this, m,
1338                                              (m1, m2) -> m1.bOp(m2, (i, a, b) -> a & b));
1339         }
1340 
1341         @Override
1342         @ForceInline
1343         public Int256Mask or(Mask<Integer> o) {
1344             Objects.requireNonNull(o);
1345             Int256Mask m = (Int256Mask)o;
1346             return VectorIntrinsics.binaryOp(VECTOR_OP_OR, Int256Mask.class, int.class, LENGTH,
1347                                              this, m,
1348                                              (m1, m2) -> m1.bOp(m2, (i, a, b) -> a | b));
1349         }
1350 
1351         // Reductions
1352 
1353         @Override
1354         @ForceInline
1355         public boolean anyTrue() {
1356             return VectorIntrinsics.test(BT_ne, Int256Mask.class, int.class, LENGTH,
1357                                          this, this,
1358                                          (m, __) -> anyTrueHelper(((Int256Mask)m).getBits()));
1359         }
1360 
1361         @Override
1362         @ForceInline
1363         public boolean allTrue() {
1364             return VectorIntrinsics.test(BT_overflow, Int256Mask.class, int.class, LENGTH,
1365                                          this, IntVector.maskAllTrue(species()),
1366                                          (m, __) -> allTrueHelper(((Int256Mask)m).getBits()));
1367         }
1368     }
1369 
1370     // Shuffle
1371 
1372     static final class Int256Shuffle extends AbstractShuffle<Integer> {
1373         Int256Shuffle(byte[] reorder) {
1374             super(reorder);
1375         }
1376 
1377         public Int256Shuffle(int[] reorder) {
1378             super(reorder);
1379         }
1380 
1381         public Int256Shuffle(int[] reorder, int i) {
1382             super(reorder, i);
1383         }
1384 
1385         public Int256Shuffle(IntUnaryOperator f) {
1386             super(f);
1387         }
1388 
1389         @Override
1390         public Int256Species species() {
1391             return SPECIES;
1392         }
1393 
1394         @Override
1395         public IntVector toVector() {
1396             int[] va = new int[SPECIES.length()];
1397             for (int i = 0; i < va.length; i++) {
1398               va[i] = (int) getElement(i);
1399             }
1400             return IntVector.fromArray(SPECIES, va, 0);
1401         }
1402 
1403         @Override
1404         public Int256Shuffle rearrange(Vector.Shuffle<Integer> o) {
1405             Int256Shuffle s = (Int256Shuffle) o;
1406             byte[] r = new byte[reorder.length];
1407             for (int i = 0; i < reorder.length; i++) {
1408                 r[i] = reorder[s.reorder[i]];
1409             }
1410             return new Int256Shuffle(r);
1411         }
1412     }
1413 
1414     // Species
1415 
1416     @Override
1417     public Int256Species species() {
1418         return SPECIES;
1419     }
1420 
1421     static final class Int256Species extends IntSpecies {
1422         static final int BIT_SIZE = Shape.S_256_BIT.bitSize();
1423 
1424         static final int LENGTH = BIT_SIZE / Integer.SIZE;
1425 
1426         @Override
1427         public String toString() {
1428            StringBuilder sb = new StringBuilder("Shape[");
1429            sb.append(bitSize()).append(" bits, ");
1430            sb.append(length()).append(" ").append(int.class.getSimpleName()).append("s x ");
1431            sb.append(elementSize()).append(" bits");
1432            sb.append("]");
1433            return sb.toString();
1434         }
1435 
1436         @Override
1437         @ForceInline
1438         public int bitSize() {
1439             return BIT_SIZE;
1440         }
1441 
1442         @Override
1443         @ForceInline
1444         public int length() {
1445             return LENGTH;
1446         }
1447 
1448         @Override
1449         @ForceInline
1450         public Class<Integer> elementType() {
1451             return int.class;
1452         }
1453 
1454         @Override
1455         @ForceInline
1456         public Class<?> boxType() {
1457             return Int256Vector.class;
1458         }
1459 
1460         @Override
1461         @ForceInline
1462         public Class<?> maskType() {
1463             return Int256Mask.class;
1464         }
1465 
1466         @Override
1467         @ForceInline
1468         public int elementSize() {
1469             return Integer.SIZE;
1470         }
1471 
1472         @Override
1473         @ForceInline
1474         @SuppressWarnings("unchecked")
1475         Class<?> vectorType() {
1476             return Int256Vector.class;
1477         }
1478 
1479         @Override
1480         @ForceInline
1481         public Shape shape() {
1482             return Shape.S_256_BIT;
1483         }
1484 
1485        @Override
1486        IntVector.IntSpecies indexSpecies() {
1487           return INDEX_SPEC;
1488        }
1489 
1490         @Override
1491         Int256Vector op(FOp f) {
1492             int[] res = new int[length()];
1493             for (int i = 0; i < length(); i++) {
1494                 res[i] = f.apply(i);
1495             }
1496             return new Int256Vector(res);
1497         }
1498 
1499         @Override
1500         Int256Vector op(Mask<Integer> o, FOp f) {
1501             int[] res = new int[length()];
1502             boolean[] mbits = ((Int256Mask)o).getBits();
1503             for (int i = 0; i < length(); i++) {
1504                 if (mbits[i]) {
1505                     res[i] = f.apply(i);
1506                 }
1507             }
1508             return new Int256Vector(res);
1509         }
1510 
1511         @Override
1512         Int256Mask opm(FOpm f) {
1513             boolean[] res = new boolean[length()];
1514             for (int i = 0; i < length(); i++) {
1515                 res[i] = (boolean)f.apply(i);
1516             }
1517             return new Int256Mask(res);
1518         }
1519 
1520         // Factories
1521 
1522         @Override
1523         @ForceInline
1524         public Int256Vector zero() {
1525             return VectorIntrinsics.broadcastCoerced(Int256Vector.class, int.class, LENGTH,
1526                                                      0, SPECIES,
1527                                                      ((bits, s) -> ((Int256Species)s).op(i -> (int)bits)));
1528         }
1529 
1530         @Override
1531         @ForceInline
1532         public Int256Vector broadcast(int e) {
1533             return VectorIntrinsics.broadcastCoerced(
1534                 Int256Vector.class, int.class, LENGTH,
1535                 e, SPECIES,
1536                 ((bits, s) -> ((Int256Species)s).op(i -> (int)bits)));
1537         }
1538 
1539         @Override
1540         @ForceInline
1541         public Int256Vector scalars(int... es) {
1542             Objects.requireNonNull(es);
1543             int ix = VectorIntrinsics.checkIndex(0, es.length, LENGTH);
1544             return VectorIntrinsics.load(Int256Vector.class, int.class, LENGTH,
1545                                          es, Unsafe.ARRAY_INT_BASE_OFFSET,
1546                                          es, ix, SPECIES,
1547                                          (c, idx, s) -> ((Int256Species)s).op(n -> c[idx + n]));
1548         }
1549 
1550         @Override
1551         @ForceInline
1552         public <E> Int256Mask cast(Mask<E> m) {
1553             if (m.length() != LENGTH)
1554                 throw new IllegalArgumentException("Mask length this species length differ");
1555             return new Int256Mask(m.toArray());
1556         }
1557 
1558         @Override
1559         @ForceInline
1560         public <E> Int256Shuffle cast(Shuffle<E> s) {
1561             if (s.length() != LENGTH)
1562                 throw new IllegalArgumentException("Shuffle length this species length differ");
1563             return new Int256Shuffle(s.toArray());
1564         }
1565     }
1566 }