After being super busy at work for the last few months, I finally got some time to work on TI stuff again. I was in the middle of something earlier, but heck if I can remember what that was.
One of the people on AtariAge wanted to know if a FAT library would compile OK for the TI. Sounds like a good question, let's find out.
The first pass failed due to missing the libc headers for TI. For now, I'm using the i386 headers. As long as I don't try to link anything, it should be fine.
The second pass failed too, there is an invalid instruction being generated. This was super tedious to track down.
inv r2
neg >4 * invalid, only registers my be used
inc r2
(insn 418 417 784 fat_access.c:167 (set (reg:SI 2 r2 [230])
(neg:SI (reg:SI 2 r2 [230]))) 68 {negsi2} (nil))
Once the instruction was isolated, the problem was obvious. I was overrunning an RTX array in the NEGSI2 instruction and the junk found there showed up in the final output. By using a properly-sized array for this instruction, all is well.
total:
[Nr] Name Type Size(Hex) Size(Dec)
[ 1] .text PROGBITS 00005462 = 21602
[ 3] .data PROGBITS 00000030 = 48
[ 4] .bss NOBITS 00000CCA = 3274
Of course, this is missing a lot of other stuff:
puts
printf
__udivsi3
strncpy
strncmp
memcpy
memset
So, yes, this library is compilable for the TI, but needs about 24KB for everything. Probably impractical.
I've seen this a few places in the output. It would be easy to optimize this, but this may be a rarely-used pattern, and not worth special attention.
mov r2, *r1
mov r2, @>2(r1)
This could better be written as:
mov r2, *r1+
mov r2, *r1
As an unrelated note, I thought for a minute that using the X instruction might be useful for the function prologue and epilogue, since we're iterating though registers. Unfortunately, it's not. At most, there are four instructions for either 'logue, and a lot more would be required if X were used. Never mind.
Subscribe to:
Post Comments (Atom)
No comments:
Post a Comment