Skip to content

Commit 2570673

Browse files
committed
AArch64 : set_bs, rewrite_cp_offset
Signed-off-by: Paul Guyot <[email protected]>
1 parent 1a335ed commit 2570673

File tree

2 files changed

+32
-15
lines changed

2 files changed

+32
-15
lines changed

libs/jit/src/jit_aarch64.erl

Lines changed: 25 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1840,9 +1840,9 @@ decrement_reductions_and_maybe_schedule_next(
18401840

18411841
-spec call_or_schedule_next(state(), non_neg_integer()) -> state().
18421842
call_or_schedule_next(State0, Label) ->
1843-
{State1, RewriteOffset} = set_cp(State0),
1843+
{State1, RewriteOffset, RewriteSize} = set_cp(State0),
18441844
State2 = call_only_or_schedule_next(State1, Label),
1845-
rewrite_cp_offset(State2, RewriteOffset).
1845+
rewrite_cp_offset(State2, RewriteOffset, RewriteSize).
18461846

18471847
call_only_or_schedule_next(
18481848
#state{
@@ -1870,11 +1870,11 @@ call_only_or_schedule_next(
18701870
call_primitive_last(State2, ?PRIM_SCHEDULE_NEXT_CP, [ctx, jit_state]).
18711871

18721872
call_primitive_with_cp(State0, Primitive, Args) ->
1873-
{State1, RewriteOffset} = set_cp(State0),
1873+
{State1, RewriteOffset, RewriteSize} = set_cp(State0),
18741874
State2 = call_primitive_last(State1, Primitive, Args),
1875-
rewrite_cp_offset(State2, RewriteOffset).
1875+
rewrite_cp_offset(State2, RewriteOffset, RewriteSize).
18761876

1877-
-spec set_cp(state()) -> {state(), non_neg_integer()}.
1877+
-spec set_cp(state()) -> {state(), non_neg_integer(), 4 | 8}.
18781878
set_cp(State0) ->
18791879
% get module index (dynamically)
18801880
{#state{stream_module = StreamModule, stream = Stream0} = State1, Reg} = get_module_index(
@@ -1883,30 +1883,40 @@ set_cp(State0) ->
18831883
Offset = StreamModule:offset(Stream0),
18841884
% build cp with module_index << 24
18851885
I1 = jit_aarch64_asm:lsl(Reg, Reg, 24),
1886-
I2 = jit_aarch64_asm:mov(?IP0_REG, 0),
1886+
if
1887+
Offset >= 16250 ->
1888+
I2 = jit_aarch64_asm:nop(),
1889+
I3 = jit_aarch64_asm:nop(),
1890+
RewriteSize = 8;
1891+
true ->
1892+
I2 = jit_aarch64_asm:nop(),
1893+
I3 = <<>>,
1894+
RewriteSize = 4
1895+
end,
18871896
MOVOffset = Offset + byte_size(I1),
1888-
I3 = jit_aarch64_asm:orr(Reg, Reg, ?IP0_REG),
1889-
I4 = jit_aarch64_asm:str(Reg, ?CP),
1890-
Code = <<I1/binary, I2/binary, I3/binary, I4/binary>>,
1897+
I4 = jit_aarch64_asm:orr(Reg, Reg, ?IP0_REG),
1898+
I5 = jit_aarch64_asm:str(Reg, ?CP),
1899+
Code = <<I1/binary, I2/binary, I3/binary, I4/binary, I5/binary>>,
18911900
Stream1 = StreamModule:append(Stream0, Code),
18921901
State2 = State1#state{stream = Stream1},
18931902
State3 = free_native_register(State2, Reg),
1894-
{State3, MOVOffset}.
1903+
{State3, MOVOffset, RewriteSize}.
18951904

1896-
-spec rewrite_cp_offset(state(), non_neg_integer()) -> state().
1905+
-spec rewrite_cp_offset(state(), non_neg_integer(), 4 | 8) -> state().
18971906
rewrite_cp_offset(
18981907
#state{stream_module = StreamModule, stream = Stream0, offset = CodeOffset} = State0,
1899-
RewriteOffset
1908+
RewriteOffset,
1909+
_RewriteSize
19001910
) ->
19011911
NewOffset = StreamModule:offset(Stream0) - CodeOffset,
19021912
NewMoveInstr = jit_aarch64_asm:mov(?IP0_REG, NewOffset bsl 2),
1903-
?ASSERT(byte_size(NewMoveInstr) =:= 4),
1913+
?ASSERT(byte_size(NewMoveInstr) =< _RewriteSize),
19041914
Stream1 = StreamModule:replace(Stream0, RewriteOffset, NewMoveInstr),
19051915
State0#state{stream = Stream1}.
19061916

19071917
set_bs(#state{stream_module = StreamModule, stream = Stream0} = State0, TermReg) ->
1908-
I1 = jit_x86_64_asm_unimplemented:movq(TermReg, ?BS),
1909-
I2 = jit_x86_64_asm_unimplemented:movq(0, ?BS_OFFSET),
1918+
I1 = jit_aarch64_asm:str(TermReg, ?BS),
1919+
I2 = jit_aarch64_asm:str(xzr, ?BS_OFFSET),
19101920
Stream1 = StreamModule:append(Stream0, <<I1/binary, I2/binary>>),
19111921
State0#state{stream = Stream1}.
19121922

libs/jit/src/jit_aarch64_asm.erl

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@
4444
movz/3,
4545
orr/3,
4646
ret/0,
47+
nop/0,
4748
str/2,
4849
str/3,
4950
tst/2,
@@ -872,6 +873,12 @@ ret() ->
872873
%% 11010110010111110000001111000000
873874
<<16#D65F03C0:32/little>>.
874875

876+
%% Emit a NOP instruction
877+
-spec nop() -> binary().
878+
nop() ->
879+
%% 11010101000000110010000000011111
880+
<<16#d503201f:32/little>>.
881+
875882
%% Emit a test instruction (bitwise AND, discarding result)
876883
-spec tst(aarch64_gpr_register(), aarch64_gpr_register() | integer()) -> binary().
877884
tst(Rn, Rm) when is_atom(Rn), is_atom(Rm) ->

0 commit comments

Comments
 (0)