Changeset 15158


Ignore:
Timestamp:
Dec 28, 2011, 8:37:13 PM (8 years ago)
Author:
gb
Message:

Define another 3-register-argument UUO ('uuo_error_array_axis_bounds');
use it to report array bounds errors for multidimensional array access
(incorporating the axis/dimension in the UUO and therefore the error
message.)

Location:
trunk/source
Files:
8 edited

Legend:

Unmodified
Added
Removed
  • trunk/source/compiler/ARM/arm-asm.lisp

    r15130 r15158  
    320320     #x07f700ff
    321321     #x0fff00ff
    322      (:prefer-separate-cond))     
     322     (:prefer-separate-cond))
     323   (define-arm-instruction uuo-error-array-axis-bounds (:uuoC :uuoB :uuoA)
     324     #x07f000f5
     325     #x0ff000ff
     326     (:prefer-separate-cond))
    323327   ;; Kernel services.
    324328   (define-arm-instruction uuo-kernel-service (:uuo-unary)
  • trunk/source/compiler/ARM/arm-vinsns.lisp

    r15134 r15158  
    482482  (cmp i dim)
    483483  (blo :ok1)
    484   (uuo-error-array-bounds  i header)
     484  (mov dim (:$ 0))
     485  (uuo-error-array-axis-bounds  i dim header)
    485486  :ok1
    486487  (ldr dim (:@ header (:$ (+ arm::misc-data-offset (* 4 (1+ arm::arrayH.dim0-cell))))))
    487488  (cmp j dim)
    488489  (blo :ok2)
    489   (uuo-error-array-bounds  j header)
     490  (mov dim (:$ arm::fixnumone))
     491  (uuo-error-array-axis-bounds j dim header)
    490492  :ok2
    491493  (mov dim (:asr dim (:$ arm::fixnumshift))))
     
    500502  (cmp i dim1)
    501503  (blo :ok1)
    502   (uuo-error-array-bounds  i header)
     504  (mov dim1 (:$ 0))
     505  (uuo-error-array-axis-bounds  i dim1  header)
    503506  :ok1
    504507  (ldr dim1 (:@ header (:$ (+ arm::misc-data-offset (* 4 (1+ arm::arrayH.dim0-cell))))))
    505508  (cmp j dim1)
    506509  (blo :ok2)
    507   (uuo-error-array-bounds  i header)
     510  (mov dim1 (:$ arm::fixnumone))
     511  (uuo-error-array-axis-bounds  i dim1 header)
    508512  :ok2
    509513  (ldr dim2 (:@ header (:$ (+ arm::misc-data-offset (* 4 (+ 2 arm::arrayH.dim0-cell))))))
    510514  (cmp k dim2)
    511515  (blo :ok3)
    512   (uuo-error-array-bounds  i header)
     516  (mov dim2 (:$ (ash 2 arm::fixnumshift)))
     517  (uuo-error-array-axis-bounds  i dim2 header)
    513518  :ok3
    514519  (mov dim1 (:asr dim1 (:$ arm::fixnumshift)))
  • trunk/source/level-0/l0-array.lisp

    r14119 r15158  
    599599          (if no-error
    600600            (return-from %array-index nil)
    601             (%err-disp $XARROOB index a)))
     601            (error "Index value ~d is out of bounds for axis ~d of ~s."
     602                   index axis a)))
    602603        (incf result (the fixnum (* chunk-size (the fixnum index))))
    603604        (setq chunk-size (* chunk-size dim))))))
  • trunk/source/level-1/arm-error-signal.lisp

    r14843 r15158  
    281281                        (t
    282282                         (error "Unknown code in binary UUO: ~d" code)))))
     283                   (5
     284                    (%error "Index value ~s is out of bounds for axis ~s of ~s."
     285                            (list
     286                             (xp-gpr-lisp xp (ldb (byte 4 16) uuo))
     287                             (xp-gpr-lisp xp (ldb (byte 4 12) uuo))
     288                             (xp-gpr-lisp xp (ldb (byte 4 8) uuo)))
     289                            frame-ptr))
    283290                   (t
    284291                    (error "Unknown UUO, format ~d" format))))))
  • trunk/source/lisp-kernel/arm-exceptions.c

    r15093 r15158  
    11941194  case uuo_format_binary_error:
    11951195  case uuo_format_ternary:
     1196  case uuo_format_ternary2:
    11961197    handled = handle_error(xp,0,the_uuo, &bump);
    11971198    break;
  • trunk/source/lisp-kernel/arm-exceptions.h

    r14807 r15158  
    2929
    3030#define uuo_format_error_xtype      4 /* 8 bits of extended type/subtag info, 4 bit reg */
     31#define uuo_format_ternary2         5 /* r0,r1,r2 */
    3132#define uuo_format_binary           7 /* 4 bits of code, r1, r0 */
    3233#define uuo_format_nullary_error    8 /* nullary, call out to lisp */
  • trunk/source/lisp-kernel/arm-spentry.s

    r15123 r15158  
    24832483        __(cmp arg_y,imm0)
    24842484        __(blo 2f)
    2485         __(uuo_error_array_bounds(al,arg_y,arg_x))
     2485        __(mov temp0,#0)
     2486        __(uuo_error_array_axis_bounds(al,arg_y,temp0,arg_x))
    248624872:             
    24872488        __(ldr imm0,[arg_x,#arrayH.dim0+node_size])
    24882489        __(cmp arg_z,imm0)
    24892490        __(blo 3f)
    2490         __(uuo_error_array_bounds(al,arg_z,arg_x))
     2491        __(mov temp0,#fixnumone)
     2492        __(uuo_error_array_axis_bounds(al,arg_z,temp0,arg_x))
    249124933:             
    24922494        __(unbox_fixnum(imm0,imm0))
     
    25222524        __(cmp arg_z,imm2)
    25232525        __(blo 2f)
    2524         __(uuo_error_array_bounds(al,arg_z,temp0))
     2526        __(mov imm0,#2<<fixnumshift)
     2527        __(uuo_error_array_axis_bounds(al,arg_z,imm0,temp0))
    252525282:             
    25262529        __(cmp arg_y,imm1)
    25272530        __(blo 3f)
    2528         __(uuo_error_array_bounds(al,arg_y,temp0))
     2531        __(mov imm0,#fixnumone)
     2532        __(uuo_error_array_axis_bounds(al,arg_y,imm0,temp0))
    252925333:             
    25302534        __(cmp arg_x,imm0)
    25312535        __(blo 4f)
    2532         __(uuo_error_array_bounds(al,arg_x,temp0))
     2536        __(mov imm0,#0<<fixnumshift)
     2537        __(uuo_error_array_axis_bounds(al,arg_x,imm0,temp0))
    253325384:             
    25342539        __(unbox_fixnum(imm2,imm2))
     
    25502555
    25512556
    2552 /* As for aref2 above, but temp = array, arg_x = i, arg_y = j, arg_z = newval */
     2557/* As for aref2 above, but temp0 = array, arg_x = i, arg_y = j, arg_z = newval */
    25532558_spentry(aset2)
    25542559        __(extract_typecode(imm0,temp0))
     
    25652570        __(cmp arg_x,imm0)
    25662571        __(blo 2f)
    2567         __(uuo_error_array_bounds(al,arg_x,temp0))
     2572        __(mov imm0,#0)
     2573        __(uuo_error_array_axis_bounds(al,arg_x,imm0,temp0))
    256825742:             
    25692575        __(ldr imm0,[temp0,#arrayH.dim0+node_size])
    25702576        __(cmp arg_y,imm0)
    25712577        __(blo 3f)
    2572         __(uuo_error_array_bounds(al,arg_y,temp0))
     2578        __(mov imm0,#1<<fixnumshift)
     2579        __(uuo_error_array_axis_bounds(al,arg_y,imm0,temp0))
    257325803:             
    25742581        __(unbox_fixnum(imm0,imm0))
     
    26042611        __(cmp arg_y,imm2)
    26052612        __(blo 2f)
    2606         __(uuo_error_array_bounds(al,arg_y,temp1))
     2613        __(mov imm0,#2<<fixnumshift)
     2614        __(uuo_error_array_axis_bounds(al,arg_y,imm0,temp1))
    260726152:             
    26082616        __(cmp arg_x,imm1)
    26092617        __(blo 3f)
    2610         __(uuo_error_array_bounds(al,arg_x,temp1))
     2618        __(mov imm0,#1<<fixnumshift)
     2619        __(uuo_error_array_axis_bounds(al,arg_x,imm0,temp1))
    261126203:             
    26122621        __(cmp temp0,imm0)
    26132622        __(blo 4f)
    2614         __(uuo_error_array_bounds(al,temp0,temp1))
     2623        __(mov imm0,#0)
     2624        __(uuo_error_array_axis_bounds(al,temp0,imm0,temp1))
    261526254:             
    26162626        __(unbox_fixnum(imm1,imm1))
  • trunk/source/lisp-kernel/arm-uuo.s

    r14267 r15158  
    3939
    4040uuo_format_error_xtype = 4      /* 8 bits of extended type/subtag info, 4 bit reg */
     41uuo_format_ternary_error2 = 5   /* array index invalid for specified dimension */
    4142uuo_format_binary = 7           /* 4 bits of code, r1, r0 */
    4243uuo_format_nullary_error = 8    /* nullary, call out to lisp */
     
    102103define(`uuo_error_array_rank',`binary_errorUUO($1,$2,$3,6)')
    103104define(`uuo_error_array_flags',`binary_errorUUO($1,$2,$3,7)')
     105
     106define(`uuo_error_array_axis_bounds',`UUO($1,uuo_format_ternary_error2,($2<<8)|($3<<4)|$4)')
    104107       
    105108/* This should never be generated (never be a legal instruction in a code
Note: See TracChangeset for help on using the changeset viewer.