WORD p_mult, '*',fasm
;; ( n1 n2 -- n3 )
- ;; Multiply n1 by n2 giving the product n3.
- ;; [rsp{8}] * [rsp+8{8}]
- ;; dd00 = [rsp+4{4}]*[rsp+12{4}] ignored
- ;; needs checking !!
- ;;
- ;; 0cc0 = [rsp{4}]*[rsp+12{4}]
- mov eax, dword [rsp]
- imul dword [rsp+12]
- mov ebx,eax
- ;; 0bb0 = [rsp+4{4}]*[rsp+8{4}]
- mov eax, dword [rsp+4]
- imul dword [rsp+8]
- add ebx, eax
- ;; 00aa = [rsp{4}]*[rsp+8{4}]
- mov eax, dword [rsp]
- imul dword [rsp+8]
- add ebx, edx
- shl rbx,32
- mov eax,eax ; ensure zero-extending eax
- add rax, rbx
+ ;; multiply n1 * n2 to n3 ignoring overflow
+ pop rax
+ pop rbx
+ imul rax,rbx
push rax
next
mov qword [rsp],rax
next
-
+ WORD p_divmod,'/MOD',fasm
+ ;; ( x y -- q r )
+ ;; divide signed x/y giving quotient q and reminder r
+ pop rbx
+ pop rax
+ xor rdx,rdx
+ idiv rbx
+ push rax
+ push rdx
+ next
+