shrld.c

来自「The Valgrind distribution has multiple t」· C语言 代码 · 共 248 行

C
248
字号
#include <stdio.h>typedef unsigned long long int ULong;ULong data;ULong xtra;ULong amt;ULong flags_in;ULong result;ULong flags_out;#define AMD64G_CC_SHIFT_O   11#define AMD64G_CC_SHIFT_S   7#define AMD64G_CC_SHIFT_Z   6#define AMD64G_CC_SHIFT_A   4#define AMD64G_CC_SHIFT_C   0#define AMD64G_CC_SHIFT_P   2#define AMD64G_CC_MASK_O    (1 << AMD64G_CC_SHIFT_O)#define AMD64G_CC_MASK_S    (1 << AMD64G_CC_SHIFT_S)#define AMD64G_CC_MASK_Z    (1 << AMD64G_CC_SHIFT_Z)#define AMD64G_CC_MASK_A    (1 << AMD64G_CC_SHIFT_A)#define AMD64G_CC_MASK_C    (1 << AMD64G_CC_SHIFT_C)#define AMD64G_CC_MASK_P    (1 << AMD64G_CC_SHIFT_P)#define MASK_OSZACP  \   (AMD64G_CC_MASK_O | AMD64G_CC_MASK_S | AMD64G_CC_MASK_Z \    | AMD64G_CC_MASK_A | AMD64G_CC_MASK_C | AMD64G_CC_MASK_P)extern void shld64 ( void );asm("\n""shld64:\n""\tpushq %rsi\n""\tpushq %r11\n""\tpushq %rcx\n""\tmovq data, %rsi\n""\tmovq xtra, %r11\n""\tmovq amt, %rcx\n""\tpushq flags_in\n""\tpopfq\n""\tshldq %cl, %r11, %rsi\n""\tmovq %rsi, result\n""\tpushfq\n""\tpopq flags_out\n""\tpopq %rcx\n""\tpopq %r11\n""\tpopq %rsi\n""\tret\n");extern void shld32 ( void );asm("\n""shld32:\n""\tpushq %rsi\n""\tpushq %r11\n""\tpushq %rcx\n""\tmovq data, %rsi\n""\tmovq xtra, %r11\n""\tmovq amt, %rcx\n""\tpushq flags_in\n""\tpopfq\n""\tshldl %cl, %r11d, %esi\n""\tmovq %rsi, result\n""\tpushfq\n""\tpopq flags_out\n""\tpopq %rcx\n""\tpopq %r11\n""\tpopq %rsi\n""\tret\n");extern void shld16 ( void );asm("\n""shld16:\n""\tpushq %rsi\n""\tpushq %r11\n""\tpushq %rcx\n""\tmovq data, %rsi\n""\tmovq xtra, %r11\n""\tmovq amt, %rcx\n""\tpushq flags_in\n""\tpopfq\n""\tshldw %cl, %r11w, %si\n""\tmovq %rsi, result\n""\tpushfq\n""\tpopq flags_out\n""\tpopq %rcx\n""\tpopq %r11\n""\tpopq %rsi\n""\tret\n");extern void shrd64 ( void );asm("\n""shrd64:\n""\tpushq %rsi\n""\tpushq %r11\n""\tpushq %rcx\n""\tmovq data, %rsi\n""\tmovq xtra, %r11\n""\tmovq amt, %rcx\n""\tpushq flags_in\n""\tpopfq\n""\tshrdq %cl, %r11, %rsi\n""\tmovq %rsi, result\n""\tpushfq\n""\tpopq flags_out\n""\tpopq %rcx\n""\tpopq %r11\n""\tpopq %rsi\n""\tret\n");extern void shrd32 ( void );asm("\n""shrd32:\n""\tpushq %rsi\n""\tpushq %r11\n""\tpushq %rcx\n""\tmovq data, %rsi\n""\tmovq xtra, %r11\n""\tmovq amt, %rcx\n""\tpushq flags_in\n""\tpopfq\n""\tshrdl %cl, %r11d, %esi\n""\tmovq %rsi, result\n""\tpushfq\n""\tpopq flags_out\n""\tpopq %rcx\n""\tpopq %r11\n""\tpopq %rsi\n""\tret\n");extern void shrd16 ( void );asm("\n""shrd16:\n""\tpushq %rsi\n""\tpushq %r11\n""\tpushq %rcx\n""\tmovq data, %rsi\n""\tmovq xtra, %r11\n""\tmovq amt, %rcx\n""\tpushq flags_in\n""\tpopfq\n""\tshrdw %cl, %r11w, %si\n""\tmovq %rsi, result\n""\tpushfq\n""\tpopq flags_out\n""\tpopq %rcx\n""\tpopq %r11\n""\tpopq %rsi\n""\tret\n");int main ( void ){  int i;  ULong mask;  printf("\nleft 64\n");  for (i = 0; i < 260; i++) {    mask = MASK_OSZACP;    if (i > 1) mask &= ~AMD64G_CC_MASK_O;    if (i > 0) mask &= ~AMD64G_CC_MASK_A;    data = 0x1122334455667788ULL;    xtra = 0x3141592727182818ULL;    flags_in = 0ULL;    amt = (ULong)i;    shld64();    printf("%3d 0x%016llx 0x%llx\n", i, result, flags_out & mask);  }  printf("\nleft 32\n");  for (i = 0; i < 260; i++) {    mask = MASK_OSZACP;    if (i > 1) mask &= ~AMD64G_CC_MASK_O;    if (i > 0) mask &= ~AMD64G_CC_MASK_A;    data = 0x1122334455667788ULL;    xtra = 0x3141592727182818ULL;    flags_in = 0ULL;    amt = (ULong)i;    shld32();    printf("%3d 0x%016llx 0x%llx\n", i, result, flags_out & mask);  }  printf("\n");  printf("\nleft 16\n");  for (i = 0; i < 260; i++) {    mask = MASK_OSZACP;    if (i > 1) mask &= ~AMD64G_CC_MASK_O;    if (i > 0) mask &= ~AMD64G_CC_MASK_A;    data = 0x1122334455667788ULL;    xtra = 0x987654321987abcdULL;    flags_in = 0ULL;    amt = (ULong)i;    shld16();    printf("%3d 0x%016llx 0x%llx\n", i, result, flags_out & mask);  }  printf("\n");  printf("\nright 64\n");  for (i = 0; i < 260; i++) {    mask = MASK_OSZACP;    if (i > 1) mask &= ~AMD64G_CC_MASK_O;    if (i > 0) mask &= ~AMD64G_CC_MASK_A;    data = 0x1122334455667788ULL;    xtra = 0x3141592727182818ULL;    flags_in = 0ULL;    amt = (ULong)i;    shrd64();    printf("%3d 0x%016llx 0x%llx\n", i, result, flags_out & mask);  }  printf("\nright 32\n");  for (i = 0; i < 260; i++) {    mask = MASK_OSZACP;    if (i > 1) mask &= ~AMD64G_CC_MASK_O;    if (i > 0) mask &= ~AMD64G_CC_MASK_A;    data = 0x1122334455667788ULL;    xtra = 0x3141592727182818ULL;    flags_in = 0ULL;    amt = (ULong)i;    shrd32();    printf("%3d 0x%016llx 0x%llx\n", i, result, flags_out & mask);  }  printf("\n");  printf("\nright 16\n");  for (i = 0; i < 260; i++) {    mask = MASK_OSZACP;    if (i > 1) mask &= ~AMD64G_CC_MASK_O;    if (i > 0) mask &= ~AMD64G_CC_MASK_A;    data = 0x1122334455667788ULL;    xtra = 0x987654321987abcdULL;    flags_in = 0ULL;    amt = (ULong)i;    shrd16();    printf("%3d 0x%016llx 0x%llx\n", i, result, flags_out & mask);  }  printf("\n");  return 0;}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?