for(int i=0; i<1000; ++i) {
my_global_array = (unsigned int)rand();
}
for(int i=0; i<2; ++i) {
unlock_wdtcon();
// Setup tag1 of bufcon0 for cpu0
MODULE_LMU.BUFCON[0].B.TAG1 = 0b000000;
MODULE_LMU.BUFCON[0].B.EN1 = i%2;
// Make sure all others are disabled
MODULE_LMU.BUFCON[0].B.EN2 = 0;
MODULE_LMU.BUFCON[1].B.EN1 = 0;
MODULE_LMU.BUFCON[1].B.EN2 = 0;
MODULE_LMU.BUFCON[2].B.EN1 = 0;
MODULE_LMU.BUFCON[2].B.EN2 = 0;
lock_wdtcon();
__mtcr(CPU_CCTRL, 0); // stop PMC counters
__mtcr(CPU_CCNT, 0); // clear CCNT
__mtcr(CPU_CCTRL, 2); // start PMC counters
for(int i=0; i<1000; i++) {
a = my_global_array;
//a = (int)(*(unsigned int *)(0xb0000000 + i*4));
}
__mtcr(CPU_CCTRL, 0); // stop PMC counters
ccnt_res = __mfcr(CPU_CCNT);
}
gain_by_readbuf = (int)ccnt_res[0]-ccnt_res[1];
asm volatile ( "debug \t\n"::);
.L21:
movh.a a15,#@his(my_global_array)
lea a15,[a15]@los(my_global_array)
.L35:
lea a12,999
.L2:
call rand
.L36:
st.w [a15+],d2
loop a12,.L2
139:../src/shared_main.c **** for(int i=0; i<1000; ++i) {
179 .loc 1 140 0
180 00c0 820F mov %d15,0
181 00c2 59EFF8FF st.w [%a14]-8,%d15
182 00c6 3C14 j .L11
183 .L12:
184 .Lcontrol_flow_BBE13:
185 .Lcontrol_flow_BBB15:
140:../src/shared_main.c **** my_global_array = (unsigned int)rand();
186 .loc 1 141 0 discriminator 3
187 00c8 6D000000 call rand
**** Notice:Expanding call-R -> call-O
188 00cc 022F mov %d15,%d2
189 00ce 02F2 mov %d2,%d15
190 00d0 7B0000F0 movh %d15,hi:my_global_array
191 00d4 1B0F0030 addi %d3,%d15,lo:my_global_array
192 00d8 19EFF8FF ld.w %d15,[%a14]-8
193 00dc 062F sh %d15,2
194 00de 423F add %d15,%d3
195 00e0 60F2 mov.a %a2,%d15
196 00e2 7422 st.w [%a2]0,%d2
**** Notice:Optimizing st.w-@wd -> st.w-@d
140:../src/shared_main.c **** my_global_array = (unsigned int)rand();
197 .loc 1 140 0 discriminator 3
198 00e4 19EFF8FF ld.w %d15,[%a14]-8
199 00e8 C21F add %d15,1
200 00ea 59EFF8FF st.w [%a14]-8,%d15
201 .L11:
202 .Lcontrol_flow_BBE15:
203 .Lcontrol_flow_BBB14:
140:../src/shared_main.c **** my_global_array = (unsigned int)rand();
204 .loc 1 140 0 is_stmt 0 discriminator 1
205 00ee 19EFF8FF ld.w %d15,[%a14]-8
206 00f2 3B803E20 mov %d2,1000
207 00f6 3F2FE97F jlt %d15,%d2,.L12
jjorba wrote:
Hello,
It's HighTec, --version is:
tricore-gcc (HighTec Release HDP-v4.9.3.0-infineon-1.0-fb21a99) 4.9.4 build on 2019-06-07
Settings for tricore-gcc are:
"C:\HighTec\toolchains\tricore\v4.9.3.0-infineon-1.0/bin/tricore-gcc" -c -gdwarf-2 -I/*..header folders..*/ -fno-common -O0 -g2 -fdwarf-control-flow -W -Wall -Wextra -Wdiv-by-zero -Warray-bounds -Wcast-align -Wignored-qualifiers -Wformat -Wformat-security -Wa,-ahlms=shared_main.lst -pipe -DTC29XB -D__TC29XX__ -D__TRICORE__ -D__TC161__ -DTRIBOARD_TC2X7_V1_0 -D__GNUC__=4 -fshort-double -mcpu=tc29xx -mversion-info -std=gnu99 -MMD -MP -MF"src/shared_main.d" -MT"src/shared_main.o" -o "src/shared_main.o" "../src/shared_main.c"
Omitting the -I / multiple folders.
As for the declaration of my_global_array, as well all other variables:
uint32_t my_global_array[1000];
Global, outside of all functions in same .c file for which I shared .lst / shared_main.c, no further qualifier. Same with all other variables involved.
for(int i=0; i<2; ++i) {
unlock_wdtcon();
// Setup tag1 of bufcon0 for cpu0
MODULE_LMU.BUFCON[0].B.TAG1 = 0b000000;
MODULE_LMU.BUFCON[0].B.EN1 = i%2;
// Make sure all others are disabled
MODULE_LMU.BUFCON[0].B.EN2 = 0;
MODULE_LMU.BUFCON[1].B.EN1 = 0;
MODULE_LMU.BUFCON[1].B.EN2 = 0;
MODULE_LMU.BUFCON[2].B.EN1 = 0;
MODULE_LMU.BUFCON[2].B.EN2 = 0;
lock_wdtcon();
// Load loop iterations in a3
asm volatile (
"mov %%d4,1000-1 \n\t"
"mov.a %%a3,%%d4 \n\t"
::);
uint32_t lmu_addr = 0xb0003000; // Some LMU addr / non-cached flavor
// Prepare first (LMU) address to load in %%a6
asm volatile (
"ld.w %%d4, %[l_lmu_addr] \n\t"
"mov.a %%a6, %%d4 \n\t"
:: [l_lmu_addr] "m" (lmu_addr));
// Prepare shift to add.a in every iter in %%a7, 4 byte
asm volatile (
"mov %%d4, 4 \n\t"
"mov.a %%a7, %%d4 \n\t"
::);
__mtcr(CPU_CCTRL, 0); // stop counters
__mtcr(CPU_CCNT, 0); // clear CCNT
_isync();
__mtcr(CPU_CCTRL, 2); // start counters
asm volatile (
".lmu_buff_test_loop: \n\t"
"ld.w %%d0, [%%a6] \n\t" /* LMU access */
"add.a %%a6, %%a7 \n\t" /* update address, +4 */
"loop %%a3, .lmu_buff_test_loop \n\t"
::);
__mtcr(CPU_CCTRL, 0); // stop counters
ccnt_res = __mfcr(CPU_CCNT);
}
gain_by_readbuf = (int)ccnt_res[0]-ccnt_res[1];
LMU_BUFCON0.U = 0xC0000100; // EN2=1, EN1=1, TAG2=1 (CPU0 when PSW.S=1), TAG1=0 (PSW.S=0)
LMU_BUFCON1.U = 0xC0000302; // EN2=1, EN1=1, TAG2=3 (CPU1 when PSW.S=1), TAG1=2 (PSW.S=0)
LMU_BUFCON2.U = 0xC0000504; // EN2=1, EN1=1, TAG2=5 (CPU2 when PSW.S=1), TAG1=4 (PSW.S=0)
a = (int)(*(unsigned int *)(0x90000000 + i*4));