Changeset 5146


Ignore:
Timestamp:
Sep 6, 2006, 3:39:36 PM (18 years ago)
Author:
Gary Byers
Message:

32-bit chars stuff for x8664.

Location:
trunk/ccl/compiler/X86
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/ccl/compiler/X86/X8664/x8664-vinsns.lisp

    r5042 r5146  
    663663
    664664
    665 (define-x8664-vinsn u8->char (((dest :lisp)
     665(define-x8664-vinsn u32->char (((dest :lisp)
    666666                               (src :u8))
    667667                              ((src :u8))
     
    25642564  (jmp :again)
    25652565  :ok)
     2566
     2567(define-x8664-vinsn require-char-code (()
     2568                                       ((object :lisp))
     2569                                       ((tag :u32)))
     2570  :again
     2571  (testb (:$b x8664::fixnummask) (:%b object))
     2572  (jne.pn :bad)
     2573  (cmpq (:$l #x110000) (:%q object))
     2574  (jb.pt :ok)
     2575  :bad
     2576  (uuo-error-reg-not-type (:%q object) (:$ub arch::error-object-not-mod-char-code-limit))
     2577  (jmp :again)
     2578  :ok)
     2579
     2580
    25662581
    25672582
     
    29332948        (:%l dest)))
    29342949
    2935 (define-x8664-vinsn %scharcode (((code :imm))
     2950(define-x8664-vinsn %scharcode8 (((code :imm))
    29362951                                ((str :lisp)
    29372952                                 (idx :imm))
     
    29402955  (sarq (:$ub x8664::fixnumshift) (:%q imm))
    29412956  (movzbl (:@ x8664::misc-data-offset (:%q str) (:%q imm)) (:%l imm))
    2942   (leaq (:@ (:%q imm) 8) (:%q code)))
     2957  (imulq (:$b x8664::fixnumone) (:%q imm)(:%q code)))
     2958
     2959(define-x8664-vinsn %scharcode32 (((code :imm))
     2960                                ((str :lisp)
     2961                                 (idx :imm))
     2962                                ((imm :u64)))
     2963  (movq (:%q idx) (:%q imm))
     2964  (sarq (:$ub 1) (:%q imm))
     2965  (movl (:@ x8664::misc-data-offset (:%q str) (:%q imm)) (:%l imm))
     2966  (imulq (:$b x8664::fixnumone) (:%q imm)(:%q code)))
    29432967
    29442968(define-x8664-subprim-jump-vinsn (tail-call-sym-slide) .SPtcallsymslide)
     
    32863310
    32873311
    3288 (define-x8664-vinsn %set-scharcode (()
     3312(define-x8664-vinsn %set-scharcode8 (()
    32893313                                    ((str :lisp)
    32903314                                     (idx :imm)
     
    32973321  (shrq (:$ub x8664::word-shift) (:%q imm))
    32983322  (movb (:%b imm1) (:@ x8664::misc-data-offset (:%q str) (:%q imm))))
     3323
     3324
     3325(define-x8664-vinsn %set-scharcode32 (()
     3326                                    ((str :lisp)
     3327                                     (idx :imm)
     3328                                     (code :imm))
     3329                                    ((imm :u64)
     3330                                     (imm1 :u64)))
     3331  (movq (:%q code) (:%q imm1))
     3332  (movq (:%q idx) (:%q imm))
     3333  (shrq (:$ub x8664::fixnumshift) (:%q imm1))
     3334  (shrq (:$ub 1) (:%q imm))
     3335  (movl (:%l imm1) (:@ x8664::misc-data-offset (:%q str) (:%q imm))))
    32993336
    33003337
     
    36393676  (testb (:%b x8664::arg_z) (:%b x8664::arg_z)))
    36403677
    3641 (define-x8664-vinsn %schar (((char :imm))
     3678(define-x8664-vinsn %schar8 (((char :imm))
    36423679                            ((str :lisp)
    36433680                             (idx :imm))
     
    36493686  (leaq (:@ x8664::subtag-character (:%q imm)) (:%q char)))
    36503687
    3651 
    3652 (define-x8664-vinsn %set-schar (()
    3653                                 ((str :lisp)
    3654                                  (idx :imm)
    3655                                  (char :imm))
    3656                                 ((imm0 :u64)
    3657                                  (imm1 :u64)))
     3688(define-x8664-vinsn %schar32 (((char :imm))
     3689                              ((str :lisp)
     3690                               (idx :imm))
     3691                              ((imm :u32)))
     3692  (movq (:%q idx) (:%q imm))
     3693  (shrq (:$ub 1) (:%q imm))
     3694  (movl (:@ x8664::misc-data-offset (:%q str) (:%q imm)) (:%l imm))
     3695  (shll (:$ub x8664::charcode-shift) (:%l imm))
     3696  (leaq (:@ x8664::subtag-character (:%q imm)) (:%q char)))
     3697
     3698
     3699(define-x8664-vinsn %set-schar8 (()
     3700                                 ((str :lisp)
     3701                                  (idx :imm)
     3702                                  (char :imm))
     3703                                 ((imm0 :u64)
     3704                                  (imm1 :u64)))
    36583705  (movq (:%q idx) (:%q imm0))
    36593706  (movl (:%l char) (:%l imm1))
     
    36623709  (movb (:%b imm1) (:@ x8664::misc-data-offset (:%q str) (:%q imm0))))
    36633710
     3711(define-x8664-vinsn %set-schar32 (()
     3712                                 ((str :lisp)
     3713                                  (idx :imm)
     3714                                  (char :imm))
     3715                                 ((imm0 :u64)
     3716                                  (imm1 :u64)))
     3717  (movq (:%q idx) (:%q imm0))
     3718  (movl (:%l char) (:%l imm1))
     3719  (shrq (:$ub 1) (:%q imm0))
     3720  (shrl (:$ub x8664::charcode-shift) (:%l imm1))
     3721  (movl (:%l imm1) (:@ x8664::misc-data-offset (:%q str) (:%q imm0))))
    36643722
    36653723(define-x8664-vinsn misc-set-c-single-float (((val :single-float))
  • trunk/ccl/compiler/X86/x862.lisp

    r5042 r5146  
    15031503                                   (! misc-ref-c-u32 temp src index-known-fixnum))
    15041504                                 (ensuring-node-target (target vreg)
    1505                                    (! box-fixnum target temp)))))
     1505                                   (if (eq type-keyword :simple-string)
     1506                                     (! u32->char target temp)
     1507                                     (! box-fixnum target temp))))))
    15061508                        (with-imm-temps
    15071509                            () (idx-reg)
     
    15201522                                       (! misc-ref-u32 temp src idx-reg))
    15211523                                     (ensuring-node-target (target vreg)
    1522                                        (! box-fixnum target temp)))))))
     1524                                       (if (eq type-keyword :simple-string)
     1525                                         (! u32->char target temp)
     1526                                         (! box-fixnum target temp))))))))
    15231527                      (if is-8-bit
    15241528                        (with-imm-temps
     
    15381542                          (if (eq type-keyword :simple-string)
    15391543                            (ensuring-node-target (target vreg)
    1540                               (! u8->char target temp))
     1544                              (! u32->char target temp))
    15411545                            (if (and (= vreg-mode hard-reg-class-gpr-mode-u8)
    15421546                                     (eq type-keyword :unsigned-8-bit-vector))
     
    19761980                                         (if (typep constval 'single-float)
    19771981                                           (x862-single-float-bits constval)
    1978                                            constval))
     1982                                           (if (typep constval 'character)
     1983                                             (char-code constval)
     1984                                             constval)))
    19791985                               (cond ((eq type-keyword :single-float-vector)
    19801986                                      (when safe
     
    19831989                                     ((eq type-keyword :signed-32-bit-vector)
    19841990                                      (! unbox-s32 temp val-reg))
     1991                                     ((eq type-keyword :simple-string)
     1992                                      (! unbox-base-char temp val-reg))
    19851993                                     (t
    19861994                                      (! unbox-u32 temp val-reg))))
     
    58285836      (ensuring-node-target (target vreg)
    58295837        (with-imm-target () (dest :u8)
    5830           (! u8->char target (let* ((*x862-reckless* t))
     5838          (! u32->char target (let* ((*x862-reckless* t))
    58315839                               (x862-one-untargeted-reg-form seg c dest)))))
    58325840      (^))))
     
    58345842(defx862 x862-%schar %schar (seg vreg xfer str idx)
    58355843  (multiple-value-bind (src unscaled-idx)
    5836                        (x862-two-untargeted-reg-forms seg str x8664::arg_y idx x8664::arg_z)
     5844      (x862-two-untargeted-reg-forms seg str x8664::arg_y idx x8664::arg_z)
    58375845    (if vreg
    58385846      (ensuring-node-target (target vreg)
    5839         (! %schar target src unscaled-idx)))
     5847        (case (arch::target-char-code-limit (backend-target-arch *target-backend*))
     5848          (256 (! %schar8 target src unscaled-idx))
     5849          (t (! %schar32 target src unscaled-idx)))))
    58405850    (^)))
    58415851
    58425852(defx862 x862-%set-schar %set-schar (seg vreg xfer str idx char)
    58435853  (multiple-value-bind (src unscaled-idx char)
    5844                        (x862-three-untargeted-reg-forms seg
    5845                                                         str x8664::arg_x
    5846                                                         idx x8664::arg_y
    5847                                                         char x8664::arg_z)
    5848     (! %set-schar  src unscaled-idx char)
     5854      (x862-three-untargeted-reg-forms seg
     5855                                       str x8664::arg_x
     5856                                       idx x8664::arg_y
     5857                                       char x8664::arg_z)
     5858    (case (arch::target-char-code-limit (backend-target-arch *target-backend*))
     5859      (256 (! %set-schar8 src unscaled-idx char))
     5860      (t (! %set-schar32 src unscaled-idx char)))
    58495861    (when vreg (<- char))
    58505862    (^)))
     
    58525864(defx862 x862-%set-scharcode %set-scharcode (seg vreg xfer str idx char)
    58535865  (multiple-value-bind (src unscaled-idx char)
    5854                        (x862-three-untargeted-reg-forms seg str x8664::arg_x idx x8664::arg_y
    5855                                                         char x8664::arg_z)
    5856     (! %set-scharcode  src unscaled-idx char)
     5866      (x862-three-untargeted-reg-forms seg str x8664::arg_x idx x8664::arg_y
     5867                                       char x8664::arg_z)
     5868    (case (arch::target-char-code-limit (backend-target-arch *target-backend*))
     5869      (256 (! %set-scharcode8 src unscaled-idx char))
     5870      (t (! %set-scharcode32 src unscaled-idx char)))
    58575871    (when vreg (<- char))
    58585872    (^)))
     
    58605874(defx862 x862-%scharcode %scharcode (seg vreg xfer str idx)
    58615875  (multiple-value-bind (src unscaled-idx)
    5862                        (x862-two-untargeted-reg-forms seg str x8664::arg_y idx x8664::arg_z)
     5876      (x862-two-untargeted-reg-forms seg str x8664::arg_y idx x8664::arg_z)
    58635877    (if vreg
    58645878      (ensuring-node-target (target vreg)
    5865         (! %scharcode target src unscaled-idx)))
     5879        (case (arch::target-char-code-limit (backend-target-arch *target-backend*))
     5880          (256 (! %scharcode8 target src unscaled-idx))
     5881          (t (! %scharcode32 target src unscaled-idx)))))
    58665882    (^)))
    58675883
     
    58705886(defx862 x862-code-char code-char (seg vreg xfer c)
    58715887  (let* ((reg (x862-one-untargeted-reg-form seg c x8664::arg_z)))
    5872     (! require-u8 reg)                 ; Typecheck even if result unused.
     5888    ;; Typecheck even if result unused.
     5889    (case (arch::target-char-code-limit (backend-target-arch *target-backend*))
     5890      (256 (! require-u8 reg))
     5891      (t (! require-char-code reg)))
    58735892    (if vreg
    58745893      (ensuring-node-target (target vreg)
Note: See TracChangeset for help on using the changeset viewer.