mirror of
https://github.com/corda/corda.git
synced 2025-01-07 13:38:47 +00:00
more ARM64 bugfixes
This commit is contained in:
parent
85fcbb82b3
commit
67f5461d82
@ -38,17 +38,17 @@ void append(Context* c, uint32_t instruction)
|
|||||||
|
|
||||||
uint32_t lslv(Register Rd, Register Rn, Register Rm, unsigned size)
|
uint32_t lslv(Register Rd, Register Rn, Register Rm, unsigned size)
|
||||||
{
|
{
|
||||||
return (size == 8 ? 0x9ac12000 : 0x1ac02000) | (Rm.index() << 16) | (Rn.index() << 5) | Rd.index();
|
return (size == 8 ? 0x9ac02000 : 0x1ac02000) | (Rm.index() << 16) | (Rn.index() << 5) | Rd.index();
|
||||||
}
|
}
|
||||||
|
|
||||||
uint32_t ubfm(Register Rd, Register Rn, int r, int s, unsigned size)
|
uint32_t ubfm(Register Rd, Register Rn, int r, int s, unsigned size)
|
||||||
{
|
{
|
||||||
return (size == 8 ? 0xd3608000 : 0x53000000) | (r << 16) | (s << 10) | (Rn.index() << 5) | Rd.index();
|
return (size == 8 ? 0xd3400000 : 0x53000000) | (r << 16) | (s << 10) | (Rn.index() << 5) | Rd.index();
|
||||||
}
|
}
|
||||||
|
|
||||||
uint32_t sbfm(Register Rd, Register Rn, int r, int s, unsigned size)
|
uint32_t sbfm(Register Rd, Register Rn, int r, int s, unsigned size)
|
||||||
{
|
{
|
||||||
return (size == 8 ? 0x93408000 : 0x13000000) | (r << 16) | (s << 10) | (Rn.index() << 5) | Rd.index();
|
return (size == 8 ? 0x93400000 : 0x13000000) | (r << 16) | (s << 10) | (Rn.index() << 5) | Rd.index();
|
||||||
}
|
}
|
||||||
|
|
||||||
uint32_t lsli(Register Rd, Register Rn, int shift, unsigned size)
|
uint32_t lsli(Register Rd, Register Rn, int shift, unsigned size)
|
||||||
@ -501,9 +501,9 @@ void shiftLeftC(Context* c,
|
|||||||
{
|
{
|
||||||
uint64_t value = a->value->value();
|
uint64_t value = a->value->value();
|
||||||
if (size == 4 and (value & 0x1F)) {
|
if (size == 4 and (value & 0x1F)) {
|
||||||
append(c, lsli(dst->low, b->low, value, 4));
|
append(c, lsli(dst->low, b->low, value & 0x1F, 4));
|
||||||
} else if (size == 8 and (value & 0x3F)) {
|
} else if (size == 8 and (value & 0x3F)) {
|
||||||
append(c, lsli(dst->low, b->low, value, 8));
|
append(c, lsli(dst->low, b->low, value & 0x3F, 8));
|
||||||
} else {
|
} else {
|
||||||
moveRR(c, size, b, size, dst);
|
moveRR(c, size, b, size, dst);
|
||||||
}
|
}
|
||||||
@ -526,9 +526,9 @@ void shiftRightC(Context* c,
|
|||||||
{
|
{
|
||||||
uint64_t value = a->value->value();
|
uint64_t value = a->value->value();
|
||||||
if (size == 4 and (value & 0x1F)) {
|
if (size == 4 and (value & 0x1F)) {
|
||||||
append(c, lsri(dst->low, b->low, value, 4));
|
append(c, asri(dst->low, b->low, value & 0x1F, 4));
|
||||||
} else if (size == 8 and (value & 0x3F)) {
|
} else if (size == 8 and (value & 0x3F)) {
|
||||||
append(c, lsri(dst->low, b->low, value, 8));
|
append(c, asri(dst->low, b->low, value & 0x3F, 8));
|
||||||
} else {
|
} else {
|
||||||
moveRR(c, size, b, size, dst);
|
moveRR(c, size, b, size, dst);
|
||||||
}
|
}
|
||||||
@ -551,9 +551,9 @@ void unsignedShiftRightC(Context* c,
|
|||||||
{
|
{
|
||||||
uint64_t value = a->value->value();
|
uint64_t value = a->value->value();
|
||||||
if (size == 4 and (value & 0x1F)) {
|
if (size == 4 and (value & 0x1F)) {
|
||||||
append(c, asri(dst->low, b->low, value, 4));
|
append(c, lsri(dst->low, b->low, value & 0x1F, 4));
|
||||||
} else if (size == 8 and (value & 0x3F)) {
|
} else if (size == 8 and (value & 0x3F)) {
|
||||||
append(c, asri(dst->low, b->low, value, 8));
|
append(c, lsri(dst->low, b->low, value & 0x3F, 8));
|
||||||
} else {
|
} else {
|
||||||
moveRR(c, size, b, size, dst);
|
moveRR(c, size, b, size, dst);
|
||||||
}
|
}
|
||||||
@ -645,9 +645,13 @@ void moveCR2(Context* c,
|
|||||||
if (value >= 0) {
|
if (value >= 0) {
|
||||||
append(c, movz(dst->low, value & 0xFFFF, 0, size));
|
append(c, movz(dst->low, value & 0xFFFF, 0, size));
|
||||||
if (value >> 16) {
|
if (value >> 16) {
|
||||||
|
if ((value >> 16) & 0xFFFF) {
|
||||||
append(c, movk(dst->low, (value >> 16) & 0xFFFF, 16, size));
|
append(c, movk(dst->low, (value >> 16) & 0xFFFF, 16, size));
|
||||||
|
}
|
||||||
if (value >> 32) {
|
if (value >> 32) {
|
||||||
|
if ((value >> 32) & 0xFFFF) {
|
||||||
append(c, movk(dst->low, (value >> 32) & 0xFFFF, 32, size));
|
append(c, movk(dst->low, (value >> 32) & 0xFFFF, 32, size));
|
||||||
|
}
|
||||||
if (value >> 48) {
|
if (value >> 48) {
|
||||||
append(c, movk(dst->low, (value >> 48) & 0xFFFF, 48, size));
|
append(c, movk(dst->low, (value >> 48) & 0xFFFF, 48, size));
|
||||||
}
|
}
|
||||||
@ -656,9 +660,13 @@ void moveCR2(Context* c,
|
|||||||
} else {
|
} else {
|
||||||
append(c, movn(dst->low, (~value) & 0xFFFF, 0, size));
|
append(c, movn(dst->low, (~value) & 0xFFFF, 0, size));
|
||||||
if (~(value >> 16)) {
|
if (~(value >> 16)) {
|
||||||
|
if (((value >> 16) & 0xFFFF) != 0xFFFF) {
|
||||||
append(c, movk(dst->low, (value >> 16) & 0xFFFF, 16, size));
|
append(c, movk(dst->low, (value >> 16) & 0xFFFF, 16, size));
|
||||||
|
}
|
||||||
if (~(value >> 32)) {
|
if (~(value >> 32)) {
|
||||||
|
if (((value >> 32) & 0xFFFF) != 0xFFFF) {
|
||||||
append(c, movk(dst->low, (value >> 32) & 0xFFFF, 32, size));
|
append(c, movk(dst->low, (value >> 32) & 0xFFFF, 32, size));
|
||||||
|
}
|
||||||
if (~(value >> 48)) {
|
if (~(value >> 48)) {
|
||||||
append(c, movk(dst->low, (value >> 48) & 0xFFFF, 48, size));
|
append(c, movk(dst->low, (value >> 48) & 0xFFFF, 48, size));
|
||||||
}
|
}
|
||||||
@ -704,7 +712,7 @@ void addC(Context* c,
|
|||||||
lir::RegisterPair* b,
|
lir::RegisterPair* b,
|
||||||
lir::RegisterPair* dst)
|
lir::RegisterPair* dst)
|
||||||
{
|
{
|
||||||
int32_t v = a->value->value();
|
int64_t v = a->value->value();
|
||||||
if (v) {
|
if (v) {
|
||||||
if (v > 0 and v < 0x1000) {
|
if (v > 0 and v < 0x1000) {
|
||||||
append(c, addi(dst->low, b->low, v, 0, size));
|
append(c, addi(dst->low, b->low, v, 0, size));
|
||||||
@ -725,7 +733,7 @@ void subC(Context* c,
|
|||||||
lir::RegisterPair* b,
|
lir::RegisterPair* b,
|
||||||
lir::RegisterPair* dst)
|
lir::RegisterPair* dst)
|
||||||
{
|
{
|
||||||
int32_t v = a->value->value();
|
int64_t v = a->value->value();
|
||||||
if (v) {
|
if (v) {
|
||||||
if (v > 0 and v < 0x1000) {
|
if (v > 0 and v < 0x1000) {
|
||||||
append(c, subi(dst->low, b->low, v, 0, size));
|
append(c, subi(dst->low, b->low, v, 0, size));
|
||||||
@ -1297,7 +1305,7 @@ void compareCR(Context* c,
|
|||||||
assertT(c, aSize == bSize);
|
assertT(c, aSize == bSize);
|
||||||
|
|
||||||
if (!isFpr(b) && a->value->resolved()) {
|
if (!isFpr(b) && a->value->resolved()) {
|
||||||
int32_t v = a->value->value();
|
int64_t v = a->value->value();
|
||||||
if (v == 0) {
|
if (v == 0) {
|
||||||
append(c, cmp(b->low, Register(31), aSize));
|
append(c, cmp(b->low, Register(31), aSize));
|
||||||
return;
|
return;
|
||||||
|
@ -13,7 +13,7 @@
|
|||||||
|
|
||||||
.text
|
.text
|
||||||
|
|
||||||
#define BYTES_PER_WORD 4
|
#define BYTES_PER_WORD 8
|
||||||
|
|
||||||
#define LOCAL(x) .L##x
|
#define LOCAL(x) .L##x
|
||||||
|
|
||||||
@ -59,7 +59,7 @@ GLOBAL(vmInvoke):
|
|||||||
|
|
||||||
// copy arguments into place
|
// copy arguments into place
|
||||||
sub sp, sp, w3, uxtw
|
sub sp, sp, w3, uxtw
|
||||||
mov x5, #0
|
mov x4, #0
|
||||||
b LOCAL(vmInvoke_argumentTest)
|
b LOCAL(vmInvoke_argumentTest)
|
||||||
|
|
||||||
LOCAL(vmInvoke_argumentLoop):
|
LOCAL(vmInvoke_argumentLoop):
|
||||||
|
Loading…
Reference in New Issue
Block a user