diff options
author | Björn Gustavsson <bjorn@erlang.org> | 2022-11-23 06:25:35 +0100 |
---|---|---|
committer | Björn Gustavsson <bjorn@erlang.org> | 2023-01-27 11:48:38 +0100 |
commit | 47a41a451113d1cf4bb851c4a23615961c113c45 (patch) | |
tree | dfa0960720ce69fb75118db0bd8ba672d8402636 | |
parent | 53f9178c434462b134c97133d048055bae88d082 (diff) | |
download | erlang-47a41a451113d1cf4bb851c4a23615961c113c45.tar.gz |
Reduce size of exception generation instructions
-rw-r--r-- | erts/emulator/beam/jit/arm/beam_asm.hpp | 1 | ||||
-rw-r--r-- | erts/emulator/beam/jit/arm/instr_common.cpp | 21 |
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, |