Skip to content
This repository was archived by the owner on Aug 27, 2022. It is now read-only.
/ lanai Public archive

Commit 2df1826

Browse files
author
Vladimir Ivanov
committedMar 27, 2020
8241597: x86: Remove MMX support
Reviewed-by: kvn, redestad
1 parent d0a6722 commit 2df1826

7 files changed

+23
-175
lines changed
 

‎src/hotspot/cpu/x86/assembler_x86.cpp

+5-36
Original file line numberDiff line numberDiff line change
@@ -1163,19 +1163,6 @@ void Assembler::emit_operand(XMMRegister reg, Address adr) {
11631163
}
11641164
}
11651165

1166-
// MMX operations
1167-
void Assembler::emit_operand(MMXRegister reg, Address adr) {
1168-
assert(!adr.base_needs_rex() && !adr.index_needs_rex(), "no extended registers");
1169-
emit_operand((Register)reg, adr._base, adr._index, adr._scale, adr._disp, adr._rspec);
1170-
}
1171-
1172-
// work around gcc (3.2.1-7a) bug
1173-
void Assembler::emit_operand(Address adr, MMXRegister reg) {
1174-
assert(!adr.base_needs_rex() && !adr.index_needs_rex(), "no extended registers");
1175-
emit_operand((Register)reg, adr._base, adr._index, adr._scale, adr._disp, adr._rspec);
1176-
}
1177-
1178-
11791166
// Now the Assembler instructions (identical for 32/64 bits)
11801167

11811168
void Assembler::adcl(Address dst, int32_t imm32) {
@@ -2003,11 +1990,6 @@ void Assembler::divss(XMMRegister dst, XMMRegister src) {
20031990
emit_int16(0x5E, (0xC0 | encode));
20041991
}
20051992

2006-
void Assembler::emms() {
2007-
NOT_LP64(assert(VM_Version::supports_mmx(), ""));
2008-
emit_int16(0x0F, 0x77);
2009-
}
2010-
20111993
void Assembler::hlt() {
20121994
emit_int8((unsigned char)0xF4);
20131995
}
@@ -2771,24 +2753,6 @@ void Assembler::movlpd(XMMRegister dst, Address src) {
27712753
emit_operand(dst, src);
27722754
}
27732755

2774-
void Assembler::movq( MMXRegister dst, Address src ) {
2775-
assert( VM_Version::supports_mmx(), "" );
2776-
emit_int16(0x0F, 0x6F);
2777-
emit_operand(dst, src);
2778-
}
2779-
2780-
void Assembler::movq( Address dst, MMXRegister src ) {
2781-
assert( VM_Version::supports_mmx(), "" );
2782-
emit_int16(0x0F, 0x7F);
2783-
// workaround gcc (3.2.1-7a) bug
2784-
// In that version of gcc with only an emit_operand(MMX, Address)
2785-
// gcc will tail jump and try and reverse the parameters completely
2786-
// obliterating dst in the process. By having a version available
2787-
// that doesn't need to swap the args at the tail jump the bug is
2788-
// avoided.
2789-
emit_operand(dst, src);
2790-
}
2791-
27922756
void Assembler::movq(XMMRegister dst, Address src) {
27932757
NOT_LP64(assert(VM_Version::supports_sse2(), ""));
27942758
InstructionMark im(this);
@@ -6861,6 +6825,11 @@ void Assembler::vzeroupper_uncached() {
68616825
#ifndef _LP64
68626826
// 32bit only pieces of the assembler
68636827

6828+
void Assembler::emms() {
6829+
NOT_LP64(assert(VM_Version::supports_mmx(), ""));
6830+
emit_int16(0x0F, 0x77);
6831+
}
6832+
68646833
void Assembler::vzeroupper() {
68656834
vzeroupper_uncached();
68666835
}

‎src/hotspot/cpu/x86/assembler_x86.hpp

+2-11
Original file line numberDiff line numberDiff line change
@@ -766,11 +766,6 @@ class Assembler : public AbstractAssembler {
766766

767767
void emit_operand(XMMRegister reg, Address adr);
768768

769-
void emit_operand(MMXRegister reg, Address adr);
770-
771-
// workaround gcc (3.2.1-7) bug
772-
void emit_operand(Address adr, MMXRegister reg);
773-
774769
// Immediate-to-memory forms
775770
void emit_arith_operand(int op1, Register rm, Address adr, int32_t imm32);
776771

@@ -1168,7 +1163,6 @@ class Assembler : public AbstractAssembler {
11681163
void divss(XMMRegister dst, Address src);
11691164
void divss(XMMRegister dst, XMMRegister src);
11701165

1171-
void emms();
11721166

11731167
#ifndef _LP64
11741168
private:
@@ -1178,6 +1172,8 @@ class Assembler : public AbstractAssembler {
11781172
void emit_farith(int b1, int b2, int i);
11791173

11801174
public:
1175+
void emms();
1176+
11811177
void fabs();
11821178

11831179
void fadd(int i);
@@ -1543,12 +1539,7 @@ class Assembler : public AbstractAssembler {
15431539
void movq(Register dst, Register src);
15441540
void movq(Register dst, Address src);
15451541
void movq(Address dst, Register src);
1546-
#endif
15471542

1548-
void movq(Address dst, MMXRegister src );
1549-
void movq(MMXRegister dst, Address src );
1550-
1551-
#ifdef _LP64
15521543
// These dummies prevent using movq from converting a zero (like NULL) into Register
15531544
// by giving the compiler two choices it can't resolve
15541545

‎src/hotspot/cpu/x86/register_definitions_x86.cpp

-10
Original file line numberDiff line numberDiff line change
@@ -129,16 +129,6 @@ REGISTER_DEFINITION(Register, r12_heapbase);
129129
REGISTER_DEFINITION(Register, r15_thread);
130130
#endif // AMD64
131131

132-
REGISTER_DEFINITION(MMXRegister, mnoreg );
133-
REGISTER_DEFINITION(MMXRegister, mmx0 );
134-
REGISTER_DEFINITION(MMXRegister, mmx1 );
135-
REGISTER_DEFINITION(MMXRegister, mmx2 );
136-
REGISTER_DEFINITION(MMXRegister, mmx3 );
137-
REGISTER_DEFINITION(MMXRegister, mmx4 );
138-
REGISTER_DEFINITION(MMXRegister, mmx5 );
139-
REGISTER_DEFINITION(MMXRegister, mmx6 );
140-
REGISTER_DEFINITION(MMXRegister, mmx7 );
141-
142132
REGISTER_DEFINITION(KRegister, knoreg);
143133
REGISTER_DEFINITION(KRegister, k0);
144134
REGISTER_DEFINITION(KRegister, k1);

‎src/hotspot/cpu/x86/register_x86.hpp

-18
Original file line numberDiff line numberDiff line change
@@ -130,17 +130,10 @@ CONSTANT_REGISTER_DECLARATION(FloatRegister, fnoreg, (-1));
130130
class XMMRegisterImpl;
131131
typedef XMMRegisterImpl* XMMRegister;
132132

133-
// Use MMXRegister as shortcut
134-
class MMXRegisterImpl;
135-
typedef MMXRegisterImpl* MMXRegister;
136-
137133
inline XMMRegister as_XMMRegister(int encoding) {
138134
return (XMMRegister)(intptr_t)encoding;
139135
}
140136

141-
inline MMXRegister as_MMXRegister(int encoding) {
142-
return (MMXRegister)(intptr_t)encoding;
143-
}
144137

145138
// The implementation of XMM registers for the IA32 architecture
146139
class XMMRegisterImpl: public AbstractRegisterImpl {
@@ -212,17 +205,6 @@ CONSTANT_REGISTER_DECLARATION(XMMRegister, xmm31, (31));
212205
// can't be described in oopMaps and therefore can't be used by the compilers (at least
213206
// were deopt might wan't to see them).
214207

215-
// The MMX registers, for P3 and up chips
216-
CONSTANT_REGISTER_DECLARATION(MMXRegister, mnoreg , (-1));
217-
CONSTANT_REGISTER_DECLARATION(MMXRegister, mmx0 , ( 0));
218-
CONSTANT_REGISTER_DECLARATION(MMXRegister, mmx1 , ( 1));
219-
CONSTANT_REGISTER_DECLARATION(MMXRegister, mmx2 , ( 2));
220-
CONSTANT_REGISTER_DECLARATION(MMXRegister, mmx3 , ( 3));
221-
CONSTANT_REGISTER_DECLARATION(MMXRegister, mmx4 , ( 4));
222-
CONSTANT_REGISTER_DECLARATION(MMXRegister, mmx5 , ( 5));
223-
CONSTANT_REGISTER_DECLARATION(MMXRegister, mmx6 , ( 6));
224-
CONSTANT_REGISTER_DECLARATION(MMXRegister, mmx7 , ( 7));
225-
226208
// Use XMMRegister as shortcut
227209
class KRegisterImpl;
228210
typedef KRegisterImpl* KRegister;

‎src/hotspot/cpu/x86/stubGenerator_x86_32.cpp

+12-94
Original file line numberDiff line numberDiff line change
@@ -795,55 +795,6 @@ class StubGenerator: public StubCodeGenerator {
795795
__ BIND(L_exit);
796796
}
797797

798-
// Copy 64 bytes chunks
799-
//
800-
// Inputs:
801-
// from - source array address
802-
// to_from - destination array address - from
803-
// qword_count - 8-bytes element count, negative
804-
//
805-
void mmx_copy_forward(Register from, Register to_from, Register qword_count) {
806-
assert( VM_Version::supports_mmx(), "supported cpu only" );
807-
Label L_copy_64_bytes_loop, L_copy_64_bytes, L_copy_8_bytes, L_exit;
808-
// Copy 64-byte chunks
809-
__ jmpb(L_copy_64_bytes);
810-
__ align(OptoLoopAlignment);
811-
__ BIND(L_copy_64_bytes_loop);
812-
__ movq(mmx0, Address(from, 0));
813-
__ movq(mmx1, Address(from, 8));
814-
__ movq(mmx2, Address(from, 16));
815-
__ movq(Address(from, to_from, Address::times_1, 0), mmx0);
816-
__ movq(mmx3, Address(from, 24));
817-
__ movq(Address(from, to_from, Address::times_1, 8), mmx1);
818-
__ movq(mmx4, Address(from, 32));
819-
__ movq(Address(from, to_from, Address::times_1, 16), mmx2);
820-
__ movq(mmx5, Address(from, 40));
821-
__ movq(Address(from, to_from, Address::times_1, 24), mmx3);
822-
__ movq(mmx6, Address(from, 48));
823-
__ movq(Address(from, to_from, Address::times_1, 32), mmx4);
824-
__ movq(mmx7, Address(from, 56));
825-
__ movq(Address(from, to_from, Address::times_1, 40), mmx5);
826-
__ movq(Address(from, to_from, Address::times_1, 48), mmx6);
827-
__ movq(Address(from, to_from, Address::times_1, 56), mmx7);
828-
__ addptr(from, 64);
829-
__ BIND(L_copy_64_bytes);
830-
__ subl(qword_count, 8);
831-
__ jcc(Assembler::greaterEqual, L_copy_64_bytes_loop);
832-
__ addl(qword_count, 8);
833-
__ jccb(Assembler::zero, L_exit);
834-
//
835-
// length is too short, just copy qwords
836-
//
837-
__ BIND(L_copy_8_bytes);
838-
__ movq(mmx0, Address(from, 0));
839-
__ movq(Address(from, to_from, Address::times_1), mmx0);
840-
__ addptr(from, 8);
841-
__ decrement(qword_count);
842-
__ jcc(Assembler::greater, L_copy_8_bytes);
843-
__ BIND(L_exit);
844-
__ emms();
845-
}
846-
847798
address generate_disjoint_copy(BasicType t, bool aligned,
848799
Address::ScaleFactor sf,
849800
address* entry, const char *name,
@@ -918,7 +869,7 @@ class StubGenerator: public StubCodeGenerator {
918869
__ subl(count, 1<<(shift-1));
919870
__ BIND(L_skip_align2);
920871
}
921-
if (!VM_Version::supports_mmx()) {
872+
if (!UseXMMForArrayCopy) {
922873
__ mov(rax, count); // save 'count'
923874
__ shrl(count, shift); // bytes count
924875
__ addptr(to_from, from);// restore 'to'
@@ -935,18 +886,14 @@ class StubGenerator: public StubCodeGenerator {
935886
__ movl(Address(from, to_from, Address::times_1, 0), rax);
936887
__ addptr(from, 4);
937888
__ subl(count, 1<<shift);
938-
}
889+
}
939890
__ BIND(L_copy_64_bytes);
940891
__ mov(rax, count);
941892
__ shrl(rax, shift+1); // 8 bytes chunk count
942893
//
943-
// Copy 8-byte chunks through MMX registers, 8 per iteration of the loop
894+
// Copy 8-byte chunks through XMM registers, 8 per iteration of the loop
944895
//
945-
if (UseXMMForArrayCopy) {
946-
xmm_copy_forward(from, to_from, rax);
947-
} else {
948-
mmx_copy_forward(from, to_from, rax);
949-
}
896+
xmm_copy_forward(from, to_from, rax);
950897
}
951898
// copy tailing dword
952899
__ BIND(L_copy_4_bytes);
@@ -979,9 +926,6 @@ class StubGenerator: public StubCodeGenerator {
979926
}
980927
}
981928

982-
if (VM_Version::supports_mmx() && !UseXMMForArrayCopy) {
983-
__ emms();
984-
}
985929
__ movl(count, Address(rsp, 12+12)); // reread 'count'
986930
bs->arraycopy_epilogue(_masm, decorators, t, from, to, count);
987931

@@ -1117,7 +1061,7 @@ class StubGenerator: public StubCodeGenerator {
11171061
__ jcc(Assembler::below, L_copy_4_bytes);
11181062
}
11191063

1120-
if (!VM_Version::supports_mmx()) {
1064+
if (!UseXMMForArrayCopy) {
11211065
__ std();
11221066
__ mov(rax, count); // Save 'count'
11231067
__ mov(rdx, to); // Save 'to'
@@ -1143,20 +1087,12 @@ class StubGenerator: public StubCodeGenerator {
11431087
__ align(OptoLoopAlignment);
11441088
// Move 8 bytes
11451089
__ BIND(L_copy_8_bytes_loop);
1146-
if (UseXMMForArrayCopy) {
1147-
__ movq(xmm0, Address(from, count, sf, 0));
1148-
__ movq(Address(to, count, sf, 0), xmm0);
1149-
} else {
1150-
__ movq(mmx0, Address(from, count, sf, 0));
1151-
__ movq(Address(to, count, sf, 0), mmx0);
1152-
}
1090+
__ movq(xmm0, Address(from, count, sf, 0));
1091+
__ movq(Address(to, count, sf, 0), xmm0);
11531092
__ BIND(L_copy_8_bytes);
11541093
__ subl(count, 2<<shift);
11551094
__ jcc(Assembler::greaterEqual, L_copy_8_bytes_loop);
11561095
__ addl(count, 2<<shift);
1157-
if (!UseXMMForArrayCopy) {
1158-
__ emms();
1159-
}
11601096
}
11611097
__ BIND(L_copy_4_bytes);
11621098
// copy prefix qword
@@ -1190,9 +1126,6 @@ class StubGenerator: public StubCodeGenerator {
11901126
}
11911127
}
11921128

1193-
if (VM_Version::supports_mmx() && !UseXMMForArrayCopy) {
1194-
__ emms();
1195-
}
11961129
__ movl2ptr(count, Address(rsp, 12+12)); // reread count
11971130
bs->arraycopy_epilogue(_masm, decorators, t, from, to, count);
11981131

@@ -1232,12 +1165,8 @@ class StubGenerator: public StubCodeGenerator {
12321165
// UnsafeCopyMemory page error: continue after ucm
12331166
UnsafeCopyMemoryMark ucmm(this, true, true);
12341167
__ subptr(to, from); // to --> to_from
1235-
if (VM_Version::supports_mmx()) {
1236-
if (UseXMMForArrayCopy) {
1237-
xmm_copy_forward(from, to_from, count);
1238-
} else {
1239-
mmx_copy_forward(from, to_from, count);
1240-
}
1168+
if (UseXMMForArrayCopy) {
1169+
xmm_copy_forward(from, to_from, count);
12411170
} else {
12421171
__ jmpb(L_copy_8_bytes);
12431172
__ align(OptoLoopAlignment);
@@ -1250,9 +1179,6 @@ class StubGenerator: public StubCodeGenerator {
12501179
__ jcc(Assembler::greaterEqual, L_copy_8_bytes_loop);
12511180
}
12521181
}
1253-
if (VM_Version::supports_mmx() && !UseXMMForArrayCopy) {
1254-
__ emms();
1255-
}
12561182
inc_copy_counter_np(T_LONG);
12571183
__ leave(); // required for proper stackwalking of RuntimeStub frame
12581184
__ vzeroupper();
@@ -1298,14 +1224,9 @@ class StubGenerator: public StubCodeGenerator {
12981224

12991225
__ align(OptoLoopAlignment);
13001226
__ BIND(L_copy_8_bytes_loop);
1301-
if (VM_Version::supports_mmx()) {
1302-
if (UseXMMForArrayCopy) {
1303-
__ movq(xmm0, Address(from, count, Address::times_8));
1304-
__ movq(Address(to, count, Address::times_8), xmm0);
1305-
} else {
1306-
__ movq(mmx0, Address(from, count, Address::times_8));
1307-
__ movq(Address(to, count, Address::times_8), mmx0);
1308-
}
1227+
if (UseXMMForArrayCopy) {
1228+
__ movq(xmm0, Address(from, count, Address::times_8));
1229+
__ movq(Address(to, count, Address::times_8), xmm0);
13091230
} else {
13101231
__ fild_d(Address(from, count, Address::times_8));
13111232
__ fistp_d(Address(to, count, Address::times_8));
@@ -1315,9 +1236,6 @@ class StubGenerator: public StubCodeGenerator {
13151236
__ jcc(Assembler::greaterEqual, L_copy_8_bytes_loop);
13161237

13171238
}
1318-
if (VM_Version::supports_mmx() && !UseXMMForArrayCopy) {
1319-
__ emms();
1320-
}
13211239
inc_copy_counter_np(T_LONG);
13221240
__ leave(); // required for proper stackwalking of RuntimeStub frame
13231241
__ xorptr(rax, rax); // return 0

‎src/hotspot/cpu/x86/vm_version_x86.cpp

+4-5
Original file line numberDiff line numberDiff line change
@@ -734,7 +734,7 @@ void VM_Version::get_processor_features() {
734734
char buf[512];
735735
int res = jio_snprintf(buf, sizeof(buf),
736736
"(%u cores per cpu, %u threads per core) family %d model %d stepping %d"
737-
"%s%s%s%s%s%s%s%s%s%s" "%s%s%s%s%s%s%s%s%s%s" "%s%s%s%s%s%s%s%s%s%s" "%s%s%s%s%s%s%s%s%s%s" "%s%s%s%s%s%s%s",
737+
"%s%s%s%s%s%s%s%s%s%s" "%s%s%s%s%s%s%s%s%s%s" "%s%s%s%s%s%s%s%s%s%s" "%s%s%s%s%s%s%s%s%s%s" "%s%s%s%s%s%s",
738738

739739
cores_per_cpu(), threads_per_core(),
740740
cpu_family(), _model, _stepping,
@@ -758,10 +758,9 @@ void VM_Version::get_processor_features() {
758758
(supports_clmul() ? ", clmul" : ""),
759759
(supports_erms() ? ", erms" : ""),
760760
(supports_rtm() ? ", rtm" : ""),
761-
(supports_mmx_ext() ? ", mmxext" : ""),
762761
(supports_3dnow_prefetch() ? ", 3dnowpref" : ""),
763-
764762
(supports_lzcnt() ? ", lzcnt": ""),
763+
765764
(supports_sse4a() ? ", sse4a": ""),
766765
(supports_ht() ? ", ht": ""),
767766
(supports_tsc() ? ", tsc": ""),
@@ -771,8 +770,8 @@ void VM_Version::get_processor_features() {
771770
(supports_bmi2() ? ", bmi2" : ""),
772771
(supports_adx() ? ", adx" : ""),
773772
(supports_evex() ? ", avx512f" : ""),
774-
775773
(supports_avx512dq() ? ", avx512dq" : ""),
774+
776775
(supports_avx512pf() ? ", avx512pf" : ""),
777776
(supports_avx512er() ? ", avx512er" : ""),
778777
(supports_avx512cd() ? ", avx512cd" : ""),
@@ -782,8 +781,8 @@ void VM_Version::get_processor_features() {
782781
(supports_avx512_vpclmulqdq() ? ", avx512_vpclmulqdq" : ""),
783782
(supports_avx512_vbmi() ? ", avx512_vbmi" : ""),
784783
(supports_avx512_vbmi2() ? ", avx512_vbmi2" : ""),
785-
786784
(supports_avx512_vaes() ? ", avx512_vaes" : ""),
785+
787786
(supports_avx512_vnni() ? ", avx512_vnni" : ""),
788787
(supports_sha() ? ", sha" : ""),
789788
(supports_fma() ? ", fma" : ""),

‎src/hotspot/cpu/x86/vm_version_x86.hpp

-1
Original file line numberDiff line numberDiff line change
@@ -905,7 +905,6 @@ enum Extended_Family {
905905

906906
// AMD features
907907
static bool supports_3dnow_prefetch() { return (_features & CPU_3DNOW_PREFETCH) != 0; }
908-
static bool supports_mmx_ext() { return is_amd_family() && _cpuid_info.ext_cpuid1_edx.bits.mmx_amd != 0; }
909908
static bool supports_lzcnt() { return (_features & CPU_LZCNT) != 0; }
910909
static bool supports_sse4a() { return (_features & CPU_SSE4A) != 0; }
911910

0 commit comments

Comments
 (0)
This repository has been archived.