Skip to content

Latest commit

 

History

History
213 lines (193 loc) · 5.67 KB

exampleCodeSnippets.adoc

File metadata and controls

213 lines (193 loc) · 5.67 KB

Example code and packets

In the following examples ret is referred to as uninferable, this is only true if implicit-return mode is off

  1. Call to debug_printf(), from 80001a84, in main():

    00000000800019e8 <main>:
        ........:	...
        80001a80:	f6d42423          	 {sw	a3,-152(s0)}
        80001a84:	ef4ff0ef          	 {jal	x1,80001178} <debug_printf>

    PC: 80001a84 →80001178
    The target of the jal is inferable, thus NO te_inst packet is sent.

    0000000080001178 <debug_printf>:
        80001178:	7139                	{addi	sp,sp,-64}
        8000117a:	...
  2. Return from debug_printf():

        80001186:	...
        80001188:	6121                	{addi	sp,sp,64}
        8000118a:	8082                	{ret}

    PC: 8000118a →80001a88
    The target of the ret is uninferable, thus a te_inst packet IS sent: te_inst[format=2 (ADDR_ONLY): address=0x80001a88, updiscon=0]

        80001a88:	00000597          	{auipc	a1,0x0}}
        80001a8c:	65058593          	{addi	a1,a1,1616}} # 800020d8 <main+0x6f0>
  3. exiting from Func_2(), with a final taken branch, followed by a ret

    00000000800010b6 <Func_2>:
        ........:   ....
        800010da:	4781                    {li	a5,0}
        800010dc:	00a05863                {blez	a0,800010ec} <Func_2+0x36>

    PC: 800010dc →800010ec, add branch TAKEN to branch_map, but no packet sent yet.
    branches = 0; branch_map = 0;
    branch_map = 0 <<branches++;

        800010ec:   60e2                    {ld      ra,24(sp)}
        800010ee:   6442                    {ld      s0,16(sp)}
        800010f0:   64a2                    {ld      s1,8(sp)}
        800010f2:   853e                    {mv      a0,a5}
        800010f4:   6105                    {addi    sp,sp,32}
        800010f6:   8082                    {ret}

    PC: 800010f6 →80001b8a
    The target of the ret is uninferable, thus a te_inst packet is sent, with ONE branch in the branch_map
    te_inst[ format=1 (DIFF_DELTA): branches=1, branch_map=0x0, address=0x80001b8a (\(\Delta\)=0xab0) updiscon=0 ]

    00000000800019e8 <main>:
        ........:   ....
        80001b8a:	f4442603                {lw      a2,-188(s0)}
        80001b8e:	....
  4. 3 branches, then a function return back to Proc_1()

    0000000080001100 <Proc_6>:
        ........:   ....
        80001112:	c080                    {sw	s0,0(s1)}
        80001114:	4785                    {li	a5,1}
        80001116:	02f40463                {beq	s0,a5,8000113e <Proc_6+0x3e>}

    PC: 80001116 →8000111a, add branch NOT taken to branch_map, but no packet sent yet. branches = 0; branch_map = 0; branch_map = 1 <<branches++;

        8000111a:	c81d                    {beqz	s0,80001150 <Proc_6+0x50>}

    PC: 8000111a →8000111c, add branch NOT taken to branch_map, but no packet sent yet.
    branch_map = 1 <<branches++;

        8000111c:   4709                    {li      a4,2}
        8000111e:   04e40063                {beq     s0,a4,8000115e <Proc_6+0x5e>}

    PC: 8000111e →8000115e, add branch TAKEN to branch_map, but no packet sent yet.
    branch_map = 0 <<branches++;

        8000115e:	60e2                	{ld	ra,24(sp)}
        80001160:	6442                	{ld	s0,16(sp)}
        80001162:	c09c                	{sw	a5,0(s1)}
        80001164:	64a2                	{ld	s1,8(sp)}
        80001166:	6105                	{addi	sp,sp,32}
        80001168:	8082                	{ret}
    00000000800011d6 <Proc\_1>:
        ........:   ....
        80001258:	00093783          	{ld	a5,0(s2)}
        8000125c:	....

    PC: 80001168 →80001258
    The target of the ret is uninferable, thus a te_inst packet is sent, with THREE branches in the branch_map
    te_inst[ format=1 (DIFF_DELTA): branches=3, branch_map=0x3, address=0x80001258 (\(\Delta\)=0x148), updiscon=0 ]

  5. A complex example with 2 branches, 2 jal, and a ret

    00000000800011d6 <Proc\_1>:
        ........:   ....
        8000121c:	441c                	{lw	a5,8(s0)}
        8000121e:	c795                	{beqz	a5,8000124a} <Proc_1+0x74>

    PC: 8000121e →8000124a, add branch TAKEN to branch_map, but no packet sent yet.
    branches = 0; branch_map = 0;
    branch_map = 0 <<branches++;

        8000124a:	44c8                	{lw	a0,12(s1)}
        8000124c:	4799                	{li	a5,6}
        8000124e:	00c40593          	{addi	a1,s0,12}
        80001252:	c81c                	{sw	a5,16(s0)}
        80001254:	eadff0ef          	{jal	x1,80001100} <Proc_6>

    PC: 80001254 →80001100
    The target of the jal is inferable, thus no te_inst packet needs be sent.

        0000000080001100 <Proc_6>:
        80001100:	1101                    {addi	sp,sp,-32}
        80001102:	e822                    {sd	s0,16(sp)}
        80001104:	e426                    {sd	s1,8(sp)}
        80001106:	ec06                    {sd	ra,24(sp)}
        80001108:	842a                    {mv	s0,a0}
        8000110a:	84ae                    {mv	s1,a1}
        8000110c:	fedff0ef                {jal	x1,800010f8} <Func_3>

    PC: 8000110c →800010f8
    The target of the jal is inferable, thus no te_inst packet needs to be sent.

    00000000800010f8 <Func_3>:
        800010f8:	1579                    {addi	a0,a0,-2}
        800010fa:	00153513                {seqz	a0,a0}
        800010fe:	8082                    {ret}

    PC: 800010fe →80001110
    The target of the ret is uninferable, thus a te_inst packet will be sent shortly.

    0000000080001100 <Proc_6>:
        ........:   ....
        80001110:	c115                	{beqz	a0,80001134} <Proc_6+0x34>
        80001112:	....

    PC: 80001110 →80001112, add branch NOT TAKEN to branch_map.
    branch_map = 1 <<branches++;
    te_inst[ format=1 (DIFF_DELTA): branches=2, branch_map=0x2, address=0x80001110 (\(\Delta\)=0xfffffffffffffef4), updiscon=1 ]