235
266
# Receive operations.
237
wait_timeout Fail Src=iw => gen_literal_timeout(Fail, Src)
238
wait_timeout Fail Src=o => i_put_float Src x | wait_timeout Fail x
268
loop_rec Fail Src | smp_mark_target_label(Fail) => i_loop_rec Fail Src
270
label L | wait_timeout Fail Src | smp_already_locked(L) => label L | i_wait_timeout_locked Fail Src
271
wait_timeout Fail Src => i_wait_timeout Fail Src
272
i_wait_timeout Fail Src=aiow => gen_literal_timeout(Fail, Src)
273
i_wait_timeout_locked Fail Src=aiow => gen_literal_timeout_locked(Fail, Src)
275
label L | wait Fail | smp_already_locked(L) => label L | wait_locked Fail
276
wait Fail | smp() => wait_unlocked Fail
278
label L | timeout | smp_already_locked(L) => label L | timeout_locked
290
i_wait_timeout_locked f I
291
i_wait_timeout_locked f s
251
# Arithmethic operations.
253
m_times Lbl S1 S2=i==1 D => m_plus Lbl S1 i D
254
m_times Lbl S1 S2=i==2 D => m_plus Lbl S1 S1 D
256
m_plus Lbl S1 S2 D => i_fetch S1 S2 | i_plus Lbl D
257
m_minus Lbl S1 S2 D => i_fetch S1 S2 | i_minus Lbl D
258
m_times Lbl S1 S2 D => i_fetch S1 S2 | i_times Lbl D
259
m_div Lbl S1 S2 D => i_fetch S1 S2 | i_m_div Lbl D
260
int_div Lbl S1 S2 D => i_fetch S1 S2 | i_int_div Lbl D
261
int_rem Lbl S1 S2 D => i_fetch S1 S2 | i_rem Lbl D
262
int_band Lbl S1 S2 D => i_fetch S1 S2 | i_band Lbl D
263
int_bor Lbl S1 S2 D => i_fetch S1 S2 | i_bor Lbl D
264
int_bxor Lbl S1 S2 D => i_fetch S1 S2 | i_bxor Lbl D
265
int_bsl Lbl S1 S2 D => i_fetch S1 S2 | i_bsl Lbl D
266
int_bsr Lbl S1 S2 D => i_fetch S1 S2 | i_bsr Lbl D
297
# Fetch operations (used for arithmetic instructions).
268
300
i_fetch S1=w S2=w => i_fetch r r | i_fetch_big1 S1 | i_fetch_big2 S2
269
301
i_fetch S1=w S2 => i_fetch r S2 | i_fetch_big1 S1
954
965
is_function Fail=f cwo => jump Fail
967
func_info M=a a==am_module_info A=u==0 | label L | move n r => gen_func_info_mi(M, A, L)
968
func_info M=a a==am_module_info A=u==1 | label L | move n r => gen_func_info_mi(M, A, L)
956
969
func_info M=a F=a A=u | label L => gen_func_info(M, F, A, L)
959
# Matching binaries: Getting started.
971
# ================================================================
972
# New bit syntax matching (R11B).
973
# ================================================================
962
%macro: bs_start_match BsStartMatch -fail_action
966
bs_start_match Fail=f icwoa => jump Fail
972
# Fetching integers from binaries.
974
bs_get_integer Fail=f Sz=s Unit=u Flags=u Dst=d => \
975
gen_get_integer(Fail, Sz, Unit, Flags, Dst)
976
%macro: i_bs_get_integer_imm BsGetIntegerImm -fail_action -gen_dest
977
%macro: i_bs_get_integer BsGetInteger -fail_action -gen_dest
978
%macro: i_bs_get_integer8 BsGetInteger8 -fail_action -gen_dest
979
%macro: i_bs_get_integer16 BsGetInteger16 -fail_action -gen_dest
980
%macro: i_bs_get_integer32 BsGetInteger32 -fail_action -gen_dest
981
i_bs_get_integer_imm f I I d
982
i_bs_get_integer f s I d
983
i_bs_get_integer8 f d
984
i_bs_get_integer16 f d
985
i_bs_get_integer32 f d
988
# Fetching integers from binaries.
990
bs_get_binary Fail=f Sz=s Unit=u Flags=u Dst=d => \
991
gen_get_binary(Fail, Sz, Unit, Flags, Dst)
992
%macro: i_bs_get_binary_imm BsGetBinaryImm -fail_action -gen_dest
993
%macro: i_bs_get_binary BsGetBinary -fail_action -gen_dest
994
%macro: i_bs_get_binary_all BsGetBinaryAll -fail_action -gen_dest
995
i_bs_get_binary_imm f I I d
996
i_bs_get_binary f s I d
997
i_bs_get_binary_all f d
1000
# Fetching floats from binaries.
1002
bs_get_float Fail=f Sz=s Unit=u Flags=u Dst=d => \
1003
gen_get_float(Fail, Sz, Unit, Flags, Dst)
1005
%macro: i_bs_get_float BsGetFloat -fail_action -gen_dest
1006
i_bs_get_float f s I d
1009
# Skipping uninteresting bits.
1011
bs_skip_bits Fail=f Sz=s Unit=u Flags=u => gen_skip_bits(Fail, Sz, Unit, Flags)
1013
%macro: i_bs_skip_bits_imm BsSkipBitsImm -fail_action
1014
i_bs_skip_bits_imm f I
1016
%macro: i_bs_skip_bits BsSkipBits -fail_action
1017
i_bs_skip_bits f x I
1018
i_bs_skip_bits f r I
1019
i_bs_skip_bits f y I
1021
%macro: i_bs_skip_bits_all BsSkipBitsAll -fail_action
1022
i_bs_skip_bits_all f
1024
%macro: i_bs_skip_bits_all_aligned BsSkipBitsAllAligned -fail_action
1025
i_bs_skip_bits_all_aligned
1030
bs_test_tail Fail=f Bits=u==0 => bs_test_zero_tail Fail
1031
bs_test_tail Fail=f Bits=u => bs_test_tail_imm Fail Bits
1033
bs_test_tail_imm f I
1036
# Some optimisations.
1038
i_bs_get_binary_all Fail Dst | bs_test_tail f u==0 => i_bs_get_binary_all Fail Dst
1039
i_bs_skip_bits_all_aligned | bs_test_tail f u==0 =>
1040
i_bs_skip_bits_all Fail | bs_test_tail f u==0 => i_bs_skip_bits_all Fail
976
%macro: bs_start_match2 BsStartMatch2 -fail_action -gen_dest
977
bs_start_match2 f r I I d
978
bs_start_match2 f x I I d
979
bs_start_match2 f y I I d
980
bs_start_match2 Fail=f icwoa X Y D => jump Fail
987
# Fetching integers from binaries.
988
bs_get_integer2 Fail=f Ms=rx Live=u Sz=s Unit=u Flags=u Dst=d => \
989
gen_get_integer2(Fail, Ms, Live, Sz, Unit, Flags, Dst)
990
%macro: i_bs_get_integer_imm2 BsGetIntegerImm2 -fail_action -gen_dest
991
%macro: i_bs_get_integer2 BsGetInteger2 -fail_action -gen_dest
992
%macro: i_bs_get_integer2_8 BsGetInteger2_8 -fail_action -gen_dest
993
%macro: i_bs_get_integer2_16 BsGetInteger2_16 -fail_action -gen_dest
994
%macro: i_bs_get_integer2_32 BsGetInteger2_32 -fail_action -gen_dest
995
i_bs_get_integer_imm2 f r I I I d
996
i_bs_get_integer_imm2 f x I I I d
997
i_bs_get_integer2 f r I s I d
998
i_bs_get_integer2 f x I s I d
999
i_bs_get_integer2_8 f r d
1000
i_bs_get_integer2_8 f x d
1001
i_bs_get_integer2_16 f r d
1002
i_bs_get_integer2_16 f x d
1003
i_bs_get_integer2_32 f r I d
1004
i_bs_get_integer2_32 f x I d
1006
# Fetching binaries from binaries.
1007
bs_get_binary2 Fail=f Ms=rx Live=u Sz=s Unit=u Flags=u Dst=d => \
1008
gen_get_binary2(Fail, Ms, Live, Sz, Unit, Flags, Dst)
1009
%macro: i_bs_get_binary_imm2 BsGetBinaryImm_2 -fail_action -gen_dest
1010
%macro: i_bs_get_binary2 BsGetBinary_2 -fail_action -gen_dest
1011
%macro: i_bs_get_binary_all2 BsGetBinaryAll_2 -fail_action -gen_dest
1012
i_bs_get_binary_imm2 f r I I I d
1013
i_bs_get_binary_imm2 f x I I I d
1014
i_bs_get_binary2 f r I s I d
1015
i_bs_get_binary2 f x I s I d
1016
i_bs_get_binary_all2 f r I I d
1017
i_bs_get_binary_all2 f x I I d
1019
# Fetching float from binaries.
1020
bs_get_float2 Fail=f Ms=rx Live=u Sz=s Unit=u Flags=u Dst=d => \
1021
gen_get_float2(Fail, Ms, Live, Sz, Unit, Flags, Dst)
1023
%macro: i_bs_get_float2 BsGetFloat2 -fail_action -gen_dest
1024
i_bs_get_float2 f r I s I d
1025
i_bs_get_float2 f x I s I d
1029
bs_skip_bits2 Fail=f Ms=rx Sz=s Unit=u Flags=u => \
1030
gen_skip_bits2(Fail, Ms, Sz, Unit, Flags)
1032
%macro: i_bs_skip_bits_imm2 BsSkipBitsImm2 -fail_action
1033
i_bs_skip_bits_imm2 f r I
1034
i_bs_skip_bits_imm2 f x I
1036
%macro: i_bs_skip_bits2 BsSkipBits2 -fail_action
1037
i_bs_skip_bits2 f r x I
1038
i_bs_skip_bits2 f r r I
1039
i_bs_skip_bits2 f r y I
1040
i_bs_skip_bits2 f x x I
1041
i_bs_skip_bits2 f x r I
1042
i_bs_skip_bits2 f x y I
1044
%macro: i_bs_skip_bits_all2 BsSkipBitsAll2 -fail_action
1045
i_bs_skip_bits_all2 f r I
1046
i_bs_skip_bits_all2 f x I
1048
bs_test_tail2 Fail=f Ms=rx Bits=u==0 => bs_test_zero_tail2 Fail Ms
1049
bs_test_tail2 Fail=f Ms=rx Bits=u => bs_test_tail_imm2 Fail Ms Bits
1050
bs_test_zero_tail2 f r
1051
bs_test_zero_tail2 f x
1052
bs_test_tail_imm2 f r I
1053
bs_test_tail_imm2 f x I
1043
1059
# Constructing binaries
1047
bs_init Size Flags=u | bs_need_buf Bits=u | assign_heap_bin_flag(Flags, Bits) => \
1049
bs_init Size Flags | reset_heap_bin_flag() => i_bs_init
1052
bs_final Fail Dst | generate_heap_bin() => i_bs_final_heap Dst
1053
bs_final Fail Dst => i_bs_final Fail Dst
1063
bs_init2 Fail Sz=u Words=u==0 Regs Flags Dst | should_gen_heap_bin(Sz) | new_bs_instructions() => i_bs_init_heap_bin Sz Regs Dst
1064
bs_init2 Fail Sz=u Words=u==0 Regs Flags Dst | new_bs_instructions() => i_bs_init Sz Regs Dst
1066
bs_init2 Fail Sz=u Words Regs Flags Dst | should_gen_heap_bin(Sz) | new_bs_instructions() => i_bs_init_heap_bin_heap Sz Words Regs Dst
1067
bs_init2 Fail Sz=u Words Regs Flags Dst | new_bs_instructions() => \
1068
i_bs_init_heap Sz Words Regs Dst
1070
bs_init2 Fail Sz Words=u==0 Regs Flags Dst | new_bs_instructions() => \
1071
i_bs_init_fail Sz Fail Regs Dst
1072
bs_init2 Fail Sz Words Regs Flags Dst | new_bs_instructions() => \
1073
i_fetch Sz r | i_bs_init_fail_heap Words Fail Regs Dst
1075
i_bs_init_fail r j I d
1076
i_bs_init_fail x j I d
1077
i_bs_init_fail y j I d
1079
i_bs_init_fail_heap I j I d
1082
i_bs_init_heap_bin I I d
1084
i_bs_init_heap I I I d
1085
i_bs_init_heap_bin_heap I I I d
1087
bs_bits_to_bytes Fail Src Dst => i_bs_bits_to_bytes Src Fail Dst
1089
i_bs_bits_to_bytes r j d
1090
i_bs_bits_to_bytes x j d
1091
i_bs_bits_to_bytes y j d
1093
bs_bits_to_bytes2 Src Dst => i_bs_bits_to_bytes2 Src Dst
1095
i_bs_bits_to_bytes2 r d
1096
i_bs_bits_to_bytes2 x d
1097
i_bs_bits_to_bytes2 y d
1099
bs_final2 Src Dst => i_bs_final2 Src Dst
1105
bs_add Fail S1 S2 Unit D => i_fetch S1 S2 | i_bs_add Fail Unit D
1060
1110
# Storing integers into binaries.