I don't think PCALIGN is supported for x86. The assembler can parse the 
instruction, but the x86 assembler backend can't generate machine code for 
it.
Wouldn't be hard to add, I think. There's already disabled experimental 
code in there for aligning loops.

On Friday, February 25, 2022 at 1:25:32 AM UTC-8 Wojciech Muła wrote:

> Thanks! Didn't know that the assembler is able to do this. TBH, for me, 
> it's not desired behaviour when an assembler program does something extra 
> to a low-level code. I have already observed that Go asm strips a series of 
> NOPs, which is highly unexpected.
>
> A directive for alignment is way clearer. Not to mention that sometimes we 
> don't need to align jump targets.
>
> w.
> On Friday, February 25, 2022 at 9:35:10 AM UTC+1 Brian Candler wrote:
>
>> It seems to me that there is automatic alignment for loops:
>>
>> https://github.com/golang/go/blob/go1.17.7/src/cmd/internal/obj/x86/asm6.go#L51-L67
>>
>>
>> On Friday, 25 February 2022 at 06:42:23 UTC Wojciech Muła wrote:
>>
>>> The directive is not documented on 
>>> https://pkg.go.dev/cmd/internal/obj/x86. `grep -l -R PCALIGN *` run in 
>>> `cmd/interal/obj` shows for the freshest master:
>>>
>>> arm64/doc.go
>>> arm64/asm7.go
>>> arm64/asm_arm64_test.go
>>> link.go
>>> ppc64/doc.go
>>> ppc64/asm9.go
>>> ppc64/asm_test.go
>>> util.go
>>>
>>> Seems it's not implemented. When tried to use it, I got the following 
>>> error:
>>>
>>> # main
>>> asm: asmins: missing op 00000 (<unknown line number>)        PCALIGN     
>>>    $16
>>> asm: assembly failed
>>>
>>> Sample asm code to check this:
>>>
>>> ---asmfun_amd64.s---
>>> #include "textflag.h"
>>>
>>> TEXT ·asmfun(SB), NOSPLIT, $0
>>>     PCALIGN $16
>>>     RET
>>> ---eof---
>>>
>>> ---main.go---
>>> package main
>>>
>>> // go:noescape
>>> func asmfun()
>>> func main() { asmfun() }
>>> ---eof---
>>>
>>> w.
>>>
>>> On Friday, February 25, 2022 at 2:21:41 AM UTC+1 Ian Lance Taylor wrote:
>>>
>>>> On Thu, Feb 24, 2022 at 9:40 AM Wojciech Muła <[email protected]> 
>>>> wrote: 
>>>> > 
>>>> > I'm writing an implementation in x86 assembler and I need to force a 
>>>> certain alignment of blocks of code (as it affects performance). I found 
>>>> that there's PCALIGN directive, but it's only available for the PPC 
>>>> architecture. It does not work for x86. 
>>>> > 
>>>> > Is there any easy way to achieve this for x86? If I had one loop, it 
>>>> won't be a problem --- I'd just put a few `BYTE $0x90` and move on. The 
>>>> problem is my code is huge, partially autogenerated with few variants. 
>>>> > 
>>>> > Any hints? 
>>>>
>>>> As far as I can tell PCALIGN is implemented for all architectures. 
>>>>
>>>> Ian 
>>>>
>>>

-- 
You received this message because you are subscribed to the Google Groups 
"golang-nuts" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To view this discussion on the web visit 
https://groups.google.com/d/msgid/golang-nuts/dde3fc30-270e-4437-ab19-4307da0f79d3n%40googlegroups.com.

Reply via email to