src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir.aarch64/src/org/graalvm/compiler/lir/aarch64/AArch64ArithmeticOp.java
changeset 58877 aec7bf35d6f5
parent 58533 46b0b7fe255c
equal deleted inserted replaced
58876:1a8d65e71a66 58877:aec7bf35d6f5
    56     MULVS,
    56     MULVS,
    57     MNEG,
    57     MNEG,
    58     DIV,
    58     DIV,
    59     SMULH,
    59     SMULH,
    60     UMULH,
    60     UMULH,
       
    61     SMULL,
       
    62     SMNEGL,
       
    63     MADD,
       
    64     MSUB,
       
    65     FMADD,
       
    66     SMADDL,
       
    67     SMSUBL,
    61     REM,
    68     REM,
    62     UDIV,
    69     UDIV,
    63     UREM,
    70     UREM,
    64     AND(LOGICAL),
    71     AND(LOGICAL),
    65     ANDS(LOGICAL),
    72     ANDS(LOGICAL),
   276                 case SMULH:
   283                 case SMULH:
   277                     masm.smulh(size, dst, src1, src2);
   284                     masm.smulh(size, dst, src1, src2);
   278                     break;
   285                     break;
   279                 case MNEG:
   286                 case MNEG:
   280                     masm.mneg(size, dst, src1, src2);
   287                     masm.mneg(size, dst, src1, src2);
       
   288                     break;
       
   289                 case SMULL:
       
   290                     masm.smull(size, dst, src1, src2);
       
   291                     break;
       
   292                 case SMNEGL:
       
   293                     masm.smnegl(size, dst, src1, src2);
   281                     break;
   294                     break;
   282                 case DIV:
   295                 case DIV:
   283                     masm.sdiv(size, dst, src1, src2);
   296                     masm.sdiv(size, dst, src1, src2);
   284                     break;
   297                     break;
   285                 case UDIV:
   298                 case UDIV:
   475         @Use(REG) protected AllocatableValue src1;
   488         @Use(REG) protected AllocatableValue src1;
   476         @Use(REG) protected AllocatableValue src2;
   489         @Use(REG) protected AllocatableValue src2;
   477         @Use(REG) protected AllocatableValue src3;
   490         @Use(REG) protected AllocatableValue src3;
   478 
   491 
   479         /**
   492         /**
   480          * Computes <code>result = src3 <op> src1 * src2</code>.
   493          * Computes <code>result = src3 +/- src1 * src2</code>.
   481          */
   494          */
   482         public MultiplyAddSubOp(AArch64ArithmeticOp op, AllocatableValue result, AllocatableValue src1, AllocatableValue src2, AllocatableValue src3) {
   495         public MultiplyAddSubOp(AArch64ArithmeticOp op, AllocatableValue result, AllocatableValue src1, AllocatableValue src2, AllocatableValue src3) {
   483             super(TYPE);
   496             super(TYPE);
   484             assert op == ADD || op == SUB || op == FADD;
       
   485             this.op = op;
   497             this.op = op;
   486             this.result = result;
   498             this.result = result;
   487             this.src1 = src1;
   499             this.src1 = src1;
   488             this.src2 = src2;
   500             this.src2 = src2;
   489             this.src3 = src3;
   501             this.src3 = src3;
   491 
   503 
   492         @Override
   504         @Override
   493         public void emitCode(CompilationResultBuilder crb, AArch64MacroAssembler masm) {
   505         public void emitCode(CompilationResultBuilder crb, AArch64MacroAssembler masm) {
   494             int size = result.getPlatformKind().getSizeInBytes() * Byte.SIZE;
   506             int size = result.getPlatformKind().getSizeInBytes() * Byte.SIZE;
   495             switch (op) {
   507             switch (op) {
   496                 case ADD:
   508                 case MADD:
   497                     masm.madd(size, asRegister(result), asRegister(src1), asRegister(src2), asRegister(src3));
   509                     masm.madd(size, asRegister(result), asRegister(src1), asRegister(src2), asRegister(src3));
   498                     break;
   510                     break;
   499                 case SUB:
   511                 case MSUB:
   500                     masm.msub(size, asRegister(result), asRegister(src1), asRegister(src2), asRegister(src3));
   512                     masm.msub(size, asRegister(result), asRegister(src1), asRegister(src2), asRegister(src3));
   501                     break;
   513                     break;
   502                 case FADD:
   514                 case FMADD:
   503                     masm.fmadd(size, asRegister(result), asRegister(src1), asRegister(src2), asRegister(src3));
   515                     masm.fmadd(size, asRegister(result), asRegister(src1), asRegister(src2), asRegister(src3));
       
   516                     break;
       
   517                 case SMADDL:
       
   518                     assert size == 64;
       
   519                     masm.smaddl(size, asRegister(result), asRegister(src1), asRegister(src2), asRegister(src3));
       
   520                     break;
       
   521                 case SMSUBL:
       
   522                     assert size == 64;
       
   523                     masm.smsubl(size, asRegister(result), asRegister(src1), asRegister(src2), asRegister(src3));
   504                     break;
   524                     break;
   505                 default:
   525                 default:
   506                     throw GraalError.shouldNotReachHere();
   526                     throw GraalError.shouldNotReachHere();
   507             }
   527             }
   508         }
   528         }