On Sun, 21 Sep 2014, Renato Golin wrote:> On 20 September 2014 15:19, Mikulas Patocka > <mikulas at artax.karlin.mff.cuni.cz> wrote: > > The problem is this - you either compile this program with > > -mcpu=cortex-a9, then clang reports error on the sdiv instruction because > > cortex a9 doesn't have sdiv. Or - you compile the program with > > -mcpu=cortex-a15, then clang compiles it, but it uses full cortex-a15 > > instruction set and the program crashes on cortex a9 and earlier cores. > > LLVM always validates inline assembly. This may be too restrictive but > it has been for a while and there isn't yet a good incentive to turn > that off, even with a flag. This may change in the future for some > cases, but your case is not one of them.What's the purpose of rejecting "sdiv" and other instructions? I understand that some times ago ARM was used mainly for embedded systems and there was no need to write ARM applications portable to different cores - so rejecting instructions for different cores didn't do any harm. But today it definitelly makes sense to write portable ARM applications that run on different cores.> The problem is that there isn't currently a way to pass flags to the > integrated assembler as of now (I'm working on it).gas unlocks all instructions if these directives are used ".cpu cortex-a15\n .fpu neon-vfpv4". LLVM integrated assembler will choke on it and produce invalid object file. You can try: int main(void) { asm volatile (".cpu cortex-a15\n .fpu neon-vfpv4\n"); return 0; } /usr/bin/ld: Warning: /tmp/as-b084f5.o: Unknown EABI object attribute 488 /usr/bin/ld: /tmp/as-b084f5.o: Unknown mandatory EABI object attribute 8890 /usr/bin/ld: failed to merge target specific data of file /tmp/as-b084f5.o Maybe, all you need to do is fix handling of these directives in the integrated assembler.> When that starts > to work, you will be able to just pass "-mcpu=cortex-a9 > -Wa,-mcpu=cortex-a15" and it'll do what you want. That should work on > GCC, too. > > Right now, -Wa only works with an external assembler. > > > > Even if I use -no-integrated-as (as suggested in bug 18864), clang still > > examines the string in "asm" statement and reports an error. GCC doesn't > > examine the string in "asm" and works. > > Have you tried passing -Wa,-mcpu=cortex-a15 together with -no-integrated-as?I have tried it and it doesn't work (clang 3.5 in Ubuntu Trusty on ARM). With -no-integrated-as, clang uses the system assembler, but it parses the asm string nonetheless and reports an error on sdiv instruction. Mikulas> cheers, > --renato >
On 22 September 2014 15:48, Mikulas Patocka <mikulas at artax.karlin.mff.cuni.cz> wrote:> What's the purpose of rejecting "sdiv" and other instructions?Warning the user that some of the options are not consistent. Handling the .cpu in inline assembly is not always a good thing (https://sourceware.org/ml/binutils/2014-08/msg00119.html) and a compile-time warning system should be used. It's not because GAS does it that it's right.> I have tried it and it doesn't work (clang 3.5 in Ubuntu Trusty on ARM). > With -no-integrated-as, clang uses the system assembler, but it parses the > asm string nonetheless and reports an error on sdiv instruction.Ubuntu 3.5 is not the same as LLVM 3.5, unfortunately. I've discussed this with Debian packagers and we'll have to fix this there. It's not because the (x86) host assembler doesn't "recognize" the (arm) target's instruction that we should just allow any instruction in inline asm. This has been discussed on both LLVM and GCC lists extensively and the LLVM position is that inline assembly validation is a good thing. In this case, you're not being kosher and the assembler is complaining, which is good and I don't think we should change that. cheers, --renato
On Mon, 22 Sep 2014, Renato Golin wrote:> On 22 September 2014 15:48, Mikulas Patocka > <mikulas at artax.karlin.mff.cuni.cz> wrote: > > What's the purpose of rejecting "sdiv" and other instructions? > > Warning the user that some of the options are not consistent. Handling > the .cpu in inline assembly is not always a good thing > (https://sourceware.org/ml/binutils/2014-08/msg00119.html) and a > compile-time warning system should be used. It's not because GAS does > it that it's right. > > > > I have tried it and it doesn't work (clang 3.5 in Ubuntu Trusty on ARM). > > With -no-integrated-as, clang uses the system assembler, but it parses the > > asm string nonetheless and reports an error on sdiv instruction. > > Ubuntu 3.5 is not the same as LLVM 3.5, unfortunately. I've discussed > this with Debian packagers and we'll have to fix this there. > > It's not because the (x86) host assembler doesn't "recognize" the (arm) > target's instruction that we should just allow any instruction in inline > asm. This has been discussed on both LLVM and GCC lists extensively and > the LLVM position is that inline assembly validation is a good thing.Why is it good? Read the thread that you referenced above (and bug http://llvm.org/bugs/show_bug.cgi?id=20447 that is referenced in that thread) and you'll see that other people have the same problems as me. They can't write NEON-optimized piece of assembler because the assembler rejects it. All these problems would go away if the assembler didn't limit the instruction set - then we wouldn't have to use hacks with .cpu and .fpu.> In this case, you're not being kosher and the > assembler is complaining, which is good and I don't think we should > change that.So, I ask again - how can I use the sdiv instruction on ARM cores that support it and yet make the program work on ARM cores that don't have sdiv? If you think that the program that I posted at the beginning of this thread is wrong - please say how to do it correctly.> cheers, > --renatoMikulas
On Mon, 22 Sep 2014, Renato Golin wrote:> On 22 September 2014 15:48, Mikulas Patocka > <mikulas at artax.karlin.mff.cuni.cz> wrote: > > What's the purpose of rejecting "sdiv" and other instructions? > > Warning the user that some of the options are not consistent. Handling > the .cpu in inline assembly is not always a good thing > (https://sourceware.org/ml/binutils/2014-08/msg00119.html) and a > compile-time warning system should be used. It's not because GAS does > it that it's right. > > > > I have tried it and it doesn't work (clang 3.5 in Ubuntu Trusty on ARM). > > With -no-integrated-as, clang uses the system assembler, but it parses the > > asm string nonetheless and reports an error on sdiv instruction. > > Ubuntu 3.5 is not the same as LLVM 3.5, unfortunately. I've discussed > this with Debian packagers and we'll have to fix this there.I downloaded pre-compiled llvm/clang 3.5 from the llvm.org website. Unlike the ubuntu clang, it doesn't attempt to parse the content of the asm statement when -no-integrated-as is used, so that trick with asm (".cpu cortex-a15 \n sdiv %0, %1, %2"...) works. Using "-Wa,-mcpu=cortex-a15" doesn't work, clang puts ".cpu cortex-a8" to on third line of the assembler file and that reverts cpu=cortex-a15 set at the command line. Setting ".cpu" in the assembler statement is hacky - I'd still like to know how to generate the sdiv instruction properly. Mikulas