|
62 | 62 | import org.graalvm.compiler.lir.LIRValueUtil; |
63 | 63 | import org.graalvm.compiler.lir.LabelRef; |
64 | 64 | import org.graalvm.compiler.lir.amd64.AMD64AddressValue; |
| 65 | +import org.graalvm.compiler.lir.amd64.AMD64BinaryConsumer; |
65 | 66 | import org.graalvm.compiler.lir.amd64.AMD64ControlFlow.TestBranchOp; |
66 | 67 | import org.graalvm.compiler.lir.amd64.AMD64ControlFlow.TestConstBranchOp; |
| 68 | +import org.graalvm.compiler.lir.amd64.AMD64UnaryConsumer; |
67 | 69 | import org.graalvm.compiler.lir.gen.LIRGeneratorTool; |
68 | 70 | import org.graalvm.compiler.nodes.ConstantNode; |
69 | 71 | import org.graalvm.compiler.nodes.DeoptimizingNode; |
|
83 | 85 | import org.graalvm.compiler.nodes.memory.AddressableMemoryAccess; |
84 | 86 | import org.graalvm.compiler.nodes.memory.LIRLowerableAccess; |
85 | 87 | import org.graalvm.compiler.nodes.memory.MemoryAccess; |
| 88 | +import org.graalvm.compiler.nodes.memory.ReadNode; |
86 | 89 | import org.graalvm.compiler.nodes.memory.WriteNode; |
87 | 90 | import org.graalvm.compiler.nodes.util.GraphUtil; |
88 | 91 |
|
@@ -577,6 +580,59 @@ public ComplexMatchResult xorMemory(ValueNode value, LIRLowerableAccess access) |
577 | 580 | } |
578 | 581 | } |
579 | 582 |
|
| 583 | + private ComplexMatchResult emitMemoryConsumer(WriteNode write, AMD64Assembler.AMD64BinaryArithmetic arithmeticOp, ReadNode read, ValueNode value) { |
| 584 | + if (getMemoryKind(write).isInteger() && !write.canDeoptimize() && !read.canDeoptimize()) { |
| 585 | + OperandSize size = getMemorySize(write); |
| 586 | + if (write.getAddress() == read.getAddress()) { |
| 587 | + if (value.isJavaConstant()) { |
| 588 | + long valueCst = value.asJavaConstant().asLong(); |
| 589 | + if (NumUtil.isInt(valueCst)) { |
| 590 | + AMD64Assembler.AMD64MOp mop = AMD64ArithmeticLIRGenerator.getMOp(arithmeticOp, (int) valueCst); |
| 591 | + if (mop != null) { |
| 592 | + return builder -> { |
| 593 | + AMD64AddressValue addressValue = (AMD64AddressValue) operand(write.getAddress()); |
| 594 | + builder.append(new AMD64UnaryConsumer.MemoryOp(mop, size, addressValue)); |
| 595 | + return null; |
| 596 | + }; |
| 597 | + } else { |
| 598 | + return builder -> { |
| 599 | + AMD64AddressValue addressValue = (AMD64AddressValue) operand(write.getAddress()); |
| 600 | + builder.append(new AMD64BinaryConsumer.MemoryConstOp(arithmeticOp.getMIOpcode(size, NumUtil.isByte(valueCst)), size, addressValue, (int) valueCst, state(write))); |
| 601 | + return null; |
| 602 | + }; |
| 603 | + } |
| 604 | + } |
| 605 | + } |
| 606 | + return builder -> { |
| 607 | + AMD64AddressValue addressValue = (AMD64AddressValue) operand(write.getAddress()); |
| 608 | + builder.append(new AMD64BinaryConsumer.MemoryMROp(arithmeticOp.getMROpcode(size), size, addressValue, builder.getLIRGeneratorTool().asAllocatable(operand(value)), state(write))); |
| 609 | + return null; |
| 610 | + }; |
| 611 | + } |
| 612 | + } |
| 613 | + return null; |
| 614 | + } |
| 615 | + |
| 616 | + @MatchRule("(Write=write object (Add Read=read value))") |
| 617 | + public ComplexMatchResult addToMemory(WriteNode write, ReadNode read, ValueNode value) { |
| 618 | + return emitMemoryConsumer(write, ADD, read, value); |
| 619 | + } |
| 620 | + |
| 621 | + @MatchRule("(Write=write object (Sub Read=read value))") |
| 622 | + public ComplexMatchResult subToMemory(WriteNode write, ReadNode read, ValueNode value) { |
| 623 | + return emitMemoryConsumer(write, SUB, read, value); |
| 624 | + } |
| 625 | + |
| 626 | + @MatchRule("(Write=write object (Or Read=read value))") |
| 627 | + public ComplexMatchResult orToMemory(WriteNode write, ReadNode read, ValueNode value) { |
| 628 | + return emitMemoryConsumer(write, OR, read, value); |
| 629 | + } |
| 630 | + |
| 631 | + @MatchRule("(Write=write object (Xor Read=read value))") |
| 632 | + public ComplexMatchResult xorToMemory(WriteNode write, ReadNode read, ValueNode value) { |
| 633 | + return emitMemoryConsumer(write, XOR, read, value); |
| 634 | + } |
| 635 | + |
580 | 636 | @MatchRule("(Write object Narrow=narrow)") |
581 | 637 | public ComplexMatchResult writeNarrow(WriteNode root, NarrowNode narrow) { |
582 | 638 | return builder -> { |
|
0 commit comments