Skip to content

Commit cac5a1d

Browse files
committed
Merge pull request #1835 from pguyot/w39/jit-reduce-register-usage-onbinary-matching
JIT: reduce register usage on binary matching These changes are made under both the "Apache 2.0" and the "GNU Lesser General Public License 2.1 or later" license terms (dual license). SPDX-License-Identifier: Apache-2.0 OR LGPL-2.1-or-later
2 parents 323f8c1 + 55e7c29 commit cac5a1d

File tree

1 file changed

+14
-10
lines changed

1 file changed

+14
-10
lines changed

libs/jit/src/jit.erl

Lines changed: 14 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -2915,10 +2915,10 @@ do_get_tail(
29152915
MSt1 = cond_raise_badarg({BSOffsetReg, '&', 2#111, '!=', 0}, MMod, MSt0),
29162916
{MSt2, BSOffseBytesReg} = MMod:copy_to_native_register(MSt1, BSOffsetReg),
29172917
MSt3 = MMod:shift_right(MSt2, BSOffseBytesReg, 3),
2918-
{MSt4, TailBytesReg} = MMod:get_array_element(MSt3, BSBinaryReg, 1),
2919-
MSt5 = MMod:sub(MSt4, TailBytesReg, BSOffseBytesReg),
2918+
{MSt4, TailBytesReg0} = MMod:get_array_element(MSt3, BSBinaryReg, 1),
2919+
MSt5 = MMod:sub(MSt4, TailBytesReg0, BSOffseBytesReg),
29202920
{MSt6, HeapSizeReg} = MMod:call_primitive(MSt5, ?PRIM_TERM_SUB_BINARY_HEAP_SIZE, [
2921-
BSBinaryReg, TailBytesReg
2921+
BSBinaryReg, {free, TailBytesReg0}
29222922
]),
29232923
{MSt7, NewMatchState} = memory_ensure_free_with_extra_root(
29242924
MatchState, Live, {free, HeapSizeReg}, MMod, MSt6
@@ -2928,13 +2928,17 @@ do_get_tail(
29282928
MSt9 = MMod:and_(MSt8, MatchStateReg0, ?TERM_PRIMARY_CLEAR_MASK),
29292929
MSt10 = MMod:move_array_element(MSt9, MatchStateReg0, 1, BSBinaryReg),
29302930
MSt11 = MMod:free_native_registers(MSt10, [MatchStateReg0]),
2931-
{MSt12, ResultTerm} = MMod:call_primitive(MSt11, ?PRIM_TERM_MAYBE_CREATE_SUB_BINARY, [
2932-
ctx, BSBinaryReg, {free, BSOffseBytesReg}, TailBytesReg
2933-
]),
2934-
MSt13 = MMod:shift_left(MSt12, TailBytesReg, 3),
2935-
MSt14 = MMod:add(MSt13, BSOffsetReg, TailBytesReg),
2936-
MSt15 = MMod:free_native_registers(MSt14, [TailBytesReg]),
2937-
{MSt15, ResultTerm, NewMatchState}.
2931+
MSt12 = MMod:and_(MSt11, BSBinaryReg, ?TERM_PRIMARY_CLEAR_MASK),
2932+
{MSt13, TailBytesReg1} = MMod:get_array_element(MSt12, BSBinaryReg, 1),
2933+
MSt14 = MMod:sub(MSt13, TailBytesReg0, BSOffseBytesReg),
2934+
MSt15 = MMod:add(MSt14, BSBinaryReg, ?TERM_PRIMARY_BOXED),
2935+
{MSt16, ResultTerm} = MMod:call_primitive(MSt15, ?PRIM_TERM_MAYBE_CREATE_SUB_BINARY, [
2936+
ctx, BSBinaryReg, {free, BSOffseBytesReg}, TailBytesReg1
2937+
]),
2938+
MSt17 = MMod:shift_left(MSt16, TailBytesReg1, 3),
2939+
MSt18 = MMod:add(MSt17, BSOffsetReg, TailBytesReg1),
2940+
MSt19 = MMod:free_native_registers(MSt18, [TailBytesReg1]),
2941+
{MSt19, ResultTerm, NewMatchState}.
29382942

29392943
first_pass_bs_match_equal_colon_equal(
29402944
Fail, MatchState, BSBinaryReg, BSOffsetReg, J0, Rest0, MMod, MSt0

0 commit comments

Comments
 (0)