Multiplikation von zwei Quads mod andere Quad - ASM to PB?
Verfasst: 16.03.2022 20:41
Hallo Leute,
aktuell gibt es ja so eine Art "C-Backend" Hype, daher möchte ich auch ein paar meiner Prozeduren ASM-frei machen.
In einem Programm benötige ich die Operation: X = (A * B) mod C, wobei X, A, B und C Quads sein müssen.
In Assembler mache ich das über MUL und DIV, die ja mit 128 bit klar kommen, weil sie zwei Register nutzen.
Aber wie würde ich das in "pure" PureBasic umschreiben? Vermutlich müsste ich alle Quads als zwei Longs betrachten und viele Zwischenergebnisse berechnen oder hat jemand n andere Idee?
aktuell gibt es ja so eine Art "C-Backend" Hype, daher möchte ich auch ein paar meiner Prozeduren ASM-frei machen.
In einem Programm benötige ich die Operation: X = (A * B) mod C, wobei X, A, B und C Quads sein müssen.
In Assembler mache ich das über MUL und DIV, die ja mit 128 bit klar kommen, weil sie zwei Register nutzen.
Code: Alles auswählen
Procedure.q MulMod(Factor1.q, Factor2.q, Mod.q)
! MOV rax, [p.v_Factor1]
! MUL qword [p.v_Factor2] ; RDX:RAX = Factor1 * Factor2
! CMP rdx, qword [p.v_Mod]
! JB @F
! MOV rcx, rax ; RCX = RAX
! MOV rax, rdx ; RAX = RDX
! MOV rdx, 0
! DIV qword [p.v_Mod] ; RDX = RAX % Mod
! MOV rax, rcx ; RAX = RCX
! @@:
! DIV qword [p.v_Mod] ; RDX = RDX:RAX % Mod
! MOV rax, rdx
ProcedureReturn
EndProcedure
Debug MulMod(210987654321, 210987654321, 170)