This patch handles unaligned loads and stores in Mips JIT. Mips backend

implements unaligned loads and stores with assembler macro-instructions
ulw, usw, ulh, ulhu, ush, and this patch emits corresponding instructions
instead of these macros. Since each unaligned load/store is expanded
into two corresponding loads/stores where offset for second load/store is
modified by +3 (for words) or +1 (for halfwords).

Patch by Petar Jovanovic and Sasa Stankovic.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@144081 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Bruno Cardoso Lopes
2011-11-08 12:47:11 +00:00
parent d63e7bf556
commit ad6eef4a65
2 changed files with 148 additions and 6 deletions

View File

@ -218,10 +218,16 @@ void MipsJITInfo::relocate(void *Function, MachineRelocation *MR,
*((unsigned*) RelocPos) |= (unsigned) ResultPtr;
break;
case Mips::reloc_mips_lo:
ResultPtr = ResultPtr & 0xffff;
case Mips::reloc_mips_lo: {
// Addend is needed for unaligned load/store instructions, where offset
// for the second load/store in the expanded instruction sequence must
// be modified by +1 or +3. Otherwise, Addend is 0.
int Addend = *((unsigned*) RelocPos) & 0xffff;
ResultPtr = (ResultPtr + Addend) & 0xffff;
*((unsigned*) RelocPos) &= 0xffff0000;
*((unsigned*) RelocPos) |= (unsigned) ResultPtr;
break;
}
default:
llvm_unreachable("ERROR: Unknown Mips relocation.");