diff --git a/src/hotspot/cpu/ppc/assembler_ppc.hpp b/src/hotspot/cpu/ppc/assembler_ppc.hpp index 7eda53749fb2..1765f636e6ff 100644 --- a/src/hotspot/cpu/ppc/assembler_ppc.hpp +++ b/src/hotspot/cpu/ppc/assembler_ppc.hpp @@ -551,6 +551,10 @@ class Assembler : public AbstractAssembler { STXVL_OPCODE = (31u << OPCODE_SHIFT | 397u << 1), LXVD2X_OPCODE = (31u << OPCODE_SHIFT | 844u << 1), STXVD2X_OPCODE = (31u << OPCODE_SHIFT | 972u << 1), + LXVW4X_OPCODE = (31u << OPCODE_SHIFT | 780u << 1), + STXVW4X_OPCODE = (31u << OPCODE_SHIFT | 908u << 1), + LXVB16X_OPCODE = (31u << OPCODE_SHIFT | 876u << 1), + STXVB16X_OPCODE= (31u << OPCODE_SHIFT | 1004u << 1), MTVSRD_OPCODE = (31u << OPCODE_SHIFT | 179u << 1), MTVSRDD_OPCODE = (31u << OPCODE_SHIFT | 435u << 1), MTVSRWZ_OPCODE = (31u << OPCODE_SHIFT | 243u << 1), @@ -2377,14 +2381,27 @@ class Assembler : public AbstractAssembler { inline void mfvscr( VectorRegister d); // Vector-Scalar (VSX) instructions. - inline void lxv( VectorSRegister d, int si16, Register a); - inline void stxv( VectorSRegister d, int si16, Register a); - inline void lxvl( VectorSRegister d, Register a, Register b); - inline void stxvl( VectorSRegister d, Register a, Register b); + // Power8 inline void lxvd2x( VectorSRegister d, Register a); inline void lxvd2x( VectorSRegister d, Register a, Register b); inline void stxvd2x( VectorSRegister d, Register a); inline void stxvd2x( VectorSRegister d, Register a, Register b); + inline void lxvw4x( VectorSRegister d, Register a); + inline void lxvw4x( VectorSRegister d, Register a, Register b); + inline void stxvw4x( VectorSRegister d, Register a); + inline void stxvw4x( VectorSRegister d, Register a, Register b); + + // Power9 + inline void lxvb16x( VectorSRegister d, Register a); + inline void lxvb16x( VectorSRegister d, Register a, Register b); + inline void stxvb16x( VectorSRegister d, Register a); + inline void stxvb16x( VectorSRegister d, Register a, Register b); + + inline void lxv( VectorSRegister d, int si16, Register a); + inline void stxv( VectorSRegister d, int si16, Register a); + inline void lxvl( VectorSRegister d, Register a, Register b); + inline void stxvl( VectorSRegister d, Register a, Register b); + inline void mtvrwz( VectorRegister d, Register a); inline void mfvrwz( Register a, VectorRegister d); inline void mtvrd( VectorRegister d, Register a); @@ -2579,6 +2596,15 @@ class Assembler : public AbstractAssembler { inline void vec_perm(VectorRegister first_dest, VectorRegister second, VectorRegister perm); inline void vec_perm(VectorRegister dest, VectorRegister first, VectorRegister second, VectorRegister perm); + // Load/Store unaligned vectors with offs (multiple of 16). Byte versions require vp for Power8 LE. + inline void load_byte_vector_unaligned(VectorRegister dest, int offs, Register base, Register tmp, + VectorRegister vp); // vp should be pre-computed (see generator below) + inline void store_byte_vector_unaligned(VectorRegister val, int offs, Register base, Register tmp, + VectorRegister vp, VectorRegister vtmp = vnoreg); // clobbers val if no vtmp provided + inline void compute_vp_for_byte_vector_unaligned(VectorRegister dest, VectorRegister vtmp); + inline void load_word_vector_unaligned(VectorRegister dest, int offs, Register base, Register tmp); + inline void store_word_vector_unaligned(VectorRegister val, int offs, Register base, Register tmp); + // RegisterOrConstant versions. // These emitters choose between the versions using two registers and // those with register and immediate, depending on the content of roc. diff --git a/src/hotspot/cpu/ppc/assembler_ppc.inline.hpp b/src/hotspot/cpu/ppc/assembler_ppc.inline.hpp index 4aa767174a8e..c1ce1454c212 100644 --- a/src/hotspot/cpu/ppc/assembler_ppc.inline.hpp +++ b/src/hotspot/cpu/ppc/assembler_ppc.inline.hpp @@ -828,6 +828,14 @@ inline void Assembler::lxvd2x( VectorSRegister d, Register s1) { e inline void Assembler::lxvd2x( VectorSRegister d, Register s1, Register s2) { emit_int32( LXVD2X_OPCODE | vsrt(d) | ra0mem(s1) | rb(s2)); } inline void Assembler::stxvd2x( VectorSRegister d, Register s1) { emit_int32( STXVD2X_OPCODE | vsrs(d) | ra(0) | rb(s1)); } inline void Assembler::stxvd2x( VectorSRegister d, Register s1, Register s2) { emit_int32( STXVD2X_OPCODE | vsrs(d) | ra0mem(s1) | rb(s2)); } +inline void Assembler::lxvw4x( VectorSRegister d, Register s1) { emit_int32( LXVW4X_OPCODE | vsrt(d) | ra(0) | rb(s1)); } +inline void Assembler::lxvw4x( VectorSRegister d, Register s1, Register s2) { emit_int32( LXVW4X_OPCODE | vsrt(d) | ra0mem(s1) | rb(s2)); } +inline void Assembler::stxvw4x( VectorSRegister d, Register s1) { emit_int32( STXVW4X_OPCODE | vsrs(d) | ra(0) | rb(s1)); } +inline void Assembler::stxvw4x( VectorSRegister d, Register s1, Register s2) { emit_int32( STXVW4X_OPCODE | vsrs(d) | ra0mem(s1) | rb(s2)); } +inline void Assembler::lxvb16x( VectorSRegister d, Register s1) { emit_int32( LXVB16X_OPCODE | vsrt(d) | ra(0) | rb(s1)); } +inline void Assembler::lxvb16x( VectorSRegister d, Register s1, Register s2) { emit_int32( LXVB16X_OPCODE | vsrt(d) | ra0mem(s1) | rb(s2)); } +inline void Assembler::stxvb16x(VectorSRegister d, Register s1) { emit_int32( STXVB16X_OPCODE| vsrs(d) | ra(0) | rb(s1)); } +inline void Assembler::stxvb16x(VectorSRegister d, Register s1, Register s2) { emit_int32( STXVB16X_OPCODE| vsrs(d) | ra0mem(s1) | rb(s2)); } inline void Assembler::mtvsrd( VectorSRegister d, Register a) { emit_int32( MTVSRD_OPCODE | vsrt(d) | ra(a)); } inline void Assembler::mtvsrdd( VectorSRegister d, Register a, Register b) { emit_int32( MTVSRDD_OPCODE | vsrt(d) | ra(a) | rb(b)); } inline void Assembler::mfvsrd( Register d, VectorSRegister a) { emit_int32( MFVSRD_OPCODE | vsrs(a) | ra(d)); } @@ -1188,6 +1196,108 @@ inline void Assembler::vec_perm(VectorRegister dest, VectorRegister first, Vecto #endif } +inline void Assembler::load_byte_vector_unaligned(VectorRegister dest, int offs, Register base, Register tmp, + VectorRegister vp) { + VectorSRegister vsr = dest->to_vsr(); + if (PowerArchitecturePPC64 >= 9) { +#if !defined(VM_LITTLE_ENDIAN) + lxv(vsr, offs, base); // all vector load/store instructions use the same byte order on BE +#else + if (offs == 0) { + lxvb16x(vsr, base); + } else { + li(tmp, offs); + lxvb16x(vsr, base, tmp); + } +#endif + } else { // Power8 only supports very limited instructions + if (offs == 0) { + lxvd2x(vsr, base); + } else { + li(tmp, offs); + lxvd2x(vsr, base, tmp); + } +#if defined(VM_LITTLE_ENDIAN) + // need to swap bytes in both double-words + vperm(dest, dest, dest, vp); +#endif + } +} + +inline void Assembler::store_byte_vector_unaligned(VectorRegister val, int offs, Register base, Register tmp, + VectorRegister vp, VectorRegister vtmp) { + VectorSRegister vsr = val->to_vsr(); + if (PowerArchitecturePPC64 >= 9) { +#if !defined(VM_LITTLE_ENDIAN) + stxv(vsr, offs, base); // all vector load/store instructions use the same byte order on BE +#else + if (offs == 0) { + stxvb16x(vsr, base); + } else { + li(tmp, offs); + stxvb16x(vsr, base, tmp); + } +#endif + } else { // Power8 only supports very limited instructions +#if defined(VM_LITTLE_ENDIAN) + // need to swap bytes in both double-words + if (vtmp != vnoreg) { + vperm(vtmp, val, val, vp); + vsr = vtmp->to_vsr(); + } else { + vperm(val, val, val, vp); // clobbers val! + } +#endif + if (offs == 0) { + stxvd2x(vsr, base); + } else { + li(tmp, offs); + stxvd2x(vsr, base, tmp); + } + } +} + +inline void Assembler::compute_vp_for_byte_vector_unaligned(VectorRegister dest, VectorRegister vtmp) { +#if defined(VM_LITTLE_ENDIAN) + if (PowerArchitecturePPC64 < 9) { + li(R0, 0); + vspltisb(vtmp, 7); // vtmp = [7, ..., 7] + lvsl(dest, R0); // dest = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15] + vxor(dest, dest, vtmp); // dest = [7, 6, 5, 4, 3, 2, 1, 0, 15, 14, 13, 12, 11, 10, 9, 8] + } +#endif +} + +inline void Assembler::load_word_vector_unaligned(VectorRegister dest, int offs, Register base, Register tmp) { + VectorSRegister vsr = dest->to_vsr(); +#if !defined(VM_LITTLE_ENDIAN) + if (PowerArchitecturePPC64 >= 9) { + lxv(vsr, offs, base); // all vector load/store instructions use the same byte order on BE + } else +#endif + if (offs == 0) { + lxvw4x(vsr, base); + } else { + li(tmp, offs); + lxvw4x(vsr, base, tmp); + } +} + +inline void Assembler::store_word_vector_unaligned(VectorRegister val, int offs, Register base, Register tmp) { + VectorSRegister vsr = val->to_vsr(); +#if !defined(VM_LITTLE_ENDIAN) + if (PowerArchitecturePPC64 >= 9) { + stxv(vsr, offs, base); // all vector load/store instructions use the same byte order on BE + } else +#endif + if (offs == 0) { + stxvw4x(vsr, base); + } else { + li(tmp, offs); + stxvw4x(vsr, base, tmp); + } +} + inline void Assembler::load_const(Register d, void* x, Register tmp) { load_const(d, (long)x, tmp); } diff --git a/src/hotspot/cpu/ppc/stubGenerator_ppc.cpp b/src/hotspot/cpu/ppc/stubGenerator_ppc.cpp index 58f984e74b8f..5ad5f57958e4 100644 --- a/src/hotspot/cpu/ppc/stubGenerator_ppc.cpp +++ b/src/hotspot/cpu/ppc/stubGenerator_ppc.cpp @@ -2810,10 +2810,8 @@ class StubGenerator: public StubCodeGenerator { Register to = R4_ARG2; // destination array address Register key = R5_ARG3; // round key array - Register keylen = R8; - Register temp = R9; - Register keypos = R10; - Register fifteen = R12; + Register keylen = R6; + Register tmp = R7; VectorRegister vRet = VR0; @@ -2822,68 +2820,27 @@ class StubGenerator: public StubCodeGenerator { VectorRegister vKey3 = VR3; VectorRegister vKey4 = VR4; - VectorRegister fromPerm = VR5; - VectorRegister keyPerm = VR6; - VectorRegister toPerm = VR7; - VectorRegister fSplt = VR8; + VectorRegister vp = VR6; // permute vector for byte vector accesses on P8 LE - VectorRegister vTmp1 = VR9; - VectorRegister vTmp2 = VR10; - VectorRegister vTmp3 = VR11; - VectorRegister vTmp4 = VR12; - - __ li (fifteen, 15); + __ compute_vp_for_byte_vector_unaligned(vp, /*temp*/ vRet); // load unaligned from[0-15] to vRet - __ lvx (vRet, from); - __ lvx (vTmp1, fifteen, from); - __ lvsl (fromPerm, from); -#ifdef VM_LITTLE_ENDIAN - __ vspltisb (fSplt, 0x0f); - __ vxor (fromPerm, fromPerm, fSplt); -#endif - __ vperm (vRet, vRet, vTmp1, fromPerm); + __ load_byte_vector_unaligned(vRet, 0, from, tmp, vp); + + // load the 1st round key to vKey1 + __ load_word_vector_unaligned(vKey1, 0, key, tmp); // load keylen (44 or 52 or 60) __ lwz (keylen, arrayOopDesc::length_offset_in_bytes() - arrayOopDesc::base_offset_in_bytes(T_INT), key); - // to load keys - __ load_perm (keyPerm, key); -#ifdef VM_LITTLE_ENDIAN - __ vspltisb (vTmp2, -16); - __ vrld (keyPerm, keyPerm, vTmp2); - __ vrld (keyPerm, keyPerm, vTmp2); - __ vsldoi (keyPerm, keyPerm, keyPerm, 8); -#endif - - // load the 1st round key to vTmp1 - __ lvx (vTmp1, key); - __ li (keypos, 16); - __ lvx (vKey1, keypos, key); - __ vec_perm (vTmp1, vKey1, keyPerm); - // 1st round - __ vxor (vRet, vRet, vTmp1); - - // load the 2nd round key to vKey1 - __ li (keypos, 32); - __ lvx (vKey2, keypos, key); - __ vec_perm (vKey1, vKey2, keyPerm); - - // load the 3rd round key to vKey2 - __ li (keypos, 48); - __ lvx (vKey3, keypos, key); - __ vec_perm (vKey2, vKey3, keyPerm); - - // load the 4th round key to vKey3 - __ li (keypos, 64); - __ lvx (vKey4, keypos, key); - __ vec_perm (vKey3, vKey4, keyPerm); + __ vxor (vRet, vRet, vKey1); - // load the 5th round key to vKey4 - __ li (keypos, 80); - __ lvx (vTmp1, keypos, key); - __ vec_perm (vKey4, vTmp1, keyPerm); + // load the 2nd - 5th round key to vKey1 - vKey4 + __ load_word_vector_unaligned(vKey1, 16, key, tmp); + __ load_word_vector_unaligned(vKey2, 32, key, tmp); + __ load_word_vector_unaligned(vKey3, 48, key, tmp); + __ load_word_vector_unaligned(vKey4, 64, key, tmp); // 2nd - 5th rounds __ vcipher (vRet, vRet, vKey1); @@ -2891,25 +2848,11 @@ class StubGenerator: public StubCodeGenerator { __ vcipher (vRet, vRet, vKey3); __ vcipher (vRet, vRet, vKey4); - // load the 6th round key to vKey1 - __ li (keypos, 96); - __ lvx (vKey2, keypos, key); - __ vec_perm (vKey1, vTmp1, vKey2, keyPerm); - - // load the 7th round key to vKey2 - __ li (keypos, 112); - __ lvx (vKey3, keypos, key); - __ vec_perm (vKey2, vKey3, keyPerm); - - // load the 8th round key to vKey3 - __ li (keypos, 128); - __ lvx (vKey4, keypos, key); - __ vec_perm (vKey3, vKey4, keyPerm); - - // load the 9th round key to vKey4 - __ li (keypos, 144); - __ lvx (vTmp1, keypos, key); - __ vec_perm (vKey4, vTmp1, keyPerm); + // load the 6th - 9th round key to vKey1 - vKey4 + __ load_word_vector_unaligned(vKey1, 80, key, tmp); + __ load_word_vector_unaligned(vKey2, 96, key, tmp); + __ load_word_vector_unaligned(vKey3, 112, key, tmp); + __ load_word_vector_unaligned(vKey4, 128, key, tmp); // 6th - 9th rounds __ vcipher (vRet, vRet, vKey1); @@ -2917,15 +2860,9 @@ class StubGenerator: public StubCodeGenerator { __ vcipher (vRet, vRet, vKey3); __ vcipher (vRet, vRet, vKey4); - // load the 10th round key to vKey1 - __ li (keypos, 160); - __ lvx (vKey2, keypos, key); - __ vec_perm (vKey1, vTmp1, vKey2, keyPerm); - - // load the 11th round key to vKey2 - __ li (keypos, 176); - __ lvx (vTmp1, keypos, key); - __ vec_perm (vKey2, vTmp1, keyPerm); + // load the 10th - 11th round key to vKey1 - vKey2 + __ load_word_vector_unaligned(vKey1, 144, key, tmp); + __ load_word_vector_unaligned(vKey2, 160, key, tmp); // if all round keys are loaded, skip next 4 rounds __ cmpwi (CCR0, keylen, 44); @@ -2935,15 +2872,9 @@ class StubGenerator: public StubCodeGenerator { __ vcipher (vRet, vRet, vKey1); __ vcipher (vRet, vRet, vKey2); - // load the 12th round key to vKey1 - __ li (keypos, 192); - __ lvx (vKey2, keypos, key); - __ vec_perm (vKey1, vTmp1, vKey2, keyPerm); - - // load the 13th round key to vKey2 - __ li (keypos, 208); - __ lvx (vTmp1, keypos, key); - __ vec_perm (vKey2, vTmp1, keyPerm); + // load the 12th - 13th round key to vKey1 - vKey2 + __ load_word_vector_unaligned(vKey1, 176, key, tmp); + __ load_word_vector_unaligned(vKey2, 192, key, tmp); // if all round keys are loaded, skip next 2 rounds __ cmpwi (CCR0, keylen, 52); @@ -2958,15 +2889,9 @@ class StubGenerator: public StubCodeGenerator { __ vcipher (vRet, vRet, vKey1); __ vcipher (vRet, vRet, vKey2); - // load the 14th round key to vKey1 - __ li (keypos, 224); - __ lvx (vKey2, keypos, key); - __ vec_perm (vKey1, vTmp1, vKey2, keyPerm); - - // load the 15th round key to vKey2 - __ li (keypos, 240); - __ lvx (vTmp1, keypos, key); - __ vec_perm (vKey2, vTmp1, keyPerm); + // load the 14th - 15th round key to vKey1 - vKey2 + __ load_word_vector_unaligned(vKey1, 208, key, tmp); + __ load_word_vector_unaligned(vKey2, 224, key, tmp); __ bind(L_doLast); @@ -2974,23 +2899,8 @@ class StubGenerator: public StubCodeGenerator { __ vcipher (vRet, vRet, vKey1); __ vcipherlast (vRet, vRet, vKey2); -#ifdef VM_LITTLE_ENDIAN - // toPerm = 0x0F0E0D0C0B0A09080706050403020100 - __ lvsl (toPerm, keypos); // keypos is a multiple of 16 - __ vxor (toPerm, toPerm, fSplt); - - // Swap Bytes - __ vperm (vRet, vRet, vRet, toPerm); -#endif - // store result (unaligned) - // Note: We can't use a read-modify-write sequence which touches additional Bytes. - Register lo = temp, hi = fifteen; // Reuse - __ vsldoi (vTmp1, vRet, vRet, 8); - __ mfvrd (hi, vRet); - __ mfvrd (lo, vTmp1); - __ std (hi, 0 LITTLE_ENDIAN_ONLY(+ 8), to); - __ std (lo, 0 BIG_ENDIAN_ONLY(+ 8), to); + __ store_byte_vector_unaligned(vRet, 0, to, tmp, vp); __ blr(); @@ -3017,10 +2927,8 @@ class StubGenerator: public StubCodeGenerator { Register to = R4_ARG2; // destination array address Register key = R5_ARG3; // round key array - Register keylen = R8; - Register temp = R9; - Register keypos = R10; - Register fifteen = R12; + Register keylen = R6; + Register tmp = R7; VectorRegister vRet = VR0; @@ -3030,41 +2938,16 @@ class StubGenerator: public StubCodeGenerator { VectorRegister vKey4 = VR4; VectorRegister vKey5 = VR5; - VectorRegister fromPerm = VR6; - VectorRegister keyPerm = VR7; - VectorRegister toPerm = VR8; - VectorRegister fSplt = VR9; - - VectorRegister vTmp1 = VR10; - VectorRegister vTmp2 = VR11; - VectorRegister vTmp3 = VR12; - VectorRegister vTmp4 = VR13; + VectorRegister vp = VR6; // permute vector for byte vector accesses on P8 LE - __ li (fifteen, 15); + __ compute_vp_for_byte_vector_unaligned(vp, /*temp*/ vRet); // load unaligned from[0-15] to vRet - __ lvx (vRet, from); - __ lvx (vTmp1, fifteen, from); - __ lvsl (fromPerm, from); -#ifdef VM_LITTLE_ENDIAN - __ vspltisb (fSplt, 0x0f); - __ vxor (fromPerm, fromPerm, fSplt); -#endif - __ vperm (vRet, vRet, vTmp1, fromPerm); // align [and byte swap in LE] + __ load_byte_vector_unaligned(vRet, 0, from, tmp, vp); // load keylen (44 or 52 or 60) __ lwz (keylen, arrayOopDesc::length_offset_in_bytes() - arrayOopDesc::base_offset_in_bytes(T_INT), key); - // to load keys - __ load_perm (keyPerm, key); -#ifdef VM_LITTLE_ENDIAN - __ vxor (vTmp2, vTmp2, vTmp2); - __ vspltisb (vTmp2, -16); - __ vrld (keyPerm, keyPerm, vTmp2); - __ vrld (keyPerm, keyPerm, vTmp2); - __ vsldoi (keyPerm, keyPerm, keyPerm, 8); -#endif - __ cmpwi (CCR0, keylen, 44); __ beq (CCR0, L_do44); @@ -3076,32 +2959,12 @@ class StubGenerator: public StubCodeGenerator { __ bne (CCR0, L_error); #endif - // load the 15th round key to vKey1 - __ li (keypos, 240); - __ lvx (vKey1, keypos, key); - __ li (keypos, 224); - __ lvx (vKey2, keypos, key); - __ vec_perm (vKey1, vKey2, vKey1, keyPerm); - - // load the 14th round key to vKey2 - __ li (keypos, 208); - __ lvx (vKey3, keypos, key); - __ vec_perm (vKey2, vKey3, vKey2, keyPerm); - - // load the 13th round key to vKey3 - __ li (keypos, 192); - __ lvx (vKey4, keypos, key); - __ vec_perm (vKey3, vKey4, vKey3, keyPerm); - - // load the 12th round key to vKey4 - __ li (keypos, 176); - __ lvx (vKey5, keypos, key); - __ vec_perm (vKey4, vKey5, vKey4, keyPerm); - - // load the 11th round key to vKey5 - __ li (keypos, 160); - __ lvx (vTmp1, keypos, key); - __ vec_perm (vKey5, vTmp1, vKey5, keyPerm); + // load the 15th - 11th round key to vKey1 - vKey5 + __ load_word_vector_unaligned(vKey1, 224, key, tmp); + __ load_word_vector_unaligned(vKey2, 208, key, tmp); + __ load_word_vector_unaligned(vKey3, 192, key, tmp); + __ load_word_vector_unaligned(vKey4, 176, key, tmp); + __ load_word_vector_unaligned(vKey5, 160, key, tmp); // 1st - 5th rounds __ vxor (vRet, vRet, vKey1); @@ -3115,22 +2978,10 @@ class StubGenerator: public StubCodeGenerator { __ align(32); __ bind (L_do52); - // load the 13th round key to vKey1 - __ li (keypos, 208); - __ lvx (vKey1, keypos, key); - __ li (keypos, 192); - __ lvx (vKey2, keypos, key); - __ vec_perm (vKey1, vKey2, vKey1, keyPerm); - - // load the 12th round key to vKey2 - __ li (keypos, 176); - __ lvx (vKey3, keypos, key); - __ vec_perm (vKey2, vKey3, vKey2, keyPerm); - - // load the 11th round key to vKey3 - __ li (keypos, 160); - __ lvx (vTmp1, keypos, key); - __ vec_perm (vKey3, vTmp1, vKey3, keyPerm); + // load the 13th - 11th round key to vKey1 - vKey3 + __ load_word_vector_unaligned(vKey1, 192, key, tmp); + __ load_word_vector_unaligned(vKey2, 176, key, tmp); + __ load_word_vector_unaligned(vKey3, 160, key, tmp); // 1st - 3rd rounds __ vxor (vRet, vRet, vKey1); @@ -3143,41 +2994,19 @@ class StubGenerator: public StubCodeGenerator { __ bind (L_do44); // load the 11th round key to vKey1 - __ li (keypos, 176); - __ lvx (vKey1, keypos, key); - __ li (keypos, 160); - __ lvx (vTmp1, keypos, key); - __ vec_perm (vKey1, vTmp1, vKey1, keyPerm); + __ load_word_vector_unaligned(vKey1, 160, key, tmp); // 1st round __ vxor (vRet, vRet, vKey1); __ bind (L_doLast); - // load the 10th round key to vKey1 - __ li (keypos, 144); - __ lvx (vKey2, keypos, key); - __ vec_perm (vKey1, vKey2, vTmp1, keyPerm); - - // load the 9th round key to vKey2 - __ li (keypos, 128); - __ lvx (vKey3, keypos, key); - __ vec_perm (vKey2, vKey3, vKey2, keyPerm); - - // load the 8th round key to vKey3 - __ li (keypos, 112); - __ lvx (vKey4, keypos, key); - __ vec_perm (vKey3, vKey4, vKey3, keyPerm); - - // load the 7th round key to vKey4 - __ li (keypos, 96); - __ lvx (vKey5, keypos, key); - __ vec_perm (vKey4, vKey5, vKey4, keyPerm); - - // load the 6th round key to vKey5 - __ li (keypos, 80); - __ lvx (vTmp1, keypos, key); - __ vec_perm (vKey5, vTmp1, vKey5, keyPerm); + // load the 10th - 6th round key to vKey1 - vKey5 + __ load_word_vector_unaligned(vKey1, 144, key, tmp); + __ load_word_vector_unaligned(vKey2, 128, key, tmp); + __ load_word_vector_unaligned(vKey3, 112, key, tmp); + __ load_word_vector_unaligned(vKey4, 96, key, tmp); + __ load_word_vector_unaligned(vKey5, 80, key, tmp); // last 10th - 6th rounds __ vncipher (vRet, vRet, vKey1); @@ -3186,29 +3015,12 @@ class StubGenerator: public StubCodeGenerator { __ vncipher (vRet, vRet, vKey4); __ vncipher (vRet, vRet, vKey5); - // load the 5th round key to vKey1 - __ li (keypos, 64); - __ lvx (vKey2, keypos, key); - __ vec_perm (vKey1, vKey2, vTmp1, keyPerm); - - // load the 4th round key to vKey2 - __ li (keypos, 48); - __ lvx (vKey3, keypos, key); - __ vec_perm (vKey2, vKey3, vKey2, keyPerm); - - // load the 3rd round key to vKey3 - __ li (keypos, 32); - __ lvx (vKey4, keypos, key); - __ vec_perm (vKey3, vKey4, vKey3, keyPerm); - - // load the 2nd round key to vKey4 - __ li (keypos, 16); - __ lvx (vKey5, keypos, key); - __ vec_perm (vKey4, vKey5, vKey4, keyPerm); - - // load the 1st round key to vKey5 - __ lvx (vTmp1, key); - __ vec_perm (vKey5, vTmp1, vKey5, keyPerm); + // load the 5th - 1st round key to vKey1 - vKey5 + __ load_word_vector_unaligned(vKey1, 64, key, tmp); + __ load_word_vector_unaligned(vKey2, 48, key, tmp); + __ load_word_vector_unaligned(vKey3, 32, key, tmp); + __ load_word_vector_unaligned(vKey4, 16, key, tmp); + __ load_word_vector_unaligned(vKey5, 0, key, tmp); // last 5th - 1th rounds __ vncipher (vRet, vRet, vKey1); @@ -3217,23 +3029,8 @@ class StubGenerator: public StubCodeGenerator { __ vncipher (vRet, vRet, vKey4); __ vncipherlast (vRet, vRet, vKey5); -#ifdef VM_LITTLE_ENDIAN - // toPerm = 0x0F0E0D0C0B0A09080706050403020100 - __ lvsl (toPerm, keypos); // keypos is a multiple of 16 - __ vxor (toPerm, toPerm, fSplt); - - // Swap Bytes - __ vperm (vRet, vRet, vRet, toPerm); -#endif - // store result (unaligned) - // Note: We can't use a read-modify-write sequence which touches additional Bytes. - Register lo = temp, hi = fifteen; // Reuse - __ vsldoi (vTmp1, vRet, vRet, 8); - __ mfvrd (hi, vRet); - __ mfvrd (lo, vTmp1); - __ std (hi, 0 LITTLE_ENDIAN_ONLY(+ 8), to); - __ std (lo, 0 BIG_ENDIAN_ONLY(+ 8), to); + __ store_byte_vector_unaligned(vRet, 0, to, tmp, vp); __ blr(); diff --git a/src/java.base/unix/native/libnio/ch/Net.c b/src/java.base/unix/native/libnio/ch/Net.c index b9ab0baf5413..9b6f8f5294d9 100644 --- a/src/java.base/unix/native/libnio/ch/Net.c +++ b/src/java.base/unix/native/libnio/ch/Net.c @@ -91,6 +91,11 @@ static void initGroupSourceReq(JNIEnv* env, jbyteArray group, jint index, #ifdef _AIX +static jboolean isIPv4MappedGroup(struct group_source_req *req) { + struct sockaddr_in6 *sin6 = (struct sockaddr_in6 *)&req->gsr_group; + return IN6_IS_ADDR_V4MAPPED(&sin6->sin6_addr) ? JNI_TRUE : JNI_FALSE; +} + /* * Checks whether or not "socket extensions for multicast source filters" is supported. * Returns JNI_TRUE if it is supported, JNI_FALSE otherwise @@ -220,7 +225,7 @@ Java_sun_nio_ch_Net_shouldSetBothIPv4AndIPv6Options0(JNIEnv* env, jclass cl) JNIEXPORT jboolean JNICALL Java_sun_nio_ch_Net_canIPv6SocketJoinIPv4Group0(JNIEnv* env, jclass cl) { -#if defined(__linux__) || defined(__APPLE__) +#if defined(__linux__) || defined(__APPLE__) || defined(_AIX) /* IPv6 sockets can join IPv4 multicast groups */ return JNI_TRUE; #else @@ -232,7 +237,7 @@ Java_sun_nio_ch_Net_canIPv6SocketJoinIPv4Group0(JNIEnv* env, jclass cl) JNIEXPORT jboolean JNICALL Java_sun_nio_ch_Net_canJoin6WithIPv4Group0(JNIEnv* env, jclass cl) { -#if defined(__APPLE__) +#if defined(__APPLE__) || defined(_AIX) /* IPV6_ADD_MEMBERSHIP can be used to join IPv4 multicast groups */ return JNI_TRUE; #else @@ -751,6 +756,11 @@ Java_sun_nio_ch_Net_joinOrDrop6(JNIEnv *env, jobject this, jboolean join, jobjec if (n < 0) { if (join && (errno == ENOPROTOOPT || errno == EOPNOTSUPP)) return IOS_UNAVAILABLE; +#ifdef _AIX + // AIX rejects MCAST_*_SOURCE_GROUP for IPv4-mapped groups with EINVAL + if (source != NULL && errno == EINVAL && isIPv4MappedGroup(&req)) + return IOS_UNAVAILABLE; +#endif handleSocketErrorWithMessage(env, errno, "setsockopt failed"); } return 0; @@ -775,6 +785,11 @@ Java_sun_nio_ch_Net_blockOrUnblock6(JNIEnv *env, jobject this, jboolean block, j if (n < 0) { if (block && (errno == ENOPROTOOPT || errno == EOPNOTSUPP)) return IOS_UNAVAILABLE; +#ifdef _AIX + // AIX rejects MCAST_BLOCK/UNBLOCK_SOURCE for IPv4-mapped groups with EINVAL + if (errno == EINVAL && isIPv4MappedGroup(&req)) + return IOS_UNAVAILABLE; +#endif handleSocketError(env, errno); } return 0; @@ -971,4 +986,3 @@ Java_sun_nio_ch_Net_sendOOB(JNIEnv* env, jclass this, jobject fdo, jbyte b) int n = send(fdval(env, fdo), (const void*)&b, 1, MSG_OOB); return convertReturnVal(env, n, JNI_FALSE); } - diff --git a/src/java.desktop/share/legal/libpng.md b/src/java.desktop/share/legal/libpng.md index 4c17a52a7ef2..aa0ecb68b3be 100644 --- a/src/java.desktop/share/legal/libpng.md +++ b/src/java.desktop/share/legal/libpng.md @@ -1,4 +1,4 @@ -## libpng v1.6.58 +## libpng v1.6.59 ### libpng License
@@ -160,6 +160,7 @@ Authors, for copyright and licensing purposes.
* Adam Richter
* Alexander Smorkalov
* Andreas Dilger
+ * Anthony Hurtado
* Chris Blume
* Cosmin Truta
* Dave Martindale
@@ -197,6 +198,7 @@ Authors, for copyright and licensing purposes.
* Vadim Barkov
* Willem van Schaik
* Yuelin Wang (王跃林)
+ * Yuki Sekiguchi
* Zhijie Liang
* Apple Inc.
- Zixu Wang (王子旭)
diff --git a/src/java.desktop/share/native/libsplashscreen/libpng/CHANGES b/src/java.desktop/share/native/libsplashscreen/libpng/CHANGES
index 208ca6eaf17d..cd637fb98803 100644
--- a/src/java.desktop/share/native/libsplashscreen/libpng/CHANGES
+++ b/src/java.desktop/share/native/libsplashscreen/libpng/CHANGES
@@ -6385,6 +6385,19 @@ Version 1.6.58 [April 15, 2026]
in-place.
(Reported by ralfjunker .)
+Version 1.6.59 [September 28, 2026]
+ Fixed CVE-2026-46675 (medium severity):
+ Use-after-free of zlib input in `png_read_end` after incomplete zTXt, iTXt
+ or iCCP decompression.
+ (Reported independently by Ze Sheng and
+ .)
+ Fixed a regression introduced in version 1.6.47 that caused libpng to reject
+ hIST chunks in their correct position, after PLTE.
+ (Contributed by Yuki Sekiguchi.)
+ Prevented a double free of `png_struct` members after an allocation failure.
+ (Contributed by Anthony Hurtado.)
+ Applied fixes and updates to the CMake build.
+ Adopted the REUSE Specification for licensing the CI files.
Send comments/corrections/commendations to png-mng-implement at lists.sf.net.
Subscription is required; visit
diff --git a/src/java.desktop/share/native/libsplashscreen/libpng/README b/src/java.desktop/share/native/libsplashscreen/libpng/README
index 75a92ab72330..9fd4e425c4f1 100644
--- a/src/java.desktop/share/native/libsplashscreen/libpng/README
+++ b/src/java.desktop/share/native/libsplashscreen/libpng/README
@@ -1,4 +1,4 @@
-README for libpng version 1.6.58
+README for libpng version 1.6.59
================================
See the note about version numbers near the top of `png.h`.
diff --git a/src/java.desktop/share/native/libsplashscreen/libpng/png.c b/src/java.desktop/share/native/libsplashscreen/libpng/png.c
index 12f7ce53f34a..40381ac37738 100644
--- a/src/java.desktop/share/native/libsplashscreen/libpng/png.c
+++ b/src/java.desktop/share/native/libsplashscreen/libpng/png.c
@@ -42,7 +42,7 @@
#include "pngpriv.h"
/* Generate a compiler error if there is an old png.h in the search path. */
-typedef png_libpng_version_1_6_58 Your_png_h_is_not_version_1_6_58;
+typedef png_libpng_version_1_6_59 Your_png_h_is_not_version_1_6_59;
/* Sanity check the chunks definitions - PNG_KNOWN_CHUNKS from pngpriv.h and the
* corresponding macro definitions. This causes a compile time failure if
@@ -849,7 +849,7 @@ png_get_copyright(png_const_structrp png_ptr)
return PNG_STRING_COPYRIGHT
#else
return PNG_STRING_NEWLINE \
- "libpng version 1.6.58" PNG_STRING_NEWLINE \
+ "libpng version 1.6.59" PNG_STRING_NEWLINE \
"Copyright (c) 2018-2026 Cosmin Truta" PNG_STRING_NEWLINE \
"Copyright (c) 1998-2002,2004,2006-2018 Glenn Randers-Pehrson" \
PNG_STRING_NEWLINE \
diff --git a/src/java.desktop/share/native/libsplashscreen/libpng/png.h b/src/java.desktop/share/native/libsplashscreen/libpng/png.h
index 86a7c8ca1b02..d5c65de77dc6 100644
--- a/src/java.desktop/share/native/libsplashscreen/libpng/png.h
+++ b/src/java.desktop/share/native/libsplashscreen/libpng/png.h
@@ -29,7 +29,7 @@
* However, the following notice accompanied the original version of this
* file and, per its terms, should not be removed:
*
- * libpng version 1.6.58
+ * libpng version 1.6.59
*
* Copyright (c) 2018-2026 Cosmin Truta
* Copyright (c) 1998-2002,2004,2006-2018 Glenn Randers-Pehrson
@@ -43,7 +43,7 @@
* libpng versions 0.89, June 1996, through 0.96, May 1997: Andreas Dilger
* libpng versions 0.97, January 1998, through 1.6.35, July 2018:
* Glenn Randers-Pehrson
- * libpng versions 1.6.36, December 2018, through 1.6.58, April 2026:
+ * libpng versions 1.6.36, December 2018, through 1.6.59, September 2026:
* Cosmin Truta
* See also "Contributing Authors", below.
*/
@@ -267,7 +267,7 @@
* ...
* 1.5.30 15 10530 15.so.15.30[.0]
* ...
- * 1.6.58 16 10658 16.so.16.58[.0]
+ * 1.6.59 16 10659 16.so.16.59[.0]
*
* Henceforth the source version will match the shared-library major and
* minor numbers; the shared-library major version number will be used for
@@ -303,7 +303,7 @@
*/
/* Version information for png.h - this should match the version in png.c */
-#define PNG_LIBPNG_VER_STRING "1.6.58"
+#define PNG_LIBPNG_VER_STRING "1.6.59"
#define PNG_HEADER_VERSION_STRING " libpng version " PNG_LIBPNG_VER_STRING "\n"
/* The versions of shared library builds should stay in sync, going forward */
@@ -314,7 +314,7 @@
/* These should match the first 3 components of PNG_LIBPNG_VER_STRING: */
#define PNG_LIBPNG_VER_MAJOR 1
#define PNG_LIBPNG_VER_MINOR 6
-#define PNG_LIBPNG_VER_RELEASE 58
+#define PNG_LIBPNG_VER_RELEASE 59
/* This should be zero for a public release, or non-zero for a
* development version.
@@ -345,7 +345,7 @@
* From version 1.0.1 it is:
* XXYYZZ, where XX=major, YY=minor, ZZ=release
*/
-#define PNG_LIBPNG_VER 10658 /* 1.6.58 */
+#define PNG_LIBPNG_VER 10659 /* 1.6.59 */
/* Library configuration: these options cannot be changed after
* the library has been built.
@@ -455,7 +455,7 @@ extern "C" {
/* This triggers a compiler error in png.c, if png.c and png.h
* do not agree upon the version number.
*/
-typedef char *png_libpng_version_1_6_58;
+typedef char *png_libpng_version_1_6_59;
/* Basic control structions. Read libpng-manual.txt or libpng.3 for more info.
*
diff --git a/src/java.desktop/share/native/libsplashscreen/libpng/pngconf.h b/src/java.desktop/share/native/libsplashscreen/libpng/pngconf.h
index e035a155803a..d57f2406ab5d 100644
--- a/src/java.desktop/share/native/libsplashscreen/libpng/pngconf.h
+++ b/src/java.desktop/share/native/libsplashscreen/libpng/pngconf.h
@@ -29,7 +29,7 @@
* However, the following notice accompanied the original version of this
* file and, per its terms, should not be removed:
*
- * libpng version 1.6.58
+ * libpng version 1.6.59
*
* Copyright (c) 2018-2026 Cosmin Truta
* Copyright (c) 1998-2002,2004,2006-2016,2018 Glenn Randers-Pehrson
diff --git a/src/java.desktop/share/native/libsplashscreen/libpng/pnglibconf.h b/src/java.desktop/share/native/libsplashscreen/libpng/pnglibconf.h
index 46cba507f65a..6e7bcfd308d6 100644
--- a/src/java.desktop/share/native/libsplashscreen/libpng/pnglibconf.h
+++ b/src/java.desktop/share/native/libsplashscreen/libpng/pnglibconf.h
@@ -31,7 +31,7 @@
* However, the following notice accompanied the original version of this
* file and, per its terms, should not be removed:
*/
-/* libpng version 1.6.58 */
+/* libpng version 1.6.59 */
/* Copyright (c) 2018-2026 Cosmin Truta */
/* Copyright (c) 1998-2002,2004,2006-2018 Glenn Randers-Pehrson */
diff --git a/src/java.desktop/share/native/libsplashscreen/libpng/pngread.c b/src/java.desktop/share/native/libsplashscreen/libpng/pngread.c
index 70df18926f50..56aa16d41cfa 100644
--- a/src/java.desktop/share/native/libsplashscreen/libpng/pngread.c
+++ b/src/java.desktop/share/native/libsplashscreen/libpng/pngread.c
@@ -711,8 +711,10 @@ png_read_end(png_structrp png_ptr, png_inforp info_ptr)
if (png_ptr == NULL)
return;
- /* If png_read_end is called in the middle of reading the rows there may
- * still be pending IDAT data and an owned zstream. Deal with this here.
+ /* If png_read_end is called in the middle of reading the rows,
+ * there may still be pending IDAT data and an owned zstream.
+ * If it is called before row reading starts, there is pending
+ * IDAT data but no owned zstream.
*/
#ifdef PNG_HANDLE_AS_UNKNOWN_SUPPORTED
if (png_chunk_unknown_handling(png_ptr, png_IDAT) == 0)
diff --git a/src/java.desktop/share/native/libsplashscreen/libpng/pngrtran.c b/src/java.desktop/share/native/libsplashscreen/libpng/pngrtran.c
index 99050080e9d1..ef1fb0430973 100644
--- a/src/java.desktop/share/native/libsplashscreen/libpng/pngrtran.c
+++ b/src/java.desktop/share/native/libsplashscreen/libpng/pngrtran.c
@@ -543,6 +543,7 @@ png_set_quantize(png_structrp png_ptr, png_colorp palette,
* this function more than once per png_struct.
*/
png_free(png_ptr, png_ptr->quantize_index);
+ png_ptr->quantize_index = NULL;
png_ptr->quantize_index = (png_bytep)png_malloc(png_ptr,
PNG_MAX_PALETTE_LENGTH);
for (i = 0; i < PNG_MAX_PALETTE_LENGTH; i++)
diff --git a/src/java.desktop/share/native/libsplashscreen/libpng/pngrutil.c b/src/java.desktop/share/native/libsplashscreen/libpng/pngrutil.c
index 4712dfd418ac..57afbcdde686 100644
--- a/src/java.desktop/share/native/libsplashscreen/libpng/pngrutil.c
+++ b/src/java.desktop/share/native/libsplashscreen/libpng/pngrutil.c
@@ -434,6 +434,18 @@ png_read_buffer(png_structrp png_ptr, png_alloc_size_t new_size)
}
#endif /* READ_iCCP|iTXt|pCAL|sCAL|sPLT|tEXt|zTXt|eXIf|SEQUENTIAL_READ */
+/* Detach the zstream from the input and output buffers left by
+ * the current or a previous owner, and possibly deallocated since.
+ */
+static void
+png_inflate_detach_buffers(png_structrp png_ptr)
+{
+ png_ptr->zstream.next_in = NULL;
+ png_ptr->zstream.avail_in = 0;
+ png_ptr->zstream.next_out = NULL;
+ png_ptr->zstream.avail_out = 0;
+}
+
/* png_inflate_claim: claim the zstream for some nefarious purpose that involves
* decompression. Returns Z_OK on success, else a zlib error code. It checks
* the owner but, in final release builds, just issues a warning if some other
@@ -494,13 +506,7 @@ png_inflate_claim(png_structrp png_ptr, png_uint_32 owner)
#endif /* ZLIB_VERNUM >= 0x1240 */
- /* Set this for safety, just in case the previous owner left pointers to
- * memory allocations.
- */
- png_ptr->zstream.next_in = NULL;
- png_ptr->zstream.avail_in = 0;
- png_ptr->zstream.next_out = NULL;
- png_ptr->zstream.avail_out = 0;
+ png_inflate_detach_buffers(png_ptr);
if ((png_ptr->flags & PNG_FLAG_ZSTREAM_INITIALIZED) != 0)
{
@@ -837,7 +843,8 @@ png_decompress_chunk(png_structrp png_ptr,
else if (ret == Z_OK)
ret = PNG_UNEXPECTED_ZLIB_RETURN;
- /* Release the claimed stream */
+ /* Release the claimed stream. */
+ png_inflate_detach_buffers(png_ptr);
png_ptr->zowner = 0;
}
@@ -1520,6 +1527,7 @@ png_handle_iCCP(png_structrp png_ptr, png_inforp info_ptr, png_uint_32 length)
if (errmsg == NULL)
{
+ png_inflate_detach_buffers(png_ptr);
png_ptr->zowner = 0;
return handled_ok;
}
@@ -1546,7 +1554,8 @@ png_handle_iCCP(png_structrp png_ptr, png_inforp info_ptr, png_uint_32 length)
else /* profile truncated */
errmsg = png_ptr->zstream.msg;
- /* Release the stream */
+ /* Release the claimed stream. */
+ png_inflate_detach_buffers(png_ptr);
png_ptr->zowner = 0;
}
@@ -3091,7 +3100,7 @@ read_chunks[PNG_INDEX_unknown] =
# define CDiTXt NoCheck, 6U, 0, hIHDR, 1
/* Allocates 'length+1'; checked in the handler */
# define CDbKGD 6U, 1U, hIDAT, hIHDR, 0
-# define CDhIST 1024U, 0U, hPLTE, hIHDR, 0
+# define CDhIST 1024U, 0U, hIDAT, hPLTE, 0
# define CDpHYs 9U, 9U, hIDAT, hIHDR, 0
# define CDsPLT NoCheck, 3U, hIDAT, hIHDR, 1
/* Allocates 'length+1'; checked in the handler */
@@ -4366,11 +4375,7 @@ png_read_finish_IDAT(png_structrp png_ptr)
*/
if (png_ptr->zowner == png_IDAT)
{
- /* Always do this; the pointers otherwise point into the read buffer. */
- png_ptr->zstream.next_in = NULL;
- png_ptr->zstream.avail_in = 0;
-
- /* Now we no longer own the zstream. */
+ png_inflate_detach_buffers(png_ptr);
png_ptr->zowner = 0;
/* The slightly weird semantics of the sequential IDAT reading is that we
@@ -4633,6 +4638,7 @@ defined(PNG_USER_TRANSFORM_PTR_SUPPORTED)
{
png_free(png_ptr, png_ptr->big_row_buf);
png_free(png_ptr, png_ptr->big_prev_row);
+ png_ptr->big_row_buf = png_ptr->big_prev_row = NULL;
if (png_ptr->interlaced != 0)
png_ptr->big_row_buf = (png_bytep)png_calloc(png_ptr,
diff --git a/src/java.desktop/share/native/libsplashscreen/libpng/pngset.c b/src/java.desktop/share/native/libsplashscreen/libpng/pngset.c
index 29082a6be089..d1a3fff77c2d 100644
--- a/src/java.desktop/share/native/libsplashscreen/libpng/pngset.c
+++ b/src/java.desktop/share/native/libsplashscreen/libpng/pngset.c
@@ -840,6 +840,7 @@ png_set_PLTE(png_structrp png_ptr, png_inforp info_ptr,
* regardless of num_palette.
*/
png_free(png_ptr, png_ptr->palette);
+ png_ptr->palette = NULL;
png_ptr->palette = png_voidcast(png_colorp, png_calloc(png_ptr,
PNG_MAX_PALETTE_LENGTH * (sizeof (png_color))));
info_ptr->palette = png_voidcast(png_colorp, png_calloc(png_ptr,
@@ -1252,6 +1253,7 @@ png_set_tRNS(png_structrp png_ptr, png_inforp info_ptr,
* functions (e.g. png_do_expand_palette).
*/
png_free(png_ptr, png_ptr->trans_alpha);
+ png_ptr->trans_alpha = NULL;
png_ptr->trans_alpha = png_voidcast(png_bytep,
png_malloc(png_ptr, PNG_MAX_PALETTE_LENGTH));
memset(png_ptr->trans_alpha, 0xff, PNG_MAX_PALETTE_LENGTH);
diff --git a/test/jdk/ProblemList.txt b/test/jdk/ProblemList.txt
index 0b610816bd45..788c04f7267c 100644
--- a/test/jdk/ProblemList.txt
+++ b/test/jdk/ProblemList.txt
@@ -573,17 +573,14 @@ javax/management/remote/mandatory/subjectDelegation/SubjectDelegation1Test.java
java/net/DatagramSocket/DatagramSocketExample.java 8144003,8308807 macosx-all,aix-ppc64
java/net/DatagramSocket/DatagramSocketMulticasting.java 8144003,8308807 macosx-all,aix-ppc64
-java/net/MulticastSocket/B6427403.java 8308807 aix-ppc64
java/net/MulticastSocket/IPMulticastIF.java 8308807 aix-ppc64
java/net/MulticastSocket/JoinLeave.java 8308807 aix-ppc64
-java/net/MulticastSocket/MulticastAddresses.java 8308807 aix-ppc64
java/net/MulticastSocket/NoLoopbackPackets.java 7122846,8308807 macosx-all,aix-ppc64
java/net/MulticastSocket/NoSetNetworkInterface.java 8308807 aix-ppc64
-java/net/MulticastSocket/Promiscuous.java 8308807 aix-ppc64
java/net/MulticastSocket/SetGetNetworkInterfaceTest.java 8308807 aix-ppc64
java/net/MulticastSocket/SetLoopbackMode.java 7122846,8308807 macosx-all,aix-ppc64
java/net/MulticastSocket/SetOutgoingIf.java 8308807 aix-ppc64
-java/net/MulticastSocket/Test.java 7145658,8308807 macosx-all,aix-ppc64
+java/net/MulticastSocket/Test.java 7145658 macosx-all
############################################################################