1a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes#include <stdio.h>
2a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes#include <stdlib.h>
3a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughestypedef unsigned long long int ULong;
4a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes
5a0664b9ca67b594bd6f570a61d3301167a24750cElliott HughesULong data;
6a0664b9ca67b594bd6f570a61d3301167a24750cElliott HughesULong result;
7a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes
8a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes
9a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughesextern void shrl32_with_0x10 ( void );
10a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughesasm("\n"
11a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes"shrl32_with_0x10:\n"
12a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes"\tpushq %rdx\n"
13a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes"\tmovq data, %rdx\n"
14a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes"\tshr $0x10, %edx\n"
15a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes"\tjne shrl32_with_0x10_jump\n"
16a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes"\tshrl32_with_0x10_cont:\n"
17a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes"\tmovq %rdx, result\n"
18a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes"\tpopq %rdx\n"
19a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes"\tret\n"
20a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes"\tshrl32_with_0x10_jump:\n"
21a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes"\tmov $0xdeaddead, %edx\n"
22a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes"\tjmp shrl32_with_0x10_cont\n"
23a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes);
24a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes
25a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes
26a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughesint main ( void )
27a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes{
28a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes  char *p;
29a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes
30a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes  printf("\nshrl 0x10 with unitialised bits\n");
31a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes  ULong *notinitialised = malloc(sizeof(ULong)); // Not initialised data.
32a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes  data = *notinitialised;
33a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes  p = (char*) &data;
34a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes  p[0] = 0x11;
35a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes  // p[1] = 0x22;
36a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes  p[2] = 0x33;
37a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes  p[3] = 0x44;
38a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes
39a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes  shrl32_with_0x10();
40a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes
41a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes  printf("non zero jump on p[2..3] 0x%016llx\n", result);
42a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes
43a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes  data = *notinitialised;
44a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes  p = (char*) &data;
45a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes  p[0] = 0x00;
46a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes  // p[1] = 0x00;
47a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes  p[2] = 0x00;
48a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes  p[3] = 0x00;
49a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes
50a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes  shrl32_with_0x10();
51a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes
52a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes  printf("zero jump on p[2..3] 0x%016llx\n", result);
53a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes  return 0;
54a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes}
55