Ignore:
Timestamp:
May 30, 2010, 2:36:13 PM (9 years ago)
Author:
gb
Message:

Some stuff compiles; still a lot of work to do.
Try to reduce stack traffic in some simple cases by tracking which
registers contain copies of which stack locations. Should try to
exploit this further (and port to other platforms when it's working
reliably.)
Todo: well, a very long list of things, but one that seems obvious
is to try to use predication (at the vinsn level) to reduce the number
of conditional branches.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • branches/arm/compiler/ARM/arm-vinsns.lisp

    r13741 r13751  
    12121212                                    ((object :lisp))
    12131213                                    ((tag :u8)))
    1214   (ands tag object (:$ arm::tagmask))
     1214  (and tag object (:$ arm::tagmask))
    12151215  (cmp tag (:$ arm::tag-list))
    12161216  (uuo-error-reg-not-lisptag (:? ne) object (:$ arm::tag-list)))
     
    13281328
    13291329
    1330 ;; Sometimes we try to extract a single bit from some source register
    1331 ;; into a destination bit (typically 31, sometimes fixnum bit 0 = 29).
    1332 ;; If we copy bit 0 (whoops, I mean "bit 31") to bit 4 (aka 27) in a
    1333 ;; given register, we get a value that's either 17 (the arithmetic difference
    1334 ;; between T and NIL) or 0.
    1335 
    1336 #+later
    1337 (define-arm-vinsn lowbit->truth (((dest :lisp)
    1338                                   (bits :u32))
    1339                                  ((bits :u32))
    1340                                  ())
    1341   (rlwimi bits bits (- arm::least-significant-bit 27) 27 27) ; bits = 0000...X000X
    1342   (addi dest bits (:apply target-nil-value)))
    1343 
    1344 #+later
    1345 (define-arm-vinsn invert-lowbit (((bits :u32))
    1346                                  ((bits :u32))
    1347                                  ())
    1348   (xori bits bits 1))
    13491330
    13501331                           
    13511332
    1352 (define-arm-vinsn eq0->boolean (((dest t))
    1353                                 ((src t)))
    1354   (cmp src (:$ 0))
    1355   (mov dest (:$ arm::nil-value))
    1356   (addeq dest dest (:$ arm::t-offset)))               
    1357 
    1358 
    1359 (define-arm-vinsn ne0->boolean (((dest t))
    1360                                 ((src t)))
    1361   (cmp src (:$ 0))
    1362   (mov dest (:$ arm::nil-value))
    1363   (addne dest dest (:$ arm::t-offset)))
    1364 
    1365 (define-arm-vinsn lt0->boolean (((dest t))
    1366                                 ((src t)))
    1367   (cmp src (:$ 0))
    1368   (mov dest (:$ arm::nil-value))
    1369   (addmi dest dest (:$ arm::t-offset)))               
    1370 
    1371 
    1372 #+later
    1373 (define-arm-vinsn ge0->bit31 (((bits :u32))
    1374                               ((src (t (:ne bits)))))
    1375   (srwi bits src 31)       
    1376   (xori bits bits 1))                   ; bits = 0000...000X
    1377 
    1378 #+later
    1379 (define-arm-vinsn le0->bit31 (((bits :u32))
    1380                               ((src (t (:ne bits)))))
    1381   (neg bits src)
    1382   (orc bits bits src)
    1383   (srwi bits bits 31))                  ; bits = 0000...000X
    1384 
    1385 #+later
    1386 (define-arm-vinsn gt0->bit31 (((bits :u32))
    1387                               ((src (t (:ne bits)))))
    1388   (subi bits src 1)       
    1389   (nor bits bits src)
    1390   (srwi bits bits 31))                  ; bits = 0000...000X
    1391 
    1392 #+later
    1393 (define-arm-vinsn ne->bit31 (((bits :u32))
    1394                              ((x t)
    1395                               (y t))
    1396                              ((temp :u32)))
    1397   (subf temp x y)
    1398   (cntlzw bits temp)
    1399   (slw bits temp bits)
    1400   (srwi bits bits 31))                  ; bits = 0000...000X
    1401 
    1402 #+later
    1403 (define-arm-vinsn fulltag->bit31 (((bits :u32))
    1404                                   ((lispobj :lisp)
    1405                                    (tagval :u8const))
    1406                                   ())
    1407   (clrlwi bits lispobj (- arm::nbits-in-word arm::ntagbits))
    1408   (subi bits bits tagval)
    1409   (cntlzw bits bits)
    1410   (srwi bits bits 5))
    1411 
    1412 #+later
    1413 (define-arm-vinsn eq->bit31 (((bits :u32))
    1414                              ((x t)
    1415                               (y t)))
    1416   (subf bits x y)
    1417   (cntlzw bits bits)
    1418   (srwi bits bits 5))                   ; bits = 0000...000X
    1419 
    1420 #+later
    1421 (define-arm-vinsn eqnil->bit31 (((bits :u32))
    1422                                 ((x t)))
    1423   (subi bits x (:apply target-nil-value))
    1424   (cntlzw bits bits)
    1425   (srwi bits bits 5))
    1426 
    1427 #+later
    1428 (define-arm-vinsn ne->bit31 (((bits :u32))
    1429                              ((x t)
    1430                               (y t)))
    1431   (subf bits x y)
    1432   (cntlzw bits bits)
    1433   (srwi bits bits 5)
    1434   (xori bits bits 1))
    1435 
    1436 #+later
    1437 (define-arm-vinsn nenil->bit31 (((bits :u32))
    1438                                 ((x t)))
    1439   (subi bits x (:apply target-nil-value))
    1440   (cntlzw bits bits)
    1441   (srwi bits bits 5)
    1442   (xori bits bits 1))
    1443 
    1444 #+later
    1445 (define-arm-vinsn lt->bit31 (((bits :u32))
    1446                              ((x (t (:ne bits)))
    1447                               (y (t (:ne bits)))))
    1448 
    1449   (xor bits x y)
    1450   (srawi bits bits 31)
    1451   (or bits bits x)
    1452   (subf bits y bits)
    1453   (srwi bits bits 31))                  ; bits = 0000...000X
    1454 
    1455 #+later
    1456 (define-arm-vinsn ltu->bit31 (((bits :u32))
    1457                               ((x :u32)
    1458                                (y :u32)))
    1459   (subfc bits y x)
    1460   (subfe bits bits bits)
    1461   (neg bits bits))
    1462 
    1463 #+later
    1464 (define-arm-vinsn le->bit31 (((bits :u32))
    1465                              ((x (t (:ne bits)))
    1466                               (y (t (:ne bits)))))
    1467 
    1468   (xor bits x y)
    1469   (srawi bits bits 31)
    1470   (nor bits bits y)
    1471   (add bits bits x)
    1472   (srwi bits bits 31))                  ; bits = 0000...000X
    1473 
    1474 #+later
    1475 (define-arm-vinsn leu->bit31  (((bits :u32))
    1476                                ((x :u32)
    1477                                 (y :u32)))
    1478   (subfc bits x y)
    1479   (addze bits arm::rzero))
    1480 
    1481 #+later
    1482 (define-arm-vinsn gt->bit31 (((bits :u32))
    1483                              ((x (t (:ne bits)))
    1484                               (y (t (:ne bits)))))
    1485 
    1486   (eqv bits x y)
    1487   (srawi bits bits 31)
    1488   (and bits bits x)
    1489   (subf bits bits y)
    1490   (srwi bits bits 31))                  ; bits = 0000...000X
    1491 
    1492 #+later
    1493 (define-arm-vinsn gtu->bit31 (((bits :u32))
    1494                               ((x :u32)
    1495                                (y :u32)))
    1496   (subfc bits x y)
    1497   (subfe bits bits bits)
    1498   (neg bits bits))
    1499 
    1500 #+later
    1501 (define-arm-vinsn ge->bit31 (((bits :u32))
    1502                              ((x (t (:ne bits)))
    1503                               (y (t (:ne bits)))))
    1504   (eqv bits x y)
    1505   (srawi bits bits 31)
    1506   (andc bits bits x)
    1507   (add bits bits y)
    1508   (srwi bits bits 31))                  ; bits = 0000...000X
    1509 
    1510 #+later
    1511 (define-arm-vinsn geu->bit31 (((bits :u32))
    1512                               ((x :u32)
    1513                                (y :u32)))
    1514   (subfc bits y x)
    1515   (addze bits arm::rzero))
    1516 
    1517 
    1518 ;;; there are big-time latencies associated with MFCR on more heavily
    1519 ;;; pipelined processors; that implies that we should avoid this like
    1520 ;;; the plague.
    1521 ;;; GSO can't find anything much quicker for LT or GT, even though
    1522 ;;; MFCR takes three cycles and waits for previous instructions to complete.
    1523 ;;; Of course, using a CR field costs us something as well.
    1524 #+later
    1525 (define-arm-vinsn crbit->bit31 (((bits :u32))
    1526                                 ((crf :crf)
    1527                                  (bitnum :crbit))
    1528                                 ())
    1529   (mfcr bits)                           ; Suffer.
    1530   (rlwinm bits bits (:apply + 1  bitnum (:apply ash crf 2)) 31 31)) ; bits = 0000...000X
    1531 
    1532 
    1533 (define-arm-vinsn compare (()
     1333
     1334
     1335(define-arm-vinsn compare (((crf :crf))
    15341336                           ((arg0 t)
    15351337                            (arg1 t))
     
    15371339  (cmp arg0 arg1))
    15381340
    1539 (define-arm-vinsn compare-to-nil (()
     1341(define-arm-vinsn compare-to-nil (((crf :crf))
    15401342                                  ((arg0 t)))
    15411343  (cmp arg0 (:$ arm::nil-value)))
     
    17221524  (str reg (:@! vsp (:$ (- arm::node-size)))))
    17231525
     1526(define-arm-vinsn (vpush-xyz :push :node :vsp) (() ())
     1527  (stmdb (:! vsp) (arg_z arg_y arg_x)))
     1528
     1529(define-arm-vinsn (vpush-yz :push :node :vsp) (() ())
     1530  (stmdb (:! vsp) (arg_z arg_y)))
     1531
     1532   
     1533
    17241534(define-arm-vinsn (vpop-register :pop :node :vsp)
    17251535    (((dest :lisp))
    17261536     ())
    17271537  (ldr dest (:@+ vsp (:$ arm::node-size))))
     1538
     1539(define-arm-vinsn (pop-argument-registers :pop :node :vsp) (()
     1540                                                            ())
     1541  (cmp nargs (:$ 0))
     1542  (beq :done)
     1543  (cmp nargs (:$ (* 2 arm::fixnumshift)))
     1544  (ldrlt arg_z (:@+ vsp (:$ arm::node-size)))
     1545  (ldmiaeq (:! vsp) (arg_z arg_y))
     1546  (ldmiagt (:! vsp) (arg_z arg_y arg_x))
     1547  :done)
     1548
    17281549
    17291550
     
    18651686(define-arm-vinsn (cbranch-true :branch) (()
    18661687                                          ((label :label)
     1688                                           (crf :crf)
    18671689                                           (crbit :u8const)))
    18681690  (b (:? crbit) label))
     
    18701692(define-arm-vinsn (cbranch-false :branch) (()
    18711693                                           ((label :label)
     1694                                            (crf :crf)
    18721695                                            (crbit :u8const)))
    18731696  (b (:~ crbit) label))
    18741697
     1698(define-arm-vinsn cond->boolean (((dest :imm))
     1699                                 ((cond :u8const)))
     1700  (mov dest (:$ arm::nil-value))
     1701  (add (:? cond) dest dest (:$ arm::t-offset)))
    18751702
    18761703
     
    27342561  (subs dest x y)
    27352562  (bvc target)
    2736   (mov unboxed (:asr dest (:$ arm::fixnumshift0)))
     2563  (mov unboxed (:asr dest (:$ arm::fixnumshift)))
    27372564  (mov header (:$ arm::subtag-bignum))
    27382565  (orr header header (:$ (ash 1 arm::num-subtag-bits)))
     
    29632790(define-arm-vinsn save-lisp-context-offset (()
    29642791                                            ((nbytes-vpushed :u16const))
    2965                                             ((imm :imm)))
     2792                                            ((imm (:u32 #.arm::imm1))))
    29662793  (add imm vsp (:$ nbytes-vpushed))
    29672794  (mov imm0 (:$ arm::lisp-frame-marker))
    29682795  (stmdb (:! sp) (imm0 imm fn lr))
    29692796  (mov fn nfn))
     2797
     2798(define-arm-vinsn save-lisp-context-variable (()
     2799                                              ()
     2800                                              ((imm (:u32 #.arm::imm1))))
     2801  (subs imm nargs (:$ (ash $numarmargregs arm::word-shift)))
     2802  (movmi imm (:$ 0))
     2803  (add imm imm vsp)
     2804  (mov imm0 (:$ arm::lisp-frame-marker))
     2805  (stmdb (:! sp) (imm0 imm fn lr))
     2806  (mov fn nfn)) 
    29702807
    29712808
     
    33643201    (ba ,spno)))
    33653202
    3366 (define-arm-subprim-jump-vinsn (restore-interrupt-level) .SPrestoreintlevel)
    33673203
    33683204(define-arm-subprim-call-vinsn (save-values) .SPsave-values)
     
    33723208(define-arm-subprim-call-vinsn (add-values) .SPadd-values)
    33733209
    3374 (define-arm-subprim-jump-vinsn (jump-known-symbol-ool) .SPjmpsym)
    3375 
    3376 (define-arm-subprim-call-vinsn (call-known-symbol-ool)  .SPjmpsym)
    33773210
    33783211(define-arm-subprim-call-vinsn (pass-multiple-values)  .SPmvpass)
     
    33883221(define-arm-subprim-jump-vinsn (tail-call-fn-slide) .SPtcallnfnslide)
    33893222
    3390 (define-arm-subprim-jump-vinsn (tail-call-sym-vsp) .SPtcallsymvsp)
    3391 
    3392 (define-arm-subprim-jump-vinsn (tail-call-fn-vsp) .SPtcallnfnvsp)
    33933223
    33943224(define-arm-subprim-call-vinsn (funcall)  .SPfuncall)
     
    34003230(define-arm-subprim-jump-vinsn (tail-funcall-vsp) .SPtfuncallvsp)
    34013231
    3402 (define-arm-subprim-call-vinsn (spread-lexpr)  .SPspread-lexpr-z)
     3232(define-arm-subprim-call-vinsn (spread-lexpr)  .SPspread-lexprz)
    34033233
    34043234(define-arm-subprim-call-vinsn (spread-list)  .SPspreadargz)
    34053235
    3406 (define-arm-subprim-call-vinsn (pop-argument-registers)  .SPvpopargregs)
    34073236
    34083237(define-arm-subprim-call-vinsn (getu32) .SPgetu32)
     
    34103239(define-arm-subprim-call-vinsn (gets32) .SPgets32)
    34113240
    3412 (define-arm-subprim-call-vinsn (getxlong)  .SPgetXlong)
    34133241
    34143242(define-arm-subprim-call-vinsn (stack-cons-list)  .SPstkconslist)
     
    35113339
    35123340(define-arm-subprim-call-vinsn (mkunwind) .SPmkunwind)
    3513 (define-arm-subprim-call-vinsn (nmkunwind) .SPnmkunwind)
     3341(define-arm-subprim-call-vinsn (nmkunwind) .SPmkunwind)
    35143342
    35153343
     
    35183346(define-arm-subprim-jump-vinsn (progvrestore) .SPprogvrestore)
    35193347
    3520 (define-arm-subprim-call-vinsn (eabi-syscall) .SPeabi-syscall)
    35213348
    35223349(define-arm-subprim-call-vinsn (misc-ref) .SPmisc-ref)
     
    35363363
    35373364
    3538 (define-arm-subprim-call-vinsn (eabi-ff-call) .SPeabi-ff-call)
    3539 
    3540 (define-arm-subprim-call-vinsn (poweropen-ff-call) .SPpoweropen-ffcall)
    3541 
    3542 (define-arm-subprim-call-vinsn (poweropen-ff-callX) .SPpoweropen-ffcallX)
     3365
    35433366
    35443367(define-arm-subprim-call-vinsn (bind-interrupt-level-0) .SPbind-interrupt-level-0)
Note: See TracChangeset for help on using the changeset viewer.