From 5b503f42c7db9354429aae266798a70faf7a96f9 Mon Sep 17 00:00:00 2001 From: nickysn Date: Fri, 31 May 2013 13:31:45 +0000 Subject: [PATCH] + implemented Mem/MemW/MemL[] for i8086 git-svn-id: trunk@24665 - --- compiler/pexpr.pas | 29 +++++++++++++++++++++++++++++ compiler/psystem.pas | 9 +++++++++ compiler/symdef.pas | 3 +++ 3 files changed, 41 insertions(+) diff --git a/compiler/pexpr.pas b/compiler/pexpr.pas index 3555e4e8d7..6b3f3dfdcf 100644 --- a/compiler/pexpr.pas +++ b/compiler/pexpr.pas @@ -1867,6 +1867,32 @@ implementation (tloadnode(p1).symtableentry.name='MEMW') or (tloadnode(p1).symtableentry.name='MEML')) then begin +{$if defined(i8086)} + if try_to_consume(_COLON) then + begin + p2:=ctypeconvnode.create_explicit(p2,u32inttype); + p3:=cshlshrnode.create(shln,p2,cordconstnode.create($10,s16inttype,false)); + p2:=comp_expr(true,false); + p2:=caddnode.create(addn,p2,p3); + case tloadnode(p1).symtableentry.name of + 'MEM': p2:=ctypeconvnode.create_explicit(p2,bytefarpointertype); + 'MEMW': p2:=ctypeconvnode.create_explicit(p2,wordfarpointertype); + 'MEML': p2:=ctypeconvnode.create_explicit(p2,longintfarpointertype); + else + internalerror(2013053102); + end; + p1:=cderefnode.create(p2); + end + else + begin + { TODO: fix, this is broken for now... } + if try_to_consume(_POINTPOINT) then + { Support mem[$80000000..$80000002] which returns array [0..2] of memtype.} + p2:=crangenode.create(p2,comp_expr(true,false)); + p1:=cvecnode.create(p1,p2); + include(tvecnode(p1).flags,nf_memindex); + end; +{$elseif defined(i386)} if try_to_consume(_COLON) then begin p3:=caddnode.create(muln,cordconstnode.create($10,s32inttype,false),p2); @@ -1887,6 +1913,9 @@ implementation p1:=cvecnode.create(p1,p2); include(tvecnode(p1).flags,nf_memindex); end; +{$else} + internalerror(2013053101); +{$endif} end else begin diff --git a/compiler/psystem.pas b/compiler/psystem.pas index 24e88d92a1..05628e9240 100644 --- a/compiler/psystem.pas +++ b/compiler/psystem.pas @@ -282,6 +282,9 @@ implementation {$ifdef i8086} voidfarpointertype:=tpointerdef.createx86(voidtype,x86pt_far); voidhugepointertype:=tpointerdef.createx86(voidtype,x86pt_huge); + bytefarpointertype:=tpointerdef.createx86(u8inttype,x86pt_far); + wordfarpointertype:=tpointerdef.createx86(u16inttype,x86pt_far); + longintfarpointertype:=tpointerdef.createx86(s32inttype,x86pt_far); {$endif i8086} {$endif x86} cfiletype:=tfiledef.createuntyped; @@ -416,6 +419,9 @@ implementation {$ifdef i8086} addtype('$void_farpointer',voidfarpointertype); addtype('$void_hugepointer',voidhugepointertype); + addtype('$byte_farpointer',bytefarpointertype); + addtype('$word_farpointer',wordfarpointertype); + addtype('$longint_farpointer',longintfarpointertype); {$endif i8086} {$endif x86} addtype('$openchararray',openchararraytype); @@ -541,6 +547,9 @@ implementation {$ifdef i8086} loadtype('void_farpointer',voidfarpointertype); loadtype('void_hugepointer',voidhugepointertype); + loadtype('byte_farpointer',bytefarpointertype); + loadtype('word_farpointer',wordfarpointertype); + loadtype('longint_farpointer',longintfarpointertype); {$endif i8086} {$endif x86} loadtype('file',cfiletype); diff --git a/compiler/symdef.pas b/compiler/symdef.pas index 70690a40aa..f6f816e29f 100644 --- a/compiler/symdef.pas +++ b/compiler/symdef.pas @@ -848,6 +848,9 @@ interface {$ifdef i8086} voidfarpointertype, voidhugepointertype, + bytefarpointertype, { used for Mem[] } + wordfarpointertype, { used for MemW[] } + longintfarpointertype, { used for MemL[] } {$endif i8086} {$endif x86} cundefinedtype,