@@ -1840,9 +1840,9 @@ decrement_reductions_and_maybe_schedule_next(
1840
1840
1841
1841
- spec call_or_schedule_next (state (), non_neg_integer ()) -> state ().
1842
1842
call_or_schedule_next (State0 , Label ) ->
1843
- {State1 , RewriteOffset } = set_cp (State0 ),
1843
+ {State1 , RewriteOffset , RewriteSize } = set_cp (State0 ),
1844
1844
State2 = call_only_or_schedule_next (State1 , Label ),
1845
- rewrite_cp_offset (State2 , RewriteOffset ).
1845
+ rewrite_cp_offset (State2 , RewriteOffset , RewriteSize ).
1846
1846
1847
1847
call_only_or_schedule_next (
1848
1848
# state {
@@ -1870,11 +1870,11 @@ call_only_or_schedule_next(
1870
1870
call_primitive_last (State2 , ? PRIM_SCHEDULE_NEXT_CP , [ctx , jit_state ]).
1871
1871
1872
1872
call_primitive_with_cp (State0 , Primitive , Args ) ->
1873
- {State1 , RewriteOffset } = set_cp (State0 ),
1873
+ {State1 , RewriteOffset , RewriteSize } = set_cp (State0 ),
1874
1874
State2 = call_primitive_last (State1 , Primitive , Args ),
1875
- rewrite_cp_offset (State2 , RewriteOffset ).
1875
+ rewrite_cp_offset (State2 , RewriteOffset , RewriteSize ).
1876
1876
1877
- - spec set_cp (state ()) -> {state (), non_neg_integer ()}.
1877
+ - spec set_cp (state ()) -> {state (), non_neg_integer (), 4 | 8 }.
1878
1878
set_cp (State0 ) ->
1879
1879
% get module index (dynamically)
1880
1880
{# state {stream_module = StreamModule , stream = Stream0 } = State1 , Reg } = get_module_index (
@@ -1883,30 +1883,40 @@ set_cp(State0) ->
1883
1883
Offset = StreamModule :offset (Stream0 ),
1884
1884
% build cp with module_index << 24
1885
1885
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 ,
1887
1896
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 >>,
1891
1900
Stream1 = StreamModule :append (Stream0 , Code ),
1892
1901
State2 = State1 # state {stream = Stream1 },
1893
1902
State3 = free_native_register (State2 , Reg ),
1894
- {State3 , MOVOffset }.
1903
+ {State3 , MOVOffset , RewriteSize }.
1895
1904
1896
- - spec rewrite_cp_offset (state (), non_neg_integer ()) -> state ().
1905
+ - spec rewrite_cp_offset (state (), non_neg_integer (), 4 | 8 ) -> state ().
1897
1906
rewrite_cp_offset (
1898
1907
# state {stream_module = StreamModule , stream = Stream0 , offset = CodeOffset } = State0 ,
1899
- RewriteOffset
1908
+ RewriteOffset ,
1909
+ _RewriteSize
1900
1910
) ->
1901
1911
NewOffset = StreamModule :offset (Stream0 ) - CodeOffset ,
1902
1912
NewMoveInstr = jit_aarch64_asm :mov (? IP0_REG , NewOffset bsl 2 ),
1903
- ? ASSERT (byte_size (NewMoveInstr ) =:= 4 ),
1913
+ ? ASSERT (byte_size (NewMoveInstr ) =< _RewriteSize ),
1904
1914
Stream1 = StreamModule :replace (Stream0 , RewriteOffset , NewMoveInstr ),
1905
1915
State0 # state {stream = Stream1 }.
1906
1916
1907
1917
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 ),
1910
1920
Stream1 = StreamModule :append (Stream0 , <<I1 /binary , I2 /binary >>),
1911
1921
State0 # state {stream = Stream1 }.
1912
1922
0 commit comments