Skip to content

Commit 7f44f57

Browse files
vamsi-parasaJatin Bhateja
authored andcommitted
8285868: x86 intrinsics for floating point method isInfinite
Reviewed-by: kvn, jbhateja
1 parent 13596cd commit 7f44f57

File tree

18 files changed

+513
-0
lines changed

18 files changed

+513
-0
lines changed

src/hotspot/cpu/x86/assembler_x86.cpp

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10410,6 +10410,26 @@ void Assembler::vzeroupper_uncached() {
1041010410
}
1041110411
}
1041210412

10413+
void Assembler::vfpclassss(KRegister kdst, XMMRegister src, uint8_t imm8) {
10414+
// Encoding: EVEX.LIG.66.0F3A.W0 67 /r ib
10415+
assert(VM_Version::supports_evex(), "");
10416+
assert(VM_Version::supports_avx512dq(), "");
10417+
InstructionAttr attributes(AVX_128bit, /* vex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ false, /* uses_vl */ false);
10418+
attributes.set_is_evex_instruction();
10419+
int encode = vex_prefix_and_encode(kdst->encoding(), 0, src->encoding(), VEX_SIMD_66, VEX_OPCODE_0F_3A, &attributes);
10420+
emit_int24((unsigned char)0x67, (unsigned char)(0xC0 | encode), imm8);
10421+
}
10422+
10423+
void Assembler::vfpclasssd(KRegister kdst, XMMRegister src, uint8_t imm8) {
10424+
// Encoding: EVEX.LIG.66.0F3A.W1 67 /r ib
10425+
assert(VM_Version::supports_evex(), "");
10426+
assert(VM_Version::supports_avx512dq(), "");
10427+
InstructionAttr attributes(AVX_128bit, /* vex_w */ true, /* legacy_mode */ false, /* no_mask_reg */ false, /* uses_vl */ false);
10428+
attributes.set_is_evex_instruction();
10429+
int encode = vex_prefix_and_encode(kdst->encoding(), 0, src->encoding(), VEX_SIMD_66, VEX_OPCODE_0F_3A, &attributes);
10430+
emit_int24((unsigned char)0x67, (unsigned char)(0xC0 | encode), imm8);
10431+
}
10432+
1041310433
void Assembler::fld_x(Address adr) {
1041410434
InstructionMark im(this);
1041510435
emit_int8((unsigned char)0xDB);

src/hotspot/cpu/x86/assembler_x86.hpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2746,6 +2746,10 @@ class Assembler : public AbstractAssembler {
27462746
void evpmovm2d(XMMRegister dst, KRegister src, int vector_len);
27472747
void evpmovm2q(XMMRegister dst, KRegister src, int vector_len);
27482748

2749+
// floating point class tests
2750+
void vfpclassss(KRegister kdst, XMMRegister src, uint8_t imm8);
2751+
void vfpclasssd(KRegister kdst, XMMRegister src, uint8_t imm8);
2752+
27492753
// Vector blends
27502754
void blendvps(XMMRegister dst, XMMRegister src);
27512755
void blendvpd(XMMRegister dst, XMMRegister src);

src/hotspot/cpu/x86/c2_MacroAssembler_x86.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5316,3 +5316,4 @@ void C2_MacroAssembler::udivmodL(Register rax, Register divisor, Register rdx, R
53165316
bind(done);
53175317
}
53185318
#endif
5319+

src/hotspot/cpu/x86/x86.ad

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1462,6 +1462,12 @@ const bool Matcher::match_rule_supported(int opcode) {
14621462
return false;
14631463
}
14641464
break;
1465+
case Op_IsInfiniteF:
1466+
case Op_IsInfiniteD:
1467+
if (!VM_Version::supports_avx512dq()) {
1468+
return false;
1469+
}
1470+
break;
14651471
case Op_SqrtVD:
14661472
case Op_SqrtVF:
14671473
case Op_VectorMaskCmp:
@@ -10136,3 +10142,29 @@ instruct castVVLeg(legVec dst)
1013610142
ins_cost(0);
1013710143
ins_pipe(empty);
1013810144
%}
10145+
10146+
instruct FloatClassCheck_reg_reg_vfpclass(rRegI dst, regF src, kReg ktmp, rFlagsReg cr)
10147+
%{
10148+
match(Set dst (IsInfiniteF src));
10149+
effect(TEMP ktmp, KILL cr);
10150+
format %{ "float_class_check $dst, $src" %}
10151+
ins_encode %{
10152+
__ vfpclassss($ktmp$$KRegister, $src$$XMMRegister, 0x18);
10153+
__ kmovbl($dst$$Register, $ktmp$$KRegister);
10154+
%}
10155+
ins_pipe(pipe_slow);
10156+
%}
10157+
10158+
instruct DoubleClassCheck_reg_reg_vfpclass(rRegI dst, regD src, kReg ktmp, rFlagsReg cr)
10159+
%{
10160+
match(Set dst (IsInfiniteD src));
10161+
effect(TEMP ktmp, KILL cr);
10162+
format %{ "double_class_check $dst, $src" %}
10163+
ins_encode %{
10164+
__ vfpclasssd($ktmp$$KRegister, $src$$XMMRegister, 0x18);
10165+
__ kmovbl($dst$$Register, $ktmp$$KRegister);
10166+
%}
10167+
ins_pipe(pipe_slow);
10168+
%}
10169+
10170+

src/hotspot/share/classfile/vmIntrinsics.hpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -203,6 +203,10 @@ class methodHandle;
203203
/* Special flavor of dsqrt intrinsic to handle the "native" method in StrictMath. Otherwise the same as in Math. */ \
204204
do_intrinsic(_dsqrt_strict, java_lang_StrictMath, sqrt_name, double_double_signature, F_SN) \
205205
\
206+
do_intrinsic(_floatIsInfinite, java_lang_Float, isInfinite_name, float_bool_signature, F_S) \
207+
do_name( isInfinite_name, "isInfinite") \
208+
do_intrinsic(_doubleIsInfinite, java_lang_Double, isInfinite_name, double_bool_signature, F_S) \
209+
\
206210
do_intrinsic(_floatToRawIntBits, java_lang_Float, floatToRawIntBits_name, float_int_signature, F_SN) \
207211
do_name( floatToRawIntBits_name, "floatToRawIntBits") \
208212
do_intrinsic(_floatToIntBits, java_lang_Float, floatToIntBits_name, float_int_signature, F_S) \

src/hotspot/share/classfile/vmSymbols.hpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -555,6 +555,8 @@
555555
template(char_char_signature, "(C)C") \
556556
template(short_short_signature, "(S)S") \
557557
template(int_bool_signature, "(I)Z") \
558+
template(float_bool_signature, "(F)Z") \
559+
template(double_bool_signature, "(D)Z") \
558560
template(float_int_signature, "(F)I") \
559561
template(double_long_signature, "(D)J") \
560562
template(double_double_signature, "(D)D") \

src/hotspot/share/opto/c2compiler.cpp

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -518,6 +518,12 @@ bool C2Compiler::is_intrinsic_supported(const methodHandle& method, bool is_virt
518518
case vmIntrinsics::_fsignum:
519519
if (!Matcher::match_rule_supported(Op_SignumF)) return false;
520520
break;
521+
case vmIntrinsics::_floatIsInfinite:
522+
if (!Matcher::match_rule_supported(Op_IsInfiniteF)) return false;
523+
break;
524+
case vmIntrinsics::_doubleIsInfinite:
525+
if (!Matcher::match_rule_supported(Op_IsInfiniteD)) return false;
526+
break;
521527
case vmIntrinsics::_hashCode:
522528
case vmIntrinsics::_identityHashCode:
523529
case vmIntrinsics::_getClass:

src/hotspot/share/opto/classes.hpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -245,6 +245,8 @@ macro(MoveI2F)
245245
macro(MoveF2I)
246246
macro(MoveL2D)
247247
macro(MoveD2L)
248+
macro(IsInfiniteF)
249+
macro(IsInfiniteD)
248250
macro(MulD)
249251
macro(MulF)
250252
macro(MulHiL)

src/hotspot/share/opto/intrinsicnode.hpp

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -262,4 +262,22 @@ class SignumFNode : public Node {
262262
virtual uint ideal_reg() const { return Op_RegF; }
263263
};
264264

265+
//---------- IsInfiniteFNode -----------------------------------------------------
266+
class IsInfiniteFNode : public Node {
267+
public:
268+
IsInfiniteFNode(Node* in1) : Node(0, in1) {}
269+
virtual int Opcode() const;
270+
const Type* bottom_type() const { return TypeInt::BOOL; }
271+
virtual uint ideal_reg() const { return Op_RegI; }
272+
};
273+
274+
//---------- IsInfiniteDNode -----------------------------------------------------
275+
class IsInfiniteDNode : public Node {
276+
public:
277+
IsInfiniteDNode(Node* in1) : Node(0, in1) {}
278+
virtual int Opcode() const;
279+
const Type* bottom_type() const { return TypeInt::BOOL; }
280+
virtual uint ideal_reg() const { return Op_RegI; }
281+
};
282+
265283
#endif // SHARE_OPTO_INTRINSICNODE_HPP

src/hotspot/share/opto/library_call.cpp

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -516,6 +516,9 @@ bool LibraryCallKit::try_to_inline(int predicate) {
516516
case vmIntrinsics::_doubleToLongBits:
517517
case vmIntrinsics::_longBitsToDouble: return inline_fp_conversions(intrinsic_id());
518518

519+
case vmIntrinsics::_floatIsInfinite:
520+
case vmIntrinsics::_doubleIsInfinite: return inline_fp_range_check(intrinsic_id());
521+
519522
case vmIntrinsics::_numberOfLeadingZeros_i:
520523
case vmIntrinsics::_numberOfLeadingZeros_l:
521524
case vmIntrinsics::_numberOfTrailingZeros_i:
@@ -4642,6 +4645,25 @@ bool LibraryCallKit::inline_fp_conversions(vmIntrinsics::ID id) {
46424645
return true;
46434646
}
46444647

4648+
bool LibraryCallKit::inline_fp_range_check(vmIntrinsics::ID id) {
4649+
Node* arg = argument(0);
4650+
Node* result = NULL;
4651+
4652+
switch (id) {
4653+
case vmIntrinsics::_floatIsInfinite:
4654+
result = new IsInfiniteFNode(arg);
4655+
break;
4656+
case vmIntrinsics::_doubleIsInfinite:
4657+
result = new IsInfiniteDNode(arg);
4658+
break;
4659+
default:
4660+
fatal_unexpected_iid(id);
4661+
break;
4662+
}
4663+
set_result(_gvn.transform(result));
4664+
return true;
4665+
}
4666+
46454667
//----------------------inline_unsafe_copyMemory-------------------------
46464668
// public native void Unsafe.copyMemory0(Object srcBase, long srcOffset, Object destBase, long destOffset, long bytes);
46474669

0 commit comments

Comments
 (0)