src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.common/src/org/graalvm/compiler/core/common/util/UnsafeArrayTypeWriter.java
author dlong
Thu, 25 Jul 2019 17:35:58 -0400
changeset 57537 ecc6e394475f
parent 54601 c40b2a190173
permissions -rw-r--r--
8226771: Update Graal Reviewed-by: kvn
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
     1
/*
54601
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
     2
 * Copyright (c) 2015, 2019, Oracle and/or its affiliates. All rights reserved.
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
     3
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
     4
 *
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
     5
 * This code is free software; you can redistribute it and/or modify it
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
     6
 * under the terms of the GNU General Public License version 2 only, as
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
     7
 * published by the Free Software Foundation.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
     8
 *
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
     9
 * This code is distributed in the hope that it will be useful, but WITHOUT
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    10
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    11
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    12
 * version 2 for more details (a copy is included in the LICENSE file that
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    13
 * accompanied this code).
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    14
 *
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    15
 * You should have received a copy of the GNU General Public License version
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    16
 * 2 along with this work; if not, write to the Free Software Foundation,
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    17
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    18
 *
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    19
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    20
 * or visit www.oracle.com if you need additional information or have any
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    21
 * questions.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    22
 */
50858
2d3e99a72541 8205824: Update Graal
never
parents: 47216
diff changeset
    23
2d3e99a72541 8205824: Update Graal
never
parents: 47216
diff changeset
    24
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    25
package org.graalvm.compiler.core.common.util;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    26
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    27
import static org.graalvm.compiler.core.common.util.TypeConversion.asS1;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    28
import static org.graalvm.compiler.core.common.util.TypeConversion.asS2;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    29
import static org.graalvm.compiler.core.common.util.TypeConversion.asS4;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    30
import static org.graalvm.compiler.core.common.util.TypeConversion.asU1;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    31
import static org.graalvm.compiler.core.common.util.TypeConversion.asU2;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    32
import static org.graalvm.compiler.core.common.util.TypeConversion.asU4;
54328
37648a9c4a6a 8221341: Update Graal
jwilhelm
parents: 52910
diff changeset
    33
import static org.graalvm.compiler.serviceprovider.GraalUnsafeAccess.getUnsafe;
37648a9c4a6a 8221341: Update Graal
jwilhelm
parents: 52910
diff changeset
    34
57537
ecc6e394475f 8226771: Update Graal
dlong
parents: 54601
diff changeset
    35
import java.nio.ByteBuffer;
ecc6e394475f 8226771: Update Graal
dlong
parents: 54601
diff changeset
    36
54601
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
    37
import org.graalvm.compiler.core.common.calc.UnsignedMath;
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
    38
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    39
import sun.misc.Unsafe;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    40
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    41
/**
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    42
 * Provides low-level sequential write access to a byte[] array for signed and unsigned values of
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    43
 * size 1, 2, 4, and 8 bytes. To avoid copying an array when the buffer size is no longer
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    44
 * sufficient, the buffer is split into chunks of a fixed size.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    45
 *
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    46
 * The flag {@code supportsUnalignedMemoryAccess} must be set according to the capabilities of the
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    47
 * hardware architecture: the value {@code true} allows more efficient memory access on
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    48
 * architectures that support unaligned memory accesses; the value {@code false} is the safe
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    49
 * fallback that works on every hardware.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    50
 */
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    51
public abstract class UnsafeArrayTypeWriter implements TypeWriter {
54328
37648a9c4a6a 8221341: Update Graal
jwilhelm
parents: 52910
diff changeset
    52
    private static final Unsafe UNSAFE = getUnsafe();
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    53
    private static final int MIN_CHUNK_LENGTH = 200;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    54
    private static final int MAX_CHUNK_LENGTH = 16000;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    55
54601
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
    56
    // Constants for UNSIGNED5 coding of Pack200
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
    57
    public static final long HIGH_WORD_SHIFT = 6;
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
    58
    public static final long NUM_HIGH_CODES = 1 << HIGH_WORD_SHIFT; // number of high codes (64)
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
    59
    public static final long NUM_LOW_CODES = (1 << Byte.SIZE) - NUM_HIGH_CODES;
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
    60
    public static final long MAX_BYTES = 11;
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
    61
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    62
    static class Chunk {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    63
        protected final byte[] data;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    64
        protected int size;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    65
        protected Chunk next;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    66
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    67
        protected Chunk(int arrayLength) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    68
            data = new byte[arrayLength];
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    69
        }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    70
    }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    71
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    72
    protected final Chunk firstChunk;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    73
    protected Chunk writeChunk;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    74
    protected int totalSize;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    75
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    76
    public static UnsafeArrayTypeWriter create(boolean supportsUnalignedMemoryAccess) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    77
        if (supportsUnalignedMemoryAccess) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    78
            return new UnalignedUnsafeArrayTypeWriter();
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    79
        } else {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    80
            return new AlignedUnsafeArrayTypeWriter();
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    81
        }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    82
    }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    83
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    84
    protected UnsafeArrayTypeWriter() {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    85
        firstChunk = new Chunk(MIN_CHUNK_LENGTH);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    86
        writeChunk = firstChunk;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    87
    }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    88
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    89
    @Override
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    90
    public final long getBytesWritten() {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    91
        return totalSize;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    92
    }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    93
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    94
    /**
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    95
     * Copies the buffer into the provided byte[] array of length {@link #getBytesWritten()}.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    96
     */
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    97
    public final byte[] toArray(byte[] result) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    98
        assert result.length == totalSize;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    99
        int resultIdx = 0;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   100
        for (Chunk cur = firstChunk; cur != null; cur = cur.next) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   101
            System.arraycopy(cur.data, 0, result, resultIdx, cur.size);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   102
            resultIdx += cur.size;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   103
        }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   104
        assert resultIdx == totalSize;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   105
        return result;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   106
    }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   107
57537
ecc6e394475f 8226771: Update Graal
dlong
parents: 54601
diff changeset
   108
    /** Copies the buffer into the provided ByteBuffer at its current position. */
ecc6e394475f 8226771: Update Graal
dlong
parents: 54601
diff changeset
   109
    public final ByteBuffer toByteBuffer(ByteBuffer buffer) {
ecc6e394475f 8226771: Update Graal
dlong
parents: 54601
diff changeset
   110
        assert buffer.remaining() <= totalSize;
ecc6e394475f 8226771: Update Graal
dlong
parents: 54601
diff changeset
   111
        int initialPos = buffer.position();
ecc6e394475f 8226771: Update Graal
dlong
parents: 54601
diff changeset
   112
        for (Chunk cur = firstChunk; cur != null; cur = cur.next) {
ecc6e394475f 8226771: Update Graal
dlong
parents: 54601
diff changeset
   113
            buffer.put(cur.data, 0, cur.size);
ecc6e394475f 8226771: Update Graal
dlong
parents: 54601
diff changeset
   114
        }
ecc6e394475f 8226771: Update Graal
dlong
parents: 54601
diff changeset
   115
        assert buffer.position() - initialPos == totalSize;
ecc6e394475f 8226771: Update Graal
dlong
parents: 54601
diff changeset
   116
        return buffer;
ecc6e394475f 8226771: Update Graal
dlong
parents: 54601
diff changeset
   117
    }
ecc6e394475f 8226771: Update Graal
dlong
parents: 54601
diff changeset
   118
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   119
    @Override
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   120
    public final void putS1(long value) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   121
        long offset = writeOffset(Byte.BYTES);
54328
37648a9c4a6a 8221341: Update Graal
jwilhelm
parents: 52910
diff changeset
   122
        UNSAFE.putByte(writeChunk.data, offset, asS1(value));
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   123
    }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   124
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   125
    @Override
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   126
    public final void putU1(long value) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   127
        long offset = writeOffset(Byte.BYTES);
54328
37648a9c4a6a 8221341: Update Graal
jwilhelm
parents: 52910
diff changeset
   128
        UNSAFE.putByte(writeChunk.data, offset, asU1(value));
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   129
    }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   130
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   131
    @Override
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   132
    public final void putU2(long value) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   133
        putS2(asU2(value));
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   134
    }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   135
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   136
    @Override
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   137
    public final void putU4(long value) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   138
        putS4(asU4(value));
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   139
    }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   140
54601
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
   141
    @Override
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
   142
    public void putS2(long value) {
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
   143
        long offset = writeOffset(Short.BYTES);
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
   144
        putS2(value, writeChunk, offset);
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
   145
    }
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
   146
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
   147
    @Override
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
   148
    public void putS4(long value) {
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
   149
        long offset = writeOffset(Integer.BYTES);
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
   150
        putS4(value, writeChunk, offset);
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
   151
    }
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
   152
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
   153
    @Override
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
   154
    public void putS8(long value) {
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
   155
        long offset = writeOffset(Long.BYTES);
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
   156
        putS8(value, writeChunk, offset);
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
   157
    }
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
   158
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
   159
    protected abstract void putS2(long value, Chunk chunk, long offset);
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
   160
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
   161
    protected abstract void putS4(long value, Chunk chunk, long offset);
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
   162
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
   163
    protected abstract void putS8(long value, Chunk chunk, long offset);
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
   164
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   165
    protected long writeOffset(int writeBytes) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   166
        if (writeChunk.size + writeBytes >= writeChunk.data.length) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   167
            Chunk newChunk = new Chunk(Math.min(writeChunk.data.length * 2, MAX_CHUNK_LENGTH));
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   168
            writeChunk.next = newChunk;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   169
            writeChunk = newChunk;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   170
        }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   171
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   172
        assert Unsafe.ARRAY_BYTE_INDEX_SCALE == 1;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   173
        long result = writeChunk.size + Unsafe.ARRAY_BYTE_BASE_OFFSET;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   174
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   175
        totalSize += writeBytes;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   176
        writeChunk.size += writeBytes;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   177
        assert writeChunk.size <= writeChunk.data.length;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   178
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   179
        return result;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   180
    }
54601
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
   181
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
   182
    @Override
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
   183
    public void patchS4(long value, long offset) {
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
   184
        long chunkStartOffset = 0;
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
   185
        Chunk chunk = firstChunk;
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
   186
        while (chunkStartOffset + chunk.size <= offset) {
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
   187
            chunkStartOffset += chunk.size;
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
   188
            chunk = chunk.next;
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
   189
        }
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
   190
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
   191
        long targetOffset = offset - chunkStartOffset;
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
   192
        assert targetOffset + Integer.BYTES <= chunk.size : "out of bounds";
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
   193
        putS4(value, chunk, Unsafe.ARRAY_BYTE_BASE_OFFSET + targetOffset);
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
   194
    }
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
   195
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
   196
    @Override
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
   197
    public void putSV(long value) {
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
   198
        // this is a modified version of the SIGNED5 encoding from Pack200
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
   199
        write(encodeSign(value));
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
   200
    }
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
   201
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
   202
    @Override
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
   203
    public void putUV(long value) {
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
   204
        // this is a modified version of the UNSIGNED5 encoding from Pack200
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
   205
        write(value);
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
   206
    }
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
   207
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
   208
    private static long encodeSign(long value) {
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
   209
        return (value << 1) ^ (value >> 63);
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
   210
    }
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
   211
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
   212
    private void write(long value) {
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
   213
        if (UnsignedMath.belowThan(value, NUM_LOW_CODES)) {
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
   214
            putU1(value);
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
   215
        } else {
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
   216
            writePacked(value);
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
   217
        }
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
   218
    }
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
   219
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
   220
    private void writePacked(long value) {
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
   221
        long sum = value;
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
   222
        for (int i = 1; UnsignedMath.aboveOrEqual(sum, NUM_LOW_CODES) && i < MAX_BYTES; i++) {
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
   223
            sum -= NUM_LOW_CODES;
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
   224
            long u1 = NUM_LOW_CODES + (sum & (NUM_HIGH_CODES - 1)); // this is a "high code"
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
   225
            sum >>>= HIGH_WORD_SHIFT; // extracted 6 bits
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
   226
            putU1(u1);
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
   227
        }
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
   228
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
   229
        // remainder is either a "low code" or the last byte
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
   230
        assert sum == (sum & 0xFF) : "not a byte";
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
   231
        putU1(sum & 0xFF);
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
   232
    }
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   233
}
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   234
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   235
final class UnalignedUnsafeArrayTypeWriter extends UnsafeArrayTypeWriter {
54328
37648a9c4a6a 8221341: Update Graal
jwilhelm
parents: 52910
diff changeset
   236
    private static final Unsafe UNSAFE = getUnsafe();
37648a9c4a6a 8221341: Update Graal
jwilhelm
parents: 52910
diff changeset
   237
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   238
    @Override
54601
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
   239
    protected void putS2(long value, Chunk chunk, long offset) {
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
   240
        UNSAFE.putShort(chunk.data, offset, asS2(value));
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   241
    }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   242
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   243
    @Override
54601
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
   244
    protected void putS4(long value, Chunk chunk, long offset) {
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
   245
        UNSAFE.putInt(chunk.data, offset, asS4(value));
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   246
    }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   247
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   248
    @Override
54601
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
   249
    protected void putS8(long value, Chunk chunk, long offset) {
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
   250
        UNSAFE.putLong(chunk.data, offset, value);
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   251
    }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   252
}
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   253
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   254
final class AlignedUnsafeArrayTypeWriter extends UnsafeArrayTypeWriter {
54328
37648a9c4a6a 8221341: Update Graal
jwilhelm
parents: 52910
diff changeset
   255
    private static final Unsafe UNSAFE = getUnsafe();
37648a9c4a6a 8221341: Update Graal
jwilhelm
parents: 52910
diff changeset
   256
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   257
    @Override
54601
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
   258
    protected void putS2(long value, Chunk chunk, long offset) {
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
   259
        UNSAFE.putByte(chunk.data, offset + 0, (byte) (value >> 0));
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
   260
        UNSAFE.putByte(chunk.data, offset + 1, (byte) (value >> 8));
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   261
    }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   262
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   263
    @Override
54601
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
   264
    protected void putS4(long value, Chunk chunk, long offset) {
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
   265
        UNSAFE.putByte(chunk.data, offset + 0, (byte) (value >> 0));
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
   266
        UNSAFE.putByte(chunk.data, offset + 1, (byte) (value >> 8));
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
   267
        UNSAFE.putByte(chunk.data, offset + 2, (byte) (value >> 16));
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
   268
        UNSAFE.putByte(chunk.data, offset + 3, (byte) (value >> 24));
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   269
    }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   270
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   271
    @Override
54601
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
   272
    protected void putS8(long value, Chunk chunk, long offset) {
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
   273
        UNSAFE.putByte(chunk.data, offset + 0, (byte) (value >> 0));
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
   274
        UNSAFE.putByte(chunk.data, offset + 1, (byte) (value >> 8));
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
   275
        UNSAFE.putByte(chunk.data, offset + 2, (byte) (value >> 16));
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
   276
        UNSAFE.putByte(chunk.data, offset + 3, (byte) (value >> 24));
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
   277
        UNSAFE.putByte(chunk.data, offset + 4, (byte) (value >> 32));
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
   278
        UNSAFE.putByte(chunk.data, offset + 5, (byte) (value >> 40));
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
   279
        UNSAFE.putByte(chunk.data, offset + 6, (byte) (value >> 48));
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
   280
        UNSAFE.putByte(chunk.data, offset + 7, (byte) (value >> 56));
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   281
    }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   282
}