summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBjörn Gustavsson <bjorn@erlang.org>2022-11-23 06:25:35 +0100
committerBjörn Gustavsson <bjorn@erlang.org>2023-01-27 11:48:38 +0100
commit47a41a451113d1cf4bb851c4a23615961c113c45 (patch)
treedfa0960720ce69fb75118db0bd8ba672d8402636
parent53f9178c434462b134c97133d048055bae88d082 (diff)
downloaderlang-47a41a451113d1cf4bb851c4a23615961c113c45.tar.gz
Reduce size of exception generation instructions
-rw-r--r--erts/emulator/beam/jit/arm/beam_asm.hpp1
-rw-r--r--erts/emulator/beam/jit/arm/instr_common.cpp21
2 files changed, 14 insertions, 8 deletions
diff --git a/erts/emulator/beam/jit/arm/beam_asm.hpp b/erts/emulator/beam/jit/arm/beam_asm.hpp
index 7444dc6b71..d926f699f0 100644
--- a/erts/emulator/beam/jit/arm/beam_asm.hpp
+++ b/erts/emulator/beam/jit/arm/beam_asm.hpp
@@ -1488,6 +1488,7 @@ protected:
const ArgRegister &Dst);
void emit_error(int code);
+ void emit_error(int reason, const ArgSource &Src);
int emit_bs_get_field_size(const ArgSource &Size,
int unit,
diff --git a/erts/emulator/beam/jit/arm/instr_common.cpp b/erts/emulator/beam/jit/arm/instr_common.cpp
index 6cdc8148a8..8cf75ac85f 100644
--- a/erts/emulator/beam/jit/arm/instr_common.cpp
+++ b/erts/emulator/beam/jit/arm/instr_common.cpp
@@ -75,6 +75,15 @@ void BeamModuleAssembler::emit_error(int reason) {
emit_raise_exception();
}
+void BeamModuleAssembler::emit_error(int reason, const ArgSource &Src) {
+ auto src = load_source(Src, TMP2);
+
+ ERTS_CT_ASSERT_FIELD_PAIR(Process, freason, fvalue);
+ mov_imm(TMP1, reason);
+ a.stp(TMP1, src.reg, arm::Mem(c_p, offsetof(Process, freason)));
+ emit_raise_exception();
+}
+
void BeamModuleAssembler::emit_gc_test_preserve(const ArgWord &Need,
const ArgWord &Live,
const ArgSource &Preserve,
@@ -2240,13 +2249,11 @@ void BeamModuleAssembler::emit_is_int_ge(ArgLabel const &Fail,
}
void BeamModuleAssembler::emit_badmatch(const ArgSource &Src) {
- mov_arg(arm::Mem(c_p, offsetof(Process, fvalue)), Src);
- emit_error(BADMATCH);
+ emit_error(BADMATCH, Src);
}
void BeamModuleAssembler::emit_case_end(const ArgSource &Src) {
- mov_arg(arm::Mem(c_p, offsetof(Process, fvalue)), Src);
- emit_error(EXC_CASE_CLAUSE);
+ emit_error(EXC_CASE_CLAUSE, Src);
}
void BeamModuleAssembler::emit_system_limit_body() {
@@ -2258,8 +2265,7 @@ void BeamModuleAssembler::emit_if_end() {
}
void BeamModuleAssembler::emit_badrecord(const ArgSource &Src) {
- mov_arg(arm::Mem(c_p, offsetof(Process, fvalue)), Src);
- emit_error(EXC_BADRECORD);
+ emit_error(EXC_BADRECORD, Src);
}
void BeamModuleAssembler::emit_catch(const ArgYRegister &Y,
@@ -2398,8 +2404,7 @@ void BeamModuleAssembler::emit_try_case(const ArgYRegister &CatchTag) {
}
void BeamModuleAssembler::emit_try_case_end(const ArgSource &Src) {
- mov_arg(arm::Mem(c_p, offsetof(Process, fvalue)), Src);
- emit_error(EXC_TRY_CLAUSE);
+ emit_error(EXC_TRY_CLAUSE, Src);
}
void BeamModuleAssembler::emit_raise(const ArgSource &Trace,