summaryrefslogtreecommitdiff
path: root/asmcomp/emit_sparc.mlp
diff options
context:
space:
mode:
Diffstat (limited to 'asmcomp/emit_sparc.mlp')
-rw-r--r--asmcomp/emit_sparc.mlp15
1 files changed, 8 insertions, 7 deletions
diff --git a/asmcomp/emit_sparc.mlp b/asmcomp/emit_sparc.mlp
index fb2d6acaf6..ba60ca2b62 100644
--- a/asmcomp/emit_sparc.mlp
+++ b/asmcomp/emit_sparc.mlp
@@ -23,7 +23,7 @@ let frame_size () =
let size =
!stack_offset +
4 * num_stack_slots.(0) + 8 * num_stack_slots.(1) +
- (if !contains_calls then 8 else 0) in
+ (if !contains_calls then 4 else 0) in
Misc.align size 8
let slot_offset loc class =
@@ -31,8 +31,8 @@ let slot_offset loc class =
Incoming n -> frame_size() + n + 96
| Local n ->
if class = 0
- then !stack_offset + n * 4 + 96
- else !stack_offset + num_stack_slots.(0) * 4 + n * 8 + 96
+ then !stack_offset + num_stack_slots.(1) * 8 + n * 4 + 96
+ else !stack_offset + n * 8 + 96
| Outgoing n -> n + 96
(* Return the other register in a register pair *)
@@ -378,11 +378,12 @@ let emit_instr i =
let l = Misc.log2 n in
if n = 1 lsl l then begin
let lbl = new_label() in
- ` tst {emit_reg i.arg.(0)}\n`;
+ ` cmp {emit_reg i.arg.(0)}, 0\n`;
` bge {emit_label lbl}\n`;
- ` mov {emit_reg i.arg.(0)}, %g1\n` (* in delay slot *)
- ` add %g1, {emit_int (n-1)}, %g1\n`
- `{emit_label lbl}: sra %g1, {emit_int n}, {emit_reg i.res.(0)}\n`
+ ` mov {emit_reg i.arg.(0)}, %g1\n`; (* in delay slot *)
+ ` add %g1, {emit_int (n-1)}, %g1\n`;
+ `{emit_label lbl}:\n`;
+ ` sra %g1, {emit_int l}, {emit_reg i.res.(0)}\n`
end else begin
` sra {emit_reg i.arg.(0)}, 31, %g1\n`;
` wr %g0, %g1, %y\n`;