ORCA-C/Gen.pas

1 line
175 KiB
ObjectPascal
Raw Normal View History

{$optimize 7} {---------------------------------------------------------------} { } { Gen } { } { Generates native code from intermediate code instructions. } { } {---------------------------------------------------------------} unit Gen; interface {$segment 'gen'} {$LibPrefix '0/obj/'} uses CCommon, CGI, CGC, ObjOut, Native; {---------------------------------------------------------------} function LabelToDisp (lab: integer): integer; { convert a local label number to a stack frame displacement } { } { parameters: } { lab - label number } procedure Gen (blk: blockPtr); { Generates native code for a list of blocks } { } { parameters: } { blk - first of the list of blocks } {---------------------------------------------------------------} implementation const A_X = 1; {longword locations} onStack = 2; inPointer = 4; localAddress = 8; globalLabel = 16; constant = 32; {stack frame locations} {---------------------} returnSize = 3; {size of return address} type {possible locations for 4 byte values} longType = record {desciption of current four byte value} preference: integer; {where you want the value} where: integer; {where the value is at} fixedDisp: boolean; {is the displacement a fixed value?} isLong: boolean; {is long addr required for named labs?} disp: integer; {fixed displacement/local addr} lval: longint; {value} lab: stringPtr; {global label name} end; var gLong: longType; {info about last long value} namePushed: boolean; {has a name been pushed in this proc?} skipLoad: boolean; {skip load for a pc_lli, etc?} {stack frame locations} {---------------------} bankLoc: integer; {disp in dp where bank reg is stored} dworkLoc: integer; {disp in dp of 4 byte work spage for cg} funLoc: integer; {loc of fn ret value in stack frame} localSize: integer; {local space for current proc} parameterSize: integer; {# bytes of parameters for current proc} stackLoc: integer; {disp in dp where stack reg is stored} {---------------------------------------------------------------} procedure GenTree (op: icptr); forward; procedure OperA (mop: integer; op: icptr); { Do an operation on op that has addr modes equivalent to STA } { } { parameters: } { op - node to generate the leaf for } { mop - operation } var loc: integer; {stack frame position} opcode: pcodes; {temp storage} begin {OperA} opcode := op^.opcode; case opcode of pc_ldo,pc_gil,pc_gli,pc_gdl,pc_gld: begin case mop of m_cmp_imm: mop := m_cmp_abs; m_adc_imm: mop := m_adc_abs; m_and_imm: mop := m_and_abs; m_ora_imm: mop := m_ora_abs; m_sbc_imm: mop := m_sbc_abs; m_eor_imm: mop := m_eor_abs; otherwise: Error(cge1); end; {case} if opcode = pc_gil then GenNative(m_inc_abs, absolute, op^.q, op^.lab, 0) else if opcode = pc_gdl then GenNative(m_dec_abs, absolute, op^.q, op^.lab, 0); if smallMemoryModel then GenNative(mop, absolute, op^.q, op^.lab, 0) else