Advertisement
Guest User

bug181 in DMD 2.0.66.1

a guest
Dec 26th, 2014
233
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
D 1.63 KB | None | 0 0
  1. /* Test program for Digital Mars D (DMD)
  2. ** which shows that it has some sort of bug.
  3. */
  4.  
  5. import std.stdio;
  6.  
  7. char filter(uint i) {
  8.     enum bloop = '#'; // traditional substitute for non-printable (hak tradition)
  9.     enum bleck = '.'; // for zero as it is null and not "bloop", but non-printable
  10.    
  11.     i = i & 0x7f;
  12.     if (i == 0)
  13.         return bleck;
  14.     if (i < 32)
  15.         return bloop;
  16.     else
  17.         return cast(char)i;
  18. }
  19.  
  20. string ex_18_1b() {
  21.     string textReturned;
  22.     uint r[3];
  23.    
  24.     uint r1, r2, r3; // NOTE: needed for a workaround of an apparent bug!
  25.     asm {
  26.         mov EAX, 0;
  27.         cpuid;
  28.         mov r1, EBX;
  29.         mov r2, EDX;
  30.         mov r3, ECX;
  31.     }  
  32.     r[0] = r1;
  33.     r[1] = r2;
  34.     r[2] = r3;
  35.    
  36.     textReturned = decode(r, 3);
  37.  
  38.     return textReturned;
  39. }
  40.  
  41. string decode(uint[] r, int n) {
  42.     uint wrd;  
  43.     int y, x;
  44.     string textReturned;
  45.    
  46.     bool verbose = true; // NOTE: just to make the bug transparent.
  47.    
  48.     for (y = 0; y < n; y++) {
  49.         wrd = r[y];
  50.         if (verbose)
  51.             writefln("\tword[%d]:0x%x", y, wrd);
  52.         for (x = 0; x < 4; x++) {
  53.             textReturned ~= filter(wrd);
  54.             wrd >>= 8;
  55.         }
  56.     }
  57.    
  58.     return textReturned;
  59. }
  60.  
  61. string ex_18_1() {
  62.     string textReturned;
  63.    
  64.     uint r[3];
  65.    
  66.     asm {
  67.         mov EAX, 0;
  68.         cpuid;
  69.         mov r[0], EBX;
  70.         mov r[1], EDX;
  71.         mov r[2], ECX;
  72.     }
  73.    
  74.     textReturned = decode(r, 3);
  75.    
  76.     return textReturned;
  77. }
  78.  
  79. void main()
  80. {
  81.     writefln("Temporary D test program by \"K1pp\".");
  82.     writefln("\tBased on Ex.18-1 in Brey's old book.");
  83.     writefln("This illustrates an annoying DMD bug, or something.\n");
  84.  
  85.     writefln("CPUID based on Ex 18-1:\n\t\"%s\".\n", ex_18_1() );
  86.     writefln("CPUID based on Ex 18-1, variant 'b':\n\t\"%s\".\n", ex_18_1b() );
  87. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement