Skip to content

Commit 5372921

Browse files
committed
Merge branch 'simd-revisite' of https://github.com/codenameone/CodenameOne into simd-revisite
2 parents f838ac1 + d4ef11c commit 5372921

File tree

5 files changed

+436
-0
lines changed

5 files changed

+436
-0
lines changed

CodenameOne/src/com/codename1/util/Simd.java

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -154,12 +154,44 @@ public void select(byte[] mask, byte[] trueValues, byte[] falseValues, byte[] ds
154154
}
155155
}
156156

157+
public void shl(byte[] src, int bits, byte[] dst, int offset, int length) {
158+
int shift = bits & 7;
159+
for (int i = offset, end = offset + length; i < end; i++) {
160+
dst[i] = (byte)((src[i] & 0xff) << shift);
161+
}
162+
}
163+
164+
public void shrLogical(byte[] src, int bits, byte[] dst, int offset, int length) {
165+
int shift = bits & 7;
166+
for (int i = offset, end = offset + length; i < end; i++) {
167+
dst[i] = (byte)((src[i] & 0xff) >>> shift);
168+
}
169+
}
170+
171+
public void addWrapping(byte[] srcA, byte[] srcB, byte[] dst, int offset, int length) {
172+
for (int i = offset, end = offset + length; i < end; i++) {
173+
dst[i] = (byte)(srcA[i] + srcB[i]);
174+
}
175+
}
176+
177+
public void subWrapping(byte[] srcA, byte[] srcB, byte[] dst, int offset, int length) {
178+
for (int i = offset, end = offset + length; i < end; i++) {
179+
dst[i] = (byte)(srcA[i] - srcB[i]);
180+
}
181+
}
182+
157183
public void unpackUnsignedByteToInt(byte[] src, int[] dst, int offset, int length) {
158184
for (int i = offset, end = offset + length; i < end; i++) {
159185
dst[i] = src[i] & 0xff;
160186
}
161187
}
162188

189+
public void unpackUnsignedByteToInt(byte[] src, int srcOffset, int[] dst, int dstOffset, int length) {
190+
for (int i = 0; i < length; i++) {
191+
dst[dstOffset + i] = src[srcOffset + i] & 0xff;
192+
}
193+
}
194+
163195
public void packIntToByteSaturating(int[] src, byte[] dst, int offset, int length) {
164196
for (int i = offset, end = offset + length; i < end; i++) {
165197
dst[i] = clampByte(src[i]);
@@ -191,6 +223,12 @@ public void add(int[] srcA, int[] srcB, int[] dst, int offset, int length) {
191223
}
192224
}
193225

226+
public void add(int[] srcA, int srcAOffset, int[] srcB, int srcBOffset, int[] dst, int dstOffset, int length) {
227+
for (int i = 0; i < length; i++) {
228+
dst[dstOffset + i] = srcA[srcAOffset + i] + srcB[srcBOffset + i];
229+
}
230+
}
231+
194232
public void sub(int[] srcA, int[] srcB, int[] dst, int offset, int length) {
195233
for (int i = offset, end = offset + length; i < end; i++) {
196234
dst[i] = srcA[i] - srcB[i];
@@ -312,12 +350,24 @@ public void cmpEq(int[] srcA, int[] srcB, byte[] dstMask, int offset, int length
312350
}
313351
}
314352

353+
public void cmpEq(int[] srcA, int srcAOffset, int[] srcB, int srcBOffset, byte[] dstMask, int dstOffset, int length) {
354+
for (int i = 0; i < length; i++) {
355+
dstMask[dstOffset + i] = srcA[srcAOffset + i] == srcB[srcBOffset + i] ? (byte)-1 : (byte)0;
356+
}
357+
}
358+
315359
public void cmpLt(int[] srcA, int[] srcB, byte[] dstMask, int offset, int length) {
316360
for (int i = offset, end = offset + length; i < end; i++) {
317361
dstMask[i] = srcA[i] < srcB[i] ? (byte)-1 : (byte)0;
318362
}
319363
}
320364

365+
public void cmpLt(int[] srcA, int srcAOffset, int[] srcB, int srcBOffset, byte[] dstMask, int dstOffset, int length) {
366+
for (int i = 0; i < length; i++) {
367+
dstMask[dstOffset + i] = srcA[srcAOffset + i] < srcB[srcBOffset + i] ? (byte)-1 : (byte)0;
368+
}
369+
}
370+
321371
public void cmpGt(int[] srcA, int[] srcB, byte[] dstMask, int offset, int length) {
322372
for (int i = offset, end = offset + length; i < end; i++) {
323373
dstMask[i] = srcA[i] > srcB[i] ? (byte)-1 : (byte)0;
@@ -330,6 +380,12 @@ public void select(byte[] mask, int[] trueValues, int[] falseValues, int[] dst,
330380
}
331381
}
332382

383+
public void select(byte[] mask, int maskOffset, int[] trueValues, int trueOffset, int[] falseValues, int falseOffset, int[] dst, int dstOffset, int length) {
384+
for (int i = 0; i < length; i++) {
385+
dst[dstOffset + i] = mask[maskOffset + i] != 0 ? trueValues[trueOffset + i] : falseValues[falseOffset + i];
386+
}
387+
}
388+
333389
public int sum(int[] src, int offset, int length) {
334390
int out = 0;
335391
for (int i = offset, end = offset + length; i < end; i++) {

Ports/JavaSE/src/com/codename1/impl/javase/JavaSESimd.java

Lines changed: 88 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -450,6 +450,94 @@ public float dot(float[] srcA, float[] srcB, int offset, int length) {
450450
return super.dot(srcA, srcB, offset, length);
451451
}
452452

453+
@Override
454+
public void shl(byte[] src, int bits, byte[] dst, int offset, int length) {
455+
validateUnaryByte(src, dst, offset, length);
456+
validateRegistered(src, dst);
457+
super.shl(src, bits, dst, offset, length);
458+
}
459+
460+
@Override
461+
public void shrLogical(byte[] src, int bits, byte[] dst, int offset, int length) {
462+
validateUnaryByte(src, dst, offset, length);
463+
validateRegistered(src, dst);
464+
super.shrLogical(src, bits, dst, offset, length);
465+
}
466+
467+
@Override
468+
public void addWrapping(byte[] srcA, byte[] srcB, byte[] dst, int offset, int length) {
469+
validateBinaryByte(srcA, srcB, dst, offset, length);
470+
validateRegistered(srcA, srcB, dst);
471+
super.addWrapping(srcA, srcB, dst, offset, length);
472+
}
473+
474+
@Override
475+
public void subWrapping(byte[] srcA, byte[] srcB, byte[] dst, int offset, int length) {
476+
validateBinaryByte(srcA, srcB, dst, offset, length);
477+
validateRegistered(srcA, srcB, dst);
478+
super.subWrapping(srcA, srcB, dst, offset, length);
479+
}
480+
481+
@Override
482+
public void unpackUnsignedByteToInt(byte[] src, int srcOffset, int[] dst, int dstOffset, int length) {
483+
validateNotNull(src, "src");
484+
validateNotNull(dst, "dst");
485+
validateRange(src.length, srcOffset, length, "src");
486+
validateRange(dst.length, dstOffset, length, "dst");
487+
validateRegistered(src, dst);
488+
super.unpackUnsignedByteToInt(src, srcOffset, dst, dstOffset, length);
489+
}
490+
491+
@Override
492+
public void add(int[] srcA, int srcAOffset, int[] srcB, int srcBOffset, int[] dst, int dstOffset, int length) {
493+
validateNotNull(srcA, "srcA");
494+
validateNotNull(srcB, "srcB");
495+
validateNotNull(dst, "dst");
496+
validateRange(srcA.length, srcAOffset, length, "srcA");
497+
validateRange(srcB.length, srcBOffset, length, "srcB");
498+
validateRange(dst.length, dstOffset, length, "dst");
499+
validateRegistered(srcA, srcB, dst);
500+
super.add(srcA, srcAOffset, srcB, srcBOffset, dst, dstOffset, length);
501+
}
502+
503+
@Override
504+
public void cmpEq(int[] srcA, int srcAOffset, int[] srcB, int srcBOffset, byte[] dstMask, int dstOffset, int length) {
505+
validateNotNull(srcA, "srcA");
506+
validateNotNull(srcB, "srcB");
507+
validateNotNull(dstMask, "dstMask");
508+
validateRange(srcA.length, srcAOffset, length, "srcA");
509+
validateRange(srcB.length, srcBOffset, length, "srcB");
510+
validateRange(dstMask.length, dstOffset, length, "dstMask");
511+
validateRegistered(srcA, srcB, dstMask);
512+
super.cmpEq(srcA, srcAOffset, srcB, srcBOffset, dstMask, dstOffset, length);
513+
}
514+
515+
@Override
516+
public void cmpLt(int[] srcA, int srcAOffset, int[] srcB, int srcBOffset, byte[] dstMask, int dstOffset, int length) {
517+
validateNotNull(srcA, "srcA");
518+
validateNotNull(srcB, "srcB");
519+
validateNotNull(dstMask, "dstMask");
520+
validateRange(srcA.length, srcAOffset, length, "srcA");
521+
validateRange(srcB.length, srcBOffset, length, "srcB");
522+
validateRange(dstMask.length, dstOffset, length, "dstMask");
523+
validateRegistered(srcA, srcB, dstMask);
524+
super.cmpLt(srcA, srcAOffset, srcB, srcBOffset, dstMask, dstOffset, length);
525+
}
526+
527+
@Override
528+
public void select(byte[] mask, int maskOffset, int[] trueValues, int trueOffset, int[] falseValues, int falseOffset, int[] dst, int dstOffset, int length) {
529+
validateNotNull(mask, "mask");
530+
validateNotNull(trueValues, "trueValues");
531+
validateNotNull(falseValues, "falseValues");
532+
validateNotNull(dst, "dst");
533+
validateRange(mask.length, maskOffset, length, "mask");
534+
validateRange(trueValues.length, trueOffset, length, "trueValues");
535+
validateRange(falseValues.length, falseOffset, length, "falseValues");
536+
validateRange(dst.length, dstOffset, length, "dst");
537+
validateRegistered(mask, trueValues, falseValues, dst);
538+
super.select(mask, maskOffset, trueValues, trueOffset, falseValues, falseOffset, dst, dstOffset, length);
539+
}
540+
453541
private void validateRegistered(Object... arrays) {
454542
for (int i = 0; i < arrays.length; i++) {
455543
Object arr = arrays[i];

Ports/iOSPort/nativeSources/IOSSimd.m

Lines changed: 132 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -915,3 +915,135 @@ JAVA_VOID com_codename1_impl_ios_IOSSimd_select___byte_1ARRAY_int_1ARRAY_int_1AR
915915
d[i] = m[i] != 0 ? t[i] : f[i];
916916
}
917917
}
918+
919+
JAVA_VOID com_codename1_impl_ios_IOSSimd_shl___byte_1ARRAY_int_byte_1ARRAY_int_int(CN1_THREAD_STATE_MULTI_ARG JAVA_OBJECT instanceObject, JAVA_OBJECT src, JAVA_INT bits, JAVA_OBJECT dst, JAVA_INT offset, JAVA_INT length) {
920+
JAVA_ARRAY_BYTE* s = (JAVA_ARRAY_BYTE*)((JAVA_ARRAY)src)->data;
921+
JAVA_ARRAY_BYTE* d = (JAVA_ARRAY_BYTE*)((JAVA_ARRAY)dst)->data;
922+
int shift = bits & 7;
923+
int i = offset;
924+
int end = offset + length;
925+
int8x16_t vshift = vdupq_n_s8((int8_t)shift);
926+
for (; i <= end - 16; i += 16) {
927+
uint8x16_t vs = vld1q_u8((uint8_t*)(s + i));
928+
vst1q_u8((uint8_t*)(d + i), vshlq_u8(vs, vshift));
929+
}
930+
for (; i < end; i++) {
931+
d[i] = (JAVA_ARRAY_BYTE)(((uint8_t)s[i]) << shift);
932+
}
933+
}
934+
935+
JAVA_VOID com_codename1_impl_ios_IOSSimd_shrLogical___byte_1ARRAY_int_byte_1ARRAY_int_int(CN1_THREAD_STATE_MULTI_ARG JAVA_OBJECT instanceObject, JAVA_OBJECT src, JAVA_INT bits, JAVA_OBJECT dst, JAVA_INT offset, JAVA_INT length) {
936+
JAVA_ARRAY_BYTE* s = (JAVA_ARRAY_BYTE*)((JAVA_ARRAY)src)->data;
937+
JAVA_ARRAY_BYTE* d = (JAVA_ARRAY_BYTE*)((JAVA_ARRAY)dst)->data;
938+
int shift = bits & 7;
939+
int i = offset;
940+
int end = offset + length;
941+
int8x16_t vneg = vdupq_n_s8((int8_t)(-shift));
942+
for (; i <= end - 16; i += 16) {
943+
uint8x16_t vs = vld1q_u8((uint8_t*)(s + i));
944+
vst1q_u8((uint8_t*)(d + i), vshlq_u8(vs, vneg));
945+
}
946+
for (; i < end; i++) {
947+
d[i] = (JAVA_ARRAY_BYTE)(((uint8_t)s[i]) >> shift);
948+
}
949+
}
950+
951+
JAVA_VOID com_codename1_impl_ios_IOSSimd_addWrapping___byte_1ARRAY_byte_1ARRAY_byte_1ARRAY_int_int(CN1_THREAD_STATE_MULTI_ARG JAVA_OBJECT instanceObject, JAVA_OBJECT srcA, JAVA_OBJECT srcB, JAVA_OBJECT dst, JAVA_INT offset, JAVA_INT length) {
952+
JAVA_ARRAY_BYTE* a = (JAVA_ARRAY_BYTE*)((JAVA_ARRAY)srcA)->data;
953+
JAVA_ARRAY_BYTE* b = (JAVA_ARRAY_BYTE*)((JAVA_ARRAY)srcB)->data;
954+
JAVA_ARRAY_BYTE* d = (JAVA_ARRAY_BYTE*)((JAVA_ARRAY)dst)->data;
955+
int i = offset;
956+
int end = offset + length;
957+
for (; i <= end - 16; i += 16) {
958+
uint8x16_t va = vld1q_u8((uint8_t*)(a + i));
959+
uint8x16_t vb = vld1q_u8((uint8_t*)(b + i));
960+
vst1q_u8((uint8_t*)(d + i), vaddq_u8(va, vb));
961+
}
962+
for (; i < end; i++) {
963+
d[i] = (JAVA_ARRAY_BYTE)((uint8_t)a[i] + (uint8_t)b[i]);
964+
}
965+
}
966+
967+
JAVA_VOID com_codename1_impl_ios_IOSSimd_subWrapping___byte_1ARRAY_byte_1ARRAY_byte_1ARRAY_int_int(CN1_THREAD_STATE_MULTI_ARG JAVA_OBJECT instanceObject, JAVA_OBJECT srcA, JAVA_OBJECT srcB, JAVA_OBJECT dst, JAVA_INT offset, JAVA_INT length) {
968+
JAVA_ARRAY_BYTE* a = (JAVA_ARRAY_BYTE*)((JAVA_ARRAY)srcA)->data;
969+
JAVA_ARRAY_BYTE* b = (JAVA_ARRAY_BYTE*)((JAVA_ARRAY)srcB)->data;
970+
JAVA_ARRAY_BYTE* d = (JAVA_ARRAY_BYTE*)((JAVA_ARRAY)dst)->data;
971+
int i = offset;
972+
int end = offset + length;
973+
for (; i <= end - 16; i += 16) {
974+
uint8x16_t va = vld1q_u8((uint8_t*)(a + i));
975+
uint8x16_t vb = vld1q_u8((uint8_t*)(b + i));
976+
vst1q_u8((uint8_t*)(d + i), vsubq_u8(va, vb));
977+
}
978+
for (; i < end; i++) {
979+
d[i] = (JAVA_ARRAY_BYTE)((uint8_t)a[i] - (uint8_t)b[i]);
980+
}
981+
}
982+
983+
JAVA_VOID com_codename1_impl_ios_IOSSimd_unpackUnsignedByteToInt___byte_1ARRAY_int_int_1ARRAY_int_int(CN1_THREAD_STATE_MULTI_ARG JAVA_OBJECT instanceObject, JAVA_OBJECT src, JAVA_INT srcOffset, JAVA_OBJECT dst, JAVA_INT dstOffset, JAVA_INT length) {
984+
JAVA_ARRAY_BYTE* s = (JAVA_ARRAY_BYTE*)((JAVA_ARRAY)src)->data;
985+
JAVA_ARRAY_INT* d = (JAVA_ARRAY_INT*)((JAVA_ARRAY)dst)->data;
986+
int i = 0;
987+
for (; i <= length - 16; i += 16) {
988+
uint8x16_t v = vld1q_u8((uint8_t*)(s + srcOffset + i));
989+
uint16x8_t lo16 = vmovl_u8(vget_low_u8(v));
990+
uint16x8_t hi16 = vmovl_u8(vget_high_u8(v));
991+
uint32x4_t x0 = vmovl_u16(vget_low_u16(lo16));
992+
uint32x4_t x1 = vmovl_u16(vget_high_u16(lo16));
993+
uint32x4_t x2 = vmovl_u16(vget_low_u16(hi16));
994+
uint32x4_t x3 = vmovl_u16(vget_high_u16(hi16));
995+
vst1q_s32((int32_t*)(d + dstOffset + i), vreinterpretq_s32_u32(x0));
996+
vst1q_s32((int32_t*)(d + dstOffset + i + 4), vreinterpretq_s32_u32(x1));
997+
vst1q_s32((int32_t*)(d + dstOffset + i + 8), vreinterpretq_s32_u32(x2));
998+
vst1q_s32((int32_t*)(d + dstOffset + i + 12), vreinterpretq_s32_u32(x3));
999+
}
1000+
for (; i < length; i++) {
1001+
d[dstOffset + i] = (JAVA_ARRAY_INT)(s[srcOffset + i] & 0xff);
1002+
}
1003+
}
1004+
1005+
JAVA_VOID com_codename1_impl_ios_IOSSimd_add___int_1ARRAY_int_int_1ARRAY_int_int_1ARRAY_int_int(CN1_THREAD_STATE_MULTI_ARG JAVA_OBJECT instanceObject, JAVA_OBJECT srcA, JAVA_INT srcAOffset, JAVA_OBJECT srcB, JAVA_INT srcBOffset, JAVA_OBJECT dst, JAVA_INT dstOffset, JAVA_INT length) {
1006+
JAVA_ARRAY_INT* a = (JAVA_ARRAY_INT*)((JAVA_ARRAY)srcA)->data;
1007+
JAVA_ARRAY_INT* b = (JAVA_ARRAY_INT*)((JAVA_ARRAY)srcB)->data;
1008+
JAVA_ARRAY_INT* d = (JAVA_ARRAY_INT*)((JAVA_ARRAY)dst)->data;
1009+
int i = 0;
1010+
for (; i <= length - 4; i += 4) {
1011+
int32x4_t va = vld1q_s32((int32_t*)(a + srcAOffset + i));
1012+
int32x4_t vb = vld1q_s32((int32_t*)(b + srcBOffset + i));
1013+
vst1q_s32((int32_t*)(d + dstOffset + i), vaddq_s32(va, vb));
1014+
}
1015+
for (; i < length; i++) {
1016+
d[dstOffset + i] = (JAVA_ARRAY_INT)((int32_t)a[srcAOffset + i] + (int32_t)b[srcBOffset + i]);
1017+
}
1018+
}
1019+
1020+
JAVA_VOID com_codename1_impl_ios_IOSSimd_cmpEq___int_1ARRAY_int_int_1ARRAY_int_byte_1ARRAY_int_int(CN1_THREAD_STATE_MULTI_ARG JAVA_OBJECT instanceObject, JAVA_OBJECT srcA, JAVA_INT srcAOffset, JAVA_OBJECT srcB, JAVA_INT srcBOffset, JAVA_OBJECT dstMask, JAVA_INT dstOffset, JAVA_INT length) {
1021+
JAVA_ARRAY_INT* a = (JAVA_ARRAY_INT*)((JAVA_ARRAY)srcA)->data;
1022+
JAVA_ARRAY_INT* b = (JAVA_ARRAY_INT*)((JAVA_ARRAY)srcB)->data;
1023+
JAVA_ARRAY_BYTE* m = (JAVA_ARRAY_BYTE*)((JAVA_ARRAY)dstMask)->data;
1024+
int end = length;
1025+
for (int i = 0; i < end; i++) {
1026+
m[dstOffset + i] = a[srcAOffset + i] == b[srcBOffset + i] ? (JAVA_ARRAY_BYTE)-1 : (JAVA_ARRAY_BYTE)0;
1027+
}
1028+
}
1029+
1030+
JAVA_VOID com_codename1_impl_ios_IOSSimd_cmpLt___int_1ARRAY_int_int_1ARRAY_int_byte_1ARRAY_int_int(CN1_THREAD_STATE_MULTI_ARG JAVA_OBJECT instanceObject, JAVA_OBJECT srcA, JAVA_INT srcAOffset, JAVA_OBJECT srcB, JAVA_INT srcBOffset, JAVA_OBJECT dstMask, JAVA_INT dstOffset, JAVA_INT length) {
1031+
JAVA_ARRAY_INT* a = (JAVA_ARRAY_INT*)((JAVA_ARRAY)srcA)->data;
1032+
JAVA_ARRAY_INT* b = (JAVA_ARRAY_INT*)((JAVA_ARRAY)srcB)->data;
1033+
JAVA_ARRAY_BYTE* m = (JAVA_ARRAY_BYTE*)((JAVA_ARRAY)dstMask)->data;
1034+
int end = length;
1035+
for (int i = 0; i < end; i++) {
1036+
m[dstOffset + i] = a[srcAOffset + i] < b[srcBOffset + i] ? (JAVA_ARRAY_BYTE)-1 : (JAVA_ARRAY_BYTE)0;
1037+
}
1038+
}
1039+
1040+
JAVA_VOID com_codename1_impl_ios_IOSSimd_select___byte_1ARRAY_int_int_1ARRAY_int_int_1ARRAY_int_int_1ARRAY_int_int(CN1_THREAD_STATE_MULTI_ARG JAVA_OBJECT instanceObject, JAVA_OBJECT mask, JAVA_INT maskOffset, JAVA_OBJECT trueValues, JAVA_INT trueOffset, JAVA_OBJECT falseValues, JAVA_INT falseOffset, JAVA_OBJECT dst, JAVA_INT dstOffset, JAVA_INT length) {
1041+
JAVA_ARRAY_BYTE* m = (JAVA_ARRAY_BYTE*)((JAVA_ARRAY)mask)->data;
1042+
JAVA_ARRAY_INT* t = (JAVA_ARRAY_INT*)((JAVA_ARRAY)trueValues)->data;
1043+
JAVA_ARRAY_INT* f = (JAVA_ARRAY_INT*)((JAVA_ARRAY)falseValues)->data;
1044+
JAVA_ARRAY_INT* d = (JAVA_ARRAY_INT*)((JAVA_ARRAY)dst)->data;
1045+
int end = length;
1046+
for (int i = 0; i < end; i++) {
1047+
d[dstOffset + i] = m[maskOffset + i] != 0 ? t[trueOffset + i] : f[falseOffset + i];
1048+
}
1049+
}

Ports/iOSPort/src/com/codename1/impl/ios/IOSSimd.java

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -200,6 +200,33 @@ public float[] allocFloat(int size) {
200200
@Override
201201
public native float dot(float[] srcA, float[] srcB, int offset, int length);
202202

203+
@Override
204+
public native void shl(byte[] src, int bits, byte[] dst, int offset, int length);
205+
206+
@Override
207+
public native void shrLogical(byte[] src, int bits, byte[] dst, int offset, int length);
208+
209+
@Override
210+
public native void addWrapping(byte[] srcA, byte[] srcB, byte[] dst, int offset, int length);
211+
212+
@Override
213+
public native void subWrapping(byte[] srcA, byte[] srcB, byte[] dst, int offset, int length);
214+
215+
@Override
216+
public native void unpackUnsignedByteToInt(byte[] src, int srcOffset, int[] dst, int dstOffset, int length);
217+
218+
@Override
219+
public native void add(int[] srcA, int srcAOffset, int[] srcB, int srcBOffset, int[] dst, int dstOffset, int length);
220+
221+
@Override
222+
public native void cmpEq(int[] srcA, int srcAOffset, int[] srcB, int srcBOffset, byte[] dstMask, int dstOffset, int length);
223+
224+
@Override
225+
public native void cmpLt(int[] srcA, int srcAOffset, int[] srcB, int srcBOffset, byte[] dstMask, int dstOffset, int length);
226+
227+
@Override
228+
public native void select(byte[] mask, int maskOffset, int[] trueValues, int trueOffset, int[] falseValues, int falseOffset, int[] dst, int dstOffset, int length);
229+
203230
private native byte[] allocByteNative(int size);
204231
private native int[] allocIntNative(int size);
205232
private native float[] allocFloatNative(int size);

0 commit comments

Comments
 (0)