Skip to content

Commit 88f24ea

Browse files
ekaitz-zarragajanneke
authored andcommitted
mescc: Add support for signed rotation.
* module/mescc/compile.scm (expr->register)[rshift, assn-expr]: Add signed right-rotation support. * lib/arm-mes/arm.M1 (asr): Add instruction. * lib/x86-mes/x86.M1 (sar): Add instruction. * lib/x86_64-mes/x86_64.M1 (sar): Add instruction. * module/mescc/armv4/as.scm (armv4:r0>>r1-signed): New procedure. (armv4:instructions): Register it. * module/mescc/i386/as.scm (i386:r0>>r1-signed): New procedure. (i386:instructions): Register it. * module/mescc/riscv64/as.scm (riscv64:r0>>r1-signed): New procedure. (riscv64:instructions): Register it. * module/mescc/x86_64/as.scm (x86_64:r0>>r1-signed): New procedure. (x86_64:instructions): Register it. (
1 parent fc00d18 commit 88f24ea

File tree

8 files changed

+32
-3
lines changed

8 files changed

+32
-3
lines changed

lib/arm-mes/arm.M1

+1
Original file line numberDiff line numberDiff line change
@@ -269,6 +269,7 @@ DEFINE lsl____%r0,%r0,%r1 1001a0e1 # lsl %r0, %r0, %r1
269269
DEFINE lsl____%r0,%r0,$i8 90a0e31009a0e1 # mov r9, #xx; lsl %r0, %r0, %r9
270270
DEFINE lsl____%r1,%r1,$i8 90a0e31119a0e1 # mov r9, #xx; lsl %r1, %r1, %r9
271271
DEFINE lsr____%r0,%r0,%r1 3001a0e1 # lsr %r0, %r0, %r1
272+
DEFINE asr____%r0,%r0,%r1 5001a0e1 # asr %r0, %r0, %r1
272273
DEFINE ldr____%r0,(%sp,#$i8) 009de5 # ldr r0, [r13+xx]
273274
DEFINE ldr____%r1,(%sp,#$i8) 109de5 # ldr r1, [r13+xx]
274275
#DEFINE add____%r2,%r0,%r1,lsl#4 012280e0

lib/x86-mes/x86.M1

+1
Original file line numberDiff line numberDiff line change
@@ -199,6 +199,7 @@ DEFINE shl____$i8,%ebx c1e3
199199
DEFINE shl____%cl,%eax d3e0
200200
DEFINE shl____%cl,%ebx d3e3
201201
DEFINE shr____%cl,%eax d3e8
202+
DEFINE sar____%cl,%eax d3f8
202203
DEFINE sub____$8,%esp 83ec
203204
DEFINE sub____$i32,%esp 81ec
204205
DEFINE sub____%al,%dl 28d0

lib/x86_64-mes/x86_64.M1

+1
Original file line numberDiff line numberDiff line change
@@ -226,6 +226,7 @@ DEFINE shl____$i8,%rdi 48c1e7
226226
DEFINE shl____%cl,%rax 48d3e0
227227
DEFINE shl____%cl,%rdi 48d3e7
228228
DEFINE shr____%cl,%rax 48d3e8
229+
DEFINE sar____%cl,%rax 48d3f8
229230
DEFINE sub____$i32,%rbp 4881ed
230231
DEFINE sub____$i32,%rsp 4881ec
231232
DEFINE sub____%rdi,%rax 4829f8

module/mescc/armv4/as.scm

+6-1
Original file line numberDiff line numberDiff line change
@@ -350,12 +350,16 @@
350350
(r1 (get-r1 info)))
351351
`((,(string-append "lsl____%" r0 ",%" r0 ",%" r1)))))
352352

353-
;; FIXME: lsr??! Signed or unsigned r0?
354353
(define (armv4:r0>>r1 info)
355354
(let ((r0 (get-r0 info))
356355
(r1 (get-r1 info)))
357356
`((,(string-append "lsr____%" r0 ",%" r0 ",%" r1)))))
358357

358+
(define (armv4:r0>>r1-signed info)
359+
(let ((r0 (get-r0 info))
360+
(r1 (get-r1 info)))
361+
`((,(string-append "asr____%" r0 ",%" r0 ",%" r1)))))
362+
359363
(define (armv4:r0-and-r1 info)
360364
(let ((r0 (get-r0 info))
361365
(r1 (get-r1 info)))
@@ -627,6 +631,7 @@
627631
(r0/r1 . ,armv4:r0/r1)
628632
(r0<<r1 . ,armv4:r0<<r1)
629633
(r0>>r1 . ,armv4:r0>>r1)
634+
(r0>>r1-signed . ,armv4:r0>>r1-signed)
630635
(r1->r0 . ,armv4:r1->r0)
631636
(r2->r0 . ,armv4:r2->r0)
632637
(ret . ,armv4:ret)

module/mescc/compile.scm

+3-2
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
;;; GNU Mes --- Maxwell Equations of Software
22
;;; Copyright © 2016,2017,2018,2019,2020,2021 Jan (janneke) Nieuwenhuizen <janneke@gnu.org>
33
;;; Copyright © 2023 Andrius Štikonas <andrius@stikonas.eu>
4+
;;; Copyright © 2023 Ekaitz Zarraga <ekaitz@elenq.tech>
45
;;; Copyright © 2021 W. J. van der Laan <laanwj@protonmail.com>
56
;;;
67
;;; This file is part of GNU Mes.
@@ -1228,7 +1229,7 @@
12281229
(default (get-type "default" info))
12291230
(type (if (> (->size type-a info) (->size default info)) type-a
12301231
default))
1231-
(info ((binop->r info) a b 'r0>>r1)))
1232+
(info ((binop->r info) a b (if (signed? type) 'r0>>r1-signed 'r0>>r1))))
12321233
(append-text info (convert-r0 info type))))
12331234
((div ,a ,b)
12341235
((binop->r info) a b 'r0/r1
@@ -1384,7 +1385,7 @@
13841385
((equal? op "&=") (wrap-as (as info 'r0-and-r1)))
13851386
((equal? op "|=") (wrap-as (as info 'r0-or-r1)))
13861387
((equal? op "^=") (wrap-as (as info 'r0-xor-r1)))
1387-
((equal? op ">>=") (wrap-as (as info 'r0>>r1)))
1388+
((equal? op ">>=") (wrap-as (as info (if signed? 'r0>>r1-signed 'r0>>r1))))
13881389
((equal? op "<<=") (wrap-as (as info 'r0<<r1)))
13891390
(else (error (format #f "mescc: op ~a not supported: ~a\n" op o))))))
13901391
(info (free-register info)))

module/mescc/i386/as.scm

+7
Original file line numberDiff line numberDiff line change
@@ -350,6 +350,12 @@
350350
`((,(string-append "mov____%" r1 ",%ecx"))
351351
(,(string-append "shr____%cl,%" r0)))))
352352

353+
(define (i386:r0>>r1-signed info)
354+
(let ((r0 (get-r0 info))
355+
(r1 (get-r1 info)))
356+
`((,(string-append "mov____%" r1 ",%ecx"))
357+
(,(string-append "shr____%cl,%" r0)))))
358+
353359
(define (i386:r0-and-r1 info)
354360
(let ((r0 (get-r0 info))
355361
(r1 (get-r1 info)))
@@ -626,6 +632,7 @@
626632
(r0/r1 . ,i386:r0/r1)
627633
(r0<<r1 . ,i386:r0<<r1)
628634
(r0>>r1 . ,i386:r0>>r1)
635+
(r0>>r1-signed . ,i386:r0>>r1-signed)
629636
(r1->r0 . ,i386:r1->r0)
630637
(r2->r0 . ,i386:r2->r0)
631638
(ret . ,i386:ret)

module/mescc/riscv64/as.scm

+6
Original file line numberDiff line numberDiff line change
@@ -463,6 +463,11 @@
463463
(r1 (get-r1 info)))
464464
`((,(string-append "rd_" r0 " rs1_" r0 " rs2_" r1 " srl")))))
465465

466+
(define (riscv64:r0>>r1-signed info)
467+
(let ((r0 (get-r0 info))
468+
(r1 (get-r1 info)))
469+
`((,(string-append "rd_" r0 " rs1_" r0 " rs2_" r1 " sra")))))
470+
466471
;;; bitwise r0 := r0 & r1
467472
(define (riscv64:r0-and-r1 info)
468473
(let ((r0 (get-r0 info))
@@ -739,6 +744,7 @@
739744
(r0/r1 . ,riscv64:r0/r1)
740745
(r0<<r1 . ,riscv64:r0<<r1)
741746
(r0>>r1 . ,riscv64:r0>>r1)
747+
(r0>>r1-signed . ,riscv64:r0>>r1-signed)
742748
(r1->r0 . ,riscv64:r1->r0)
743749
(r2->r0 . ,riscv64:r2->r0)
744750
(ret . ,riscv64:ret)

module/mescc/x86_64/as.scm

+7
Original file line numberDiff line numberDiff line change
@@ -430,6 +430,12 @@
430430
`((,(string-append "mov____%" r1 ",%rcx"))
431431
(,(string-append "shr____%cl,%" r0)))))
432432

433+
(define (x86_64:r0>>r1-signed info)
434+
(let ((r0 (get-r0 info))
435+
(r1 (get-r1 info)))
436+
`((,(string-append "mov____%" r1 ",%rcx"))
437+
(,(string-append "sar____%cl,%" r0)))))
438+
433439
(define (x86_64:r0-and-r1 info)
434440
(let ((r0 (get-r0 info))
435441
(r1 (get-r1 info)))
@@ -760,6 +766,7 @@
760766
(r0/r1 . ,x86_64:r0/r1)
761767
(r0<<r1 . ,x86_64:r0<<r1)
762768
(r0>>r1 . ,x86_64:r0>>r1)
769+
(r0>>r1-signed . ,x86_64:r0>>r1-signed)
763770
(r1->r0 . ,x86_64:r1->r0)
764771
(r2->r0 . ,x86_64:r2->r0)
765772
(ret . ,x86_64:ret)

0 commit comments

Comments
 (0)