Skip to content

Commit 90e92f9

Browse files
author
Jatin Bhateja
committedSep 17, 2024
8339790: Support Intel APX setzucc instruction
Reviewed-by: sviswanathan, jkarthikeyan, kvn
1 parent 28d009c commit 90e92f9

7 files changed

+48
-51
lines changed
 

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

+9
Original file line numberDiff line numberDiff line change
@@ -16040,6 +16040,15 @@ void Assembler::xorq(Address dst, Register src) {
1604016040
emit_operand(src, dst, 0);
1604116041
}
1604216042

16043+
void Assembler::esetzucc(Condition cc, Register dst) {
16044+
assert(VM_Version::supports_apx_f(), "");
16045+
assert(0 <= cc && cc < 16, "illegal cc");
16046+
InstructionAttr attributes(AVX_128bit, /* vex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ false);
16047+
// Encoding Format : eevex_prefix (4 bytes) | opcode_cc | modrm
16048+
int encode = evex_prefix_and_encode_ndd(0, 0, dst->encoding(), VEX_SIMD_F2, /* MAP4 */VEX_OPCODE_0F_3C, &attributes);
16049+
emit_opcode_prefix_and_encoding((0x40 | cc), 0xC0, encode);
16050+
}
16051+
1604316052
void Assembler::exorq(Register dst, Address src1, Register src2, bool no_flags) {
1604416053
InstructionMark im(this);
1604516054
InstructionAttr attributes(AVX_128bit, /* vex_w */ true, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ false);

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

+4-1
Original file line numberDiff line numberDiff line change
@@ -1039,14 +1039,17 @@ class Assembler : public AbstractAssembler {
10391039
void pusha_uncached();
10401040
void popa_uncached();
10411041

1042-
// APX ISA extensions for register save/restore optimizations.
1042+
// APX ISA Extensions for register save/restore optimizations.
10431043
void push2(Register src1, Register src2, bool with_ppx = false);
10441044
void pop2(Register src1, Register src2, bool with_ppx = false);
10451045
void push2p(Register src1, Register src2);
10461046
void pop2p(Register src1, Register src2);
10471047
void pushp(Register src);
10481048
void popp(Register src);
10491049

1050+
// New Zero Upper setcc instruction.
1051+
void esetzucc(Condition cc, Register dst);
1052+
10501053
#endif
10511054
void vzeroupper_uncached();
10521055
void decq(Register dst);

‎src/hotspot/cpu/x86/gc/x/x_x86_64.ad

+2-4
Original file line numberDiff line numberDiff line change
@@ -126,17 +126,15 @@ instruct xCompareAndSwapP(rRegI res, indirect mem, rRegP newval, rRegP tmp, rFla
126126

127127
format %{ "lock\n\t"
128128
"cmpxchgq $newval, $mem\n\t"
129-
"sete $res\n\t"
130-
"movzbl $res, $res" %}
129+
"setcc $res \t# emits sete + movzbl or setzue for APX" %}
131130

132131
ins_encode %{
133132
precond($oldval$$Register == rax);
134133
x_cmpxchg_common(masm, this, $mem$$Register, $newval$$Register, $tmp$$Register);
135134
if (barrier_data() != XLoadBarrierElided) {
136135
__ cmpptr($tmp$$Register, rax);
137136
}
138-
__ setb(Assembler::equal, $res$$Register);
139-
__ movzbl($res$$Register, $res$$Register);
137+
__ setcc(Assembler::equal, $res$$Register);
140138
%}
141139

142140
ins_pipe(pipe_cmpxchg);

‎src/hotspot/cpu/x86/gc/z/z_x86_64.ad

+2-4
Original file line numberDiff line numberDiff line change
@@ -212,8 +212,7 @@ instruct zCompareAndSwapP(rRegI res, indirect mem, rRegP newval, rRegP tmp, rax_
212212

213213
format %{ "lock\n\t"
214214
"cmpxchgq $newval, $mem\n\t"
215-
"sete $res\n\t"
216-
"movzbl $res, $res" %}
215+
"setcc $res \t# emits sete + movzbl or setzue for APX" %}
217216

218217
ins_encode %{
219218
assert_different_registers($oldval$$Register, $mem$$Register);
@@ -222,8 +221,7 @@ instruct zCompareAndSwapP(rRegI res, indirect mem, rRegP newval, rRegP tmp, rax_
222221
z_color(masm, this, $oldval$$Register);
223222
__ lock();
224223
__ cmpxchgptr($tmp$$Register, mem_addr);
225-
__ setb(Assembler::equal, $res$$Register);
226-
__ movzbl($res$$Register, $res$$Register);
224+
__ setcc(Assembler::equal, $res$$Register);
227225
%}
228226

229227
ins_pipe(pipe_cmpxchg);

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

+9
Original file line numberDiff line numberDiff line change
@@ -10421,4 +10421,13 @@ void MacroAssembler::restore_legacy_gprs() {
1042110421
movq(rax, Address(rsp, 15 * wordSize));
1042210422
addq(rsp, 16 * wordSize);
1042310423
}
10424+
10425+
void MacroAssembler::setcc(Assembler::Condition comparison, Register dst) {
10426+
if (VM_Version::supports_apx_f()) {
10427+
esetzucc(comparison, dst);
10428+
} else {
10429+
setb(comparison, dst);
10430+
movzbl(dst, dst);
10431+
}
10432+
}
1042410433
#endif

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

+1
Original file line numberDiff line numberDiff line change
@@ -2154,6 +2154,7 @@ class MacroAssembler: public Assembler {
21542154
#ifdef _LP64
21552155
void save_legacy_gprs();
21562156
void restore_legacy_gprs();
2157+
void setcc(Assembler::Condition comparison, Register dst);
21572158
#endif
21582159
};
21592160

‎src/hotspot/cpu/x86/x86_64.ad

+21-42
Original file line numberDiff line numberDiff line change
@@ -657,8 +657,7 @@ static void emit_cmpfp3(MacroAssembler* masm, Register dst) {
657657
__ movl(dst, -1);
658658
__ jcc(Assembler::parity, done);
659659
__ jcc(Assembler::below, done);
660-
__ setb(Assembler::notEqual, dst);
661-
__ movzbl(dst, dst);
660+
__ setcc(Assembler::notEqual, dst);
662661
__ bind(done);
663662
}
664663

@@ -7070,13 +7069,11 @@ instruct compareAndSwapP(rRegI res,
70707069

70717070
format %{ "cmpxchgq $mem_ptr,$newval\t# "
70727071
"If rax == $mem_ptr then store $newval into $mem_ptr\n\t"
7073-
"sete $res\n\t"
7074-
"movzbl $res, $res" %}
7072+
"setcc $res \t# emits sete + movzbl or setzue for APX" %}
70757073
ins_encode %{
70767074
__ lock();
70777075
__ cmpxchgq($newval$$Register, $mem_ptr$$Address);
7078-
__ setb(Assembler::equal, $res$$Register);
7079-
__ movzbl($res$$Register, $res$$Register);
7076+
__ setcc(Assembler::equal, $res$$Register);
70807077
%}
70817078
ins_pipe( pipe_cmpxchg );
70827079
%}
@@ -7092,13 +7089,11 @@ instruct compareAndSwapL(rRegI res,
70927089

70937090
format %{ "cmpxchgq $mem_ptr,$newval\t# "
70947091
"If rax == $mem_ptr then store $newval into $mem_ptr\n\t"
7095-
"sete $res\n\t"
7096-
"movzbl $res, $res" %}
7092+
"setcc $res \t# emits sete + movzbl or setzue for APX" %}
70977093
ins_encode %{
70987094
__ lock();
70997095
__ cmpxchgq($newval$$Register, $mem_ptr$$Address);
7100-
__ setb(Assembler::equal, $res$$Register);
7101-
__ movzbl($res$$Register, $res$$Register);
7096+
__ setcc(Assembler::equal, $res$$Register);
71027097
%}
71037098
ins_pipe( pipe_cmpxchg );
71047099
%}
@@ -7114,13 +7109,11 @@ instruct compareAndSwapI(rRegI res,
71147109

71157110
format %{ "cmpxchgl $mem_ptr,$newval\t# "
71167111
"If rax == $mem_ptr then store $newval into $mem_ptr\n\t"
7117-
"sete $res\n\t"
7118-
"movzbl $res, $res" %}
7112+
"setcc $res \t# emits sete + movzbl or setzue for APX" %}
71197113
ins_encode %{
71207114
__ lock();
71217115
__ cmpxchgl($newval$$Register, $mem_ptr$$Address);
7122-
__ setb(Assembler::equal, $res$$Register);
7123-
__ movzbl($res$$Register, $res$$Register);
7116+
__ setcc(Assembler::equal, $res$$Register);
71247117
%}
71257118
ins_pipe( pipe_cmpxchg );
71267119
%}
@@ -7136,13 +7129,11 @@ instruct compareAndSwapB(rRegI res,
71367129

71377130
format %{ "cmpxchgb $mem_ptr,$newval\t# "
71387131
"If rax == $mem_ptr then store $newval into $mem_ptr\n\t"
7139-
"sete $res\n\t"
7140-
"movzbl $res, $res" %}
7132+
"setcc $res \t# emits sete + movzbl or setzue for APX" %}
71417133
ins_encode %{
71427134
__ lock();
71437135
__ cmpxchgb($newval$$Register, $mem_ptr$$Address);
7144-
__ setb(Assembler::equal, $res$$Register);
7145-
__ movzbl($res$$Register, $res$$Register);
7136+
__ setcc(Assembler::equal, $res$$Register);
71467137
%}
71477138
ins_pipe( pipe_cmpxchg );
71487139
%}
@@ -7158,13 +7149,11 @@ instruct compareAndSwapS(rRegI res,
71587149

71597150
format %{ "cmpxchgw $mem_ptr,$newval\t# "
71607151
"If rax == $mem_ptr then store $newval into $mem_ptr\n\t"
7161-
"sete $res\n\t"
7162-
"movzbl $res, $res" %}
7152+
"setcc $res \t# emits sete + movzbl or setzue for APX" %}
71637153
ins_encode %{
71647154
__ lock();
71657155
__ cmpxchgw($newval$$Register, $mem_ptr$$Address);
7166-
__ setb(Assembler::equal, $res$$Register);
7167-
__ movzbl($res$$Register, $res$$Register);
7156+
__ setcc(Assembler::equal, $res$$Register);
71687157
%}
71697158
ins_pipe( pipe_cmpxchg );
71707159
%}
@@ -7179,13 +7168,11 @@ instruct compareAndSwapN(rRegI res,
71797168

71807169
format %{ "cmpxchgl $mem_ptr,$newval\t# "
71817170
"If rax == $mem_ptr then store $newval into $mem_ptr\n\t"
7182-
"sete $res\n\t"
7183-
"movzbl $res, $res" %}
7171+
"setcc $res \t# emits sete + movzbl or setzue for APX" %}
71847172
ins_encode %{
71857173
__ lock();
71867174
__ cmpxchgl($newval$$Register, $mem_ptr$$Address);
7187-
__ setb(Assembler::equal, $res$$Register);
7188-
__ movzbl($res$$Register, $res$$Register);
7175+
__ setcc(Assembler::equal, $res$$Register);
71897176
%}
71907177
ins_pipe( pipe_cmpxchg );
71917178
%}
@@ -9729,13 +9716,11 @@ instruct cmpLTMask(rRegI dst, rRegI p, rRegI q, rFlagsReg cr)
97299716

97309717
ins_cost(400);
97319718
format %{ "cmpl $p, $q\t# cmpLTMask\n\t"
9732-
"setlt $dst\n\t"
9733-
"movzbl $dst, $dst\n\t"
9719+
"setcc $dst \t# emits setlt + movzbl or setzul for APX"
97349720
"negl $dst" %}
97359721
ins_encode %{
97369722
__ cmpl($p$$Register, $q$$Register);
9737-
__ setb(Assembler::less, $dst$$Register);
9738-
__ movzbl($dst$$Register, $dst$$Register);
9723+
__ setcc(Assembler::less, $dst$$Register);
97399724
__ negl($dst$$Register);
97409725
%}
97419726
ins_pipe(pipe_slow);
@@ -11860,16 +11845,14 @@ instruct cmpU3_reg_reg(rRegI dst, rRegI src1, rRegI src2, rFlagsReg flags)
1186011845
format %{ "cmpl $src1, $src2\t# CmpL3\n\t"
1186111846
"movl $dst, -1\n\t"
1186211847
"jb,u done\n\t"
11863-
"setne $dst\n\t"
11864-
"movzbl $dst, $dst\n\t"
11848+
"setcc $dst \t# emits setne + movzbl or setzune for APX"
1186511849
"done:" %}
1186611850
ins_encode %{
1186711851
Label done;
1186811852
__ cmpl($src1$$Register, $src2$$Register);
1186911853
__ movl($dst$$Register, -1);
1187011854
__ jccb(Assembler::below, done);
11871-
__ setb(Assembler::notZero, $dst$$Register);
11872-
__ movzbl($dst$$Register, $dst$$Register);
11855+
__ setcc(Assembler::notZero, $dst$$Register);
1187311856
__ bind(done);
1187411857
%}
1187511858
ins_pipe(pipe_slow);
@@ -11886,16 +11869,14 @@ instruct cmpL3_reg_reg(rRegI dst, rRegL src1, rRegL src2, rFlagsReg flags)
1188611869
format %{ "cmpq $src1, $src2\t# CmpL3\n\t"
1188711870
"movl $dst, -1\n\t"
1188811871
"jl,s done\n\t"
11889-
"setne $dst\n\t"
11890-
"movzbl $dst, $dst\n\t"
11872+
"setcc $dst \t# emits setne + movzbl or setzune for APX"
1189111873
"done:" %}
1189211874
ins_encode %{
1189311875
Label done;
1189411876
__ cmpq($src1$$Register, $src2$$Register);
1189511877
__ movl($dst$$Register, -1);
1189611878
__ jccb(Assembler::less, done);
11897-
__ setb(Assembler::notZero, $dst$$Register);
11898-
__ movzbl($dst$$Register, $dst$$Register);
11879+
__ setcc(Assembler::notZero, $dst$$Register);
1189911880
__ bind(done);
1190011881
%}
1190111882
ins_pipe(pipe_slow);
@@ -11912,16 +11893,14 @@ instruct cmpUL3_reg_reg(rRegI dst, rRegL src1, rRegL src2, rFlagsReg flags)
1191211893
format %{ "cmpq $src1, $src2\t# CmpL3\n\t"
1191311894
"movl $dst, -1\n\t"
1191411895
"jb,u done\n\t"
11915-
"setne $dst\n\t"
11916-
"movzbl $dst, $dst\n\t"
11896+
"setcc $dst \t# emits setne + movzbl or setzune for APX"
1191711897
"done:" %}
1191811898
ins_encode %{
1191911899
Label done;
1192011900
__ cmpq($src1$$Register, $src2$$Register);
1192111901
__ movl($dst$$Register, -1);
1192211902
__ jccb(Assembler::below, done);
11923-
__ setb(Assembler::notZero, $dst$$Register);
11924-
__ movzbl($dst$$Register, $dst$$Register);
11903+
__ setcc(Assembler::notZero, $dst$$Register);
1192511904
__ bind(done);
1192611905
%}
1192711906
ins_pipe(pipe_slow);

0 commit comments

Comments
 (0)
Please sign in to comment.