Guest User

Untitled

a guest
Oct 6th, 2014
262
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 1.42 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdint.h>
  3. #include <stdlib.h>
  4. #include <string.h>
  5.  
  6. void
  7. memset1(void *d, uint32_t p, size_t n)
  8. {
  9.         size_t i;
  10.         uint32_t *ptr = (uint32_t *)d;
  11.  
  12.         for (i=0; i<n; i++) {
  13.                 ptr[i] = p;
  14.         }
  15. }
  16.  
  17. void
  18. memset2(void *d, uint32_t p, size_t n)
  19. {
  20.         memset(d, p, n*sizeof(uint32_t));
  21. }
  22.  
  23. void
  24. memset3(void *d, uint32_t p, size_t n)
  25. {
  26.         asm volatile (
  27.                 "cld\n\t"
  28.                 "rep stosl"
  29.                 : "+D" (d), "+c" (n)
  30.                 : "a" (p)
  31.                 : "memory");
  32. }
  33.  
  34. void
  35. memset4(void *start, uint32_t colour, size_t count)
  36. {
  37.  
  38.     asm volatile(
  39.         "cld\n\t"
  40.         "rep\n\t"
  41.         "stosl"
  42.         : /* no output registers */
  43.         : "c" (count), "a" (colour), "D" (start));
  44. }
  45.  
  46. int
  47. main()
  48. {
  49.         uint32_t *data;
  50.         size_t i, n = 1024*1024;
  51.         uint32_t fill = 0xdeadbeaf;
  52.  
  53.         data = malloc(n*sizeof(uint32_t));
  54.  
  55.         for (i=0; i<1000; i++) {
  56.                 /*memset1(data, fill, n);*/
  57.                 /*memset2(data, fill, n);*/
  58.                 /*memset3(data, fill, n);*/
  59.                 memset4(data, fill, n);
  60.         }
  61.  
  62.         for (i=0; i<n; i++) {
  63.                 if (data[i] != fill) {
  64.                         printf("error! %x at %u\n", data[i], i);
  65.                         break;
  66.                 }
  67.         }
  68.  
  69.         free(data);
  70.         return 0;
  71. }
Advertisement
Add Comment
Please, Sign In to add comment