Hi, guys we aim to self make a FPU which has its own instruction set. For easy programming, we prefer c language to assembly code. here's one of our instruction: c language format: Bload(vd, value1, value2), we make it like a funciton. vd is a special register. binary format: 31-26 opcode, 25-21 index of vd register, 20-16 opcode, 15-11 index of the general register which keeps value1, 10-5 opcode, 4-0 index of the general register which keeps value2. we use gcc-inline-assembly to convert it to binary code. here's the solution: #define Bload(vd, value1, value2) \ __asm__( \ "add r16, r0, %0 \n\t" \ "add r14, r0, %1 \n\t" \ ".long %2 \n\t" \ : \ : "r"(value2), "r"(value1), "i"((0x3b<<26)+(vd<<21)+(14<<11)+(0x2c<<5)+16) \ : "r14", "r16"); i fix the general registers(r14, r16) which keep value1 and value2. then i make the binary code use "i" in inline-assembly. But disadvantage is in evidence: gcc does not understand my instruction, so i can not take it's advantage, such as selecting the most suitable general register and eliminating unnecessary copy from register to register. what i want is deleting the first two add instruction, let gcc select register for me and tell me which register it selected. so i can make my own binary code using .long instruction. But i do not want to modify the gcc compiler to let it understand my instruction. Thank you for your help
jie zhou wrote: > what i want is deleting the first two add instruction, let gcc select > register for me and tell me which register it selected. so i can make my > own binary code using .long instruction. But i do not want to modify the > gcc compiler to let it understand my instruction. There are several approaches: (A) You don't need to change GCC. It's sufficient to teach binutils the new instructions/instruction formats with the additinal benefit that you will see the new instructions in disassembly. (B) Drag the arithmetic from C-level to (inline) assembly. You will need an output modifier to print a GPR as it's number. If your GCC port does not have it yet: add it. It's TARGET_PRINT_OPERAND hook in your ./gcc/config/target/target.c, see GCC's internals documentation.
Johann L. thank you very much for your help > You don't need to change GCC. It's sufficient to teach binutils the > new instructions/instruction formats with the additinal benefit that > you will see the new instructions in disassembly. i prefer to teaching gnu binutils the new instructions. in fact, i use microblaze gnu tools to compile my code. but how to teach gnu binutils? can you say some details?
You can find a draft at http://sourceware.org/binutils/binutils-porting-guide.txt Look at your backend and other ports to learn more.
Please log in before posting. Registration is free and takes only a minute.
Existing account
Do you have a Google/GoogleMail account? No registration required!
Log in with Google account
Log in with Google account
No account? Register here.