Skip to content

Commit 0207d76

Browse files
author
Andrew Haley
committedJun 13, 2022
8287926: AArch64: intrinsics for divideUnsigned and remainderUnsigned methods in java.lang.Integer and java.lang.Long
Reviewed-by: adinn, ngasson
1 parent 33ed036 commit 0207d76

File tree

1 file changed

+66
-2
lines changed

1 file changed

+66
-2
lines changed
 

‎src/hotspot/cpu/aarch64/aarch64.ad

+66-2
Original file line numberDiff line numberDiff line change
@@ -11356,7 +11356,7 @@ instruct modI(iRegINoSp dst, iRegIorL2I src1, iRegIorL2I src2) %{
1135611356

1135711357
ins_cost(INSN_COST * 22);
1135811358
format %{ "sdivw rscratch1, $src1, $src2\n\t"
11359-
"msubw($dst, rscratch1, $src2, $src1" %}
11359+
"msubw $dst, rscratch1, $src2, $src1" %}
1136011360

1136111361
ins_encode(aarch64_enc_modw(dst, src1, src2));
1136211362
ins_pipe(idiv_reg_reg);
@@ -11369,12 +11369,76 @@ instruct modL(iRegLNoSp dst, iRegL src1, iRegL src2) %{
1136911369

1137011370
ins_cost(INSN_COST * 38);
1137111371
format %{ "sdiv rscratch1, $src1, $src2\n"
11372-
"msub($dst, rscratch1, $src2, $src1" %}
11372+
"msub $dst, rscratch1, $src2, $src1" %}
1137311373

1137411374
ins_encode(aarch64_enc_mod(dst, src1, src2));
1137511375
ins_pipe(ldiv_reg_reg);
1137611376
%}
1137711377

11378+
// Unsigned Integer Divide
11379+
11380+
instruct UdivI_reg_reg(iRegINoSp dst, iRegIorL2I src1, iRegIorL2I src2) %{
11381+
match(Set dst (UDivI src1 src2));
11382+
11383+
ins_cost(INSN_COST * 19);
11384+
format %{ "udivw $dst, $src1, $src2" %}
11385+
11386+
ins_encode %{
11387+
__ udivw($dst$$Register, $src1$$Register, $src2$$Register);
11388+
%}
11389+
11390+
ins_pipe(idiv_reg_reg);
11391+
%}
11392+
11393+
// Unsigned Long Divide
11394+
11395+
instruct UdivL_reg_reg(iRegLNoSp dst, iRegL src1, iRegL src2) %{
11396+
match(Set dst (UDivL src1 src2));
11397+
11398+
ins_cost(INSN_COST * 35);
11399+
format %{ "udiv $dst, $src1, $src2" %}
11400+
11401+
ins_encode %{
11402+
__ udiv($dst$$Register, $src1$$Register, $src2$$Register);
11403+
%}
11404+
11405+
ins_pipe(ldiv_reg_reg);
11406+
%}
11407+
11408+
// Unsigned Integer Remainder
11409+
11410+
instruct UmodI_reg_reg(iRegINoSp dst, iRegIorL2I src1, iRegIorL2I src2) %{
11411+
match(Set dst (UModI src1 src2));
11412+
11413+
ins_cost(INSN_COST * 22);
11414+
format %{ "udivw rscratch1, $src1, $src2\n\t"
11415+
"msubw $dst, rscratch1, $src2, $src1" %}
11416+
11417+
ins_encode %{
11418+
__ udivw(rscratch1, $src1$$Register, $src2$$Register);
11419+
__ msubw($dst$$Register, rscratch1, $src2$$Register, $src1$$Register);
11420+
%}
11421+
11422+
ins_pipe(idiv_reg_reg);
11423+
%}
11424+
11425+
// Unsigned Long Remainder
11426+
11427+
instruct UModL_reg_reg(iRegLNoSp dst, iRegL src1, iRegL src2) %{
11428+
match(Set dst (UModL src1 src2));
11429+
11430+
ins_cost(INSN_COST * 38);
11431+
format %{ "udiv rscratch1, $src1, $src2\n"
11432+
"msub $dst, rscratch1, $src2, $src1" %}
11433+
11434+
ins_encode %{
11435+
__ udiv(rscratch1, $src1$$Register, $src2$$Register);
11436+
__ msub($dst$$Register, rscratch1, $src2$$Register, $src1$$Register);
11437+
%}
11438+
11439+
ins_pipe(ldiv_reg_reg);
11440+
%}
11441+
1137811442
// Integer Shifts
1137911443

1138011444
// Shift Left Register

0 commit comments

Comments
 (0)
Please sign in to comment.