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 } |