x86_64: sign-extend signed integers pass as foreign call arguments
I can't see where the ABI pins this down for x86_64, but the default compiler on Mac OS seems to have started caring that 1-byte and 2-byte integer arguments are sign-extended in registers. The previous lack of sign extension would affect only small-structure arguments.
This commit is contained in:
parent
bee9c46e0d
commit
d12f1f55ad
|
@ -339,7 +339,7 @@ allxhelp:
|
|||
# To support an eventual `make patches`, link `errors-$(conf)` to allxhelp output
|
||||
# if there's not already a representative for the configuration:
|
||||
forpatches = different-from-outdir
|
||||
$(forpatches)/errors-$(conf): $(outdir)/errors-$(conf)
|
||||
$(forpatches)/errors-$(conf):
|
||||
ln -s $(outdir)/errors-$(conf) errors-$(conf)
|
||||
|
||||
config-vars = spi hci ecpf cp0 cis p eval ctb cgr cmg eoc cl rmg
|
||||
|
|
|
@ -2629,7 +2629,7 @@
|
|||
`(set! ,(%mref ,%sp ,offset) (inline ,(make-info-load 'integer-8 #f)
|
||||
,%load ,x ,%zero (immediate ,x-offset)))]))))]
|
||||
[load-content-regs
|
||||
(lambda (classes size iint ifp)
|
||||
(lambda (classes size unsigned? iint ifp)
|
||||
(lambda (x) ; requires var
|
||||
(let loop ([size size] [iint iint] [ifp ifp] [classes classes] [x-offset 0])
|
||||
(cond
|
||||
|
@ -2654,13 +2654,13 @@
|
|||
(let loop ([reg (vector-ref vint iint)] [size size] [x-offset x-offset])
|
||||
(cond
|
||||
[(= size 4)
|
||||
`(set! ,reg (inline ,(make-info-load 'unsigned-32 #f)
|
||||
`(set! ,reg (inline ,(make-info-load (if unsigned? 'unsigned-32 'integer-32) #f)
|
||||
,%load ,x ,%zero (immediate ,x-offset)))]
|
||||
[(= size 2)
|
||||
`(set! ,reg (inline ,(make-info-load 'unsigned-16 #f)
|
||||
`(set! ,reg (inline ,(make-info-load (if unsigned? 'unsigned-16 'integer-16) #f)
|
||||
,%load ,x ,%zero (immediate ,x-offset)))]
|
||||
[(= size 1)
|
||||
`(set! ,reg (inline ,(make-info-load 'unsigned-8 #f)
|
||||
`(set! ,reg (inline ,(make-info-load (if unsigned? 'unsigned-8 'integer-8) #f)
|
||||
,%load ,x ,%zero (immediate ,x-offset)))]
|
||||
[(> size 4)
|
||||
;; 5, 6, or 7: multiple steps to avoid reading too many bytes
|
||||
|
@ -2721,12 +2721,12 @@
|
|||
(eq? 'float (caar ($ftd->members ftd))))
|
||||
;; float or double
|
||||
(loop (cdr types)
|
||||
(cons (load-content-regs '(sse) ($ftd-size ftd) i i) locs)
|
||||
(cons (load-content-regs '(sse) ($ftd-size ftd) #t i i) locs)
|
||||
(add-regs 1 i vint regs) (add-regs 1 i vfp fp-regs) (fx+ i 1) isp)]
|
||||
[else
|
||||
;; integer
|
||||
(loop (cdr types)
|
||||
(cons (load-content-regs '(integer) ($ftd-size ftd) i i) locs)
|
||||
(cons (load-content-regs '(integer) ($ftd-size ftd) ($ftd-unsigned? ftd) i i) locs)
|
||||
(add-regs 1 i vint regs) fp-regs(fx+ i 1) isp)])]
|
||||
[else
|
||||
;; pass as value on the stack
|
||||
|
@ -2790,7 +2790,7 @@
|
|||
[else
|
||||
;; pass in registers
|
||||
(loop (cdr types)
|
||||
(cons (load-content-regs classes ($ftd-size ftd) iint ifp) locs)
|
||||
(cons (load-content-regs classes ($ftd-size ftd) ($ftd-unsigned? ftd) iint ifp) locs)
|
||||
(add-regs ints iint vint regs) (add-regs fps ifp vfp fp-regs)
|
||||
(fx+ iint ints) (fx+ ifp fps) isp)]))]
|
||||
[else
|
||||
|
|
Loading…
Reference in New Issue
Block a user