mirror of
https://github.com/ton-blockchain/ton
synced 2025-03-09 15:40:10 +00:00
updated tonlib + fixes in vm
This commit is contained in:
parent
28735ddc9e
commit
efd47af432
42 changed files with 750 additions and 307 deletions
|
@ -1271,6 +1271,12 @@ struct StackTransform {
|
|||
bool is_pop(int* i) const;
|
||||
bool is_rot() const;
|
||||
bool is_rotrev() const;
|
||||
bool is_push_rot(int i) const;
|
||||
bool is_push_rot(int* i) const;
|
||||
bool is_push_rotrev(int i) const;
|
||||
bool is_push_rotrev(int* i) const;
|
||||
bool is_push_xchg(int i, int j, int k) const;
|
||||
bool is_push_xchg(int* i, int* j, int* k) const;
|
||||
bool is_xchg2(int i, int j) const;
|
||||
bool is_xchg2(int* i, int* j) const;
|
||||
bool is_xcpu(int i, int j) const;
|
||||
|
@ -1404,6 +1410,9 @@ struct Optimizer {
|
|||
bool is_push(int* i);
|
||||
bool is_pop(int* i);
|
||||
bool is_nop();
|
||||
bool is_push_rot(int* i);
|
||||
bool is_push_rotrev(int* i);
|
||||
bool is_push_xchg(int* i, int* j, int* k);
|
||||
bool is_xchg2(int* i, int* j);
|
||||
bool is_xcpu(int* i, int* j);
|
||||
bool is_puxc(int* i, int* j);
|
||||
|
|
|
@ -401,6 +401,19 @@ bool Optimizer::is_pop(int* i) {
|
|||
return is_pred([i](const auto& t) { return t.is_pop(i) && *i < 256; });
|
||||
}
|
||||
|
||||
bool Optimizer::is_push_rot(int* i) {
|
||||
return is_pred([i](const auto& t) { return t.is_push_rot(i) && *i < 16; }, 3);
|
||||
}
|
||||
|
||||
bool Optimizer::is_push_rotrev(int* i) {
|
||||
return is_pred([i](const auto& t) { return t.is_push_rotrev(i) && *i < 16; }, 3);
|
||||
}
|
||||
|
||||
bool Optimizer::is_push_xchg(int* i, int* j, int* k) {
|
||||
return is_pred([i, j, k](const auto& t) { return t.is_push_xchg(i, j, k) && *i < 16 && *j < 16 && *k < 16; }) &&
|
||||
!(p_ == 2 && op_[0]->is_push() && op_[1]->is_xchg());
|
||||
}
|
||||
|
||||
bool Optimizer::is_xchg2(int* i, int* j) {
|
||||
return is_pred([i, j](const auto& t) { return t.is_xchg2(i, j) && *i < 16 && *j < 16; });
|
||||
}
|
||||
|
@ -434,7 +447,8 @@ bool Optimizer::is_xcpu2(int* i, int* j, int* k) {
|
|||
}
|
||||
|
||||
bool Optimizer::is_puxc2(int* i, int* j, int* k) {
|
||||
return is_pred([i, j, k](const auto& t) { return t.is_puxc2(i, j, k) && *i < 16 && *j < 15 && *k < 15; });
|
||||
return is_pred(
|
||||
[i, j, k](const auto& t) { return t.is_puxc2(i, j, k) && *i < 16 && *j < 15 && *k < 15 && *j + *k != -1; });
|
||||
}
|
||||
|
||||
bool Optimizer::is_puxcpu(int* i, int* j, int* k) {
|
||||
|
@ -545,6 +559,9 @@ bool Optimizer::find_at_least(int pb) {
|
|||
(is_xcpu(&i, &j) && rewrite(AsmOp::XcPu(i, j))) || (is_puxc(&i, &j) && rewrite(AsmOp::PuXc(i, j))) ||
|
||||
(is_push2(&i, &j) && rewrite(AsmOp::Push2(i, j))) || (is_blkswap(&i, &j) && rewrite(AsmOp::BlkSwap(i, j))) ||
|
||||
(is_blkpush(&i, &j) && rewrite(AsmOp::BlkPush(i, j))) || (is_blkdrop(&i) && rewrite(AsmOp::BlkDrop(i))) ||
|
||||
(is_push_rot(&i) && rewrite(AsmOp::Push(i), AsmOp::Custom("ROT"))) ||
|
||||
(is_push_rotrev(&i) && rewrite(AsmOp::Push(i), AsmOp::Custom("-ROT"))) ||
|
||||
(is_push_xchg(&i, &j, &k) && rewrite(AsmOp::Push(i), AsmOp::Xchg(j, k))) ||
|
||||
(is_reverse(&i, &j) && rewrite(AsmOp::BlkReverse(i, j))) ||
|
||||
(is_nip_seq(&i, &j) && rewrite(AsmOp::Xchg(i, j), AsmOp::BlkDrop(i))) ||
|
||||
(is_pop_blkdrop(&i, &k) && rewrite(AsmOp::Pop(i), AsmOp::BlkDrop(k))) ||
|
||||
|
|
|
@ -454,6 +454,53 @@ bool StackTransform::is_rotrev() const {
|
|||
return equal(rot_rev, true);
|
||||
}
|
||||
|
||||
// PUSH i ; ROT == 1 i 0 2 3
|
||||
bool StackTransform::is_push_rot(int i) const {
|
||||
return is_valid() && d == -1 && i >= 0 && is_trivial_after(3) && get(0) == 1 && get(1) == i && get(2) == 0;
|
||||
}
|
||||
|
||||
bool StackTransform::is_push_rot(int *i) const {
|
||||
return is_valid() && (*i = get(1)) >= 0 && is_push_rot(*i);
|
||||
}
|
||||
|
||||
// PUSH i ; -ROT == 0 1 i 2 3
|
||||
bool StackTransform::is_push_rotrev(int i) const {
|
||||
return is_valid() && d == -1 && i >= 0 && is_trivial_after(3) && get(0) == 0 && get(1) == 1 && get(2) == i;
|
||||
}
|
||||
|
||||
bool StackTransform::is_push_rotrev(int *i) const {
|
||||
return is_valid() && (*i = get(2)) >= 0 && is_push_rotrev(*i);
|
||||
}
|
||||
|
||||
// PUSH s(i) ; XCHG s(j),s(k) --> i 0 1 .. i ..
|
||||
// PUSH s(i) ; XCHG s(0),s(k) --> k-1 0 1 .. k-2 i k ..
|
||||
bool StackTransform::is_push_xchg(int i, int j, int k) const {
|
||||
StackTransform t;
|
||||
return is_valid() && d == -1 && n <= 3 && t.apply_push(i) && t.apply_xchg(j, k) && t <= *this;
|
||||
}
|
||||
|
||||
bool StackTransform::is_push_xchg(int *i, int *j, int *k) const {
|
||||
if (!(is_valid() && d == -1 && n <= 3 && n > 0)) {
|
||||
return false;
|
||||
}
|
||||
int s = get(0);
|
||||
if (s < 0) {
|
||||
return false;
|
||||
}
|
||||
*i = s;
|
||||
*j = 0;
|
||||
if (n == 1) {
|
||||
*k = 0;
|
||||
} else if (n == 2) {
|
||||
*k = s + 1;
|
||||
*i = get(s + 1);
|
||||
} else {
|
||||
*j = A[1].first + 1;
|
||||
*k = A[2].first + 1;
|
||||
}
|
||||
return is_push_xchg(*i, *j, *k);
|
||||
}
|
||||
|
||||
// XCHG s1,s(i) ; XCHG s0,s(j)
|
||||
bool StackTransform::is_xchg2(int i, int j) const {
|
||||
StackTransform t;
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue