1436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 2436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#include <stdio.h> 3436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 4436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovtypedef unsigned long long int ULong; 5436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovtypedef unsigned int UInt; 6436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 7436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov__attribute__((noinline)) 8436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovvoid do_andn64 ( /*OUT*/UInt* flags, /*OUT*/ULong* res, ULong arg1, ULong arg2 ) 9436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov{ 10436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ULong tem, flag; 11436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov __asm__ __volatile__( 12436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov "movabsq $0x5555555555555555, %0" "\n\t" 13436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov "andn %2, %3, %0" "\n\t" 14436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov "pushfq" "\n\t" 15436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov "popq %1" "\n" 16436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov : "=&r" (tem), "=r" (flag) : "r" (arg1), "r" (arg2) : "cc" 17436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ); 18436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov *res = tem; 19436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov *flags = flag & 0x8d5; 20436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov __asm__ __volatile__( 21436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov "movabsq $0x5555555555555555, %0" "\n\t" 22436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov "andn %2, %3, %0" "\n\t" 23436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov "pushfq" "\n\t" 24436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov "popq %1" "\n" 25436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov : "=&r" (tem), "=r" (flag) : "m" (arg1), "r" (arg2) : "cc" 26436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ); 27436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov if (*res != tem || *flags != (flag & 0x8d5)) 28436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov printf ("Difference between r and m variants\n"); 29436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov} 30436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 31436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov__attribute__((noinline)) 32436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovvoid do_andn32 ( /*OUT*/UInt* flags, /*OUT*/ULong* res, UInt arg1, UInt arg2 ) 33436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov{ 34436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ULong tem, flag; 35436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov __asm__ __volatile__( 36436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov "movabsq $0x5555555555555555, %0" "\n\t" 37436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov "andn %2, %3, %k0" "\n\t" 38436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov "pushfq" "\n\t" 39436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov "popq %1" "\n" 40436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov : "=&r" (tem), "=r" (flag) : "r" (arg1), "r" (arg2) : "cc" 41436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ); 42436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov *res = tem; 43436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov *flags = flag & 0x8d5; 44436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov __asm__ __volatile__( 45436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov "movabsq $0x5555555555555555, %0" "\n\t" 46436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov "andn %2, %3, %k0" "\n\t" 47436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov "pushfq" "\n\t" 48436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov "popq %1" "\n" 49436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov : "=&r" (tem), "=r" (flag) : "m" (arg1), "r" (arg2) : "cc" 50436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ); 51436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov if (*res != tem || *flags != (flag & 0x8d5)) 52436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov printf ("Difference between r and m variants\n"); 53436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov} 54436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 55436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 56436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov__attribute__((noinline)) 57436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovvoid do_mulx64 ( /*OUT*/ULong* res1, /*OUT*/ULong* res2, 58436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ULong arg1, ULong arg2 ) 59436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov{ 60436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ULong tem1, tem2, flag1, flag2, flag3, flag4; 61436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov __asm__ __volatile__( 62436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov "movabsq $0x5555555555555555, %0" "\n\t" 63436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov "movabsq $0x5555555555555555, %1" "\n\t" 64436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov "movq %4, %%rdx" "\n\t" 65436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov "pushfq" "\n\t" 66436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov "xorq $0x8d5, (%%rsp)" "\n\t" 67436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov "movq (%%rsp), %2" "\n\t" 68436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov "popfq" "\n\t" 69436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov "mulx %5, %1, %0" "\n\t" 70436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov "pushfq" "\n\t" 71436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov "movq (%%rsp), %3" "\n\t" 72436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov "xorq $0x8d5, (%%rsp)" "\n\t" 73436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov "popfq" "\n" 74436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov : "=&r" (tem1), "=&r" (tem2), "=&r" (flag1), "=r" (flag2) 75436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov : "g" (arg1), "r" (arg2) : "cc", "rdx" 76436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ); 77436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov *res1 = tem1; 78436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov *res2 = tem2; 79436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov __asm__ __volatile__( 80436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov "movabsq $0x5555555555555555, %0" "\n\t" 81436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov "movabsq $0x5555555555555555, %1" "\n\t" 82436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov "movq %4, %%rdx" "\n\t" 83436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov "pushfq" "\n\t" 84436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov "popq %2" "\n\t" 85436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov "mulx %5, %1, %0" "\n\t" 86436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov "pushfq" "\n\t" 87436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov "popq %3" "\n" 88436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov : "=&r" (tem1), "=&r" (tem2), "=&r" (flag3), "=r" (flag4) 89436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov : "g" (arg1), "m" (arg2) : "cc", "rdx" 90436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ); 91436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov if (*res1 != tem1 || *res2 != tem2) 92436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov printf ("Difference between r and m variants\n"); 93436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov if (((flag1 ^ flag2) | (flag3 ^ flag4)) & 0x8d5) 94436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov printf ("Flags changed\n"); 95436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov} 96436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 97436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov__attribute__((noinline)) 98436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovvoid do_mulx32 ( /*OUT*/ULong* res1, /*OUT*/ULong* res2, 99436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov UInt arg1, UInt arg2 ) 100436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov{ 101436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ULong tem1, tem2, flag1, flag2, flag3, flag4; 102436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov __asm__ __volatile__( 103436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov "movabsq $0x5555555555555555, %0" "\n\t" 104436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov "movabsq $0x5555555555555555, %1" "\n\t" 105436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov "movl %4, %%edx" "\n\t" 106436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov "pushfq" "\n\t" 107436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov "xorq $0x8d5, (%%rsp)" "\n\t" 108436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov "movq (%%rsp), %2" "\n\t" 109436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov "popfq" "\n\t" 110436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov "mulx %5, %k1, %k0" "\n\t" 111436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov "pushfq" "\n\t" 112436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov "movq (%%rsp), %3" "\n\t" 113436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov "xorq $0x8d5, (%%rsp)" "\n\t" 114436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov "popfq" "\n" 115436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov : "=&r" (tem1), "=&r" (tem2), "=&r" (flag1), "=r" (flag2) 116436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov : "g" (arg1), "r" (arg2) : "cc", "rdx" 117436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ); 118436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov *res1 = tem1; 119436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov *res2 = tem2; 120436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov __asm__ __volatile__( 121436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov "movabsq $0x5555555555555555, %0" "\n\t" 122436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov "movabsq $0x5555555555555555, %1" "\n\t" 123436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov "movl %4, %%edx" "\n\t" 124436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov "pushfq" "\n\t" 125436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov "popq %2" "\n\t" 126436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov "mulx %5, %k1, %k0" "\n\t" 127436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov "pushfq" "\n\t" 128436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov "popq %3" "\n" 129436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov : "=&r" (tem1), "=&r" (tem2), "=&r" (flag3), "=r" (flag4) 130436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov : "g" (arg1), "m" (arg2) : "cc", "rdx" 131436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ); 132436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov if (*res1 != tem1 || *res2 != tem2) 133436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov printf ("Difference between r and m variants\n"); 134436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov if (((flag1 ^ flag2) | (flag3 ^ flag4)) & 0x8d5) 135436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov printf ("Flags changed\n"); 136436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov} 137436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 138436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 139436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov__attribute__((noinline)) 140436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovvoid do_sarx64 ( /*OUT*/ULong* res, ULong arg1, ULong arg2 ) 141436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov{ 142436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ULong tem, flag1, flag2, flag3, flag4; 143436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov __asm__ __volatile__( 144436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov "movabsq $0x5555555555555555, %0" "\n\t" 145436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov "pushfq" "\n\t" 146436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov "xorq $0x8d5, (%%rsp)" "\n\t" 147436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov "movq (%%rsp), %1" "\n\t" 148436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov "popfq" "\n\t" 149436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov "sarx %3, %4, %0" "\n\t" 150436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov "pushfq" "\n\t" 151436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov "movq (%%rsp), %2" "\n\t" 152436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov "xorq $0x8d5, (%%rsp)" "\n\t" 153436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov "popfq" "\n" 154436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov : "=&r" (tem), "=&r" (flag1), "=r" (flag2) 155436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov : "r" (arg1), "r" (arg2) : "cc" 156436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ); 157436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov *res = tem; 158436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov __asm__ __volatile__( 159436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov "movabsq $0x5555555555555555, %0" "\n\t" 160436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov "pushfq" "\n\t" 161436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov "xorq $0x8d5, (%%rsp)" "\n\t" 162436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov "movq (%%rsp), %1" "\n\t" 163436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov "popfq" "\n\t" 164436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov "sarx %3, %4, %0" "\n\t" 165436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov "pushfq" "\n\t" 166436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov "movq (%%rsp), %2" "\n\t" 167436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov "xorq $0x8d5, (%%rsp)" "\n\t" 168436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov "popfq" "\n" 169436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov : "=&r" (tem), "=&r" (flag3), "=r" (flag4) 170436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov : "r" (arg1), "m" (arg2) : "cc" 171436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ); 172436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov if (*res != tem) 173436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov printf ("Difference between r and m variants\n"); 174436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov if (((flag1 ^ flag2) | (flag3 ^ flag4)) & 0x8d5) 175436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov printf ("Flags changed\n"); 176436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov} 177436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 178436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov__attribute__((noinline)) 179436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovvoid do_sarx32 ( /*OUT*/ULong* res, UInt arg1, UInt arg2 ) 180436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov{ 181436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ULong tem, flag1, flag2, flag3, flag4; 182436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov __asm__ __volatile__( 183436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov "movabsq $0x5555555555555555, %0" "\n\t" 184436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov "pushfq" "\n\t" 185436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov "xorq $0x8d5, (%%rsp)" "\n\t" 186436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov "movq (%%rsp), %1" "\n\t" 187436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov "popfq" "\n\t" 188436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov "sarx %3, %4, %k0" "\n\t" 189436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov "pushfq" "\n\t" 190436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov "movq (%%rsp), %2" "\n\t" 191436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov "xorq $0x8d5, (%%rsp)" "\n\t" 192436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov "popfq" "\n" 193436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov : "=&r" (tem), "=&r" (flag1), "=r" (flag2) 194436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov : "r" (arg1), "r" (arg2) : "cc" 195436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ); 196436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov *res = tem; 197436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov __asm__ __volatile__( 198436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov "movabsq $0x5555555555555555, %0" "\n\t" 199436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov "pushfq" "\n\t" 200436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov "xorq $0x8d5, (%%rsp)" "\n\t" 201436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov "movq (%%rsp), %1" "\n\t" 202436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov "popfq" "\n\t" 203436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov "sarx %3, %4, %k0" "\n\t" 204436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov "pushfq" "\n\t" 205436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov "movq (%%rsp), %2" "\n\t" 206436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov "xorq $0x8d5, (%%rsp)" "\n\t" 207436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov "popfq" "\n" 208436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov : "=&r" (tem), "=&r" (flag3), "=r" (flag4) 209436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov : "r" (arg1), "m" (arg2) : "cc" 210436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ); 211436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov if (*res != tem) 212436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov printf ("Difference between r and m variants\n"); 213436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov if (((flag1 ^ flag2) | (flag3 ^ flag4)) & 0x8d5) 214436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov printf ("Flags changed\n"); 215436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov} 216436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 217436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 218436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov__attribute__((noinline)) 219436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovvoid do_shlx64 ( /*OUT*/ULong* res, ULong arg1, ULong arg2 ) 220436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov{ 221436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ULong tem, flag1, flag2, flag3, flag4; 222436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov __asm__ __volatile__( 223436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov "movabsq $0x5555555555555555, %0" "\n\t" 224436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov "pushfq" "\n\t" 225436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov "xorq $0x8d5, (%%rsp)" "\n\t" 226436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov "movq (%%rsp), %1" "\n\t" 227436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov "popfq" "\n\t" 228436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov "shlx %3, %4, %0" "\n\t" 229436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov "pushfq" "\n\t" 230436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov "movq (%%rsp), %2" "\n\t" 231436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov "xorq $0x8d5, (%%rsp)" "\n\t" 232436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov "popfq" "\n" 233436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov : "=&r" (tem), "=&r" (flag1), "=r" (flag2) 234436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov : "r" (arg1), "r" (arg2) : "cc" 235436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ); 236436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov *res = tem; 237436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov __asm__ __volatile__( 238436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov "movabsq $0x5555555555555555, %0" "\n\t" 239436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov "pushfq" "\n\t" 240436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov "xorq $0x8d5, (%%rsp)" "\n\t" 241436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov "movq (%%rsp), %1" "\n\t" 242436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov "popfq" "\n\t" 243436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov "shlx %3, %4, %0" "\n\t" 244436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov "pushfq" "\n\t" 245436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov "movq (%%rsp), %2" "\n\t" 246436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov "xorq $0x8d5, (%%rsp)" "\n\t" 247436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov "popfq" "\n" 248436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov : "=&r" (tem), "=&r" (flag3), "=r" (flag4) 249436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov : "r" (arg1), "m" (arg2) : "cc" 250436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ); 251436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov if (*res != tem) 252436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov printf ("Difference between r and m variants\n"); 253436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov if (((flag1 ^ flag2) | (flag3 ^ flag4)) & 0x8d5) 254436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov printf ("Flags changed\n"); 255436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov} 256436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 257436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov__attribute__((noinline)) 258436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovvoid do_shlx32 ( /*OUT*/ULong* res, UInt arg1, UInt arg2 ) 259436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov{ 260436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ULong tem, flag1, flag2, flag3, flag4; 261436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov __asm__ __volatile__( 262436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov "movabsq $0x5555555555555555, %0" "\n\t" 263436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov "pushfq" "\n\t" 264436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov "xorq $0x8d5, (%%rsp)" "\n\t" 265436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov "movq (%%rsp), %1" "\n\t" 266436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov "popfq" "\n\t" 267436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov "shlx %3, %4, %k0" "\n\t" 268436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov "pushfq" "\n\t" 269436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov "movq (%%rsp), %2" "\n\t" 270436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov "xorq $0x8d5, (%%rsp)" "\n\t" 271436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov "popfq" "\n" 272436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov : "=&r" (tem), "=&r" (flag1), "=r" (flag2) 273436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov : "r" (arg1), "r" (arg2) : "cc" 274436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ); 275436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov *res = tem; 276436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov __asm__ __volatile__( 277436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov "movabsq $0x5555555555555555, %0" "\n\t" 278436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov "pushfq" "\n\t" 279436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov "xorq $0x8d5, (%%rsp)" "\n\t" 280436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov "movq (%%rsp), %1" "\n\t" 281436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov "popfq" "\n\t" 282436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov "shlx %3, %4, %k0" "\n\t" 283436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov "pushfq" "\n\t" 284436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov "movq (%%rsp), %2" "\n\t" 285436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov "xorq $0x8d5, (%%rsp)" "\n\t" 286436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov "popfq" "\n" 287436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov : "=&r" (tem), "=&r" (flag3), "=r" (flag4) 288436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov : "r" (arg1), "m" (arg2) : "cc" 289436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ); 290436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov if (*res != tem) 291436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov printf ("Difference between r and m variants\n"); 292436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov if (((flag1 ^ flag2) | (flag3 ^ flag4)) & 0x8d5) 293436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov printf ("Flags changed\n"); 294436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov} 295436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 296436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 297436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov__attribute__((noinline)) 298436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovvoid do_shrx64 ( /*OUT*/ULong* res, ULong arg1, ULong arg2 ) 299436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov{ 300436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ULong tem, flag1, flag2, flag3, flag4; 301436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov __asm__ __volatile__( 302436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov "movabsq $0x5555555555555555, %0" "\n\t" 303436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov "pushfq" "\n\t" 304436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov "xorq $0x8d5, (%%rsp)" "\n\t" 305436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov "movq (%%rsp), %1" "\n\t" 306436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov "popfq" "\n\t" 307436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov "shrx %3, %4, %0" "\n\t" 308436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov "pushfq" "\n\t" 309436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov "movq (%%rsp), %2" "\n\t" 310436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov "xorq $0x8d5, (%%rsp)" "\n\t" 311436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov "popfq" "\n" 312436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov : "=&r" (tem), "=&r" (flag1), "=r" (flag2) 313436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov : "r" (arg1), "r" (arg2) : "cc" 314436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ); 315436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov *res = tem; 316436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov __asm__ __volatile__( 317436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov "movabsq $0x5555555555555555, %0" "\n\t" 318436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov "pushfq" "\n\t" 319436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov "xorq $0x8d5, (%%rsp)" "\n\t" 320436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov "movq (%%rsp), %1" "\n\t" 321436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov "popfq" "\n\t" 322436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov "shrx %3, %4, %0" "\n\t" 323436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov "pushfq" "\n\t" 324436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov "movq (%%rsp), %2" "\n\t" 325436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov "xorq $0x8d5, (%%rsp)" "\n\t" 326436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov "popfq" "\n" 327436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov : "=&r" (tem), "=&r" (flag3), "=r" (flag4) 328436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov : "r" (arg1), "m" (arg2) : "cc" 329436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ); 330436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov if (*res != tem) 331436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov printf ("Difference between r and m variants\n"); 332436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov if (((flag1 ^ flag2) | (flag3 ^ flag4)) & 0x8d5) 333436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov printf ("Flags changed\n"); 334436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov} 335436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 336436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov__attribute__((noinline)) 337436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovvoid do_shrx32 ( /*OUT*/ULong* res, UInt arg1, UInt arg2 ) 338436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov{ 339436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ULong tem, flag1, flag2, flag3, flag4; 340436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov __asm__ __volatile__( 341436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov "movabsq $0x5555555555555555, %0" "\n\t" 342436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov "pushfq" "\n\t" 343436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov "xorq $0x8d5, (%%rsp)" "\n\t" 344436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov "movq (%%rsp), %1" "\n\t" 345436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov "popfq" "\n\t" 346436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov "shrx %3, %4, %k0" "\n\t" 347436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov "pushfq" "\n\t" 348436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov "movq (%%rsp), %2" "\n\t" 349436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov "xorq $0x8d5, (%%rsp)" "\n\t" 350436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov "popfq" "\n" 351436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov : "=&r" (tem), "=&r" (flag1), "=r" (flag2) 352436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov : "r" (arg1), "r" (arg2) : "cc" 353436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ); 354436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov *res = tem; 355436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov __asm__ __volatile__( 356436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov "movabsq $0x5555555555555555, %0" "\n\t" 357436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov "pushfq" "\n\t" 358436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov "xorq $0x8d5, (%%rsp)" "\n\t" 359436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov "movq (%%rsp), %1" "\n\t" 360436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov "popfq" "\n\t" 361436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov "shrx %3, %4, %k0" "\n\t" 362436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov "pushfq" "\n\t" 363436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov "movq (%%rsp), %2" "\n\t" 364436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov "xorq $0x8d5, (%%rsp)" "\n\t" 365436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov "popfq" "\n" 366436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov : "=&r" (tem), "=&r" (flag3), "=r" (flag4) 367436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov : "r" (arg1), "m" (arg2) : "cc" 368436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ); 369436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov if (*res != tem) 370436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov printf ("Difference between r and m variants\n"); 371436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov if (((flag1 ^ flag2) | (flag3 ^ flag4)) & 0x8d5) 372436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov printf ("Flags changed\n"); 373436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov} 374436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 375436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 376436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov__attribute__((noinline)) 377436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovvoid do_rorx64 ( /*OUT*/ULong* res1, /*OUT*/ULong* res2, ULong arg ) 378436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov{ 379436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ULong tem, flag1, flag2, flag3, flag4; 380436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov __asm__ __volatile__( 381436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov "movabsq $0x5555555555555555, %0" "\n\t" 382436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov "pushfq" "\n\t" 383436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov "xorq $0x8d5, (%%rsp)" "\n\t" 384436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov "movq (%%rsp), %1" "\n\t" 385436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov "popfq" "\n\t" 386436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov "rorx $12, %3, %0" "\n\t" 387436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov "pushfq" "\n\t" 388436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov "movq (%%rsp), %2" "\n\t" 389436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov "xorq $0x8d5, (%%rsp)" "\n\t" 390436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov "popfq" "\n" 391436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov : "=&r" (tem), "=&r" (flag1), "=r" (flag2) : "r" (arg) : "cc" 392436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ); 393436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov *res1 = tem; 394436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov __asm__ __volatile__( 395436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov "movabsq $0x5555555555555555, %0" "\n\t" 396436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov "pushfq" "\n\t" 397436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov "xorq $0x8d5, (%%rsp)" "\n\t" 398436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov "movq (%%rsp), %1" "\n\t" 399436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov "popfq" "\n\t" 400436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov "rorx $67, %3, %0" "\n\t" 401436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov "pushfq" "\n\t" 402436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov "movq (%%rsp), %2" "\n\t" 403436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov "xorq $0x8d5, (%%rsp)" "\n\t" 404436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov "popfq" "\n" 405436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov : "=&r" (tem), "=&r" (flag3), "=r" (flag4) : "m" (arg) : "cc" 406436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ); 407436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov *res2 = tem; 408436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov if (((flag1 ^ flag2) | (flag3 ^ flag4)) & 0x8d5) 409436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov printf ("Flags changed\n"); 410436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov} 411436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 412436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov__attribute__((noinline)) 413436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovvoid do_rorx32 ( /*OUT*/ULong* res1, /*OUT*/ULong* res2, UInt arg ) 414436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov{ 415436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ULong tem, flag1, flag2, flag3, flag4; 416436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov __asm__ __volatile__( 417436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov "movabsq $0x5555555555555555, %0" "\n\t" 418436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov "pushfq" "\n\t" 419436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov "xorq $0x8d5, (%%rsp)" "\n\t" 420436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov "movq (%%rsp), %1" "\n\t" 421436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov "popfq" "\n\t" 422436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov "rorx $12, %3, %k0" "\n\t" 423436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov "pushfq" "\n\t" 424436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov "movq (%%rsp), %2" "\n\t" 425436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov "xorq $0x8d5, (%%rsp)" "\n\t" 426436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov "popfq" "\n" 427436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov : "=&r" (tem), "=&r" (flag1), "=r" (flag2) : "r" (arg) : "cc" 428436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ); 429436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov *res1 = tem; 430436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov __asm__ __volatile__( 431436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov "movabsq $0x5555555555555555, %0" "\n\t" 432436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov "pushfq" "\n\t" 433436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov "xorq $0x8d5, (%%rsp)" "\n\t" 434436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov "movq (%%rsp), %1" "\n\t" 435436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov "popfq" "\n\t" 436436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov "rorx $67, %3, %k0" "\n\t" 437436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov "pushfq" "\n\t" 438436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov "movq (%%rsp), %2" "\n\t" 439436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov "xorq $0x8d5, (%%rsp)" "\n\t" 440436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov "popfq" "\n" 441436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov : "=&r" (tem), "=&r" (flag3), "=r" (flag4) : "m" (arg) : "cc" 442436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ); 443436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov *res2 = tem; 444436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov if (((flag1 ^ flag2) | (flag3 ^ flag4)) & 0x8d5) 445436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov printf ("Flags changed\n"); 446436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov} 447436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 448436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 449436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov__attribute__((noinline)) 450436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovvoid do_blsi64 ( /*OUT*/UInt* flags, /*OUT*/ULong* res, ULong arg ) 451436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov{ 452436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ULong tem, flag; 453436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov __asm__ __volatile__( 454436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov "movabsq $0x5555555555555555, %0" "\n\t" 455436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov "blsi %2, %0" "\n\t" 456436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov "pushfq" "\n\t" 457436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov "popq %1" "\n" 458436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov : "=&r" (tem), "=&r" (flag) : "r" (arg) : "cc" 459436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ); 460436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov *res = tem; 461436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov *flags = flag & 0x8d5; 462436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov __asm__ __volatile__( 463436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov "movabsq $0x5555555555555555, %0" "\n\t" 464436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov "blsi %2, %0" "\n\t" 465436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov "pushfq" "\n\t" 466436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov "popq %1" "\n" 467436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov : "=&r" (tem), "=&r" (flag) : "m" (arg) : "cc" 468436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ); 469436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov if (*res != tem || *flags != (flag & 0x8d5)) 470436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov printf ("Difference between r and m variants\n"); 471436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov} 472436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 473436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov__attribute__((noinline)) 474436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovvoid do_blsi32 ( /*OUT*/UInt* flags, /*OUT*/ULong* res, UInt arg ) 475436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov{ 476436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ULong tem, flag; 477436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov __asm__ __volatile__( 478436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov "movabsq $0x5555555555555555, %0" "\n\t" 479436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov "blsi %2, %k0" "\n\t" 480436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov "pushfq" "\n\t" 481436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov "popq %1" "\n" 482436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov : "=&r" (tem), "=&r" (flag) : "r" (arg) : "cc" 483436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ); 484436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov *res = tem; 485436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov *flags = flag & 0x8d5; 486436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov __asm__ __volatile__( 487436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov "movabsq $0x5555555555555555, %0" "\n\t" 488436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov "blsi %2, %k0" "\n\t" 489436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov "pushfq" "\n\t" 490436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov "popq %1" "\n" 491436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov : "=&r" (tem), "=&r" (flag) : "m" (arg) : "cc" 492436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ); 493436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov if (*res != tem || *flags != (flag & 0x8d5)) 494436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov printf ("Difference between r and m variants\n"); 495436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov} 496436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 497436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 498436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov__attribute__((noinline)) 499436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovvoid do_blsmsk64 ( /*OUT*/UInt* flags, /*OUT*/ULong* res, ULong arg ) 500436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov{ 501436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ULong tem, flag; 502436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov __asm__ __volatile__( 503436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov "movabsq $0x5555555555555555, %0" "\n\t" 504436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov "blsmsk %2, %0" "\n\t" 505436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov "pushfq" "\n\t" 506436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov "popq %1" "\n" 507436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov : "=&r" (tem), "=&r" (flag) : "r" (arg) : "cc" 508436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ); 509436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov *res = tem; 510436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov *flags = flag & 0x8d5; 511436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov __asm__ __volatile__( 512436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov "movabsq $0x5555555555555555, %0" "\n\t" 513436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov "blsmsk %2, %0" "\n\t" 514436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov "pushfq" "\n\t" 515436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov "popq %1" "\n" 516436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov : "=&r" (tem), "=&r" (flag) : "m" (arg) : "cc" 517436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ); 518436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov if (*res != tem || *flags != (flag & 0x8d5)) 519436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov printf ("Difference between r and m variants\n"); 520436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov} 521436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 522436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov__attribute__((noinline)) 523436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovvoid do_blsmsk32 ( /*OUT*/UInt* flags, /*OUT*/ULong* res, UInt arg ) 524436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov{ 525436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ULong tem, flag; 526436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov __asm__ __volatile__( 527436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov "movabsq $0x5555555555555555, %0" "\n\t" 528436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov "blsmsk %2, %k0" "\n\t" 529436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov "pushfq" "\n\t" 530436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov "popq %1" "\n" 531436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov : "=&r" (tem), "=&r" (flag) : "r" (arg) : "cc" 532436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ); 533436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov *res = tem; 534436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov *flags = flag & 0x8d5; 535436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov __asm__ __volatile__( 536436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov "movabsq $0x5555555555555555, %0" "\n\t" 537436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov "blsmsk %2, %k0" "\n\t" 538436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov "pushfq" "\n\t" 539436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov "popq %1" "\n" 540436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov : "=&r" (tem), "=&r" (flag) : "m" (arg) : "cc" 541436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ); 542436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov if (*res != tem || *flags != (flag & 0x8d5)) 543436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov printf ("Difference between r and m variants\n"); 544436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov} 545436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 546436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 547436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov__attribute__((noinline)) 548436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovvoid do_blsr64 ( /*OUT*/UInt* flags, /*OUT*/ULong* res, ULong arg ) 549436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov{ 550436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ULong tem, flag; 551436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov __asm__ __volatile__( 552436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov "movabsq $0x5555555555555555, %0" "\n\t" 553436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov "blsr %2, %0" "\n\t" 554436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov "pushfq" "\n\t" 555436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov "popq %1" "\n" 556436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov : "=&r" (tem), "=&r" (flag) : "r" (arg) : "cc" 557436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ); 558436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov *res = tem; 559436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov *flags = flag & 0x8d5; 560436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov __asm__ __volatile__( 561436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov "movabsq $0x5555555555555555, %0" "\n\t" 562436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov "blsr %2, %0" "\n\t" 563436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov "pushfq" "\n\t" 564436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov "popq %1" "\n" 565436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov : "=&r" (tem), "=&r" (flag) : "m" (arg) : "cc" 566436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ); 567436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov if (*res != tem || *flags != (flag & 0x8d5)) 568436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov printf ("Difference between r and m variants\n"); 569436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov} 570436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 571436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov__attribute__((noinline)) 572436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovvoid do_blsr32 ( /*OUT*/UInt* flags, /*OUT*/ULong* res, UInt arg ) 573436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov{ 574436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ULong tem, flag; 575436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov __asm__ __volatile__( 576436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov "movabsq $0x5555555555555555, %0" "\n\t" 577436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov "blsr %2, %k0" "\n\t" 578436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov "pushfq" "\n\t" 579436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov "popq %1" "\n" 580436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov : "=&r" (tem), "=&r" (flag) : "r" (arg) : "cc" 581436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ); 582436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov *res = tem; 583436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov *flags = flag & 0x8d5; 584436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov __asm__ __volatile__( 585436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov "movabsq $0x5555555555555555, %0" "\n\t" 586436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov "blsr %2, %k0" "\n\t" 587436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov "pushfq" "\n\t" 588436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov "popq %1" "\n" 589436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov : "=&r" (tem), "=&r" (flag) : "m" (arg) : "cc" 590436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ); 591436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov if (*res != tem || *flags != (flag & 0x8d5)) 592436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov printf ("Difference between r and m variants\n"); 593436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov} 594436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 595436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 596436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov__attribute__((noinline)) 597436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovvoid do_bextr64 ( /*OUT*/UInt* flags, /*OUT*/ULong* res, 598436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ULong arg1, ULong arg2 ) 599436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov{ 600436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ULong tem, flag; 601436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov __asm__ __volatile__( 602436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov "movabsq $0x5555555555555555, %0" "\n\t" 603436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov "bextr %2, %3, %0" "\n\t" 604436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov "pushfq" "\n\t" 605436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov "popq %1" "\n" 606436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov : "=&r" (tem), "=&r" (flag) : "r" (arg1), "r" (arg2) : "cc" 607436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ); 608436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov *res = tem; 609436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov *flags = flag & 0x8d5; 610436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov __asm__ __volatile__( 611436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov "movabsq $0x5555555555555555, %0" "\n\t" 612436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov "bextr %2, %3, %0" "\n\t" 613436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov "pushfq" "\n\t" 614436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov "popq %1" "\n" 615436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov : "=&r" (tem), "=&r" (flag) : "r" (arg1), "m" (arg2) : "cc" 616436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ); 617436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov if (*res != tem || *flags != (flag & 0x8d5)) 618436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov printf ("Difference between r and m variants\n"); 619436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov} 620436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 621436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov__attribute__((noinline)) 622436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovvoid do_bextr32 ( /*OUT*/UInt* flags, /*OUT*/ULong* res, 623436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov UInt arg1, UInt arg2 ) 624436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov{ 625436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ULong tem, flag; 626436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov __asm__ __volatile__( 627436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov "movabsq $0x5555555555555555, %0" "\n\t" 628436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov "bextr %2, %3, %k0" "\n\t" 629436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov "pushfq" "\n\t" 630436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov "popq %1" "\n" 631436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov : "=&r" (tem), "=&r" (flag) : "r" (arg1), "r" (arg2) : "cc" 632436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ); 633436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov *res = tem; 634436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov *flags = flag & 0x8d5; 635436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov __asm__ __volatile__( 636436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov "movabsq $0x5555555555555555, %0" "\n\t" 637436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov "bextr %2, %3, %k0" "\n\t" 638436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov "pushfq" "\n\t" 639436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov "popq %1" "\n" 640436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov : "=&r" (tem), "=&r" (flag) : "r" (arg1), "m" (arg2) : "cc" 641436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ); 642436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov if (*res != tem || *flags != (flag & 0x8d5)) 643436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov printf ("Difference between r and m variants\n"); 644436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov} 645436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 646436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 647436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov__attribute__((noinline)) 648436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovvoid do_bzhi64 ( /*OUT*/UInt* flags, /*OUT*/ULong* res, 649436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ULong arg1, ULong arg2 ) 650436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov{ 651436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ULong tem, flag; 652436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov __asm__ __volatile__( 653436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov "movabsq $0x5555555555555555, %0" "\n\t" 654436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov "bzhi %2, %3, %0" "\n\t" 655436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov "pushfq" "\n\t" 656436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov "popq %1" "\n" 657436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov : "=&r" (tem), "=&r" (flag) : "r" (arg1), "r" (arg2) : "cc" 658436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ); 659436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov *res = tem; 660436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov *flags = flag & 0x8d5; 661436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov __asm__ __volatile__( 662436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov "movabsq $0x5555555555555555, %0" "\n\t" 663436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov "bzhi %2, %3, %0" "\n\t" 664436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov "pushfq" "\n\t" 665436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov "popq %1" "\n" 666436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov : "=&r" (tem), "=&r" (flag) : "r" (arg1), "m" (arg2) : "cc" 667436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ); 668436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov if (*res != tem || *flags != (flag & 0x8d5)) 669436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov printf ("Difference between r and m variants\n"); 670436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov} 671436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 672436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov__attribute__((noinline)) 673436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovvoid do_bzhi32 ( /*OUT*/UInt* flags, /*OUT*/ULong* res, 674436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov UInt arg1, UInt arg2 ) 675436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov{ 676436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ULong tem, flag; 677436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov __asm__ __volatile__( 678436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov "movabsq $0x5555555555555555, %0" "\n\t" 679436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov "bzhi %2, %3, %k0" "\n\t" 680436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov "pushfq" "\n\t" 681436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov "popq %1" "\n" 682436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov : "=&r" (tem), "=&r" (flag) : "r" (arg1), "r" (arg2) : "cc" 683436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ); 684436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov *res = tem; 685436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov *flags = flag & 0x8d5; 686436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov __asm__ __volatile__( 687436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov "movabsq $0x5555555555555555, %0" "\n\t" 688436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov "bzhi %2, %3, %k0" "\n\t" 689436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov "pushfq" "\n\t" 690436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov "popq %1" "\n" 691436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov : "=&r" (tem), "=&r" (flag) : "r" (arg1), "m" (arg2) : "cc" 692436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ); 693436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov if (*res != tem || *flags != (flag & 0x8d5)) 694436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov printf ("Difference between r and m variants\n"); 695436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov} 696436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 697436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 698436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov__attribute__((noinline)) 699436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovvoid do_pdep64 ( /*OUT*/ULong* res, ULong arg1, ULong arg2 ) 700436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov{ 701436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ULong tem, flag1, flag2, flag3, flag4; 702436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov __asm__ __volatile__( 703436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov "movabsq $0x5555555555555555, %0" "\n\t" 704436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov "pushfq" "\n\t" 705436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov "xorq $0x8d5, (%%rsp)" "\n\t" 706436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov "movq (%%rsp), %1" "\n\t" 707436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov "popfq" "\n\t" 708436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov "pdep %3, %4, %0" "\n\t" 709436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov "pushfq" "\n\t" 710436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov "movq (%%rsp), %2" "\n\t" 711436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov "xorq $0x8d5, (%%rsp)" "\n\t" 712436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov "popfq" "\n" 713436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov : "=&r" (tem), "=&r" (flag1), "=r" (flag2) 714436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov : "r" (arg1), "r" (arg2) : "cc" 715436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ); 716436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov *res = tem; 717436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov __asm__ __volatile__( 718436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov "movabsq $0x5555555555555555, %0" "\n\t" 719436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov "pushfq" "\n\t" 720436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov "xorq $0x8d5, (%%rsp)" "\n\t" 721436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov "movq (%%rsp), %1" "\n\t" 722436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov "popfq" "\n\t" 723436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov "pdep %3, %4, %0" "\n\t" 724436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov "pushfq" "\n\t" 725436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov "movq (%%rsp), %2" "\n\t" 726436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov "xorq $0x8d5, (%%rsp)" "\n\t" 727436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov "popfq" "\n" 728436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov : "=&r" (tem), "=&r" (flag3), "=r" (flag4) 729436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov : "m" (arg1), "r" (arg2) : "cc" 730436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ); 731436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov if (*res != tem) 732436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov printf ("Difference between r and m variants\n"); 733436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov if (((flag1 ^ flag2) | (flag3 ^ flag4)) & 0x8d5) 734436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov printf ("Flags changed\n"); 735436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov} 736436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 737436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov__attribute__((noinline)) 738436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovvoid do_pdep32 ( /*OUT*/ULong* res, UInt arg1, UInt arg2 ) 739436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov{ 740436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ULong tem, flag1, flag2, flag3, flag4; 741436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov __asm__ __volatile__( 742436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov "movabsq $0x5555555555555555, %0" "\n\t" 743436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov "pushfq" "\n\t" 744436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov "xorq $0x8d5, (%%rsp)" "\n\t" 745436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov "movq (%%rsp), %1" "\n\t" 746436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov "popfq" "\n\t" 747436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov "pdep %3, %4, %k0" "\n\t" 748436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov "pushfq" "\n\t" 749436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov "movq (%%rsp), %2" "\n\t" 750436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov "xorq $0x8d5, (%%rsp)" "\n\t" 751436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov "popfq" "\n" 752436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov : "=&r" (tem), "=&r" (flag1), "=r" (flag2) 753436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov : "r" (arg1), "r" (arg2) : "cc" 754436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ); 755436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov *res = tem; 756436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov __asm__ __volatile__( 757436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov "movabsq $0x5555555555555555, %0" "\n\t" 758436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov "pushfq" "\n\t" 759436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov "xorq $0x8d5, (%%rsp)" "\n\t" 760436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov "movq (%%rsp), %1" "\n\t" 761436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov "popfq" "\n\t" 762436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov "pdep %3, %4, %k0" "\n\t" 763436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov "pushfq" "\n\t" 764436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov "movq (%%rsp), %2" "\n\t" 765436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov "xorq $0x8d5, (%%rsp)" "\n\t" 766436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov "popfq" "\n" 767436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov : "=&r" (tem), "=&r" (flag3), "=r" (flag4) 768436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov : "m" (arg1), "r" (arg2) : "cc" 769436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ); 770436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov if (*res != tem) 771436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov printf ("Difference between r and m variants\n"); 772436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov if (((flag1 ^ flag2) | (flag3 ^ flag4)) & 0x8d5) 773436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov printf ("Flags changed\n"); 774436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov} 775436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 776436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 777436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov__attribute__((noinline)) 778436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovvoid do_pext64 ( /*OUT*/ULong* res, ULong arg1, ULong arg2 ) 779436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov{ 780436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ULong tem, flag1, flag2, flag3, flag4; 781436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov __asm__ __volatile__( 782436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov "movabsq $0x5555555555555555, %0" "\n\t" 783436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov "pushfq" "\n\t" 784436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov "xorq $0x8d5, (%%rsp)" "\n\t" 785436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov "movq (%%rsp), %1" "\n\t" 786436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov "popfq" "\n\t" 787436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov "pext %3, %4, %0" "\n\t" 788436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov "pushfq" "\n\t" 789436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov "movq (%%rsp), %2" "\n\t" 790436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov "xorq $0x8d5, (%%rsp)" "\n\t" 791436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov "popfq" "\n" 792436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov : "=&r" (tem), "=&r" (flag1), "=r" (flag2) 793436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov : "r" (arg1), "r" (arg2) : "cc" 794436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ); 795436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov *res = tem; 796436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov __asm__ __volatile__( 797436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov "movabsq $0x5555555555555555, %0" "\n\t" 798436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov "pushfq" "\n\t" 799436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov "xorq $0x8d5, (%%rsp)" "\n\t" 800436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov "movq (%%rsp), %1" "\n\t" 801436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov "popfq" "\n\t" 802436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov "pext %3, %4, %0" "\n\t" 803436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov "pushfq" "\n\t" 804436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov "movq (%%rsp), %2" "\n\t" 805436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov "xorq $0x8d5, (%%rsp)" "\n\t" 806436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov "popfq" "\n" 807436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov : "=&r" (tem), "=&r" (flag3), "=r" (flag4) 808436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov : "m" (arg1), "r" (arg2) : "cc" 809436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ); 810436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov if (*res != tem) 811436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov printf ("Difference between r and m variants\n"); 812436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov if (((flag1 ^ flag2) | (flag3 ^ flag4)) & 0x8d5) 813436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov printf ("Flags changed\n"); 814436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov} 815436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 816436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov__attribute__((noinline)) 817436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovvoid do_pext32 ( /*OUT*/ULong* res, UInt arg1, UInt arg2 ) 818436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov{ 819436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ULong tem, flag1, flag2, flag3, flag4; 820436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov __asm__ __volatile__( 821436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov "movabsq $0x5555555555555555, %0" "\n\t" 822436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov "pushfq" "\n\t" 823436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov "xorq $0x8d5, (%%rsp)" "\n\t" 824436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov "movq (%%rsp), %1" "\n\t" 825436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov "popfq" "\n\t" 826436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov "pext %3, %4, %k0" "\n\t" 827436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov "pushfq" "\n\t" 828436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov "movq (%%rsp), %2" "\n\t" 829436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov "xorq $0x8d5, (%%rsp)" "\n\t" 830436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov "popfq" "\n" 831436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov : "=&r" (tem), "=&r" (flag1), "=r" (flag2) 832436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov : "r" (arg1), "r" (arg2) : "cc" 833436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ); 834436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov *res = tem; 835436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov __asm__ __volatile__( 836436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov "movabsq $0x5555555555555555, %0" "\n\t" 837436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov "pushfq" "\n\t" 838436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov "xorq $0x8d5, (%%rsp)" "\n\t" 839436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov "movq (%%rsp), %1" "\n\t" 840436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov "popfq" "\n\t" 841436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov "pext %3, %4, %k0" "\n\t" 842436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov "pushfq" "\n\t" 843436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov "movq (%%rsp), %2" "\n\t" 844436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov "xorq $0x8d5, (%%rsp)" "\n\t" 845436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov "popfq" "\n" 846436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov : "=&r" (tem), "=&r" (flag3), "=r" (flag4) 847436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov : "m" (arg1), "r" (arg2) : "cc" 848436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ); 849436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov if (*res != tem) 850436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov printf ("Difference between r and m variants\n"); 851436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov if (((flag1 ^ flag2) | (flag3 ^ flag4)) & 0x8d5) 852436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov printf ("Flags changed\n"); 853436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov} 854436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 855436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 856436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovint main ( void ) 857436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov{ 858436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ULong w1, w2; 859436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 860436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov w1 = 0xFEDC192837475675ULL; 861436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov w2 = 0x57657438291CDEF0ULL; 862436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov while (1) { 863436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ULong res; 864436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov UInt flags; 865436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov do_andn64(&flags, &res, w1, w2); 866436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov printf("andn64 %016llx %016llx -> %016llx %04x\n", w1, w2, res, flags); 867436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov if (w1 == 0) break; 868436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov w1 = ((w1 >> 2) | (w1 >> 1)) + (w1 / 17ULL); 869436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov w2 = ((w2 >> 2) | (w2 >> 1)) + (w2 / 17ULL); 870436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov } 871436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 872436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov w1 = 0xFEDC192837475675ULL; 873436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov w2 = 0x57657438291CDEF0ULL; 874436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov while (1) { 875436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ULong res; 876436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov UInt flags; 877436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov do_andn32(&flags, &res, w1, w2); 878436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov printf("andn32 %016llx %016llx -> %016llx %04x\n", w1, w2, res, flags); 879436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov if (w1 == 0) break; 880436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov w1 = ((w1 >> 2) | (w1 >> 1)) + (w1 / 17ULL); 881436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov w2 = ((w2 >> 2) | (w2 >> 1)) + (w2 / 17ULL); 882436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov } 883436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 884436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov w1 = 0xFEDC192837475675ULL; 885436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov w2 = 0x57657438291CDEF0ULL; 886436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov while (1) { 887436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ULong res1, res2; 888436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov do_mulx64(&res1, &res2, w1, w2); 889436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov printf("mulx64 %016llx %016llx -> %016llx %016llx\n", w1, w2, res1, res2); 890436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov if (w1 == 0) break; 891436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov w1 = ((w1 >> 2) | (w1 >> 1)) + (w1 / 17ULL); 892436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov w2 = ((w2 >> 2) | (w2 >> 1)) + (w2 / 17ULL); 893436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov } 894436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 895436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov w1 = 0xFEDC192837475675ULL; 896436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov w2 = 0x57657438291CDEF0ULL; 897436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov while (1) { 898436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ULong res1, res2; 899436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov do_mulx32(&res1, &res2, w1, w2); 900436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov printf("mulx32 %016llx %016llx -> %016llx %016llx\n", w1, w2, res1, res2); 901436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov if (w1 == 0) break; 902436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov w1 = ((w1 >> 2) | (w1 >> 1)) + (w1 / 17ULL); 903436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov w2 = ((w2 >> 2) | (w2 >> 1)) + (w2 / 17ULL); 904436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov } 905436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 906436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov w1 = 0xFEDC192837475675ULL; 907436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov w2 = 0x57657438291CDEF0ULL; 908436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov while (1) { 909436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ULong res; 910436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov do_sarx64(&res, w1, w2); 911436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov printf("sarx64 %016llx %016llx -> %016llx\n", w1, w2, res); 912436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov if (w1 == 0) break; 913436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov w1 = ((w1 >> 2) | (w1 >> 1)) + (w1 / 17ULL); 914436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov w2 = ((w2 >> 2) | (w2 >> 1)) + (w2 / 17ULL); 915436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov } 916436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 917436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov w1 = 0xFEDC192837475675ULL; 918436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov w2 = 0x57657438291CDEF0ULL; 919436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov while (1) { 920436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ULong res; 921436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov do_sarx32(&res, w1, w2); 922436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov printf("sarx32 %016llx %016llx -> %016llx\n", w1, w2, res); 923436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov if (w1 == 0) break; 924436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov w1 = ((w1 >> 2) | (w1 >> 1)) + (w1 / 17ULL); 925436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov w2 = ((w2 >> 2) | (w2 >> 1)) + (w2 / 17ULL); 926436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov } 927436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 928436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov w1 = 0xFEDC192837475675ULL; 929436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov w2 = 0x57657438291CDEF0ULL; 930436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov while (1) { 931436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ULong res; 932436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov do_shlx64(&res, w1, w2); 933436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov printf("shlx64 %016llx %016llx -> %016llx\n", w1, w2, res); 934436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov if (w1 == 0) break; 935436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov w1 = ((w1 >> 2) | (w1 >> 1)) + (w1 / 17ULL); 936436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov w2 = ((w2 >> 2) | (w2 >> 1)) + (w2 / 17ULL); 937436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov } 938436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 939436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov w1 = 0xFEDC192837475675ULL; 940436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov w2 = 0x57657438291CDEF0ULL; 941436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov while (1) { 942436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ULong res; 943436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov do_shlx32(&res, w1, w2); 944436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov printf("shlx32 %016llx %016llx -> %016llx\n", w1, w2, res); 945436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov if (w1 == 0) break; 946436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov w1 = ((w1 >> 2) | (w1 >> 1)) + (w1 / 17ULL); 947436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov w2 = ((w2 >> 2) | (w2 >> 1)) + (w2 / 17ULL); 948436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov } 949436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 950436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov w1 = 0xFEDC192837475675ULL; 951436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov w2 = 0x57657438291CDEF0ULL; 952436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov while (1) { 953436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ULong res; 954436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov do_shrx64(&res, w1, w2); 955436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov printf("shrx64 %016llx %016llx -> %016llx\n", w1, w2, res); 956436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov if (w1 == 0) break; 957436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov w1 = ((w1 >> 2) | (w1 >> 1)) + (w1 / 17ULL); 958436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov w2 = ((w2 >> 2) | (w2 >> 1)) + (w2 / 17ULL); 959436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov } 960436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 961436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov w1 = 0xFEDC192837475675ULL; 962436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov w2 = 0x57657438291CDEF0ULL; 963436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov while (1) { 964436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ULong res; 965436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov do_shrx32(&res, w1, w2); 966436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov printf("shrx32 %016llx %016llx -> %016llx\n", w1, w2, res); 967436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov if (w1 == 0) break; 968436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov w1 = ((w1 >> 2) | (w1 >> 1)) + (w1 / 17ULL); 969436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov w2 = ((w2 >> 2) | (w2 >> 1)) + (w2 / 17ULL); 970436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov } 971436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 972436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov w1 = 0xFEDC192837475675ULL; 973436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov while (1) { 974436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ULong res1, res2; 975436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov do_rorx64(&res1, &res2, w1); 976436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov printf("rorx64 %016llx -> %016llx %016llx\n", w1, res1, res2); 977436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov if (w1 == 0) break; 978436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov w1 = ((w1 >> 2) | (w1 >> 1)) + (w1 / 17ULL); 979436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov } 980436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 981436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov w1 = 0xFEDC192837475675ULL; 982436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov while (1) { 983436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ULong res1, res2; 984436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov do_rorx32(&res1, &res2, w1); 985436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov printf("rorx32 %016llx -> %016llx %016llx\n", w1, res1, res2); 986436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov if (w1 == 0) break; 987436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov w1 = ((w1 >> 2) | (w1 >> 1)) + (w1 / 17ULL); 988436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov } 989436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 990436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov w1 = 0xFEDC192837475675ULL; 991436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov while (1) { 992436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ULong res; 993436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov UInt flags; 994436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov do_blsi64(&flags, &res, w1); 995436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov printf("blsi64 %016llx -> %016llx %04x\n", w1, res, flags); 996436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov if (w1 == 0) break; 997436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov w1 = ((w1 >> 2) | (w1 >> 1)) + (w1 / 17ULL); 998436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov } 999436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 1000436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov w1 = 0xFEDC192837475675ULL; 1001436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov while (1) { 1002436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ULong res; 1003436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov UInt flags; 1004436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov do_blsi32(&flags, &res, w1); 1005436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov printf("blsi32 %016llx -> %016llx %04x\n", w1, res, flags); 1006436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov if (w1 == 0) break; 1007436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov w1 = ((w1 >> 2) | (w1 >> 1)) + (w1 / 17ULL); 1008436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov } 1009436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 1010436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov w1 = 0xFEDC192837475675ULL; 1011436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov while (1) { 1012436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ULong res; 1013436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov UInt flags; 1014436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov do_blsmsk64(&flags, &res, w1); 1015436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov printf("blsmsk64 %016llx -> %016llx %04x\n", w1, res, flags); 1016436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov if (w1 == 0) break; 1017436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov w1 = ((w1 >> 2) | (w1 >> 1)) + (w1 / 17ULL); 1018436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov } 1019436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 1020436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov w1 = 0xFEDC192837475675ULL; 1021436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov while (1) { 1022436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ULong res; 1023436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov UInt flags; 1024436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov do_blsmsk32(&flags, &res, w1); 1025436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov printf("blsmsk32 %016llx -> %016llx %04x\n", w1, res, flags); 1026436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov if (w1 == 0) break; 1027436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov w1 = ((w1 >> 2) | (w1 >> 1)) + (w1 / 17ULL); 1028436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov } 1029436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 1030436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov w1 = 0xFEDC192837475675ULL; 1031436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov while (1) { 1032436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ULong res; 1033436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov UInt flags; 1034436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov do_blsr64(&flags, &res, w1); 1035436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov printf("blsr64 %016llx -> %016llx %04x\n", w1, res, flags); 1036436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov if (w1 == 0) break; 1037436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov w1 = ((w1 >> 2) | (w1 >> 1)) + (w1 / 17ULL); 1038436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov } 1039436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 1040436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov w1 = 0xFEDC192837475675ULL; 1041436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov while (1) { 1042436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ULong res; 1043436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov UInt flags; 1044436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov do_blsr32(&flags, &res, w1); 1045436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov printf("blsr32 %016llx -> %016llx %04x\n", w1, res, flags); 1046436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov if (w1 == 0) break; 1047436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov w1 = ((w1 >> 2) | (w1 >> 1)) + (w1 / 17ULL); 1048436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov } 1049436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 1050436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov w1 = 0xFEDC192837475675ULL; 1051436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov w2 = 0x57657438291CDEF0ULL; 1052436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov while (1) { 1053436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ULong res; 1054436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov UInt flags; 1055436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov do_bextr64(&flags, &res, w1, w2); 1056436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov printf("bextr64 %016llx %016llx -> %016llx %04x\n", w1, w2, res, flags); 1057436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov if (w1 == 0) break; 1058436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov w1 = ((w1 >> 2) | (w1 >> 1)) + (w1 / 17ULL); 1059436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov w2 = ((w2 >> 2) | (w2 >> 1)) + (w2 / 17ULL); 1060436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov } 1061436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 1062436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov w1 = 0xFEDC192837475675ULL; 1063436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov w2 = 0x57657438291CDEF0ULL; 1064436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov while (1) { 1065436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ULong res; 1066436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov UInt flags; 1067436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov do_bextr32(&flags, &res, w1, w2); 1068436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov printf("bextr32 %016llx %016llx -> %016llx %04x\n", w1, w2, res, flags); 1069436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov if (w1 == 0) break; 1070436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov w1 = ((w1 >> 2) | (w1 >> 1)) + (w1 / 17ULL); 1071436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov w2 = ((w2 >> 2) | (w2 >> 1)) + (w2 / 17ULL); 1072436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov } 1073436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 1074436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov w1 = 0xFEDC192837475675ULL; 1075436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov w2 = 0x57657438291CDEF0ULL; 1076436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov while (1) { 1077436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ULong res; 1078436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov UInt flags; 1079436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov do_bzhi64(&flags, &res, w1, w2); 1080436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov printf("bzhi64 %016llx %016llx -> %016llx %04x\n", w1, w2, res, flags); 1081436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov if (w1 == 0) break; 1082436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov w1 = ((w1 >> 2) | (w1 >> 1)) + (w1 / 17ULL); 1083436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov w2 = ((w2 >> 2) | (w2 >> 1)) + (w2 / 17ULL); 1084436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov } 1085436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 1086436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov w1 = 0xFEDC192837475675ULL; 1087436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov w2 = 0x57657438291CDEF0ULL; 1088436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov while (1) { 1089436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ULong res; 1090436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov UInt flags; 1091436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov do_bzhi32(&flags, &res, w1, w2); 1092436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov printf("bzhi32 %016llx %016llx -> %016llx %04x\n", w1, w2, res, flags); 1093436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov if (w1 == 0) break; 1094436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov w1 = ((w1 >> 2) | (w1 >> 1)) + (w1 / 17ULL); 1095436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov w2 = ((w2 >> 2) | (w2 >> 1)) + (w2 / 17ULL); 1096436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov } 1097436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 1098436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov w1 = 0xFEDC192837475675ULL; 1099436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov w2 = 0x57657438291CDEF0ULL; 1100436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov while (1) { 1101436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ULong res; 1102436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov do_pdep64(&res, w1, w2); 1103436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov printf("pdep64 %016llx %016llx -> %016llx\n", w1, w2, res); 1104436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov if (w1 == 0) break; 1105436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov w1 = ((w1 >> 2) | (w1 >> 1)) + (w1 / 17ULL); 1106436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov w2 = ((w2 >> 2) | (w2 >> 1)) + (w2 / 17ULL); 1107436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov } 1108436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 1109436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov w1 = 0xFEDC192837475675ULL; 1110436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov w2 = 0x57657438291CDEF0ULL; 1111436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov while (1) { 1112436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ULong res; 1113436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov do_pdep32(&res, w1, w2); 1114436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov printf("pdep32 %016llx %016llx -> %016llx\n", w1, w2, res); 1115436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov if (w1 == 0) break; 1116436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov w1 = ((w1 >> 2) | (w1 >> 1)) + (w1 / 17ULL); 1117436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov w2 = ((w2 >> 2) | (w2 >> 1)) + (w2 / 17ULL); 1118436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov } 1119436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 1120436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov w1 = 0xFEDC192837475675ULL; 1121436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov w2 = 0x57657438291CDEF0ULL; 1122436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov while (1) { 1123436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ULong res; 1124436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov do_pext64(&res, w1, w2); 1125436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov printf("pext64 %016llx %016llx -> %016llx\n", w1, w2, res); 1126436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov if (w1 == 0) break; 1127436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov w1 = ((w1 >> 2) | (w1 >> 1)) + (w1 / 17ULL); 1128436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov w2 = ((w2 >> 2) | (w2 >> 1)) + (w2 / 17ULL); 1129436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov } 1130436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 1131436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov w1 = 0xFEDC192837475675ULL; 1132436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov w2 = 0x57657438291CDEF0ULL; 1133436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov while (1) { 1134436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ULong res; 1135436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov do_pext32(&res, w1, w2); 1136436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov printf("pext32 %016llx %016llx -> %016llx\n", w1, w2, res); 1137436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov if (w1 == 0) break; 1138436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov w1 = ((w1 >> 2) | (w1 >> 1)) + (w1 / 17ULL); 1139436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov w2 = ((w2 >> 2) | (w2 >> 1)) + (w2 / 17ULL); 1140436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov } 1141436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 1142436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov return 0; 1143436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov} 1144