changeset 22410:5cef8c333188

[SPARC] SPARCMove remove switching on Kind when generating code; use PlatformKind and byte counts defined by the target instead
author Stefan Anzinger <stefan.anzinger@oracle.com>
date Thu, 06 Aug 2015 11:46:52 +0200
parents 9f4aa375fd5b
children 24843a13b2af
files graal/com.oracle.graal.asm.sparc/src/com/oracle/graal/asm/sparc/SPARCAssembler.java graal/com.oracle.graal.compiler.sparc/src/com/oracle/graal/compiler/sparc/SPARCLIRGenerator.java graal/com.oracle.graal.hotspot.sparc/src/com/oracle/graal/hotspot/sparc/SPARCHotSpotLIRGenerator.java graal/com.oracle.graal.lir.sparc/src/com/oracle/graal/lir/sparc/SPARCLoadConstantTableBaseOp.java graal/com.oracle.graal.lir.sparc/src/com/oracle/graal/lir/sparc/SPARCMove.java
diffstat 5 files changed, 72 insertions(+), 295 deletions(-) [+]
line wrap: on
line diff
--- a/graal/com.oracle.graal.asm.sparc/src/com/oracle/graal/asm/sparc/SPARCAssembler.java	Thu Aug 06 11:43:43 2015 +0200
+++ b/graal/com.oracle.graal.asm.sparc/src/com/oracle/graal/asm/sparc/SPARCAssembler.java	Thu Aug 06 11:46:52 2015 +0200
@@ -2300,9 +2300,26 @@
         ld(Ldsh, src, dst);
     }
 
-    public void ld(SPARCAddress src, Register dst, int bytes, boolean signed) {
+    public void ld(SPARCAddress src, Register dst, int bytes, boolean signExtend) {
         if (SPARC.isCPURegister(dst)) {
-            if (signed) {
+            if (signExtend) {
+                switch (bytes) {
+                    case 1:
+                        ldsb(src, dst);
+                        break;
+                    case 2:
+                        ldsh(src, dst);
+                        break;
+                    case 4:
+                        ldsw(src, dst);
+                        break;
+                    case 8:
+                        ldx(src, dst);
+                        break;
+                    default:
+                        throw new InternalError();
+                }
+            } else {
                 switch (bytes) {
                     case 1:
                         ldub(src, dst);
@@ -2319,30 +2336,15 @@
                     default:
                         throw new InternalError();
                 }
-            } else {
-                switch (bytes) {
-                    case 1:
-                        ldsb(src, dst);
-                        break;
-                    case 2:
-                        ldsh(src, dst);
-                        break;
-                    case 4:
-                        ldsw(src, dst);
-                        break;
-                    case 8:
-                        ldx(src, dst);
-                        break;
-                    default:
-                        throw new InternalError();
-                }
             }
         } else if (SPARC.isDoubleFloatRegister(dst) && bytes == 8) {
+            assert !signExtend;
             lddf(src, dst);
         } else if (SPARC.isSingleFloatRegister(dst) && bytes == 4) {
+            assert !signExtend;
             ldf(src, dst);
         } else {
-            throw new InternalError();
+            throw new InternalError(String.format("src: %s dst: %s bytes: %d signExtend: %b", src, dst, bytes, signExtend));
         }
     }
 
@@ -2369,7 +2371,7 @@
         } else if (SPARC.isSingleFloatRegister(src) && bytes == 4) {
             stf(src, dst);
         } else {
-            throw new InternalError();
+            throw new InternalError(String.format("src: %s dst: %s bytes: %d", src, dst, bytes));
         }
     }
 
--- a/graal/com.oracle.graal.compiler.sparc/src/com/oracle/graal/compiler/sparc/SPARCLIRGenerator.java	Thu Aug 06 11:43:43 2015 +0200
+++ b/graal/com.oracle.graal.compiler.sparc/src/com/oracle/graal/compiler/sparc/SPARCLIRGenerator.java	Thu Aug 06 11:46:52 2015 +0200
@@ -910,7 +910,7 @@
         append(new MoveFpGp(dst, src, tempSlot));
     }
 
-    private StackSlotValue getTempSlot(LIRKind kind) {
+    protected StackSlotValue getTempSlot(LIRKind kind) {
         if (tmpStackSlot == null) {
             tmpStackSlot = getResult().getFrameMapBuilder().allocateSpillSlot(kind);
         }
@@ -1061,7 +1061,7 @@
     public Value emitSignExtendLoad(LIRKind kind, Value address, LIRFrameState state) {
         SPARCAddressValue loadAddress = asAddressValue(address);
         Variable result = newVariable(kind);
-        append(new LoadOp((Kind) kind.getPlatformKind(), result, loadAddress, state, true));
+        append(new LoadOp(kind.getPlatformKind(), result, loadAddress, state, true));
         return result;
     }
 
--- a/graal/com.oracle.graal.hotspot.sparc/src/com/oracle/graal/hotspot/sparc/SPARCHotSpotLIRGenerator.java	Thu Aug 06 11:43:43 2015 +0200
+++ b/graal/com.oracle.graal.hotspot.sparc/src/com/oracle/graal/hotspot/sparc/SPARCHotSpotLIRGenerator.java	Thu Aug 06 11:46:52 2015 +0200
@@ -206,21 +206,10 @@
     public Variable emitLoad(LIRKind kind, Value address, LIRFrameState state) {
         SPARCAddressValue loadAddress = asAddressValue(address);
         Variable result = newVariable(kind);
-        append(new LoadOp((Kind) kind.getPlatformKind(), result, loadAddress, state));
+        append(new LoadOp(kind.getPlatformKind(), result, loadAddress, state));
         return result;
     }
 
-    private static boolean canStoreConstant(JavaConstant c) {
-        // SPARC can only store integer null constants (via g0)
-        switch (c.getKind()) {
-            case Float:
-            case Double:
-                return false;
-            default:
-                return c.isDefaultForKind();
-        }
-    }
-
     @Override
     public boolean canInlineConstant(JavaConstant c) {
         if (HotSpotCompressedNullConstant.COMPRESSED_NULL.equals(c)) {
@@ -237,17 +226,16 @@
         SPARCAddressValue storeAddress = asAddressValue(address);
         if (isConstant(inputVal)) {
             JavaConstant c = asConstant(inputVal);
-            if (canStoreConstant(c)) {
-                append(new StoreConstantOp((Kind) kind.getPlatformKind(), storeAddress, c, state));
+            if (c.isDefaultForKind()) {
+                append(new StoreConstantOp(kind.getPlatformKind(), storeAddress, c, state));
                 return;
             }
         }
         Variable input = load(inputVal);
-        append(new StoreOp((Kind) kind.getPlatformKind(), storeAddress, input, state));
+        append(new StoreOp(kind.getPlatformKind(), storeAddress, input, state));
     }
 
     public Variable emitCompareAndSwap(Value address, Value expectedValue, Value newValue, Value trueValue, Value falseValue) {
-
         LIRKind kind = newValue.getLIRKind();
         assert kind.equals(expectedValue.getLIRKind());
         Kind memKind = (Kind) kind.getPlatformKind();
--- a/graal/com.oracle.graal.lir.sparc/src/com/oracle/graal/lir/sparc/SPARCLoadConstantTableBaseOp.java	Thu Aug 06 11:43:43 2015 +0200
+++ b/graal/com.oracle.graal.lir.sparc/src/com/oracle/graal/lir/sparc/SPARCLoadConstantTableBaseOp.java	Thu Aug 06 11:46:52 2015 +0200
@@ -51,7 +51,7 @@
  * this case absolute addressing (without using the base pointer is used). See also:
  * CodeInstaller::pd_patch_DataSectionReference
  *
- * @see SPARCMove#loadFromConstantTable(CompilationResultBuilder, SPARCMacroAssembler, Kind,
+ * @see SPARCMove#loadFromConstantTable(CompilationResultBuilder, SPARCMacroAssembler, PlatformKind,
  *      Register, Register, SPARCDelayedControlTransfer, Runnable)
  */
 public class SPARCLoadConstantTableBaseOp extends SPARCLIRInstruction {
--- a/graal/com.oracle.graal.lir.sparc/src/com/oracle/graal/lir/sparc/SPARCMove.java	Thu Aug 06 11:43:43 2015 +0200
+++ b/graal/com.oracle.graal.lir.sparc/src/com/oracle/graal/lir/sparc/SPARCMove.java	Thu Aug 06 11:46:52 2015 +0200
@@ -96,24 +96,10 @@
 
         @Override
         public void emitCode(CompilationResultBuilder crb, SPARCMacroAssembler masm) {
-            final Runnable recordReference;
-            final Kind constantKind = constant.getKind().equals(Object) ? Kind.Long : constant.getKind();
-            switch (constantKind) {
-                case Object:
-                case Float:
-                case Double:
-                case Char:
-                case Short:
-                case Int:
-                case Long:
-                    recordReference = () -> crb.recordDataReferenceInCode(constant, constantKind.getByteCount());
-                    break;
-                case Byte:
-                case Boolean: // Byte and Boolean always fits into simm13
-                    throw JVMCIError.shouldNotReachHere("Byte/Boolean must not be loaded via constant table");
-                default:
-                    throw JVMCIError.shouldNotReachHere("Unimplemented constant type: " + constant);
-            }
+            final int byteCount = crb.target.getSizeInBytes(constant.getKind());
+            assert byteCount >= 1 : "Byte values must not be loaded via constant table";
+            final Kind constantKind = constant.getKind();
+            final Runnable recordReference = () -> crb.recordDataReferenceInCode(constant, byteCount);
             Register baseRegister = asRegister(constantTableBase);
             if (isRegister(result)) {
                 Register resultRegister = asRegister(result);
@@ -123,8 +109,7 @@
                     Register scratchRegister = scratch.getRegister();
                     loadFromConstantTable(crb, masm, constantKind, baseRegister, scratchRegister, delayedControlTransfer, recordReference);
                     StackSlot slot = asStackSlot(result);
-                    delayedControlTransfer.emitControlTransfer(crb, masm);
-                    masm.stx(scratchRegister, (SPARCAddress) crb.asAddress(slot));
+                    reg2stack(crb, masm, slot, scratchRegister.asValue(), delayedControlTransfer);
                 }
             }
         }
@@ -146,12 +131,7 @@
 
         @Override
         public void emitCode(CompilationResultBuilder crb, SPARCMacroAssembler masm) {
-            assert !isConstant(input);
-            if (isStackSlot(input) && isStackSlot(result)) {
-                stack2stack(crb, masm, reInterpret(asStackSlot(result)), reInterpret(asStackSlot(input)), delayedControlTransfer);
-            } else {
-                move(crb, masm, getResult(), getInput(), delayedControlTransfer);
-            }
+            move(crb, masm, getResult(), getInput(), delayedControlTransfer);
         }
 
         @Override
@@ -163,25 +143,6 @@
         public AllocatableValue getResult() {
             return result;
         }
-
-        private static StackSlot reInterpret(StackSlot slot) {
-            switch ((Kind) slot.getPlatformKind()) {
-                case Boolean:
-                case Byte:
-                case Short:
-                case Char:
-                case Int:
-                case Long:
-                case Object:
-                    return slot;
-                case Float:
-                    return StackSlot.get(LIRKind.value(Kind.Int), slot.getRawOffset(), slot.getRawAddFrameSize());
-                case Double:
-                    return StackSlot.get(LIRKind.value(Kind.Long), slot.getRawOffset(), slot.getRawAddFrameSize());
-                default:
-                    throw JVMCIError.shouldNotReachHere();
-            }
-        }
     }
 
     /**
@@ -252,66 +213,15 @@
         }
 
         private void moveViaStack(CompilationResultBuilder crb, SPARCMacroAssembler masm, Kind inputKind, Kind resultKind) {
+            int inputKindSize = crb.target.getSizeInBytes(inputKind);
             int resultKindSize = crb.target.getSizeInBytes(resultKind);
+            assert inputKindSize == resultKindSize;
             try (ScratchRegister sc = masm.getScratchRegister()) {
                 Register scratch = sc.getRegister();
                 SPARCAddress tempAddress = generateSimm13OffsetLoad((SPARCAddress) crb.asAddress(temp), masm, scratch);
-                switch (inputKind) {
-                    case Float:
-                        assert resultKindSize == 4;
-                        masm.stf(asFloatReg(input), tempAddress);
-                        break;
-                    case Double:
-                        assert resultKindSize == 8;
-                        masm.stdf(asDoubleReg(input), tempAddress);
-                        break;
-                    case Long:
-                    case Int:
-                    case Short:
-                    case Char:
-                    case Byte:
-                        if (resultKindSize == 8) {
-                            masm.stx(asLongReg(input), tempAddress);
-                        } else if (resultKindSize == 4) {
-                            masm.stw(asIntReg(input), tempAddress);
-                        } else if (resultKindSize == 2) {
-                            masm.sth(asIntReg(input), tempAddress);
-                        } else if (resultKindSize == 1) {
-                            masm.stb(asIntReg(input), tempAddress);
-                        } else {
-                            throw JVMCIError.shouldNotReachHere();
-                        }
-                        break;
-                    default:
-                        JVMCIError.shouldNotReachHere();
-                }
+                masm.st(asRegister(input), tempAddress, resultKindSize);
                 delayedControlTransfer.emitControlTransfer(crb, masm);
-                switch (resultKind) {
-                    case Long:
-                        masm.ldx(tempAddress, asLongReg(result));
-                        break;
-                    case Int:
-                        masm.ldsw(tempAddress, asIntReg(result));
-                        break;
-                    case Short:
-                        masm.ldsh(tempAddress, asIntReg(input));
-                        break;
-                    case Char:
-                        masm.lduh(tempAddress, asIntReg(input));
-                        break;
-                    case Byte:
-                        masm.ldsb(tempAddress, asIntReg(input));
-                        break;
-                    case Float:
-                        masm.ldf(tempAddress, asFloatReg(result));
-                        break;
-                    case Double:
-                        masm.lddf(tempAddress, asDoubleReg(result));
-                        break;
-                    default:
-                        JVMCIError.shouldNotReachHere();
-                        break;
-                }
+                masm.ld(tempAddress, asRegister(result), resultKindSize, false);
             }
         }
     }
@@ -353,11 +263,11 @@
         @Def({REG}) protected AllocatableValue result;
         protected boolean signExtend;
 
-        public LoadOp(Kind kind, AllocatableValue result, SPARCAddressValue address, LIRFrameState state) {
+        public LoadOp(PlatformKind kind, AllocatableValue result, SPARCAddressValue address, LIRFrameState state) {
             this(kind, result, address, state, false);
         }
 
-        public LoadOp(Kind kind, AllocatableValue result, SPARCAddressValue address, LIRFrameState state, boolean signExtend) {
+        public LoadOp(PlatformKind kind, AllocatableValue result, SPARCAddressValue address, LIRFrameState state, boolean signExtend) {
             super(TYPE, SIZE, kind, address, state);
             this.result = result;
             this.signExtend = signExtend;
@@ -535,7 +445,7 @@
 
         @Use({REG}) protected AllocatableValue input;
 
-        public StoreOp(Kind kind, SPARCAddressValue address, AllocatableValue input, LIRFrameState state) {
+        public StoreOp(PlatformKind kind, SPARCAddressValue address, AllocatableValue input, LIRFrameState state) {
             super(TYPE, SIZE, kind, address, state);
             this.input = input;
         }
@@ -552,7 +462,7 @@
 
         protected final JavaConstant input;
 
-        public StoreConstantOp(Kind kind, SPARCAddressValue address, JavaConstant input, LIRFrameState state) {
+        public StoreConstantOp(PlatformKind kind, SPARCAddressValue address, JavaConstant input, LIRFrameState state) {
             super(TYPE, SIZE, kind, address, state);
             this.input = input;
             if (!input.isDefaultForKind()) {
@@ -569,28 +479,8 @@
                 if (state != null) {
                     crb.recordImplicitException(masm.position(), state);
                 }
-                switch ((Kind) kind) {
-                    case Boolean:
-                    case Byte:
-                        masm.stb(g0, addr);
-                        break;
-                    case Short:
-                    case Char:
-                        masm.sth(g0, addr);
-                        break;
-                    case Int:
-                        masm.stw(g0, addr);
-                        break;
-                    case Long:
-                    case Object:
-                        masm.stx(g0, addr);
-                        break;
-                    case Float:
-                    case Double:
-                        throw JVMCIError.shouldNotReachHere("Cannot store float constants to memory");
-                    default:
-                        throw JVMCIError.shouldNotReachHere();
-                }
+                int byteCount = crb.target.getSizeInBytes(kind);
+                masm.st(g0, addr, byteCount);
             }
         }
     }
@@ -646,16 +536,21 @@
         }
     }
 
-    public static void stack2stack(CompilationResultBuilder crb, SPARCMacroAssembler masm, Value result, Value input, SPARCDelayedControlTransfer delaySlotLir) {
+    public static void stack2stack(CompilationResultBuilder crb, SPARCMacroAssembler masm, PlatformKind resultKind, PlatformKind inputKind, Value result, Value input,
+                    SPARCDelayedControlTransfer delaySlotLir) {
         try (ScratchRegister sc = masm.getScratchRegister()) {
             SPARCAddress inputAddress = (SPARCAddress) crb.asAddress(input);
             Value scratchRegisterValue = sc.getRegister().asValue(LIRKind.combine(input));
-            emitLoad(crb, masm, inputAddress, scratchRegisterValue, false, input.getPlatformKind(), SPARCDelayedControlTransfer.DUMMY, null);
+            emitLoad(crb, masm, inputAddress, scratchRegisterValue, false, inputKind, SPARCDelayedControlTransfer.DUMMY, null);
             SPARCAddress resultAddress = (SPARCAddress) crb.asAddress(result);
-            emitStore(scratchRegisterValue, resultAddress, result.getPlatformKind(), delaySlotLir, null, crb, masm);
+            emitStore(scratchRegisterValue, resultAddress, resultKind, delaySlotLir, null, crb, masm);
         }
     }
 
+    public static void stack2stack(CompilationResultBuilder crb, SPARCMacroAssembler masm, Value result, Value input, SPARCDelayedControlTransfer delaySlotLir) {
+        stack2stack(crb, masm, result.getPlatformKind(), input.getPlatformKind(), result, input, delaySlotLir);
+    }
+
     public static void reg2stack(CompilationResultBuilder crb, SPARCMacroAssembler masm, Value result, Value input, SPARCDelayedControlTransfer delaySlotLir) {
         SPARCAddress resultAddress = (SPARCAddress) crb.asAddress(result);
         emitStore(input, resultAddress, result.getPlatformKind(), delaySlotLir, null, crb, masm);
@@ -667,33 +562,15 @@
         if (src.equals(dst)) {
             return;
         }
-        switch (input.getKind()) {
-            case Boolean:
-            case Byte:
-            case Short:
-            case Char:
-            case Int:
-            case Long:
-            case Object:
-                delaySlotLir.emitControlTransfer(crb, masm);
-                masm.mov(src, dst);
-                break;
-            case Float:
-                if (result.getPlatformKind() == Kind.Float) {
-                    masm.fsrc2s(src, dst);
-                } else {
-                    throw JVMCIError.shouldNotReachHere();
-                }
-                break;
-            case Double:
-                if (result.getPlatformKind() == Kind.Double) {
-                    masm.fsrc2d(src, dst);
-                } else {
-                    throw JVMCIError.shouldNotReachHere();
-                }
-                break;
-            default:
-                throw JVMCIError.shouldNotReachHere("Input is a: " + input.getKind());
+        delaySlotLir.emitControlTransfer(crb, masm);
+        if (SPARC.isCPURegister(src) && SPARC.isCPURegister(dst)) {
+            masm.mov(src, dst);
+        } else if (SPARC.isSingleFloatRegister(src) && SPARC.isSingleFloatRegister(dst)) {
+            masm.fsrc2s(src, dst);
+        } else if (SPARC.isDoubleFloatRegister(src) && SPARC.isDoubleFloatRegister(dst)) {
+            masm.fsrc2d(src, dst);
+        } else {
+            throw JVMCIError.shouldNotReachHere(String.format("Trying to move between register domains src: %s dst: %s", src, dst));
         }
     }
 
@@ -737,7 +614,7 @@
                             throw JVMCIError.shouldNotReachHere();
                         } else {
                             Runnable recordReference = () -> crb.recordDataReferenceInCode(input, input.getKind().getByteCount());
-                            loadFromConstantTable(crb, masm, input.getKind(), constantTableBase, resultRegister, delaySlotLir, recordReference);
+                            loadFromConstantTable(crb, masm, Int, constantTableBase, resultRegister, delaySlotLir, recordReference);
                         }
                     }
                     break;
@@ -821,7 +698,7 @@
         }
     }
 
-    private static void emitLoad(CompilationResultBuilder crb, SPARCMacroAssembler masm, SPARCAddress address, Value result, boolean signExtend, PlatformKind kind,
+    public static void emitLoad(CompilationResultBuilder crb, SPARCMacroAssembler masm, SPARCAddress address, Value result, boolean signExtend, PlatformKind kind,
                     SPARCDelayedControlTransfer delayedControlTransfer, LIRFrameState state) {
         try (ScratchRegister sc = masm.getScratchRegister()) {
             Register scratch = sc.getRegister();
@@ -831,51 +708,8 @@
             if (state != null) {
                 crb.recordImplicitException(masm.position(), state);
             }
-            switch ((Kind) kind) {
-                case Boolean:
-                case Byte:
-                    if (signExtend) {
-                        masm.ldsb(addr, dst);
-                    } else {
-                        masm.ldub(addr, dst);
-                    }
-                    break;
-                case Short:
-                    if (signExtend) {
-                        masm.ldsh(addr, dst);
-                    } else {
-                        masm.lduh(addr, dst);
-                    }
-                    break;
-                case Char:
-                    if (signExtend) {
-                        masm.ldsh(addr, dst);
-                    } else {
-                        masm.lduh(addr, dst);
-                    }
-                    break;
-                case Int:
-                    if (signExtend) {
-                        masm.ldsw(addr, dst);
-                    } else {
-                        masm.lduw(addr, dst);
-                    }
-                    break;
-                case Long:
-                    masm.ldx(addr, dst);
-                    break;
-                case Float:
-                    masm.ldf(addr, dst);
-                    break;
-                case Double:
-                    masm.lddf(addr, dst);
-                    break;
-                case Object:
-                    masm.ldx(addr, dst);
-                    break;
-                default:
-                    throw JVMCIError.shouldNotReachHere();
-            }
+            int byteCount = crb.target.getSizeInBytes(kind);
+            masm.ld(addr, dst, byteCount, signExtend);
         }
     }
 
@@ -888,33 +722,8 @@
             if (state != null) {
                 crb.recordImplicitException(masm.position(), state);
             }
-            switch ((Kind) kind) {
-                case Boolean:
-                case Byte:
-                    masm.stb(asRegister(input), addr);
-                    break;
-                case Short:
-                case Char:
-                    masm.sth(asRegister(input), addr);
-                    break;
-                case Int:
-                    masm.stw(asRegister(input), addr);
-                    break;
-                case Long:
-                    masm.stx(asRegister(input), addr);
-                    break;
-                case Object:
-                    masm.stx(asRegister(input), addr);
-                    break;
-                case Float:
-                    masm.stf(asRegister(input), addr);
-                    break;
-                case Double:
-                    masm.stdf(asRegister(input), addr);
-                    break;
-                default:
-                    throw JVMCIError.shouldNotReachHere("missing: " + kind);
-            }
+            int byteCount = crb.target.getSizeInBytes(kind);
+            masm.st(asRegister(input), addr, byteCount);
         }
     }
 
@@ -924,7 +733,7 @@
      * generated patterns by this method must be understood by
      * CodeInstaller::pd_patch_DataSectionReference (jvmciCodeInstaller_sparc.cpp).
      */
-    public static void loadFromConstantTable(CompilationResultBuilder crb, SPARCMacroAssembler masm, Kind kind, Register constantTableBase, Register dest,
+    public static void loadFromConstantTable(CompilationResultBuilder crb, SPARCMacroAssembler masm, PlatformKind kind, Register constantTableBase, Register dest,
                     SPARCDelayedControlTransfer delaySlotInstruction, Runnable recordReference) {
         SPARCAddress address;
         ScratchRegister scratch = null;
@@ -941,30 +750,8 @@
                 new Sethix(0, sr, true).emit(masm);
                 address = new SPARCAddress(sr, 0);
             }
-            switch (kind) {
-                case Boolean:
-                case Byte:
-                    masm.ldub(address, dest);
-                    break;
-                case Short:
-                case Char:
-                    masm.lduh(address, dest);
-                    break;
-                case Int:
-                    masm.lduw(address, dest);
-                    break;
-                case Long:
-                    masm.ldx(address, dest);
-                    break;
-                case Float:
-                    masm.ldf(address, dest);
-                    break;
-                case Double:
-                    masm.lddf(address, dest);
-                    break;
-                default:
-                    throw new InternalError("Unknown constant load kind: " + kind);
-            }
+            int byteCount = crb.target.getSizeInBytes(kind);
+            masm.ld(address, dest, byteCount, false);
         } finally {
             if (scratch != null) {
                 scratch.close();