summaryrefslogtreecommitdiff
path: root/bfd/elf32-spu.c
diff options
context:
space:
mode:
authorUlrich Weigand <uweigand@de.ibm.com>2009-03-11 00:18:02 +0000
committerUlrich Weigand <uweigand@de.ibm.com>2009-03-11 00:18:02 +0000
commitf38343aafac3f93dd2109f0a8a25b6f4f14763ef (patch)
tree64504445c7ddde9e012b6aa4a50a4bb85af5e846 /bfd/elf32-spu.c
parentec474b350e42761476c4a369dc2475e5cd9eb726 (diff)
downloadbinutils-redhat-f38343aafac3f93dd2109f0a8a25b6f4f14763ef.tar.gz
* elf32-spu.c (find_function_stack_adjust): Handle sf instruction
used to update stack pointer.
Diffstat (limited to 'bfd/elf32-spu.c')
-rw-r--r--bfd/elf32-spu.c13
1 files changed, 13 insertions, 0 deletions
diff --git a/bfd/elf32-spu.c b/bfd/elf32-spu.c
index 3015cd65be..115fa49c57 100644
--- a/bfd/elf32-spu.c
+++ b/bfd/elf32-spu.c
@@ -2133,6 +2133,19 @@ find_function_stack_adjust (asection *sec,
return reg[rt];
}
}
+ else if (buf[0] == 0x08 && (buf[1] & 0xe0) == 0 /* sf */)
+ {
+ int rb = ((buf[1] & 0x1f) << 2) | ((buf[2] & 0xc0) >> 6);
+
+ reg[rt] = reg[rb] - reg[ra];
+ if (rt == 1)
+ {
+ if (reg[rt] > 0)
+ break;
+ *sp_adjust = offset;
+ return reg[rt];
+ }
+ }
else if ((buf[0] & 0xfc) == 0x40 /* il, ilh, ilhu, ila */)
{
if (buf[0] >= 0x42 /* ila */)