summaryrefslogtreecommitdiff
path: root/asmcomp/power/emit.mlp
diff options
context:
space:
mode:
Diffstat (limited to 'asmcomp/power/emit.mlp')
-rw-r--r--asmcomp/power/emit.mlp29
1 files changed, 13 insertions, 16 deletions
diff --git a/asmcomp/power/emit.mlp b/asmcomp/power/emit.mlp
index e82f5ff790..f6ee1a2321 100644
--- a/asmcomp/power/emit.mlp
+++ b/asmcomp/power/emit.mlp
@@ -45,13 +45,6 @@ let slot_offset loc cls =
| Incoming n -> frame_size() + n
| Outgoing n -> n
-(* Whether stack backtraces are supported *)
-
-let supports_backtraces =
- match Config.system with
- | "rhapsody" -> true
- | _ -> false
-
(* Output a symbol *)
let emit_symbol =
@@ -267,7 +260,7 @@ let name_for_int_comparison = function
let name_for_intop = function
Iadd -> "add"
- | Imul - > if ppc64 then "mulld" else "mullw"
+ | Imul -> if ppc64 then "mulld" else "mullw"
| Imulh -> if ppc64 then "mulhd" else "mulhw"
| Idiv -> if ppc64 then "divd" else "divw"
| Iand -> "and"
@@ -325,7 +318,8 @@ let load_store_size = function
let instr_size = function
Lend -> 0
| Lop(Imove | Ispill | Ireload) -> 1
- | Lop(Iconst_int n) -> if is_native_immediate n then 1 else 2
+ | Lop(Iconst_int n | Iconst_blockheader n) ->
+ if is_native_immediate n then 1 else 2
| Lop(Iconst_float s) -> 2
| Lop(Iconst_symbol s) -> 2
| Lop(Icall_ind) -> 2
@@ -459,7 +453,7 @@ let rec emit_instr i dslot =
| (_, _) ->
fatal_error "Emit: Imove"
end
- | Lop(Iconst_int n) ->
+ | Lop(Iconst_int n | Iconst_blockheader n) ->
if is_native_immediate n then
` li {emit_reg i.res.(0)}, {emit_nativeint n}\n`
else if n >= -0x8000_0000n && n <= 0x7FFF_FFFFn then begin
@@ -596,7 +590,7 @@ let rec emit_instr i dslot =
emit_set_comp c i.res.(0)
end
| Lop(Iintop Icheckbound) ->
- if !Clflags.debug && supports_backtraces then
+ if !Clflags.debug then
record_frame Reg.Set.empty i.dbg;
` {emit_string tglle} {emit_reg i.arg.(0)}, {emit_reg i.arg.(1)}\n`
| Lop(Iintop op) ->
@@ -614,7 +608,7 @@ let rec emit_instr i dslot =
emit_set_comp c i.res.(0)
end
| Lop(Iintop_imm(Icheckbound, n)) ->
- if !Clflags.debug && supports_backtraces then
+ if !Clflags.debug then
record_frame Reg.Set.empty i.dbg;
` {emit_string tglle}i {emit_reg i.arg.(0)}, {emit_int n}\n`
| Lop(Iintop_imm(op, n)) ->
@@ -757,18 +751,21 @@ let rec emit_instr i dslot =
` addi {emit_gpr 1}, {emit_gpr 1}, 16\n`;
stack_offset := !stack_offset - 16
| Lraise k ->
- begin match !Clflags.debug && supports_backtraces, k with
- | true, (Lambda.Raise_regular | Lambda.Raise_reraise) ->
+ begin match !Clflags.debug, k with
+ | true, Lambda.Raise_regular ->
` bl {emit_symbol "caml_raise_exn"}\n`;
record_frame Reg.Set.empty i.dbg
+ | true, Lambda.Raise_reraise ->
+ ` bl {emit_symbol "caml_reraise_exn"}\n`;
+ record_frame Reg.Set.empty i.dbg
| false, _
| true, Lambda.Raise_notrace ->
` {emit_string lg} {emit_gpr 0}, 0({emit_gpr 29})\n`;
` mr {emit_gpr 1}, {emit_gpr 29}\n`;
- ` mtlr {emit_gpr 0}\n`;
+ ` mtctr {emit_gpr 0}\n`;
` {emit_string lg} {emit_gpr 29}, {emit_int size_addr}({emit_gpr 1})\n`;
` addi {emit_gpr 1}, {emit_gpr 1}, 16\n`;
- ` blr\n`
+ ` bctr\n`
end
and emit_delay = function