@@ -824,24 +824,16 @@ if_block_cond(
824
824
) when ? IS_GPR (Reg ) ->
825
825
% AND with mask
826
826
OffsetBefore = StreamModule :offset (Stream0 ),
827
- Stream1 =
828
- try
829
- I = jit_aarch64_asm :and_ (Temp , Reg , Mask ),
830
- StreamModule :append (Stream0 , I )
831
- catch
832
- error :{unencodable_immediate , Val } ->
833
- MoveI = jit_aarch64_asm :mov (Temp , Mask ),
834
- AndI = jit_aarch64_asm :and_ (Temp , Reg , Temp ),
835
- StreamModule :append (Stream0 , <<MoveI /binary , AndI /binary >>)
836
- end ,
827
+ State1 = op_imm (State0 , and_ , Temp , Reg , Mask ),
828
+ Stream1 = State1 # state .stream ,
837
829
% Compare with value
838
830
I2 = jit_aarch64_asm :cmp (Temp , Val ),
839
831
Stream2 = StreamModule :append (Stream1 , I2 ),
840
832
OffsetAfter = StreamModule :offset (Stream2 ),
841
833
I3 = jit_aarch64_asm :bcc (eq , 0 ),
842
834
Stream3 = StreamModule :append (Stream2 , I3 ),
843
- State1 = State0 # state {stream = Stream3 },
844
- {State1 , eq , OffsetAfter - OffsetBefore };
835
+ State2 = State1 # state {stream = Stream3 },
836
+ {State2 , eq , OffsetAfter - OffsetBefore };
845
837
if_block_cond (
846
838
# state {
847
839
stream_module = StreamModule ,
@@ -1728,47 +1720,40 @@ get_module_index(
1728
1720
Reg
1729
1721
}.
1730
1722
1731
- and_ (# state {stream_module = StreamModule , stream = Stream0 } = State , Reg , Val ) ->
1723
+ op_imm (# state {stream_module = StreamModule , stream = Stream0 } = State , Op , Reg , Reg , Val ) ->
1732
1724
Stream1 =
1733
1725
try
1734
- I = jit_aarch64_asm :and_ (Reg , Reg , Val ),
1726
+ I = jit_aarch64_asm :Op (Reg , Reg , Val ),
1735
1727
StreamModule :append (Stream0 , I )
1736
1728
catch
1737
1729
error :{unencodable_immediate , Val } ->
1738
1730
[Temp | _ ] = State # state .available_regs ,
1739
1731
I1 = jit_aarch64_asm :mov (Temp , Val ),
1740
- I2 = jit_aarch64_asm :and_ (Reg , Reg , Temp ),
1732
+ I2 = jit_aarch64_asm :Op (Reg , Reg , Temp ),
1741
1733
StreamModule :append (Stream0 , <<I1 /binary , I2 /binary >>)
1742
1734
end ,
1743
- State # state {stream = Stream1 }.
1744
-
1745
- or_ (# state {stream_module = StreamModule , stream = Stream0 } = State , Reg , Val ) ->
1735
+ State # state {stream = Stream1 };
1736
+ op_imm (# state {stream_module = StreamModule , stream = Stream0 } = State , Op , RegA , RegB , Val ) ->
1746
1737
Stream1 =
1747
1738
try
1748
- I = jit_aarch64_asm :orr ( Reg , Reg , Val ),
1739
+ I = jit_aarch64_asm :Op ( RegA , RegB , Val ),
1749
1740
StreamModule :append (Stream0 , I )
1750
1741
catch
1751
1742
error :{unencodable_immediate , Val } ->
1752
- [Temp | _ ] = State # state .available_regs ,
1753
- I1 = jit_aarch64_asm :mov (Temp , Val ),
1754
- I2 = jit_aarch64_asm :orr (Reg , Reg , Temp ),
1755
- StreamModule :append (Stream0 , <<I1 /binary , I2 /binary >>)
1743
+ MoveI = jit_aarch64_asm :mov (RegA , Val ),
1744
+ AndI = jit_aarch64_asm :Op (RegA , RegB , RegA ),
1745
+ StreamModule :append (Stream0 , <<MoveI /binary , AndI /binary >>)
1756
1746
end ,
1757
1747
State # state {stream = Stream1 }.
1758
1748
1759
- add (# state {stream_module = StreamModule , stream = Stream0 } = State , Reg , Val ) ->
1760
- Stream1 =
1761
- try
1762
- I = jit_aarch64_asm :add (Reg , Reg , Val ),
1763
- StreamModule :append (Stream0 , I )
1764
- catch
1765
- error :{unencodable_immediate , Val } ->
1766
- [Temp | _ ] = State # state .available_regs ,
1767
- I1 = jit_aarch64_asm :mov (Temp , Val ),
1768
- I2 = jit_aarch64_asm :add (Reg , Reg , Temp ),
1769
- StreamModule :append (Stream0 , <<I1 /binary , I2 /binary >>)
1770
- end ,
1771
- State # state {stream = Stream1 }.
1749
+ and_ (State , Reg , Val ) ->
1750
+ op_imm (State , and_ , Reg , Reg , Val ).
1751
+
1752
+ or_ (State , Reg , Val ) ->
1753
+ op_imm (State , orr , Reg , Reg , Val ).
1754
+
1755
+ add (State , Reg , Val ) ->
1756
+ op_imm (State , add , Reg , Reg , Val ).
1772
1757
1773
1758
sub (# state {stream_module = StreamModule , stream = Stream0 } = State , Reg , Val ) ->
1774
1759
I1 = jit_aarch64_asm :sub (Reg , Reg , Val ),
0 commit comments