< prev index next >

src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.sparc/src/org/graalvm/compiler/hotspot/sparc/SPARCHotSpotLIRGenerator.java

Print this page
rev 56282 : [mq]: graal
   1 /*
   2  * Copyright (c) 2013, 2018, Oracle and/or its affiliates. All rights reserved.
   3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
   4  *
   5  * This code is free software; you can redistribute it and/or modify it
   6  * under the terms of the GNU General Public License version 2 only, as
   7  * published by the Free Software Foundation.
   8  *
   9  * This code is distributed in the hope that it will be useful, but WITHOUT
  10  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  11  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
  12  * version 2 for more details (a copy is included in the LICENSE file that
  13  * accompanied this code).
  14  *
  15  * You should have received a copy of the GNU General Public License version
  16  * 2 along with this work; if not, write to the Free Software Foundation,
  17  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
  18  *
  19  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
  20  * or visit www.oracle.com if you need additional information or have any
  21  * questions.
  22  */
  23 
  24 
  25 package org.graalvm.compiler.hotspot.sparc;
  26 
  27 import static jdk.vm.ci.sparc.SPARCKind.WORD;
  28 import static jdk.vm.ci.sparc.SPARCKind.XWORD;
  29 import static org.graalvm.compiler.lir.LIRValueUtil.asConstant;
  30 import static org.graalvm.compiler.lir.LIRValueUtil.isConstantValue;

  31 
  32 import org.graalvm.compiler.asm.sparc.SPARCAssembler;
  33 import org.graalvm.compiler.core.common.CompressEncoding;
  34 import org.graalvm.compiler.core.common.LIRKind;
  35 import org.graalvm.compiler.core.common.calc.Condition;
  36 import org.graalvm.compiler.core.common.spi.ForeignCallLinkage;
  37 import org.graalvm.compiler.core.common.spi.LIRKindTool;
  38 import org.graalvm.compiler.core.sparc.SPARCArithmeticLIRGenerator;
  39 import org.graalvm.compiler.core.sparc.SPARCLIRGenerator;
  40 import org.graalvm.compiler.core.sparc.SPARCLIRKindTool;
  41 import org.graalvm.compiler.debug.GraalError;
  42 import org.graalvm.compiler.hotspot.GraalHotSpotVMConfig;
  43 import org.graalvm.compiler.hotspot.HotSpotBackend;
  44 import org.graalvm.compiler.hotspot.HotSpotDebugInfoBuilder;
  45 import org.graalvm.compiler.hotspot.HotSpotForeignCallLinkage;
  46 import org.graalvm.compiler.hotspot.HotSpotLIRGenerationResult;
  47 import org.graalvm.compiler.hotspot.HotSpotLIRGenerator;
  48 import org.graalvm.compiler.hotspot.HotSpotLockStack;
  49 import org.graalvm.compiler.hotspot.debug.BenchmarkCounters;
  50 import org.graalvm.compiler.hotspot.meta.HotSpotProviders;
  51 import org.graalvm.compiler.hotspot.meta.HotSpotRegistersProvider;
  52 import org.graalvm.compiler.hotspot.stubs.Stub;
  53 import org.graalvm.compiler.lir.LIRFrameState;
  54 import org.graalvm.compiler.lir.LIRInstruction;
  55 import org.graalvm.compiler.lir.LabelRef;
  56 import org.graalvm.compiler.lir.StandardOp.SaveRegistersOp;
  57 import org.graalvm.compiler.lir.SwitchStrategy;
  58 import org.graalvm.compiler.lir.Variable;
  59 import org.graalvm.compiler.lir.VirtualStackSlot;
  60 import org.graalvm.compiler.lir.gen.LIRGenerationResult;
  61 import org.graalvm.compiler.lir.sparc.SPARCAddressValue;
  62 import org.graalvm.compiler.lir.sparc.SPARCControlFlow.StrategySwitchOp;
  63 import org.graalvm.compiler.lir.sparc.SPARCFrameMapBuilder;
  64 import org.graalvm.compiler.lir.sparc.SPARCImmediateAddressValue;
  65 import org.graalvm.compiler.lir.sparc.SPARCMove.CompareAndSwapOp;
  66 import org.graalvm.compiler.lir.sparc.SPARCMove.NullCheckOp;
  67 import org.graalvm.compiler.lir.sparc.SPARCMove.StoreOp;
  68 import org.graalvm.compiler.lir.sparc.SPARCPrefetchOp;
  69 import org.graalvm.compiler.lir.sparc.SPARCSaveRegistersOp;
  70 
  71 import jdk.vm.ci.code.CallingConvention;
  72 import jdk.vm.ci.code.Register;
  73 import jdk.vm.ci.code.RegisterValue;
  74 import jdk.vm.ci.code.StackSlot;
  75 import jdk.vm.ci.hotspot.HotSpotCompressedNullConstant;
  76 import jdk.vm.ci.hotspot.HotSpotObjectConstant;


 332         if (inputKind.isReference(0)) {
 333             // oop
 334             Variable result = newVariable(LIRKind.reference(XWORD));
 335             append(new SPARCHotSpotMove.UncompressPointer(result, asAllocatable(pointer), getProviders().getRegisters().getHeapBaseRegister().asValue(), encoding, nonNull));
 336             return result;
 337         } else {
 338             // metaspace pointer
 339             Variable result = newVariable(LIRKind.value(XWORD));
 340             AllocatableValue base = Value.ILLEGAL;
 341             if (encoding.hasBase()) {
 342                 base = emitLoadConstant(LIRKind.value(XWORD), JavaConstant.forLong(encoding.getBase()));
 343             }
 344             append(new SPARCHotSpotMove.UncompressPointer(result, asAllocatable(pointer), base, encoding, nonNull));
 345             return result;
 346         }
 347     }
 348 
 349     /**
 350      * @param savedRegisters the registers saved by this operation which may be subject to pruning
 351      * @param savedRegisterLocations the slots to which the registers are saved
 352      * @param supportsRemove determines if registers can be pruned
 353      */
 354     protected SPARCSaveRegistersOp emitSaveRegisters(Register[] savedRegisters, AllocatableValue[] savedRegisterLocations, boolean supportsRemove) {
 355         SPARCSaveRegistersOp save = new SPARCSaveRegistersOp(savedRegisters, savedRegisterLocations, supportsRemove);
 356         append(save);
 357         return save;
 358     }
 359 
 360     @Override
 361     public void emitNullCheck(Value address, LIRFrameState state) {
 362         PlatformKind kind = address.getPlatformKind();
 363         if (kind == WORD) {
 364             CompressEncoding encoding = config.getOopEncoding();
 365             Value uncompressed = emitUncompress(address, encoding, false);
 366             append(new NullCheckOp(asAddressValue(uncompressed), state));
 367         } else {
 368             super.emitNullCheck(address, state);
 369         }
 370     }
 371 
 372     @Override
 373     public LIRInstruction createBenchmarkCounter(String name, String group, Value increment) {
 374         if (BenchmarkCounters.enabled) {
 375             return new SPARCHotSpotCounterOp(name, group, increment, getProviders().getRegisters(), config);


 385         throw GraalError.shouldNotReachHere("BenchmarkCounters are not enabled!");
 386     }
 387 
 388     public AllocatableValue getSafepointAddressValue() {
 389         if (this.safepointAddressValue == null) {
 390             this.safepointAddressValue = SPARCHotSpotSafepointOp.getSafepointAddressValue(this);
 391         }
 392         return this.safepointAddressValue;
 393     }
 394 
 395     @Override
 396     protected StrategySwitchOp createStrategySwitchOp(AllocatableValue base, SwitchStrategy strategy, LabelRef[] keyTargets, LabelRef defaultTarget, Variable key, Variable scratchValue) {
 397         return new SPARCHotSpotStrategySwitchOp(base, strategy, keyTargets, defaultTarget, key, scratchValue);
 398     }
 399 
 400     public void setDebugInfoBuilder(HotSpotDebugInfoBuilder debugInfoBuilder) {
 401         this.debugInfoBuilder = debugInfoBuilder;
 402     }
 403 
 404     @Override
 405     public SaveRegistersOp createZapRegisters(Register[] zappedRegisters, JavaConstant[] zapValues) {
 406         throw GraalError.unimplemented();
 407     }
 408 
 409     @Override
 410     public LIRInstruction createZapArgumentSpace(StackSlot[] zappedStack, JavaConstant[] zapValues) {
 411         throw GraalError.unimplemented();
 412     }
 413 }
   1 /*
   2  * Copyright (c) 2013, 2019, Oracle and/or its affiliates. All rights reserved.
   3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
   4  *
   5  * This code is free software; you can redistribute it and/or modify it
   6  * under the terms of the GNU General Public License version 2 only, as
   7  * published by the Free Software Foundation.
   8  *
   9  * This code is distributed in the hope that it will be useful, but WITHOUT
  10  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  11  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
  12  * version 2 for more details (a copy is included in the LICENSE file that
  13  * accompanied this code).
  14  *
  15  * You should have received a copy of the GNU General Public License version
  16  * 2 along with this work; if not, write to the Free Software Foundation,
  17  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
  18  *
  19  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
  20  * or visit www.oracle.com if you need additional information or have any
  21  * questions.
  22  */
  23 
  24 
  25 package org.graalvm.compiler.hotspot.sparc;
  26 
  27 import static jdk.vm.ci.sparc.SPARCKind.WORD;
  28 import static jdk.vm.ci.sparc.SPARCKind.XWORD;
  29 import static org.graalvm.compiler.lir.LIRValueUtil.asConstant;
  30 import static org.graalvm.compiler.lir.LIRValueUtil.isConstantValue;
  31 import static org.graalvm.compiler.lir.StandardOp.ZapRegistersOp;
  32 
  33 import org.graalvm.compiler.asm.sparc.SPARCAssembler;
  34 import org.graalvm.compiler.core.common.CompressEncoding;
  35 import org.graalvm.compiler.core.common.LIRKind;
  36 import org.graalvm.compiler.core.common.calc.Condition;
  37 import org.graalvm.compiler.core.common.spi.ForeignCallLinkage;
  38 import org.graalvm.compiler.core.common.spi.LIRKindTool;
  39 import org.graalvm.compiler.core.sparc.SPARCArithmeticLIRGenerator;
  40 import org.graalvm.compiler.core.sparc.SPARCLIRGenerator;
  41 import org.graalvm.compiler.core.sparc.SPARCLIRKindTool;
  42 import org.graalvm.compiler.debug.GraalError;
  43 import org.graalvm.compiler.hotspot.GraalHotSpotVMConfig;
  44 import org.graalvm.compiler.hotspot.HotSpotBackend;
  45 import org.graalvm.compiler.hotspot.HotSpotDebugInfoBuilder;
  46 import org.graalvm.compiler.hotspot.HotSpotForeignCallLinkage;
  47 import org.graalvm.compiler.hotspot.HotSpotLIRGenerationResult;
  48 import org.graalvm.compiler.hotspot.HotSpotLIRGenerator;
  49 import org.graalvm.compiler.hotspot.HotSpotLockStack;
  50 import org.graalvm.compiler.hotspot.debug.BenchmarkCounters;
  51 import org.graalvm.compiler.hotspot.meta.HotSpotProviders;
  52 import org.graalvm.compiler.hotspot.meta.HotSpotRegistersProvider;
  53 import org.graalvm.compiler.hotspot.stubs.Stub;
  54 import org.graalvm.compiler.lir.LIRFrameState;
  55 import org.graalvm.compiler.lir.LIRInstruction;
  56 import org.graalvm.compiler.lir.LabelRef;

  57 import org.graalvm.compiler.lir.SwitchStrategy;
  58 import org.graalvm.compiler.lir.Variable;
  59 import org.graalvm.compiler.lir.VirtualStackSlot;
  60 import org.graalvm.compiler.lir.gen.LIRGenerationResult;
  61 import org.graalvm.compiler.lir.sparc.SPARCAddressValue;
  62 import org.graalvm.compiler.lir.sparc.SPARCControlFlow.StrategySwitchOp;
  63 import org.graalvm.compiler.lir.sparc.SPARCFrameMapBuilder;
  64 import org.graalvm.compiler.lir.sparc.SPARCImmediateAddressValue;
  65 import org.graalvm.compiler.lir.sparc.SPARCMove.CompareAndSwapOp;
  66 import org.graalvm.compiler.lir.sparc.SPARCMove.NullCheckOp;
  67 import org.graalvm.compiler.lir.sparc.SPARCMove.StoreOp;
  68 import org.graalvm.compiler.lir.sparc.SPARCPrefetchOp;
  69 import org.graalvm.compiler.lir.sparc.SPARCSaveRegistersOp;
  70 
  71 import jdk.vm.ci.code.CallingConvention;
  72 import jdk.vm.ci.code.Register;
  73 import jdk.vm.ci.code.RegisterValue;
  74 import jdk.vm.ci.code.StackSlot;
  75 import jdk.vm.ci.hotspot.HotSpotCompressedNullConstant;
  76 import jdk.vm.ci.hotspot.HotSpotObjectConstant;


 332         if (inputKind.isReference(0)) {
 333             // oop
 334             Variable result = newVariable(LIRKind.reference(XWORD));
 335             append(new SPARCHotSpotMove.UncompressPointer(result, asAllocatable(pointer), getProviders().getRegisters().getHeapBaseRegister().asValue(), encoding, nonNull));
 336             return result;
 337         } else {
 338             // metaspace pointer
 339             Variable result = newVariable(LIRKind.value(XWORD));
 340             AllocatableValue base = Value.ILLEGAL;
 341             if (encoding.hasBase()) {
 342                 base = emitLoadConstant(LIRKind.value(XWORD), JavaConstant.forLong(encoding.getBase()));
 343             }
 344             append(new SPARCHotSpotMove.UncompressPointer(result, asAllocatable(pointer), base, encoding, nonNull));
 345             return result;
 346         }
 347     }
 348 
 349     /**
 350      * @param savedRegisters the registers saved by this operation which may be subject to pruning
 351      * @param savedRegisterLocations the slots to which the registers are saved

 352      */
 353     protected SPARCSaveRegistersOp emitSaveRegisters(Register[] savedRegisters, AllocatableValue[] savedRegisterLocations) {
 354         SPARCSaveRegistersOp save = new SPARCSaveRegistersOp(savedRegisters, savedRegisterLocations);
 355         append(save);
 356         return save;
 357     }
 358 
 359     @Override
 360     public void emitNullCheck(Value address, LIRFrameState state) {
 361         PlatformKind kind = address.getPlatformKind();
 362         if (kind == WORD) {
 363             CompressEncoding encoding = config.getOopEncoding();
 364             Value uncompressed = emitUncompress(address, encoding, false);
 365             append(new NullCheckOp(asAddressValue(uncompressed), state));
 366         } else {
 367             super.emitNullCheck(address, state);
 368         }
 369     }
 370 
 371     @Override
 372     public LIRInstruction createBenchmarkCounter(String name, String group, Value increment) {
 373         if (BenchmarkCounters.enabled) {
 374             return new SPARCHotSpotCounterOp(name, group, increment, getProviders().getRegisters(), config);


 384         throw GraalError.shouldNotReachHere("BenchmarkCounters are not enabled!");
 385     }
 386 
 387     public AllocatableValue getSafepointAddressValue() {
 388         if (this.safepointAddressValue == null) {
 389             this.safepointAddressValue = SPARCHotSpotSafepointOp.getSafepointAddressValue(this);
 390         }
 391         return this.safepointAddressValue;
 392     }
 393 
 394     @Override
 395     protected StrategySwitchOp createStrategySwitchOp(AllocatableValue base, SwitchStrategy strategy, LabelRef[] keyTargets, LabelRef defaultTarget, Variable key, Variable scratchValue) {
 396         return new SPARCHotSpotStrategySwitchOp(base, strategy, keyTargets, defaultTarget, key, scratchValue);
 397     }
 398 
 399     public void setDebugInfoBuilder(HotSpotDebugInfoBuilder debugInfoBuilder) {
 400         this.debugInfoBuilder = debugInfoBuilder;
 401     }
 402 
 403     @Override
 404     public ZapRegistersOp createZapRegisters(Register[] zappedRegisters, JavaConstant[] zapValues) {
 405         throw GraalError.unimplemented();
 406     }
 407 
 408     @Override
 409     public LIRInstruction createZapArgumentSpace(StackSlot[] zappedStack, JavaConstant[] zapValues) {
 410         throw GraalError.unimplemented();
 411     }
 412 }
< prev index next >