Fix the ARM postdecrement operator.
Add a test for ++ and -- so this bug won't happen again.
This commit is contained in:
parent
c1e49f96f9
commit
89baa2083f
|
@ -1628,7 +1628,7 @@ class Compiler : public ErrorSink {
|
|||
o4((0xE3A00000 + t) | rN); // mov rN, #0
|
||||
} else if (t >= -256 && t < 0) {
|
||||
// mvn means move constant ^ ~0
|
||||
o4((0xE3E00001 - t) | rN); // mvn rN, #0
|
||||
o4((0xE3E00000 - (t+1)) | rN); // mvn rN, #0
|
||||
} else {
|
||||
o4(0xE51F0000 | rN); // ldr rN, .L3
|
||||
o4(0xEA000000); // b .L99
|
||||
|
|
|
@ -0,0 +1,23 @@
|
|||
// Check integer operations
|
||||
|
||||
void loops() {
|
||||
int y;
|
||||
printf("++\n");
|
||||
for(y = 0; y < 10; y++) {
|
||||
printf("%d\n", y);
|
||||
}
|
||||
printf("--\n");
|
||||
for(y = 10; y >= 0; y--) {
|
||||
printf("%d\n", y);
|
||||
}
|
||||
}
|
||||
|
||||
void checkLiterals() {
|
||||
printf("Literals: %d %d\n", 1, -1);
|
||||
}
|
||||
|
||||
int main() {
|
||||
checkLiterals();
|
||||
loops();
|
||||
return 0;
|
||||
}
|
|
@ -128,7 +128,7 @@ class TestACC(unittest.TestCase):
|
|||
b2 = stdErrResult.splitlines()
|
||||
b1 = stdOutResult.splitlines()
|
||||
self.assertEqual(True, compareOuput(a1,a2,b1,b2))
|
||||
|
||||
|
||||
def compileCheck(self, args, stdErrResult, stdOutResult="",
|
||||
targets=['arm', 'x86']):
|
||||
targetSet = sets.ImmutableSet(targets)
|
||||
|
@ -143,26 +143,26 @@ class TestACC(unittest.TestCase):
|
|||
self.assertEqual(compileArm(args), result)
|
||||
|
||||
def testCompileReturnVal(self):
|
||||
self.compileCheck(["data/returnval-ansi.c"], "")
|
||||
self.compileCheck(["data/returnval-ansi.c"], "")
|
||||
|
||||
def testCompileOTCCANSII(self):
|
||||
self.compileCheck(["data/otcc-ansi.c"], "", "", ['x86'])
|
||||
|
||||
def testRunReturnVal(self):
|
||||
self.compileCheck(["-R", "data/returnval-ansi.c"],
|
||||
"Executing compiled code:\nresult: 42\n")
|
||||
"Executing compiled code:\nresult: 42\n")
|
||||
|
||||
def testStringLiteralConcatenation(self):
|
||||
self.compileCheck(["-R", "data/testStringConcat.c"],
|
||||
"Executing compiled code:\nresult: 13\n", "Hello, world\n")
|
||||
"Executing compiled code:\nresult: 13\n", "Hello, world\n")
|
||||
|
||||
def testRunOTCCANSI(self):
|
||||
self.compileCheck(["-R", "data/otcc-ansi.c", "data/returnval.c"],
|
||||
self.compileCheck(["-R", "data/otcc-ansi.c", "data/returnval.c"],
|
||||
"Executing compiled code:\notcc-ansi.c: About to execute compiled code:\natcc-ansi.c: result: 42\nresult: 42\n", "",
|
||||
['x86'])
|
||||
|
||||
def testRunOTCCANSI2(self):
|
||||
self.compileCheck(["-R", "data/otcc-ansi.c", "data/otcc.c", "data/returnval.c"],
|
||||
self.compileCheck(["-R", "data/otcc-ansi.c", "data/otcc.c", "data/returnval.c"],
|
||||
"Executing compiled code:\notcc-ansi.c: About to execute compiled code:\notcc.c: about to execute compiled code.\natcc-ansi.c: result: 42\nresult: 42\n", "",['x86'])
|
||||
|
||||
def testRunConstants(self):
|
||||
|
@ -186,7 +186,7 @@ locals: 1 2 3 4
|
|||
cast rval: 2 4
|
||||
cast lval: 1.1 2 3.3 4
|
||||
""")
|
||||
|
||||
|
||||
def testRunFlops(self):
|
||||
self.compileCheck(["-R", "data/flops.c"],
|
||||
"""Executing compiled code:
|
||||
|
@ -287,6 +287,33 @@ result: 10""", """""")
|
|||
self.compileCheck(["-R", "data/floatdouble.c"], """Executing compiled code:
|
||||
result: 0""", """0.002 0.1 10""")
|
||||
|
||||
def testIops(self):
|
||||
self.compileCheck(["-R", "data/iops.c"], """Executing compiled code:
|
||||
result: 0""", """Literals: 1 -1
|
||||
++
|
||||
0
|
||||
1
|
||||
2
|
||||
3
|
||||
4
|
||||
5
|
||||
6
|
||||
7
|
||||
8
|
||||
9
|
||||
--
|
||||
10
|
||||
9
|
||||
8
|
||||
7
|
||||
6
|
||||
5
|
||||
4
|
||||
3
|
||||
2
|
||||
1
|
||||
0
|
||||
""")
|
||||
|
||||
if __name__ == '__main__':
|
||||
if not outputCanRun():
|
||||
|
|
Loading…
Reference in New Issue