tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

movegroup-chaining.js (5961B)


      1 // |jit-test| skip-if: wasmCompileMode() != "ion"
      2 
      3 // This test checks that MoveGroup-chaining/chasing, as implemented in bug
      4 // 1944238, works correctly (or at least does not obviously fail).  It manages
      5 // to cause CodeGenerator::visitGoto to chain together 4 MoveGroups, which is
      6 // very unusual (almost all inputs cause chaining of 2 or less).
      7 
      8 let t = `
      9 (module
     10  (memory (export "mem") 1)
     11 
     12  (func (export "test")
     13        (param $x i32) (param $y i32) (param $n i32) (result i32)
     14    (local $a i32)
     15    (local $b i32)
     16    (local $c i32)
     17    (local $d i32)
     18    (local $e i32)
     19    (local $f i32)
     20    (local $g i32)
     21    (local $t i32)
     22    (local $i i32)
     23    (local.set $a (local.get $x))
     24    (local.set $b (local.get $y))
     25 
     26    (loop $cont
     27      (local.set $a (i32.shr_u (local.get $a) (i32.const 1)))
     28      (local.set $b (i32.add (i32.const 1)
     29                             (i32.mul (i32.const 3) (local.get $b))))
     30      ;;;;-begin-1-------------------------------;;;;
     31      (if (i32.eq (i32.const 0) (i32.rem_u (local.get $a) (i32.const 2)))
     32        (then
     33          ;;;;-begin-2-------------------------------;;;;
     34          (if (i32.eq (i32.const 0) (i32.rem_u (local.get $a) (i32.const 3)))
     35            (then
     36              ;;;;-begin-3-------------------------------;;;;
     37              (if (i32.eq (i32.const 0) (i32.rem_u (local.get $a)
     38                                                   (i32.const 5)))
     39                (then
     40                  ;;;;-begin-4-------------------------------;;;;
     41                  (if (i32.eq (i32.const 0) (i32.rem_u (local.get $a)
     42                                                       (i32.const 7)))
     43                    (then
     44                      ;;;;-begin-5-------------------------------;;;;
     45                      (if (i32.eq (i32.const 0) (i32.rem_u (local.get $a)
     46                                                           (i32.const 11)))
     47                        (then
     48                          ;;;;-begin-6-------------------------------;;;;
     49                          (if (i32.eq (i32.const 0) (i32.rem_u (local.get $a)
     50                                                               (i32.const 13)))
     51                            (then
     52                              ;;;;-begin-7-------------------------------;;;;
     53                              ;;;;-end-7---------------------------------;;;;
     54                              (local.set $t (local.get $a))
     55                              (local.set $a (local.get $b))
     56                              (local.set $b (local.get $c))
     57                              (local.set $c (local.get $d))
     58                              (local.set $d (local.get $e))
     59                              (local.set $e (local.get $f))
     60                              (local.set $f (local.get $t))
     61                              (local.set $g (local.get $t))
     62                            )
     63                          )
     64                          ;;;;-end-6---------------------------------;;;;
     65                          (local.set $t (local.get $a))
     66                          (local.set $a (local.get $b))
     67                          (local.set $b (local.get $c))
     68                          (local.set $c (local.get $d))
     69                          (local.set $d (local.get $e))
     70                          (local.set $e (local.get $f))
     71                          (local.set $f (local.get $t))
     72                          (local.set $g (local.get $t))
     73                        )
     74                      )
     75                      ;;;;-end-5---------------------------------;;;;
     76                      (local.set $t (local.get $a))
     77                      (local.set $a (local.get $b))
     78                      (local.set $b (local.get $c))
     79                      (local.set $c (local.get $d))
     80                      (local.set $d (local.get $t))
     81                      (local.set $e (local.get $f))
     82                      (local.set $f (local.get $g))
     83                      (local.set $g (local.get $t))
     84                    )
     85                  )
     86                  ;;;;-end-4---------------------------------;;;;
     87                  (local.set $t (local.get $a))
     88                  (local.set $a (local.get $b))
     89                  (local.set $b (local.get $t))
     90                  (local.set $c (local.get $d))
     91                  (local.set $d (local.get $e))
     92                  (local.set $e (local.get $f))
     93                  (local.set $f (local.get $g))
     94                  (local.set $g (local.get $t))
     95                )
     96              )
     97              ;;;;-end-3---------------------------------;;;;
     98              (local.set $t (local.get $a))
     99              (local.set $a (local.get $b))
    100              (local.set $b (local.get $e))
    101              (local.set $e (local.get $d))
    102              (local.set $d (local.get $e))
    103              (local.set $c (local.get $f))
    104              (local.set $f (local.get $g))
    105              (local.set $g (local.get $t))
    106            )
    107          )
    108          (local.set $t (local.get $a))
    109          (local.set $a (local.get $b))
    110          (local.set $b (local.get $c))
    111          (local.set $c (local.get $d))
    112          (local.set $d (local.get $e))
    113          (local.set $e (local.get $f))
    114          (local.set $f (local.get $g))
    115          (local.set $g (local.get $t))
    116          ;;;;-end-2---------------------------------;;;;
    117        )
    118      )
    119      (local.set $t (local.get $a))
    120      (local.set $a (local.get $b))
    121      (local.set $b (local.get $c))
    122      (local.set $c (local.get $d))
    123      (local.set $d (local.get $e))
    124      (local.set $e (local.get $f))
    125      (local.set $f (local.get $g))
    126      (local.set $g (local.get $t))
    127      ;;;;-end-1---------------------------------;;;;
    128      ;; loop control
    129      (local.set $i (i32.add (local.get $i) (i32.const 1)))
    130      (br_if $cont (i32.lt_u (local.get $i) (local.get $n)))
    131    )
    132 
    133    (local.get $a)
    134  )
    135 )`;
    136 
    137 let i = //wasmEvalText(t);
    138    new WebAssembly.Instance(new WebAssembly.Module(wasmTextToBinary(t)));
    139 
    140 assertEq(i.exports.test(1, 2, 100), 212332);