diff -r 06d028f7578e -r 583fd71c47d6 src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir.aarch64/src/org/graalvm/compiler/lir/aarch64/AArch64ArithmeticOp.java --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir.aarch64/src/org/graalvm/compiler/lir/aarch64/AArch64ArithmeticOp.java Sat Dec 08 05:04:19 2018 +0100 +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir.aarch64/src/org/graalvm/compiler/lir/aarch64/AArch64ArithmeticOp.java Sat Dec 08 00:56:10 2018 -0800 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2013, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -54,6 +54,7 @@ SUBS(ARITHMETIC), MUL, MULVS, + MNEG, DIV, SMULH, UMULH, @@ -275,6 +276,9 @@ case SMULH: masm.smulh(size, dst, src1, src2); break; + case MNEG: + masm.mneg(size, dst, src1, src2); + break; case DIV: masm.sdiv(size, dst, src1, src2); break; @@ -367,8 +371,8 @@ } } - public static class AddSubShiftOp extends AArch64LIRInstruction { - private static final LIRInstructionClass TYPE = LIRInstructionClass.create(AddSubShiftOp.class); + public static class BinaryShiftOp extends AArch64LIRInstruction { + private static final LIRInstructionClass TYPE = LIRInstructionClass.create(BinaryShiftOp.class); @Opcode private final AArch64ArithmeticOp op; @Def(REG) protected AllocatableValue result; @@ -376,19 +380,24 @@ @Use(REG) protected AllocatableValue src2; private final AArch64MacroAssembler.ShiftType shiftType; private final int shiftAmt; + private final boolean isShiftNot; /** - * Computes result = src1 src2 . + * If shiftNot: Computes result = src1 ~(src2 ) + * (Only for logic ops). else: Computes + * result = src1 src2 . */ - public AddSubShiftOp(AArch64ArithmeticOp op, AllocatableValue result, AllocatableValue src1, AllocatableValue src2, AArch64MacroAssembler.ShiftType shiftType, int shiftAmt) { + public BinaryShiftOp(AArch64ArithmeticOp op, AllocatableValue result, AllocatableValue src1, AllocatableValue src2, + AArch64MacroAssembler.ShiftType shiftType, int shiftAmt, boolean isShiftNot) { super(TYPE); - assert op == ADD || op == SUB; + assert op == ADD || op == SUB || op == AND || op == OR || op == XOR; this.op = op; this.result = result; this.src1 = src1; this.src2 = src2; this.shiftType = shiftType; this.shiftAmt = shiftAmt; + this.isShiftNot = isShiftNot; } @Override @@ -401,6 +410,27 @@ case SUB: masm.sub(size, asRegister(result), asRegister(src1), asRegister(src2), shiftType, shiftAmt); break; + case AND: + if (!isShiftNot) { + masm.and(size, asRegister(result), asRegister(src1), asRegister(src2), shiftType, shiftAmt); + } else { + masm.bic(size, asRegister(result), asRegister(src1), asRegister(src2), shiftType, shiftAmt); + } + break; + case OR: + if (!isShiftNot) { + masm.or(size, asRegister(result), asRegister(src1), asRegister(src2), shiftType, shiftAmt); + } else { + masm.orn(size, asRegister(result), asRegister(src1), asRegister(src2), shiftType, shiftAmt); + } + break; + case XOR: + if (!isShiftNot) { + masm.eor(size, asRegister(result), asRegister(src1), asRegister(src2), shiftType, shiftAmt); + } else { + masm.eon(size, asRegister(result), asRegister(src1), asRegister(src2), shiftType, shiftAmt); + } + break; default: throw GraalError.shouldNotReachHere(); } @@ -437,4 +467,42 @@ } } + public static class MultiplyAddSubOp extends AArch64LIRInstruction { + private static final LIRInstructionClass TYPE = LIRInstructionClass.create(MultiplyAddSubOp.class); + + @Opcode private final AArch64ArithmeticOp op; + @Def(REG) protected AllocatableValue result; + @Use(REG) protected AllocatableValue src1; + @Use(REG) protected AllocatableValue src2; + @Use(REG) protected AllocatableValue src3; + + /** + * Computes result = src3 src1 * src2. + */ + public MultiplyAddSubOp(AArch64ArithmeticOp op, AllocatableValue result, AllocatableValue src1, AllocatableValue src2, AllocatableValue src3) { + super(TYPE); + assert op == ADD || op == SUB; + this.op = op; + this.result = result; + this.src1 = src1; + this.src2 = src2; + this.src3 = src3; + } + + @Override + public void emitCode(CompilationResultBuilder crb, AArch64MacroAssembler masm) { + int size = result.getPlatformKind().getSizeInBytes() * Byte.SIZE; + switch (op) { + case ADD: + masm.madd(size, asRegister(result), asRegister(src1), asRegister(src2), asRegister(src3)); + break; + case SUB: + masm.msub(size, asRegister(result), asRegister(src1), asRegister(src2), asRegister(src3)); + break; + default: + throw GraalError.shouldNotReachHere(); + } + } + } + }