こんにちは。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%高速化します。」
NoMay さんこんにちは。
RX66TとRX72Tの違いは、動作周波数くらいだと思っていましたが、この命令郡をサポートしていないとは知りませんでした・・
---
GNU-RX 8.3.0 で、具体的にどのように使うか実験してみました。
元のコードでは、gcc の割り込み関数アトリビュートを使っていましたが、アセンブラ命令を追加して、以下のように修正しました。
```
コンパイルされたアセンブラ命令:
fff81c38 <__ZN6device7cmt_mgrINS_5cmt_tILm557058ELNS_10peripheralE41ENS_6icuc_tIvE6VECTORELS5_28EEEN5utils9null_taskEE7i_task_Ev>:fff81c38: fd 76 e0 00 save #0fff81c3c: fb 42 58 05 00 00 mov.l #0x558, r4fff81c42: ec 45 mov.l [r4], r5fff81c44: 62 15 add #1, r5fff81c46: e3 45 mov.l r5, [r4]fff81c48: fd 76 f0 00 rstr #0fff81c4c: 7f 95 rtefff81c4e: 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
#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_;
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>"
こんにちは。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.