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
p_abs_end:
next
+ WORD p_max, 'MAX',fasm
+ ;; ( a b -- c )
+ ;; c is the least a and b
+ pop rax
+ cmp rax,qword [rsp]
+ jle p_max_end
+ mov qword [rsp],rax
+p_max_end:
+ next
+
+ WORD p_min, 'MIN',fasm
+ ;; ( a b -- c )
+ ;; c is the least a and b
+ pop rax
+ cmp rax,qword [rsp]
+ jge p_min_end
+ mov qword [rsp],rax
+p_min_end:
+ next
+
WORD p_negate, 'NEGATE',fasm
;; ( n1 -- n2 )
;; Negate n1, giving its arithmetic inverse n2.
mov qword [rsp],rax
next
-
+ WORD p_divmod,'/MOD',fasm
+ ;; ( x y -- q r )
+ ;; divide signed x/y giving quotient q and remainder r
+ pop rbx
+ pop rax
+ xor rdx,rdx
+ idiv rbx
+ push rax
+ push rdx
+ next
+
+ WORD p_div,'/',fasm
+ ;; ( x y -- q )
+ ;; divide signed x/y giving quotient q and discard remainder
+ pop rbx
+ pop rax
+ xor rdx,rdx
+ idiv rbx
+ push rax
+ next
+