From cc686ded62b4e5b6731d944cda0c0f2974776d5f Mon Sep 17 00:00:00 2001 From: David Given Date: Tue, 15 Nov 2016 20:25:11 +0100 Subject: [PATCH] Get subtractions the right way round. --- mach/powerpc/mcg/table | 2 +- plat/qemuppc/tests/intsub.c | 31 +++++++++++++++++++++++++++++++ 2 files changed, 32 insertions(+), 1 deletion(-) create mode 100644 plat/qemuppc/tests/intsub.c diff --git a/mach/powerpc/mcg/table b/mach/powerpc/mcg/table index a6f416b65..03daee94e 100644 --- a/mach/powerpc/mcg/table +++ b/mach/powerpc/mcg/table @@ -609,7 +609,7 @@ PATTERNS ALUCC(ADD.I, "addi") out:(int)reg = SUB.I(left:(int)reg, right:(int)reg) - emit "subf %out, %left, %right" + emit "subf %out, %right, %left" cost 4; out:(int)reg = SUB.I(left:(int)reg, right:CONST.I) diff --git a/plat/qemuppc/tests/intsub.c b/plat/qemuppc/tests/intsub.c new file mode 100644 index 000000000..72ba0ff08 --- /dev/null +++ b/plat/qemuppc/tests/intsub.c @@ -0,0 +1,31 @@ +#include "test.h" + +/* Constants in globals to defeat constant folding. */ +int two = 2; +int one = 1; +int zero = 0; +int minusone = -1; + +/* Bypasses the CRT, so there's no stdio or BSS initialisation. */ +void _m_a_i_n(void) +{ + ASSERT((two - one) == 1); + ASSERT((one - two) == -1); + + ASSERT((two - 1) == 1); + ASSERT((one - 2) == -1); + + ASSERT((2 - one) == 1); + ASSERT((1 - two) == -1); + + ASSERT(((unsigned int)two - (unsigned int)one) == 1); + ASSERT(((unsigned int)one - (unsigned int)two) == 0xffffffff); + + ASSERT(((unsigned int)two - (unsigned int)1) == 1); + ASSERT(((unsigned int)one - (unsigned int)2) == 0xffffffff); + + ASSERT(((unsigned int)2 - (unsigned int)one) == 1); + ASSERT(((unsigned int)1 - (unsigned int)two) == 0xffffffff); + + finished(); +} \ No newline at end of file -- 2.34.1