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