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: