aboutsummaryrefslogtreecommitdiffhomepage
path: root/sample
diff options
context:
space:
mode:
authorMITSUNARI Shigeo <[email protected]>2023-12-26 12:17:10 +0900
committerMITSUNARI Shigeo <[email protected]>2023-12-26 12:18:54 +0900
commitb5e115284a90d688190f87ba163617da7dd58517 (patch)
treec15384381766be42f78606077e886cfc3c047d76 /sample
parentbacd8d34b6d1b0dd76e616ad8050b8acc7b44c6b (diff)
downloadxbyak-b5e115284a90d688190f87ba163617da7dd58517.tar.gz
xbyak-b5e115284a90d688190f87ba163617da7dd58517.zip
add sample/ccmp.cpp
Diffstat (limited to 'sample')
-rw-r--r--sample/Makefile6
-rw-r--r--sample/ccmp.cpp68
2 files changed, 73 insertions, 1 deletions
diff --git a/sample/Makefile b/sample/Makefile
index 5a84bcd..2010f69 100644
--- a/sample/Makefile
+++ b/sample/Makefile
@@ -30,7 +30,7 @@ else
endif
ifeq ($(BIT),64)
-TARGET += test64 bf64 memfunc64 test_util64 jmp_table64 zero_upper
+TARGET += test64 bf64 memfunc64 test_util64 jmp_table64 zero_upper ccmp
ifeq ($(BOOST_EXIST),1)
TARGET += calc64 #calc2_64
endif
@@ -107,6 +107,10 @@ zero_upper: zero_upper.cpp $(XBYAK_INC)
$(CXX) $(CFLAGS) zero_upper.cpp -o $@
test_zero_upper: zero_upper
sde -future -- ./zero_upper
+ccmp: ccmp.cpp $(XBYAK_INC)
+ $(CXX) $(CFLAGS) ccmp.cpp -o $@
+test_ccmp: ccmp
+ sde -future -- ./ccmp
clean:
rm -rf $(TARGET) profiler profiler-vtune
diff --git a/sample/ccmp.cpp b/sample/ccmp.cpp
new file mode 100644
index 0000000..622d3d1
--- /dev/null
+++ b/sample/ccmp.cpp
@@ -0,0 +1,68 @@
+/*
+ An example of ccmp
+ > g++ ccmp.cpp -I ../xbyak
+ > sde -future -- ./a.out
+*/
+#include <stdio.h>
+#include <xbyak/xbyak.h>
+#include <xbyak/xbyak_util.h>
+
+using namespace Xbyak;
+
+struct Code1 : Xbyak::CodeGenerator {
+ Code1()
+ {
+ Xbyak::util::StackFrame sf(this, 2);
+ const auto& p1 = sf.p[0];
+ const auto& p2 = sf.p[1];
+ int dfv = 0;
+ cmp(p1, 3);
+ ctesta(p2, 1, dfv); // eflags = (p1 > 3) ? (p2 & 1) : dfv;
+ setz(al|T_zu);
+ }
+};
+
+struct Code2 : Xbyak::CodeGenerator {
+ Code2()
+ {
+ Xbyak::util::StackFrame sf(this, 3);
+ const auto& p1 = sf.p[0];
+ const auto& p2 = sf.p[1];
+ const auto& p3 = sf.p[2];
+ int dfv = 0;
+ cmp(p1, 1);
+ ccmpe(p2, 2, dfv); // eflags = p1==1 ? p2==2 : dfv;
+ ccmpe(p3, 3, dfv); // eflags = (p1==1 && p2==2) ? p3==3 : dfv;
+ setz(al|T_zu); // p1==1 && p2==2 && p3==3
+ }
+};
+
+
+int main()
+ try
+{
+ {
+ puts("(p1 > 3) && ((p2 & 1) == 0)");
+ Code1 c;
+ auto f = c.getCode<int (*)(int, int)>();
+ for (int p1 = 2; p1 < 5; p1++) {
+ for (int p2 = 0; p2 < 3; p2++) {
+ printf("p1=%d p2=%d ret=%d (%d)\n", p1, p2, f(p1, p2), p1 > 3 && ((p2&1) == 0));
+ }
+ }
+ }
+ {
+ puts("p1 == 1 && p2 == 2 && p3 == 3");
+ Code2 c;
+ auto f = c.getCode<int (*)(int, int, int)>();
+ for (int p1 = 0; p1 < 3; p1++) {
+ for (int p2 = 1; p2 < 4; p2++) {
+ for (int p3 = 2; p3 < 5; p3++) {
+ printf("p1=%d p2=%d p3=%d ret=%d (%d)\n", p1, p2, p3, f(p1, p2, p3), p1==1 && p2==2 && p3==3);
+ }
+ }
+ }
+ }
+} catch (std::exception& e) {
+ printf("ERR %s\n", e.what());
+}