From 34064ff3cd2e23a935087584e5877ec4f1498e85 Mon Sep 17 00:00:00 2001 From: DJ Delorie Date: Tue, 11 Jun 2013 19:16:07 +0000 Subject: [PATCH] * elf32-rl78.c (rl78_elf_relocate_section): Fix OPsub math. --- bfd/ChangeLog | 4 ++++ bfd/elf32-rl78.c | 11 +++++++---- 2 files changed, 11 insertions(+), 4 deletions(-) diff --git a/bfd/ChangeLog b/bfd/ChangeLog index 192c3ee6d09..01f050d5675 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -1,3 +1,7 @@ +2013-06-11 DJ Delorie + + * elf32-rl78.c (rl78_elf_relocate_section): Fix OPsub math. + 2013-06-11 Will Newton * elf64-aarch64.c (elf_aarch64_get_local_sym_hash): Use diff --git a/bfd/elf32-rl78.c b/bfd/elf32-rl78.c index fb31176da04..651a8bdce69 100644 --- a/bfd/elf32-rl78.c +++ b/bfd/elf32-rl78.c @@ -810,10 +810,13 @@ rl78_elf_relocate_section { int32_t tmp1, tmp2; - RL78_STACK_POP (tmp2); - RL78_STACK_POP (tmp1); - tmp2 -= tmp1; - RL78_STACK_PUSH (tmp2); + /* For the expression "A - B", the assembler pushes A, + then B, then OPSUB. So the first op we pop is B, not + A. */ + RL78_STACK_POP (tmp2); /* B */ + RL78_STACK_POP (tmp1); /* A */ + tmp1 -= tmp2; /* A - B */ + RL78_STACK_PUSH (tmp1); } break; -- 2.30.2