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