mirror of
https://github.com/corda/corda.git
synced 2025-06-02 23:50:54 +00:00
various bugfixes in powerpc.cpp
This commit is contained in:
parent
ee90d7bd2c
commit
eef5047a52
@ -41,8 +41,8 @@ inline int B(int op, int bo, int bi, int bd, int aa, int lk) { return op<<26|bo<
|
|||||||
inline int SC(int op, int lev) { return op<<26|lev<<5|2; }
|
inline int SC(int op, int lev) { return op<<26|lev<<5|2; }
|
||||||
inline int X(int op, int rt, int ra, int rb, int xo, int rc) { return op<<26|rt<<21|ra<<16|rb<<11|xo<<1|rc; }
|
inline int X(int op, int rt, int ra, int rb, int xo, int rc) { return op<<26|rt<<21|ra<<16|rb<<11|xo<<1|rc; }
|
||||||
inline int XL(int op, int bt, int ba, int bb, int xo, int lk) { return op<<26|bt<<21|ba<<16|bb<<11|xo<<1|lk; }
|
inline int XL(int op, int bt, int ba, int bb, int xo, int lk) { return op<<26|bt<<21|ba<<16|bb<<11|xo<<1|lk; }
|
||||||
inline int XFX(int op, int rt, int spr, int xo) { return op<<26|rt<<21|spr<<11|xo<<1; }
|
inline int XFX(int op, int rt, int spr, int xo) { return op<<26|rt<<21|((spr >> 5) | ((spr << 5) & 0x3E0))<<11|xo<<1; }
|
||||||
inline int XFL(int op, int flm, int frb, int xo, int rc) { return op<<26|flm<<17|frb<<11|((xo&0x01f)<<6)|((xo>>5)<<1)|rc; }
|
inline int XFL(int op, int flm, int frb, int xo, int rc) { return op<<26|flm<<17|frb<<11|xo<<1|rc; }
|
||||||
inline int XS(int op, int rs, int ra, int sh, int xo, int sh2, int rc) { return op<<26|rs<<21|ra<<16|sh<<11|xo<<2|sh2<<1|rc; }
|
inline int XS(int op, int rs, int ra, int sh, int xo, int sh2, int rc) { return op<<26|rs<<21|ra<<16|sh<<11|xo<<2|sh2<<1|rc; }
|
||||||
inline int XO(int op, int rt, int ra, int rb, int oe, int xo, int rc) { return op<<26|rt<<21|ra<<16|rb<<11|oe<<10|xo<<1|rc; }
|
inline int XO(int op, int rt, int ra, int rb, int oe, int xo, int rc) { return op<<26|rt<<21|ra<<16|rb<<11|oe<<10|xo<<1|rc; }
|
||||||
inline int A(int op, int frt, int fra, int frb, int frc, int xo, int rc) { return op<<26|frt<<21|fra<<16|frb<<11|frc<<6|xo<<1|rc; }
|
inline int A(int op, int frt, int fra, int frb, int frc, int xo, int rc) { return op<<26|frt<<21|fra<<16|frb<<11|frc<<6|xo<<1|rc; }
|
||||||
@ -93,8 +93,8 @@ inline int bl(int i) { return I(18, i, 0, 1); }
|
|||||||
inline int bcctr(int bo, int bi, int lk) { return XL(19, bo, bi, 0, 528, lk); }
|
inline int bcctr(int bo, int bi, int lk) { return XL(19, bo, bi, 0, 528, lk); }
|
||||||
inline int bclr(int bo, int bi, int lk) { return XL(19, bo, bi, 0, 16, lk); }
|
inline int bclr(int bo, int bi, int lk) { return XL(19, bo, bi, 0, 16, lk); }
|
||||||
// PSEUDO-INSTRUCTIONS
|
// PSEUDO-INSTRUCTIONS
|
||||||
inline int li(int rt, int i) { return ori(rt, 0, i); }
|
inline int li(int rt, int i) { return addi(rt, 0, i); }
|
||||||
inline int lis(int rt, int i) { return oris(rt, 0, i); }
|
inline int lis(int rt, int i) { return addis(rt, 0, i); }
|
||||||
inline int slwi(int rt, int ra, int i) { return rlwinm(rt, ra, i, 0, 31-i); }
|
inline int slwi(int rt, int ra, int i) { return rlwinm(rt, ra, i, 0, 31-i); }
|
||||||
inline int srwi(int rt, int ra, int i) { return rlwinm(rt, ra, 32-i, i, 31); }
|
inline int srwi(int rt, int ra, int i) { return rlwinm(rt, ra, 32-i, i, 31); }
|
||||||
inline int sub(int rt, int ra, int rb) { return subf(rt, rb, ra); }
|
inline int sub(int rt, int ra, int rb) { return subf(rt, rb, ra); }
|
||||||
@ -115,7 +115,7 @@ namespace {
|
|||||||
const unsigned FrameFooterSize = 6;
|
const unsigned FrameFooterSize = 6;
|
||||||
|
|
||||||
const int StackRegister = 1;
|
const int StackRegister = 1;
|
||||||
const int ThreadRegister = 20;
|
const int ThreadRegister = 13;
|
||||||
|
|
||||||
class MyBlock: public Assembler::Block {
|
class MyBlock: public Assembler::Block {
|
||||||
public:
|
public:
|
||||||
@ -259,7 +259,7 @@ bounded(int right, int left, int32_t v)
|
|||||||
void*
|
void*
|
||||||
updateOffset(System* s, uint8_t* instruction, bool conditional, int64_t value)
|
updateOffset(System* s, uint8_t* instruction, bool conditional, int64_t value)
|
||||||
{
|
{
|
||||||
int32_t v = reinterpret_cast<uint8_t*>(value) - instruction - 4;
|
int32_t v = reinterpret_cast<uint8_t*>(value) - instruction;
|
||||||
|
|
||||||
if (conditional) {
|
if (conditional) {
|
||||||
expect(s, bounded(2, 16, v));
|
expect(s, bounded(2, 16, v));
|
||||||
@ -269,8 +269,6 @@ updateOffset(System* s, uint8_t* instruction, bool conditional, int64_t value)
|
|||||||
*reinterpret_cast<int32_t*>(instruction) |= v & 0x3FFFFFC;
|
*reinterpret_cast<int32_t*>(instruction) |= v & 0x3FFFFFC;
|
||||||
}
|
}
|
||||||
|
|
||||||
*reinterpret_cast<int32_t*>(instruction) |= v;
|
|
||||||
|
|
||||||
return instruction + 4;
|
return instruction + 4;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -422,8 +420,8 @@ updateImmediate(System* s, void* dst, int64_t src, unsigned size)
|
|||||||
{
|
{
|
||||||
switch (size) {
|
switch (size) {
|
||||||
case 4: {
|
case 4: {
|
||||||
static_cast<int32_t*>(dst)[0] |= src & 0xFFFF;
|
static_cast<int32_t*>(dst)[0] |= src >> 16;
|
||||||
static_cast<int32_t*>(dst)[1] |= src >> 16;
|
static_cast<int32_t*>(dst)[1] |= src & 0xFFFF;
|
||||||
} break;
|
} break;
|
||||||
|
|
||||||
default: abort(s);
|
default: abort(s);
|
||||||
@ -482,13 +480,6 @@ appendImmediateTask(Context* c, Promise* promise, Promise* offset,
|
|||||||
(c->tasks, promise, offset, size, promiseOffset);
|
(c->tasks, promise, offset, size, promiseOffset);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void
|
|
||||||
return_(Context* c)
|
|
||||||
{
|
|
||||||
issue(c, blr());
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
void
|
||||||
jumpR(Context* c, unsigned size UNUSED, Assembler::Register* target)
|
jumpR(Context* c, unsigned size UNUSED, Assembler::Register* target)
|
||||||
{
|
{
|
||||||
@ -498,7 +489,6 @@ jumpR(Context* c, unsigned size UNUSED, Assembler::Register* target)
|
|||||||
issue(c, bctr());
|
issue(c, bctr());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void
|
void
|
||||||
moveRR(Context* c, unsigned srcSize, Assembler::Register* src,
|
moveRR(Context* c, unsigned srcSize, Assembler::Register* src,
|
||||||
unsigned dstSize, Assembler::Register* dst);
|
unsigned dstSize, Assembler::Register* dst);
|
||||||
@ -717,9 +707,6 @@ void subCRR(Context* con, unsigned size, Const* a, Reg* b, Reg* t) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// END OPERATION COMPILERS
|
|
||||||
|
|
||||||
|
|
||||||
void
|
void
|
||||||
moveAndUpdateRM(Context* c, unsigned srcSize, Assembler::Register* src,
|
moveAndUpdateRM(Context* c, unsigned srcSize, Assembler::Register* src,
|
||||||
unsigned dstSize UNUSED, Assembler::Memory* dst)
|
unsigned dstSize UNUSED, Assembler::Memory* dst)
|
||||||
@ -813,15 +800,17 @@ moveCR2(Context* c, unsigned, Assembler::Constant* src,
|
|||||||
if (dstSize == 4) {
|
if (dstSize == 4) {
|
||||||
if (src->value->resolved()) {
|
if (src->value->resolved()) {
|
||||||
int32_t v = src->value->value();
|
int32_t v = src->value->value();
|
||||||
issue(c, li(dst->low, v));
|
|
||||||
if (v >> 16) {
|
if (v >> 16) {
|
||||||
issue(c, lis(dst->low, v >> 16));
|
issue(c, lis(dst->low, v >> 16));
|
||||||
|
issue(c, ori(dst->low, dst->low, v));
|
||||||
|
} else {
|
||||||
|
issue(c, li(dst->low, v));
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
appendImmediateTask
|
appendImmediateTask
|
||||||
(c, src->value, offset(c), BytesPerWord, promiseOffset);
|
(c, src->value, offset(c), BytesPerWord, promiseOffset);
|
||||||
issue(c, li(dst->low, 0));
|
|
||||||
issue(c, lis(dst->low, 0));
|
issue(c, lis(dst->low, 0));
|
||||||
|
issue(c, ori(dst->low, dst->low, 0));
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
abort(c); // todo
|
abort(c); // todo
|
||||||
@ -918,6 +907,17 @@ longJumpC(Context* c, unsigned size, Assembler::Constant* target)
|
|||||||
jumpR(c, BytesPerWord, &tmp);
|
jumpR(c, BytesPerWord, &tmp);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
return_(Context* c)
|
||||||
|
{
|
||||||
|
Assembler::Register returnAddress(0);
|
||||||
|
Assembler::Memory returnAddressSrc(StackRegister, 8);
|
||||||
|
moveMR(c, BytesPerWord, &returnAddressSrc, BytesPerWord, &returnAddress);
|
||||||
|
|
||||||
|
issue(c, mtlr(returnAddress.low));
|
||||||
|
issue(c, blr());
|
||||||
|
}
|
||||||
|
|
||||||
// END OPERATION COMPILERS
|
// END OPERATION COMPILERS
|
||||||
|
|
||||||
|
|
||||||
@ -1214,12 +1214,6 @@ class MyAssembler: public Assembler {
|
|||||||
Register stack(StackRegister);
|
Register stack(StackRegister);
|
||||||
Memory stackSrc(StackRegister, 0);
|
Memory stackSrc(StackRegister, 0);
|
||||||
moveMR(&c, BytesPerWord, &stackSrc, BytesPerWord, &stack);
|
moveMR(&c, BytesPerWord, &stackSrc, BytesPerWord, &stack);
|
||||||
|
|
||||||
Register returnAddress(0);
|
|
||||||
Memory returnAddressSrc(StackRegister, 8);
|
|
||||||
moveMR(&c, BytesPerWord, &returnAddressSrc, BytesPerWord, &returnAddress);
|
|
||||||
|
|
||||||
issue(&c, mtlr(returnAddress.low));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual void apply(Operation op) {
|
virtual void apply(Operation op) {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user