1.0.15.14: move bignum allocation out of line on x86-64 from MOVE-FROM-[UN]SIGNED
[sbcl.git] / src / assembly / x86-64 / alloc.lisp
1 ;;;; allocating simple objects
2
3 ;;;; This software is part of the SBCL system. See the README file for
4 ;;;; more information.
5 ;;;;
6 ;;;; This software is derived from the CMU CL system, which was
7 ;;;; written at Carnegie Mellon University and released into the
8 ;;;; public domain. The software is in the public domain and is
9 ;;;; provided with absolutely no warranty. See the COPYING and CREDITS
10 ;;;; files for more information.
11
12 (in-package "SB!VM")
13 \f
14 ;;;; Signed and unsigned bignums from word-sized integers. Argument
15 ;;;; and return in the same register. No VOPs, as these are only used
16 ;;;; as out-of-line versions: MOVE-FROM-[UN]SIGNED VOPs handle the
17 ;;;; fixnum cases inline.
18
19 ;;; #+SB-ASSEMBLING as we don't need VOPS, just the asm routines:
20 ;;; these are out-of-line versions called by VOPs.
21
22 #+sb-assembling
23 (macrolet
24     ((def (reg)
25        `(define-assembly-routine (,(symbolicate "ALLOC-SIGNED-BIGNUM-IN-" reg))
26             ((:temp number unsigned-reg ,(symbolicate reg "-OFFSET")))
27           (inst push number)
28           (with-fixed-allocation (number bignum-widetag (+ bignum-digits-offset 1))
29             (popw number bignum-digits-offset other-pointer-lowtag))
30           (inst ret))))
31   (def rax)
32   (def rcx)
33   (def rdx)
34   (def rbx)
35   (def rsi)
36   (def rdi)
37   (def r8)
38   (def r9)
39   (def r10)
40   (def r12)
41   (def r13)
42   (def r14)
43   (def r15))
44
45 #+sb-assembling
46 (macrolet
47     ((def (reg)
48        `(define-assembly-routine (,(symbolicate "ALLOC-UNSIGNED-BIGNUM-IN-" reg))
49             ((:temp number unsigned-reg ,(symbolicate reg "-OFFSET")))
50           (inst push number)
51           (inst jmp :ns one-word-bignum)
52           ;; Two word bignum
53           (with-fixed-allocation (number bignum-widetag (+ bignum-digits-offset 2))
54             (popw number bignum-digits-offset other-pointer-lowtag))
55           (inst ret)
56           ONE-WORD-BIGNUM
57           (with-fixed-allocation (number bignum-widetag (+ bignum-digits-offset 1))
58             (popw number bignum-digits-offset other-pointer-lowtag))
59           (inst ret))))
60   (def rax)
61   (def rcx)
62   (def rdx)
63   (def rbx)
64   (def rsi)
65   (def rdi)
66   (def r8)
67   (def r9)
68   (def r10)
69   (def r12)
70   (def r13)
71   (def r14)
72   (def r15))