[MPlayer-cvslog] r29352 - trunk/libmpcodecs/vf_fspp.c

David Conrad umovimus at gmail.com
Mon Jun 22 05:20:38 CEST 2009


On Jun 18, 2009, at 12:18 PM, Reimar Döffinger wrote:

> On Sun, Jun 07, 2009 at 08:02:23PM -0400, David Conrad wrote:
>> On Jun 7, 2009, at 10:53 AM, Reimar Döffinger wrote:
>>> On Sun, Jun 07, 2009 at 05:48:53PM +0300, Uoti Urpala wrote:
>>>> On Sun, 2009-06-07 at 16:42 +0200, gpoirier wrote:
>>>>> replace "g" asm constraint by "erm" since "g" allows 64bit
>>>>> immediates while
>>>>> the operator (cmp) using the "g"-constrained operand doesn't
>>>>> support 64bit
>>>>> immediates.
>>>>
>>>>> -	: "m" (width), "m" (src_stride), "g" (od), "m" (dst_stride), "g"
>>>>> (end),
>>>>> +	: "m" (width), "m" (src_stride), "erm" (od), "m" (dst_stride),
>>>>> "erm" (end),
>>>>
>>>> Only "end" is used with cmp, not "od".
>>>
>>> As I understood it (in which case the commit message is wrong),  
>>> Apple
>>> gcc just does not allow "g" for 64 bit variables/values.
>>
>> The opposite - "g" works fine for 64 bit variables/values/immediates,
>> but cmp doesn't support a 64-bit immediate (Intel's manual says cmp  
>> r/
>> m64, imm32 at best.)
>>
>> Apple's gcc happens to choose to use an immediate; I'm guessing  
>> that FSF
>> gcc chooses to use a register instead (both of which are valid for  
>> "g")
>
> Well, I'll have to look at the report again, but it seemed to me  
> that the error
> was from the C compiler, not the assembler, which IMO invalidates  
> this explanation
> and is the reason why I concluded the compiler stupidly does "g" +  
> 64 bit pointer = error

I just tried it and got

gcc-4.2 -arch x86_64 -Wundef -Wdisabled-optimization -Wno-pointer-sign  
-Wdeclaration-after-statement -std=gnu99 -Wall -Wno-switch -Wpointer- 
arith -Wredundant-decls -O4 -march=core2 -mtune=core2 -pipe -ffast- 
math -fomit-frame-pointer -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64 - 
D_LARGEFILE64_SOURCE -Ilibdvdread4 -mdynamic-no-pic -falign-loops=16 - 
shared-libgcc -I.  -I/opt/local/include  -I/usr/X11/include -I/opt/ 
local/include  -c -o libmpcodecs/vf_fspp.o libmpcodecs/vf_fspp.c
{standard input}:8441:32-bit absolute addressing is not supported for  
x86-64
/usr/libexec/gcc/i686-apple-darwin9/4.2.1/as: fatal error in /usr/ 
bin/../libexec/gcc/darwin/x86_64/as
make: *** [libmpcodecs/vf_fspp.o] Error 1

as the error fixed.

>> Also it seems like this won't work if dither is given an address > 32
>> bits since REG_d is rdx; and changing it to edx wouldn't work if gcc
>> chose to use "r" or "m" (since I think those would be implied to be  
>> 64
>> bit.)
>
> Huh? If dither is given and address > 32 bit the address of "end"  
> obviously
> isn't a 32 bit constant, so where is the issue supposed to be?

Past experience leads me to assume gcc is extremely dumb when it comes  
to inline asm, so I thought gcc would happily truncate > 32 bits if it  
chose to use "e". But a quick test indicates that gcc will complain  
about impossible constraints if you force a 64-bit constant in "e".


More information about the MPlayer-cvslog mailing list