util::StackFrame uses push/pop instead of mov
diff --git a/readme.md b/readme.md
index 52f2d26..29866f8 100644
--- a/readme.md
+++ b/readme.md
@@ -392,6 +392,7 @@
http://opensource.org/licenses/BSD-3-Clause
## History
+* 2018/Oct/15 util::AddressFrame uses push/pop instead of mov
* 2018/Sep/19 ver 5.73 fix evex encoding of vpslld, vpslldq, vpsllw, etc for (reg, mem, imm8)
* 2018/Sep/19 ver 5.72 fix the encoding of vinsertps for disp8N(Thanks to petercaday)
* 2018/Sep/04 ver 5.71 L() returns a new label instance
diff --git a/readme.txt b/readme.txt
index 7bdde28..3cc9b3d 100644
--- a/readme.txt
+++ b/readme.txt
@@ -373,6 +373,7 @@
-----------------------------------------------------------------------------
◎履歴
+2018/10/15 util::StackFrameでmovの代わりにpush/popを使う
2018/09/19 ver 5.73 vpslld, vpslldq, vpsllwなどの(reg, mem, imm8)に対するevexエンコーディング修整
2018/09/19 ver 5.72 fix the encoding of vinsertps for disp8N(Thanks to petercaday)
2018/08/27 ver 5.71 新しいlabelインスタンスを返すL()を追加
diff --git a/test/sf_test.cpp b/test/sf_test.cpp
index 84a903f..ced893b 100644
--- a/test/sf_test.cpp
+++ b/test/sf_test.cpp
@@ -152,6 +152,11 @@
add(rax, sf.p[i]);
}
}
+ void gen2(int pNum, int tNum, int stackSizeByte)
+ {
+ StackFrame sf(this, pNum, tNum, stackSizeByte);
+ mov(rax, rsp);
+ }
};
static int errNum = 0;
@@ -212,6 +217,15 @@
const Xbyak::uint8 *f = code.getCurr();
code.gen(pNum, tNum | opt, stackSize);
verify(f, pNum);
+ /*
+ check rsp is 16-byte aligned if stackSize > 0
+ */
+ if (stackSize > 0) {
+ Code2 c2;
+ c2.gen2(pNum, tNum | opt, stackSize);
+ uint64_t addr = c2.getCode<uint64_t (*)()>()();
+ check(addr % 16, 0);
+ }
}
}
}
diff --git a/xbyak/xbyak_util.h b/xbyak/xbyak_util.h
index 0f6aada..212e3a7 100644
--- a/xbyak/xbyak_util.h
+++ b/xbyak/xbyak_util.h
@@ -568,25 +568,15 @@
const int allRegNum = pNum + tNum_ + (useRcx_ ? 1 : 0) + (useRdx_ ? 1 : 0);
if (allRegNum < pNum || allRegNum > 14) throw Error(ERR_BAD_TNUM);
const Reg64& _rsp = code->rsp;
- const AddressFrame& _ptr = code->ptr;
saveNum_ = (std::max)(0, allRegNum - noSaveNum);
const int *tbl = getOrderTbl() + noSaveNum;
- P_ = saveNum_ + (stackSizeByte + 7) / 8;
- if (P_ > 0 && (P_ & 1) == 0) P_++; // here (rsp % 16) == 8, then increment P_ for 16 byte alignment
+ for (int i = 0; i < saveNum_; i++) {
+ code->push(Reg64(tbl[i]));
+ }
+ P_ = (stackSizeByte + 7) / 8;
+ if (P_ > 0 && (P_ & 1) == (saveNum_ & 1)) P_++; // (rsp % 16) == 8, then increment P_ for 16 byte alignment
P_ *= 8;
if (P_ > 0) code->sub(_rsp, P_);
-#ifdef XBYAK64_WIN
- for (int i = 0; i < (std::min)(saveNum_, 4); i++) {
- code->mov(_ptr [_rsp + P_ + (i + 1) * 8], Reg64(tbl[i]));
- }
- for (int i = 4; i < saveNum_; i++) {
- code->mov(_ptr [_rsp + P_ - 8 * (saveNum_ - i)], Reg64(tbl[i]));
- }
-#else
- for (int i = 0; i < saveNum_; i++) {
- code->mov(_ptr [_rsp + P_ - 8 * (saveNum_ - i)], Reg64(tbl[i]));
- }
-#endif
int pos = 0;
for (int i = 0; i < pNum; i++) {
pTbl_[i] = Xbyak::Reg64(getRegIdx(pos));
@@ -607,21 +597,11 @@
{
using namespace Xbyak;
const Reg64& _rsp = code_->rsp;
- const AddressFrame& _ptr = code_->ptr;
const int *tbl = getOrderTbl() + noSaveNum;
-#ifdef XBYAK64_WIN
- for (int i = 0; i < (std::min)(saveNum_, 4); i++) {
- code_->mov(Reg64(tbl[i]), _ptr [_rsp + P_ + (i + 1) * 8]);
- }
- for (int i = 4; i < saveNum_; i++) {
- code_->mov(Reg64(tbl[i]), _ptr [_rsp + P_ - 8 * (saveNum_ - i)]);
- }
-#else
- for (int i = 0; i < saveNum_; i++) {
- code_->mov(Reg64(tbl[i]), _ptr [_rsp + P_ - 8 * (saveNum_ - i)]);
- }
-#endif
if (P_ > 0) code_->add(_rsp, P_);
+ for (int i = 0; i < saveNum_; i++) {
+ code_->pop(Reg64(tbl[saveNum_ - 1 - i]));
+ }
if (callRet) code_->ret();
}
@@ -633,9 +613,6 @@
} catch (std::exception& e) {
printf("ERR:StackFrame %s\n", e.what());
exit(1);
- } catch (...) {
- printf("ERR:StackFrame otherwise\n");
- exit(1);
}
}
private: