こんにちは。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です。> DPUSHM命令(レジスタ数が多い場合(最大16レジスタ)) : 最大 16 クロック> DPOPM命令(レジスタ数が多い場合(最大16レジスタ)) : 最大 16 or 16+1 クロックコンパイラは生成コード内で以下のような命令を素朴に使用していますね。CC-RXでも特殊な対応(例えば複数命令に分割するような機能とか)は無いようでした。1つ前の投稿で書いたことの繰り返しですけれども、CC-RXの -nouse_div_inst というコンパイルオプションで抑止される命令のうち、DIV命令やDIVU命令と同等レベルとはちょっと言い難いとしても、FDIV命令と同等レベルの命令実行時間とは言えるだろうと思います。(他の多くの命令と比べて、有意に実行時間が長く、長くなっている分だけ割り込みルーチンへ飛ぶのが遅れる。)
DPUSHM.D DR0-DR15DPOPM.D DR0-DR15
試したソース
double d1, d2;double dA, dB, dC, dD;static void Check_DPUSHM_DPOPM(void);static void Check_DPUSHM_DPOPM(void){ double d3, d4, d5, d6, d7, d8, d9, d10, d11, d12, d13, d14, d15, d16; d3 = d1 + d2 + 3.0; d4 = d1 - d2 + 4.0; d5 = d1 + d2 + 5.0; d6 = d1 - d2 + 6.0; d7 = d1 + d2 + 7.0; d8 = d1 - d2 + 8.0; d9 = d1 + d2 + 9.0; d10 = d1 - d2 + 10.0; d11 = d1 + d2 + 11.0; d12 = d1 - d2 + 12.0; d13 = d1 + d2 + 13.0; d14 = d1 - d2 + 14.0; d15 = d1 + d2 + 15.0; d16 = d1 - d2 + 16.0; dA = d3 + d4 + d5 + d6 + d7 + d8 + d9 + d10 + d11 + d12 + d13 + d14 + d15 + d16; dB = d3 * d4 * d5 * d6 * d7 * d8 * d9 * d10 * d11 * d12 * d13 * d14 * d15 * d16; dC = d3 - d4 - d5 - d6 - d7 - d8 - d9 - d10 - d11 - d12 - d13 - d14 - d15 - d16; dD = d3 / d4 / d5 / d6 / d7 / d8 / d9 / d10 / d11 / d12 / d13 / d14 / d15 / d16;}
CC-RXでのリストファイル
.SECTION P,CODE00000000 __$Check_DPUSHM_DPOPM: .STACK __$Check_DPUSHM_DPOPM=13200000000 75B00F DPUSHM.D DR0-DR1500000003 FBE2rrrrrrrr MOV.L #_d1, R1400000009 FCC8E830 DMOV.D [R14], DR30000000D FBE2rrrrrrrr MOV.L #_d2, R1400000013 FCC8E810 DMOV.D [R14], DR100000017 76903021 DADD DR1, DR3, DR20000001B 769031F1 DSUB DR1, DR3, DR150000001F F9030300000840 DMOV.D #40080000H, DRH000000026 F9031300001040 DMOV.D #40100000H, DRH10000002D 76902000 DADD DR0, DR2, DR000000031 7690F0E1 DADD DR1, DR15, DR1400000035 F9031300001440 DMOV.D #40140000H, DRH10000003C 769020D1 DADD DR1, DR2, DR1300000040 F9031300001840 DMOV.D #40180000H, DRH100000047 7690003E DADD DR14, DR0, DR30000004B 7690F0C1 DADD DR1, DR15, DR120000004F F9031300001C40 DMOV.D #401C0000H, DRH100000056 769020B1 DADD DR1, DR2, DR110000005A FBF2rrrrrrrr MOV.L #_dA, R1500000060 7690303D DADD DR13, DR3, DR300000064 F9031300002040 DMOV.D #40200000H, DRH10000006B 7690F0A1 DADD DR1, DR15, DR100000006F F9031300002240 DMOV.D #40220000H, DRH100000076 7690303C DADD DR12, DR3, DR30000007A 76902091 DADD DR1, DR2, DR90000007E F9031300002440 DMOV.D #40240000H, DRH100000085 7690F081 DADD DR1, DR15, DR800000089 7690303B DADD DR11, DR3, DR30000008D F9031300002640 DMOV.D #40260000H, DRH100000094 76902071 DADD DR1, DR2, DR700000098 F9031300002840 DMOV.D #40280000H, DRH10000009F 7690303A DADD DR10, DR3, DR3000000A3 7690F061 DADD DR1, DR15, DR6000000A7 FBE2rrrrrrrr MOV.L #_dB, R14000000AD F9031300002A40 DMOV.D #402A0000H, DRH1000000B4 76902051 DADD DR1, DR2, DR5000000B8 76903039 DADD DR9, DR3, DR3000000BC F9031300002C40 DMOV.D #402C0000H, DRH1000000C3 7690F041 DADD DR1, DR15, DR4000000C7 76903038 DADD DR8, DR3, DR3000000CB 76903037 DADD DR7, DR3, DR3000000CF 76903036 DADD DR6, DR3, DR3000000D3 76903035 DADD DR5, DR3, DR3000000D7 76903014 DADD DR4, DR3, DR1000000DB F9033300002E40 DMOV.D #402E0000H, DRH3000000E2 76902033 DADD DR3, DR2, DR3000000E6 76901023 DADD DR3, DR1, DR2000000EA F9031300003040 DMOV.D #40300000H, DRH1000000F1 7690F011 DADD DR1, DR15, DR1000000F5 76902021 DADD DR1, DR2, DR2000000F9 FC78F820 DMOV.D DR2, [R15]…略… …略…000001B1 75B80F DPOPM.D DR0-DR15000001B4 02 RTS
;*** COMMAND PARAMETER *** ;-isa=rxv3 ;-fpu ;-dpfpu ;-save_acc …略(-MAKEUDと-include)… ;-asmopt=-bank ;-lang=c99 ;-utf8 ;-message ;-output=obj ;-obj_path=src ;-debug ;-outcode=utf8 ;-show=source ;-optimize=max ;-goptimize ;-speed ;-type_size_access_to_volatile ;-nologo ;-listfile=src/RXv3_Check_FSQRT_DSQRT_etc.lst ;../src/RXv3_Check_FSQRT_DSQRT_etc.c
ICCRXでのリストファイル
\ In section .text, align 1, keep-with-next \ _Check_DPUSHM_DPOPM: \ 000000 FB 1E MOV.L #_f1:24,R1 \ ..'.... \ 000005 75 B0 0F DPUSHM.D DR0,DR15 \ 000008 FC C9 18 04 DMOV.D 0x10[R1],DR2 \ 20 \ 00000D FC C9 18 02 DMOV.D 0x8[R1],DR0 \ 00 \ 000012 F9 03 43 00 DMOV.D #0x40080000,DRH4 \ 00 08 40 \ 000019 F9 03 53 00 DMOV.D #0x40100000,DRH5 \ 00 10 40 \ 000020 76 90 20 30 DADD DR0,DR2,DR3 \ 000024 76 90 01 22 DSUB DR2,DR0,DR2 \ 000028 76 90 40 43 DADD DR3,DR4,DR4 \ 00002C 76 90 50 52 DADD DR2,DR5,DR5 \ 000030 F9 03 63 00 DMOV.D #0x40140000,DRH6 \ 00 14 40 \ 000037 F9 03 73 00 DMOV.D #0x40180000,DRH7 \ 00 18 40 \ 00003E F9 03 93 00 DMOV.D #0x40200000,DRH9 \ 00 20 40 \ 000045 F9 03 B3 00 DMOV.D #0x40240000,DRH11 \ 00 24 40 \ 00004C F9 03 D3 00 DMOV.D #0x40280000,DRH13 \ 00 28 40 \ 000053 F9 03 F3 00 DMOV.D #0x402c0000,DRH15 \ 00 2C 40 \ 00005A F9 03 03 00 DMOV.D #0x40300000,DRH0 \ 00 30 40 \ 000061 76 90 60 63 DADD DR3,DR6,DR6 \ 000065 76 90 70 72 DADD DR2,DR7,DR7 \ 000069 76 90 90 92 DADD DR2,DR9,DR9 \ 00006D 76 90 B0 B2 DADD DR2,DR11,DR11 \ 000071 76 90 D0 D2 DADD DR2,DR13,DR13 \ 000075 76 90 F0 F2 DADD DR2,DR15,DR15 \ 000079 76 90 00 22 DADD DR2,DR0,DR2 \ 00007D 76 90 50 04 DADD DR4,DR5,DR0 \ 000081 F9 03 83 00 DMOV.D #0x401c0000,DRH8 \ 00 1C 40 \ 000088 76 90 60 00 DADD DR0,DR6,DR0 \ 00008C 76 90 80 83 DADD DR3,DR8,DR8 \ 000090 76 90 70 00 DADD DR0,DR7,DR0 \ 000094 F9 03 A3 00 DMOV.D #0x40220000,DRH10 \ 00 22 40 \ 00009B 76 90 80 00 DADD DR0,DR8,DR0 \ 00009F 76 90 A0 A3 DADD DR3,DR10,DR10 \ 0000A3 76 90 90 00 DADD DR0,DR9,DR0 \ 0000A7 F9 03 C3 00 DMOV.D #0x40260000,DRH12 \ 00 26 40 \ 0000AE 76 90 A0 00 DADD DR0,DR10,DR0 \ 0000B2 76 90 C0 C3 DADD DR3,DR12,DR12 \ 0000B6 76 90 B0 00 DADD DR0,DR11,DR0 \ 0000BA F9 03 E3 00 DMOV.D #0x402a0000,DRH14 \ 00 2A 40 \ 0000C1 76 90 C0 00 DADD DR0,DR12,DR0 \ 0000C5 76 90 E0 E3 DADD DR3,DR14,DR14 \ 0000C9 76 90 D0 00 DADD DR0,DR13,DR0 \ 0000CD F9 03 13 00 DMOV.D #0x402e0000,DRH1 \ 00 2E 40 \ 0000D4 76 90 E0 00 DADD DR0,DR14,DR0 \ 0000D8 76 90 10 33 DADD DR3,DR1,DR3 \ 0000DC 76 90 F0 00 DADD DR0,DR15,DR0 \ 0000E0 76 90 30 00 DADD DR0,DR3,DR0 \ 0000E4 76 90 20 00 DADD DR0,DR2,DR0 \ 0000E8 FC 79 18 06 DMOV.D DR0,0x18[R1] \ 00 …略… \ 000198 75 B8 0F DPOPM.D DR0,DR15 \ 00019B 02 RTS
# Command line =# ..\src\RXv3_Check_FSQRT_DSQRT_etc.c -o# src\RXv3_Check_FSQRT_DSQRT_etc.o --no_wrap_diagnostics# --require_prototypes -e --align_func=1 --tfu=none -Ohs# --no_size_constraints --no_cross_call --debug -lC ./ …略(-I)…# --remarks --source_encoding utf8 --utf8_text_in --text_out utf8# --save_acc --endian l --core rxv3 --fpu=*** --data_model=f --double=***# --int=32 --dlib_config C:/Renesas/EWB/8.4/rx/LIB/dlrxdlln.h
GNURXでのリストファイル
4 .section .text.Check_DPUSHM_DPOPM,"ax",@progbits 6 _Check_DPUSHM_DPOPM: 10 0000 75 B0 0F dpushm.d dr0-dr15 15 0003 FB 52 00 00 00 00 mov.L #_d1, r5 16 0009 FC C8 58 50 dmov.D [r5], dr5 17 000d FB 52 00 00 00 00 mov.L #_d2, r5 18 0013 FC C8 58 00 dmov.D [r5], dr0 20 0017 76 90 51 30 dsub dr0, dr5, dr3 22 001b 76 90 00 55 dadd dr5, dr0, dr5 24 001f F9 03 13 00 00 08 40 dmov.D #0x40080000, drh1 25 0026 76 90 10 15 dadd dr5, dr1, dr1 29 002a F9 03 63 00 00 10 40 dmov.D #0x40100000, drh6 30 0031 76 90 60 63 dadd dr3, dr6, dr6 34 0035 F9 03 F3 00 00 14 40 dmov.D #0x40140000, drh15 35 003c 76 90 F0 F5 dadd dr5, dr15, dr15 39 0040 76 90 62 41 dmul dr1, dr6, dr4 41 0044 76 90 11 06 dsub dr6, dr1, dr0 43 0048 F9 03 E3 00 00 18 40 dmov.D #0x40180000, drh14 44 004f 76 90 E0 E3 dadd dr3, dr14, dr14 48 0053 76 90 F2 44 dmul dr4, dr15, dr4 50 0057 76 90 01 0F dsub dr15, dr0, dr0 …略… 135 0103 F9 03 F3 00 00 2E 40 dmov.D #0x402e0000, drh15 138 010a 76 90 F0 55 dadd dr5, dr15, dr5 142 010e 76 90 62 44 dmul dr4, dr6, dr4 144 0112 76 90 01 06 dsub dr6, dr0, dr0 146 0116 76 90 25 2E ddiv dr14, dr2, dr2 148 011a 76 90 E0 11 dadd dr1, dr14, dr1 150 011e F9 03 E3 00 00 30 40 dmov.D #0x40300000, drh14 153 0125 76 90 E0 33 dadd dr3, dr14, dr3 157 0129 76 90 52 44 dmul dr4, dr5, dr4 159 012d 76 90 01 05 dsub dr5, dr0, dr0 161 0131 76 90 25 2D ddiv dr13, dr2, dr2 163 0135 76 90 D0 11 dadd dr1, dr13, dr1 165 0139 76 90 32 44 dmul dr4, dr3, dr4 167 013d 76 90 01 03 dsub dr3, dr0, dr0 169 0141 76 90 C0 11 dadd dr1, dr12, dr1 171 0145 76 90 25 2C ddiv dr12, dr2, dr2 173 0149 76 90 25 2B ddiv dr11, dr2, dr2 175 014d 76 90 B0 11 dadd dr1, dr11, dr1 177 0151 76 90 A0 11 dadd dr1, dr10, dr1 179 0155 76 90 25 2A ddiv dr10, dr2, dr2 181 0159 76 90 90 11 dadd dr1, dr9, dr1 183 015d 76 90 25 29 ddiv dr9, dr2, dr2 185 0161 76 90 80 11 dadd dr1, dr8, dr1 187 0165 76 90 25 28 ddiv dr8, dr2, dr2 189 0169 76 90 70 11 dadd dr1, dr7, dr1 191 016d 76 90 25 27 ddiv dr7, dr2, dr2 193 0171 76 90 60 11 dadd dr1, dr6, dr1 195 0175 76 90 25 26 ddiv dr6, dr2, dr2 197 0179 76 90 50 11 dadd dr1, dr5, dr1 199 017d 76 90 25 25 ddiv dr5, dr2, dr2 201 0181 76 90 30 11 dadd dr1, dr3, dr1 203 0185 76 90 25 23 ddiv dr3, dr2, dr2 205 0189 FB 52 00 00 00 00 mov.L #_dA, r5 208 018f FC 78 58 10 dmov.D dr1, [r5] 211 0193 FB 52 00 00 00 00 mov.L #_dB, r5 212 0199 FC 78 58 40 dmov.D dr4, [r5] 215 019d FB 52 00 00 00 00 mov.L #_dC, r5 216 01a3 FC 78 58 00 dmov.D dr0, [r5] 219 01a7 FB 52 00 00 00 00 mov.L #_dD, r5 220 01ad FC 78 58 20 dmov.D dr2, [r5] 222 01b1 75 B8 0F dpopm.d dr0-dr15 225 01b4 02 rts