Skip to content

Commit 55e7c29

Browse files
committed
JIT: reduce register usage on binary matching
Signed-off-by: Paul Guyot <[email protected]>
1 parent 4a7865e commit 55e7c29

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
@@ -2894,10 +2894,10 @@ do_get_tail(
28942894
MSt1 = cond_raise_badarg({BSOffsetReg, '&', 2#111, '!=', 0}, MMod, MSt0),
28952895
{MSt2, BSOffseBytesReg} = MMod:copy_to_native_register(MSt1, BSOffsetReg),
28962896
MSt3 = MMod:shift_right(MSt2, BSOffseBytesReg, 3),
2897-
{MSt4, TailBytesReg} = MMod:get_array_element(MSt3, BSBinaryReg, 1),
2898-
MSt5 = MMod:sub(MSt4, TailBytesReg, BSOffseBytesReg),
2897+
{MSt4, TailBytesReg0} = MMod:get_array_element(MSt3, BSBinaryReg, 1),
2898+
MSt5 = MMod:sub(MSt4, TailBytesReg0, BSOffseBytesReg),
28992899
{MSt6, HeapSizeReg} = MMod:call_primitive(MSt5, ?PRIM_TERM_SUB_BINARY_HEAP_SIZE, [
2900-
BSBinaryReg, TailBytesReg
2900+
BSBinaryReg, {free, TailBytesReg0}
29012901
]),
29022902
{MSt7, NewMatchState} = memory_ensure_free_with_extra_root(
29032903
MatchState, Live, {free, HeapSizeReg}, MMod, MSt6
@@ -2907,13 +2907,17 @@ do_get_tail(
29072907
MSt9 = MMod:and_(MSt8, MatchStateReg0, ?TERM_PRIMARY_CLEAR_MASK),
29082908
MSt10 = MMod:move_array_element(MSt9, MatchStateReg0, 1, BSBinaryReg),
29092909
MSt11 = MMod:free_native_registers(MSt10, [MatchStateReg0]),
2910-
{MSt12, ResultTerm} = MMod:call_primitive(MSt11, ?PRIM_TERM_MAYBE_CREATE_SUB_BINARY, [
2911-
ctx, BSBinaryReg, {free, BSOffseBytesReg}, TailBytesReg
2912-
]),
2913-
MSt13 = MMod:shift_left(MSt12, TailBytesReg, 3),
2914-
MSt14 = MMod:add(MSt13, BSOffsetReg, TailBytesReg),
2915-
MSt15 = MMod:free_native_registers(MSt14, [TailBytesReg]),
2916-
{MSt15, ResultTerm, NewMatchState}.
2910+
MSt12 = MMod:and_(MSt11, BSBinaryReg, ?TERM_PRIMARY_CLEAR_MASK),
2911+
{MSt13, TailBytesReg1} = MMod:get_array_element(MSt12, BSBinaryReg, 1),
2912+
MSt14 = MMod:sub(MSt13, TailBytesReg0, BSOffseBytesReg),
2913+
MSt15 = MMod:add(MSt14, BSBinaryReg, ?TERM_PRIMARY_BOXED),
2914+
{MSt16, ResultTerm} = MMod:call_primitive(MSt15, ?PRIM_TERM_MAYBE_CREATE_SUB_BINARY, [
2915+
ctx, BSBinaryReg, {free, BSOffseBytesReg}, TailBytesReg1
2916+
]),
2917+
MSt17 = MMod:shift_left(MSt16, TailBytesReg1, 3),
2918+
MSt18 = MMod:add(MSt17, BSOffsetReg, TailBytesReg1),
2919+
MSt19 = MMod:free_native_registers(MSt18, [TailBytesReg1]),
2920+
{MSt19, ResultTerm, NewMatchState}.
29172921

29182922
first_pass_bs_match_equal_colon_equal(
29192923
Fail, MatchState, BSBinaryReg, BSOffsetReg, J0, Rest0, MMod, MSt0

0 commit comments

Comments
 (0)