diff --git a/compiler/m68k/cgcpu.pas b/compiler/m68k/cgcpu.pas index 39cc4ac2a9..bd201d5232 100644 --- a/compiler/m68k/cgcpu.pas +++ b/compiler/m68k/cgcpu.pas @@ -452,6 +452,17 @@ unit cgcpu; displacement. } { first ensure that base is an address register } + if ((ref.base<>NR_NO) and (ref.index<>NR_NO)) and + (not isaddressregister(ref.base) and isaddressregister(ref.index)) then + begin + { if we have both base and index registers, but base is data and index + is address, we can just swap them, as FPC always uses long index } + hreg:=ref.base; + ref.base:=ref.index; + ref.index:=hreg; + //list.concat(tai_comment.create(strpnew('fixref: base and index swapped'))); + end; + if (not assigned (ref.symbol) and (current_settings.cputype<>cpu_MC68000)) and (ref.base<>NR_NO) and not isaddressregister(ref.base) then begin @@ -1176,7 +1187,8 @@ unit cgcpu; procedure tcg68k.a_op_const_ref(list : TAsmList; Op: TOpCG; size: TCGSize; a: tcgint; const ref: TReference); var opcode: tasmop; - opsize : topsize; + opsize: topsize; + href : treference; begin optimize_op_const(size, op, a); opcode := topcg2tasmop[op]; @@ -1191,6 +1203,8 @@ unit cgcpu; exit; end; + href:=ref; + fixref(list,href); case op of OP_NONE : begin @@ -1211,11 +1225,11 @@ unit cgcpu; opcode:=A_ADDQ else opcode:=A_SUBQ; - list.concat(taicpu.op_const_ref(opcode, opsize, a, ref)); + list.concat(taicpu.op_const_ref(opcode, opsize, a, href)); end else - if current_settings.cputype = cpu_mc68000 then - list.concat(taicpu.op_const_ref(opcode, opsize, a, ref)) + if not(current_settings.cputype in cpu_coldfire) then + list.concat(taicpu.op_const_ref(opcode, opsize, a, href)) else { on ColdFire, ADDI/SUBI cannot act on memory so we can only go through a register }