src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.asm.aarch64/src/org/graalvm/compiler/asm/aarch64/AArch64Assembler.java
--- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.asm.aarch64/src/org/graalvm/compiler/asm/aarch64/AArch64Assembler.java Thu Oct 31 14:23:06 2019 -0700
+++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.asm.aarch64/src/org/graalvm/compiler/asm/aarch64/AArch64Assembler.java Thu Oct 31 16:54:16 2019 -0700
@@ -471,6 +471,7 @@
private static final int AddSubExtendedOp = 0x0B200000;
private static final int MulOp = 0x1B000000;
+ private static final int SignedMulLongOp = 0x9B200000;
private static final int DataProcessing1SourceOp = 0x5AC00000;
private static final int DataProcessing2SourceOp = 0x1AC00000;
@@ -2313,7 +2314,7 @@
}
/**
- * unsigned multiply high. dst = (src1 * src2)[127:64]
+ * Unsigned multiply high. dst = (src1 * src2)[127:64]
*
* @param dst general purpose register. May not be null or the stackpointer.
* @param src1 general purpose register. May not be null or the stackpointer.
@@ -2327,7 +2328,7 @@
}
/**
- * unsigned multiply add-long. xDst = xSrc3 + (wSrc1 * wSrc2)
+ * Unsigned multiply add-long. xDst = xSrc3 + (wSrc1 * wSrc2)
*
* @param dst general purpose register. May not be null or the stackpointer.
* @param src1 general purpose register. May not be null or the stackpointer.
@@ -2343,7 +2344,7 @@
}
/**
- * signed multiply add-long. xDst = xSrc3 + (wSrc1 * wSrc2)
+ * Signed multiply-add long. xDst = xSrc3 + (wSrc1 * wSrc2)
*
* @param dst general purpose register. May not be null or the stackpointer.
* @param src1 general purpose register. May not be null or the stackpointer.
@@ -2351,11 +2352,19 @@
* @param src3 general purpose register. May not be null or the stackpointer.
*/
public void smaddl(Register dst, Register src1, Register src2, Register src3) {
- assert !dst.equals(sp);
- assert !src1.equals(sp);
- assert !src2.equals(sp);
- assert !src3.equals(sp);
- emitInt(0b10011011001 << 21 | dst.encoding | rs1(src1) | rs2(src2) | rs3(src3));
+ smullInstruction(MADD, dst, src1, src2, src3);
+ }
+
+ /**
+ * Signed multiply-sub long. xDst = xSrc3 - (wSrc1 * wSrc2)
+ *
+ * @param dst general purpose register. May not be null or the stackpointer.
+ * @param src1 general purpose register. May not be null or the stackpointer.
+ * @param src2 general purpose register. May not be null or the stackpointer.
+ * @param src3 general purpose register. May not be null or the stackpointer.
+ */
+ public void smsubl(Register dst, Register src1, Register src2, Register src3) {
+ smullInstruction(MSUB, dst, src1, src2, src3);
}
private void mulInstruction(Instruction instr, Register dst, Register src1, Register src2, Register src3, InstructionType type) {
@@ -2366,6 +2375,14 @@
emitInt(type.encoding | instr.encoding | MulOp | rd(dst) | rs1(src1) | rs2(src2) | rs3(src3));
}
+ private void smullInstruction(Instruction instr, Register dst, Register src1, Register src2, Register src3) {
+ assert !dst.equals(sp);
+ assert !src1.equals(sp);
+ assert !src2.equals(sp);
+ assert !src3.equals(sp);
+ emitInt(instr.encoding | SignedMulLongOp | rd(dst) | rs1(src1) | rs2(src2) | rs3(src3));
+ }
+
/**
* Signed divide. dst = src1 / src2.
*