1{ %CPU=x86_64 }
2program tasm18h;
3
4{$asmmode intel}
5{$packrecords 1}
6
7const
8  cval = 1;
9
10type
11  foo = record
12    b1: byte;
13    w: word;
14    b2: byte;
15  end;
16  foo2 = record
17    bb1, bb2: byte;
18  end;
19  foo32 = record
20    b1, b2, b3, b4: byte;
21  end;
22  foo32_2 = record
23    b1: byte;
24    l: longint;
25  end;
26
27const
28  expect1: array [0..$CF] of byte = (
29    $66,$F7,$07,$01,$00,      { TEST    WORD PTR [RDI],0001    }
30    $F6,$07,$01,              { TEST    BYTE PTR [RDI],01      }
31    $66,$F7,$47,$01,$01,$00,  { TEST    WORD PTR [RDI+01],0001 }
32    $F6,$47,$03,$01,          { TEST    BYTE PTR [RDI+03],01   }
33    $66,$F7,$47,$FF,$01,$00,  { TEST    WORD PTR [RDI-01],0001 }
34    $F6,$47,$FD,$01,          { TEST    BYTE PTR [RDI-03],01   }
35    $66,$F7,$47,$04,$01,$00,  { TEST    WORD PTR [RDI+04],0001 }
36    $F6,$47,$04,$01,          { TEST    BYTE PTR [RDI+04],01   }
37
38    $66,$F7,$07,$01,$00,      { TEST    WORD PTR [RDI],0001    }
39    $F6,$07,$01,              { TEST    BYTE PTR [RDI],01      }
40    $66,$F7,$47,$01,$01,$00,  { TEST    WORD PTR [RDI+01],0001 }
41    $F6,$47,$03,$01,          { TEST    BYTE PTR [RDI+03],01   }
42    $66,$F7,$47,$FF,$01,$00,  { TEST    WORD PTR [RDI-01],0001 }
43    $F6,$47,$FD,$01,          { TEST    BYTE PTR [RDI-03],01   }
44    $66,$F7,$47,$04,$01,$00,  { TEST    WORD PTR [RDI+04],0001 }
45    $F6,$47,$04,$01,          { TEST    BYTE PTR [RDI+04],01   }
46
47    $66,$F7,$07,$01,$00,      { TEST    WORD PTR [RDI],0001    }
48    $F6,$07,$01,              { TEST    BYTE PTR [RDI],01      }
49    $66,$F7,$47,$05,$01,$00,  { TEST    WORD PTR [RDI+05],0001 }
50    $F6,$47,$0F,$01,          { TEST    BYTE PTR [RDI+0F],01   }
51    $66,$F7,$47,$FB,$01,$00,  { TEST    WORD PTR [RDI-05],0001 }
52    $F6,$47,$F1,$01,          { TEST    BYTE PTR [RDI-0F],01   }
53    $66,$F7,$47,$12,$01,$00,  { TEST    WORD PTR [RDI+12],0001 }
54    $F6,$47,$0E,$01,          { TEST    BYTE PTR [RDI+0E],01   }
55
56    $F6,$07,$01,              { TEST    BYTE PTR [RDI],01      }
57    $F6,$07,$01,              { TEST    BYTE PTR [RDI],01      }
58    $F6,$47,$01,$01,          { TEST    BYTE PTR [RDI+01],01   }
59    $F6,$47,$03,$01,          { TEST    BYTE PTR [RDI+03],01   }
60    $F6,$47,$FF,$01,          { TEST    BYTE PTR [RDI-01],01   }
61    $F6,$47,$FD,$01,          { TEST    BYTE PTR [RDI-03],01   }
62    $F6,$47,$04,$01,          { TEST    BYTE PTR [RDI+04],01   }
63    $F6,$47,$04,$01,          { TEST    BYTE PTR [RDI+04],01   }
64    $F6,$07,$01,              { TEST    BYTE PTR [RDI],01      }
65    $F6,$47,$01,$01,          { TEST    BYTE PTR [RDI+01],01   }
66
67    $66,$F7,$07,$01,$00,      { TEST    WORD PTR [RDI],0001    }
68    $66,$F7,$07,$01,$00,      { TEST    WORD PTR [RDI],0001    }
69    $66,$F7,$47,$01,$01,$00,  { TEST    WORD PTR [RDI+01],0001 }
70    $66,$F7,$47,$03,$01,$00,  { TEST    WORD PTR [RDI+03],0001 }
71    $66,$F7,$47,$FF,$01,$00,  { TEST    WORD PTR [RDI-01],0001 }
72    $66,$F7,$47,$FD,$01,$00,  { TEST    WORD PTR [RDI-03],0001 }
73    $66,$F7,$47,$04,$01,$00,  { TEST    WORD PTR [RDI+04],0001 }
74    $66,$F7,$47,$04,$01,$00,  { TEST    WORD PTR [RDI+04],0001 }
75    $66,$F7,$07,$01,$00,      { TEST    WORD PTR [RDI],0001    }
76    $66,$F7,$47,$01,$01,$00   { TEST    WORD PTR [RDI+01],0001 }
77  );
78  expect2: array [0..$42] of byte = (
79    $F7,$07,$01,$00,$00,$00,      { TEST    DWORD PTR [RDI],00000001    }
80    $F7,$47,$01,$01,$00,$00,$00,  { TEST    DWORD PTR [RDI+01],00000001 }
81
82    $F7,$07,$01,$00,$00,$00,      { TEST    DWORD PTR [RDI],00000001    }
83    $F7,$07,$01,$00,$00,$00,      { TEST    DWORD PTR [RDI],00000001    }
84    $F7,$47,$01,$01,$00,$00,$00,  { TEST    DWORD PTR [RDI+01],00000001 }
85    $F7,$47,$03,$01,$00,$00,$00,  { TEST    DWORD PTR [RDI+03],00000001 }
86    $F7,$47,$FF,$01,$00,$00,$00,  { TEST    DWORD PTR [RDI-01],00000001 }
87    $F7,$47,$FD,$01,$00,$00,$00,  { TEST    DWORD PTR [RDI-03],00000001 }
88    $F7,$47,$04,$01,$00,$00,$00,  { TEST    DWORD PTR [RDI+04],00000001 }
89    $F7,$47,$04,$01,$00,$00,$00   { TEST    DWORD PTR [RDI+04],00000001 }
90  );
91
92
93procedure test1; assembler; nostackframe;
94asm
95  test [rdi+foo2], cval                   { test word ptr [rdi], 1   }
96  test byte ptr [rdi+foo], cval           { test byte ptr [rdi], 1   }
97  test [rdi+foo.w], cval                  { test word ptr [rdi+1], 1 }
98  test [rdi+foo.b2], cval                 { test byte ptr [rdi+3], 1 }
99  test [rdi-foo.w], cval                  { test word ptr [rdi-1], 1 }
100  test [rdi-foo.b2], cval                 { test byte ptr [rdi-3], 1 }
101  test [rdi+foo.b2+foo.w], cval           { test word ptr [rdi+4], 1 }
102  test [rdi+foo.w+foo.b2], cval           { test byte ptr [rdi+4], 1 }
103
104  test [rdi+foo2*1], cval                 { test word ptr [rdi], 1   }
105  test byte ptr [rdi+foo*1], cval         { test byte ptr [rdi], 1   }
106  test [rdi+foo.w*1], cval                { test word ptr [rdi+1], 1 }
107  test [rdi+foo.b2*1], cval               { test byte ptr [rdi+3], 1 }
108  test [rdi-foo.w*1], cval                { test word ptr [rdi-1], 1 }
109  test [rdi-foo.b2*1], cval               { test byte ptr [rdi-3], 1 }
110  test [rdi+foo.b2*1+foo.w*1], cval       { test word ptr [rdi+4], 1 }
111  test [rdi+foo.w*1+foo.b2*1], cval       { test byte ptr [rdi+4], 1 }
112
113  test [rdi+foo2*5], cval                 { test word ptr [rdi], 1    }
114  test byte ptr [rdi+foo*5], cval         { test byte ptr [rdi], 1    }
115  test [rdi+foo.w*5], cval                { test word ptr [rdi+5], 1  }
116  test [rdi+foo.b2*5], cval               { test byte ptr [rdi+15], 1 }
117  test [rdi-foo.w*5], cval                { test word ptr [rdi-5], 1  }
118  test [rdi-foo.b2*5], cval               { test byte ptr [rdi-15], 1 }
119  test [rdi+foo.b2*5+foo.w*3], cval       { test word ptr [rdi+18], 1 }
120  test [rdi+foo.w*5+foo.b2*3], cval       { test byte ptr [rdi+14], 1 }
121
122  test byte ptr [rdi+foo2], cval          { test byte ptr [rdi], 1   }
123  test byte ptr [rdi+foo], cval           { test byte ptr [rdi], 1   }
124  test byte ptr [rdi+foo.w], cval         { test byte ptr [rdi+1], 1 }
125  test byte ptr [rdi+foo.b2], cval        { test byte ptr [rdi+3], 1 }
126  test byte ptr [rdi-foo.w], cval         { test byte ptr [rdi-1], 1 }
127  test byte ptr [rdi-foo.b2], cval        { test byte ptr [rdi-3], 1 }
128  test byte ptr [rdi+foo.b2+foo.w], cval  { test byte ptr [rdi+4], 1 }
129  test byte ptr [rdi+foo.w+foo.b2], cval  { test byte ptr [rdi+4], 1 }
130  test byte ptr [rdi+foo32], cval         { test byte ptr [rdi], 1   }
131  test byte ptr [rdi+foo32_2.l], cval     { test byte ptr [rdi+1], 1 }
132
133  test word ptr [rdi+foo2], cval          { test word ptr [rdi], 1   }
134  test word ptr [rdi+foo], cval           { test word ptr [rdi], 1   }
135  test word ptr [rdi+foo.w], cval         { test word ptr [rdi+1], 1 }
136  test word ptr [rdi+foo.b2], cval        { test word ptr [rdi+3], 1 }
137  test word ptr [rdi-foo.w], cval         { test word ptr [rdi-1], 1 }
138  test word ptr [rdi-foo.b2], cval        { test word ptr [rdi-3], 1 }
139  test word ptr [rdi+foo.b2+foo.w], cval  { test word ptr [rdi+4], 1 }
140  test word ptr [rdi+foo.w+foo.b2], cval  { test word ptr [rdi+4], 1 }
141  test word ptr [rdi+foo32], cval         { test word ptr [rdi], 1   }
142  test word ptr [rdi+foo32_2.l], cval     { test word ptr [rdi+1], 1 }
143end;
144
145procedure test2; assembler; nostackframe;
146asm
147  test [rdi+foo32], cval                   { test dword ptr [rdi], 1   }
148  test [rdi+foo32_2.l], cval               { test dword ptr [rdi+1], 1 }
149
150  test dword ptr [rdi+foo2], cval          { test dword ptr [rdi], 1   }
151  test dword ptr [rdi+foo], cval           { test dword ptr [rdi], 1   }
152  test dword ptr [rdi+foo.w], cval         { test dword ptr [rdi+1], 1 }
153  test dword ptr [rdi+foo.b2], cval        { test dword ptr [rdi+3], 1 }
154  test dword ptr [rdi-foo.w], cval         { test dword ptr [rdi-1], 1 }
155  test dword ptr [rdi-foo.b2], cval        { test dword ptr [rdi-3], 1 }
156  test dword ptr [rdi+foo.b2+foo.w], cval  { test dword ptr [rdi+4], 1 }
157  test dword ptr [rdi+foo.w+foo.b2], cval  { test dword ptr [rdi+4], 1 }
158end;
159
160procedure Error;
161begin
162  Writeln('Error!');
163  Halt(1);
164end;
165
166function CompareCode(cp: CodePointer; dp: Pointer; sz: SizeInt): Boolean;
167begin
168  CompareCode := CompareByte(cp^, dp^, sz) = 0;
169end;
170
171begin
172  if not CompareCode(CodePointer(@test1), @expect1, SizeOf(expect1)) then
173    Error;
174  if not CompareCode(CodePointer(@test2), @expect2, SizeOf(expect2)) then
175    Error;
176
177  Writeln('Ok!');
178end.
179