//===-- PPCJITInfo.cpp - Implement the JIT interfaces for the PowerPC -----===//
//
//                     The LLVM Compiler Infrastructure
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
//
// This file implements the JIT interfaces for the 32-bit PowerPC target.
//
//===----------------------------------------------------------------------===//

#define DEBUG_TYPE "jit"
#include "PPCJITInfo.h"
#include "PPCRelocations.h"
#include "PPCTargetMachine.h"
#include "llvm/Function.h"
#include "llvm/Support/Memory.h"
#include "llvm/Support/Debug.h"
#include "llvm/Support/ErrorHandling.h"
#include "llvm/Support/raw_ostream.h"
using namespace llvm;

static TargetJITInfo::JITCompilerFn JITCompilerFunction;

#define BUILD_ADDIS(RD,RS,IMM16) \
  ((15 << 26) | ((RD) << 21) | ((RS) << 16) | ((IMM16) & 65535))
#define BUILD_ORI(RD,RS,UIMM16) \
  ((24 << 26) | ((RS) << 21) | ((RD) << 16) | ((UIMM16) & 65535))
#define BUILD_ORIS(RD,RS,UIMM16) \
  ((25 << 26) | ((RS) << 21) | ((RD) << 16) | ((UIMM16) & 65535))
#define BUILD_RLDICR(RD,RS,SH,ME) \
  ((30 << 26) | ((RS) << 21) | ((RD) << 16) | (((SH) & 31) << 11) | \
   (((ME) & 63) << 6) | (1 << 2) | ((((SH) >> 5) & 1) << 1))
#define BUILD_MTSPR(RS,SPR)      \
  ((31 << 26) | ((RS) << 21) | ((SPR) << 16) | (467 << 1))
#define BUILD_BCCTRx(BO,BI,LINK) \
  ((19 << 26) | ((BO) << 21) | ((BI) << 16) | (528 << 1) | ((LINK) & 1))
#define BUILD_B(TARGET, LINK) \
  ((18 << 26) | (((TARGET) & 0x00FFFFFF) << 2) | ((LINK) & 1))

// Pseudo-ops
#define BUILD_LIS(RD,IMM16)    BUILD_ADDIS(RD,0,IMM16)
#define BUILD_SLDI(RD,RS,IMM6) BUILD_RLDICR(RD,RS,IMM6,63-IMM6)
#define BUILD_MTCTR(RS)        BUILD_MTSPR(RS,9)
#define BUILD_BCTR(LINK)       BUILD_BCCTRx(20,0,LINK)

static void EmitBranchToAt(uint64_t At, uint64_t To, bool isCall, bool is64Bit){
  intptr_t Offset = ((intptr_t)To - (intptr_t)At) >> 2;
  unsigned *AtI = (unsigned*)(intptr_t)At;

  if (Offset >= -(1 << 23) && Offset < (1 << 23)) {   // In range?
    AtI[0] = BUILD_B(Offset, isCall);     // b/bl target
  } else if (!is64Bit) {
    AtI[0] = BUILD_LIS(12, To >> 16);     // lis r12, hi16(address)
    AtI[1] = BUILD_ORI(12, 12, To);       // ori r12, r12, lo16(address)
    AtI[2] = BUILD_MTCTR(12);             // mtctr r12
    AtI[3] = BUILD_BCTR(isCall);          // bctr/bctrl
  } else {
    AtI[0] = BUILD_LIS(12, To >> 48);      // lis r12, hi16(address)
    AtI[1] = BUILD_ORI(12, 12, To >> 32);  // ori r12, r12, lo16(address)
    AtI[2] = BUILD_SLDI(12, 12, 32);       // sldi r12, r12, 32
    AtI[3] = BUILD_ORIS(12, 12, To >> 16); // oris r12, r12, hi16(address)
    AtI[4] = BUILD_ORI(12, 12, To);        // ori r12, r12, lo16(address)
    AtI[5] = BUILD_MTCTR(12);              // mtctr r12
    AtI[6] = BUILD_BCTR(isCall);           // bctr/bctrl
  }
}

extern "C" void PPC32CompilationCallback();
extern "C" void PPC64CompilationCallback();

#if (defined(__POWERPC__) || defined (__ppc__) || defined(_POWER)) && \
    !(defined(__ppc64__) || defined(__FreeBSD__))
// CompilationCallback stub - We can't use a C function with inline assembly in
// it, because we the prolog/epilog inserted by GCC won't work for us.  Instead,
// write our own wrapper, which does things our way, so we have complete control
// over register saving and restoring.
asm(
    ".text\n"
    ".align 2\n"
    ".globl _PPC32CompilationCallback\n"
"_PPC32CompilationCallback:\n"
    // Make space for 8 ints r[3-10] and 13 doubles f[1-13] and the 
    // FIXME: need to save v[0-19] for altivec?
    // FIXME: could shrink frame
    // Set up a proper stack frame
    // FIXME Layout
    //   PowerPC32 ABI linkage    -  24 bytes
    //                 parameters -  32 bytes
    //   13 double registers      - 104 bytes
    //   8 int registers          -  32 bytes
    "mflr r0\n"
    "stw r0,  8(r1)\n"
    "stwu r1, -208(r1)\n"
    // Save all int arg registers
    "stw r10, 204(r1)\n"    "stw r9,  200(r1)\n"
    "stw r8,  196(r1)\n"    "stw r7,  192(r1)\n"
    "stw r6,  188(r1)\n"    "stw r5,  184(r1)\n"
    "stw r4,  180(r1)\n"    "stw r3,  176(r1)\n"
    // Save all call-clobbered FP regs.
    "stfd f13, 168(r1)\n"   "stfd f12, 160(r1)\n"
    "stfd f11, 152(r1)\n"   "stfd f10, 144(r1)\n"
    "stfd f9,  136(r1)\n"   "stfd f8,  128(r1)\n"
    "stfd f7,  120(r1)\n"   "stfd f6,  112(r1)\n"
    "stfd f5,  104(r1)\n"   "stfd f4,   96(r1)\n"
    "stfd f3,   88(r1)\n"   "stfd f2,   80(r1)\n"
    "stfd f1,   72(r1)\n"
    // Arguments to Compilation Callback:
    // r3 - our lr (address of the call instruction in stub plus 4)
    // r4 - stub's lr (address of instruction that called the stub plus 4)
    // r5 - is64Bit - always 0.
    "mr   r3, r0\n"
    "lwz  r2, 208(r1)\n" // stub's frame
    "lwz  r4, 8(r2)\n" // stub's lr
    "li   r5, 0\n"       // 0 == 32 bit
    "bl _PPCCompilationCallbackC\n"
    "mtctr r3\n"
    // Restore all int arg registers
    "lwz r10, 204(r1)\n"    "lwz r9,  200(r1)\n"
    "lwz r8,  196(r1)\n"    "lwz r7,  192(r1)\n"
    "lwz r6,  188(r1)\n"    "lwz r5,  184(r1)\n"
    "lwz r4,  180(r1)\n"    "lwz r3,  176(r1)\n"
    // Restore all FP arg registers
    "lfd f13, 168(r1)\n"    "lfd f12, 160(r1)\n"
    "lfd f11, 152(r1)\n"    "lfd f10, 144(r1)\n"
    "lfd f9,  136(r1)\n"    "lfd f8,  128(r1)\n"
    "lfd f7,  120(r1)\n"    "lfd f6,  112(r1)\n"
    "lfd f5,  104(r1)\n"    "lfd f4,   96(r1)\n"
    "lfd f3,   88(r1)\n"    "lfd f2,   80(r1)\n"
    "lfd f1,   72(r1)\n"
    // Pop 3 frames off the stack and branch to target
    "lwz  r1, 208(r1)\n"
    "lwz  r2, 8(r1)\n"
    "mtlr r2\n"
    "bctr\n"
    );

#elif defined(__PPC__) && !defined(__ppc64__)
// Linux & FreeBSD / PPC 32 support

// CompilationCallback stub - We can't use a C function with inline assembly in
// it, because we the prolog/epilog inserted by GCC won't work for us.  Instead,
// write our own wrapper, which does things our way, so we have complete control
// over register saving and restoring.
asm(
    ".text\n"
    ".align 2\n"
    ".globl PPC32CompilationCallback\n"
"PPC32CompilationCallback:\n"
    // Make space for 8 ints r[3-10] and 8 doubles f[1-8] and the 
    // FIXME: need to save v[0-19] for altivec?
    // FIXME: could shrink frame
    // Set up a proper stack frame
    // FIXME Layout
    //   8 double registers       -  64 bytes
    //   8 int registers          -  32 bytes
    "mflr 0\n"
    "stw 0,  4(1)\n"
    "stwu 1, -104(1)\n"
    // Save all int arg registers
    "stw 10, 100(1)\n"   "stw 9,  96(1)\n"
    "stw 8,  92(1)\n"    "stw 7,  88(1)\n"
    "stw 6,  84(1)\n"    "stw 5,  80(1)\n"
    "stw 4,  76(1)\n"    "stw 3,  72(1)\n"
    // Save all call-clobbered FP regs.
    "stfd 8,  64(1)\n"
    "stfd 7,  56(1)\n"   "stfd 6,  48(1)\n"
    "stfd 5,  40(1)\n"   "stfd 4,  32(1)\n"
    "stfd 3,  24(1)\n"   "stfd 2,  16(1)\n"
    "stfd 1,  8(1)\n"
    // Arguments to Compilation Callback:
    // r3 - our lr (address of the call instruction in stub plus 4)
    // r4 - stub's lr (address of instruction that called the stub plus 4)
    // r5 - is64Bit - always 0.
    "mr   3, 0\n"
    "lwz  5, 104(1)\n" // stub's frame
    "lwz  4, 4(5)\n" // stub's lr
    "li   5, 0\n"       // 0 == 32 bit
    "bl PPCCompilationCallbackC\n"
    "mtctr 3\n"
    // Restore all int arg registers
    "lwz 10, 100(1)\n"   "lwz 9,  96(1)\n"
    "lwz 8,  92(1)\n"    "lwz 7,  88(1)\n"
    "lwz 6,  84(1)\n"    "lwz 5,  80(1)\n"
    "lwz 4,  76(1)\n"    "lwz 3,  72(1)\n"
    // Restore all FP arg registers
    "lfd 8,  64(1)\n"
    "lfd 7,  56(1)\n"    "lfd 6,  48(1)\n"
    "lfd 5,  40(1)\n"    "lfd 4,  32(1)\n"
    "lfd 3,  24(1)\n"    "lfd 2,  16(1)\n"
    "lfd 1,  8(1)\n"
    // Pop 3 frames off the stack and branch to target
    "lwz  1, 104(1)\n"
    "lwz  0, 4(1)\n"
    "mtlr 0\n"
    "bctr\n"
    );
#else
void PPC32CompilationCallback() {
  llvm_unreachable("This is not a power pc, you can't execute this!");
}
#endif

#if (defined(__POWERPC__) || defined (__ppc__) || defined(_POWER)) && \
    defined(__ppc64__)
#ifdef __ELF__
asm(
    ".text\n"
    ".align 2\n"
    ".globl PPC64CompilationCallback\n"
    ".section \".opd\",\"aw\"\n"
    ".align 3\n"
"PPC64CompilationCallback:\n"
    ".quad .L.PPC64CompilationCallback,.TOC.@tocbase,0\n"
    ".size PPC64CompilationCallback,24\n"
    ".previous\n"
    ".align 4\n"
    ".type PPC64CompilationCallback,@function\n"
".L.PPC64CompilationCallback:\n"
#else
asm(
    ".text\n"
    ".align 2\n"
    ".globl _PPC64CompilationCallback\n"
"_PPC64CompilationCallback:\n"
#endif
    // Make space for 8 ints r[3-10] and 13 doubles f[1-13] and the 
    // FIXME: need to save v[0-19] for altivec?
    // Set up a proper stack frame
    // Layout
    //   PowerPC64 ABI linkage    -  48 bytes
    //                 parameters -  64 bytes
    //   13 double registers      - 104 bytes
    //   8 int registers          -  64 bytes
    "mflr 0\n"
    "std  0,  16(1)\n"
    "stdu 1, -280(1)\n"
    // Save all int arg registers
    "std 10, 272(1)\n"    "std 9,  264(1)\n"
    "std 8,  256(1)\n"    "std 7,  248(1)\n"
    "std 6,  240(1)\n"    "std 5,  232(1)\n"
    "std 4,  224(1)\n"    "std 3,  216(1)\n"
    // Save all call-clobbered FP regs.
    "stfd 13, 208(1)\n"    "stfd 12, 200(1)\n"
    "stfd 11, 192(1)\n"    "stfd 10, 184(1)\n"
    "stfd 9,  176(1)\n"    "stfd 8,  168(1)\n"
    "stfd 7,  160(1)\n"    "stfd 6,  152(1)\n"
    "stfd 5,  144(1)\n"    "stfd 4,  136(1)\n"
    "stfd 3,  128(1)\n"    "stfd 2,  120(1)\n"
    "stfd 1,  112(1)\n"
    // Arguments to Compilation Callback:
    // r3 - our lr (address of the call instruction in stub plus 4)
    // r4 - stub's lr (address of instruction that called the stub plus 4)
    // r5 - is64Bit - always 1.
    "mr   3, 0\n"      // return address (still in r0)
    "ld   5, 280(1)\n" // stub's frame
    "ld   4, 16(5)\n"  // stub's lr
    "li   5, 1\n"      // 1 == 64 bit
#ifdef __ELF__
    "bl PPCCompilationCallbackC\n"
    "nop\n"
#else
    "bl _PPCCompilationCallbackC\n"
#endif
    "mtctr 3\n"
    // Restore all int arg registers
    "ld 10, 272(1)\n"    "ld 9,  264(1)\n"
    "ld 8,  256(1)\n"    "ld 7,  248(1)\n"
    "ld 6,  240(1)\n"    "ld 5,  232(1)\n"
    "ld 4,  224(1)\n"    "ld 3,  216(1)\n"
    // Restore all FP arg registers
    "lfd 13, 208(1)\n"    "lfd 12, 200(1)\n"
    "lfd 11, 192(1)\n"    "lfd 10, 184(1)\n"
    "lfd 9,  176(1)\n"    "lfd 8,  168(1)\n"
    "lfd 7,  160(1)\n"    "lfd 6,  152(1)\n"
    "lfd 5,  144(1)\n"    "lfd 4,  136(1)\n"
    "lfd 3,  128(1)\n"    "lfd 2,  120(1)\n"
    "lfd 1,  112(1)\n"
    // Pop 3 frames off the stack and branch to target
    "ld  1, 280(1)\n"
    "ld  0, 16(1)\n"
    "mtlr 0\n"
    // XXX: any special TOC handling in the ELF case for JIT?
    "bctr\n"
    );
#else
void PPC64CompilationCallback() {
  llvm_unreachable("This is not a power pc, you can't execute this!");
}
#endif

extern "C" void *PPCCompilationCallbackC(unsigned *StubCallAddrPlus4,
                                         unsigned *OrigCallAddrPlus4,
                                         bool is64Bit) {
  // Adjust the pointer to the address of the call instruction in the stub
  // emitted by emitFunctionStub, rather than the instruction after it.
  unsigned *StubCallAddr = StubCallAddrPlus4 - 1;
  unsigned *OrigCallAddr = OrigCallAddrPlus4 - 1;

  void *Target = JITCompilerFunction(StubCallAddr);

  // Check to see if *OrigCallAddr is a 'bl' instruction, and if we can rewrite
  // it to branch directly to the destination.  If so, rewrite it so it does not
  // need to go through the stub anymore.
  unsigned OrigCallInst = *OrigCallAddr;
  if ((OrigCallInst >> 26) == 18) {     // Direct call.
    intptr_t Offset = ((intptr_t)Target - (intptr_t)OrigCallAddr) >> 2;
    
    if (Offset >= -(1 << 23) && Offset < (1 << 23)) {   // In range?
      // Clear the original target out.
      OrigCallInst &= (63 << 26) | 3;
      // Fill in the new target.
      OrigCallInst |= (Offset & ((1 << 24)-1)) << 2;
      // Replace the call.
      *OrigCallAddr = OrigCallInst;
    }
  }

  // Assert that we are coming from a stub that was created with our
  // emitFunctionStub.
  if ((*StubCallAddr >> 26) == 18)
    StubCallAddr -= 3;
  else {
  assert((*StubCallAddr >> 26) == 19 && "Call in stub is not indirect!");
    StubCallAddr -= is64Bit ? 9 : 6;
  }

  // Rewrite the stub with an unconditional branch to the target, for any users
  // who took the address of the stub.
  EmitBranchToAt((intptr_t)StubCallAddr, (intptr_t)Target, false, is64Bit);
  sys::Memory::InvalidateInstructionCache(StubCallAddr, 7*4);

  // Put the address of the target function to call and the address to return to
  // after calling the target function in a place that is easy to get on the
  // stack after we restore all regs.
  return Target;
}



TargetJITInfo::LazyResolverFn
PPCJITInfo::getLazyResolverFunction(JITCompilerFn Fn) {
  JITCompilerFunction = Fn;
  return is64Bit ? PPC64CompilationCallback : PPC32CompilationCallback;
}

TargetJITInfo::StubLayout PPCJITInfo::getStubLayout() {
  // The stub contains up to 10 4-byte instructions, aligned at 4 bytes: 3
  // instructions to save the caller's address if this is a lazy-compilation
  // stub, plus a 1-, 4-, or 7-instruction sequence to load an arbitrary address
  // into a register and jump through it.
  StubLayout Result = {10*4, 4};
  return Result;
}

#if (defined(__POWERPC__) || defined (__ppc__) || defined(_POWER)) && \
defined(__APPLE__)
extern "C" void sys_icache_invalidate(const void *Addr, size_t len);
#endif

void *PPCJITInfo::emitFunctionStub(const Function* F, void *Fn,
                                   JITCodeEmitter &JCE) {
  // If this is just a call to an external function, emit a branch instead of a
  // call.  The code is the same except for one bit of the last instruction.
  if (Fn != (void*)(intptr_t)PPC32CompilationCallback && 
      Fn != (void*)(intptr_t)PPC64CompilationCallback) {
    void *Addr = (void*)JCE.getCurrentPCValue();
    JCE.emitWordBE(0);
    JCE.emitWordBE(0);
    JCE.emitWordBE(0);
    JCE.emitWordBE(0);
    JCE.emitWordBE(0);
    JCE.emitWordBE(0);
    JCE.emitWordBE(0);
    EmitBranchToAt((intptr_t)Addr, (intptr_t)Fn, false, is64Bit);
    sys::Memory::InvalidateInstructionCache(Addr, 7*4);
    return Addr;
  }

  void *Addr = (void*)JCE.getCurrentPCValue();
  if (is64Bit) {
    JCE.emitWordBE(0xf821ffb1);     // stdu r1,-80(r1)
    JCE.emitWordBE(0x7d6802a6);     // mflr r11
    JCE.emitWordBE(0xf9610060);     // std r11, 96(r1)
  } else if (TM.getSubtargetImpl()->isDarwinABI()){
    JCE.emitWordBE(0x9421ffe0);     // stwu r1,-32(r1)
    JCE.emitWordBE(0x7d6802a6);     // mflr r11
    JCE.emitWordBE(0x91610028);     // stw r11, 40(r1)
  } else {
    JCE.emitWordBE(0x9421ffe0);     // stwu r1,-32(r1)
    JCE.emitWordBE(0x7d6802a6);     // mflr r11
    JCE.emitWordBE(0x91610024);     // stw r11, 36(r1)
  }
  intptr_t BranchAddr = (intptr_t)JCE.getCurrentPCValue();
  JCE.emitWordBE(0);
  JCE.emitWordBE(0);
  JCE.emitWordBE(0);
  JCE.emitWordBE(0);
  JCE.emitWordBE(0);
  JCE.emitWordBE(0);
  JCE.emitWordBE(0);
  EmitBranchToAt(BranchAddr, (intptr_t)Fn, true, is64Bit);
  sys::Memory::InvalidateInstructionCache(Addr, 10*4);
  return Addr;
}


void PPCJITInfo::relocate(void *Function, MachineRelocation *MR,
                          unsigned NumRelocs, unsigned char* GOTBase) {
  for (unsigned i = 0; i != NumRelocs; ++i, ++MR) {
    unsigned *RelocPos = (unsigned*)Function + MR->getMachineCodeOffset()/4;
    intptr_t ResultPtr = (intptr_t)MR->getResultPointer();
    switch ((PPC::RelocationType)MR->getRelocationType()) {
    default: llvm_unreachable("Unknown relocation type!");
    case PPC::reloc_pcrel_bx:
      // PC-relative relocation for b and bl instructions.
      ResultPtr = (ResultPtr-(intptr_t)RelocPos) >> 2;
      assert(ResultPtr >= -(1 << 23) && ResultPtr < (1 << 23) &&
             "Relocation out of range!");
      *RelocPos |= (ResultPtr & ((1 << 24)-1))  << 2;
      break;
    case PPC::reloc_pcrel_bcx:
      // PC-relative relocation for BLT,BLE,BEQ,BGE,BGT,BNE, or other
      // bcx instructions.
      ResultPtr = (ResultPtr-(intptr_t)RelocPos) >> 2;
      assert(ResultPtr >= -(1 << 13) && ResultPtr < (1 << 13) &&
             "Relocation out of range!");
      *RelocPos |= (ResultPtr & ((1 << 14)-1))  << 2;
      break;
    case PPC::reloc_absolute_high:     // high bits of ref -> low 16 of instr
    case PPC::reloc_absolute_low: {    // low bits of ref  -> low 16 of instr
      ResultPtr += MR->getConstantVal();

      // If this is a high-part access, get the high-part.
      if (MR->getRelocationType() == PPC::reloc_absolute_high) {
        // If the low part will have a carry (really a borrow) from the low
        // 16-bits into the high 16, add a bit to borrow from.
        if (((int)ResultPtr << 16) < 0)
          ResultPtr += 1 << 16;
        ResultPtr >>= 16;
      }

      // Do the addition then mask, so the addition does not overflow the 16-bit
      // immediate section of the instruction.
      unsigned LowBits  = (*RelocPos + ResultPtr) & 65535;
      unsigned HighBits = *RelocPos & ~65535;
      *RelocPos = LowBits | HighBits;  // Slam into low 16-bits
      break;
    }
    case PPC::reloc_absolute_low_ix: {  // low bits of ref  -> low 14 of instr
      ResultPtr += MR->getConstantVal();
      // Do the addition then mask, so the addition does not overflow the 16-bit
      // immediate section of the instruction.
      unsigned LowBits  = (*RelocPos + ResultPtr) & 0xFFFC;
      unsigned HighBits = *RelocPos & 0xFFFF0003;
      *RelocPos = LowBits | HighBits;  // Slam into low 14-bits.
      break;
    }
    }
  }
}

void PPCJITInfo::replaceMachineCodeForFunction(void *Old, void *New) {
  EmitBranchToAt((intptr_t)Old, (intptr_t)New, false, is64Bit);
  sys::Memory::InvalidateInstructionCache(Old, 7*4);
}
