diff --git a/compiler/arm/agarmgas.pas b/compiler/arm/agarmgas.pas index d6d6622ce2..d9e8b33f09 100644 --- a/compiler/arm/agarmgas.pas +++ b/compiler/arm/agarmgas.pas @@ -187,6 +187,7 @@ unit agarmgas; end; end; + Procedure TARMGNUAssembler.WriteInstruction(hp : tai); var op: TAsmOp; s: string; @@ -226,7 +227,10 @@ begin end. { $Log$ - Revision 1.14 2003-11-17 23:23:47 florian + Revision 1.15 2003-11-21 16:29:26 florian + * fixed reading of reg. sets in the arm assembler reader + + Revision 1.14 2003/11/17 23:23:47 florian + first part of arm assembler reader Revision 1.13 2003/11/07 15:58:32 florian diff --git a/compiler/arm/cgcpu.pas b/compiler/arm/cgcpu.pas index 6e8de71c3c..4769419f11 100644 --- a/compiler/arm/cgcpu.pas +++ b/compiler/arm/cgcpu.pas @@ -759,8 +759,8 @@ unit cgcpu; OS_32,OS_S32: begin instr:=taicpu.op_reg_reg(A_MOV,reg2,reg1); - add_move_instruction(instr); list.concat(instr); + add_move_instruction(instr); end; else internalerror(2002090901); end; @@ -954,8 +954,8 @@ unit cgcpu; else begin instr:=taicpu.op_reg_reg(A_MOV,r,tmpref.base); - add_move_instruction(instr); list.concat(instr); + add_move_instruction(instr); end; end; reference_release(list,tmpref); @@ -1282,7 +1282,10 @@ begin end. { $Log$ - Revision 1.22 2003-11-07 15:58:32 florian + Revision 1.23 2003-11-21 16:29:26 florian + * fixed reading of reg. sets in the arm assembler reader + + Revision 1.22 2003/11/07 15:58:32 florian * Florian's culmutative nr. 1; contains: - invalid calling conventions for a certain cpu are rejected - arm softfloat calling conventions diff --git a/compiler/arm/cpubase.pas b/compiler/arm/cpubase.pas index 25301a3f3e..cc4fbfb113 100644 --- a/compiler/arm/cpubase.pas +++ b/compiler/arm/cpubase.pas @@ -181,6 +181,11 @@ unit cpubase; 'ge','lt','gt','le','al','nv' ); + uppercond2str : array[TAsmCond] of string[2]=('', + 'EQ','NE','CS','CC','MI','PL','VS','VC','HI','LS', + 'GE','LT','GT','LE','AL','NV' + ); + inverse_cond : array[TAsmCond] of TAsmCond=(C_None, C_NE,C_EQ,C_CC,C_CS,C_PL,C_MI,C_VC,C_VS,C_LS,C_HI, C_LT,C_GE,C_LE,C_GT,C_None,C_None @@ -564,7 +569,10 @@ unit cpubase; end. { $Log$ - Revision 1.18 2003-11-17 23:23:47 florian + Revision 1.19 2003-11-21 16:29:26 florian + * fixed reading of reg. sets in the arm assembler reader + + Revision 1.18 2003/11/17 23:23:47 florian + first part of arm assembler reader Revision 1.17 2003/11/02 14:30:03 florian diff --git a/compiler/arm/raarmgas.pas b/compiler/arm/raarmgas.pas index fee05e1464..90a7264025 100644 --- a/compiler/arm/raarmgas.pas +++ b/compiler/arm/raarmgas.pas @@ -384,9 +384,10 @@ Unit raarmgas; var - tempreg : tregister; + tempreg,ireg : tregister; hl : tasmlabel; ofs : longint; + registerset : tcpuregisterset; Begin expr:=''; case actasmtoken of @@ -396,6 +397,13 @@ Unit raarmgas; BuildReference(oper); end; + AS_HASH: { Constant expression } + Begin + Consume(AS_HASH); + BuildConstantOperand(oper); + end; + + (* AS_INTNUM, AS_MINUS, AS_PLUS: @@ -413,7 +421,7 @@ Unit raarmgas; else BuildReference(oper); end; - + *) AS_ID: { A constant expression, or a Variable ref. } Begin { Local Label ? } @@ -519,7 +527,8 @@ Unit raarmgas; BuildReference(oper); end; - AS_REGISTER: { Register, a variable reference or a constant reference } + { Register, a variable reference or a constant reference } + AS_REGISTER: Begin { save the type of register used. } tempreg:=actasmregister; @@ -534,6 +543,38 @@ Unit raarmgas; else Message(asmr_e_syn_operand); end; + + { Registerset } + AS_LSBRACKET: + begin + consume(AS_LSBRACKET); + registerset:=[]; + while true do + begin + if actasmtoken=AS_REGISTER then + begin + include(registerset,actasmregister); + tempreg:=actasmregister; + consume(AS_REGISTER); + if actasmtoken=AS_MINUS then + begin + consume(AS_MINUS); + for ireg:=tempreg to actasmregister do + include(registerset,ireg); + consume(AS_REGISTER); + end; + end + else + consume(AS_REGISTER); + if actasmtoken=AS_COMMA then + consume(AS_COMMA) + else + break; + end; + consume(AS_RSBRACKET); + oper.opr.typ:=OPR_REGSET; + oper.opr.regset:=registerset; + end; AS_END, AS_SEPARATOR, AS_COMMA: ; @@ -586,13 +627,7 @@ Unit raarmgas; if operandnum>Max_Operands then Message(asmr_e_too_many_operands) else - begin - { condition operands doesn't set the operand but write to the - condition field of the instruction - } - if instr.Operands[operandnum].opr.typ<>OPR_NONE then - Inc(operandnum); - end; + Inc(operandnum); Consume(AS_COMMA); end; AS_SEPARATOR, @@ -604,8 +639,6 @@ Unit raarmgas; BuildOperand(instr.Operands[operandnum] as tarmoperand); end; { end case } until false; - if (operandnum=1) and (instr.Operands[operandnum].opr.typ=OPR_NONE) then - dec(operandnum); instr.Ops:=operandnum; end; @@ -662,7 +695,7 @@ Unit raarmgas; begin for icond:=low(tasmcond) to high(tasmcond) do begin - if copy(hs,1,2)=cond2str[icond] then + if copy(hs,1,2)=uppercond2str[icond] then begin actcondition:=icond; { strip condition } @@ -750,6 +783,9 @@ initialization end. { $Log$ - Revision 1.1 2003-11-17 23:23:47 florian + Revision 1.2 2003-11-21 16:29:26 florian + * fixed reading of reg. sets in the arm assembler reader + + Revision 1.1 2003/11/17 23:23:47 florian + first part of arm assembler reader } diff --git a/compiler/powerpc/cgcpu.pas b/compiler/powerpc/cgcpu.pas index f37fc6c3e8..e181583a62 100644 --- a/compiler/powerpc/cgcpu.pas +++ b/compiler/powerpc/cgcpu.pas @@ -298,14 +298,17 @@ const procedure tcgppc.do_register_allocation(list:Taasmoutput;headertai:tai); begin { Int } + rgint.check_unreleasedregs; rgint.do_register_allocation(list,headertai); rgint.translate_registers(list); { FPU } + rgfpu.check_unreleasedregs; rgfpu.do_register_allocation(list,headertai); rgfpu.translate_registers(list); { MM } + rgmm.check_unreleasedregs; rgmm.do_register_allocation(list,headertai); rgmm.translate_registers(list); end; @@ -2443,7 +2446,10 @@ begin end. { $Log$ - Revision 1.136 2003-11-02 17:19:33 florian + Revision 1.137 2003-11-21 16:29:26 florian + * fixed reading of reg. sets in the arm assembler reader + + Revision 1.136 2003/11/02 17:19:33 florian + copying of open array value parameters to the heap implemented Revision 1.135 2003/11/02 15:20:06 jonas diff --git a/compiler/rautils.pas b/compiler/rautils.pas index d029878677..447c1c46f8 100644 --- a/compiler/rautils.pas +++ b/compiler/rautils.pas @@ -66,7 +66,7 @@ Function SearchLabel(const s: string; var hl: tasmlabel;emit:boolean): boolean; type TOprType=(OPR_NONE,OPR_CONSTANT,OPR_SYMBOL,OPR_LOCAL, - OPR_REFERENCE,OPR_REGISTER,OPR_REGLIST,OPR_COND); + OPR_REFERENCE,OPR_REGISTER,OPR_REGLIST,OPR_COND,OPR_REGSET); TOprRec = record case typ:TOprType of @@ -81,7 +81,10 @@ type {$endif m68k} {$ifdef powerpc} OPR_COND : (cond : tasmcond); -{$endif m68k} +{$endif powerpc} +{$ifdef arm} + OPR_REGSET : (regset : tcpuregisterset); +{$endif arm} end; TOperand = class @@ -1121,6 +1124,10 @@ end; operands[i].opr.localscale,operands[i].opr.localgetoffset); OPR_REFERENCE: ai.loadref(i-1,operands[i].opr.ref); +{$ifdef ARM} + OPR_REGSET: + ai.loadregset(i-1,operands[i].opr.regset); +{$endif ARM} end; end; ai.SetCondition(condition); @@ -1618,7 +1625,10 @@ end; end. { $Log$ - Revision 1.78 2003-11-17 23:23:47 florian + Revision 1.79 2003-11-21 16:29:26 florian + * fixed reading of reg. sets in the arm assembler reader + + Revision 1.78 2003/11/17 23:23:47 florian + first part of arm assembler reader Revision 1.77 2003/11/12 16:05:39 florian