This is the mail archive of the crossgcc@sourceware.cygnus.com mailing list for the crossgcc project.
See the CrossGCC FAQ for lots more infromation.
Index Nav: | [Date Index] [Subject Index] [Author Index] [Thread Index] | |
---|---|---|
Message Nav: | [Date Prev] [Date Next] | [Thread Prev] [Thread Next] |
>Ian Lance Taylor wrote: >> >> Date: Tue, 14 Dec 1999 20:58:16 -0800 >> From: Peter Popov <ppopov@redcreek.com> >> >> I'm using a powerpc-eabi compiler which I built from >> gcc-2.92.2 and binutils-2.9.1. The assembler chokes on >> instructions like this one: >> >> li r5, 0xfffe >> >> initads.s:194: Error: operand out of range (65534 not between -32768 and 32767) >> >> It complains that the operand is out of range, when in fact, >> if should just translate the 0xfffe t0 -2. Does anyone know if >> this is an assembler bug, or is it a feature? >> >> It's a feature. You're asking the assembler to load 0xfffe into r5. >> That can't be done in one li instruction. You can load 0xfffffffe, >> but you can't load 0x0000fffe. The instruction "li r5,0xfffe" should, in fact, load 0xfffffffe in register r5, not 0x0000fffe. The syntax is "li r5,SIMM"; the signed bit is extended so you should end up with 0xfffffffe in r5. >> Did gcc generate that instruction? >No, it's in an assembly file I got from Motorola's web site. >The file was assembled with the Diab Data assembler; I tried that >and it worked (the Diab Data assembler generates : "li r5,-2" >from the "li r5, 0xfffe"), which is why I thought it was a bug. After some further analysis, I'm pretty convinced this is a gnu assembler bug, or a really bad limitation. The instruction "li rD, value" is just a simplified mnemonic, equivalent to "addi rD,0,value". The "addi" instruction, in turn, is defined as: "addi rD,rA,SIMM", where SIMM is a 16 bit signed integer. Thus, "addi r5,0,0xfffe" should be a perfectly legal instruction, and equivalent to "addi r5,0,-2". The gnu assembler accepts the latter, but not the former. The Diab Data assembler, on the other hand, accepts both formats and generates the same code. If choking on "li r5,0xfffe" is truly a feature, how would you load 0xfffffffe in a register in one single instruction? Doing so (loading 0xfffffffe in a register in one instruction) is definitely possible, but not as long as the assembler doesn't accept 0xfffe as the equivalent of "-2". It forces you to manually convert negative numbers to decimal, which just doesn't make any sense. Anyone else agree this is a bad feature or a bug? Pete ------ Want more information? See the CrossGCC FAQ, http://www.objsw.com/CrossGCC/ Want to unsubscribe? Send a note to crossgcc-unsubscribe@sourceware.cygnus.com
Index Nav: | [Date Index] [Subject Index] [Author Index] [Thread Index] | |
---|---|---|
Message Nav: | [Date Prev] [Date Next] | [Thread Prev] [Thread Next] |