浏览代码

* on i8086 convert the 'ret' inline asm instruction to either 'retn' or 'retf',
depending on the call model of the current function (which is BP7 compatible
behaviour)

git-svn-id: trunk@32157 -

nickysn 9 年之前
父节点
当前提交
c068c96302
共有 1 个文件被更改,包括 12 次插入1 次删除
  1. 12 1
      compiler/x86/rax86int.pas

+ 12 - 1
compiler/x86/rax86int.pas

@@ -85,7 +85,7 @@ Unit Rax86int;
        { aasm }
        { aasm }
        aasmtai,aasmdata,aasmcpu,
        aasmtai,aasmdata,aasmcpu,
        { symtable }
        { symtable }
-       symconst,symbase,symtype,symsym,symdef,symtable,
+       symconst,symbase,symtype,symsym,symdef,symtable,symcpu,
        { parser }
        { parser }
        scanner,pbase,
        scanner,pbase,
        { register allocator }
        { register allocator }
@@ -2072,6 +2072,17 @@ Unit Rax86int;
         else if (instr.opcode=A_POPA) then
         else if (instr.opcode=A_POPA) then
           instr.opcode:=A_POPAW
           instr.opcode:=A_POPAW
 {$endif x86_64}
 {$endif x86_64}
+{$ifdef i8086}
+        { ret is converted to retn or retf, depending on the call model of the
+          current procedure (BP7 compatible) }
+        else if (instr.opcode=A_RET) then
+          begin
+            if is_proc_far(current_procinfo.procdef) then
+              instr.opcode:=A_RETF
+            else
+              instr.opcode:=A_RETN;
+          end
+{$endif i8086}
         ;
         ;
         { We are reading operands, so opcode will be an AS_ID }
         { We are reading operands, so opcode will be an AS_ID }
         { process operands backwards to get them in AT&T order }
         { process operands backwards to get them in AT&T order }