Commit ac2a93a1 by David Edelsohn

rs6000_sync_trampoline cmpdi and rs6000_initialize_trampoline pmode

From-SVN: r11118
parent 39733624
...@@ -3820,14 +3820,15 @@ rs6000_sync_trampoline (addr) ...@@ -3820,14 +3820,15 @@ rs6000_sync_trampoline (addr)
rtx (*cmp_fcn) PROTO ((rtx, rtx)); rtx (*cmp_fcn) PROTO ((rtx, rtx));
rtx label; rtx label;
if (TARGET_64BIT) if (TARGET_32BIT)
{ {
abort (); /* no cmpdi function yet */ sub_fcn = gen_subsi3;
cmp_fcn = gen_cmpsi;
} }
else else
{ {
sub_fcn = gen_subsi3; sub_fcn = gen_subdi3;
cmp_fcn = gen_cmpsi; cmp_fcn = gen_cmpdi;
} }
addr = force_reg (pmode, addr); addr = force_reg (pmode, addr);
...@@ -3990,6 +3991,7 @@ rs6000_initialize_trampoline (addr, fnaddr, cxt) ...@@ -3990,6 +3991,7 @@ rs6000_initialize_trampoline (addr, fnaddr, cxt)
rtx cxt; rtx cxt;
{ {
rtx reg, reg2, reg3; rtx reg, reg2, reg3;
enum machine_mode pmode = Pmode;
switch (DEFAULT_ABI) switch (DEFAULT_ABI)
{ {
...@@ -3998,31 +4000,31 @@ rs6000_initialize_trampoline (addr, fnaddr, cxt) ...@@ -3998,31 +4000,31 @@ rs6000_initialize_trampoline (addr, fnaddr, cxt)
/* Under AIX, just build the 3 word function descriptor */ /* Under AIX, just build the 3 word function descriptor */
case ABI_AIX: case ABI_AIX:
emit_move_insn (gen_rtx (MEM, Pmode, emit_move_insn (gen_rtx (MEM, pmode,
memory_address (Pmode, (addr))), memory_address (pmode, (addr))),
gen_rtx (MEM, Pmode, gen_rtx (MEM, pmode,
memory_address (Pmode, (fnaddr)))); memory_address (pmode, (fnaddr))));
emit_move_insn (gen_rtx (MEM, Pmode, emit_move_insn (gen_rtx (MEM, pmode,
memory_address (Pmode, memory_address (pmode,
plus_constant ((addr), 4))), plus_constant ((addr), 4))),
gen_rtx (MEM, Pmode, gen_rtx (MEM, pmode,
memory_address (Pmode, memory_address (pmode,
plus_constant ((fnaddr), 4)))); plus_constant ((fnaddr), 4))));
emit_move_insn (gen_rtx (MEM, Pmode, emit_move_insn (gen_rtx (MEM, pmode,
memory_address (Pmode, memory_address (pmode,
plus_constant ((addr), 8))), plus_constant ((addr), 8))),
force_reg (Pmode, (cxt))); force_reg (pmode, (cxt)));
break; break;
/* Under V.4/eabi, update the two words after the bl to have the real /* Under V.4/eabi, update the two words after the bl to have the real
function address and the static chain. */ function address and the static chain. */
case ABI_V4: case ABI_V4:
case ABI_AIX_NODESC: case ABI_AIX_NODESC:
reg = gen_reg_rtx (Pmode); reg = gen_reg_rtx (pmode);
emit_move_insn (reg, fnaddr); emit_move_insn (reg, fnaddr);
emit_move_insn (gen_rtx (MEM, Pmode, plus_constant (addr, 8)), reg); emit_move_insn (gen_rtx (MEM, pmode, plus_constant (addr, 8)), reg);
emit_move_insn (gen_rtx (MEM, Pmode, emit_move_insn (gen_rtx (MEM, pmode,
plus_constant (addr, (TARGET_64BIT ? 16 : 12))), plus_constant (addr, (TARGET_64BIT ? 16 : 12))),
cxt); cxt);
...@@ -4033,18 +4035,18 @@ rs6000_initialize_trampoline (addr, fnaddr, cxt) ...@@ -4033,18 +4035,18 @@ rs6000_initialize_trampoline (addr, fnaddr, cxt)
then fill in the fields with the function address and static chain after then fill in the fields with the function address and static chain after
the bl instruction. */ the bl instruction. */
case ABI_NT: case ABI_NT:
reg = gen_reg_rtx (Pmode); reg = gen_reg_rtx (pmode);
reg2 = gen_reg_rtx (Pmode); reg2 = gen_reg_rtx (pmode);
reg3 = gen_reg_rtx (Pmode); reg3 = gen_reg_rtx (pmode);
emit_move_insn (gen_rtx (MEM, Pmode, plus_constant (addr, 4)), emit_move_insn (gen_rtx (MEM, pmode, plus_constant (addr, 4)),
gen_rtx (REG, Pmode, 2)); gen_rtx (REG, pmode, 2));
emit_move_insn (reg, fnaddr); emit_move_insn (reg, fnaddr);
emit_move_insn (reg2, gen_rtx (MEM, Pmode, reg)); emit_move_insn (reg2, gen_rtx (MEM, pmode, reg));
emit_move_insn (reg3, plus_constant (addr, 8)); emit_move_insn (reg3, plus_constant (addr, 8));
emit_move_insn (gen_rtx (MEM, Pmode, plus_constant (addr, 16)), reg); emit_move_insn (gen_rtx (MEM, pmode, plus_constant (addr, 16)), reg);
emit_move_insn (gen_rtx (MEM, Pmode, addr), reg3); emit_move_insn (gen_rtx (MEM, pmode, addr), reg3);
emit_move_insn (gen_rtx (MEM, Pmode, plus_constant (addr, 20)), cxt); emit_move_insn (gen_rtx (MEM, pmode, plus_constant (addr, 20)), cxt);
rs6000_sync_trampoline (addr); rs6000_sync_trampoline (addr);
break; break;
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment