Page 1 of 1
ASM syntax error
Posted: Sun May 23, 2021 3:22 pm
by Lord
Hi!
For a long time I used PurePDF in a larger program without troubles.
viewtopic.php?f=14&t=17247&p=362157
I could always successfully compile with both versions (x86 and x64).
Today I tried PB 6.00 Alpha 1 (x64) and it failed.
This procedure raises a syntax error with both compilers (asm and c):
Code: Select all
;Thanks to Rescator / skywalk / wilbert for the Procedures EndianW() / EndianL() / EndianQ()
Procedure.l ipdf_EndianL(value.l)
; Rescator : http://forums.purebasic.com/english/viewtopic.php?p=84270#p84270
EnableASM
MOV Eax, value; <-- this line raises the syntax error
BSWAP Eax
DisableASM
ProcedureReturn
EndProcedure
What's wrong now with this code?
As the syntax error comes up with both new backends, I post it here
and not in "Bugs - C backend"
As I said, it worked with PB5.73LTS(x64) and PB5.73LTS(x86).
Re: ASM syntax error
Posted: Sun May 23, 2021 4:08 pm
by Lord
Sorry, but I have to correct myself.
I tested again and now I get as a result that only the C backend failes.
Can a moderator please move this posting in "Bugs - C backend"?
Tank you.
Re: ASM syntax error
Posted: Mon May 24, 2021 9:26 am
by DoubleDutch
It's not a C backend bug, it just needs updating with either a C version or a regular PB version.
Re: ASM syntax error
Posted: Mon May 24, 2021 10:05 am
by DoubleDutch
Code: Select all
CompilerIf #PB_Compiler_Processor=#PB_Processor_C ; CompilerIf #PB_Compiler_Backend=#PB_Processor_C
Procedure.l ipdf_EndianL(value.l)
ProcedureReturn (value>>24&$ff)|(value>>8&$ff00)|(value<<24&$ff000000)|(value<<8&$ff0000)
EndProcedure
Procedure.q ipdf_EndianQ(value.q)
ProcedureReturn (value>>56&$ff)|(value>>40&$ff00)|(value>>24&$ff0000)|(value>>8&$ff000000)|(value<<56&$ff00000000000000)|(value<<40&$ff000000000000)|(value<<24&$ff0000000000)|(value<<8&$ff00000000)
EndProcedure
Procedure.w ipdf_EndianW(value.w)
ProcedureReturn (value>>8&$ff)|(value<<8&$ff00)
EndProcedure
CompilerElse
;Thanks to Rescator / skywalk / wilbert for the Procedures EndianW() / EndianL() / EndianQ()
Procedure.l ipdf_EndianL(value.l)
; Rescator : http://forums.purebasic.com/english/viewtopic.php?p=84270&sid=7f3f06eae02ad44b303655fb722bb0f0#p84270
EnableASM
MOV Eax,value
BSWAP Eax
DisableASM
ProcedureReturn
EndProcedure
CompilerIf #PB_Compiler_Processor=#PB_Processor_x64
Procedure.q ipdf_EndianQ(value.q)
; Rescator : http://www.purebasic.fr/english/viewtopic.php?p=84270#p84270
EnableASM
MOV rax, value
BSWAP rax
DisableASM
ProcedureReturn
EndProcedure
CompilerElse
Procedure.q ipdf_EndianQ(value.q)
; Wilbert : http://www.purebasic.fr/english/viewtopic.php?p=361932#p361932
Protected addr.l=@value
EnableASM
MOV edx, addr
MOV eax, [edx + 4]
MOV edx, [edx]
BSWAP eax
BSWAP edx
DisableASM
ProcedureReturn
EndProcedure
CompilerEndIf
Procedure.w ipdf_EndianW(value.w)
; skywalk/wilbert : http://forums.purebasic.com/english/viewtopic.php?p=352259&sid=7f3f06eae02ad44b303655fb722bb0f0#p352259
EnableASM
ROL value, 8
DisableASM
ProcedureReturn value
EndProcedure
CompilerEndIf
Re: ASM syntax error
Posted: Mon May 24, 2021 10:53 am
by Lord
Hi DoubleDutch!
Thank you for offering a solution.
But there is still a problem with (some) assembler part(s) in my program.
---------------------------
PureBasic - Assembler error
---------------------------
purebasic.c: In function 'f_decodekekule':
purebasic.c:40010:2: error: unknown type name 'MOV'
MOV rdx, [p.p_K]; rdx -> *K
^~~
purebasic.c:40010:11: error: expected identifier or '(' before '[' token
MOV rdx, [p.p_K]; rdx -> *K
^
...
^
---------------------------
OK
---------------------------
This time the error is raised by this procedure:
Code: Select all
Procedure DecodeKekule(*K.K)
! MOV rdx, [p.p_K]; rdx -> *K
! MOV rax, [rdx]; -> K=Kekule
! cmp rax, 2
! jl _G1
! BSR rcx, rax
! BTR rax, rcx
! ADD rcx, 1
! MOV [rdx + 8], rcx; -> G=Generation
! MOV [rdx + 16], rax; -> P=Position
! AND rax, 1
! MOV [rdx + 24], rax; -> X=Gender
! mov rax, 1
! jmp _return
!_G1:
! cmp rax, 1
! jne _G0
! MOV qword[rdx + 8], 1; -> G=1
! MOV qword[rdx + 16], 0; -> P=0
! MOV qword[rdx + 24], -1; -> X invalid
! mov rax, 1
! jmp _return
!_G0:
! MOV qword[rdx + 8], -1; -> G invalid
! MOV qword[rdx + 16], -1; -> P invalid
! MOV qword[rdx + 24], -1; -> X invalid
! mov rax, -1
!_return:
ProcedureReturn
EndProcedure
Are assembler instructions not allowed anymore with the new C backend?
Is there another notation neccessary to use assembler with the C Backend?
Re: ASM syntax error
Posted: Mon May 24, 2021 11:13 am
by DoubleDutch
Basically, what you need to do is study what that procedure did and re-write it in purebasic, not assembler.
Re: ASM syntax error
Posted: Mon May 24, 2021 11:38 am
by mk-soft
Wait for the compiler option "EnableC DisableC".
Then it will also run later on other processors (ARM, M1).
Re: ASM syntax error
Posted: Mon May 24, 2021 11:43 am
by Lord
Hi DoubleDutch!
DoubleDutch wrote: Mon May 24, 2021 11:13 am
Basically, what you need to do is study what that procedure did and re-write it in purebasic, not assembler.
Thank you for your answer.
But this doesn't answer my two questions and is not the needed solution.
It is also not helping me in understanding the underlying problem.
DecodeKekule() is used to get the generation, the position within this generation
and the gender of a person with a specific Kekule number.
This number enters the procedure in K\Kekule
The used structure for K is:
Code: Select all
Structure K
Kekule.i
Generation.i
Person.i
Gender.i
EndStructure
Define K.K
A rewrite in PB-Syntax is counter productive as I had this before and
went to asm for faster execution.
Re: ASM syntax error
Posted: Mon May 24, 2021 11:44 am
by Lord
Hi mk-soft!
mk-soft wrote: Mon May 24, 2021 11:38 am
Wait for the compiler option "EnableC DisableC".
Then it will also run later on other processors (ARM, M1).
You don't also have any idea when this will be available?
Re: ASM syntax error
Posted: Mon May 24, 2021 12:57 pm
by mk-soft
The development is still alpha status ...
Fred has released the alpha version for Windows early so that we can support him with the debugging.
Re: ASM syntax error
Posted: Mon May 24, 2021 1:00 pm
by DoubleDutch
Under the new version, it could also be that the code runs faster as the c compiler may be better at optimising the code.
Re: ASM syntax error
Posted: Mon May 24, 2021 3:23 pm
by Lord
@mk-soft
Thank you for your answer.
@DoubleDutch
Does that mean, that if I select "C Backend" it's still asm output?
Until now I didn't get any speed increase.
No matter if "optimize generated code" is selected or not.
Re: ASM syntax error
Posted: Mon May 24, 2021 3:38 pm
by DoubleDutch
The eventual output will be assembler, but via the C compiler. The C compiler may have had more time invested in optimising the output than regular PureBasic - so it could be faster.
Re: ASM syntax error
Posted: Mon May 24, 2021 3:48 pm
by Lord
I can't see any speed increase.
It's not faster or slower compiling nor running the exe.
The only difference that i see is, that the C backend produces
a little smaller executable.
But the program for testing has only ~20000 lines.