RXv3コアのレジスタ一括退避機能の使い方(Register Bank Save Function Usage)を調べてみるスレッド

こんにちは。NoMaYです。

RXv3コア搭載の120MH動作のRXマイコンも、RX66T以降、RX671、RX66N、RX660と品種が増えてきましたが、RXv3コアのセールスポイントの1つであるレジスタ一括退避機能の使い方が今ひとつピンと来ません。そこで、いつものように、ちょっと好奇心からスレッドを立ててみました。(注: RX66Tは、160MHz動作、レジスタ一括退避機能未搭載、です。) いつものように、ぼちぼちと続きます。

ホワイトペーパー
卓越したMCU性能と電力効率を実現するRXv3コア
2019年10月
www.renesas.com/jp/ja/document/whp/introducing-rxv3-core-superior-performance-excellent-power-efficiency#page=6

割り込み応答時間の改善

モータ制御システムなどは、高速な割り込み処理によるリアルタイム性能が必要となってきます。

RXv3コアには、割り込み処理時にレジスタを高速退避/復帰するために、オプション機能として、レジスタ退避バンクと呼ばれる専用メモリを実装しています。図6に示すように、レジスタ退避バンクを使用することで割り込み応答時間を短縮でき、割り込み処理全体の時間を短縮することができます。 割り込み処理ルーチンの中で、SAVE命令を使用すると汎用レジスタとアキュムレータを1クロックで専用メモリに保存できます。RSTR命令は、保存されたレジスタを3~6cycleで復元します。レジスタ退避バンクは専用メモリを複数面持っており、多重割り込みにも対応することが可能です。

図6.割り込み応答時間の改善

レジスタ退避バンクは、割り込みハンドラだけでなく、RTOSコンテキスト切り替えにも使用できます。 RTOSコンテキスト切り替え時間は、レジスタバンク保存機能により最大20%高速化します。


Parents
  • NoMay さんこんにちは。

    RX66TとRX72Tの違いは、動作周波数くらいだと思っていましたが、この命令郡をサポートしていないとは知りませんでした・・

    ---

    GNU-RX 8.3.0 で、具体的にどのように使うか実験してみました。

    元のコードでは、gcc の割り込み関数アトリビュートを使っていましたが、アセンブラ命令を追加して、以下のように修正しました。

    ```

    //      static INTERRUPT_FUNC void i_task_()
            static void i_task_()
            {
                asm("save #0");
                ++counter_;
                task_();
                asm("rstr #0");
                asm("rte");
            }

    ```

    コンパイルされたアセンブラ命令:

    ```

    fff81c38 <__ZN6device7cmt_mgrINS_5cmt_tILm557058ELNS_10peripheralE41ENS_6icuc_tIvE6VECTORELS5_28EEEN5utils9null_taskEE7i_task_Ev>:
    fff81c38: fd 76 e0 00 save #0
    fff81c3c: fb 42 58 05 00 00 mov.l #0x558, r4
    fff81c42: ec 45 mov.l [r4], r5
    fff81c44: 62 15 add #1, r5
    fff81c46: e3 45 mov.l r5, [r4]
    fff81c48: fd 76 f0 00 rstr #0
    fff81c4c: 7f 95 rte
    fff81c4e: 02 rts

    ```

    RX72T で動作確認をして、問題無いようです。

    GNU-RX 8.3.0 では、「-mcpu=rx66T」がありますが、このオプションを指定しても、「save、rstr」はエラーになりません・・

    ※RX66T では、当然動作しません・・

  • hirakuni45さん、こんにちは。NoMaYです。

    GNURXでは、まだ、レジスタ一括退避機能はサポートされていないのですね。試し始めて気付いたのですが、-O0で以下のソースでr10が使われるコードが生成されますが、PUSH/POPとasm("RTE")の位置関係が合ってなくて、これは動作しませんね(暴走しますね)。e2 studio 2022-07+GNURX 8.3.0.202202のプロジェクトのファイル一式を以下のzipファイルに固めました。

    4721.issue_RXv3_RegBankSave_20220928_1.zip

    今の印象としては、今のところ、GNURXで、C/C++記述された割り込みコードで無理矢理にレジスタ一括退避機能を使うのは諦めた方が良いような気がします。なお、アセンブラ記述された割り込みコードで使うことに難は無いと思います。ここから先、llvm-gcc-renesas.comへ機能追加要望を出す方向で、このスレッドでGNURXを扱い続けるつもりですけれども、以下の点は念頭に置こうと思いました。

    (1) CC-RXもICCRXもサポートしているのに、GNURXだけサポートしていない、というのは、やっぱり見劣りしてしまいますので
    (1') レジスタ一括退避機能が、多大なメリットがある、との結論に至るかどうかは、調べた結果次第、なのではありますけれども

    (2) 割り込み関数先頭での多重割り込み許可もGNURXだけサポートしていないのですけれども、それも含めて考えたいです

    ソース: src/RXv3_RegBankSave_ex1.c

    static void task_(void)
    {
    }

    static unsigned short counter_;

    static void i_task_(void)
    {
        asm("save #0");
        ++counter_;
        task_();
        asm("rstr #0");
        asm("rte");
    }

    void *i_debug_ex1_ = i_task_;

     
    リストファイル: HardwareDebug/RXv3_RegBankSave_ex1.lst (少し加工してあります。最適化は-O0です。)

       7:../src/RXv3_RegBankSave_ex1.c **** static void i_task_(void)
       8:../src/RXv3_RegBankSave_ex1.c **** {
      30 0000 7E AA                         push.l  r10
      32 0002 EF 0A                         mov.L   r0, r10
       9:../src/RXv3_RegBankSave_ex1.c ****     asm("save #0");
      36 0004 FD 76 E0 00                   save #0
      10:../src/RXv3_RegBankSave_ex1.c ****     ++counter_;
      39 0008 FB 52 00 00 00 00             mov.L   #_counter_, r5
      40 000e DC 55                         mov.W   [r5], r5
      41 0010 62 15                         add #1, r5
      42 0012 DF 54                         mov.W   r5, r4
      43 0014 FB 52 00 00 00 00             mov.L   #_counter_, r5
      44 001a D3 54                         mov.W   r4, [r5]
      11:../src/RXv3_RegBankSave_ex1.c ****     task_();
      46 001c 05 00 00 00                   bsr _task_
      12:../src/RXv3_RegBankSave_ex1.c ****     asm("rstr #0");
      49 0020 FD 76 F0 00                   rstr #0
      13:../src/RXv3_RegBankSave_ex1.c ****     asm("rte");
      53 0024 7F 95                         rte
      14:../src/RXv3_RegBankSave_ex1.c **** }
      56 0026 03                            nop
      57 0027 3F AA 01                      rtsd    #4, r10-r10

     

  • こんにちは。NoMaYです。

    CS+のサンプルプログラムフォルダにあったCC-RXプロジェクトのソースを改造し、-O2オプションでも問題になってしまうコードを生成させました。e2 studio 2022-07+GNURX 8.3.0.202202のプロジェクトのファイル一式を以下のzipファイルに固めました。

    issue_RXv3_RegBankSave_20220928_2.zip

    以下のようにPUSH/POPなどとRTEの位置関係が合ってなくて、これも動作しませんね(暴走しますね)。すみません、割り込み内でprintf/scanfを使っている格好になってしまっている点には、目をつぶって頂けるとありがたいです。

     156                                _i_task_:
     159 0000 6E 6D                         pushm   r6-r13
     161 0002 71 00 C8                      add #-56, r0
     165 0005 FD 76 E0 00                   save #0
     178 0009 FB 12 00 00 00 00             mov.L   #.LC0, r1
     180 000f 66 06                         mov.L   #0, r6
     182 0011 FB D2 00 00 00 00             mov.L   #__ctype_+1, r13
     184 0017 05 00 00 00                   bsr _puts
     188 001b 66 CA                         mov.L   #12, r10
     189 001d 4B 0A                         add r0, r10
     191 001f EF A7                         mov.L   r10, r7
     193 0021 66 18                         mov #1, r8
     195 0023 77 10 01 00 00                .balign 8,3,5
     途中省略
     337                                    .balign 8,3,3
     338                                .L25:
     340 00dc FD 2A A5                      mov.L   [r10+], r5
     341 00df A0 85                         mov.L   r5, 8[r0]
     342 00e1 E3 06                         mov.L   r6, [r0]
     343 00e3 A0 0F                         mov.L   r7, 4[r0]
     345 00e5 62 17                         add #1, r7
     348 00e7 05 00 00 00                   bsr _printf
     351 00eb 61 A7                         cmp #10, r7
     352 00ed 21 EF                         bne .L25
     359 00ef FD 76 F0 00                   rstr #0
     363 00f3 7F 95                         rte
     366 00f5 3F 6D 16                      rtsd    #88, r6-r13


    ソース: src/RXv3_RegBankSave_ex2.c

    RXv3_RegBankSave_ex2.c.20220928_2.txt
    #include <stdio.h>
    #include <math.h>
    #include <stdlib.h>
    #include <ctype.h>
    
    /* Special character code */
    #define LF 0x0a                     /* Line feed       */
    
    /* Flag */
    #define FALSE 0x00
    #define TRUE  0x01
    
    //void main(void);
    void sort(long *a);
    void change(long *a);
    
    //void main(void)
    static void task_(void)
    {
        long data[10];
        int i;
        char tmp[2];
        int ret;
        char isnuminput;
    
    //    while(1){
    
            printf("### Data Input ###\n");
    
            for( i=0; i<10; i++ ){
                printf("data[%d]=",i);
                data[i]= 0;
                isnuminput = FALSE;
                while(1){
                    ret = scanf("%c",&tmp);
                    if(ret != EOF){
                        if( tmp[0] != LF ){
                            if( isdigit(tmp[0])!=0 ){
                                data[i] = data[i]*10 + atoi(tmp);
                                isnuminput = TRUE;
                            }else{
                                printf("\n+++You can input only the decimal number.+++\n");
                                data[i] = 0;
                                isnuminput = FALSE;
                                printf("data[%d]=",i);
                            }
                        }else{
                            if(isnuminput != FALSE){
                                break;
                            }else{
                                printf("\n+++You can input only the decimal number.+++\n");
                                data[i] = 0;
                                isnuminput = FALSE;
                                printf("data[%d]=",i);
                            }
                        }
                    }else{
                        printf("\n+++You can input only the decimal number.+++\n");
                        data[i] = 0;
                        isnuminput = FALSE;
                        printf("data[%d]=",i);
                    }
                }
            }
    
            sort(data);
    
            printf("*** Sorting results ***\n");
    
            for( i=0; i<10; i++ ){
                printf("data[%d]=%ld\n",i,data[i]);
            }
    
            change(data);
    
    //    }
    }
    
    void sort(long *data)
    {
        long t;
        int i, j, k, gap;
    
        gap = 5;
        while( gap > 0 ){
            for( k=0; k<gap; k++){
                for( i=k+gap; i<10; i=i+gap ){
                    for(j=i-gap; j>=k; j=j-gap){
                        if(data[j]>data[j+gap]){
                            t = data[j];
                            data[j] = data[j+gap];
                            data[j+gap] = t;
                        }
                        else
                            break;
                    }
                }
            }
            gap = gap/2;
        }
    }
    
    void change(long *data)
    {
        long tmp[10];
        int i;
    
        for(i=0; i<10; i++){
            tmp[i] = data[i];
        }
        for(i=0; i<10; i++){
            data[i] = tmp[9 - i];
        }
    }
    
    static void i_task_(void)
    {
        __asm volatile ("save #0");
        task_();
        __asm volatile ("rstr #0");
        __asm volatile ("rte");
    }
    
    void *i_debug_ex2_ = i_task_;
    

     
    リストファイル: HardwareDebug/RXv3_RegBankSave_ex2.lst (最適化は-O2です。)
    RXv3_RegBankSave_ex2.lst.20220928_2.txt
       1                             		.file	"RXv3_RegBankSave_ex2.c"
       2                             		.section P,"ax"
       3                             	.Ltext0:
       4                             		.section	.text.sort,"ax",@progbits
       5                             		.global	_sort
       7                             	_sort:
       8                             	.LVL0:
       9                             	.LFB5:
      10                             		.file 1 "../src/RXv3_RegBankSave_ex2.c"
       1:../src/RXv3_RegBankSave_ex2.c **** #include <stdio.h>
       2:../src/RXv3_RegBankSave_ex2.c **** #include <math.h>
       3:../src/RXv3_RegBankSave_ex2.c **** #include <stdlib.h>
       4:../src/RXv3_RegBankSave_ex2.c **** #include <ctype.h>
       5:../src/RXv3_RegBankSave_ex2.c **** 
       6:../src/RXv3_RegBankSave_ex2.c **** /* Special character code */
       7:../src/RXv3_RegBankSave_ex2.c **** #define LF 0x0a                     /* Line feed       */
       8:../src/RXv3_RegBankSave_ex2.c **** 
       9:../src/RXv3_RegBankSave_ex2.c **** /* Flag */
      10:../src/RXv3_RegBankSave_ex2.c **** #define FALSE 0x00
      11:../src/RXv3_RegBankSave_ex2.c **** #define TRUE  0x01
      12:../src/RXv3_RegBankSave_ex2.c **** 
      13:../src/RXv3_RegBankSave_ex2.c **** //void main(void);
      14:../src/RXv3_RegBankSave_ex2.c **** void sort(long *a);
      15:../src/RXv3_RegBankSave_ex2.c **** void change(long *a);
      16:../src/RXv3_RegBankSave_ex2.c **** 
      17:../src/RXv3_RegBankSave_ex2.c **** //void main(void)
      18:../src/RXv3_RegBankSave_ex2.c **** static void task_(void)
      19:../src/RXv3_RegBankSave_ex2.c **** {
      20:../src/RXv3_RegBankSave_ex2.c ****     long data[10];
      21:../src/RXv3_RegBankSave_ex2.c ****     int i;
      22:../src/RXv3_RegBankSave_ex2.c ****     char tmp[2];
      23:../src/RXv3_RegBankSave_ex2.c ****     int ret;
      24:../src/RXv3_RegBankSave_ex2.c ****     char isnuminput;
      25:../src/RXv3_RegBankSave_ex2.c **** 
      26:../src/RXv3_RegBankSave_ex2.c **** //    while(1){
      27:../src/RXv3_RegBankSave_ex2.c **** 
      28:../src/RXv3_RegBankSave_ex2.c ****         printf("### Data Input ###\n");
      29:../src/RXv3_RegBankSave_ex2.c **** 
      30:../src/RXv3_RegBankSave_ex2.c ****         for( i=0; i<10; i++ ){
      31:../src/RXv3_RegBankSave_ex2.c ****             printf("data[%d]=",i);
      32:../src/RXv3_RegBankSave_ex2.c ****             data[i]= 0;
      33:../src/RXv3_RegBankSave_ex2.c ****             isnuminput = FALSE;
      34:../src/RXv3_RegBankSave_ex2.c ****             while(1){
      35:../src/RXv3_RegBankSave_ex2.c ****                 ret = scanf("%c",&tmp);
      36:../src/RXv3_RegBankSave_ex2.c ****                 if(ret != EOF){
      37:../src/RXv3_RegBankSave_ex2.c ****                     if( tmp[0] != LF ){
      38:../src/RXv3_RegBankSave_ex2.c ****                         if( isdigit(tmp[0])!=0 ){
      39:../src/RXv3_RegBankSave_ex2.c ****                             data[i] = data[i]*10 + atoi(tmp);
      40:../src/RXv3_RegBankSave_ex2.c ****                             isnuminput = TRUE;
      41:../src/RXv3_RegBankSave_ex2.c ****                         }else{
      42:../src/RXv3_RegBankSave_ex2.c ****                             printf("\n+++You can input only the decimal number.+++\n");
      43:../src/RXv3_RegBankSave_ex2.c ****                             data[i] = 0;
      44:../src/RXv3_RegBankSave_ex2.c ****                             isnuminput = FALSE;
      45:../src/RXv3_RegBankSave_ex2.c ****                             printf("data[%d]=",i);
      46:../src/RXv3_RegBankSave_ex2.c ****                         }
      47:../src/RXv3_RegBankSave_ex2.c ****                     }else{
      48:../src/RXv3_RegBankSave_ex2.c ****                         if(isnuminput != FALSE){
      49:../src/RXv3_RegBankSave_ex2.c ****                             break;
      50:../src/RXv3_RegBankSave_ex2.c ****                         }else{
      51:../src/RXv3_RegBankSave_ex2.c ****                             printf("\n+++You can input only the decimal number.+++\n");
      52:../src/RXv3_RegBankSave_ex2.c ****                             data[i] = 0;
      53:../src/RXv3_RegBankSave_ex2.c ****                             isnuminput = FALSE;
      54:../src/RXv3_RegBankSave_ex2.c ****                             printf("data[%d]=",i);
      55:../src/RXv3_RegBankSave_ex2.c ****                         }
      56:../src/RXv3_RegBankSave_ex2.c ****                     }
      57:../src/RXv3_RegBankSave_ex2.c ****                 }else{
      58:../src/RXv3_RegBankSave_ex2.c ****                     printf("\n+++You can input only the decimal number.+++\n");
      59:../src/RXv3_RegBankSave_ex2.c ****                     data[i] = 0;
      60:../src/RXv3_RegBankSave_ex2.c ****                     isnuminput = FALSE;
      61:../src/RXv3_RegBankSave_ex2.c ****                     printf("data[%d]=",i);
      62:../src/RXv3_RegBankSave_ex2.c ****                 }
      63:../src/RXv3_RegBankSave_ex2.c ****             }
      64:../src/RXv3_RegBankSave_ex2.c ****         }
      65:../src/RXv3_RegBankSave_ex2.c **** 
      66:../src/RXv3_RegBankSave_ex2.c ****         sort(data);
      67:../src/RXv3_RegBankSave_ex2.c **** 
      68:../src/RXv3_RegBankSave_ex2.c ****         printf("*** Sorting results ***\n");
      69:../src/RXv3_RegBankSave_ex2.c **** 
      70:../src/RXv3_RegBankSave_ex2.c ****         for( i=0; i<10; i++ ){
      71:../src/RXv3_RegBankSave_ex2.c ****             printf("data[%d]=%ld\n",i,data[i]);
      72:../src/RXv3_RegBankSave_ex2.c ****         }
      73:../src/RXv3_RegBankSave_ex2.c **** 
      74:../src/RXv3_RegBankSave_ex2.c ****         change(data);
      75:../src/RXv3_RegBankSave_ex2.c **** 
      76:../src/RXv3_RegBankSave_ex2.c **** //    }
      77:../src/RXv3_RegBankSave_ex2.c **** }
      78:../src/RXv3_RegBankSave_ex2.c **** 
      79:../src/RXv3_RegBankSave_ex2.c **** void sort(long *data)
      80:../src/RXv3_RegBankSave_ex2.c **** {
      11                             		.loc 1 80 1 view -0
      12                             		.loc 1 80 1 is_stmt 0 view .LVU1
      13 0000 6E 6D                   		pushm	r6-r13
      14                             	.LCFI0:
      15 0002 60 80                   		sub	#8, r0
      16                             	.LCFI1:
      81:../src/RXv3_RegBankSave_ex2.c ****     long t;
      17                             		.loc 1 81 5 is_stmt 1 view .LVU2
      82:../src/RXv3_RegBankSave_ex2.c ****     int i, j, k, gap;
      18                             		.loc 1 82 5 view .LVU3
      83:../src/RXv3_RegBankSave_ex2.c **** 
      84:../src/RXv3_RegBankSave_ex2.c ****     gap = 5;
      19                             		.loc 1 84 5 view .LVU4
      20                             	.LVL1:
      85:../src/RXv3_RegBankSave_ex2.c ****     while( gap > 0 ){
      21                             		.loc 1 85 5 view .LVU5
      80:../src/RXv3_RegBankSave_ex2.c ****     long t;
      22                             		.loc 1 80 1 is_stmt 0 view .LVU6
      23 0004 A0 09                   		mov.L	r1, 4[r0]
      86:../src/RXv3_RegBankSave_ex2.c ****         for( k=0; k<gap; k++){
      87:../src/RXv3_RegBankSave_ex2.c ****             for( i=k+gap; i<10; i=i+gap ){
      88:../src/RXv3_RegBankSave_ex2.c ****                 for(j=i-gap; j>=k; j=j-gap){
      89:../src/RXv3_RegBankSave_ex2.c ****                     if(data[j]>data[j+gap]){
      24                             		.loc 1 89 23 view .LVU7
      25 0006 F8 06 03                		mov.L	#3, [r0]
      84:../src/RXv3_RegBankSave_ex2.c ****     while( gap > 0 ){
      26                             		.loc 1 84 9 view .LVU8
      27 0009 66 5A                   		mov.L	#5, r10
      28                             	.LVL2:
      29                             		.balign 8,3,1
      30                             	.L2:
      84:../src/RXv3_RegBankSave_ex2.c ****     while( gap > 0 ){
      31                             		.loc 1 84 9 view .LVU9
      32 000b ED 0F 01                		mov.L	4[r0], r15
      33 000e FD C2 AE                		shll	#2, r10, r14
      34 0011 FB 66 FC                		mov.L	#-4, r6
      35 0014 4F A6                   		mul	r10, r6
      86:../src/RXv3_RegBankSave_ex2.c ****         for( k=0; k<gap; k++){
      36                             		.loc 1 86 15 view .LVU10
      37 0016 66 0C                   		mov.L	#0, r12
      38                             	.LVL3:
      39                             		.balign 8,3,1
      40                             	.L9:
      87:../src/RXv3_RegBankSave_ex2.c ****                 for(j=i-gap; j>=k; j=j-gap){
      41                             		.loc 1 87 13 is_stmt 1 view .LVU11
      87:../src/RXv3_RegBankSave_ex2.c ****                 for(j=i-gap; j>=k; j=j-gap){
      42                             		.loc 1 87 13 is_stmt 0 view .LVU12
      43 0018 EF C9                   		mov.L	r12, r9
      44 001a FF 2D FE                		add	r15, r14, r13
      86:../src/RXv3_RegBankSave_ex2.c ****         for( k=0; k<gap; k++){
      45                             		.loc 1 86 15 view .LVU13
      46 001d EF F8                   		mov.L	r15, r8
      47                             	.LVL4:
      48 001f 03                      		.balign 8,3,1
      49                             	.L4:
      88:../src/RXv3_RegBankSave_ex2.c ****                     if(data[j]>data[j+gap]){
      50                             		.loc 1 88 17 is_stmt 1 view .LVU14
      88:../src/RXv3_RegBankSave_ex2.c ****                     if(data[j]>data[j+gap]){
      51                             		.loc 1 88 22 is_stmt 0 view .LVU15
      52 0020 EF 97                   		mov.L	r9, r7
      53                             	.LVL5:
      88:../src/RXv3_RegBankSave_ex2.c ****                     if(data[j]>data[j+gap]){
      54                             		.loc 1 88 17 view .LVU16
      55 0022 47 C9                   		cmp	r12, r9
      56 0024 29 2D                   		blt	.L7
      57                             		.loc 1 89 21 is_stmt 1 view .LVU17
      58                             		.loc 1 89 28 is_stmt 0 view .LVU18
      59 0026 EC 85                   		mov.L	[r8], r5
      60                             		.loc 1 89 36 view .LVU19
      61 0028 EC D4                   		mov.L	[r13], r4
      62                             		.loc 1 89 23 view .LVU20
      63 002a 47 54                   		cmp	r5, r4
      64 002c 28 25                   		bge	.L7
      65 002e EF D1                   		mov.L	r13, r1
      66 0030 EF 82                   		mov.L	r8, r2
      67 0032 EF 83                   		mov.L	r8, r3
      68 0034 2E 10                   		bra	.L6
      69                             	.LVL6:
      70                             	.L8:
      71                             		.loc 1 89 36 view .LVU21
      72 0036 EC 34                   		mov.L	[r3], r4
      73                             		.loc 1 89 28 view .LVU22
      74 0038 EC B5                   		mov.L	[r11], r5
      75                             	.LVL7:
      76                             		.loc 1 89 28 view .LVU23
      77 003a EF B3                   		mov.L	r11, r3
      78 003c 4B 62                   		add	r6, r2
      79 003e 4B 61                   		add	r6, r1
      80                             	.LVL8:
      81                             		.loc 1 89 23 view .LVU24
      82 0040 47 45                   		cmp	r4, r5
      83 0042 2B 0F                   		ble	.L7
      84                             		.balign 8,3,2
      85                             	.L6:
      86                             		.loc 1 89 21 is_stmt 1 discriminator 2 view .LVU25
      90:../src/RXv3_RegBankSave_ex2.c ****                         t = data[j];
      87                             		.loc 1 90 25 discriminator 2 view .LVU26
      88                             	.LVL9:
      91:../src/RXv3_RegBankSave_ex2.c ****                         data[j] = data[j+gap];
      89                             		.loc 1 91 25 discriminator 2 view .LVU27
      89:../src/RXv3_RegBankSave_ex2.c ****                         t = data[j];
      90                             		.loc 1 89 28 is_stmt 0 discriminator 2 view .LVU28
      91 0044 FF 2B 63                		add	r6, r3, r11
      92                             		.loc 1 91 33 discriminator 2 view .LVU29
      93 0047 E3 24                   		mov.L	r4, [r2]
      92:../src/RXv3_RegBankSave_ex2.c ****                         data[j+gap] = t;
      94                             		.loc 1 92 25 is_stmt 1 discriminator 2 view .LVU30
      95                             		.loc 1 92 37 is_stmt 0 discriminator 2 view .LVU31
      96 0049 E3 15                   		mov.L	r5, [r1]
      88:../src/RXv3_RegBankSave_ex2.c ****                     if(data[j]>data[j+gap]){
      97                             		.loc 1 88 37 discriminator 2 view .LVU32
      98 004b 43 A7                   		sub	r10, r7
      99                             	.LVL10:
      88:../src/RXv3_RegBankSave_ex2.c ****                     if(data[j]>data[j+gap]){
     100                             		.loc 1 88 17 discriminator 2 view .LVU33
     101 004d 47 C7                   		cmp	r12, r7
     102 004f 28 E7                   		bge	.L8
     103                             	.LVL11:
     104                             		.balign 8,3,1
     105                             	.L7:
      88:../src/RXv3_RegBankSave_ex2.c ****                     if(data[j]>data[j+gap]){
     106                             		.loc 1 88 17 discriminator 2 view .LVU34
     107 0051 4B A9                   		add	r10, r9
     108                             	.LVL12:
      88:../src/RXv3_RegBankSave_ex2.c ****                     if(data[j]>data[j+gap]){
     109                             		.loc 1 88 17 discriminator 2 view .LVU35
     110 0053 4B E8                   		add	r14, r8
      87:../src/RXv3_RegBankSave_ex2.c ****                 for(j=i-gap; j>=k; j=j-gap){
     111                             		.loc 1 87 13 view .LVU36
     112 0055 FF 27 A9                		add	r10, r9, r7
     113                             	.LVL13:
      87:../src/RXv3_RegBankSave_ex2.c ****                 for(j=i-gap; j>=k; j=j-gap){
     114                             		.loc 1 87 13 view .LVU37
     115 0058 4B ED                   		add	r14, r13
     116 005a 61 97                   		cmp	#9, r7
     117 005c 2B C4                   		ble	.L4
      86:../src/RXv3_RegBankSave_ex2.c ****             for( i=k+gap; i<10; i=i+gap ){
     118                             		.loc 1 86 27 discriminator 2 view .LVU38
     119 005e 62 1C                   		add	#1, r12
     120                             	.LVL14:
      86:../src/RXv3_RegBankSave_ex2.c ****             for( i=k+gap; i<10; i=i+gap ){
     121                             		.loc 1 86 27 discriminator 2 view .LVU39
     122 0060 62 4F                   		add	#4, r15
      86:../src/RXv3_RegBankSave_ex2.c ****             for( i=k+gap; i<10; i=i+gap ){
     123                             		.loc 1 86 9 discriminator 2 view .LVU40
     124 0062 47 AC                   		cmp	r10, r12
     125 0064 29 B4                   		blt	.L9
      93:../src/RXv3_RegBankSave_ex2.c ****                     }
      94:../src/RXv3_RegBankSave_ex2.c ****                     else
      95:../src/RXv3_RegBankSave_ex2.c ****                         break;
      96:../src/RXv3_RegBankSave_ex2.c ****                 }
      97:../src/RXv3_RegBankSave_ex2.c ****             }
      98:../src/RXv3_RegBankSave_ex2.c ****         }
      99:../src/RXv3_RegBankSave_ex2.c ****         gap = gap/2;
     126                             		.loc 1 99 9 is_stmt 1 view .LVU41
     127 0066 EC 07                   		mov.L	[r0], r7
     128 0068 60 17                   		sub	#1, r7
     129 006a E3 07                   		mov.L	r7, [r0]
     130                             		.loc 1 99 13 is_stmt 0 view .LVU42
     131 006c 6A 1A                   		shar	#1, r10
     132                             	.LVL15:
      85:../src/RXv3_RegBankSave_ex2.c ****         for( k=0; k<gap; k++){
     133                             		.loc 1 85 10 view .LVU43
     134 006e 61 07                   		cmp	#0, r7
     135 0070 21 9B                   		bne	.L2
     100:../src/RXv3_RegBankSave_ex2.c ****     }
     101:../src/RXv3_RegBankSave_ex2.c **** }
     136                             		.loc 1 101 1 view .LVU44
     137 0072 3F 6D 0A                		rtsd	#40, r6-r13
     138                             		.loc 1 101 1 view .LVU45
     139                             	.LFE5:
     141 0075 FC 13 00                		.section	.rodata.i_task_.str1.1,"aMS",@progbits,1
     142                             	.LC0:
     143 0000 23 23 23 20 44 61 74 61 		.string	"### Data Input ###"
     143      20 49 6E 70 75 74 20 23 
     143      23 23 00 
     144                             	.LC1:
     145 0013 64 61 74 61 5B 25 64 5D 		.string	"data[%d]="
     145      3D 00 
     146                             	.LC2:
     147 001d 25 63 00                		.string	"%c"
     148                             	.LC3:
     149 0020 0A 2B 2B 2B 59 6F 75 20 		.string	"\n+++You can input only the decimal number.+++"
     149      63 61 6E 20 69 6E 70 75 
     149      74 20 6F 6E 6C 79 20 74 
     149      68 65 20 64 65 63 69 6D 
     149      61 6C 20 6E 75 6D 62 65 
     150                             	.LC4:
     151 004e 2A 2A 2A 20 53 6F 72 74 		.string	"*** Sorting results ***"
     151      69 6E 67 20 72 65 73 75 
     151      6C 74 73 20 2A 2A 2A 00 
     152                             	.LC5:
     153 0066 64 61 74 61 5B 25 64 5D 		.string	"data[%d]=%ld\n"
     153      3D 25 6C 64 0A 00 
     154                             		.section	.text.i_task_,"ax",@progbits
     156                             	_i_task_:
     157                             	.LFB7:
     102:../src/RXv3_RegBankSave_ex2.c **** 
     103:../src/RXv3_RegBankSave_ex2.c **** void change(long *data)
     104:../src/RXv3_RegBankSave_ex2.c **** {
     105:../src/RXv3_RegBankSave_ex2.c ****     long tmp[10];
     106:../src/RXv3_RegBankSave_ex2.c ****     int i;
     107:../src/RXv3_RegBankSave_ex2.c **** 
     108:../src/RXv3_RegBankSave_ex2.c ****     for(i=0; i<10; i++){
     109:../src/RXv3_RegBankSave_ex2.c ****         tmp[i] = data[i];
     110:../src/RXv3_RegBankSave_ex2.c ****     }
     111:../src/RXv3_RegBankSave_ex2.c ****     for(i=0; i<10; i++){
     112:../src/RXv3_RegBankSave_ex2.c ****         data[i] = tmp[9 - i];
     113:../src/RXv3_RegBankSave_ex2.c ****     }
     114:../src/RXv3_RegBankSave_ex2.c **** }
     115:../src/RXv3_RegBankSave_ex2.c **** 
     116:../src/RXv3_RegBankSave_ex2.c **** static void i_task_(void)
     117:../src/RXv3_RegBankSave_ex2.c **** {
     158                             		.loc 1 117 1 is_stmt 1 view -0
     159 0000 6E 6D                   		pushm	r6-r13
     160                             	.LCFI2:
     161 0002 71 00 C8                		add	#-56, r0
     162                             	.LCFI3:
     118:../src/RXv3_RegBankSave_ex2.c ****     __asm volatile ("save #0");
     163                             		.loc 1 118 5 view .LVU47
     164                             	 ; 118 "../src/RXv3_RegBankSave_ex2.c" 1
     165 0005 FD 76 E0 00             		save #0
     166                             	 ; 0 "" 2
     119:../src/RXv3_RegBankSave_ex2.c ****     task_();
     167                             		.loc 1 119 5 view .LVU48
     168                             	.LBB6:
     169                             	.LBI6:
      18:../src/RXv3_RegBankSave_ex2.c **** {
     170                             		.loc 1 18 13 view .LVU49
     171                             	.LBB7:
      20:../src/RXv3_RegBankSave_ex2.c ****     int i;
     172                             		.loc 1 20 5 view .LVU50
      21:../src/RXv3_RegBankSave_ex2.c ****     char tmp[2];
     173                             		.loc 1 21 5 view .LVU51
      22:../src/RXv3_RegBankSave_ex2.c ****     int ret;
     174                             		.loc 1 22 5 view .LVU52
      23:../src/RXv3_RegBankSave_ex2.c ****     char isnuminput;
     175                             		.loc 1 23 5 view .LVU53
      24:../src/RXv3_RegBankSave_ex2.c **** 
     176                             		.loc 1 24 5 view .LVU54
      28:../src/RXv3_RegBankSave_ex2.c **** 
     177                             		.loc 1 28 9 view .LVU55
     178 0009 FB 12 00 00 00 00       		mov.L	#.LC0, r1
      30:../src/RXv3_RegBankSave_ex2.c ****             printf("data[%d]=",i);
     179                             		.loc 1 30 15 is_stmt 0 view .LVU56
     180 000f 66 06                   		mov.L	#0, r6
      38:../src/RXv3_RegBankSave_ex2.c ****                             data[i] = data[i]*10 + atoi(tmp);
     181                             		.loc 1 38 29 view .LVU57
     182 0011 FB D2 00 00 00 00       		mov.L	#__ctype_+1, r13
      28:../src/RXv3_RegBankSave_ex2.c **** 
     183                             		.loc 1 28 9 view .LVU58
     184 0017 05 00 00 00             		bsr	_puts
     185                             	.LVL16:
      30:../src/RXv3_RegBankSave_ex2.c ****             printf("data[%d]=",i);
     186                             		.loc 1 30 9 is_stmt 1 view .LVU59
      30:../src/RXv3_RegBankSave_ex2.c ****             printf("data[%d]=",i);
     187                             		.loc 1 30 9 is_stmt 0 view .LVU60
     188 001b 66 CA                   		mov.L	#12, r10
     189 001d 4B 0A                   		add	r0, r10
      28:../src/RXv3_RegBankSave_ex2.c **** 
     190                             		.loc 1 28 9 view .LVU61
     191 001f EF A7                   		mov.L	r10, r7
      40:../src/RXv3_RegBankSave_ex2.c ****                         }else{
     192                             		.loc 1 40 40 view .LVU62
     193 0021 66 18                   		mov	#1, r8
     194                             	.LVL17:
     195 0023 77 10 01 00 00          		.balign 8,3,5
     196                             	.L24:
      31:../src/RXv3_RegBankSave_ex2.c ****             data[i]= 0;
     197                             		.loc 1 31 13 is_stmt 1 view .LVU63
     198 0028 A0 0E                   		mov.L	r6, 4[r0]
      33:../src/RXv3_RegBankSave_ex2.c ****             while(1){
     199                             		.loc 1 33 24 is_stmt 0 view .LVU64
     200 002a 66 0C                   		mov	#0, r12
      31:../src/RXv3_RegBankSave_ex2.c ****             data[i]= 0;
     201                             		.loc 1 31 13 view .LVU65
     202 002c F8 02 13 00 00 00       		mov.L	#.LC1, [r0]
      35:../src/RXv3_RegBankSave_ex2.c ****                 if(ret != EOF){
     203                             		.loc 1 35 23 view .LVU66
     204 0032 71 09 34                		add	#52, r0, r9
      31:../src/RXv3_RegBankSave_ex2.c ****             data[i]= 0;
     205                             		.loc 1 31 13 view .LVU67
     206 0035 05 00 00 00             		bsr	_printf
     207                             	.LVL18:
      32:../src/RXv3_RegBankSave_ex2.c ****             isnuminput = FALSE;
     208                             		.loc 1 32 13 is_stmt 1 view .LVU68
      32:../src/RXv3_RegBankSave_ex2.c ****             isnuminput = FALSE;
     209                             		.loc 1 32 20 is_stmt 0 view .LVU69
     210 0039 F8 76 00                		mov.L	#0, [r7]
      33:../src/RXv3_RegBankSave_ex2.c ****             while(1){
     211                             		.loc 1 33 13 is_stmt 1 view .LVU70
     212                             	.LVL19:
     213 003c 76 10 01 00             		.balign 8,3,5
     214                             	.L18:
      34:../src/RXv3_RegBankSave_ex2.c ****                 ret = scanf("%c",&tmp);
     215                             		.loc 1 34 13 view .LVU71
      35:../src/RXv3_RegBankSave_ex2.c ****                 if(ret != EOF){
     216                             		.loc 1 35 17 view .LVU72
      35:../src/RXv3_RegBankSave_ex2.c ****                 if(ret != EOF){
     217                             		.loc 1 35 23 is_stmt 0 view .LVU73
     218 0040 E7 09 01                		mov.L	r9, 4[r0]
     219 0043 F8 02 1D 00 00 00       		mov.L	#.LC2, [r0]
     220 0049 05 00 00 00             		bsr	_scanf
     221                             	.LVL20:
      36:../src/RXv3_RegBankSave_ex2.c ****                     if( tmp[0] != LF ){
     222                             		.loc 1 36 17 is_stmt 1 view .LVU74
      37:../src/RXv3_RegBankSave_ex2.c ****                         if( isdigit(tmp[0])!=0 ){
     223                             		.loc 1 37 21 view .LVU75
      38:../src/RXv3_RegBankSave_ex2.c ****                             data[i] = data[i]*10 + atoi(tmp);
     224                             		.loc 1 38 25 view .LVU76
      36:../src/RXv3_RegBankSave_ex2.c ****                     if( tmp[0] != LF ){
     225                             		.loc 1 36 19 is_stmt 0 view .LVU77
     226 004d 75 01 FF                		cmp	#-1, r1
     227 0050 20 38                   		beq	.L19
     228                             		.balign 8,3,3
     229                             	.L30:
      37:../src/RXv3_RegBankSave_ex2.c ****                         if( isdigit(tmp[0])!=0 ){
     230                             		.loc 1 37 23 view .LVU78
     231 0052 59 05 34                		movu.B	52[r0], r5
     232 0055 61 A5                   		cmp	#10, r5
     233 0057 20 56                   		beq	.L20
      39:../src/RXv3_RegBankSave_ex2.c ****                             isnuminput = TRUE;
     234                             		.loc 1 39 29 is_stmt 1 view .LVU79
      42:../src/RXv3_RegBankSave_ex2.c ****                             data[i] = 0;
     235                             		.loc 1 42 29 view .LVU80
      39:../src/RXv3_RegBankSave_ex2.c ****                             isnuminput = TRUE;
     236                             		.loc 1 39 52 is_stmt 0 view .LVU81
     237 0059 EF 91                   		mov.L	r9, r1
     238                             	.LVL21:
      39:../src/RXv3_RegBankSave_ex2.c ****                             isnuminput = TRUE;
     239                             		.loc 1 39 52 view .LVU82
     240 005b FE 4D 55                		mov.B	[r13,r5], r5
     241 005e 64 45                   		and	#4, r5
     242 0060 CF 5C                   		mov.B	r5, r12
     243                             	.LVL22:
      38:../src/RXv3_RegBankSave_ex2.c ****                             data[i] = data[i]*10 + atoi(tmp);
     244                             		.loc 1 38 27 view .LVU83
     245 0062 20 43                   		beq	.L21
      39:../src/RXv3_RegBankSave_ex2.c ****                             isnuminput = TRUE;
     246                             		.loc 1 39 46 view .LVU84
     247 0064 EC 7B                   		mov.L	[r7], r11
      40:../src/RXv3_RegBankSave_ex2.c ****                         }else{
     248                             		.loc 1 40 40 view .LVU85
     249 0066 CF 8C                   		mov.B	r8, r12
      39:../src/RXv3_RegBankSave_ex2.c ****                             isnuminput = TRUE;
     250                             		.loc 1 39 46 view .LVU86
     251 0068 63 AB                   		mul	#10, r11
      39:../src/RXv3_RegBankSave_ex2.c ****                             isnuminput = TRUE;
     252                             		.loc 1 39 52 view .LVU87
     253 006a 05 00 00 00             		bsr	_atoi
     254                             	.LVL23:
      39:../src/RXv3_RegBankSave_ex2.c ****                             isnuminput = TRUE;
     255                             		.loc 1 39 50 view .LVU88
     256 006e 4B B1                   		add	r11, r1
      39:../src/RXv3_RegBankSave_ex2.c ****                             isnuminput = TRUE;
     257                             		.loc 1 39 37 view .LVU89
     258 0070 E3 71                   		mov.L	r1, [r7]
      40:../src/RXv3_RegBankSave_ex2.c ****                         }else{
     259                             		.loc 1 40 29 is_stmt 1 view .LVU90
     260                             	.LVL24:
      34:../src/RXv3_RegBankSave_ex2.c ****                 ret = scanf("%c",&tmp);
     261                             		.loc 1 34 13 view .LVU91
      35:../src/RXv3_RegBankSave_ex2.c ****                 if(ret != EOF){
     262                             		.loc 1 35 17 view .LVU92
      35:../src/RXv3_RegBankSave_ex2.c ****                 if(ret != EOF){
     263                             		.loc 1 35 23 is_stmt 0 view .LVU93
     264 0072 E7 09 01                		mov.L	r9, 4[r0]
     265 0075 F8 02 1D 00 00 00       		mov.L	#.LC2, [r0]
     266 007b 05 00 00 00             		bsr	_scanf
     267                             	.LVL25:
      36:../src/RXv3_RegBankSave_ex2.c ****                     if( tmp[0] != LF ){
     268                             		.loc 1 36 17 is_stmt 1 view .LVU94
      37:../src/RXv3_RegBankSave_ex2.c ****                         if( isdigit(tmp[0])!=0 ){
     269                             		.loc 1 37 21 view .LVU95
      38:../src/RXv3_RegBankSave_ex2.c ****                             data[i] = data[i]*10 + atoi(tmp);
     270                             		.loc 1 38 25 view .LVU96
      36:../src/RXv3_RegBankSave_ex2.c ****                     if( tmp[0] != LF ){
     271                             		.loc 1 36 19 is_stmt 0 view .LVU97
     272 007f 75 01 FF                		cmp	#-1, r1
     273 0082 21 D0                   		bne	.L30
     274 0084 76 10 01 00             		.balign 8,3,5
     275                             	.L19:
      58:../src/RXv3_RegBankSave_ex2.c ****                     data[i] = 0;
     276                             		.loc 1 58 21 is_stmt 1 view .LVU98
     277 0088 FB 12 20 00 00 00       		mov.L	#.LC3, r1
     278                             	.LVL26:
      60:../src/RXv3_RegBankSave_ex2.c ****                     printf("data[%d]=",i);
     279                             		.loc 1 60 32 is_stmt 0 view .LVU99
     280 008e 66 0C                   		mov	#0, r12
     281                             	.LVL27:
     282                             		.balign 8,3,3
     283                             	.L29:
      58:../src/RXv3_RegBankSave_ex2.c ****                     data[i] = 0;
     284                             		.loc 1 58 21 view .LVU100
     285 0090 05 00 00 00             		bsr	_puts
     286                             	.LVL28:
      59:../src/RXv3_RegBankSave_ex2.c ****                     isnuminput = FALSE;
     287                             		.loc 1 59 21 is_stmt 1 view .LVU101
      59:../src/RXv3_RegBankSave_ex2.c ****                     isnuminput = FALSE;
     288                             		.loc 1 59 29 is_stmt 0 view .LVU102
     289 0094 F8 76 00                		mov.L	#0, [r7]
      60:../src/RXv3_RegBankSave_ex2.c ****                     printf("data[%d]=",i);
     290                             		.loc 1 60 21 is_stmt 1 view .LVU103
     291                             	.LVL29:
      61:../src/RXv3_RegBankSave_ex2.c ****                 }
     292                             		.loc 1 61 21 view .LVU104
     293 0097 A0 0E                   		mov.L	r6, 4[r0]
     294 0099 F8 02 13 00 00 00       		mov.L	#.LC1, [r0]
     295 009f 05 00 00 00             		bsr	_printf
     296                             	.LVL30:
     297 00a3 2E 9D                   		bra	.L18
     298                             	.LVL31:
     299                             	.L21:
      42:../src/RXv3_RegBankSave_ex2.c ****                             data[i] = 0;
     300                             		.loc 1 42 29 is_stmt 0 view .LVU105
     301 00a5 FB 12 20 00 00 00       		mov.L	#.LC3, r1
     302 00ab 2E E5                   		bra	.L29
     303                             	.LVL32:
     304                             	.L20:
      48:../src/RXv3_RegBankSave_ex2.c ****                             break;
     305                             		.loc 1 48 25 is_stmt 1 view .LVU106
      51:../src/RXv3_RegBankSave_ex2.c ****                             data[i] = 0;
     306                             		.loc 1 51 29 view .LVU107
     307 00ad FB 12 20 00 00 00       		mov.L	#.LC3, r1
     308                             	.LVL33:
      48:../src/RXv3_RegBankSave_ex2.c ****                             break;
     309                             		.loc 1 48 27 is_stmt 0 view .LVU108
     310 00b3 5B C5                   		movu.B	r12, r5
     311 00b5 61 05                   		cmp	#0, r5
     312 00b7 20 D9                   		beq	.L29
      30:../src/RXv3_RegBankSave_ex2.c ****             printf("data[%d]=",i);
     313                             		.loc 1 30 26 view .LVU109
     314 00b9 62 16                   		add	#1, r6
     315                             	.LVL34:
      30:../src/RXv3_RegBankSave_ex2.c ****             printf("data[%d]=",i);
     316                             		.loc 1 30 26 view .LVU110
     317 00bb 62 47                   		add	#4, r7
      30:../src/RXv3_RegBankSave_ex2.c ****             printf("data[%d]=",i);
     318                             		.loc 1 30 9 view .LVU111
     319 00bd 61 A6                   		cmp	#10, r6
     320 00bf 3B 69 FF                		bne	.L24
      66:../src/RXv3_RegBankSave_ex2.c **** 
     321                             		.loc 1 66 9 is_stmt 1 view .LVU112
     322 00c2 66 C1                   		mov.L	#12, r1
     323 00c4 4B 01                   		add	r0, r1
      70:../src/RXv3_RegBankSave_ex2.c ****             printf("data[%d]=%ld\n",i,data[i]);
     324                             		.loc 1 70 15 is_stmt 0 view .LVU113
     325 00c6 66 07                   		mov.L	#0, r7
      71:../src/RXv3_RegBankSave_ex2.c ****         }
     326                             		.loc 1 71 13 view .LVU114
     327 00c8 FB 62 66 00 00 00       		mov.L	#.LC5, r6
     328                             	.LVL35:
      66:../src/RXv3_RegBankSave_ex2.c **** 
     329                             		.loc 1 66 9 view .LVU115
     330 00ce 05 00 00 00             		bsr	_sort
     331                             	.LVL36:
      68:../src/RXv3_RegBankSave_ex2.c **** 
     332                             		.loc 1 68 9 is_stmt 1 view .LVU116
     333 00d2 FB 12 4E 00 00 00       		mov.L	#.LC4, r1
     334 00d8 05 00 00 00             		bsr	_puts
     335                             	.LVL37:
      70:../src/RXv3_RegBankSave_ex2.c ****             printf("data[%d]=%ld\n",i,data[i]);
     336                             		.loc 1 70 9 view .LVU117
     337                             		.balign 8,3,3
     338                             	.L25:
      71:../src/RXv3_RegBankSave_ex2.c ****         }
     339                             		.loc 1 71 13 view .LVU118
     340 00dc FD 2A A5                		mov.L	[r10+], r5
     341 00df A0 85                   		mov.L	r5, 8[r0]
     342 00e1 E3 06                   		mov.L	r6, [r0]
     343 00e3 A0 0F                   		mov.L	r7, 4[r0]
      70:../src/RXv3_RegBankSave_ex2.c ****             printf("data[%d]=%ld\n",i,data[i]);
     344                             		.loc 1 70 26 is_stmt 0 view .LVU119
     345 00e5 62 17                   		add	#1, r7
     346                             	.LVL38:
      71:../src/RXv3_RegBankSave_ex2.c ****         }
     347                             		.loc 1 71 13 view .LVU120
     348 00e7 05 00 00 00             		bsr	_printf
     349                             	.LVL39:
      70:../src/RXv3_RegBankSave_ex2.c ****             printf("data[%d]=%ld\n",i,data[i]);
     350                             		.loc 1 70 9 view .LVU121
     351 00eb 61 A7                   		cmp	#10, r7
     352 00ed 21 EF                   		bne	.L25
     353                             	.LVL40:
      70:../src/RXv3_RegBankSave_ex2.c ****             printf("data[%d]=%ld\n",i,data[i]);
     354                             		.loc 1 70 9 view .LVU122
     355                             	.LBE7:
     356                             	.LBE6:
     120:../src/RXv3_RegBankSave_ex2.c ****     __asm volatile ("rstr #0");
     357                             		.loc 1 120 5 is_stmt 1 view .LVU123
     358                             	 ; 120 "../src/RXv3_RegBankSave_ex2.c" 1
     359 00ef FD 76 F0 00             		rstr #0
     360                             	 ; 0 "" 2
     121:../src/RXv3_RegBankSave_ex2.c ****     __asm volatile ("rte");
     361                             		.loc 1 121 5 view .LVU124
     362                             	 ; 121 "../src/RXv3_RegBankSave_ex2.c" 1
     363 00f3 7F 95                   		rte
     364                             	 ; 0 "" 2
     122:../src/RXv3_RegBankSave_ex2.c **** }
     365                             		.loc 1 122 1 is_stmt 0 view .LVU125
     366 00f5 3F 6D 16                		rtsd	#88, r6-r13
     367                             	.LFE7:
     369                             		.section	.text.change,"ax",@progbits
     370                             		.global	_change
     372                             	_change:
     373                             	.LVL41:
     374                             	.LFB6:
     104:../src/RXv3_RegBankSave_ex2.c ****     long tmp[10];
     375                             		.loc 1 104 1 is_stmt 1 view -0
     104:../src/RXv3_RegBankSave_ex2.c ****     long tmp[10];
     376                             		.loc 1 104 1 is_stmt 0 view .LVU127
     377 0000 6E 7A                   		pushm	r7-r10
     378                             	.LCFI4:
     379 0002 71 00 D8                		add	#-40, r0
     380                             	.LCFI5:
     105:../src/RXv3_RegBankSave_ex2.c ****     int i;
     381                             		.loc 1 105 5 is_stmt 1 view .LVU128
     106:../src/RXv3_RegBankSave_ex2.c **** 
     382                             		.loc 1 106 5 view .LVU129
     108:../src/RXv3_RegBankSave_ex2.c ****         tmp[i] = data[i];
     383                             		.loc 1 108 5 view .LVU130
     384                             	.LVL42:
     108:../src/RXv3_RegBankSave_ex2.c ****         tmp[i] = data[i];
     385                             		.loc 1 108 5 is_stmt 0 view .LVU131
     386 0005 EF 0A                   		mov.L	r0, r10
     387 0007 71 03 28                		add	#40, r0, r3
     104:../src/RXv3_RegBankSave_ex2.c ****     long tmp[10];
     388                             		.loc 1 104 1 view .LVU132
     389 000a EF 05                   		mov.L	r0, r5
     390 000c EF 14                   		mov.L	r1, r4
     391                             	.LVL43:
     392 000e EF 00                   		.balign 8,3,3
     393                             	.L32:
     109:../src/RXv3_RegBankSave_ex2.c ****     }
     394                             		.loc 1 109 9 is_stmt 1 discriminator 3 view .LVU133
     109:../src/RXv3_RegBankSave_ex2.c ****     }
     395                             		.loc 1 109 16 is_stmt 0 discriminator 3 view .LVU134
     396 0010 FD 2A 47                		mov.L	[r4+], r7
     397 0013 FD 22 57                		mov.L	r7, [r5+]
     108:../src/RXv3_RegBankSave_ex2.c ****         tmp[i] = data[i];
     398                             		.loc 1 108 5 discriminator 3 view .LVU135
     399 0016 47 35                   		cmp	r3, r5
     400 0018 21 F8                   		bne	.L32
     401 001a 71 05 28                		add	#40, r0, r5
     402                             	.LVL44:
     403 001d FC 13 00                		.balign 8,3,3
     404                             	.L33:
     112:../src/RXv3_RegBankSave_ex2.c ****     }
     405                             		.loc 1 112 9 is_stmt 1 discriminator 3 view .LVU136
     112:../src/RXv3_RegBankSave_ex2.c ****     }
     406                             		.loc 1 112 17 is_stmt 0 discriminator 3 view .LVU137
     407 0020 FD 2E 57                		mov.L	[-r5], r7
     408 0023 FD 22 17                		mov.L	r7, [r1+]
     111:../src/RXv3_RegBankSave_ex2.c ****         data[i] = tmp[9 - i];
     409                             		.loc 1 111 5 discriminator 3 view .LVU138
     410 0026 47 A5                   		cmp	r10, r5
     411 0028 21 F8                   		bne	.L33
     114:../src/RXv3_RegBankSave_ex2.c **** 
     412                             		.loc 1 114 1 view .LVU139
     413 002a 3F 7A 0E                		rtsd	#56, r7-r10
     414                             	.LFE6:
     416                             		.global	_i_debug_ex2_
     417 002d FC 13 00                		.section	.data.i_debug_ex2_,"aw"
     418                             		.balign 4
     421                             	_i_debug_ex2_:
     422 0000 00 00 00 00             		.long	_i_task_
     529                             	.Letext0:
     530                             		.file 2 "c:\\renesas\\gccllvm\\gnurx-elf\\8.3.0.202202\\rx-elf\\rx-elf\\lib\\gcc\\rx-elf\\8.3.0.20
     531                             		.file 3 "c:\\renesas\\gccllvm\\gnurx-elf\\8.3.0.202202\\rx-elf\\rx-elf\\rx-elf\\include\\sys\\_typ
     532                             		.file 4 "c:\\renesas\\gccllvm\\gnurx-elf\\8.3.0.202202\\rx-elf\\rx-elf\\rx-elf\\include\\sys\\reen
     533                             		.file 5 "c:\\renesas\\gccllvm\\gnurx-elf\\8.3.0.202202\\rx-elf\\rx-elf\\rx-elf\\include\\sys\\lock
     534                             		.file 6 "c:\\renesas\\gccllvm\\gnurx-elf\\8.3.0.202202\\rx-elf\\rx-elf\\rx-elf\\include\\stdlib.h"
     535                             		.file 7 "c:\\renesas\\gccllvm\\gnurx-elf\\8.3.0.202202\\rx-elf\\rx-elf\\rx-elf\\include\\ctype.h"
     536                             		.file 8 "c:\\renesas\\gccllvm\\gnurx-elf\\8.3.0.202202\\rx-elf\\rx-elf\\rx-elf\\include\\stdio.h"
     537                             		.file 9 "<built-in>"
    

     

Reply
  • こんにちは。NoMaYです。

    CS+のサンプルプログラムフォルダにあったCC-RXプロジェクトのソースを改造し、-O2オプションでも問題になってしまうコードを生成させました。e2 studio 2022-07+GNURX 8.3.0.202202のプロジェクトのファイル一式を以下のzipファイルに固めました。

    issue_RXv3_RegBankSave_20220928_2.zip

    以下のようにPUSH/POPなどとRTEの位置関係が合ってなくて、これも動作しませんね(暴走しますね)。すみません、割り込み内でprintf/scanfを使っている格好になってしまっている点には、目をつぶって頂けるとありがたいです。

     156                                _i_task_:
     159 0000 6E 6D                         pushm   r6-r13
     161 0002 71 00 C8                      add #-56, r0
     165 0005 FD 76 E0 00                   save #0
     178 0009 FB 12 00 00 00 00             mov.L   #.LC0, r1
     180 000f 66 06                         mov.L   #0, r6
     182 0011 FB D2 00 00 00 00             mov.L   #__ctype_+1, r13
     184 0017 05 00 00 00                   bsr _puts
     188 001b 66 CA                         mov.L   #12, r10
     189 001d 4B 0A                         add r0, r10
     191 001f EF A7                         mov.L   r10, r7
     193 0021 66 18                         mov #1, r8
     195 0023 77 10 01 00 00                .balign 8,3,5
     途中省略
     337                                    .balign 8,3,3
     338                                .L25:
     340 00dc FD 2A A5                      mov.L   [r10+], r5
     341 00df A0 85                         mov.L   r5, 8[r0]
     342 00e1 E3 06                         mov.L   r6, [r0]
     343 00e3 A0 0F                         mov.L   r7, 4[r0]
     345 00e5 62 17                         add #1, r7
     348 00e7 05 00 00 00                   bsr _printf
     351 00eb 61 A7                         cmp #10, r7
     352 00ed 21 EF                         bne .L25
     359 00ef FD 76 F0 00                   rstr #0
     363 00f3 7F 95                         rte
     366 00f5 3F 6D 16                      rtsd    #88, r6-r13


    ソース: src/RXv3_RegBankSave_ex2.c

    RXv3_RegBankSave_ex2.c.20220928_2.txt
    #include <stdio.h>
    #include <math.h>
    #include <stdlib.h>
    #include <ctype.h>
    
    /* Special character code */
    #define LF 0x0a                     /* Line feed       */
    
    /* Flag */
    #define FALSE 0x00
    #define TRUE  0x01
    
    //void main(void);
    void sort(long *a);
    void change(long *a);
    
    //void main(void)
    static void task_(void)
    {
        long data[10];
        int i;
        char tmp[2];
        int ret;
        char isnuminput;
    
    //    while(1){
    
            printf("### Data Input ###\n");
    
            for( i=0; i<10; i++ ){
                printf("data[%d]=",i);
                data[i]= 0;
                isnuminput = FALSE;
                while(1){
                    ret = scanf("%c",&tmp);
                    if(ret != EOF){
                        if( tmp[0] != LF ){
                            if( isdigit(tmp[0])!=0 ){
                                data[i] = data[i]*10 + atoi(tmp);
                                isnuminput = TRUE;
                            }else{
                                printf("\n+++You can input only the decimal number.+++\n");
                                data[i] = 0;
                                isnuminput = FALSE;
                                printf("data[%d]=",i);
                            }
                        }else{
                            if(isnuminput != FALSE){
                                break;
                            }else{
                                printf("\n+++You can input only the decimal number.+++\n");
                                data[i] = 0;
                                isnuminput = FALSE;
                                printf("data[%d]=",i);
                            }
                        }
                    }else{
                        printf("\n+++You can input only the decimal number.+++\n");
                        data[i] = 0;
                        isnuminput = FALSE;
                        printf("data[%d]=",i);
                    }
                }
            }
    
            sort(data);
    
            printf("*** Sorting results ***\n");
    
            for( i=0; i<10; i++ ){
                printf("data[%d]=%ld\n",i,data[i]);
            }
    
            change(data);
    
    //    }
    }
    
    void sort(long *data)
    {
        long t;
        int i, j, k, gap;
    
        gap = 5;
        while( gap > 0 ){
            for( k=0; k<gap; k++){
                for( i=k+gap; i<10; i=i+gap ){
                    for(j=i-gap; j>=k; j=j-gap){
                        if(data[j]>data[j+gap]){
                            t = data[j];
                            data[j] = data[j+gap];
                            data[j+gap] = t;
                        }
                        else
                            break;
                    }
                }
            }
            gap = gap/2;
        }
    }
    
    void change(long *data)
    {
        long tmp[10];
        int i;
    
        for(i=0; i<10; i++){
            tmp[i] = data[i];
        }
        for(i=0; i<10; i++){
            data[i] = tmp[9 - i];
        }
    }
    
    static void i_task_(void)
    {
        __asm volatile ("save #0");
        task_();
        __asm volatile ("rstr #0");
        __asm volatile ("rte");
    }
    
    void *i_debug_ex2_ = i_task_;
    

     
    リストファイル: HardwareDebug/RXv3_RegBankSave_ex2.lst (最適化は-O2です。)
    RXv3_RegBankSave_ex2.lst.20220928_2.txt
       1                             		.file	"RXv3_RegBankSave_ex2.c"
       2                             		.section P,"ax"
       3                             	.Ltext0:
       4                             		.section	.text.sort,"ax",@progbits
       5                             		.global	_sort
       7                             	_sort:
       8                             	.LVL0:
       9                             	.LFB5:
      10                             		.file 1 "../src/RXv3_RegBankSave_ex2.c"
       1:../src/RXv3_RegBankSave_ex2.c **** #include <stdio.h>
       2:../src/RXv3_RegBankSave_ex2.c **** #include <math.h>
       3:../src/RXv3_RegBankSave_ex2.c **** #include <stdlib.h>
       4:../src/RXv3_RegBankSave_ex2.c **** #include <ctype.h>
       5:../src/RXv3_RegBankSave_ex2.c **** 
       6:../src/RXv3_RegBankSave_ex2.c **** /* Special character code */
       7:../src/RXv3_RegBankSave_ex2.c **** #define LF 0x0a                     /* Line feed       */
       8:../src/RXv3_RegBankSave_ex2.c **** 
       9:../src/RXv3_RegBankSave_ex2.c **** /* Flag */
      10:../src/RXv3_RegBankSave_ex2.c **** #define FALSE 0x00
      11:../src/RXv3_RegBankSave_ex2.c **** #define TRUE  0x01
      12:../src/RXv3_RegBankSave_ex2.c **** 
      13:../src/RXv3_RegBankSave_ex2.c **** //void main(void);
      14:../src/RXv3_RegBankSave_ex2.c **** void sort(long *a);
      15:../src/RXv3_RegBankSave_ex2.c **** void change(long *a);
      16:../src/RXv3_RegBankSave_ex2.c **** 
      17:../src/RXv3_RegBankSave_ex2.c **** //void main(void)
      18:../src/RXv3_RegBankSave_ex2.c **** static void task_(void)
      19:../src/RXv3_RegBankSave_ex2.c **** {
      20:../src/RXv3_RegBankSave_ex2.c ****     long data[10];
      21:../src/RXv3_RegBankSave_ex2.c ****     int i;
      22:../src/RXv3_RegBankSave_ex2.c ****     char tmp[2];
      23:../src/RXv3_RegBankSave_ex2.c ****     int ret;
      24:../src/RXv3_RegBankSave_ex2.c ****     char isnuminput;
      25:../src/RXv3_RegBankSave_ex2.c **** 
      26:../src/RXv3_RegBankSave_ex2.c **** //    while(1){
      27:../src/RXv3_RegBankSave_ex2.c **** 
      28:../src/RXv3_RegBankSave_ex2.c ****         printf("### Data Input ###\n");
      29:../src/RXv3_RegBankSave_ex2.c **** 
      30:../src/RXv3_RegBankSave_ex2.c ****         for( i=0; i<10; i++ ){
      31:../src/RXv3_RegBankSave_ex2.c ****             printf("data[%d]=",i);
      32:../src/RXv3_RegBankSave_ex2.c ****             data[i]= 0;
      33:../src/RXv3_RegBankSave_ex2.c ****             isnuminput = FALSE;
      34:../src/RXv3_RegBankSave_ex2.c ****             while(1){
      35:../src/RXv3_RegBankSave_ex2.c ****                 ret = scanf("%c",&tmp);
      36:../src/RXv3_RegBankSave_ex2.c ****                 if(ret != EOF){
      37:../src/RXv3_RegBankSave_ex2.c ****                     if( tmp[0] != LF ){
      38:../src/RXv3_RegBankSave_ex2.c ****                         if( isdigit(tmp[0])!=0 ){
      39:../src/RXv3_RegBankSave_ex2.c ****                             data[i] = data[i]*10 + atoi(tmp);
      40:../src/RXv3_RegBankSave_ex2.c ****                             isnuminput = TRUE;
      41:../src/RXv3_RegBankSave_ex2.c ****                         }else{
      42:../src/RXv3_RegBankSave_ex2.c ****                             printf("\n+++You can input only the decimal number.+++\n");
      43:../src/RXv3_RegBankSave_ex2.c ****                             data[i] = 0;
      44:../src/RXv3_RegBankSave_ex2.c ****                             isnuminput = FALSE;
      45:../src/RXv3_RegBankSave_ex2.c ****                             printf("data[%d]=",i);
      46:../src/RXv3_RegBankSave_ex2.c ****                         }
      47:../src/RXv3_RegBankSave_ex2.c ****                     }else{
      48:../src/RXv3_RegBankSave_ex2.c ****                         if(isnuminput != FALSE){
      49:../src/RXv3_RegBankSave_ex2.c ****                             break;
      50:../src/RXv3_RegBankSave_ex2.c ****                         }else{
      51:../src/RXv3_RegBankSave_ex2.c ****                             printf("\n+++You can input only the decimal number.+++\n");
      52:../src/RXv3_RegBankSave_ex2.c ****                             data[i] = 0;
      53:../src/RXv3_RegBankSave_ex2.c ****                             isnuminput = FALSE;
      54:../src/RXv3_RegBankSave_ex2.c ****                             printf("data[%d]=",i);
      55:../src/RXv3_RegBankSave_ex2.c ****                         }
      56:../src/RXv3_RegBankSave_ex2.c ****                     }
      57:../src/RXv3_RegBankSave_ex2.c ****                 }else{
      58:../src/RXv3_RegBankSave_ex2.c ****                     printf("\n+++You can input only the decimal number.+++\n");
      59:../src/RXv3_RegBankSave_ex2.c ****                     data[i] = 0;
      60:../src/RXv3_RegBankSave_ex2.c ****                     isnuminput = FALSE;
      61:../src/RXv3_RegBankSave_ex2.c ****                     printf("data[%d]=",i);
      62:../src/RXv3_RegBankSave_ex2.c ****                 }
      63:../src/RXv3_RegBankSave_ex2.c ****             }
      64:../src/RXv3_RegBankSave_ex2.c ****         }
      65:../src/RXv3_RegBankSave_ex2.c **** 
      66:../src/RXv3_RegBankSave_ex2.c ****         sort(data);
      67:../src/RXv3_RegBankSave_ex2.c **** 
      68:../src/RXv3_RegBankSave_ex2.c ****         printf("*** Sorting results ***\n");
      69:../src/RXv3_RegBankSave_ex2.c **** 
      70:../src/RXv3_RegBankSave_ex2.c ****         for( i=0; i<10; i++ ){
      71:../src/RXv3_RegBankSave_ex2.c ****             printf("data[%d]=%ld\n",i,data[i]);
      72:../src/RXv3_RegBankSave_ex2.c ****         }
      73:../src/RXv3_RegBankSave_ex2.c **** 
      74:../src/RXv3_RegBankSave_ex2.c ****         change(data);
      75:../src/RXv3_RegBankSave_ex2.c **** 
      76:../src/RXv3_RegBankSave_ex2.c **** //    }
      77:../src/RXv3_RegBankSave_ex2.c **** }
      78:../src/RXv3_RegBankSave_ex2.c **** 
      79:../src/RXv3_RegBankSave_ex2.c **** void sort(long *data)
      80:../src/RXv3_RegBankSave_ex2.c **** {
      11                             		.loc 1 80 1 view -0
      12                             		.loc 1 80 1 is_stmt 0 view .LVU1
      13 0000 6E 6D                   		pushm	r6-r13
      14                             	.LCFI0:
      15 0002 60 80                   		sub	#8, r0
      16                             	.LCFI1:
      81:../src/RXv3_RegBankSave_ex2.c ****     long t;
      17                             		.loc 1 81 5 is_stmt 1 view .LVU2
      82:../src/RXv3_RegBankSave_ex2.c ****     int i, j, k, gap;
      18                             		.loc 1 82 5 view .LVU3
      83:../src/RXv3_RegBankSave_ex2.c **** 
      84:../src/RXv3_RegBankSave_ex2.c ****     gap = 5;
      19                             		.loc 1 84 5 view .LVU4
      20                             	.LVL1:
      85:../src/RXv3_RegBankSave_ex2.c ****     while( gap > 0 ){
      21                             		.loc 1 85 5 view .LVU5
      80:../src/RXv3_RegBankSave_ex2.c ****     long t;
      22                             		.loc 1 80 1 is_stmt 0 view .LVU6
      23 0004 A0 09                   		mov.L	r1, 4[r0]
      86:../src/RXv3_RegBankSave_ex2.c ****         for( k=0; k<gap; k++){
      87:../src/RXv3_RegBankSave_ex2.c ****             for( i=k+gap; i<10; i=i+gap ){
      88:../src/RXv3_RegBankSave_ex2.c ****                 for(j=i-gap; j>=k; j=j-gap){
      89:../src/RXv3_RegBankSave_ex2.c ****                     if(data[j]>data[j+gap]){
      24                             		.loc 1 89 23 view .LVU7
      25 0006 F8 06 03                		mov.L	#3, [r0]
      84:../src/RXv3_RegBankSave_ex2.c ****     while( gap > 0 ){
      26                             		.loc 1 84 9 view .LVU8
      27 0009 66 5A                   		mov.L	#5, r10
      28                             	.LVL2:
      29                             		.balign 8,3,1
      30                             	.L2:
      84:../src/RXv3_RegBankSave_ex2.c ****     while( gap > 0 ){
      31                             		.loc 1 84 9 view .LVU9
      32 000b ED 0F 01                		mov.L	4[r0], r15
      33 000e FD C2 AE                		shll	#2, r10, r14
      34 0011 FB 66 FC                		mov.L	#-4, r6
      35 0014 4F A6                   		mul	r10, r6
      86:../src/RXv3_RegBankSave_ex2.c ****         for( k=0; k<gap; k++){
      36                             		.loc 1 86 15 view .LVU10
      37 0016 66 0C                   		mov.L	#0, r12
      38                             	.LVL3:
      39                             		.balign 8,3,1
      40                             	.L9:
      87:../src/RXv3_RegBankSave_ex2.c ****                 for(j=i-gap; j>=k; j=j-gap){
      41                             		.loc 1 87 13 is_stmt 1 view .LVU11
      87:../src/RXv3_RegBankSave_ex2.c ****                 for(j=i-gap; j>=k; j=j-gap){
      42                             		.loc 1 87 13 is_stmt 0 view .LVU12
      43 0018 EF C9                   		mov.L	r12, r9
      44 001a FF 2D FE                		add	r15, r14, r13
      86:../src/RXv3_RegBankSave_ex2.c ****         for( k=0; k<gap; k++){
      45                             		.loc 1 86 15 view .LVU13
      46 001d EF F8                   		mov.L	r15, r8
      47                             	.LVL4:
      48 001f 03                      		.balign 8,3,1
      49                             	.L4:
      88:../src/RXv3_RegBankSave_ex2.c ****                     if(data[j]>data[j+gap]){
      50                             		.loc 1 88 17 is_stmt 1 view .LVU14
      88:../src/RXv3_RegBankSave_ex2.c ****                     if(data[j]>data[j+gap]){
      51                             		.loc 1 88 22 is_stmt 0 view .LVU15
      52 0020 EF 97                   		mov.L	r9, r7
      53                             	.LVL5:
      88:../src/RXv3_RegBankSave_ex2.c ****                     if(data[j]>data[j+gap]){
      54                             		.loc 1 88 17 view .LVU16
      55 0022 47 C9                   		cmp	r12, r9
      56 0024 29 2D                   		blt	.L7
      57                             		.loc 1 89 21 is_stmt 1 view .LVU17
      58                             		.loc 1 89 28 is_stmt 0 view .LVU18
      59 0026 EC 85                   		mov.L	[r8], r5
      60                             		.loc 1 89 36 view .LVU19
      61 0028 EC D4                   		mov.L	[r13], r4
      62                             		.loc 1 89 23 view .LVU20
      63 002a 47 54                   		cmp	r5, r4
      64 002c 28 25                   		bge	.L7
      65 002e EF D1                   		mov.L	r13, r1
      66 0030 EF 82                   		mov.L	r8, r2
      67 0032 EF 83                   		mov.L	r8, r3
      68 0034 2E 10                   		bra	.L6
      69                             	.LVL6:
      70                             	.L8:
      71                             		.loc 1 89 36 view .LVU21
      72 0036 EC 34                   		mov.L	[r3], r4
      73                             		.loc 1 89 28 view .LVU22
      74 0038 EC B5                   		mov.L	[r11], r5
      75                             	.LVL7:
      76                             		.loc 1 89 28 view .LVU23
      77 003a EF B3                   		mov.L	r11, r3
      78 003c 4B 62                   		add	r6, r2
      79 003e 4B 61                   		add	r6, r1
      80                             	.LVL8:
      81                             		.loc 1 89 23 view .LVU24
      82 0040 47 45                   		cmp	r4, r5
      83 0042 2B 0F                   		ble	.L7
      84                             		.balign 8,3,2
      85                             	.L6:
      86                             		.loc 1 89 21 is_stmt 1 discriminator 2 view .LVU25
      90:../src/RXv3_RegBankSave_ex2.c ****                         t = data[j];
      87                             		.loc 1 90 25 discriminator 2 view .LVU26
      88                             	.LVL9:
      91:../src/RXv3_RegBankSave_ex2.c ****                         data[j] = data[j+gap];
      89                             		.loc 1 91 25 discriminator 2 view .LVU27
      89:../src/RXv3_RegBankSave_ex2.c ****                         t = data[j];
      90                             		.loc 1 89 28 is_stmt 0 discriminator 2 view .LVU28
      91 0044 FF 2B 63                		add	r6, r3, r11
      92                             		.loc 1 91 33 discriminator 2 view .LVU29
      93 0047 E3 24                   		mov.L	r4, [r2]
      92:../src/RXv3_RegBankSave_ex2.c ****                         data[j+gap] = t;
      94                             		.loc 1 92 25 is_stmt 1 discriminator 2 view .LVU30
      95                             		.loc 1 92 37 is_stmt 0 discriminator 2 view .LVU31
      96 0049 E3 15                   		mov.L	r5, [r1]
      88:../src/RXv3_RegBankSave_ex2.c ****                     if(data[j]>data[j+gap]){
      97                             		.loc 1 88 37 discriminator 2 view .LVU32
      98 004b 43 A7                   		sub	r10, r7
      99                             	.LVL10:
      88:../src/RXv3_RegBankSave_ex2.c ****                     if(data[j]>data[j+gap]){
     100                             		.loc 1 88 17 discriminator 2 view .LVU33
     101 004d 47 C7                   		cmp	r12, r7
     102 004f 28 E7                   		bge	.L8
     103                             	.LVL11:
     104                             		.balign 8,3,1
     105                             	.L7:
      88:../src/RXv3_RegBankSave_ex2.c ****                     if(data[j]>data[j+gap]){
     106                             		.loc 1 88 17 discriminator 2 view .LVU34
     107 0051 4B A9                   		add	r10, r9
     108                             	.LVL12:
      88:../src/RXv3_RegBankSave_ex2.c ****                     if(data[j]>data[j+gap]){
     109                             		.loc 1 88 17 discriminator 2 view .LVU35
     110 0053 4B E8                   		add	r14, r8
      87:../src/RXv3_RegBankSave_ex2.c ****                 for(j=i-gap; j>=k; j=j-gap){
     111                             		.loc 1 87 13 view .LVU36
     112 0055 FF 27 A9                		add	r10, r9, r7
     113                             	.LVL13:
      87:../src/RXv3_RegBankSave_ex2.c ****                 for(j=i-gap; j>=k; j=j-gap){
     114                             		.loc 1 87 13 view .LVU37
     115 0058 4B ED                   		add	r14, r13
     116 005a 61 97                   		cmp	#9, r7
     117 005c 2B C4                   		ble	.L4
      86:../src/RXv3_RegBankSave_ex2.c ****             for( i=k+gap; i<10; i=i+gap ){
     118                             		.loc 1 86 27 discriminator 2 view .LVU38
     119 005e 62 1C                   		add	#1, r12
     120                             	.LVL14:
      86:../src/RXv3_RegBankSave_ex2.c ****             for( i=k+gap; i<10; i=i+gap ){
     121                             		.loc 1 86 27 discriminator 2 view .LVU39
     122 0060 62 4F                   		add	#4, r15
      86:../src/RXv3_RegBankSave_ex2.c ****             for( i=k+gap; i<10; i=i+gap ){
     123                             		.loc 1 86 9 discriminator 2 view .LVU40
     124 0062 47 AC                   		cmp	r10, r12
     125 0064 29 B4                   		blt	.L9
      93:../src/RXv3_RegBankSave_ex2.c ****                     }
      94:../src/RXv3_RegBankSave_ex2.c ****                     else
      95:../src/RXv3_RegBankSave_ex2.c ****                         break;
      96:../src/RXv3_RegBankSave_ex2.c ****                 }
      97:../src/RXv3_RegBankSave_ex2.c ****             }
      98:../src/RXv3_RegBankSave_ex2.c ****         }
      99:../src/RXv3_RegBankSave_ex2.c ****         gap = gap/2;
     126                             		.loc 1 99 9 is_stmt 1 view .LVU41
     127 0066 EC 07                   		mov.L	[r0], r7
     128 0068 60 17                   		sub	#1, r7
     129 006a E3 07                   		mov.L	r7, [r0]
     130                             		.loc 1 99 13 is_stmt 0 view .LVU42
     131 006c 6A 1A                   		shar	#1, r10
     132                             	.LVL15:
      85:../src/RXv3_RegBankSave_ex2.c ****         for( k=0; k<gap; k++){
     133                             		.loc 1 85 10 view .LVU43
     134 006e 61 07                   		cmp	#0, r7
     135 0070 21 9B                   		bne	.L2
     100:../src/RXv3_RegBankSave_ex2.c ****     }
     101:../src/RXv3_RegBankSave_ex2.c **** }
     136                             		.loc 1 101 1 view .LVU44
     137 0072 3F 6D 0A                		rtsd	#40, r6-r13
     138                             		.loc 1 101 1 view .LVU45
     139                             	.LFE5:
     141 0075 FC 13 00                		.section	.rodata.i_task_.str1.1,"aMS",@progbits,1
     142                             	.LC0:
     143 0000 23 23 23 20 44 61 74 61 		.string	"### Data Input ###"
     143      20 49 6E 70 75 74 20 23 
     143      23 23 00 
     144                             	.LC1:
     145 0013 64 61 74 61 5B 25 64 5D 		.string	"data[%d]="
     145      3D 00 
     146                             	.LC2:
     147 001d 25 63 00                		.string	"%c"
     148                             	.LC3:
     149 0020 0A 2B 2B 2B 59 6F 75 20 		.string	"\n+++You can input only the decimal number.+++"
     149      63 61 6E 20 69 6E 70 75 
     149      74 20 6F 6E 6C 79 20 74 
     149      68 65 20 64 65 63 69 6D 
     149      61 6C 20 6E 75 6D 62 65 
     150                             	.LC4:
     151 004e 2A 2A 2A 20 53 6F 72 74 		.string	"*** Sorting results ***"
     151      69 6E 67 20 72 65 73 75 
     151      6C 74 73 20 2A 2A 2A 00 
     152                             	.LC5:
     153 0066 64 61 74 61 5B 25 64 5D 		.string	"data[%d]=%ld\n"
     153      3D 25 6C 64 0A 00 
     154                             		.section	.text.i_task_,"ax",@progbits
     156                             	_i_task_:
     157                             	.LFB7:
     102:../src/RXv3_RegBankSave_ex2.c **** 
     103:../src/RXv3_RegBankSave_ex2.c **** void change(long *data)
     104:../src/RXv3_RegBankSave_ex2.c **** {
     105:../src/RXv3_RegBankSave_ex2.c ****     long tmp[10];
     106:../src/RXv3_RegBankSave_ex2.c ****     int i;
     107:../src/RXv3_RegBankSave_ex2.c **** 
     108:../src/RXv3_RegBankSave_ex2.c ****     for(i=0; i<10; i++){
     109:../src/RXv3_RegBankSave_ex2.c ****         tmp[i] = data[i];
     110:../src/RXv3_RegBankSave_ex2.c ****     }
     111:../src/RXv3_RegBankSave_ex2.c ****     for(i=0; i<10; i++){
     112:../src/RXv3_RegBankSave_ex2.c ****         data[i] = tmp[9 - i];
     113:../src/RXv3_RegBankSave_ex2.c ****     }
     114:../src/RXv3_RegBankSave_ex2.c **** }
     115:../src/RXv3_RegBankSave_ex2.c **** 
     116:../src/RXv3_RegBankSave_ex2.c **** static void i_task_(void)
     117:../src/RXv3_RegBankSave_ex2.c **** {
     158                             		.loc 1 117 1 is_stmt 1 view -0
     159 0000 6E 6D                   		pushm	r6-r13
     160                             	.LCFI2:
     161 0002 71 00 C8                		add	#-56, r0
     162                             	.LCFI3:
     118:../src/RXv3_RegBankSave_ex2.c ****     __asm volatile ("save #0");
     163                             		.loc 1 118 5 view .LVU47
     164                             	 ; 118 "../src/RXv3_RegBankSave_ex2.c" 1
     165 0005 FD 76 E0 00             		save #0
     166                             	 ; 0 "" 2
     119:../src/RXv3_RegBankSave_ex2.c ****     task_();
     167                             		.loc 1 119 5 view .LVU48
     168                             	.LBB6:
     169                             	.LBI6:
      18:../src/RXv3_RegBankSave_ex2.c **** {
     170                             		.loc 1 18 13 view .LVU49
     171                             	.LBB7:
      20:../src/RXv3_RegBankSave_ex2.c ****     int i;
     172                             		.loc 1 20 5 view .LVU50
      21:../src/RXv3_RegBankSave_ex2.c ****     char tmp[2];
     173                             		.loc 1 21 5 view .LVU51
      22:../src/RXv3_RegBankSave_ex2.c ****     int ret;
     174                             		.loc 1 22 5 view .LVU52
      23:../src/RXv3_RegBankSave_ex2.c ****     char isnuminput;
     175                             		.loc 1 23 5 view .LVU53
      24:../src/RXv3_RegBankSave_ex2.c **** 
     176                             		.loc 1 24 5 view .LVU54
      28:../src/RXv3_RegBankSave_ex2.c **** 
     177                             		.loc 1 28 9 view .LVU55
     178 0009 FB 12 00 00 00 00       		mov.L	#.LC0, r1
      30:../src/RXv3_RegBankSave_ex2.c ****             printf("data[%d]=",i);
     179                             		.loc 1 30 15 is_stmt 0 view .LVU56
     180 000f 66 06                   		mov.L	#0, r6
      38:../src/RXv3_RegBankSave_ex2.c ****                             data[i] = data[i]*10 + atoi(tmp);
     181                             		.loc 1 38 29 view .LVU57
     182 0011 FB D2 00 00 00 00       		mov.L	#__ctype_+1, r13
      28:../src/RXv3_RegBankSave_ex2.c **** 
     183                             		.loc 1 28 9 view .LVU58
     184 0017 05 00 00 00             		bsr	_puts
     185                             	.LVL16:
      30:../src/RXv3_RegBankSave_ex2.c ****             printf("data[%d]=",i);
     186                             		.loc 1 30 9 is_stmt 1 view .LVU59
      30:../src/RXv3_RegBankSave_ex2.c ****             printf("data[%d]=",i);
     187                             		.loc 1 30 9 is_stmt 0 view .LVU60
     188 001b 66 CA                   		mov.L	#12, r10
     189 001d 4B 0A                   		add	r0, r10
      28:../src/RXv3_RegBankSave_ex2.c **** 
     190                             		.loc 1 28 9 view .LVU61
     191 001f EF A7                   		mov.L	r10, r7
      40:../src/RXv3_RegBankSave_ex2.c ****                         }else{
     192                             		.loc 1 40 40 view .LVU62
     193 0021 66 18                   		mov	#1, r8
     194                             	.LVL17:
     195 0023 77 10 01 00 00          		.balign 8,3,5
     196                             	.L24:
      31:../src/RXv3_RegBankSave_ex2.c ****             data[i]= 0;
     197                             		.loc 1 31 13 is_stmt 1 view .LVU63
     198 0028 A0 0E                   		mov.L	r6, 4[r0]
      33:../src/RXv3_RegBankSave_ex2.c ****             while(1){
     199                             		.loc 1 33 24 is_stmt 0 view .LVU64
     200 002a 66 0C                   		mov	#0, r12
      31:../src/RXv3_RegBankSave_ex2.c ****             data[i]= 0;
     201                             		.loc 1 31 13 view .LVU65
     202 002c F8 02 13 00 00 00       		mov.L	#.LC1, [r0]
      35:../src/RXv3_RegBankSave_ex2.c ****                 if(ret != EOF){
     203                             		.loc 1 35 23 view .LVU66
     204 0032 71 09 34                		add	#52, r0, r9
      31:../src/RXv3_RegBankSave_ex2.c ****             data[i]= 0;
     205                             		.loc 1 31 13 view .LVU67
     206 0035 05 00 00 00             		bsr	_printf
     207                             	.LVL18:
      32:../src/RXv3_RegBankSave_ex2.c ****             isnuminput = FALSE;
     208                             		.loc 1 32 13 is_stmt 1 view .LVU68
      32:../src/RXv3_RegBankSave_ex2.c ****             isnuminput = FALSE;
     209                             		.loc 1 32 20 is_stmt 0 view .LVU69
     210 0039 F8 76 00                		mov.L	#0, [r7]
      33:../src/RXv3_RegBankSave_ex2.c ****             while(1){
     211                             		.loc 1 33 13 is_stmt 1 view .LVU70
     212                             	.LVL19:
     213 003c 76 10 01 00             		.balign 8,3,5
     214                             	.L18:
      34:../src/RXv3_RegBankSave_ex2.c ****                 ret = scanf("%c",&tmp);
     215                             		.loc 1 34 13 view .LVU71
      35:../src/RXv3_RegBankSave_ex2.c ****                 if(ret != EOF){
     216                             		.loc 1 35 17 view .LVU72
      35:../src/RXv3_RegBankSave_ex2.c ****                 if(ret != EOF){
     217                             		.loc 1 35 23 is_stmt 0 view .LVU73
     218 0040 E7 09 01                		mov.L	r9, 4[r0]
     219 0043 F8 02 1D 00 00 00       		mov.L	#.LC2, [r0]
     220 0049 05 00 00 00             		bsr	_scanf
     221                             	.LVL20:
      36:../src/RXv3_RegBankSave_ex2.c ****                     if( tmp[0] != LF ){
     222                             		.loc 1 36 17 is_stmt 1 view .LVU74
      37:../src/RXv3_RegBankSave_ex2.c ****                         if( isdigit(tmp[0])!=0 ){
     223                             		.loc 1 37 21 view .LVU75
      38:../src/RXv3_RegBankSave_ex2.c ****                             data[i] = data[i]*10 + atoi(tmp);
     224                             		.loc 1 38 25 view .LVU76
      36:../src/RXv3_RegBankSave_ex2.c ****                     if( tmp[0] != LF ){
     225                             		.loc 1 36 19 is_stmt 0 view .LVU77
     226 004d 75 01 FF                		cmp	#-1, r1
     227 0050 20 38                   		beq	.L19
     228                             		.balign 8,3,3
     229                             	.L30:
      37:../src/RXv3_RegBankSave_ex2.c ****                         if( isdigit(tmp[0])!=0 ){
     230                             		.loc 1 37 23 view .LVU78
     231 0052 59 05 34                		movu.B	52[r0], r5
     232 0055 61 A5                   		cmp	#10, r5
     233 0057 20 56                   		beq	.L20
      39:../src/RXv3_RegBankSave_ex2.c ****                             isnuminput = TRUE;
     234                             		.loc 1 39 29 is_stmt 1 view .LVU79
      42:../src/RXv3_RegBankSave_ex2.c ****                             data[i] = 0;
     235                             		.loc 1 42 29 view .LVU80
      39:../src/RXv3_RegBankSave_ex2.c ****                             isnuminput = TRUE;
     236                             		.loc 1 39 52 is_stmt 0 view .LVU81
     237 0059 EF 91                   		mov.L	r9, r1
     238                             	.LVL21:
      39:../src/RXv3_RegBankSave_ex2.c ****                             isnuminput = TRUE;
     239                             		.loc 1 39 52 view .LVU82
     240 005b FE 4D 55                		mov.B	[r13,r5], r5
     241 005e 64 45                   		and	#4, r5
     242 0060 CF 5C                   		mov.B	r5, r12
     243                             	.LVL22:
      38:../src/RXv3_RegBankSave_ex2.c ****                             data[i] = data[i]*10 + atoi(tmp);
     244                             		.loc 1 38 27 view .LVU83
     245 0062 20 43                   		beq	.L21
      39:../src/RXv3_RegBankSave_ex2.c ****                             isnuminput = TRUE;
     246                             		.loc 1 39 46 view .LVU84
     247 0064 EC 7B                   		mov.L	[r7], r11
      40:../src/RXv3_RegBankSave_ex2.c ****                         }else{
     248                             		.loc 1 40 40 view .LVU85
     249 0066 CF 8C                   		mov.B	r8, r12
      39:../src/RXv3_RegBankSave_ex2.c ****                             isnuminput = TRUE;
     250                             		.loc 1 39 46 view .LVU86
     251 0068 63 AB                   		mul	#10, r11
      39:../src/RXv3_RegBankSave_ex2.c ****                             isnuminput = TRUE;
     252                             		.loc 1 39 52 view .LVU87
     253 006a 05 00 00 00             		bsr	_atoi
     254                             	.LVL23:
      39:../src/RXv3_RegBankSave_ex2.c ****                             isnuminput = TRUE;
     255                             		.loc 1 39 50 view .LVU88
     256 006e 4B B1                   		add	r11, r1
      39:../src/RXv3_RegBankSave_ex2.c ****                             isnuminput = TRUE;
     257                             		.loc 1 39 37 view .LVU89
     258 0070 E3 71                   		mov.L	r1, [r7]
      40:../src/RXv3_RegBankSave_ex2.c ****                         }else{
     259                             		.loc 1 40 29 is_stmt 1 view .LVU90
     260                             	.LVL24:
      34:../src/RXv3_RegBankSave_ex2.c ****                 ret = scanf("%c",&tmp);
     261                             		.loc 1 34 13 view .LVU91
      35:../src/RXv3_RegBankSave_ex2.c ****                 if(ret != EOF){
     262                             		.loc 1 35 17 view .LVU92
      35:../src/RXv3_RegBankSave_ex2.c ****                 if(ret != EOF){
     263                             		.loc 1 35 23 is_stmt 0 view .LVU93
     264 0072 E7 09 01                		mov.L	r9, 4[r0]
     265 0075 F8 02 1D 00 00 00       		mov.L	#.LC2, [r0]
     266 007b 05 00 00 00             		bsr	_scanf
     267                             	.LVL25:
      36:../src/RXv3_RegBankSave_ex2.c ****                     if( tmp[0] != LF ){
     268                             		.loc 1 36 17 is_stmt 1 view .LVU94
      37:../src/RXv3_RegBankSave_ex2.c ****                         if( isdigit(tmp[0])!=0 ){
     269                             		.loc 1 37 21 view .LVU95
      38:../src/RXv3_RegBankSave_ex2.c ****                             data[i] = data[i]*10 + atoi(tmp);
     270                             		.loc 1 38 25 view .LVU96
      36:../src/RXv3_RegBankSave_ex2.c ****                     if( tmp[0] != LF ){
     271                             		.loc 1 36 19 is_stmt 0 view .LVU97
     272 007f 75 01 FF                		cmp	#-1, r1
     273 0082 21 D0                   		bne	.L30
     274 0084 76 10 01 00             		.balign 8,3,5
     275                             	.L19:
      58:../src/RXv3_RegBankSave_ex2.c ****                     data[i] = 0;
     276                             		.loc 1 58 21 is_stmt 1 view .LVU98
     277 0088 FB 12 20 00 00 00       		mov.L	#.LC3, r1
     278                             	.LVL26:
      60:../src/RXv3_RegBankSave_ex2.c ****                     printf("data[%d]=",i);
     279                             		.loc 1 60 32 is_stmt 0 view .LVU99
     280 008e 66 0C                   		mov	#0, r12
     281                             	.LVL27:
     282                             		.balign 8,3,3
     283                             	.L29:
      58:../src/RXv3_RegBankSave_ex2.c ****                     data[i] = 0;
     284                             		.loc 1 58 21 view .LVU100
     285 0090 05 00 00 00             		bsr	_puts
     286                             	.LVL28:
      59:../src/RXv3_RegBankSave_ex2.c ****                     isnuminput = FALSE;
     287                             		.loc 1 59 21 is_stmt 1 view .LVU101
      59:../src/RXv3_RegBankSave_ex2.c ****                     isnuminput = FALSE;
     288                             		.loc 1 59 29 is_stmt 0 view .LVU102
     289 0094 F8 76 00                		mov.L	#0, [r7]
      60:../src/RXv3_RegBankSave_ex2.c ****                     printf("data[%d]=",i);
     290                             		.loc 1 60 21 is_stmt 1 view .LVU103
     291                             	.LVL29:
      61:../src/RXv3_RegBankSave_ex2.c ****                 }
     292                             		.loc 1 61 21 view .LVU104
     293 0097 A0 0E                   		mov.L	r6, 4[r0]
     294 0099 F8 02 13 00 00 00       		mov.L	#.LC1, [r0]
     295 009f 05 00 00 00             		bsr	_printf
     296                             	.LVL30:
     297 00a3 2E 9D                   		bra	.L18
     298                             	.LVL31:
     299                             	.L21:
      42:../src/RXv3_RegBankSave_ex2.c ****                             data[i] = 0;
     300                             		.loc 1 42 29 is_stmt 0 view .LVU105
     301 00a5 FB 12 20 00 00 00       		mov.L	#.LC3, r1
     302 00ab 2E E5                   		bra	.L29
     303                             	.LVL32:
     304                             	.L20:
      48:../src/RXv3_RegBankSave_ex2.c ****                             break;
     305                             		.loc 1 48 25 is_stmt 1 view .LVU106
      51:../src/RXv3_RegBankSave_ex2.c ****                             data[i] = 0;
     306                             		.loc 1 51 29 view .LVU107
     307 00ad FB 12 20 00 00 00       		mov.L	#.LC3, r1
     308                             	.LVL33:
      48:../src/RXv3_RegBankSave_ex2.c ****                             break;
     309                             		.loc 1 48 27 is_stmt 0 view .LVU108
     310 00b3 5B C5                   		movu.B	r12, r5
     311 00b5 61 05                   		cmp	#0, r5
     312 00b7 20 D9                   		beq	.L29
      30:../src/RXv3_RegBankSave_ex2.c ****             printf("data[%d]=",i);
     313                             		.loc 1 30 26 view .LVU109
     314 00b9 62 16                   		add	#1, r6
     315                             	.LVL34:
      30:../src/RXv3_RegBankSave_ex2.c ****             printf("data[%d]=",i);
     316                             		.loc 1 30 26 view .LVU110
     317 00bb 62 47                   		add	#4, r7
      30:../src/RXv3_RegBankSave_ex2.c ****             printf("data[%d]=",i);
     318                             		.loc 1 30 9 view .LVU111
     319 00bd 61 A6                   		cmp	#10, r6
     320 00bf 3B 69 FF                		bne	.L24
      66:../src/RXv3_RegBankSave_ex2.c **** 
     321                             		.loc 1 66 9 is_stmt 1 view .LVU112
     322 00c2 66 C1                   		mov.L	#12, r1
     323 00c4 4B 01                   		add	r0, r1
      70:../src/RXv3_RegBankSave_ex2.c ****             printf("data[%d]=%ld\n",i,data[i]);
     324                             		.loc 1 70 15 is_stmt 0 view .LVU113
     325 00c6 66 07                   		mov.L	#0, r7
      71:../src/RXv3_RegBankSave_ex2.c ****         }
     326                             		.loc 1 71 13 view .LVU114
     327 00c8 FB 62 66 00 00 00       		mov.L	#.LC5, r6
     328                             	.LVL35:
      66:../src/RXv3_RegBankSave_ex2.c **** 
     329                             		.loc 1 66 9 view .LVU115
     330 00ce 05 00 00 00             		bsr	_sort
     331                             	.LVL36:
      68:../src/RXv3_RegBankSave_ex2.c **** 
     332                             		.loc 1 68 9 is_stmt 1 view .LVU116
     333 00d2 FB 12 4E 00 00 00       		mov.L	#.LC4, r1
     334 00d8 05 00 00 00             		bsr	_puts
     335                             	.LVL37:
      70:../src/RXv3_RegBankSave_ex2.c ****             printf("data[%d]=%ld\n",i,data[i]);
     336                             		.loc 1 70 9 view .LVU117
     337                             		.balign 8,3,3
     338                             	.L25:
      71:../src/RXv3_RegBankSave_ex2.c ****         }
     339                             		.loc 1 71 13 view .LVU118
     340 00dc FD 2A A5                		mov.L	[r10+], r5
     341 00df A0 85                   		mov.L	r5, 8[r0]
     342 00e1 E3 06                   		mov.L	r6, [r0]
     343 00e3 A0 0F                   		mov.L	r7, 4[r0]
      70:../src/RXv3_RegBankSave_ex2.c ****             printf("data[%d]=%ld\n",i,data[i]);
     344                             		.loc 1 70 26 is_stmt 0 view .LVU119
     345 00e5 62 17                   		add	#1, r7
     346                             	.LVL38:
      71:../src/RXv3_RegBankSave_ex2.c ****         }
     347                             		.loc 1 71 13 view .LVU120
     348 00e7 05 00 00 00             		bsr	_printf
     349                             	.LVL39:
      70:../src/RXv3_RegBankSave_ex2.c ****             printf("data[%d]=%ld\n",i,data[i]);
     350                             		.loc 1 70 9 view .LVU121
     351 00eb 61 A7                   		cmp	#10, r7
     352 00ed 21 EF                   		bne	.L25
     353                             	.LVL40:
      70:../src/RXv3_RegBankSave_ex2.c ****             printf("data[%d]=%ld\n",i,data[i]);
     354                             		.loc 1 70 9 view .LVU122
     355                             	.LBE7:
     356                             	.LBE6:
     120:../src/RXv3_RegBankSave_ex2.c ****     __asm volatile ("rstr #0");
     357                             		.loc 1 120 5 is_stmt 1 view .LVU123
     358                             	 ; 120 "../src/RXv3_RegBankSave_ex2.c" 1
     359 00ef FD 76 F0 00             		rstr #0
     360                             	 ; 0 "" 2
     121:../src/RXv3_RegBankSave_ex2.c ****     __asm volatile ("rte");
     361                             		.loc 1 121 5 view .LVU124
     362                             	 ; 121 "../src/RXv3_RegBankSave_ex2.c" 1
     363 00f3 7F 95                   		rte
     364                             	 ; 0 "" 2
     122:../src/RXv3_RegBankSave_ex2.c **** }
     365                             		.loc 1 122 1 is_stmt 0 view .LVU125
     366 00f5 3F 6D 16                		rtsd	#88, r6-r13
     367                             	.LFE7:
     369                             		.section	.text.change,"ax",@progbits
     370                             		.global	_change
     372                             	_change:
     373                             	.LVL41:
     374                             	.LFB6:
     104:../src/RXv3_RegBankSave_ex2.c ****     long tmp[10];
     375                             		.loc 1 104 1 is_stmt 1 view -0
     104:../src/RXv3_RegBankSave_ex2.c ****     long tmp[10];
     376                             		.loc 1 104 1 is_stmt 0 view .LVU127
     377 0000 6E 7A                   		pushm	r7-r10
     378                             	.LCFI4:
     379 0002 71 00 D8                		add	#-40, r0
     380                             	.LCFI5:
     105:../src/RXv3_RegBankSave_ex2.c ****     int i;
     381                             		.loc 1 105 5 is_stmt 1 view .LVU128
     106:../src/RXv3_RegBankSave_ex2.c **** 
     382                             		.loc 1 106 5 view .LVU129
     108:../src/RXv3_RegBankSave_ex2.c ****         tmp[i] = data[i];
     383                             		.loc 1 108 5 view .LVU130
     384                             	.LVL42:
     108:../src/RXv3_RegBankSave_ex2.c ****         tmp[i] = data[i];
     385                             		.loc 1 108 5 is_stmt 0 view .LVU131
     386 0005 EF 0A                   		mov.L	r0, r10
     387 0007 71 03 28                		add	#40, r0, r3
     104:../src/RXv3_RegBankSave_ex2.c ****     long tmp[10];
     388                             		.loc 1 104 1 view .LVU132
     389 000a EF 05                   		mov.L	r0, r5
     390 000c EF 14                   		mov.L	r1, r4
     391                             	.LVL43:
     392 000e EF 00                   		.balign 8,3,3
     393                             	.L32:
     109:../src/RXv3_RegBankSave_ex2.c ****     }
     394                             		.loc 1 109 9 is_stmt 1 discriminator 3 view .LVU133
     109:../src/RXv3_RegBankSave_ex2.c ****     }
     395                             		.loc 1 109 16 is_stmt 0 discriminator 3 view .LVU134
     396 0010 FD 2A 47                		mov.L	[r4+], r7
     397 0013 FD 22 57                		mov.L	r7, [r5+]
     108:../src/RXv3_RegBankSave_ex2.c ****         tmp[i] = data[i];
     398                             		.loc 1 108 5 discriminator 3 view .LVU135
     399 0016 47 35                   		cmp	r3, r5
     400 0018 21 F8                   		bne	.L32
     401 001a 71 05 28                		add	#40, r0, r5
     402                             	.LVL44:
     403 001d FC 13 00                		.balign 8,3,3
     404                             	.L33:
     112:../src/RXv3_RegBankSave_ex2.c ****     }
     405                             		.loc 1 112 9 is_stmt 1 discriminator 3 view .LVU136
     112:../src/RXv3_RegBankSave_ex2.c ****     }
     406                             		.loc 1 112 17 is_stmt 0 discriminator 3 view .LVU137
     407 0020 FD 2E 57                		mov.L	[-r5], r7
     408 0023 FD 22 17                		mov.L	r7, [r1+]
     111:../src/RXv3_RegBankSave_ex2.c ****         data[i] = tmp[9 - i];
     409                             		.loc 1 111 5 discriminator 3 view .LVU138
     410 0026 47 A5                   		cmp	r10, r5
     411 0028 21 F8                   		bne	.L33
     114:../src/RXv3_RegBankSave_ex2.c **** 
     412                             		.loc 1 114 1 view .LVU139
     413 002a 3F 7A 0E                		rtsd	#56, r7-r10
     414                             	.LFE6:
     416                             		.global	_i_debug_ex2_
     417 002d FC 13 00                		.section	.data.i_debug_ex2_,"aw"
     418                             		.balign 4
     421                             	_i_debug_ex2_:
     422 0000 00 00 00 00             		.long	_i_task_
     529                             	.Letext0:
     530                             		.file 2 "c:\\renesas\\gccllvm\\gnurx-elf\\8.3.0.202202\\rx-elf\\rx-elf\\lib\\gcc\\rx-elf\\8.3.0.20
     531                             		.file 3 "c:\\renesas\\gccllvm\\gnurx-elf\\8.3.0.202202\\rx-elf\\rx-elf\\rx-elf\\include\\sys\\_typ
     532                             		.file 4 "c:\\renesas\\gccllvm\\gnurx-elf\\8.3.0.202202\\rx-elf\\rx-elf\\rx-elf\\include\\sys\\reen
     533                             		.file 5 "c:\\renesas\\gccllvm\\gnurx-elf\\8.3.0.202202\\rx-elf\\rx-elf\\rx-elf\\include\\sys\\lock
     534                             		.file 6 "c:\\renesas\\gccllvm\\gnurx-elf\\8.3.0.202202\\rx-elf\\rx-elf\\rx-elf\\include\\stdlib.h"
     535                             		.file 7 "c:\\renesas\\gccllvm\\gnurx-elf\\8.3.0.202202\\rx-elf\\rx-elf\\rx-elf\\include\\ctype.h"
     536                             		.file 8 "c:\\renesas\\gccllvm\\gnurx-elf\\8.3.0.202202\\rx-elf\\rx-elf\\rx-elf\\include\\stdio.h"
     537                             		.file 9 "<built-in>"
    

     

Children
  • こんにちは。NoMaYです。

    すみません、昨日の投稿でひとつ間違えました。naked アトリビュートを使うとインライン展開が抑止されますね。他方で、JSR(BSR)/RTSのオーバーヘッド(少なくとも3+5=8クロック)が追加される点は昨日の通りです。トータルでプラスマイナスは?ですけれども。e2 studio 2022-07+GNURX 8.3.0.202202のプロジェクトのファイル一式を以下のzipファイルに固めました。

    issue_RXv3_RegBankSave_20220928_3.zip

    ソース: src/RXv3_RegBankSave_ex3.c

    static __attribute__((naked)) void i_task_(void)
    {
        __asm volatile ("save #0");
        task_();
        __asm volatile ("rstr #0");
        __asm volatile ("rte");
    }

     
    リストファイル: HardwareDebug/RXv3_RegBankSave_ex3.lst (少し加工してあります。最適化は-O2です。)

     116:../src/RXv3_RegBankSave_ex3.c **** static __attribute__((naked)) void i_task_(void)
     117:../src/RXv3_RegBankSave_ex3.c **** {
     352                                    ; Note: Naked Function
     118:../src/RXv3_RegBankSave_ex3.c ****     __asm volatile ("save #0");
     355 0000 FD 76 E0 00                   save #0
     119:../src/RXv3_RegBankSave_ex3.c ****     task_();
     358 0004 05 00 00 00                   bsr _task_
     120:../src/RXv3_RegBankSave_ex3.c ****     __asm volatile ("rstr #0");
     362 0008 FD 76 F0 00                   rstr #0
     121:../src/RXv3_RegBankSave_ex3.c ****     __asm volatile ("rte");
     366 000c 7F 95                         rte
     122:../src/RXv3_RegBankSave_ex3.c **** }
     369                                    ; Naked function: epilogue provided by programmer.