the highlight line (line 65) will cause compile err, i want help for how to resolve this? Thank you very much!
PS: the enviroment is S32DS
Hi,
you have to use kregs instead of r.
__asm__ ("se_or %0, %1 \n\t" : "=kregs"(reg0) : "kregs"(reg1));
According to EABI standard, compiler places reg0 and reg1 to GPR8 and GPR9 register, but instruction se_or is limited to registers GPR0-GPR7 and GPR24-GPR31. This kregs tells to compiler about this limitation.
Simplest solution is to use se_bseti instead of your code.
Regards,
Martin
Thank you MArtin Kovar!
The compile err is disappeared. But i see the disassemble language, i find that it's not what i hope to(the red part)
i wander do i write wrong? If yes, what is the right way? Thank you very much!
unsigned int reg0, reg1;
/* MSR |= 0x2000 ---> This is what i hope */
__asm__("mfmsr %0 \n\t" : "=kregs"(reg0));
8: 7c e0 00 a6 mfmsr r7
c: 02 71 se_mtar r9,r7
e: 55 3f 00 08 e_stw r9,8(r31)
__asm__("e_lis %0,0x0000 \n\t" : "=kregs"(reg1));
12: 70 e0 e0 00 e_lis r7,0
16: 02 71 se_mtar r9,r7
18: 55 3f 00 0c e_stw r9,12(r31)
__asm__("e_add16i %0, %0,0x2000 \n\t" : "=kregs"(reg1));
1c: 1c e7 20 00 e_add16i r7,r7,8192
20: 02 71 se_mtar r9,r7
22: 55 3f 00 0c e_stw r9,12(r31)
__asm__("se_or %0, %1 \n\t" : "=kregs"(reg0) : "kregs"(reg1)); /* not reg0 |= reg1 ? */
26: 51 3f 00 0c e_lwz r9,12(r31)
2a: 03 17 se_mfar r7,r9
2c: 44 77 se_or r7,r7
2e: 02 71 se_mtar r9,r7
30: 55 3f 00 08 e_stw r9,8(r31)
__asm__("mtmsr %0 \n\t" : "=kregs" (reg0));
34: 7c e0 01 24 mtmsr r7
38: 02 71 se_mtar r9,r7
3a: 55 3f 00 08 e_stw r9,8(r31)
Hi,
I am afraid it is not possible to use the construction you want. I tested it also with MPC5775K (not only disassemble), but the behavior is not correct.
This following line is not compiled the way I want exactly as you mentioned in your previous post.
__asm__("se_or %0, %1 \n\t" : "=kregs"(reg0) : "kregs"(reg1)); /* not reg0 |= reg1 ? */
I tested your code without extended assembler and this works correct.
__asm__("mfmsr %r6");
__asm__("e_lis %r7,0x0000");
__asm__("e_add16i %r7,%r7,0x1000");
__asm__ ("se_or %r6, %r7");
__asm__("mtmsr %r6");
So from my point of view the best way is to use se_bseti instruction as I mentioned in my previous post, or you can invent more complex construction using extended assembler, but remember about restriction for some instructions (not all instruction could be placed to all GPR registers).
Regards,
Martin
Thank you very much!