mirror of
https://git.savannah.gnu.org/git/guile.git
synced 2025-06-24 12:20:20 +02:00
Add jtable instruction
* doc/ref/vm.texi (Instruction Set): Document new v32-x8-l24 instruction kind. (Branch Instructions): Document jtable. * libguile/instructions.c (FOR_EACH_INSTRUCTION_WORD_TYPE): Add V32_X8_L24. * libguile/jit.c (compile_jtable, compile_jtable_slow): (COMPILE_X8_S24__V32_X8_L24, analyze): Add stub JIT compiler implementation. * libguile/vm-engine.c (jtable): New instruction. * module/language/bytecode.scm (instruction-arity): Deprecate. * module/system/vm/assembler.scm (encoder, assembler): Add V32_X8_L24 case. * module/system/vm/disassembler.scm (u32-ref, s32-ref): Move definitions to expansion-time only. (define-op-handlers): New definition, replacing visit-opcodes. (disassemblers, jump-parsers, stack-effect-parsers, clobber-parsers): Rework in terms of define-op-handlers. Default case becomes #f, and add support for jtable. (disassemble-one, instruction-relative-jump-targets) (instruction-stack-size-after, instruction-slot-clobbers): Inline default case in the lookup procedure, not copied in the handler vector. (compute-labels): Add jtable case. (instruction-lengths-vector, instruction-length): Rework to allow variable-length instructions, and mark jtable as being variable-length. (instruction-has-fallthrough?): Add jtable to the no-fallthrough set.
This commit is contained in:
parent
5e1748f751
commit
bb7fa5bdc2
8 changed files with 381 additions and 264 deletions
|
@ -1,6 +1,6 @@
|
|||
;;; Bytecode
|
||||
|
||||
;; Copyright (C) 2013, 2017, 2018 Free Software Foundation, Inc.
|
||||
;; Copyright (C) 2013, 2017, 2018, 2020 Free Software Foundation, Inc.
|
||||
|
||||
;;;; This library is free software; you can redistribute it and/or
|
||||
;;;; modify it under the terms of the GNU Lesser General Public
|
||||
|
@ -22,7 +22,6 @@
|
|||
#:use-module (ice-9 match)
|
||||
#:use-module ((srfi srfi-1) #:select (fold))
|
||||
#:export (instruction-list
|
||||
instruction-arity
|
||||
builtin-name->index
|
||||
builtin-index->name
|
||||
intrinsic-name->index
|
||||
|
@ -35,80 +34,87 @@
|
|||
(load-extension (string-append "libguile-" (effective-version))
|
||||
"scm_init_intrinsics")
|
||||
|
||||
(define (compute-instruction-arity name args)
|
||||
(define (first-word-arity word)
|
||||
(case word
|
||||
((X32) 0)
|
||||
((X8_S24) 1)
|
||||
((X8_F24) 1)
|
||||
((X8_C24) 1)
|
||||
((X8_L24) 1)
|
||||
((X8_S8_I16) 2)
|
||||
((X8_S12_S12) 2)
|
||||
((X8_S12_C12) 2)
|
||||
((X8_S12_Z12) 2)
|
||||
((X8_C12_C12) 2)
|
||||
((X8_F12_F12) 2)
|
||||
((X8_S8_S8_S8) 3)
|
||||
((X8_S8_S8_C8) 3)
|
||||
((X8_S8_C8_S8) 3)))
|
||||
(define (tail-word-arity word)
|
||||
(case word
|
||||
((C32) 1)
|
||||
((I32) 1)
|
||||
((A32 AU32 AS32 AF32) 1)
|
||||
((B32 BF32 BS32 BU32) 0)
|
||||
((N32) 1)
|
||||
((R32) 1)
|
||||
((L32) 1)
|
||||
((LO32) 1)
|
||||
((C8_C24) 2)
|
||||
((C8_S24) 2)
|
||||
((C16_C16) 2)
|
||||
((B1_C7_L24) 3)
|
||||
((B1_X7_S24) 2)
|
||||
((B1_X7_F24) 2)
|
||||
((B1_X7_C24) 2)
|
||||
((B1_X7_L24) 2)
|
||||
((B1_X31) 1)
|
||||
((X8_S24) 1)
|
||||
((X8_F24) 1)
|
||||
((X8_C24) 1)
|
||||
((X8_L24) 1)))
|
||||
(match args
|
||||
((arg0 . args)
|
||||
(fold (lambda (arg arity)
|
||||
(+ (tail-word-arity arg) arity))
|
||||
(first-word-arity arg0)
|
||||
args))))
|
||||
(begin-deprecated
|
||||
(define (compute-instruction-arity name args)
|
||||
(define (first-word-arity word)
|
||||
(case word
|
||||
((X32) 0)
|
||||
((X8_S24) 1)
|
||||
((X8_F24) 1)
|
||||
((X8_C24) 1)
|
||||
((X8_L24) 1)
|
||||
((X8_S8_I16) 2)
|
||||
((X8_S12_S12) 2)
|
||||
((X8_S12_C12) 2)
|
||||
((X8_S12_Z12) 2)
|
||||
((X8_C12_C12) 2)
|
||||
((X8_F12_F12) 2)
|
||||
((X8_S8_S8_S8) 3)
|
||||
((X8_S8_S8_C8) 3)
|
||||
((X8_S8_C8_S8) 3)))
|
||||
(define (tail-word-arity word)
|
||||
(case word
|
||||
((C32) 1)
|
||||
((I32) 1)
|
||||
((A32 AU32 AS32 AF32) 1)
|
||||
((B32 BF32 BS32 BU32) 0)
|
||||
((N32) 1)
|
||||
((R32) 1)
|
||||
((L32) 1)
|
||||
((LO32) 1)
|
||||
((C8_C24) 2)
|
||||
((C8_S24) 2)
|
||||
((C16_C16) 2)
|
||||
((B1_C7_L24) 3)
|
||||
((B1_X7_S24) 2)
|
||||
((B1_X7_F24) 2)
|
||||
((B1_X7_C24) 2)
|
||||
((B1_X7_L24) 2)
|
||||
((B1_X31) 1)
|
||||
((X8_S24) 1)
|
||||
((X8_F24) 1)
|
||||
((X8_C24) 1)
|
||||
((X8_L24) 1)))
|
||||
(match args
|
||||
((arg0 . args)
|
||||
(fold (lambda (arg arity)
|
||||
(+ (tail-word-arity arg) arity))
|
||||
(first-word-arity arg0)
|
||||
args))))
|
||||
|
||||
(define *macro-instruction-arities*
|
||||
'((cache-current-module! . (0 . 1))
|
||||
(cached-toplevel-box . (1 . 0))
|
||||
(cached-module-box . (1 . 0))))
|
||||
(define *macro-instruction-arities*
|
||||
'((cache-current-module! . (0 . 1))
|
||||
(cached-toplevel-box . (1 . 0))
|
||||
(cached-module-box . (1 . 0))))
|
||||
|
||||
(define (compute-instruction-arities)
|
||||
(let ((table (make-hash-table)))
|
||||
(for-each
|
||||
(match-lambda
|
||||
;; Put special cases here.
|
||||
((name op '! . args)
|
||||
(hashq-set! table name
|
||||
(cons 0 (compute-instruction-arity name args))))
|
||||
((name op '<- . args)
|
||||
(hashq-set! table name
|
||||
(cons 1 (1- (compute-instruction-arity name args))))))
|
||||
(instruction-list))
|
||||
(for-each (match-lambda
|
||||
((name . arity)
|
||||
(hashq-set! table name arity)))
|
||||
*macro-instruction-arities*)
|
||||
table))
|
||||
(define (compute-instruction-arities)
|
||||
(issue-deprecation-warning
|
||||
"`instruction-arity' is deprecated. Instead, use instruction-list directly
|
||||
if needed.")
|
||||
(let ((table (make-hash-table)))
|
||||
(for-each
|
||||
(match-lambda
|
||||
;; Put special cases here.
|
||||
(('jtable . _)
|
||||
;; No macro-instruction.
|
||||
#f)
|
||||
((name op '! . args)
|
||||
(hashq-set! table name
|
||||
(cons 0 (compute-instruction-arity name args))))
|
||||
((name op '<- . args)
|
||||
(hashq-set! table name
|
||||
(cons 1 (1- (compute-instruction-arity name args))))))
|
||||
(instruction-list))
|
||||
(for-each (match-lambda
|
||||
((name . arity)
|
||||
(hashq-set! table name arity)))
|
||||
*macro-instruction-arities*)
|
||||
table))
|
||||
|
||||
(define *instruction-arities* (delay (compute-instruction-arities)))
|
||||
(define *instruction-arities* (delay (compute-instruction-arities)))
|
||||
|
||||
(define (instruction-arity name)
|
||||
(hashq-ref (force *instruction-arities*) name))
|
||||
(define-public (instruction-arity name)
|
||||
(hashq-ref (force *instruction-arities*) name)))
|
||||
|
||||
(define *intrinsic-codes*
|
||||
(delay (let ((tab (make-hash-table)))
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue