@@ -1840,9 +1840,9 @@ decrement_reductions_and_maybe_schedule_next(
18401840
18411841- spec call_or_schedule_next (state (), non_neg_integer ()) -> state ().
18421842call_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
18471847call_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
18721872call_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 }.
18781878set_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 ().
18971906rewrite_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
19071917set_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
0 commit comments