[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[PATCH] x86_64: generate position independent binaries.
From: |
Andrius Štikonas |
Subject: |
[PATCH] x86_64: generate position independent binaries. |
Date: |
Sat, 20 Jan 2024 01:10:36 +0000 |
* lib/x86_64-mes/x86_64.M1: add new M1 defines.
* module/mescc/x86_64/as.scm: use offsets instead of absolute addresses.
* module/mescc/M1.scm: add additional matches for #:offset
---
lib/x86_64-mes/x86_64.M1 | 17 ++++++++++-------
module/mescc/M1.scm | 12 ++++++++++++
module/mescc/x86_64/as.scm | 29 +++++++++++++++--------------
3 files changed, 37 insertions(+), 21 deletions(-)
diff --git a/lib/x86_64-mes/x86_64.M1 b/lib/x86_64-mes/x86_64.M1
index 50081c66..9b84d0cc 100644
--- a/lib/x86_64-mes/x86_64.M1
+++ b/lib/x86_64-mes/x86_64.M1
@@ -20,7 +20,7 @@
# reduced instruction set: rax, rdi (some rcx for shift, rdx for mul, div)
# and r10 as i64 immediate helper
-# 212 instructions
+# 222 instructions
DEFINE add____$i32,%rax 4805
DEFINE add____$i32,%rbp 4881c5
@@ -78,6 +78,9 @@ DEFINE jmp32 e9
DEFINE jmp____*%rbx ffe3
DEFINE jne32 0f85
DEFINE lahf 9f
+DEFINE lea____$i32(%rip),%rax 488d05
+DEFINE lea____$i32(%rip),%rdi 488d3d
+DEFINE lea____$i32(%rip),%r10 4c8d15
DEFINE mov____$i32,%rax 48c7c0
DEFINE mov____$i32,%rdi 48c7c7
DEFINE mov____$i32,0x8(%rbp) c745
@@ -90,10 +93,12 @@ DEFINE mov____%al,(%rdi) 8807
DEFINE mov____%al,0x32(%rbp) 8885
DEFINE mov____%al,0x8(%rbp) 8845
DEFINE mov____%ax,(%rdi) 668907
+DEFINE mov____%ax,(%r10) 66418902
DEFINE mov____%ax,0x8(%rbp) 668945
DEFINE mov____%eax,%eax 89c0
DEFINE mov____%eax,%rax 89c0
DEFINE mov____%eax,(%rdi) 8907
+DEFINE mov____%eax,(%r10) 418902
DEFINE mov____%eax,0x32(%rbp) 8985
DEFINE mov____%eax,0x8(%rbp) 8945
DEFINE mov____%edi,%edi 89ff
@@ -106,7 +111,7 @@ DEFINE mov____%r8,%rdi 4c89c7
DEFINE mov____%rax,%rax 4889c0
DEFINE mov____%rax,%rdi 4889c7
DEFINE mov____%rax,(%rdi) 488907
-DEFINE mov____%rax,0x32 48890425
+DEFINE mov____%rax,(%r10) 498902
DEFINE mov____%rax,0x32(%rbp) 488985
DEFINE mov____%rax,0x8(%rbp) 488945
DEFINE mov____%rax,0x8(%rdi) 488947
@@ -136,6 +141,8 @@ DEFINE mov____(%rax),%si 668b30
DEFINE mov____(%rax),%sil 408a30
DEFINE mov____(%rdi),%edi 8b3f
DEFINE mov____(%rdi),%rdi 488b3f
+DEFINE mov____(%r10),%rax 498b02
+DEFINE mov____(%r10),%rdi 498b3a
DEFINE mov____0x32(%rbp),%rax 488b85
DEFINE mov____0x32(%rbp),%rdi 488bbd
DEFINE mov____0x32,%rax 488b0425
@@ -154,8 +161,6 @@ DEFINE mov____0x8(%rbp),%rsp 488b65
DEFINE mov____0x8(%rdi),%rax 488b47
DEFINE mov____0x8(%rdi),%rbp 488b6f
DEFINE mov____0x8(%rdi),%rsp 488b67
-DEFINE movl___%eax,0x32 890425
-DEFINE movl___%edi,0x32 893c25
DEFINE movl___%esi,(%rdi) 8937
DEFINE movl___(%rax),%esi 8b30
DEFINE movsbq_%al,%rax 480fbec0
@@ -170,8 +175,6 @@ DEFINE movswq_%ax,%rax 480fbfc0
DEFINE movswq_%di,%rdi 480fbfff
DEFINE movswq_(%rax),%rax 480fbf00
DEFINE movswq_(%rdi),%rdi 480fbf3f
-DEFINE movw___%ax,0x32 66890425
-DEFINE movw___%di,0x32 66893c25
DEFINE movz___(%rax),%rax 480fb600
DEFINE movzbq_%al,%rax 480fb6c0
DEFINE movzbq_%dil,%rdi 480fb6ff
@@ -194,7 +197,7 @@ DEFINE pop____%rax 58
DEFINE pop____%rbp 5d
DEFINE pop____%rdi 5f
DEFINE pop____%rdx 5a
-DEFINE push___$i32 68
+DEFINE push___%r10 4152
DEFINE push___%r15 4157
DEFINE push___%rax 50
DEFINE push___%rbp 55
diff --git a/module/mescc/M1.scm b/module/mescc/M1.scm
index b5445343..23773ef7 100644
--- a/module/mescc/M1.scm
+++ b/module/mescc/M1.scm
@@ -186,6 +186,18 @@
((#:address8 ,global) (guard (global? global))
(hex2:address8 (global->string global)))
+ ((#:offset ,global) (guard (global? global))
+ (hex2:offset (global->string global)))
+
+ ((#:offset (#:string ,string))
+ (hex2:offset (string->label `(#:string ,string))))
+ ((#:offset (#:address ,address)) (guard (string? address))
+ (hex2:offset address))
+ ((#:offset ,function) (guard (function? function))
+ (hex2:offset (function->string function)))
+ ((#:offset (#:address ,global)) (guard (global? global))
+ (hex2:offset (global->string global)))
+
((#:offset ,offset) (hex2:offset offset))
((#:offset1 ,offset1) (hex2:offset1 offset1))
((#:offset2 ,offset2) (hex2:offset2 offset2))
diff --git a/module/mescc/x86_64/as.scm b/module/mescc/x86_64/as.scm
index 9b1e2755..43858b71 100644
--- a/module/mescc/x86_64/as.scm
+++ b/module/mescc/x86_64/as.scm
@@ -135,12 +135,8 @@
`((,(string-append "push___%" r)))))
(define (x86_64:label->arg info label i)
- `(("push___$i32" (#:address ,label))))
-
-;; FIXME?
-;; (define (x86_64:label->arg info label i)
-;; `((,(string-append "mov____$i64,%r15") (#:address8 ,label))
-;; ("push___%r15" (#:address ,label))))
+ `((,(string-append "lea____$i32(%rip),%r10") (#:offset ,label))
+ (,(string-append "push___%r10"))))
(define (x86_64:r0+r1 info)
(let ((r1 (get-r1 info))
@@ -197,7 +193,7 @@
(define (x86_64:label->r info label)
(let ((r (get-r info)))
- `((,(string-append "mov____$i64,%" r) (#:address8 ,label)))))
+ `((,(string-append "lea____$i32(%rip),%" r) (#:offset ,label)))))
(define (x86_64:r0->r1 info)
(let ((r0 (get-r0 info))
@@ -285,7 +281,8 @@
(define (x86_64:label-mem->r info label)
(let ((r (get-r info)))
- `((,(string-append "mov____0x32,%" r) (#:address ,label)))))
+ `((,(string-append "lea____$i32(%rip),%r10") (#:offset ,label))
+ (,(string-append "mov____(%r10),%" r)))))
(define (x86_64:word-mem->r info)
(let ((r (get-r info)))
@@ -306,8 +303,8 @@
`("add____$i32,0x32(%rbp)" (#:immediate ,n) (#:immediate
,v)))))) ;; FIXME: 64b
(define (x86_64:label-mem-add info label v)
- `(,(if (< (abs v) #x80) `("add____$i8,0x32" (#:address ,label) (#:immediate1
,v))
- `("add____$i32,0x32" (#:address ,label) (#:immediate ,v))))) ;;
FIXME: 64b
+ `(,(if (< (abs v) #x80) `("add____$i8,0x32" (#:offset ,label) (#:immediate1
,v))
+ `("add____$i32,0x32" (#:offset ,label) (#:immediate ,v))))) ;; FIXME:
64b
(define (x86_64:nop info)
'(("nop")))
@@ -373,22 +370,26 @@
(define (x86_64:r->label info label)
(let ((r (get-r info)))
- `((,(string-append "mov____%" r ",0x32") (#:address ,label))))) ;; FIXME:
64 bits
+ `((,(string-append "lea____$i32(%rip),%r10") (#:offset ,label)) ;; FIXME: 64
bits
+ (,(string-append "mov____%" r ",(%r10)")))))
(define (x86_64:r->byte-label info label)
(let* ((r (get-r info))
(l (r->l r)))
- `((,(string-append "movb___%" l ",0x32") (#:address ,label)))))
+ `((,(string-append "lea____$i32(%rip),%r10") (#:offset ,label))
+ (,(string-append "mov____%" l ",(%r10)")))))
(define (x86_64:r->word-label info label)
(let* ((r (get-r info))
(x (r->x r)))
- `((,(string-append "movw___%" x ",0x32") (#:address ,label)))))
+ `((,(string-append "lea____$i32(%rip),%r10") (#:offset ,label))
+ (,(string-append "mov____%" x ",(%r10)")))))
(define (x86_64:r->long-label info label)
(let* ((r (get-r info))
(e (r->e r)))
- `((,(string-append "movl___%" e ",0x32") (#:address ,label)))))
+ `((,(string-append "lea____$i32(%rip),%r10") (#:offset ,label))
+ (,(string-append "mov____%" e ",(%r10)")))))
(define (x86_64:call-r info n)
(let ((r (get-r info)))
--
2.43.0
- [PATCH] x86_64: generate position independent binaries.,
Andrius Štikonas <=