X-Git-Url: http://repo.macrolet.net/gitweb/?a=blobdiff_plain;ds=sidebyside;f=src%2Fcompiler%2Fx86-64%2Ftype-vops.lisp;h=5c54135a5afb288d6bd2e435bb9502634a288e7e;hb=02f7f85a6554b1ec233e9a515c4c511fe092565e;hp=04fa7457d14852b69569950a082d33d5b749a0af;hpb=3031b264496451e796282d7309c2221d89ee62c1;p=sbcl.git diff --git a/src/compiler/x86-64/type-vops.lisp b/src/compiler/x86-64/type-vops.lisp index 04fa745..5c54135 100644 --- a/src/compiler/x86-64/type-vops.lisp +++ b/src/compiler/x86-64/type-vops.lisp @@ -384,6 +384,36 @@ (emit-label yep) (move result value)))) + +(define-vop (check-mod-fixnum check-type) + (:info type) + (:temporary (:sc any-reg) temp) + (:generator 30 + (let* ((low (numeric-type-low type)) + (hi (fixnumize (numeric-type-high type))) + (error (gen-label))) + ;; FIXME: abstract + (assemble (*elsewhere*) + (emit-label error) + (inst mov temp hi) + (emit-error-break vop error-trap + (error-number-or-lose 'object-not-mod-error) + (list value temp))) + (aver (zerop low)) + (cond + ;; Handle powers of two specially + ;; The higher bits and the fixnum tag can be tested in one go + ((= (logcount (1+ hi)) 1) + (inst test value + (constantize (lognot hi))) + (inst jmp :ne error)) + (t + (generate-fixnum-test value) + (inst jmp :ne error) + (inst cmp value (constantize hi)) + (inst jmp :a error))) + (move result value)))) + ;;;; list/symbol types ;;; @@ -429,7 +459,6 @@ (progn (!define-type-vops simd-pack-p nil nil nil (simd-pack-widetag)) - #!+x86-64 (define-vop (check-simd-pack check-type) (:args (value :target result :scs (any-reg descriptor-reg