| /* | |
| An example of T_zu (zero upper) flag | |
| > g++ zero_upper.cpp -I ../xbyak | |
| > sde -future -- ./a.out | |
| */ | |
| #include <stdio.h> | |
| #include <xbyak/xbyak.h> | |
| using namespace Xbyak; | |
| struct Code : Xbyak::CodeGenerator { | |
| Code(int mode) | |
| { | |
| mov(eax, 0x12345678); | |
| cmp(eax, eax); // ZF=1 | |
| switch (mode) { | |
| case 0: // imul | |
| puts("imul"); | |
| imul(ax,ax, 0x1234); | |
| break; | |
| case 1: // imul+zu | |
| puts("imul+zu"); | |
| imul(ax|T_zu, ax, 0x1234); | |
| break; | |
| case 2: // setz | |
| puts("setz"); | |
| setz(al); | |
| break; | |
| case 3: // setz+zu | |
| puts("setz+zu"); | |
| setz(al|T_zu); | |
| break; | |
| } | |
| ret(); | |
| } | |
| }; | |
| int main() | |
| try | |
| { | |
| for (int mode = 0; mode < 4; mode++) { | |
| Code c(mode); | |
| auto f = c.getCode<int (*)()>(); | |
| printf("ret=%08x\n", f()); | |
| } | |
| } catch (std::exception& e) { | |
| printf("ERR %s\n", e.what()); | |
| } |