< prev index next >
src/hotspot/cpu/x86/assembler_x86.cpp
Print this page
*** 2190,2199 ****
--- 2190,2207 ----
emit_int8(0x0F);
emit_int8((unsigned char)0xAE);
emit_int8((unsigned char)0xF0);
}
+ // Emit sfence instruction
+ void Assembler::sfence() {
+ NOT_LP64(assert(VM_Version::supports_sse2(), "unsupported");)
+ emit_int8(0x0F);
+ emit_int8((unsigned char)0xAE);
+ emit_int8((unsigned char)0xF8);
+ }
+
void Assembler::mov(Register dst, Register src) {
LP64_ONLY(movq(dst, src)) NOT_LP64(movl(dst, src));
}
void Assembler::movapd(XMMRegister dst, XMMRegister src) {
*** 8424,8439 ****
--- 8432,8482 ----
prefix(REX_W);
emit_int8((unsigned char)0x99);
}
void Assembler::clflush(Address adr) {
+ assert(VM_Version::supports_clflush(), "should do");
+ prefix(adr);
+ emit_int8(0x0F);
+ emit_int8((unsigned char)0xAE);
+ emit_operand(rdi, adr);
+ }
+
+ #ifdef _LP64
+ void Assembler::clflushopt(Address adr) {
+ assert(VM_Version::supports_clflushopt(), "should do!");
+ // adr should be base reg only with no index or offset
+ assert(adr.index() == noreg, "index should be noreg");
+ assert(adr.scale() == Address::no_scale, "scale should be no_scale");
+ assert(adr.disp() == 0, "displacement should be 0");
+ // instruction prefix is 0x66
+ emit_int8(0x66);
prefix(adr);
+ // opcode family is 0x0f 0xAE
emit_int8(0x0F);
emit_int8((unsigned char)0xAE);
+ // extended opcode byte is 7 == rdi
emit_operand(rdi, adr);
}
+ void Assembler::clwb(Address adr) {
+ assert(VM_Version::supports_clwb(), "should do!");
+ // adr should be base reg only with no index or offset
+ assert(adr.index() == noreg, "index should be noreg");
+ assert(adr.scale() == Address::no_scale, "scale should be no_scale");
+ assert(adr.disp() == 0, "displacement should be 0");
+ // instruction prefix is 0x66
+ emit_int8(0x66);
+ prefix(adr);
+ // opcode family is 0x0f 0xAE
+ emit_int8(0x0F);
+ emit_int8((unsigned char)0xAE);
+ // extended opcode byte is 6 == rsi
+ emit_operand(rsi, adr);
+ }
+ #endif
+
void Assembler::cmovq(Condition cc, Register dst, Register src) {
int encode = prefixq_and_encode(dst->encoding(), src->encoding());
emit_int8(0x0F);
emit_int8(0x40 | cc);
emit_int8((unsigned char)(0xC0 | encode));
< prev index next >