add Label L() for convenience
diff --git a/readme.md b/readme.md
index 164c488..1604b06 100644
--- a/readme.md
+++ b/readme.md
@@ -1,5 +1,5 @@
-# Xbyak 5.70 ; JIT assembler for x86(IA32), x64(AMD64, x86-64) by C++
+# Xbyak 5.71 ; JIT assembler for x86(IA32), x64(AMD64, x86-64) by C++
## Abstract
@@ -246,13 +246,14 @@
`assignL(dstLabel, srcLabel)` binds dstLabel with srcLabel.
```
- Xbyak::Label label1, label2;
-L(label1);
+ Label label2;
+ Label label1 = L(); // make label1 ; same to Label label1; L(label1);
...
- jmp(label2); // jump to label1 by assignL
+ jmp(label2); // label2 is not determined here
...
assignL(label2, label1); // label2 <- label1
```
+The `jmp` in the above code jumps to label1 assigned by `assignL`.
**Note**:
* srcLabel must be used in `L()`.
@@ -391,6 +392,7 @@
http://opensource.org/licenses/BSD-3-Clause
## History
+* 2018/Sep/04 ver 5.71 L() returns a new label instance
* 2018/Aug/27 ver 5.70 support setProtectMode() and DontUseProtect for read/exec setting
* 2018/Aug/24 ver 5.68 fix wrong VSIB encoding with vector index >= 16(thanks to petercaday)
* 2018/Aug/14 ver 5.67 remove mutable in Address ; fix setCacheHierarchy for cloud vm
diff --git a/readme.txt b/readme.txt
index 689c533..b9746c8 100644
--- a/readme.txt
+++ b/readme.txt
@@ -1,5 +1,5 @@
- C++用x86(IA-32), x64(AMD64, x86-64) JITアセンブラ Xbyak 5.70
+ C++用x86(IA-32), x64(AMD64, x86-64) JITアセンブラ Xbyak 5.71
-----------------------------------------------------------------------------
◎概要
@@ -245,8 +245,8 @@
更にラベルの割り当てを行うassignL(dstLabel, srcLabel)という命令も追加されました。
- Label label1, label2;
- L(label1);
+ Label label2;
+ Label label1 = L(); // Label label1; L(label1);と同じ意味
...
jmp(label2);
...
@@ -373,6 +373,7 @@
-----------------------------------------------------------------------------
◎履歴
+2018/08/27 ver 5.71 新しいlabelインスタンスを返すL()を追加
2018/08/27 ver 5.70 read/exec設定のためのsetProtectMode()とDontUseProtectの追加
2018/08/24 ver 5.68 indexが16以上のVSIBエンコーディングのバグ修正(thanks to petercaday)
2018/08/14 ver 5.67 Addressクラス内のmutableを削除 ; fix setCacheHierarchy for cloud vm
diff --git a/test/jmp.cpp b/test/jmp.cpp
index 4fb1221..6a3b461 100644
--- a/test/jmp.cpp
+++ b/test/jmp.cpp
@@ -889,6 +889,34 @@
}
}
+CYBOZU_TEST_AUTO(returnLabel)
+{
+ struct Code : Xbyak::CodeGenerator {
+ Code()
+ {
+ xor_(eax, eax);
+ Label L1 = L();
+ test(eax, eax);
+ Label exit;
+ jnz(exit);
+ inc(eax); // 1
+ Label L2;
+ call(L2);
+ jmp(L1);
+ L(L2);
+ inc(eax); // 2
+ ret();
+ L(exit);
+ inc(eax); // 3
+ ret();
+ }
+ };
+ Code code;
+ int (*f)() = code.getCode<int (*)()>();
+ int r = f();
+ CYBOZU_TEST_EQUAL(r, 3);
+}
+
CYBOZU_TEST_AUTO(testAssign)
{
struct Code : Xbyak::CodeGenerator {
diff --git a/xbyak/xbyak.h b/xbyak/xbyak.h
index b7f9d51..d820b6d 100644
--- a/xbyak/xbyak.h
+++ b/xbyak/xbyak.h
@@ -105,7 +105,7 @@
enum {
DEFAULT_MAX_CODE_SIZE = 4096,
- VERSION = 0x5700 /* 0xABCD = A.BC(D) */
+ VERSION = 0x5710 /* 0xABCD = A.BC(D) */
};
#ifndef MIE_INTEGER_TYPE_DEFINED
@@ -2162,6 +2162,7 @@
#endif
void L(const std::string& label) { labelMgr_.defineSlabel(label); }
void L(const Label& label) { labelMgr_.defineClabel(label); }
+ Label L() { Label label; L(label); return label; }
void inLocalLabel() { labelMgr_.enterLocal(); }
void outLocalLabel() { labelMgr_.leaveLocal(); }
/*
diff --git a/xbyak/xbyak_mnemonic.h b/xbyak/xbyak_mnemonic.h
index f5ad10f..8eadcc5 100644
--- a/xbyak/xbyak_mnemonic.h
+++ b/xbyak/xbyak_mnemonic.h
@@ -1,4 +1,4 @@
-const char *getVersionString() const { return "5.70"; }
+const char *getVersionString() const { return "5.71"; }
void adc(const Operand& op, uint32 imm) { opRM_I(op, imm, 0x10, 2); }
void adc(const Operand& op1, const Operand& op2) { opRM_RM(op1, op2, 0x10); }
void adcx(const Reg32e& reg, const Operand& op) { opGen(reg, op, 0xF6, 0x66, isREG32_REG32orMEM, NONE, 0x38); }