197
197
gen_rtl({bs_test_tail, NumBits}, [NewMs], [Ms], TrueLblName, FalseLblName) ->
198
198
{[Offset,BinSize], ExCode} = extract_matchstate_vars([offset,binsize], Ms),
199
199
update_ms(NewMs, Ms) ++ ExCode ++
200
[hipe_rtl:mk_alu(Offset, Offset, add, hipe_rtl:mk_imm(NumBits)),
200
[add_to_offset(Offset, Offset, hipe_rtl:mk_imm(NumBits), FalseLblName),
201
201
hipe_rtl:mk_branch(Offset, eq, BinSize, TrueLblName, FalseLblName)];
202
202
gen_rtl({bs_test_unit, Unit}, [], [Ms], TrueLblName, FalseLblName) ->
203
203
{[Offset,BinSize], ExCode} = extract_matchstate_vars([offset,binsize], Ms),
208
208
gen_rtl({bs_test_tail, NumBits}, [], [Ms], TrueLblName, FalseLblName) ->
209
209
{[Offset,BinSize], ExCode} = extract_matchstate_vars([offset,binsize], Ms),
211
[hipe_rtl:mk_alu(Offset, Offset, add, hipe_rtl:mk_imm(NumBits)),
211
[add_to_offset(Offset, Offset, hipe_rtl:mk_imm(NumBits), FalseLblName),
212
212
hipe_rtl:mk_branch(Offset, eq, BinSize, TrueLblName, FalseLblName)];
213
213
gen_rtl({bs_skip_bits_all, Unit, _Flags}, Dst, [Ms],
214
214
TrueLblName, FalseLblName) ->
375
375
create_loops(N-1, Unit, RestString, IntFun)].
377
377
update_and_test(Reg, Unit, Offset, Value, FalseLblName) ->
378
[hipe_rtl:mk_alu(Offset, Offset, add, hipe_rtl:mk_imm(Unit*?BYTE_SIZE)),
378
[add_to_offset(Offset, Offset, hipe_rtl:mk_imm(Unit*?BYTE_SIZE), FalseLblName),
379
379
just_test(Reg, Value, FalseLblName)].
381
381
just_test(Reg, Value, FalseLblName) ->
632
632
skip_bits2(Ms, NoOfBits, TrueLblName, FalseLblName) ->
633
633
[NewOffset] = create_gcsafe_regs(1),
634
[SuccessLbl,TempLbl] = create_lbls(2),
634
[TempLbl] = create_lbls(1),
635
635
{[Offset,BinSize], ExCode} = extract_matchstate_vars([offset,binsize], Ms),
637
[hipe_rtl:mk_alub(NewOffset, NoOfBits, add, Offset, overflow,
638
FalseLblName, hipe_rtl:label_name(SuccessLbl),0.01),
640
hipe_rtl:mk_branch(BinSize, lt, NewOffset, FalseLblName,
641
hipe_rtl:label_name(TempLbl), 0.01),
643
update_offset(NewOffset,Ms),
644
hipe_rtl:mk_goto(TrueLblName)].
637
add_to_offset(NewOffset, NoOfBits, Offset, FalseLblName) ++
638
[hipe_rtl:mk_branch(BinSize, 'ltu', NewOffset, FalseLblName,
639
hipe_rtl:label_name(TempLbl), 0.01),
641
update_offset(NewOffset,Ms),
642
hipe_rtl:mk_goto(TrueLblName)].
644
add_to_offset(Result, Extra, Original, _FalseLblName) ->
645
%% TODO: MAke this unsigned overflow to FalseLblName
646
[hipe_rtl:mk_alu(Result, Extra, add, Original)].
646
648
%%%%%%%%%%%%%%%%%%%%%%% Code for start match %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
707
709
lists:unzip([extract_matchstate_var(Name, Ms) || Name <- List]).
709
711
check_size(Offset, Size, BinSize, Tmp1, ContLblName, FalseLblName) ->
710
[hipe_rtl:mk_alu(Tmp1, Offset, add, Size),
712
[add_to_offset(Tmp1, Offset, Size, FalseLblName),
711
713
hipe_rtl:mk_branch(Tmp1, leu, BinSize, ContLblName, FalseLblName, 0.99)].
713
715
check_size(Offset, Size, _BinSize, Tmp1, true, ContLblName, _FalseLblName) ->
1006
1008
hipe_rtl:mk_alu(Dst, Dst, 'or', Tmp1),
1007
1009
hipe_rtl:mk_alu(Offset, Offset, add, hipe_rtl:mk_imm(1))]
1009
load_bytes(Dst, Base, Offset, {Signedness, Endianess},4) ->
1011
load_bytes(Dst, Base, Offset, {Signedness, Endianess}, 4) ->
1010
1012
case Endianess of
1012
1014
hipe_rtl_arch:load_big_4(Dst, Base, Offset, Signedness);