Skip to content

Commit 13ebdec

Browse files
committed
Correct offset error for load /store with offset larger than 255
1 parent ab39734 commit 13ebdec

File tree

4 files changed

+41
-8
lines changed

4 files changed

+41
-8
lines changed

microzedjunitTarget.deep

+3-2
Original file line numberDiff line numberDiff line change
@@ -39,11 +39,12 @@ project junitTargetTestProject {
3939
# rootclasses = "org.deepjava.comp.targettest.casts.ByteCastTest","org.deepjava.comp.targettest.casts.ShortCastTest","org.deepjava.comp.targettest.casts.CharCastTest","org.deepjava.comp.targettest.casts.IntCastTest","org.deepjava.comp.targettest.casts.LongCastTest","org.deepjava.comp.targettest.casts.FloatCastTest","org.deepjava.comp.targettest.casts.DoubleCastTest";
4040

4141
# Tests for all objects
42-
# rootclasses = "org.deepjava.comp.targettest.objects.InstanceTest","org.deepjava.comp.targettest.objects.InheritanceTest","org.deepjava.comp.targettest.objects.InterfaceTest","org.deepjava.comp.targettest.objects.EnumTest";
42+
# rootclasses = "org.deepjava.comp.targettest.objects.InstanceTest","org.deepjava.comp.targettest.objects.InheritanceTest","org.deepjava.comp.targettest.objects.InterfaceTest","org.deepjava.comp.targettest.objects.EnumTest","org.deepjava.comp.targettest.objects.FieldTest";
4343
# rootclasses = "org.deepjava.comp.targettest.objects.InstanceTest","org.deepjava.comp.targettest.objects.InterfaceTest";
4444
# rootclasses = "org.deepjava.comp.targettest.objects.InheritanceTest","org.deepjava.comp.targettest.objects.InterfaceTest";
4545
# rootclasses = "org.deepjava.comp.targettest.objects.InterfaceTest";
4646
# rootclasses = "org.deepjava.comp.targettest.objects.EnumTest";
47+
# rootclasses = "org.deepjava.comp.targettest.objects.FieldTest";
4748

4849
# Tests for all various
4950
# rootclasses = "org.deepjava.comp.targettest.various.StackFrame","org.deepjava.comp.targettest.various.ParameterPassing","org.deepjava.comp.targettest.various.RegisterAllocation";
@@ -58,7 +59,7 @@ project junitTargetTestProject {
5859
"org.deepjava.comp.targettest.arrays.ArrayTest","org.deepjava.comp.targettest.arrays.ArrayTwoDimTest","org.deepjava.comp.targettest.arrays.ArrayThreeDimTest","org.deepjava.comp.targettest.arrays.ArrayInstanceTest","org.deepjava.comp.targettest.arrays.StringTest",
5960
"org.deepjava.comp.targettest.unsafe.UnsafeTestARM","org.deepjava.comp.targettest.unsafe.LowLevelTest",
6061
"org.deepjava.comp.targettest.casts.ByteCastTest","org.deepjava.comp.targettest.casts.ShortCastTest","org.deepjava.comp.targettest.casts.CharCastTest","org.deepjava.comp.targettest.casts.IntCastTest","org.deepjava.comp.targettest.casts.LongCastTest","org.deepjava.comp.targettest.casts.FloatCastTest","org.deepjava.comp.targettest.casts.DoubleCastTest",
61-
"org.deepjava.comp.targettest.objects.InstanceTest","org.deepjava.comp.targettest.objects.InheritanceTest","org.deepjava.comp.targettest.objects.InterfaceTest","org.deepjava.comp.targettest.objects.EnumTest",
62+
"org.deepjava.comp.targettest.objects.InstanceTest","org.deepjava.comp.targettest.objects.InheritanceTest","org.deepjava.comp.targettest.objects.InterfaceTest","org.deepjava.comp.targettest.objects.EnumTest","org.deepjava.comp.targettest.objects.FieldTest",
6263
"org.deepjava.comp.targettest.various.StackFrame","org.deepjava.comp.targettest.various.ParameterPassing","org.deepjava.comp.targettest.various.RegisterAllocation",
6364
"org.deepjava.comp.targettest.exceptions.UncheckedExceptionTest","org.deepjava.comp.targettest.exceptions.CheckedExceptionTest","org.deepjava.comp.targettest.exceptions.FinallyExceptionTest";
6465

rsc/ErrorMsg.txt

+1
Original file line numberDiff line numberDiff line change
@@ -85,6 +85,7 @@ ErrorNr;Description;Solution
8585
640;SSA has exit set with more entries than maximum number of join values;
8686
650;branch offset out of range;
8787
651;immediate out of range;
88+
652;opCode not implemented;
8889

8990
701;class not loaded;
9091
702;class not found;

src/org/deepjava/cg/arm/CodeGenARM.java

+27-6
Original file line numberDiff line numberDiff line change
@@ -2600,12 +2600,14 @@ else if (bci == bCifle)
26002600
}
26012601
}
26022602

2603+
// checks if a value can be packed into ARM's 12 bit packed format
26032604
private boolean isPackable(int val) {
26042605
int lead = Integer.numberOfLeadingZeros(val);
26052606
lead -= lead % 2; // make even, immediate operands can be shifted by an even number only
26062607
return lead + Integer.numberOfTrailingZeros(val) >= 24;
26072608
}
26082609

2610+
// packs a value into ARM's 12 bit packed format
26092611
private int packImmediate(int immVal) {
26102612
int val = Integer.numberOfLeadingZeros(immVal);
26112613
val -= val % 2; // make even
@@ -3202,12 +3204,30 @@ private void createBranchReg(Code32 code, int op, int cond, int Rm) {
32023204

32033205
// load/store word and unsigned byte (immediate) (LDR, LDRB, STR, STRB, LDRH, LDRSH, LDRSB, STRH)
32043206
// P = 1 -> preindexed, U = 1 -> add offset, W = 1 -> write back
3205-
private void createLSWordImm(Code32 code, int opCode, int cond, int Rt, int Rn, int imm12, int P, int U, int W) {
3206-
if (opCode == armLdr || opCode == armLdrb || opCode == armStr || opCode == armStrb)
3207-
code.instructions[code.iCount] = (cond << 28) | opCode | (Rt << 12) | (Rn << 16) | (imm12 << 0) | (P << 24) | (U << 23) | (W << 21);
3208-
else // extra load / store
3209-
code.instructions[code.iCount] = (cond << 28) | opCode | (Rt << 12) | (Rn << 16) | ((imm12 & 0xf0) << 4) | (imm12 & 0xf) | (P << 24) | (U << 23) | (W << 21) | (1 << 22);
3210-
code.incInstructionNum();
3207+
private void createLSWordImm(Code32 code, int opCode, int cond, int Rt, int Rn, int imm, int P, int U, int W) {
3208+
switch (opCode) {
3209+
case armLdr: case armLdrb: case armStr: case armStrb:
3210+
if (imm > 0xfff) ErrorReporter.reporter.error(651);
3211+
code.instructions[code.iCount] = (cond << 28) | opCode | (Rt << 12) | (Rn << 16) | (imm << 0) | (P << 24) | (U << 23) | (W << 21);
3212+
code.incInstructionNum();
3213+
break;
3214+
case armLdrsb: case armLdrsh: case armLdrh: case armStrh: // extra load / store
3215+
if (imm > 0xff) {
3216+
if (imm > 0xfff) ErrorReporter.reporter.error(651);
3217+
int baseOffset = imm / 256;
3218+
int off = imm % 256;
3219+
createDataProcImm(code, armAdd, cond, Rn, Rn, packImmediate(baseOffset * 256));
3220+
code.instructions[code.iCount] = (cond << 28) | opCode | (Rt << 12) | (Rn << 16) | ((off & 0xf0) << 4) | (off & 0xf) | (P << 24) | (U << 23) | (W << 21) | (1 << 22);
3221+
code.incInstructionNum();
3222+
createDataProcImm(code, armSub, cond, Rn, Rn, packImmediate(baseOffset * 256));
3223+
} else {
3224+
code.instructions[code.iCount] = (cond << 28) | opCode | (Rt << 12) | (Rn << 16) | ((imm & 0xf0) << 4) | (imm & 0xf) | (P << 24) | (U << 23) | (W << 21) | (1 << 22);
3225+
code.incInstructionNum();
3226+
}
3227+
break;
3228+
default:
3229+
ErrorReporter.reporter.error(652);
3230+
}
32113231
}
32123232

32133233
// ...(LDR, LDRB : (literal))
@@ -3333,6 +3353,7 @@ private void createFPdataProcImm(Code32 code, int opCode, int cond, int Vd, int
33333353
code.incInstructionNum();
33343354
}
33353355

3356+
// creates a pattern within the instruction stream, used for exception epilogue
33363357
private void createIpat(Code32 code, int pat) {
33373358
code.instructions[code.iCount] = pat;
33383359
code.incInstructionNum();

src/org/deepjava/launcher/Launcher.java

+10
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@
3939
import org.deepjava.classItems.Array;
4040
import org.deepjava.classItems.CFR;
4141
import org.deepjava.classItems.Class;
42+
import org.deepjava.classItems.Item;
4243
import org.deepjava.classItems.ICclassFileConsts;
4344
import org.deepjava.classItems.Method;
4445
import org.deepjava.config.Arch;
@@ -206,6 +207,15 @@ public static int buildAll(String deepProjectFileName, String targetConfiguratio
206207
if (dbg) vrb.println(" is synthetic, omit");
207208
} else {
208209

210+
if (dbg) {
211+
vrb.println("\t\t\tclass fields");
212+
Item it = clazz.instFields;
213+
while (it != null && it != clazz.classFields) {
214+
vrb.println("\t\t\t\t" + it.name + " " + it.offset);
215+
it = it.next;
216+
}
217+
}
218+
209219
// Create constant block
210220
if (reporter.nofErrors <= 0) {
211221
if(dbg) vrb.println("[LAUNCHER] creating constant block for " + clazz.name);

0 commit comments

Comments
 (0)