mirror of
https://github.com/openjdk/jdk.git
synced 2025-08-28 15:24:43 +02:00
8267190: Optimize Vector API test operations
Reviewed-by: psandoz, kvn
This commit is contained in:
parent
94cfeb9c4f
commit
8f10c5a890
32 changed files with 1026 additions and 653 deletions
|
@ -599,31 +599,43 @@ final class Byte128Vector extends ByteVector {
|
|||
return (Byte128Vector) super.toVectorTemplate(); // specialize
|
||||
}
|
||||
|
||||
@Override
|
||||
/**
|
||||
* Helper function for lane-wise mask conversions.
|
||||
* This function kicks in after intrinsic failure.
|
||||
*/
|
||||
@ForceInline
|
||||
public <E> VectorMask<E> cast(VectorSpecies<E> s) {
|
||||
AbstractSpecies<E> species = (AbstractSpecies<E>) s;
|
||||
if (length() != species.laneCount())
|
||||
throw new IllegalArgumentException("VectorMask length and species length differ");
|
||||
private final <E>
|
||||
VectorMask<E> defaultMaskCast(AbstractSpecies<E> dsp) {
|
||||
assert(length() == dsp.laneCount());
|
||||
boolean[] maskArray = toArray();
|
||||
// enum-switches don't optimize properly JDK-8161245
|
||||
switch (species.laneType.switchKey) {
|
||||
case LaneType.SK_BYTE:
|
||||
return new Byte128Vector.Byte128Mask(maskArray).check(species);
|
||||
case LaneType.SK_SHORT:
|
||||
return new Short128Vector.Short128Mask(maskArray).check(species);
|
||||
case LaneType.SK_INT:
|
||||
return new Int128Vector.Int128Mask(maskArray).check(species);
|
||||
case LaneType.SK_LONG:
|
||||
return new Long128Vector.Long128Mask(maskArray).check(species);
|
||||
case LaneType.SK_FLOAT:
|
||||
return new Float128Vector.Float128Mask(maskArray).check(species);
|
||||
case LaneType.SK_DOUBLE:
|
||||
return new Double128Vector.Double128Mask(maskArray).check(species);
|
||||
}
|
||||
return switch (dsp.laneType.switchKey) {
|
||||
case LaneType.SK_BYTE -> new Byte128Vector.Byte128Mask(maskArray).check(dsp);
|
||||
case LaneType.SK_SHORT -> new Short128Vector.Short128Mask(maskArray).check(dsp);
|
||||
case LaneType.SK_INT -> new Int128Vector.Int128Mask(maskArray).check(dsp);
|
||||
case LaneType.SK_LONG -> new Long128Vector.Long128Mask(maskArray).check(dsp);
|
||||
case LaneType.SK_FLOAT -> new Float128Vector.Float128Mask(maskArray).check(dsp);
|
||||
case LaneType.SK_DOUBLE -> new Double128Vector.Double128Mask(maskArray).check(dsp);
|
||||
default -> throw new AssertionError(dsp);
|
||||
};
|
||||
}
|
||||
|
||||
// Should not reach here.
|
||||
throw new AssertionError(species);
|
||||
@Override
|
||||
@ForceInline
|
||||
public <E> VectorMask<E> cast(VectorSpecies<E> dsp) {
|
||||
AbstractSpecies<E> species = (AbstractSpecies<E>) dsp;
|
||||
if (length() != species.laneCount())
|
||||
throw new IllegalArgumentException("VectorMask length and species length differ");
|
||||
if (VSIZE == species.vectorBitSize()) {
|
||||
Class<?> dtype = species.elementType();
|
||||
Class<?> dmtype = species.maskType();
|
||||
return VectorSupport.convert(VectorSupport.VECTOR_OP_REINTERPRET,
|
||||
this.getClass(), ETYPE, VLENGTH,
|
||||
dmtype, dtype, VLENGTH,
|
||||
this, species,
|
||||
Byte128Mask::defaultMaskCast);
|
||||
}
|
||||
return this.defaultMaskCast(species);
|
||||
}
|
||||
|
||||
// Unary operations
|
||||
|
|
|
@ -631,31 +631,43 @@ final class Byte256Vector extends ByteVector {
|
|||
return (Byte256Vector) super.toVectorTemplate(); // specialize
|
||||
}
|
||||
|
||||
@Override
|
||||
/**
|
||||
* Helper function for lane-wise mask conversions.
|
||||
* This function kicks in after intrinsic failure.
|
||||
*/
|
||||
@ForceInline
|
||||
public <E> VectorMask<E> cast(VectorSpecies<E> s) {
|
||||
AbstractSpecies<E> species = (AbstractSpecies<E>) s;
|
||||
if (length() != species.laneCount())
|
||||
throw new IllegalArgumentException("VectorMask length and species length differ");
|
||||
private final <E>
|
||||
VectorMask<E> defaultMaskCast(AbstractSpecies<E> dsp) {
|
||||
assert(length() == dsp.laneCount());
|
||||
boolean[] maskArray = toArray();
|
||||
// enum-switches don't optimize properly JDK-8161245
|
||||
switch (species.laneType.switchKey) {
|
||||
case LaneType.SK_BYTE:
|
||||
return new Byte256Vector.Byte256Mask(maskArray).check(species);
|
||||
case LaneType.SK_SHORT:
|
||||
return new Short256Vector.Short256Mask(maskArray).check(species);
|
||||
case LaneType.SK_INT:
|
||||
return new Int256Vector.Int256Mask(maskArray).check(species);
|
||||
case LaneType.SK_LONG:
|
||||
return new Long256Vector.Long256Mask(maskArray).check(species);
|
||||
case LaneType.SK_FLOAT:
|
||||
return new Float256Vector.Float256Mask(maskArray).check(species);
|
||||
case LaneType.SK_DOUBLE:
|
||||
return new Double256Vector.Double256Mask(maskArray).check(species);
|
||||
}
|
||||
return switch (dsp.laneType.switchKey) {
|
||||
case LaneType.SK_BYTE -> new Byte256Vector.Byte256Mask(maskArray).check(dsp);
|
||||
case LaneType.SK_SHORT -> new Short256Vector.Short256Mask(maskArray).check(dsp);
|
||||
case LaneType.SK_INT -> new Int256Vector.Int256Mask(maskArray).check(dsp);
|
||||
case LaneType.SK_LONG -> new Long256Vector.Long256Mask(maskArray).check(dsp);
|
||||
case LaneType.SK_FLOAT -> new Float256Vector.Float256Mask(maskArray).check(dsp);
|
||||
case LaneType.SK_DOUBLE -> new Double256Vector.Double256Mask(maskArray).check(dsp);
|
||||
default -> throw new AssertionError(dsp);
|
||||
};
|
||||
}
|
||||
|
||||
// Should not reach here.
|
||||
throw new AssertionError(species);
|
||||
@Override
|
||||
@ForceInline
|
||||
public <E> VectorMask<E> cast(VectorSpecies<E> dsp) {
|
||||
AbstractSpecies<E> species = (AbstractSpecies<E>) dsp;
|
||||
if (length() != species.laneCount())
|
||||
throw new IllegalArgumentException("VectorMask length and species length differ");
|
||||
if (VSIZE == species.vectorBitSize()) {
|
||||
Class<?> dtype = species.elementType();
|
||||
Class<?> dmtype = species.maskType();
|
||||
return VectorSupport.convert(VectorSupport.VECTOR_OP_REINTERPRET,
|
||||
this.getClass(), ETYPE, VLENGTH,
|
||||
dmtype, dtype, VLENGTH,
|
||||
this, species,
|
||||
Byte256Mask::defaultMaskCast);
|
||||
}
|
||||
return this.defaultMaskCast(species);
|
||||
}
|
||||
|
||||
// Unary operations
|
||||
|
|
|
@ -695,31 +695,43 @@ final class Byte512Vector extends ByteVector {
|
|||
return (Byte512Vector) super.toVectorTemplate(); // specialize
|
||||
}
|
||||
|
||||
@Override
|
||||
/**
|
||||
* Helper function for lane-wise mask conversions.
|
||||
* This function kicks in after intrinsic failure.
|
||||
*/
|
||||
@ForceInline
|
||||
public <E> VectorMask<E> cast(VectorSpecies<E> s) {
|
||||
AbstractSpecies<E> species = (AbstractSpecies<E>) s;
|
||||
if (length() != species.laneCount())
|
||||
throw new IllegalArgumentException("VectorMask length and species length differ");
|
||||
private final <E>
|
||||
VectorMask<E> defaultMaskCast(AbstractSpecies<E> dsp) {
|
||||
assert(length() == dsp.laneCount());
|
||||
boolean[] maskArray = toArray();
|
||||
// enum-switches don't optimize properly JDK-8161245
|
||||
switch (species.laneType.switchKey) {
|
||||
case LaneType.SK_BYTE:
|
||||
return new Byte512Vector.Byte512Mask(maskArray).check(species);
|
||||
case LaneType.SK_SHORT:
|
||||
return new Short512Vector.Short512Mask(maskArray).check(species);
|
||||
case LaneType.SK_INT:
|
||||
return new Int512Vector.Int512Mask(maskArray).check(species);
|
||||
case LaneType.SK_LONG:
|
||||
return new Long512Vector.Long512Mask(maskArray).check(species);
|
||||
case LaneType.SK_FLOAT:
|
||||
return new Float512Vector.Float512Mask(maskArray).check(species);
|
||||
case LaneType.SK_DOUBLE:
|
||||
return new Double512Vector.Double512Mask(maskArray).check(species);
|
||||
}
|
||||
return switch (dsp.laneType.switchKey) {
|
||||
case LaneType.SK_BYTE -> new Byte512Vector.Byte512Mask(maskArray).check(dsp);
|
||||
case LaneType.SK_SHORT -> new Short512Vector.Short512Mask(maskArray).check(dsp);
|
||||
case LaneType.SK_INT -> new Int512Vector.Int512Mask(maskArray).check(dsp);
|
||||
case LaneType.SK_LONG -> new Long512Vector.Long512Mask(maskArray).check(dsp);
|
||||
case LaneType.SK_FLOAT -> new Float512Vector.Float512Mask(maskArray).check(dsp);
|
||||
case LaneType.SK_DOUBLE -> new Double512Vector.Double512Mask(maskArray).check(dsp);
|
||||
default -> throw new AssertionError(dsp);
|
||||
};
|
||||
}
|
||||
|
||||
// Should not reach here.
|
||||
throw new AssertionError(species);
|
||||
@Override
|
||||
@ForceInline
|
||||
public <E> VectorMask<E> cast(VectorSpecies<E> dsp) {
|
||||
AbstractSpecies<E> species = (AbstractSpecies<E>) dsp;
|
||||
if (length() != species.laneCount())
|
||||
throw new IllegalArgumentException("VectorMask length and species length differ");
|
||||
if (VSIZE == species.vectorBitSize()) {
|
||||
Class<?> dtype = species.elementType();
|
||||
Class<?> dmtype = species.maskType();
|
||||
return VectorSupport.convert(VectorSupport.VECTOR_OP_REINTERPRET,
|
||||
this.getClass(), ETYPE, VLENGTH,
|
||||
dmtype, dtype, VLENGTH,
|
||||
this, species,
|
||||
Byte512Mask::defaultMaskCast);
|
||||
}
|
||||
return this.defaultMaskCast(species);
|
||||
}
|
||||
|
||||
// Unary operations
|
||||
|
|
|
@ -583,31 +583,43 @@ final class Byte64Vector extends ByteVector {
|
|||
return (Byte64Vector) super.toVectorTemplate(); // specialize
|
||||
}
|
||||
|
||||
@Override
|
||||
/**
|
||||
* Helper function for lane-wise mask conversions.
|
||||
* This function kicks in after intrinsic failure.
|
||||
*/
|
||||
@ForceInline
|
||||
public <E> VectorMask<E> cast(VectorSpecies<E> s) {
|
||||
AbstractSpecies<E> species = (AbstractSpecies<E>) s;
|
||||
if (length() != species.laneCount())
|
||||
throw new IllegalArgumentException("VectorMask length and species length differ");
|
||||
private final <E>
|
||||
VectorMask<E> defaultMaskCast(AbstractSpecies<E> dsp) {
|
||||
assert(length() == dsp.laneCount());
|
||||
boolean[] maskArray = toArray();
|
||||
// enum-switches don't optimize properly JDK-8161245
|
||||
switch (species.laneType.switchKey) {
|
||||
case LaneType.SK_BYTE:
|
||||
return new Byte64Vector.Byte64Mask(maskArray).check(species);
|
||||
case LaneType.SK_SHORT:
|
||||
return new Short64Vector.Short64Mask(maskArray).check(species);
|
||||
case LaneType.SK_INT:
|
||||
return new Int64Vector.Int64Mask(maskArray).check(species);
|
||||
case LaneType.SK_LONG:
|
||||
return new Long64Vector.Long64Mask(maskArray).check(species);
|
||||
case LaneType.SK_FLOAT:
|
||||
return new Float64Vector.Float64Mask(maskArray).check(species);
|
||||
case LaneType.SK_DOUBLE:
|
||||
return new Double64Vector.Double64Mask(maskArray).check(species);
|
||||
}
|
||||
return switch (dsp.laneType.switchKey) {
|
||||
case LaneType.SK_BYTE -> new Byte64Vector.Byte64Mask(maskArray).check(dsp);
|
||||
case LaneType.SK_SHORT -> new Short64Vector.Short64Mask(maskArray).check(dsp);
|
||||
case LaneType.SK_INT -> new Int64Vector.Int64Mask(maskArray).check(dsp);
|
||||
case LaneType.SK_LONG -> new Long64Vector.Long64Mask(maskArray).check(dsp);
|
||||
case LaneType.SK_FLOAT -> new Float64Vector.Float64Mask(maskArray).check(dsp);
|
||||
case LaneType.SK_DOUBLE -> new Double64Vector.Double64Mask(maskArray).check(dsp);
|
||||
default -> throw new AssertionError(dsp);
|
||||
};
|
||||
}
|
||||
|
||||
// Should not reach here.
|
||||
throw new AssertionError(species);
|
||||
@Override
|
||||
@ForceInline
|
||||
public <E> VectorMask<E> cast(VectorSpecies<E> dsp) {
|
||||
AbstractSpecies<E> species = (AbstractSpecies<E>) dsp;
|
||||
if (length() != species.laneCount())
|
||||
throw new IllegalArgumentException("VectorMask length and species length differ");
|
||||
if (VSIZE == species.vectorBitSize()) {
|
||||
Class<?> dtype = species.elementType();
|
||||
Class<?> dmtype = species.maskType();
|
||||
return VectorSupport.convert(VectorSupport.VECTOR_OP_REINTERPRET,
|
||||
this.getClass(), ETYPE, VLENGTH,
|
||||
dmtype, dtype, VLENGTH,
|
||||
this, species,
|
||||
Byte64Mask::defaultMaskCast);
|
||||
}
|
||||
return this.defaultMaskCast(species);
|
||||
}
|
||||
|
||||
// Unary operations
|
||||
|
|
|
@ -569,31 +569,43 @@ final class ByteMaxVector extends ByteVector {
|
|||
return (ByteMaxVector) super.toVectorTemplate(); // specialize
|
||||
}
|
||||
|
||||
@Override
|
||||
/**
|
||||
* Helper function for lane-wise mask conversions.
|
||||
* This function kicks in after intrinsic failure.
|
||||
*/
|
||||
@ForceInline
|
||||
public <E> VectorMask<E> cast(VectorSpecies<E> s) {
|
||||
AbstractSpecies<E> species = (AbstractSpecies<E>) s;
|
||||
if (length() != species.laneCount())
|
||||
throw new IllegalArgumentException("VectorMask length and species length differ");
|
||||
private final <E>
|
||||
VectorMask<E> defaultMaskCast(AbstractSpecies<E> dsp) {
|
||||
assert(length() == dsp.laneCount());
|
||||
boolean[] maskArray = toArray();
|
||||
// enum-switches don't optimize properly JDK-8161245
|
||||
switch (species.laneType.switchKey) {
|
||||
case LaneType.SK_BYTE:
|
||||
return new ByteMaxVector.ByteMaxMask(maskArray).check(species);
|
||||
case LaneType.SK_SHORT:
|
||||
return new ShortMaxVector.ShortMaxMask(maskArray).check(species);
|
||||
case LaneType.SK_INT:
|
||||
return new IntMaxVector.IntMaxMask(maskArray).check(species);
|
||||
case LaneType.SK_LONG:
|
||||
return new LongMaxVector.LongMaxMask(maskArray).check(species);
|
||||
case LaneType.SK_FLOAT:
|
||||
return new FloatMaxVector.FloatMaxMask(maskArray).check(species);
|
||||
case LaneType.SK_DOUBLE:
|
||||
return new DoubleMaxVector.DoubleMaxMask(maskArray).check(species);
|
||||
}
|
||||
return switch (dsp.laneType.switchKey) {
|
||||
case LaneType.SK_BYTE -> new ByteMaxVector.ByteMaxMask(maskArray).check(dsp);
|
||||
case LaneType.SK_SHORT -> new ShortMaxVector.ShortMaxMask(maskArray).check(dsp);
|
||||
case LaneType.SK_INT -> new IntMaxVector.IntMaxMask(maskArray).check(dsp);
|
||||
case LaneType.SK_LONG -> new LongMaxVector.LongMaxMask(maskArray).check(dsp);
|
||||
case LaneType.SK_FLOAT -> new FloatMaxVector.FloatMaxMask(maskArray).check(dsp);
|
||||
case LaneType.SK_DOUBLE -> new DoubleMaxVector.DoubleMaxMask(maskArray).check(dsp);
|
||||
default -> throw new AssertionError(dsp);
|
||||
};
|
||||
}
|
||||
|
||||
// Should not reach here.
|
||||
throw new AssertionError(species);
|
||||
@Override
|
||||
@ForceInline
|
||||
public <E> VectorMask<E> cast(VectorSpecies<E> dsp) {
|
||||
AbstractSpecies<E> species = (AbstractSpecies<E>) dsp;
|
||||
if (length() != species.laneCount())
|
||||
throw new IllegalArgumentException("VectorMask length and species length differ");
|
||||
if (VSIZE == species.vectorBitSize()) {
|
||||
Class<?> dtype = species.elementType();
|
||||
Class<?> dmtype = species.maskType();
|
||||
return VectorSupport.convert(VectorSupport.VECTOR_OP_REINTERPRET,
|
||||
this.getClass(), ETYPE, VLENGTH,
|
||||
dmtype, dtype, VLENGTH,
|
||||
this, species,
|
||||
ByteMaxMask::defaultMaskCast);
|
||||
}
|
||||
return this.defaultMaskCast(species);
|
||||
}
|
||||
|
||||
// Unary operations
|
||||
|
|
|
@ -567,31 +567,43 @@ final class Double128Vector extends DoubleVector {
|
|||
return (Double128Vector) super.toVectorTemplate(); // specialize
|
||||
}
|
||||
|
||||
@Override
|
||||
/**
|
||||
* Helper function for lane-wise mask conversions.
|
||||
* This function kicks in after intrinsic failure.
|
||||
*/
|
||||
@ForceInline
|
||||
public <E> VectorMask<E> cast(VectorSpecies<E> s) {
|
||||
AbstractSpecies<E> species = (AbstractSpecies<E>) s;
|
||||
if (length() != species.laneCount())
|
||||
throw new IllegalArgumentException("VectorMask length and species length differ");
|
||||
private final <E>
|
||||
VectorMask<E> defaultMaskCast(AbstractSpecies<E> dsp) {
|
||||
assert(length() == dsp.laneCount());
|
||||
boolean[] maskArray = toArray();
|
||||
// enum-switches don't optimize properly JDK-8161245
|
||||
switch (species.laneType.switchKey) {
|
||||
case LaneType.SK_BYTE:
|
||||
return new Byte128Vector.Byte128Mask(maskArray).check(species);
|
||||
case LaneType.SK_SHORT:
|
||||
return new Short128Vector.Short128Mask(maskArray).check(species);
|
||||
case LaneType.SK_INT:
|
||||
return new Int128Vector.Int128Mask(maskArray).check(species);
|
||||
case LaneType.SK_LONG:
|
||||
return new Long128Vector.Long128Mask(maskArray).check(species);
|
||||
case LaneType.SK_FLOAT:
|
||||
return new Float128Vector.Float128Mask(maskArray).check(species);
|
||||
case LaneType.SK_DOUBLE:
|
||||
return new Double128Vector.Double128Mask(maskArray).check(species);
|
||||
}
|
||||
return switch (dsp.laneType.switchKey) {
|
||||
case LaneType.SK_BYTE -> new Byte128Vector.Byte128Mask(maskArray).check(dsp);
|
||||
case LaneType.SK_SHORT -> new Short128Vector.Short128Mask(maskArray).check(dsp);
|
||||
case LaneType.SK_INT -> new Int128Vector.Int128Mask(maskArray).check(dsp);
|
||||
case LaneType.SK_LONG -> new Long128Vector.Long128Mask(maskArray).check(dsp);
|
||||
case LaneType.SK_FLOAT -> new Float128Vector.Float128Mask(maskArray).check(dsp);
|
||||
case LaneType.SK_DOUBLE -> new Double128Vector.Double128Mask(maskArray).check(dsp);
|
||||
default -> throw new AssertionError(dsp);
|
||||
};
|
||||
}
|
||||
|
||||
// Should not reach here.
|
||||
throw new AssertionError(species);
|
||||
@Override
|
||||
@ForceInline
|
||||
public <E> VectorMask<E> cast(VectorSpecies<E> dsp) {
|
||||
AbstractSpecies<E> species = (AbstractSpecies<E>) dsp;
|
||||
if (length() != species.laneCount())
|
||||
throw new IllegalArgumentException("VectorMask length and species length differ");
|
||||
if (VSIZE == species.vectorBitSize()) {
|
||||
Class<?> dtype = species.elementType();
|
||||
Class<?> dmtype = species.maskType();
|
||||
return VectorSupport.convert(VectorSupport.VECTOR_OP_REINTERPRET,
|
||||
this.getClass(), ETYPE, VLENGTH,
|
||||
dmtype, dtype, VLENGTH,
|
||||
this, species,
|
||||
Double128Mask::defaultMaskCast);
|
||||
}
|
||||
return this.defaultMaskCast(species);
|
||||
}
|
||||
|
||||
// Unary operations
|
||||
|
|
|
@ -571,31 +571,43 @@ final class Double256Vector extends DoubleVector {
|
|||
return (Double256Vector) super.toVectorTemplate(); // specialize
|
||||
}
|
||||
|
||||
@Override
|
||||
/**
|
||||
* Helper function for lane-wise mask conversions.
|
||||
* This function kicks in after intrinsic failure.
|
||||
*/
|
||||
@ForceInline
|
||||
public <E> VectorMask<E> cast(VectorSpecies<E> s) {
|
||||
AbstractSpecies<E> species = (AbstractSpecies<E>) s;
|
||||
if (length() != species.laneCount())
|
||||
throw new IllegalArgumentException("VectorMask length and species length differ");
|
||||
private final <E>
|
||||
VectorMask<E> defaultMaskCast(AbstractSpecies<E> dsp) {
|
||||
assert(length() == dsp.laneCount());
|
||||
boolean[] maskArray = toArray();
|
||||
// enum-switches don't optimize properly JDK-8161245
|
||||
switch (species.laneType.switchKey) {
|
||||
case LaneType.SK_BYTE:
|
||||
return new Byte256Vector.Byte256Mask(maskArray).check(species);
|
||||
case LaneType.SK_SHORT:
|
||||
return new Short256Vector.Short256Mask(maskArray).check(species);
|
||||
case LaneType.SK_INT:
|
||||
return new Int256Vector.Int256Mask(maskArray).check(species);
|
||||
case LaneType.SK_LONG:
|
||||
return new Long256Vector.Long256Mask(maskArray).check(species);
|
||||
case LaneType.SK_FLOAT:
|
||||
return new Float256Vector.Float256Mask(maskArray).check(species);
|
||||
case LaneType.SK_DOUBLE:
|
||||
return new Double256Vector.Double256Mask(maskArray).check(species);
|
||||
}
|
||||
return switch (dsp.laneType.switchKey) {
|
||||
case LaneType.SK_BYTE -> new Byte256Vector.Byte256Mask(maskArray).check(dsp);
|
||||
case LaneType.SK_SHORT -> new Short256Vector.Short256Mask(maskArray).check(dsp);
|
||||
case LaneType.SK_INT -> new Int256Vector.Int256Mask(maskArray).check(dsp);
|
||||
case LaneType.SK_LONG -> new Long256Vector.Long256Mask(maskArray).check(dsp);
|
||||
case LaneType.SK_FLOAT -> new Float256Vector.Float256Mask(maskArray).check(dsp);
|
||||
case LaneType.SK_DOUBLE -> new Double256Vector.Double256Mask(maskArray).check(dsp);
|
||||
default -> throw new AssertionError(dsp);
|
||||
};
|
||||
}
|
||||
|
||||
// Should not reach here.
|
||||
throw new AssertionError(species);
|
||||
@Override
|
||||
@ForceInline
|
||||
public <E> VectorMask<E> cast(VectorSpecies<E> dsp) {
|
||||
AbstractSpecies<E> species = (AbstractSpecies<E>) dsp;
|
||||
if (length() != species.laneCount())
|
||||
throw new IllegalArgumentException("VectorMask length and species length differ");
|
||||
if (VSIZE == species.vectorBitSize()) {
|
||||
Class<?> dtype = species.elementType();
|
||||
Class<?> dmtype = species.maskType();
|
||||
return VectorSupport.convert(VectorSupport.VECTOR_OP_REINTERPRET,
|
||||
this.getClass(), ETYPE, VLENGTH,
|
||||
dmtype, dtype, VLENGTH,
|
||||
this, species,
|
||||
Double256Mask::defaultMaskCast);
|
||||
}
|
||||
return this.defaultMaskCast(species);
|
||||
}
|
||||
|
||||
// Unary operations
|
||||
|
|
|
@ -579,31 +579,43 @@ final class Double512Vector extends DoubleVector {
|
|||
return (Double512Vector) super.toVectorTemplate(); // specialize
|
||||
}
|
||||
|
||||
@Override
|
||||
/**
|
||||
* Helper function for lane-wise mask conversions.
|
||||
* This function kicks in after intrinsic failure.
|
||||
*/
|
||||
@ForceInline
|
||||
public <E> VectorMask<E> cast(VectorSpecies<E> s) {
|
||||
AbstractSpecies<E> species = (AbstractSpecies<E>) s;
|
||||
if (length() != species.laneCount())
|
||||
throw new IllegalArgumentException("VectorMask length and species length differ");
|
||||
private final <E>
|
||||
VectorMask<E> defaultMaskCast(AbstractSpecies<E> dsp) {
|
||||
assert(length() == dsp.laneCount());
|
||||
boolean[] maskArray = toArray();
|
||||
// enum-switches don't optimize properly JDK-8161245
|
||||
switch (species.laneType.switchKey) {
|
||||
case LaneType.SK_BYTE:
|
||||
return new Byte512Vector.Byte512Mask(maskArray).check(species);
|
||||
case LaneType.SK_SHORT:
|
||||
return new Short512Vector.Short512Mask(maskArray).check(species);
|
||||
case LaneType.SK_INT:
|
||||
return new Int512Vector.Int512Mask(maskArray).check(species);
|
||||
case LaneType.SK_LONG:
|
||||
return new Long512Vector.Long512Mask(maskArray).check(species);
|
||||
case LaneType.SK_FLOAT:
|
||||
return new Float512Vector.Float512Mask(maskArray).check(species);
|
||||
case LaneType.SK_DOUBLE:
|
||||
return new Double512Vector.Double512Mask(maskArray).check(species);
|
||||
}
|
||||
return switch (dsp.laneType.switchKey) {
|
||||
case LaneType.SK_BYTE -> new Byte512Vector.Byte512Mask(maskArray).check(dsp);
|
||||
case LaneType.SK_SHORT -> new Short512Vector.Short512Mask(maskArray).check(dsp);
|
||||
case LaneType.SK_INT -> new Int512Vector.Int512Mask(maskArray).check(dsp);
|
||||
case LaneType.SK_LONG -> new Long512Vector.Long512Mask(maskArray).check(dsp);
|
||||
case LaneType.SK_FLOAT -> new Float512Vector.Float512Mask(maskArray).check(dsp);
|
||||
case LaneType.SK_DOUBLE -> new Double512Vector.Double512Mask(maskArray).check(dsp);
|
||||
default -> throw new AssertionError(dsp);
|
||||
};
|
||||
}
|
||||
|
||||
// Should not reach here.
|
||||
throw new AssertionError(species);
|
||||
@Override
|
||||
@ForceInline
|
||||
public <E> VectorMask<E> cast(VectorSpecies<E> dsp) {
|
||||
AbstractSpecies<E> species = (AbstractSpecies<E>) dsp;
|
||||
if (length() != species.laneCount())
|
||||
throw new IllegalArgumentException("VectorMask length and species length differ");
|
||||
if (VSIZE == species.vectorBitSize()) {
|
||||
Class<?> dtype = species.elementType();
|
||||
Class<?> dmtype = species.maskType();
|
||||
return VectorSupport.convert(VectorSupport.VECTOR_OP_REINTERPRET,
|
||||
this.getClass(), ETYPE, VLENGTH,
|
||||
dmtype, dtype, VLENGTH,
|
||||
this, species,
|
||||
Double512Mask::defaultMaskCast);
|
||||
}
|
||||
return this.defaultMaskCast(species);
|
||||
}
|
||||
|
||||
// Unary operations
|
||||
|
|
|
@ -565,31 +565,43 @@ final class Double64Vector extends DoubleVector {
|
|||
return (Double64Vector) super.toVectorTemplate(); // specialize
|
||||
}
|
||||
|
||||
@Override
|
||||
/**
|
||||
* Helper function for lane-wise mask conversions.
|
||||
* This function kicks in after intrinsic failure.
|
||||
*/
|
||||
@ForceInline
|
||||
public <E> VectorMask<E> cast(VectorSpecies<E> s) {
|
||||
AbstractSpecies<E> species = (AbstractSpecies<E>) s;
|
||||
if (length() != species.laneCount())
|
||||
throw new IllegalArgumentException("VectorMask length and species length differ");
|
||||
private final <E>
|
||||
VectorMask<E> defaultMaskCast(AbstractSpecies<E> dsp) {
|
||||
assert(length() == dsp.laneCount());
|
||||
boolean[] maskArray = toArray();
|
||||
// enum-switches don't optimize properly JDK-8161245
|
||||
switch (species.laneType.switchKey) {
|
||||
case LaneType.SK_BYTE:
|
||||
return new Byte64Vector.Byte64Mask(maskArray).check(species);
|
||||
case LaneType.SK_SHORT:
|
||||
return new Short64Vector.Short64Mask(maskArray).check(species);
|
||||
case LaneType.SK_INT:
|
||||
return new Int64Vector.Int64Mask(maskArray).check(species);
|
||||
case LaneType.SK_LONG:
|
||||
return new Long64Vector.Long64Mask(maskArray).check(species);
|
||||
case LaneType.SK_FLOAT:
|
||||
return new Float64Vector.Float64Mask(maskArray).check(species);
|
||||
case LaneType.SK_DOUBLE:
|
||||
return new Double64Vector.Double64Mask(maskArray).check(species);
|
||||
}
|
||||
return switch (dsp.laneType.switchKey) {
|
||||
case LaneType.SK_BYTE -> new Byte64Vector.Byte64Mask(maskArray).check(dsp);
|
||||
case LaneType.SK_SHORT -> new Short64Vector.Short64Mask(maskArray).check(dsp);
|
||||
case LaneType.SK_INT -> new Int64Vector.Int64Mask(maskArray).check(dsp);
|
||||
case LaneType.SK_LONG -> new Long64Vector.Long64Mask(maskArray).check(dsp);
|
||||
case LaneType.SK_FLOAT -> new Float64Vector.Float64Mask(maskArray).check(dsp);
|
||||
case LaneType.SK_DOUBLE -> new Double64Vector.Double64Mask(maskArray).check(dsp);
|
||||
default -> throw new AssertionError(dsp);
|
||||
};
|
||||
}
|
||||
|
||||
// Should not reach here.
|
||||
throw new AssertionError(species);
|
||||
@Override
|
||||
@ForceInline
|
||||
public <E> VectorMask<E> cast(VectorSpecies<E> dsp) {
|
||||
AbstractSpecies<E> species = (AbstractSpecies<E>) dsp;
|
||||
if (length() != species.laneCount())
|
||||
throw new IllegalArgumentException("VectorMask length and species length differ");
|
||||
if (VSIZE == species.vectorBitSize()) {
|
||||
Class<?> dtype = species.elementType();
|
||||
Class<?> dmtype = species.maskType();
|
||||
return VectorSupport.convert(VectorSupport.VECTOR_OP_REINTERPRET,
|
||||
this.getClass(), ETYPE, VLENGTH,
|
||||
dmtype, dtype, VLENGTH,
|
||||
this, species,
|
||||
Double64Mask::defaultMaskCast);
|
||||
}
|
||||
return this.defaultMaskCast(species);
|
||||
}
|
||||
|
||||
// Unary operations
|
||||
|
|
|
@ -564,31 +564,43 @@ final class DoubleMaxVector extends DoubleVector {
|
|||
return (DoubleMaxVector) super.toVectorTemplate(); // specialize
|
||||
}
|
||||
|
||||
@Override
|
||||
/**
|
||||
* Helper function for lane-wise mask conversions.
|
||||
* This function kicks in after intrinsic failure.
|
||||
*/
|
||||
@ForceInline
|
||||
public <E> VectorMask<E> cast(VectorSpecies<E> s) {
|
||||
AbstractSpecies<E> species = (AbstractSpecies<E>) s;
|
||||
if (length() != species.laneCount())
|
||||
throw new IllegalArgumentException("VectorMask length and species length differ");
|
||||
private final <E>
|
||||
VectorMask<E> defaultMaskCast(AbstractSpecies<E> dsp) {
|
||||
assert(length() == dsp.laneCount());
|
||||
boolean[] maskArray = toArray();
|
||||
// enum-switches don't optimize properly JDK-8161245
|
||||
switch (species.laneType.switchKey) {
|
||||
case LaneType.SK_BYTE:
|
||||
return new ByteMaxVector.ByteMaxMask(maskArray).check(species);
|
||||
case LaneType.SK_SHORT:
|
||||
return new ShortMaxVector.ShortMaxMask(maskArray).check(species);
|
||||
case LaneType.SK_INT:
|
||||
return new IntMaxVector.IntMaxMask(maskArray).check(species);
|
||||
case LaneType.SK_LONG:
|
||||
return new LongMaxVector.LongMaxMask(maskArray).check(species);
|
||||
case LaneType.SK_FLOAT:
|
||||
return new FloatMaxVector.FloatMaxMask(maskArray).check(species);
|
||||
case LaneType.SK_DOUBLE:
|
||||
return new DoubleMaxVector.DoubleMaxMask(maskArray).check(species);
|
||||
}
|
||||
return switch (dsp.laneType.switchKey) {
|
||||
case LaneType.SK_BYTE -> new ByteMaxVector.ByteMaxMask(maskArray).check(dsp);
|
||||
case LaneType.SK_SHORT -> new ShortMaxVector.ShortMaxMask(maskArray).check(dsp);
|
||||
case LaneType.SK_INT -> new IntMaxVector.IntMaxMask(maskArray).check(dsp);
|
||||
case LaneType.SK_LONG -> new LongMaxVector.LongMaxMask(maskArray).check(dsp);
|
||||
case LaneType.SK_FLOAT -> new FloatMaxVector.FloatMaxMask(maskArray).check(dsp);
|
||||
case LaneType.SK_DOUBLE -> new DoubleMaxVector.DoubleMaxMask(maskArray).check(dsp);
|
||||
default -> throw new AssertionError(dsp);
|
||||
};
|
||||
}
|
||||
|
||||
// Should not reach here.
|
||||
throw new AssertionError(species);
|
||||
@Override
|
||||
@ForceInline
|
||||
public <E> VectorMask<E> cast(VectorSpecies<E> dsp) {
|
||||
AbstractSpecies<E> species = (AbstractSpecies<E>) dsp;
|
||||
if (length() != species.laneCount())
|
||||
throw new IllegalArgumentException("VectorMask length and species length differ");
|
||||
if (VSIZE == species.vectorBitSize()) {
|
||||
Class<?> dtype = species.elementType();
|
||||
Class<?> dmtype = species.maskType();
|
||||
return VectorSupport.convert(VectorSupport.VECTOR_OP_REINTERPRET,
|
||||
this.getClass(), ETYPE, VLENGTH,
|
||||
dmtype, dtype, VLENGTH,
|
||||
this, species,
|
||||
DoubleMaxMask::defaultMaskCast);
|
||||
}
|
||||
return this.defaultMaskCast(species);
|
||||
}
|
||||
|
||||
// Unary operations
|
||||
|
|
|
@ -571,31 +571,43 @@ final class Float128Vector extends FloatVector {
|
|||
return (Float128Vector) super.toVectorTemplate(); // specialize
|
||||
}
|
||||
|
||||
@Override
|
||||
/**
|
||||
* Helper function for lane-wise mask conversions.
|
||||
* This function kicks in after intrinsic failure.
|
||||
*/
|
||||
@ForceInline
|
||||
public <E> VectorMask<E> cast(VectorSpecies<E> s) {
|
||||
AbstractSpecies<E> species = (AbstractSpecies<E>) s;
|
||||
if (length() != species.laneCount())
|
||||
throw new IllegalArgumentException("VectorMask length and species length differ");
|
||||
private final <E>
|
||||
VectorMask<E> defaultMaskCast(AbstractSpecies<E> dsp) {
|
||||
assert(length() == dsp.laneCount());
|
||||
boolean[] maskArray = toArray();
|
||||
// enum-switches don't optimize properly JDK-8161245
|
||||
switch (species.laneType.switchKey) {
|
||||
case LaneType.SK_BYTE:
|
||||
return new Byte128Vector.Byte128Mask(maskArray).check(species);
|
||||
case LaneType.SK_SHORT:
|
||||
return new Short128Vector.Short128Mask(maskArray).check(species);
|
||||
case LaneType.SK_INT:
|
||||
return new Int128Vector.Int128Mask(maskArray).check(species);
|
||||
case LaneType.SK_LONG:
|
||||
return new Long128Vector.Long128Mask(maskArray).check(species);
|
||||
case LaneType.SK_FLOAT:
|
||||
return new Float128Vector.Float128Mask(maskArray).check(species);
|
||||
case LaneType.SK_DOUBLE:
|
||||
return new Double128Vector.Double128Mask(maskArray).check(species);
|
||||
}
|
||||
return switch (dsp.laneType.switchKey) {
|
||||
case LaneType.SK_BYTE -> new Byte128Vector.Byte128Mask(maskArray).check(dsp);
|
||||
case LaneType.SK_SHORT -> new Short128Vector.Short128Mask(maskArray).check(dsp);
|
||||
case LaneType.SK_INT -> new Int128Vector.Int128Mask(maskArray).check(dsp);
|
||||
case LaneType.SK_LONG -> new Long128Vector.Long128Mask(maskArray).check(dsp);
|
||||
case LaneType.SK_FLOAT -> new Float128Vector.Float128Mask(maskArray).check(dsp);
|
||||
case LaneType.SK_DOUBLE -> new Double128Vector.Double128Mask(maskArray).check(dsp);
|
||||
default -> throw new AssertionError(dsp);
|
||||
};
|
||||
}
|
||||
|
||||
// Should not reach here.
|
||||
throw new AssertionError(species);
|
||||
@Override
|
||||
@ForceInline
|
||||
public <E> VectorMask<E> cast(VectorSpecies<E> dsp) {
|
||||
AbstractSpecies<E> species = (AbstractSpecies<E>) dsp;
|
||||
if (length() != species.laneCount())
|
||||
throw new IllegalArgumentException("VectorMask length and species length differ");
|
||||
if (VSIZE == species.vectorBitSize()) {
|
||||
Class<?> dtype = species.elementType();
|
||||
Class<?> dmtype = species.maskType();
|
||||
return VectorSupport.convert(VectorSupport.VECTOR_OP_REINTERPRET,
|
||||
this.getClass(), ETYPE, VLENGTH,
|
||||
dmtype, dtype, VLENGTH,
|
||||
this, species,
|
||||
Float128Mask::defaultMaskCast);
|
||||
}
|
||||
return this.defaultMaskCast(species);
|
||||
}
|
||||
|
||||
// Unary operations
|
||||
|
|
|
@ -579,31 +579,43 @@ final class Float256Vector extends FloatVector {
|
|||
return (Float256Vector) super.toVectorTemplate(); // specialize
|
||||
}
|
||||
|
||||
@Override
|
||||
/**
|
||||
* Helper function for lane-wise mask conversions.
|
||||
* This function kicks in after intrinsic failure.
|
||||
*/
|
||||
@ForceInline
|
||||
public <E> VectorMask<E> cast(VectorSpecies<E> s) {
|
||||
AbstractSpecies<E> species = (AbstractSpecies<E>) s;
|
||||
if (length() != species.laneCount())
|
||||
throw new IllegalArgumentException("VectorMask length and species length differ");
|
||||
private final <E>
|
||||
VectorMask<E> defaultMaskCast(AbstractSpecies<E> dsp) {
|
||||
assert(length() == dsp.laneCount());
|
||||
boolean[] maskArray = toArray();
|
||||
// enum-switches don't optimize properly JDK-8161245
|
||||
switch (species.laneType.switchKey) {
|
||||
case LaneType.SK_BYTE:
|
||||
return new Byte256Vector.Byte256Mask(maskArray).check(species);
|
||||
case LaneType.SK_SHORT:
|
||||
return new Short256Vector.Short256Mask(maskArray).check(species);
|
||||
case LaneType.SK_INT:
|
||||
return new Int256Vector.Int256Mask(maskArray).check(species);
|
||||
case LaneType.SK_LONG:
|
||||
return new Long256Vector.Long256Mask(maskArray).check(species);
|
||||
case LaneType.SK_FLOAT:
|
||||
return new Float256Vector.Float256Mask(maskArray).check(species);
|
||||
case LaneType.SK_DOUBLE:
|
||||
return new Double256Vector.Double256Mask(maskArray).check(species);
|
||||
}
|
||||
return switch (dsp.laneType.switchKey) {
|
||||
case LaneType.SK_BYTE -> new Byte256Vector.Byte256Mask(maskArray).check(dsp);
|
||||
case LaneType.SK_SHORT -> new Short256Vector.Short256Mask(maskArray).check(dsp);
|
||||
case LaneType.SK_INT -> new Int256Vector.Int256Mask(maskArray).check(dsp);
|
||||
case LaneType.SK_LONG -> new Long256Vector.Long256Mask(maskArray).check(dsp);
|
||||
case LaneType.SK_FLOAT -> new Float256Vector.Float256Mask(maskArray).check(dsp);
|
||||
case LaneType.SK_DOUBLE -> new Double256Vector.Double256Mask(maskArray).check(dsp);
|
||||
default -> throw new AssertionError(dsp);
|
||||
};
|
||||
}
|
||||
|
||||
// Should not reach here.
|
||||
throw new AssertionError(species);
|
||||
@Override
|
||||
@ForceInline
|
||||
public <E> VectorMask<E> cast(VectorSpecies<E> dsp) {
|
||||
AbstractSpecies<E> species = (AbstractSpecies<E>) dsp;
|
||||
if (length() != species.laneCount())
|
||||
throw new IllegalArgumentException("VectorMask length and species length differ");
|
||||
if (VSIZE == species.vectorBitSize()) {
|
||||
Class<?> dtype = species.elementType();
|
||||
Class<?> dmtype = species.maskType();
|
||||
return VectorSupport.convert(VectorSupport.VECTOR_OP_REINTERPRET,
|
||||
this.getClass(), ETYPE, VLENGTH,
|
||||
dmtype, dtype, VLENGTH,
|
||||
this, species,
|
||||
Float256Mask::defaultMaskCast);
|
||||
}
|
||||
return this.defaultMaskCast(species);
|
||||
}
|
||||
|
||||
// Unary operations
|
||||
|
|
|
@ -595,31 +595,43 @@ final class Float512Vector extends FloatVector {
|
|||
return (Float512Vector) super.toVectorTemplate(); // specialize
|
||||
}
|
||||
|
||||
@Override
|
||||
/**
|
||||
* Helper function for lane-wise mask conversions.
|
||||
* This function kicks in after intrinsic failure.
|
||||
*/
|
||||
@ForceInline
|
||||
public <E> VectorMask<E> cast(VectorSpecies<E> s) {
|
||||
AbstractSpecies<E> species = (AbstractSpecies<E>) s;
|
||||
if (length() != species.laneCount())
|
||||
throw new IllegalArgumentException("VectorMask length and species length differ");
|
||||
private final <E>
|
||||
VectorMask<E> defaultMaskCast(AbstractSpecies<E> dsp) {
|
||||
assert(length() == dsp.laneCount());
|
||||
boolean[] maskArray = toArray();
|
||||
// enum-switches don't optimize properly JDK-8161245
|
||||
switch (species.laneType.switchKey) {
|
||||
case LaneType.SK_BYTE:
|
||||
return new Byte512Vector.Byte512Mask(maskArray).check(species);
|
||||
case LaneType.SK_SHORT:
|
||||
return new Short512Vector.Short512Mask(maskArray).check(species);
|
||||
case LaneType.SK_INT:
|
||||
return new Int512Vector.Int512Mask(maskArray).check(species);
|
||||
case LaneType.SK_LONG:
|
||||
return new Long512Vector.Long512Mask(maskArray).check(species);
|
||||
case LaneType.SK_FLOAT:
|
||||
return new Float512Vector.Float512Mask(maskArray).check(species);
|
||||
case LaneType.SK_DOUBLE:
|
||||
return new Double512Vector.Double512Mask(maskArray).check(species);
|
||||
}
|
||||
return switch (dsp.laneType.switchKey) {
|
||||
case LaneType.SK_BYTE -> new Byte512Vector.Byte512Mask(maskArray).check(dsp);
|
||||
case LaneType.SK_SHORT -> new Short512Vector.Short512Mask(maskArray).check(dsp);
|
||||
case LaneType.SK_INT -> new Int512Vector.Int512Mask(maskArray).check(dsp);
|
||||
case LaneType.SK_LONG -> new Long512Vector.Long512Mask(maskArray).check(dsp);
|
||||
case LaneType.SK_FLOAT -> new Float512Vector.Float512Mask(maskArray).check(dsp);
|
||||
case LaneType.SK_DOUBLE -> new Double512Vector.Double512Mask(maskArray).check(dsp);
|
||||
default -> throw new AssertionError(dsp);
|
||||
};
|
||||
}
|
||||
|
||||
// Should not reach here.
|
||||
throw new AssertionError(species);
|
||||
@Override
|
||||
@ForceInline
|
||||
public <E> VectorMask<E> cast(VectorSpecies<E> dsp) {
|
||||
AbstractSpecies<E> species = (AbstractSpecies<E>) dsp;
|
||||
if (length() != species.laneCount())
|
||||
throw new IllegalArgumentException("VectorMask length and species length differ");
|
||||
if (VSIZE == species.vectorBitSize()) {
|
||||
Class<?> dtype = species.elementType();
|
||||
Class<?> dmtype = species.maskType();
|
||||
return VectorSupport.convert(VectorSupport.VECTOR_OP_REINTERPRET,
|
||||
this.getClass(), ETYPE, VLENGTH,
|
||||
dmtype, dtype, VLENGTH,
|
||||
this, species,
|
||||
Float512Mask::defaultMaskCast);
|
||||
}
|
||||
return this.defaultMaskCast(species);
|
||||
}
|
||||
|
||||
// Unary operations
|
||||
|
|
|
@ -567,31 +567,43 @@ final class Float64Vector extends FloatVector {
|
|||
return (Float64Vector) super.toVectorTemplate(); // specialize
|
||||
}
|
||||
|
||||
@Override
|
||||
/**
|
||||
* Helper function for lane-wise mask conversions.
|
||||
* This function kicks in after intrinsic failure.
|
||||
*/
|
||||
@ForceInline
|
||||
public <E> VectorMask<E> cast(VectorSpecies<E> s) {
|
||||
AbstractSpecies<E> species = (AbstractSpecies<E>) s;
|
||||
if (length() != species.laneCount())
|
||||
throw new IllegalArgumentException("VectorMask length and species length differ");
|
||||
private final <E>
|
||||
VectorMask<E> defaultMaskCast(AbstractSpecies<E> dsp) {
|
||||
assert(length() == dsp.laneCount());
|
||||
boolean[] maskArray = toArray();
|
||||
// enum-switches don't optimize properly JDK-8161245
|
||||
switch (species.laneType.switchKey) {
|
||||
case LaneType.SK_BYTE:
|
||||
return new Byte64Vector.Byte64Mask(maskArray).check(species);
|
||||
case LaneType.SK_SHORT:
|
||||
return new Short64Vector.Short64Mask(maskArray).check(species);
|
||||
case LaneType.SK_INT:
|
||||
return new Int64Vector.Int64Mask(maskArray).check(species);
|
||||
case LaneType.SK_LONG:
|
||||
return new Long64Vector.Long64Mask(maskArray).check(species);
|
||||
case LaneType.SK_FLOAT:
|
||||
return new Float64Vector.Float64Mask(maskArray).check(species);
|
||||
case LaneType.SK_DOUBLE:
|
||||
return new Double64Vector.Double64Mask(maskArray).check(species);
|
||||
}
|
||||
return switch (dsp.laneType.switchKey) {
|
||||
case LaneType.SK_BYTE -> new Byte64Vector.Byte64Mask(maskArray).check(dsp);
|
||||
case LaneType.SK_SHORT -> new Short64Vector.Short64Mask(maskArray).check(dsp);
|
||||
case LaneType.SK_INT -> new Int64Vector.Int64Mask(maskArray).check(dsp);
|
||||
case LaneType.SK_LONG -> new Long64Vector.Long64Mask(maskArray).check(dsp);
|
||||
case LaneType.SK_FLOAT -> new Float64Vector.Float64Mask(maskArray).check(dsp);
|
||||
case LaneType.SK_DOUBLE -> new Double64Vector.Double64Mask(maskArray).check(dsp);
|
||||
default -> throw new AssertionError(dsp);
|
||||
};
|
||||
}
|
||||
|
||||
// Should not reach here.
|
||||
throw new AssertionError(species);
|
||||
@Override
|
||||
@ForceInline
|
||||
public <E> VectorMask<E> cast(VectorSpecies<E> dsp) {
|
||||
AbstractSpecies<E> species = (AbstractSpecies<E>) dsp;
|
||||
if (length() != species.laneCount())
|
||||
throw new IllegalArgumentException("VectorMask length and species length differ");
|
||||
if (VSIZE == species.vectorBitSize()) {
|
||||
Class<?> dtype = species.elementType();
|
||||
Class<?> dmtype = species.maskType();
|
||||
return VectorSupport.convert(VectorSupport.VECTOR_OP_REINTERPRET,
|
||||
this.getClass(), ETYPE, VLENGTH,
|
||||
dmtype, dtype, VLENGTH,
|
||||
this, species,
|
||||
Float64Mask::defaultMaskCast);
|
||||
}
|
||||
return this.defaultMaskCast(species);
|
||||
}
|
||||
|
||||
// Unary operations
|
||||
|
|
|
@ -564,31 +564,43 @@ final class FloatMaxVector extends FloatVector {
|
|||
return (FloatMaxVector) super.toVectorTemplate(); // specialize
|
||||
}
|
||||
|
||||
@Override
|
||||
/**
|
||||
* Helper function for lane-wise mask conversions.
|
||||
* This function kicks in after intrinsic failure.
|
||||
*/
|
||||
@ForceInline
|
||||
public <E> VectorMask<E> cast(VectorSpecies<E> s) {
|
||||
AbstractSpecies<E> species = (AbstractSpecies<E>) s;
|
||||
if (length() != species.laneCount())
|
||||
throw new IllegalArgumentException("VectorMask length and species length differ");
|
||||
private final <E>
|
||||
VectorMask<E> defaultMaskCast(AbstractSpecies<E> dsp) {
|
||||
assert(length() == dsp.laneCount());
|
||||
boolean[] maskArray = toArray();
|
||||
// enum-switches don't optimize properly JDK-8161245
|
||||
switch (species.laneType.switchKey) {
|
||||
case LaneType.SK_BYTE:
|
||||
return new ByteMaxVector.ByteMaxMask(maskArray).check(species);
|
||||
case LaneType.SK_SHORT:
|
||||
return new ShortMaxVector.ShortMaxMask(maskArray).check(species);
|
||||
case LaneType.SK_INT:
|
||||
return new IntMaxVector.IntMaxMask(maskArray).check(species);
|
||||
case LaneType.SK_LONG:
|
||||
return new LongMaxVector.LongMaxMask(maskArray).check(species);
|
||||
case LaneType.SK_FLOAT:
|
||||
return new FloatMaxVector.FloatMaxMask(maskArray).check(species);
|
||||
case LaneType.SK_DOUBLE:
|
||||
return new DoubleMaxVector.DoubleMaxMask(maskArray).check(species);
|
||||
}
|
||||
return switch (dsp.laneType.switchKey) {
|
||||
case LaneType.SK_BYTE -> new ByteMaxVector.ByteMaxMask(maskArray).check(dsp);
|
||||
case LaneType.SK_SHORT -> new ShortMaxVector.ShortMaxMask(maskArray).check(dsp);
|
||||
case LaneType.SK_INT -> new IntMaxVector.IntMaxMask(maskArray).check(dsp);
|
||||
case LaneType.SK_LONG -> new LongMaxVector.LongMaxMask(maskArray).check(dsp);
|
||||
case LaneType.SK_FLOAT -> new FloatMaxVector.FloatMaxMask(maskArray).check(dsp);
|
||||
case LaneType.SK_DOUBLE -> new DoubleMaxVector.DoubleMaxMask(maskArray).check(dsp);
|
||||
default -> throw new AssertionError(dsp);
|
||||
};
|
||||
}
|
||||
|
||||
// Should not reach here.
|
||||
throw new AssertionError(species);
|
||||
@Override
|
||||
@ForceInline
|
||||
public <E> VectorMask<E> cast(VectorSpecies<E> dsp) {
|
||||
AbstractSpecies<E> species = (AbstractSpecies<E>) dsp;
|
||||
if (length() != species.laneCount())
|
||||
throw new IllegalArgumentException("VectorMask length and species length differ");
|
||||
if (VSIZE == species.vectorBitSize()) {
|
||||
Class<?> dtype = species.elementType();
|
||||
Class<?> dmtype = species.maskType();
|
||||
return VectorSupport.convert(VectorSupport.VECTOR_OP_REINTERPRET,
|
||||
this.getClass(), ETYPE, VLENGTH,
|
||||
dmtype, dtype, VLENGTH,
|
||||
this, species,
|
||||
FloatMaxMask::defaultMaskCast);
|
||||
}
|
||||
return this.defaultMaskCast(species);
|
||||
}
|
||||
|
||||
// Unary operations
|
||||
|
|
|
@ -575,31 +575,43 @@ final class Int128Vector extends IntVector {
|
|||
return (Int128Vector) super.toVectorTemplate(); // specialize
|
||||
}
|
||||
|
||||
@Override
|
||||
/**
|
||||
* Helper function for lane-wise mask conversions.
|
||||
* This function kicks in after intrinsic failure.
|
||||
*/
|
||||
@ForceInline
|
||||
public <E> VectorMask<E> cast(VectorSpecies<E> s) {
|
||||
AbstractSpecies<E> species = (AbstractSpecies<E>) s;
|
||||
if (length() != species.laneCount())
|
||||
throw new IllegalArgumentException("VectorMask length and species length differ");
|
||||
private final <E>
|
||||
VectorMask<E> defaultMaskCast(AbstractSpecies<E> dsp) {
|
||||
assert(length() == dsp.laneCount());
|
||||
boolean[] maskArray = toArray();
|
||||
// enum-switches don't optimize properly JDK-8161245
|
||||
switch (species.laneType.switchKey) {
|
||||
case LaneType.SK_BYTE:
|
||||
return new Byte128Vector.Byte128Mask(maskArray).check(species);
|
||||
case LaneType.SK_SHORT:
|
||||
return new Short128Vector.Short128Mask(maskArray).check(species);
|
||||
case LaneType.SK_INT:
|
||||
return new Int128Vector.Int128Mask(maskArray).check(species);
|
||||
case LaneType.SK_LONG:
|
||||
return new Long128Vector.Long128Mask(maskArray).check(species);
|
||||
case LaneType.SK_FLOAT:
|
||||
return new Float128Vector.Float128Mask(maskArray).check(species);
|
||||
case LaneType.SK_DOUBLE:
|
||||
return new Double128Vector.Double128Mask(maskArray).check(species);
|
||||
}
|
||||
return switch (dsp.laneType.switchKey) {
|
||||
case LaneType.SK_BYTE -> new Byte128Vector.Byte128Mask(maskArray).check(dsp);
|
||||
case LaneType.SK_SHORT -> new Short128Vector.Short128Mask(maskArray).check(dsp);
|
||||
case LaneType.SK_INT -> new Int128Vector.Int128Mask(maskArray).check(dsp);
|
||||
case LaneType.SK_LONG -> new Long128Vector.Long128Mask(maskArray).check(dsp);
|
||||
case LaneType.SK_FLOAT -> new Float128Vector.Float128Mask(maskArray).check(dsp);
|
||||
case LaneType.SK_DOUBLE -> new Double128Vector.Double128Mask(maskArray).check(dsp);
|
||||
default -> throw new AssertionError(dsp);
|
||||
};
|
||||
}
|
||||
|
||||
// Should not reach here.
|
||||
throw new AssertionError(species);
|
||||
@Override
|
||||
@ForceInline
|
||||
public <E> VectorMask<E> cast(VectorSpecies<E> dsp) {
|
||||
AbstractSpecies<E> species = (AbstractSpecies<E>) dsp;
|
||||
if (length() != species.laneCount())
|
||||
throw new IllegalArgumentException("VectorMask length and species length differ");
|
||||
if (VSIZE == species.vectorBitSize()) {
|
||||
Class<?> dtype = species.elementType();
|
||||
Class<?> dmtype = species.maskType();
|
||||
return VectorSupport.convert(VectorSupport.VECTOR_OP_REINTERPRET,
|
||||
this.getClass(), ETYPE, VLENGTH,
|
||||
dmtype, dtype, VLENGTH,
|
||||
this, species,
|
||||
Int128Mask::defaultMaskCast);
|
||||
}
|
||||
return this.defaultMaskCast(species);
|
||||
}
|
||||
|
||||
// Unary operations
|
||||
|
|
|
@ -583,31 +583,43 @@ final class Int256Vector extends IntVector {
|
|||
return (Int256Vector) super.toVectorTemplate(); // specialize
|
||||
}
|
||||
|
||||
@Override
|
||||
/**
|
||||
* Helper function for lane-wise mask conversions.
|
||||
* This function kicks in after intrinsic failure.
|
||||
*/
|
||||
@ForceInline
|
||||
public <E> VectorMask<E> cast(VectorSpecies<E> s) {
|
||||
AbstractSpecies<E> species = (AbstractSpecies<E>) s;
|
||||
if (length() != species.laneCount())
|
||||
throw new IllegalArgumentException("VectorMask length and species length differ");
|
||||
private final <E>
|
||||
VectorMask<E> defaultMaskCast(AbstractSpecies<E> dsp) {
|
||||
assert(length() == dsp.laneCount());
|
||||
boolean[] maskArray = toArray();
|
||||
// enum-switches don't optimize properly JDK-8161245
|
||||
switch (species.laneType.switchKey) {
|
||||
case LaneType.SK_BYTE:
|
||||
return new Byte256Vector.Byte256Mask(maskArray).check(species);
|
||||
case LaneType.SK_SHORT:
|
||||
return new Short256Vector.Short256Mask(maskArray).check(species);
|
||||
case LaneType.SK_INT:
|
||||
return new Int256Vector.Int256Mask(maskArray).check(species);
|
||||
case LaneType.SK_LONG:
|
||||
return new Long256Vector.Long256Mask(maskArray).check(species);
|
||||
case LaneType.SK_FLOAT:
|
||||
return new Float256Vector.Float256Mask(maskArray).check(species);
|
||||
case LaneType.SK_DOUBLE:
|
||||
return new Double256Vector.Double256Mask(maskArray).check(species);
|
||||
}
|
||||
return switch (dsp.laneType.switchKey) {
|
||||
case LaneType.SK_BYTE -> new Byte256Vector.Byte256Mask(maskArray).check(dsp);
|
||||
case LaneType.SK_SHORT -> new Short256Vector.Short256Mask(maskArray).check(dsp);
|
||||
case LaneType.SK_INT -> new Int256Vector.Int256Mask(maskArray).check(dsp);
|
||||
case LaneType.SK_LONG -> new Long256Vector.Long256Mask(maskArray).check(dsp);
|
||||
case LaneType.SK_FLOAT -> new Float256Vector.Float256Mask(maskArray).check(dsp);
|
||||
case LaneType.SK_DOUBLE -> new Double256Vector.Double256Mask(maskArray).check(dsp);
|
||||
default -> throw new AssertionError(dsp);
|
||||
};
|
||||
}
|
||||
|
||||
// Should not reach here.
|
||||
throw new AssertionError(species);
|
||||
@Override
|
||||
@ForceInline
|
||||
public <E> VectorMask<E> cast(VectorSpecies<E> dsp) {
|
||||
AbstractSpecies<E> species = (AbstractSpecies<E>) dsp;
|
||||
if (length() != species.laneCount())
|
||||
throw new IllegalArgumentException("VectorMask length and species length differ");
|
||||
if (VSIZE == species.vectorBitSize()) {
|
||||
Class<?> dtype = species.elementType();
|
||||
Class<?> dmtype = species.maskType();
|
||||
return VectorSupport.convert(VectorSupport.VECTOR_OP_REINTERPRET,
|
||||
this.getClass(), ETYPE, VLENGTH,
|
||||
dmtype, dtype, VLENGTH,
|
||||
this, species,
|
||||
Int256Mask::defaultMaskCast);
|
||||
}
|
||||
return this.defaultMaskCast(species);
|
||||
}
|
||||
|
||||
// Unary operations
|
||||
|
|
|
@ -599,31 +599,43 @@ final class Int512Vector extends IntVector {
|
|||
return (Int512Vector) super.toVectorTemplate(); // specialize
|
||||
}
|
||||
|
||||
@Override
|
||||
/**
|
||||
* Helper function for lane-wise mask conversions.
|
||||
* This function kicks in after intrinsic failure.
|
||||
*/
|
||||
@ForceInline
|
||||
public <E> VectorMask<E> cast(VectorSpecies<E> s) {
|
||||
AbstractSpecies<E> species = (AbstractSpecies<E>) s;
|
||||
if (length() != species.laneCount())
|
||||
throw new IllegalArgumentException("VectorMask length and species length differ");
|
||||
private final <E>
|
||||
VectorMask<E> defaultMaskCast(AbstractSpecies<E> dsp) {
|
||||
assert(length() == dsp.laneCount());
|
||||
boolean[] maskArray = toArray();
|
||||
// enum-switches don't optimize properly JDK-8161245
|
||||
switch (species.laneType.switchKey) {
|
||||
case LaneType.SK_BYTE:
|
||||
return new Byte512Vector.Byte512Mask(maskArray).check(species);
|
||||
case LaneType.SK_SHORT:
|
||||
return new Short512Vector.Short512Mask(maskArray).check(species);
|
||||
case LaneType.SK_INT:
|
||||
return new Int512Vector.Int512Mask(maskArray).check(species);
|
||||
case LaneType.SK_LONG:
|
||||
return new Long512Vector.Long512Mask(maskArray).check(species);
|
||||
case LaneType.SK_FLOAT:
|
||||
return new Float512Vector.Float512Mask(maskArray).check(species);
|
||||
case LaneType.SK_DOUBLE:
|
||||
return new Double512Vector.Double512Mask(maskArray).check(species);
|
||||
}
|
||||
return switch (dsp.laneType.switchKey) {
|
||||
case LaneType.SK_BYTE -> new Byte512Vector.Byte512Mask(maskArray).check(dsp);
|
||||
case LaneType.SK_SHORT -> new Short512Vector.Short512Mask(maskArray).check(dsp);
|
||||
case LaneType.SK_INT -> new Int512Vector.Int512Mask(maskArray).check(dsp);
|
||||
case LaneType.SK_LONG -> new Long512Vector.Long512Mask(maskArray).check(dsp);
|
||||
case LaneType.SK_FLOAT -> new Float512Vector.Float512Mask(maskArray).check(dsp);
|
||||
case LaneType.SK_DOUBLE -> new Double512Vector.Double512Mask(maskArray).check(dsp);
|
||||
default -> throw new AssertionError(dsp);
|
||||
};
|
||||
}
|
||||
|
||||
// Should not reach here.
|
||||
throw new AssertionError(species);
|
||||
@Override
|
||||
@ForceInline
|
||||
public <E> VectorMask<E> cast(VectorSpecies<E> dsp) {
|
||||
AbstractSpecies<E> species = (AbstractSpecies<E>) dsp;
|
||||
if (length() != species.laneCount())
|
||||
throw new IllegalArgumentException("VectorMask length and species length differ");
|
||||
if (VSIZE == species.vectorBitSize()) {
|
||||
Class<?> dtype = species.elementType();
|
||||
Class<?> dmtype = species.maskType();
|
||||
return VectorSupport.convert(VectorSupport.VECTOR_OP_REINTERPRET,
|
||||
this.getClass(), ETYPE, VLENGTH,
|
||||
dmtype, dtype, VLENGTH,
|
||||
this, species,
|
||||
Int512Mask::defaultMaskCast);
|
||||
}
|
||||
return this.defaultMaskCast(species);
|
||||
}
|
||||
|
||||
// Unary operations
|
||||
|
|
|
@ -571,31 +571,43 @@ final class Int64Vector extends IntVector {
|
|||
return (Int64Vector) super.toVectorTemplate(); // specialize
|
||||
}
|
||||
|
||||
@Override
|
||||
/**
|
||||
* Helper function for lane-wise mask conversions.
|
||||
* This function kicks in after intrinsic failure.
|
||||
*/
|
||||
@ForceInline
|
||||
public <E> VectorMask<E> cast(VectorSpecies<E> s) {
|
||||
AbstractSpecies<E> species = (AbstractSpecies<E>) s;
|
||||
if (length() != species.laneCount())
|
||||
throw new IllegalArgumentException("VectorMask length and species length differ");
|
||||
private final <E>
|
||||
VectorMask<E> defaultMaskCast(AbstractSpecies<E> dsp) {
|
||||
assert(length() == dsp.laneCount());
|
||||
boolean[] maskArray = toArray();
|
||||
// enum-switches don't optimize properly JDK-8161245
|
||||
switch (species.laneType.switchKey) {
|
||||
case LaneType.SK_BYTE:
|
||||
return new Byte64Vector.Byte64Mask(maskArray).check(species);
|
||||
case LaneType.SK_SHORT:
|
||||
return new Short64Vector.Short64Mask(maskArray).check(species);
|
||||
case LaneType.SK_INT:
|
||||
return new Int64Vector.Int64Mask(maskArray).check(species);
|
||||
case LaneType.SK_LONG:
|
||||
return new Long64Vector.Long64Mask(maskArray).check(species);
|
||||
case LaneType.SK_FLOAT:
|
||||
return new Float64Vector.Float64Mask(maskArray).check(species);
|
||||
case LaneType.SK_DOUBLE:
|
||||
return new Double64Vector.Double64Mask(maskArray).check(species);
|
||||
}
|
||||
return switch (dsp.laneType.switchKey) {
|
||||
case LaneType.SK_BYTE -> new Byte64Vector.Byte64Mask(maskArray).check(dsp);
|
||||
case LaneType.SK_SHORT -> new Short64Vector.Short64Mask(maskArray).check(dsp);
|
||||
case LaneType.SK_INT -> new Int64Vector.Int64Mask(maskArray).check(dsp);
|
||||
case LaneType.SK_LONG -> new Long64Vector.Long64Mask(maskArray).check(dsp);
|
||||
case LaneType.SK_FLOAT -> new Float64Vector.Float64Mask(maskArray).check(dsp);
|
||||
case LaneType.SK_DOUBLE -> new Double64Vector.Double64Mask(maskArray).check(dsp);
|
||||
default -> throw new AssertionError(dsp);
|
||||
};
|
||||
}
|
||||
|
||||
// Should not reach here.
|
||||
throw new AssertionError(species);
|
||||
@Override
|
||||
@ForceInline
|
||||
public <E> VectorMask<E> cast(VectorSpecies<E> dsp) {
|
||||
AbstractSpecies<E> species = (AbstractSpecies<E>) dsp;
|
||||
if (length() != species.laneCount())
|
||||
throw new IllegalArgumentException("VectorMask length and species length differ");
|
||||
if (VSIZE == species.vectorBitSize()) {
|
||||
Class<?> dtype = species.elementType();
|
||||
Class<?> dmtype = species.maskType();
|
||||
return VectorSupport.convert(VectorSupport.VECTOR_OP_REINTERPRET,
|
||||
this.getClass(), ETYPE, VLENGTH,
|
||||
dmtype, dtype, VLENGTH,
|
||||
this, species,
|
||||
Int64Mask::defaultMaskCast);
|
||||
}
|
||||
return this.defaultMaskCast(species);
|
||||
}
|
||||
|
||||
// Unary operations
|
||||
|
|
|
@ -569,31 +569,43 @@ final class IntMaxVector extends IntVector {
|
|||
return (IntMaxVector) super.toVectorTemplate(); // specialize
|
||||
}
|
||||
|
||||
@Override
|
||||
/**
|
||||
* Helper function for lane-wise mask conversions.
|
||||
* This function kicks in after intrinsic failure.
|
||||
*/
|
||||
@ForceInline
|
||||
public <E> VectorMask<E> cast(VectorSpecies<E> s) {
|
||||
AbstractSpecies<E> species = (AbstractSpecies<E>) s;
|
||||
if (length() != species.laneCount())
|
||||
throw new IllegalArgumentException("VectorMask length and species length differ");
|
||||
private final <E>
|
||||
VectorMask<E> defaultMaskCast(AbstractSpecies<E> dsp) {
|
||||
assert(length() == dsp.laneCount());
|
||||
boolean[] maskArray = toArray();
|
||||
// enum-switches don't optimize properly JDK-8161245
|
||||
switch (species.laneType.switchKey) {
|
||||
case LaneType.SK_BYTE:
|
||||
return new ByteMaxVector.ByteMaxMask(maskArray).check(species);
|
||||
case LaneType.SK_SHORT:
|
||||
return new ShortMaxVector.ShortMaxMask(maskArray).check(species);
|
||||
case LaneType.SK_INT:
|
||||
return new IntMaxVector.IntMaxMask(maskArray).check(species);
|
||||
case LaneType.SK_LONG:
|
||||
return new LongMaxVector.LongMaxMask(maskArray).check(species);
|
||||
case LaneType.SK_FLOAT:
|
||||
return new FloatMaxVector.FloatMaxMask(maskArray).check(species);
|
||||
case LaneType.SK_DOUBLE:
|
||||
return new DoubleMaxVector.DoubleMaxMask(maskArray).check(species);
|
||||
}
|
||||
return switch (dsp.laneType.switchKey) {
|
||||
case LaneType.SK_BYTE -> new ByteMaxVector.ByteMaxMask(maskArray).check(dsp);
|
||||
case LaneType.SK_SHORT -> new ShortMaxVector.ShortMaxMask(maskArray).check(dsp);
|
||||
case LaneType.SK_INT -> new IntMaxVector.IntMaxMask(maskArray).check(dsp);
|
||||
case LaneType.SK_LONG -> new LongMaxVector.LongMaxMask(maskArray).check(dsp);
|
||||
case LaneType.SK_FLOAT -> new FloatMaxVector.FloatMaxMask(maskArray).check(dsp);
|
||||
case LaneType.SK_DOUBLE -> new DoubleMaxVector.DoubleMaxMask(maskArray).check(dsp);
|
||||
default -> throw new AssertionError(dsp);
|
||||
};
|
||||
}
|
||||
|
||||
// Should not reach here.
|
||||
throw new AssertionError(species);
|
||||
@Override
|
||||
@ForceInline
|
||||
public <E> VectorMask<E> cast(VectorSpecies<E> dsp) {
|
||||
AbstractSpecies<E> species = (AbstractSpecies<E>) dsp;
|
||||
if (length() != species.laneCount())
|
||||
throw new IllegalArgumentException("VectorMask length and species length differ");
|
||||
if (VSIZE == species.vectorBitSize()) {
|
||||
Class<?> dtype = species.elementType();
|
||||
Class<?> dmtype = species.maskType();
|
||||
return VectorSupport.convert(VectorSupport.VECTOR_OP_REINTERPRET,
|
||||
this.getClass(), ETYPE, VLENGTH,
|
||||
dmtype, dtype, VLENGTH,
|
||||
this, species,
|
||||
IntMaxMask::defaultMaskCast);
|
||||
}
|
||||
return this.defaultMaskCast(species);
|
||||
}
|
||||
|
||||
// Unary operations
|
||||
|
|
|
@ -561,31 +561,43 @@ final class Long128Vector extends LongVector {
|
|||
return (Long128Vector) super.toVectorTemplate(); // specialize
|
||||
}
|
||||
|
||||
@Override
|
||||
/**
|
||||
* Helper function for lane-wise mask conversions.
|
||||
* This function kicks in after intrinsic failure.
|
||||
*/
|
||||
@ForceInline
|
||||
public <E> VectorMask<E> cast(VectorSpecies<E> s) {
|
||||
AbstractSpecies<E> species = (AbstractSpecies<E>) s;
|
||||
if (length() != species.laneCount())
|
||||
throw new IllegalArgumentException("VectorMask length and species length differ");
|
||||
private final <E>
|
||||
VectorMask<E> defaultMaskCast(AbstractSpecies<E> dsp) {
|
||||
assert(length() == dsp.laneCount());
|
||||
boolean[] maskArray = toArray();
|
||||
// enum-switches don't optimize properly JDK-8161245
|
||||
switch (species.laneType.switchKey) {
|
||||
case LaneType.SK_BYTE:
|
||||
return new Byte128Vector.Byte128Mask(maskArray).check(species);
|
||||
case LaneType.SK_SHORT:
|
||||
return new Short128Vector.Short128Mask(maskArray).check(species);
|
||||
case LaneType.SK_INT:
|
||||
return new Int128Vector.Int128Mask(maskArray).check(species);
|
||||
case LaneType.SK_LONG:
|
||||
return new Long128Vector.Long128Mask(maskArray).check(species);
|
||||
case LaneType.SK_FLOAT:
|
||||
return new Float128Vector.Float128Mask(maskArray).check(species);
|
||||
case LaneType.SK_DOUBLE:
|
||||
return new Double128Vector.Double128Mask(maskArray).check(species);
|
||||
}
|
||||
return switch (dsp.laneType.switchKey) {
|
||||
case LaneType.SK_BYTE -> new Byte128Vector.Byte128Mask(maskArray).check(dsp);
|
||||
case LaneType.SK_SHORT -> new Short128Vector.Short128Mask(maskArray).check(dsp);
|
||||
case LaneType.SK_INT -> new Int128Vector.Int128Mask(maskArray).check(dsp);
|
||||
case LaneType.SK_LONG -> new Long128Vector.Long128Mask(maskArray).check(dsp);
|
||||
case LaneType.SK_FLOAT -> new Float128Vector.Float128Mask(maskArray).check(dsp);
|
||||
case LaneType.SK_DOUBLE -> new Double128Vector.Double128Mask(maskArray).check(dsp);
|
||||
default -> throw new AssertionError(dsp);
|
||||
};
|
||||
}
|
||||
|
||||
// Should not reach here.
|
||||
throw new AssertionError(species);
|
||||
@Override
|
||||
@ForceInline
|
||||
public <E> VectorMask<E> cast(VectorSpecies<E> dsp) {
|
||||
AbstractSpecies<E> species = (AbstractSpecies<E>) dsp;
|
||||
if (length() != species.laneCount())
|
||||
throw new IllegalArgumentException("VectorMask length and species length differ");
|
||||
if (VSIZE == species.vectorBitSize()) {
|
||||
Class<?> dtype = species.elementType();
|
||||
Class<?> dmtype = species.maskType();
|
||||
return VectorSupport.convert(VectorSupport.VECTOR_OP_REINTERPRET,
|
||||
this.getClass(), ETYPE, VLENGTH,
|
||||
dmtype, dtype, VLENGTH,
|
||||
this, species,
|
||||
Long128Mask::defaultMaskCast);
|
||||
}
|
||||
return this.defaultMaskCast(species);
|
||||
}
|
||||
|
||||
// Unary operations
|
||||
|
|
|
@ -565,31 +565,43 @@ final class Long256Vector extends LongVector {
|
|||
return (Long256Vector) super.toVectorTemplate(); // specialize
|
||||
}
|
||||
|
||||
@Override
|
||||
/**
|
||||
* Helper function for lane-wise mask conversions.
|
||||
* This function kicks in after intrinsic failure.
|
||||
*/
|
||||
@ForceInline
|
||||
public <E> VectorMask<E> cast(VectorSpecies<E> s) {
|
||||
AbstractSpecies<E> species = (AbstractSpecies<E>) s;
|
||||
if (length() != species.laneCount())
|
||||
throw new IllegalArgumentException("VectorMask length and species length differ");
|
||||
private final <E>
|
||||
VectorMask<E> defaultMaskCast(AbstractSpecies<E> dsp) {
|
||||
assert(length() == dsp.laneCount());
|
||||
boolean[] maskArray = toArray();
|
||||
// enum-switches don't optimize properly JDK-8161245
|
||||
switch (species.laneType.switchKey) {
|
||||
case LaneType.SK_BYTE:
|
||||
return new Byte256Vector.Byte256Mask(maskArray).check(species);
|
||||
case LaneType.SK_SHORT:
|
||||
return new Short256Vector.Short256Mask(maskArray).check(species);
|
||||
case LaneType.SK_INT:
|
||||
return new Int256Vector.Int256Mask(maskArray).check(species);
|
||||
case LaneType.SK_LONG:
|
||||
return new Long256Vector.Long256Mask(maskArray).check(species);
|
||||
case LaneType.SK_FLOAT:
|
||||
return new Float256Vector.Float256Mask(maskArray).check(species);
|
||||
case LaneType.SK_DOUBLE:
|
||||
return new Double256Vector.Double256Mask(maskArray).check(species);
|
||||
}
|
||||
return switch (dsp.laneType.switchKey) {
|
||||
case LaneType.SK_BYTE -> new Byte256Vector.Byte256Mask(maskArray).check(dsp);
|
||||
case LaneType.SK_SHORT -> new Short256Vector.Short256Mask(maskArray).check(dsp);
|
||||
case LaneType.SK_INT -> new Int256Vector.Int256Mask(maskArray).check(dsp);
|
||||
case LaneType.SK_LONG -> new Long256Vector.Long256Mask(maskArray).check(dsp);
|
||||
case LaneType.SK_FLOAT -> new Float256Vector.Float256Mask(maskArray).check(dsp);
|
||||
case LaneType.SK_DOUBLE -> new Double256Vector.Double256Mask(maskArray).check(dsp);
|
||||
default -> throw new AssertionError(dsp);
|
||||
};
|
||||
}
|
||||
|
||||
// Should not reach here.
|
||||
throw new AssertionError(species);
|
||||
@Override
|
||||
@ForceInline
|
||||
public <E> VectorMask<E> cast(VectorSpecies<E> dsp) {
|
||||
AbstractSpecies<E> species = (AbstractSpecies<E>) dsp;
|
||||
if (length() != species.laneCount())
|
||||
throw new IllegalArgumentException("VectorMask length and species length differ");
|
||||
if (VSIZE == species.vectorBitSize()) {
|
||||
Class<?> dtype = species.elementType();
|
||||
Class<?> dmtype = species.maskType();
|
||||
return VectorSupport.convert(VectorSupport.VECTOR_OP_REINTERPRET,
|
||||
this.getClass(), ETYPE, VLENGTH,
|
||||
dmtype, dtype, VLENGTH,
|
||||
this, species,
|
||||
Long256Mask::defaultMaskCast);
|
||||
}
|
||||
return this.defaultMaskCast(species);
|
||||
}
|
||||
|
||||
// Unary operations
|
||||
|
|
|
@ -573,31 +573,43 @@ final class Long512Vector extends LongVector {
|
|||
return (Long512Vector) super.toVectorTemplate(); // specialize
|
||||
}
|
||||
|
||||
@Override
|
||||
/**
|
||||
* Helper function for lane-wise mask conversions.
|
||||
* This function kicks in after intrinsic failure.
|
||||
*/
|
||||
@ForceInline
|
||||
public <E> VectorMask<E> cast(VectorSpecies<E> s) {
|
||||
AbstractSpecies<E> species = (AbstractSpecies<E>) s;
|
||||
if (length() != species.laneCount())
|
||||
throw new IllegalArgumentException("VectorMask length and species length differ");
|
||||
private final <E>
|
||||
VectorMask<E> defaultMaskCast(AbstractSpecies<E> dsp) {
|
||||
assert(length() == dsp.laneCount());
|
||||
boolean[] maskArray = toArray();
|
||||
// enum-switches don't optimize properly JDK-8161245
|
||||
switch (species.laneType.switchKey) {
|
||||
case LaneType.SK_BYTE:
|
||||
return new Byte512Vector.Byte512Mask(maskArray).check(species);
|
||||
case LaneType.SK_SHORT:
|
||||
return new Short512Vector.Short512Mask(maskArray).check(species);
|
||||
case LaneType.SK_INT:
|
||||
return new Int512Vector.Int512Mask(maskArray).check(species);
|
||||
case LaneType.SK_LONG:
|
||||
return new Long512Vector.Long512Mask(maskArray).check(species);
|
||||
case LaneType.SK_FLOAT:
|
||||
return new Float512Vector.Float512Mask(maskArray).check(species);
|
||||
case LaneType.SK_DOUBLE:
|
||||
return new Double512Vector.Double512Mask(maskArray).check(species);
|
||||
}
|
||||
return switch (dsp.laneType.switchKey) {
|
||||
case LaneType.SK_BYTE -> new Byte512Vector.Byte512Mask(maskArray).check(dsp);
|
||||
case LaneType.SK_SHORT -> new Short512Vector.Short512Mask(maskArray).check(dsp);
|
||||
case LaneType.SK_INT -> new Int512Vector.Int512Mask(maskArray).check(dsp);
|
||||
case LaneType.SK_LONG -> new Long512Vector.Long512Mask(maskArray).check(dsp);
|
||||
case LaneType.SK_FLOAT -> new Float512Vector.Float512Mask(maskArray).check(dsp);
|
||||
case LaneType.SK_DOUBLE -> new Double512Vector.Double512Mask(maskArray).check(dsp);
|
||||
default -> throw new AssertionError(dsp);
|
||||
};
|
||||
}
|
||||
|
||||
// Should not reach here.
|
||||
throw new AssertionError(species);
|
||||
@Override
|
||||
@ForceInline
|
||||
public <E> VectorMask<E> cast(VectorSpecies<E> dsp) {
|
||||
AbstractSpecies<E> species = (AbstractSpecies<E>) dsp;
|
||||
if (length() != species.laneCount())
|
||||
throw new IllegalArgumentException("VectorMask length and species length differ");
|
||||
if (VSIZE == species.vectorBitSize()) {
|
||||
Class<?> dtype = species.elementType();
|
||||
Class<?> dmtype = species.maskType();
|
||||
return VectorSupport.convert(VectorSupport.VECTOR_OP_REINTERPRET,
|
||||
this.getClass(), ETYPE, VLENGTH,
|
||||
dmtype, dtype, VLENGTH,
|
||||
this, species,
|
||||
Long512Mask::defaultMaskCast);
|
||||
}
|
||||
return this.defaultMaskCast(species);
|
||||
}
|
||||
|
||||
// Unary operations
|
||||
|
|
|
@ -559,31 +559,43 @@ final class Long64Vector extends LongVector {
|
|||
return (Long64Vector) super.toVectorTemplate(); // specialize
|
||||
}
|
||||
|
||||
@Override
|
||||
/**
|
||||
* Helper function for lane-wise mask conversions.
|
||||
* This function kicks in after intrinsic failure.
|
||||
*/
|
||||
@ForceInline
|
||||
public <E> VectorMask<E> cast(VectorSpecies<E> s) {
|
||||
AbstractSpecies<E> species = (AbstractSpecies<E>) s;
|
||||
if (length() != species.laneCount())
|
||||
throw new IllegalArgumentException("VectorMask length and species length differ");
|
||||
private final <E>
|
||||
VectorMask<E> defaultMaskCast(AbstractSpecies<E> dsp) {
|
||||
assert(length() == dsp.laneCount());
|
||||
boolean[] maskArray = toArray();
|
||||
// enum-switches don't optimize properly JDK-8161245
|
||||
switch (species.laneType.switchKey) {
|
||||
case LaneType.SK_BYTE:
|
||||
return new Byte64Vector.Byte64Mask(maskArray).check(species);
|
||||
case LaneType.SK_SHORT:
|
||||
return new Short64Vector.Short64Mask(maskArray).check(species);
|
||||
case LaneType.SK_INT:
|
||||
return new Int64Vector.Int64Mask(maskArray).check(species);
|
||||
case LaneType.SK_LONG:
|
||||
return new Long64Vector.Long64Mask(maskArray).check(species);
|
||||
case LaneType.SK_FLOAT:
|
||||
return new Float64Vector.Float64Mask(maskArray).check(species);
|
||||
case LaneType.SK_DOUBLE:
|
||||
return new Double64Vector.Double64Mask(maskArray).check(species);
|
||||
}
|
||||
return switch (dsp.laneType.switchKey) {
|
||||
case LaneType.SK_BYTE -> new Byte64Vector.Byte64Mask(maskArray).check(dsp);
|
||||
case LaneType.SK_SHORT -> new Short64Vector.Short64Mask(maskArray).check(dsp);
|
||||
case LaneType.SK_INT -> new Int64Vector.Int64Mask(maskArray).check(dsp);
|
||||
case LaneType.SK_LONG -> new Long64Vector.Long64Mask(maskArray).check(dsp);
|
||||
case LaneType.SK_FLOAT -> new Float64Vector.Float64Mask(maskArray).check(dsp);
|
||||
case LaneType.SK_DOUBLE -> new Double64Vector.Double64Mask(maskArray).check(dsp);
|
||||
default -> throw new AssertionError(dsp);
|
||||
};
|
||||
}
|
||||
|
||||
// Should not reach here.
|
||||
throw new AssertionError(species);
|
||||
@Override
|
||||
@ForceInline
|
||||
public <E> VectorMask<E> cast(VectorSpecies<E> dsp) {
|
||||
AbstractSpecies<E> species = (AbstractSpecies<E>) dsp;
|
||||
if (length() != species.laneCount())
|
||||
throw new IllegalArgumentException("VectorMask length and species length differ");
|
||||
if (VSIZE == species.vectorBitSize()) {
|
||||
Class<?> dtype = species.elementType();
|
||||
Class<?> dmtype = species.maskType();
|
||||
return VectorSupport.convert(VectorSupport.VECTOR_OP_REINTERPRET,
|
||||
this.getClass(), ETYPE, VLENGTH,
|
||||
dmtype, dtype, VLENGTH,
|
||||
this, species,
|
||||
Long64Mask::defaultMaskCast);
|
||||
}
|
||||
return this.defaultMaskCast(species);
|
||||
}
|
||||
|
||||
// Unary operations
|
||||
|
|
|
@ -559,31 +559,43 @@ final class LongMaxVector extends LongVector {
|
|||
return (LongMaxVector) super.toVectorTemplate(); // specialize
|
||||
}
|
||||
|
||||
@Override
|
||||
/**
|
||||
* Helper function for lane-wise mask conversions.
|
||||
* This function kicks in after intrinsic failure.
|
||||
*/
|
||||
@ForceInline
|
||||
public <E> VectorMask<E> cast(VectorSpecies<E> s) {
|
||||
AbstractSpecies<E> species = (AbstractSpecies<E>) s;
|
||||
if (length() != species.laneCount())
|
||||
throw new IllegalArgumentException("VectorMask length and species length differ");
|
||||
private final <E>
|
||||
VectorMask<E> defaultMaskCast(AbstractSpecies<E> dsp) {
|
||||
assert(length() == dsp.laneCount());
|
||||
boolean[] maskArray = toArray();
|
||||
// enum-switches don't optimize properly JDK-8161245
|
||||
switch (species.laneType.switchKey) {
|
||||
case LaneType.SK_BYTE:
|
||||
return new ByteMaxVector.ByteMaxMask(maskArray).check(species);
|
||||
case LaneType.SK_SHORT:
|
||||
return new ShortMaxVector.ShortMaxMask(maskArray).check(species);
|
||||
case LaneType.SK_INT:
|
||||
return new IntMaxVector.IntMaxMask(maskArray).check(species);
|
||||
case LaneType.SK_LONG:
|
||||
return new LongMaxVector.LongMaxMask(maskArray).check(species);
|
||||
case LaneType.SK_FLOAT:
|
||||
return new FloatMaxVector.FloatMaxMask(maskArray).check(species);
|
||||
case LaneType.SK_DOUBLE:
|
||||
return new DoubleMaxVector.DoubleMaxMask(maskArray).check(species);
|
||||
}
|
||||
return switch (dsp.laneType.switchKey) {
|
||||
case LaneType.SK_BYTE -> new ByteMaxVector.ByteMaxMask(maskArray).check(dsp);
|
||||
case LaneType.SK_SHORT -> new ShortMaxVector.ShortMaxMask(maskArray).check(dsp);
|
||||
case LaneType.SK_INT -> new IntMaxVector.IntMaxMask(maskArray).check(dsp);
|
||||
case LaneType.SK_LONG -> new LongMaxVector.LongMaxMask(maskArray).check(dsp);
|
||||
case LaneType.SK_FLOAT -> new FloatMaxVector.FloatMaxMask(maskArray).check(dsp);
|
||||
case LaneType.SK_DOUBLE -> new DoubleMaxVector.DoubleMaxMask(maskArray).check(dsp);
|
||||
default -> throw new AssertionError(dsp);
|
||||
};
|
||||
}
|
||||
|
||||
// Should not reach here.
|
||||
throw new AssertionError(species);
|
||||
@Override
|
||||
@ForceInline
|
||||
public <E> VectorMask<E> cast(VectorSpecies<E> dsp) {
|
||||
AbstractSpecies<E> species = (AbstractSpecies<E>) dsp;
|
||||
if (length() != species.laneCount())
|
||||
throw new IllegalArgumentException("VectorMask length and species length differ");
|
||||
if (VSIZE == species.vectorBitSize()) {
|
||||
Class<?> dtype = species.elementType();
|
||||
Class<?> dmtype = species.maskType();
|
||||
return VectorSupport.convert(VectorSupport.VECTOR_OP_REINTERPRET,
|
||||
this.getClass(), ETYPE, VLENGTH,
|
||||
dmtype, dtype, VLENGTH,
|
||||
this, species,
|
||||
LongMaxMask::defaultMaskCast);
|
||||
}
|
||||
return this.defaultMaskCast(species);
|
||||
}
|
||||
|
||||
// Unary operations
|
||||
|
|
|
@ -583,31 +583,43 @@ final class Short128Vector extends ShortVector {
|
|||
return (Short128Vector) super.toVectorTemplate(); // specialize
|
||||
}
|
||||
|
||||
@Override
|
||||
/**
|
||||
* Helper function for lane-wise mask conversions.
|
||||
* This function kicks in after intrinsic failure.
|
||||
*/
|
||||
@ForceInline
|
||||
public <E> VectorMask<E> cast(VectorSpecies<E> s) {
|
||||
AbstractSpecies<E> species = (AbstractSpecies<E>) s;
|
||||
if (length() != species.laneCount())
|
||||
throw new IllegalArgumentException("VectorMask length and species length differ");
|
||||
private final <E>
|
||||
VectorMask<E> defaultMaskCast(AbstractSpecies<E> dsp) {
|
||||
assert(length() == dsp.laneCount());
|
||||
boolean[] maskArray = toArray();
|
||||
// enum-switches don't optimize properly JDK-8161245
|
||||
switch (species.laneType.switchKey) {
|
||||
case LaneType.SK_BYTE:
|
||||
return new Byte128Vector.Byte128Mask(maskArray).check(species);
|
||||
case LaneType.SK_SHORT:
|
||||
return new Short128Vector.Short128Mask(maskArray).check(species);
|
||||
case LaneType.SK_INT:
|
||||
return new Int128Vector.Int128Mask(maskArray).check(species);
|
||||
case LaneType.SK_LONG:
|
||||
return new Long128Vector.Long128Mask(maskArray).check(species);
|
||||
case LaneType.SK_FLOAT:
|
||||
return new Float128Vector.Float128Mask(maskArray).check(species);
|
||||
case LaneType.SK_DOUBLE:
|
||||
return new Double128Vector.Double128Mask(maskArray).check(species);
|
||||
}
|
||||
return switch (dsp.laneType.switchKey) {
|
||||
case LaneType.SK_BYTE -> new Byte128Vector.Byte128Mask(maskArray).check(dsp);
|
||||
case LaneType.SK_SHORT -> new Short128Vector.Short128Mask(maskArray).check(dsp);
|
||||
case LaneType.SK_INT -> new Int128Vector.Int128Mask(maskArray).check(dsp);
|
||||
case LaneType.SK_LONG -> new Long128Vector.Long128Mask(maskArray).check(dsp);
|
||||
case LaneType.SK_FLOAT -> new Float128Vector.Float128Mask(maskArray).check(dsp);
|
||||
case LaneType.SK_DOUBLE -> new Double128Vector.Double128Mask(maskArray).check(dsp);
|
||||
default -> throw new AssertionError(dsp);
|
||||
};
|
||||
}
|
||||
|
||||
// Should not reach here.
|
||||
throw new AssertionError(species);
|
||||
@Override
|
||||
@ForceInline
|
||||
public <E> VectorMask<E> cast(VectorSpecies<E> dsp) {
|
||||
AbstractSpecies<E> species = (AbstractSpecies<E>) dsp;
|
||||
if (length() != species.laneCount())
|
||||
throw new IllegalArgumentException("VectorMask length and species length differ");
|
||||
if (VSIZE == species.vectorBitSize()) {
|
||||
Class<?> dtype = species.elementType();
|
||||
Class<?> dmtype = species.maskType();
|
||||
return VectorSupport.convert(VectorSupport.VECTOR_OP_REINTERPRET,
|
||||
this.getClass(), ETYPE, VLENGTH,
|
||||
dmtype, dtype, VLENGTH,
|
||||
this, species,
|
||||
Short128Mask::defaultMaskCast);
|
||||
}
|
||||
return this.defaultMaskCast(species);
|
||||
}
|
||||
|
||||
// Unary operations
|
||||
|
|
|
@ -599,31 +599,43 @@ final class Short256Vector extends ShortVector {
|
|||
return (Short256Vector) super.toVectorTemplate(); // specialize
|
||||
}
|
||||
|
||||
@Override
|
||||
/**
|
||||
* Helper function for lane-wise mask conversions.
|
||||
* This function kicks in after intrinsic failure.
|
||||
*/
|
||||
@ForceInline
|
||||
public <E> VectorMask<E> cast(VectorSpecies<E> s) {
|
||||
AbstractSpecies<E> species = (AbstractSpecies<E>) s;
|
||||
if (length() != species.laneCount())
|
||||
throw new IllegalArgumentException("VectorMask length and species length differ");
|
||||
private final <E>
|
||||
VectorMask<E> defaultMaskCast(AbstractSpecies<E> dsp) {
|
||||
assert(length() == dsp.laneCount());
|
||||
boolean[] maskArray = toArray();
|
||||
// enum-switches don't optimize properly JDK-8161245
|
||||
switch (species.laneType.switchKey) {
|
||||
case LaneType.SK_BYTE:
|
||||
return new Byte256Vector.Byte256Mask(maskArray).check(species);
|
||||
case LaneType.SK_SHORT:
|
||||
return new Short256Vector.Short256Mask(maskArray).check(species);
|
||||
case LaneType.SK_INT:
|
||||
return new Int256Vector.Int256Mask(maskArray).check(species);
|
||||
case LaneType.SK_LONG:
|
||||
return new Long256Vector.Long256Mask(maskArray).check(species);
|
||||
case LaneType.SK_FLOAT:
|
||||
return new Float256Vector.Float256Mask(maskArray).check(species);
|
||||
case LaneType.SK_DOUBLE:
|
||||
return new Double256Vector.Double256Mask(maskArray).check(species);
|
||||
}
|
||||
return switch (dsp.laneType.switchKey) {
|
||||
case LaneType.SK_BYTE -> new Byte256Vector.Byte256Mask(maskArray).check(dsp);
|
||||
case LaneType.SK_SHORT -> new Short256Vector.Short256Mask(maskArray).check(dsp);
|
||||
case LaneType.SK_INT -> new Int256Vector.Int256Mask(maskArray).check(dsp);
|
||||
case LaneType.SK_LONG -> new Long256Vector.Long256Mask(maskArray).check(dsp);
|
||||
case LaneType.SK_FLOAT -> new Float256Vector.Float256Mask(maskArray).check(dsp);
|
||||
case LaneType.SK_DOUBLE -> new Double256Vector.Double256Mask(maskArray).check(dsp);
|
||||
default -> throw new AssertionError(dsp);
|
||||
};
|
||||
}
|
||||
|
||||
// Should not reach here.
|
||||
throw new AssertionError(species);
|
||||
@Override
|
||||
@ForceInline
|
||||
public <E> VectorMask<E> cast(VectorSpecies<E> dsp) {
|
||||
AbstractSpecies<E> species = (AbstractSpecies<E>) dsp;
|
||||
if (length() != species.laneCount())
|
||||
throw new IllegalArgumentException("VectorMask length and species length differ");
|
||||
if (VSIZE == species.vectorBitSize()) {
|
||||
Class<?> dtype = species.elementType();
|
||||
Class<?> dmtype = species.maskType();
|
||||
return VectorSupport.convert(VectorSupport.VECTOR_OP_REINTERPRET,
|
||||
this.getClass(), ETYPE, VLENGTH,
|
||||
dmtype, dtype, VLENGTH,
|
||||
this, species,
|
||||
Short256Mask::defaultMaskCast);
|
||||
}
|
||||
return this.defaultMaskCast(species);
|
||||
}
|
||||
|
||||
// Unary operations
|
||||
|
|
|
@ -631,31 +631,43 @@ final class Short512Vector extends ShortVector {
|
|||
return (Short512Vector) super.toVectorTemplate(); // specialize
|
||||
}
|
||||
|
||||
@Override
|
||||
/**
|
||||
* Helper function for lane-wise mask conversions.
|
||||
* This function kicks in after intrinsic failure.
|
||||
*/
|
||||
@ForceInline
|
||||
public <E> VectorMask<E> cast(VectorSpecies<E> s) {
|
||||
AbstractSpecies<E> species = (AbstractSpecies<E>) s;
|
||||
if (length() != species.laneCount())
|
||||
throw new IllegalArgumentException("VectorMask length and species length differ");
|
||||
private final <E>
|
||||
VectorMask<E> defaultMaskCast(AbstractSpecies<E> dsp) {
|
||||
assert(length() == dsp.laneCount());
|
||||
boolean[] maskArray = toArray();
|
||||
// enum-switches don't optimize properly JDK-8161245
|
||||
switch (species.laneType.switchKey) {
|
||||
case LaneType.SK_BYTE:
|
||||
return new Byte512Vector.Byte512Mask(maskArray).check(species);
|
||||
case LaneType.SK_SHORT:
|
||||
return new Short512Vector.Short512Mask(maskArray).check(species);
|
||||
case LaneType.SK_INT:
|
||||
return new Int512Vector.Int512Mask(maskArray).check(species);
|
||||
case LaneType.SK_LONG:
|
||||
return new Long512Vector.Long512Mask(maskArray).check(species);
|
||||
case LaneType.SK_FLOAT:
|
||||
return new Float512Vector.Float512Mask(maskArray).check(species);
|
||||
case LaneType.SK_DOUBLE:
|
||||
return new Double512Vector.Double512Mask(maskArray).check(species);
|
||||
}
|
||||
return switch (dsp.laneType.switchKey) {
|
||||
case LaneType.SK_BYTE -> new Byte512Vector.Byte512Mask(maskArray).check(dsp);
|
||||
case LaneType.SK_SHORT -> new Short512Vector.Short512Mask(maskArray).check(dsp);
|
||||
case LaneType.SK_INT -> new Int512Vector.Int512Mask(maskArray).check(dsp);
|
||||
case LaneType.SK_LONG -> new Long512Vector.Long512Mask(maskArray).check(dsp);
|
||||
case LaneType.SK_FLOAT -> new Float512Vector.Float512Mask(maskArray).check(dsp);
|
||||
case LaneType.SK_DOUBLE -> new Double512Vector.Double512Mask(maskArray).check(dsp);
|
||||
default -> throw new AssertionError(dsp);
|
||||
};
|
||||
}
|
||||
|
||||
// Should not reach here.
|
||||
throw new AssertionError(species);
|
||||
@Override
|
||||
@ForceInline
|
||||
public <E> VectorMask<E> cast(VectorSpecies<E> dsp) {
|
||||
AbstractSpecies<E> species = (AbstractSpecies<E>) dsp;
|
||||
if (length() != species.laneCount())
|
||||
throw new IllegalArgumentException("VectorMask length and species length differ");
|
||||
if (VSIZE == species.vectorBitSize()) {
|
||||
Class<?> dtype = species.elementType();
|
||||
Class<?> dmtype = species.maskType();
|
||||
return VectorSupport.convert(VectorSupport.VECTOR_OP_REINTERPRET,
|
||||
this.getClass(), ETYPE, VLENGTH,
|
||||
dmtype, dtype, VLENGTH,
|
||||
this, species,
|
||||
Short512Mask::defaultMaskCast);
|
||||
}
|
||||
return this.defaultMaskCast(species);
|
||||
}
|
||||
|
||||
// Unary operations
|
||||
|
|
|
@ -575,31 +575,43 @@ final class Short64Vector extends ShortVector {
|
|||
return (Short64Vector) super.toVectorTemplate(); // specialize
|
||||
}
|
||||
|
||||
@Override
|
||||
/**
|
||||
* Helper function for lane-wise mask conversions.
|
||||
* This function kicks in after intrinsic failure.
|
||||
*/
|
||||
@ForceInline
|
||||
public <E> VectorMask<E> cast(VectorSpecies<E> s) {
|
||||
AbstractSpecies<E> species = (AbstractSpecies<E>) s;
|
||||
if (length() != species.laneCount())
|
||||
throw new IllegalArgumentException("VectorMask length and species length differ");
|
||||
private final <E>
|
||||
VectorMask<E> defaultMaskCast(AbstractSpecies<E> dsp) {
|
||||
assert(length() == dsp.laneCount());
|
||||
boolean[] maskArray = toArray();
|
||||
// enum-switches don't optimize properly JDK-8161245
|
||||
switch (species.laneType.switchKey) {
|
||||
case LaneType.SK_BYTE:
|
||||
return new Byte64Vector.Byte64Mask(maskArray).check(species);
|
||||
case LaneType.SK_SHORT:
|
||||
return new Short64Vector.Short64Mask(maskArray).check(species);
|
||||
case LaneType.SK_INT:
|
||||
return new Int64Vector.Int64Mask(maskArray).check(species);
|
||||
case LaneType.SK_LONG:
|
||||
return new Long64Vector.Long64Mask(maskArray).check(species);
|
||||
case LaneType.SK_FLOAT:
|
||||
return new Float64Vector.Float64Mask(maskArray).check(species);
|
||||
case LaneType.SK_DOUBLE:
|
||||
return new Double64Vector.Double64Mask(maskArray).check(species);
|
||||
}
|
||||
return switch (dsp.laneType.switchKey) {
|
||||
case LaneType.SK_BYTE -> new Byte64Vector.Byte64Mask(maskArray).check(dsp);
|
||||
case LaneType.SK_SHORT -> new Short64Vector.Short64Mask(maskArray).check(dsp);
|
||||
case LaneType.SK_INT -> new Int64Vector.Int64Mask(maskArray).check(dsp);
|
||||
case LaneType.SK_LONG -> new Long64Vector.Long64Mask(maskArray).check(dsp);
|
||||
case LaneType.SK_FLOAT -> new Float64Vector.Float64Mask(maskArray).check(dsp);
|
||||
case LaneType.SK_DOUBLE -> new Double64Vector.Double64Mask(maskArray).check(dsp);
|
||||
default -> throw new AssertionError(dsp);
|
||||
};
|
||||
}
|
||||
|
||||
// Should not reach here.
|
||||
throw new AssertionError(species);
|
||||
@Override
|
||||
@ForceInline
|
||||
public <E> VectorMask<E> cast(VectorSpecies<E> dsp) {
|
||||
AbstractSpecies<E> species = (AbstractSpecies<E>) dsp;
|
||||
if (length() != species.laneCount())
|
||||
throw new IllegalArgumentException("VectorMask length and species length differ");
|
||||
if (VSIZE == species.vectorBitSize()) {
|
||||
Class<?> dtype = species.elementType();
|
||||
Class<?> dmtype = species.maskType();
|
||||
return VectorSupport.convert(VectorSupport.VECTOR_OP_REINTERPRET,
|
||||
this.getClass(), ETYPE, VLENGTH,
|
||||
dmtype, dtype, VLENGTH,
|
||||
this, species,
|
||||
Short64Mask::defaultMaskCast);
|
||||
}
|
||||
return this.defaultMaskCast(species);
|
||||
}
|
||||
|
||||
// Unary operations
|
||||
|
|
|
@ -569,31 +569,43 @@ final class ShortMaxVector extends ShortVector {
|
|||
return (ShortMaxVector) super.toVectorTemplate(); // specialize
|
||||
}
|
||||
|
||||
@Override
|
||||
/**
|
||||
* Helper function for lane-wise mask conversions.
|
||||
* This function kicks in after intrinsic failure.
|
||||
*/
|
||||
@ForceInline
|
||||
public <E> VectorMask<E> cast(VectorSpecies<E> s) {
|
||||
AbstractSpecies<E> species = (AbstractSpecies<E>) s;
|
||||
if (length() != species.laneCount())
|
||||
throw new IllegalArgumentException("VectorMask length and species length differ");
|
||||
private final <E>
|
||||
VectorMask<E> defaultMaskCast(AbstractSpecies<E> dsp) {
|
||||
assert(length() == dsp.laneCount());
|
||||
boolean[] maskArray = toArray();
|
||||
// enum-switches don't optimize properly JDK-8161245
|
||||
switch (species.laneType.switchKey) {
|
||||
case LaneType.SK_BYTE:
|
||||
return new ByteMaxVector.ByteMaxMask(maskArray).check(species);
|
||||
case LaneType.SK_SHORT:
|
||||
return new ShortMaxVector.ShortMaxMask(maskArray).check(species);
|
||||
case LaneType.SK_INT:
|
||||
return new IntMaxVector.IntMaxMask(maskArray).check(species);
|
||||
case LaneType.SK_LONG:
|
||||
return new LongMaxVector.LongMaxMask(maskArray).check(species);
|
||||
case LaneType.SK_FLOAT:
|
||||
return new FloatMaxVector.FloatMaxMask(maskArray).check(species);
|
||||
case LaneType.SK_DOUBLE:
|
||||
return new DoubleMaxVector.DoubleMaxMask(maskArray).check(species);
|
||||
}
|
||||
return switch (dsp.laneType.switchKey) {
|
||||
case LaneType.SK_BYTE -> new ByteMaxVector.ByteMaxMask(maskArray).check(dsp);
|
||||
case LaneType.SK_SHORT -> new ShortMaxVector.ShortMaxMask(maskArray).check(dsp);
|
||||
case LaneType.SK_INT -> new IntMaxVector.IntMaxMask(maskArray).check(dsp);
|
||||
case LaneType.SK_LONG -> new LongMaxVector.LongMaxMask(maskArray).check(dsp);
|
||||
case LaneType.SK_FLOAT -> new FloatMaxVector.FloatMaxMask(maskArray).check(dsp);
|
||||
case LaneType.SK_DOUBLE -> new DoubleMaxVector.DoubleMaxMask(maskArray).check(dsp);
|
||||
default -> throw new AssertionError(dsp);
|
||||
};
|
||||
}
|
||||
|
||||
// Should not reach here.
|
||||
throw new AssertionError(species);
|
||||
@Override
|
||||
@ForceInline
|
||||
public <E> VectorMask<E> cast(VectorSpecies<E> dsp) {
|
||||
AbstractSpecies<E> species = (AbstractSpecies<E>) dsp;
|
||||
if (length() != species.laneCount())
|
||||
throw new IllegalArgumentException("VectorMask length and species length differ");
|
||||
if (VSIZE == species.vectorBitSize()) {
|
||||
Class<?> dtype = species.elementType();
|
||||
Class<?> dmtype = species.maskType();
|
||||
return VectorSupport.convert(VectorSupport.VECTOR_OP_REINTERPRET,
|
||||
this.getClass(), ETYPE, VLENGTH,
|
||||
dmtype, dtype, VLENGTH,
|
||||
this, species,
|
||||
ShortMaxMask::defaultMaskCast);
|
||||
}
|
||||
return this.defaultMaskCast(species);
|
||||
}
|
||||
|
||||
// Unary operations
|
||||
|
|
|
@ -842,31 +842,43 @@ final class $vectortype$ extends $abstractvectortype$ {
|
|||
return ($vectortype$) super.toVectorTemplate(); // specialize
|
||||
}
|
||||
|
||||
@Override
|
||||
/**
|
||||
* Helper function for lane-wise mask conversions.
|
||||
* This function kicks in after intrinsic failure.
|
||||
*/
|
||||
@ForceInline
|
||||
public <E> VectorMask<E> cast(VectorSpecies<E> s) {
|
||||
AbstractSpecies<E> species = (AbstractSpecies<E>) s;
|
||||
if (length() != species.laneCount())
|
||||
throw new IllegalArgumentException("VectorMask length and species length differ");
|
||||
private final <E>
|
||||
VectorMask<E> defaultMaskCast(AbstractSpecies<E> dsp) {
|
||||
assert(length() == dsp.laneCount());
|
||||
boolean[] maskArray = toArray();
|
||||
// enum-switches don't optimize properly JDK-8161245
|
||||
switch (species.laneType.switchKey) {
|
||||
case LaneType.SK_BYTE:
|
||||
return new Byte$bits$Vector.Byte$bits$Mask(maskArray).check(species);
|
||||
case LaneType.SK_SHORT:
|
||||
return new Short$bits$Vector.Short$bits$Mask(maskArray).check(species);
|
||||
case LaneType.SK_INT:
|
||||
return new Int$bits$Vector.Int$bits$Mask(maskArray).check(species);
|
||||
case LaneType.SK_LONG:
|
||||
return new Long$bits$Vector.Long$bits$Mask(maskArray).check(species);
|
||||
case LaneType.SK_FLOAT:
|
||||
return new Float$bits$Vector.Float$bits$Mask(maskArray).check(species);
|
||||
case LaneType.SK_DOUBLE:
|
||||
return new Double$bits$Vector.Double$bits$Mask(maskArray).check(species);
|
||||
}
|
||||
return switch (dsp.laneType.switchKey) {
|
||||
case LaneType.SK_BYTE -> new Byte$bits$Vector.Byte$bits$Mask(maskArray).check(dsp);
|
||||
case LaneType.SK_SHORT -> new Short$bits$Vector.Short$bits$Mask(maskArray).check(dsp);
|
||||
case LaneType.SK_INT -> new Int$bits$Vector.Int$bits$Mask(maskArray).check(dsp);
|
||||
case LaneType.SK_LONG -> new Long$bits$Vector.Long$bits$Mask(maskArray).check(dsp);
|
||||
case LaneType.SK_FLOAT -> new Float$bits$Vector.Float$bits$Mask(maskArray).check(dsp);
|
||||
case LaneType.SK_DOUBLE -> new Double$bits$Vector.Double$bits$Mask(maskArray).check(dsp);
|
||||
default -> throw new AssertionError(dsp);
|
||||
};
|
||||
}
|
||||
|
||||
// Should not reach here.
|
||||
throw new AssertionError(species);
|
||||
@Override
|
||||
@ForceInline
|
||||
public <E> VectorMask<E> cast(VectorSpecies<E> dsp) {
|
||||
AbstractSpecies<E> species = (AbstractSpecies<E>) dsp;
|
||||
if (length() != species.laneCount())
|
||||
throw new IllegalArgumentException("VectorMask length and species length differ");
|
||||
if (VSIZE == species.vectorBitSize()) {
|
||||
Class<?> dtype = species.elementType();
|
||||
Class<?> dmtype = species.maskType();
|
||||
return VectorSupport.convert(VectorSupport.VECTOR_OP_REINTERPRET,
|
||||
this.getClass(), ETYPE, VLENGTH,
|
||||
dmtype, dtype, VLENGTH,
|
||||
this, species,
|
||||
$Type$$bits$Mask::defaultMaskCast);
|
||||
}
|
||||
return this.defaultMaskCast(species);
|
||||
}
|
||||
|
||||
// Unary operations
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue