Fix return sequence on armv4 thumb
authorJonathan Roelofs <jonathan@codesourcery.com>
Tue, 5 Aug 2014 17:13:17 +0000 (17:13 +0000)
committerJonathan Roelofs <jonathan@codesourcery.com>
Tue, 5 Aug 2014 17:13:17 +0000 (17:13 +0000)
commit77327b8520d8d0b69f45a812c7d354bbead6c1c1
tree50350d52bbe9e5749717e6c28b7ea8cb6f157cc0
parent1d15bbc006a95a7ded021fc2aaba197184d22d83
Fix return sequence on armv4 thumb

POP on armv4t cannot be used to change thumb state (unilke later non-m-class
architectures), therefore we need a different return sequence that uses 'bx'
instead:

  POP {r3}
  ADD sp, #offset
  BX r3

This patch also fixes an issue where the return value in r3 would get clobbered
for functions that return 128 bits of data. In that case, we generate this
sequence instead:

  MOV ip, r3
  POP {r3}
  ADD sp, #offset
  MOV lr, r3
  MOV r3, ip
  BX lr

http://reviews.llvm.org/D4748

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@214881 91177308-0d34-0410-b5e6-96231b3b80d8
lib/Target/ARM/ARMISelLowering.cpp
lib/Target/ARM/ARMMachineFunctionInfo.h
lib/Target/ARM/Thumb1FrameLowering.cpp
test/CodeGen/ARM/thumb1_return_sequence.ll [new file with mode: 0644]