tor-browser

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

conversion.js (19327B)


      1 function testConversion0(resultType, opcode, paramType, op, expect) {
      2    if (resultType === 'i64') {
      3        wasmFullPassI64(`(module
      4            (func $run (param ${paramType}) (result ${resultType})
      5                (${opcode} (local.get 0))
      6            )
      7        )`, expect, {}, `${paramType}.const ${op}`);
      8 
      9        // The same, but now the input is a constant.
     10        wasmFullPassI64(`(module
     11            (func $run (result ${resultType})
     12                (${opcode} (${paramType}.const ${op}))
     13            )
     14        )`, expect);
     15    } else if (paramType === 'i64') {
     16        wasmFullPass(`(module
     17           (func $f (param ${paramType}) (result ${resultType})
     18            (${opcode} (local.get 0))
     19           )
     20           (func (export "run") (result ${resultType})
     21            i64.const ${op}
     22            call $f
     23           )
     24        )`, expect, {});
     25    } else {
     26        wasmFullPass(`(module
     27           (func (param ${paramType}) (result ${resultType})
     28            (${opcode} (local.get 0)))
     29            (export "run" (func 0))
     30        )`, expect, {}, op);
     31    }
     32 
     33    for (var bad of ['i32', 'f32', 'f64', 'i64']) {
     34        if (bad !== resultType) {
     35            wasmFailValidateText(
     36                `(module (func (param ${paramType}) (result ${bad}) (${opcode} (local.get 0))))`,
     37                mismatchError(resultType, bad)
     38            );
     39        }
     40 
     41        if (bad !== paramType) {
     42            wasmFailValidateText(
     43                `(module (func (param ${bad}) (result ${resultType}) (${opcode} (local.get 0))))`,
     44                mismatchError(bad, paramType)
     45            );
     46        }
     47    }
     48 }
     49 
     50 function testConversion(resultType, opcode, paramType, op, expect) {
     51  testConversion0(resultType, `${resultType}.${opcode}`, paramType, op, expect);
     52 }
     53 
     54 function testSignExtension(resultType, opcode, paramType, op, expect) {
     55  testConversion0(resultType, `${resultType}.${opcode}`, paramType, op, expect);
     56 }
     57 
     58 function testTrap(resultType, opcode, paramType, op) {
     59    let func = wasmEvalText(`(module
     60        (func
     61            (param ${paramType})
     62            (result ${resultType})
     63            (${resultType}.${opcode} (local.get 0))
     64        )
     65        (func
     66            (param ${paramType})
     67            local.get 0
     68            call 0
     69            drop
     70        )
     71        (export "" (func 1))
     72    )`).exports[""];
     73 
     74    let expectedError = op === 'nan' ? /invalid conversion to integer/ : /integer overflow/;
     75 
     76    assertErrorMessage(() => func(jsify(op)), Error, expectedError);
     77 }
     78 
     79 var p = Math.pow;
     80 
     81 testConversion('i32', 'wrap_i64', 'i64', '0x100000028', 40);
     82 testConversion('i32', 'wrap_i64', 'i64', -10, -10);
     83 testConversion('i32', 'wrap_i64', 'i64', "0xffffffff7fffffff", 0x7fffffff);
     84 testConversion('i32', 'wrap_i64', 'i64', "0xffffffff00000000", 0);
     85 testConversion('i32', 'wrap_i64', 'i64', "0xfffffffeffffffff", -1);
     86 testConversion('i32', 'wrap_i64', 'i64', "0x1234567801abcdef", 0x01abcdef);
     87 testConversion('i32', 'wrap_i64', 'i64', "0x8000000000000002", 2);
     88 
     89 testConversion('i64', 'extend_i32_s', 'i32', 0, 0);
     90 testConversion('i64', 'extend_i32_s', 'i32', 1234, 1234);
     91 testConversion('i64', 'extend_i32_s', 'i32', -567, -567);
     92 testConversion('i64', 'extend_i32_s', 'i32', 0x7fffffff, "0x000000007fffffff");
     93 testConversion('i64', 'extend_i32_s', 'i32', 0x80000000, "0xffffffff80000000");
     94 
     95 testConversion('i64', 'extend_i32_u', 'i32', 0, 0);
     96 testConversion('i64', 'extend_i32_u', 'i32', 1234, 1234);
     97 testConversion('i64', 'extend_i32_u', 'i32', -567, "0x00000000fffffdc9");
     98 testConversion('i64', 'extend_i32_u', 'i32', -1, "0x00000000ffffffff");
     99 testConversion('i64', 'extend_i32_u', 'i32', 0x7fffffff, "0x000000007fffffff");
    100 testConversion('i64', 'extend_i32_u', 'i32', 0x80000000, "0x0000000080000000");
    101 
    102 testConversion('f32', 'convert_i64_s', 'i64', 1, 1.0);
    103 testConversion('f32', 'convert_i64_s', 'i64', -1, -1.0);
    104 testConversion('f32', 'convert_i64_s', 'i64', 0, 0.0);
    105 testConversion('f32', 'convert_i64_s', 'i64', "0x7fffffffffffffff", 9223372036854775807.0);
    106 testConversion('f32', 'convert_i64_s', 'i64', "0x8000000000000000", -9223372036854775808.0);
    107 testConversion('f32', 'convert_i64_s', 'i64', "0x11db9e76a2483", 314159275180032.0);
    108 testConversion('f32', 'convert_i64_s', 'i64', "0x7fffffff", 2147483648.0); // closest approx.
    109 testConversion('f32', 'convert_i64_s', 'i64', "0x80000000", 2147483648.0);
    110 testConversion('f32', 'convert_i64_s', 'i64', "0x80000001", 2147483648.0); // closest approx.
    111 
    112 // Interesting values at the boundaries.
    113 testConversion('f32', 'convert_i64_s', 'i64', "0x358a09a000000002", 3857906751034621952);
    114 testConversion('f32', 'convert_i64_s', 'i64', "0x8000004000000001", -9223371487098961920);
    115 testConversion('f32', 'convert_i64_s', 'i64', "0xffdfffffdfffffff", -9007200328482816);
    116 testConversion('f32', 'convert_i64_s', 'i64', "0x0020000020000001", 9007200328482816);
    117 testConversion('f32', 'convert_i64_s', 'i64', "0x7fffff4000000001", 9223371487098961920);
    118 
    119 testConversion('f64', 'convert_i64_s', 'i64', 1, 1.0);
    120 testConversion('f64', 'convert_i64_s', 'i64', -1, -1.0);
    121 testConversion('f64', 'convert_i64_s', 'i64', 0, 0.0);
    122 testConversion('f64', 'convert_i64_s', 'i64', "0x7fffffffffffffff", 9223372036854775807.0);
    123 testConversion('f64', 'convert_i64_s', 'i64', "0x8000000000000000", -9223372036854775808.0);
    124 testConversion('f64', 'convert_i64_s', 'i64', "0x10969d374b968e", 4669201609102990);
    125 testConversion('f64', 'convert_i64_s', 'i64', "0x7fffffff", 2147483647.0);
    126 testConversion('f64', 'convert_i64_s', 'i64', "0x80000000", 2147483648.0);
    127 testConversion('f64', 'convert_i64_s', 'i64', "0x80000001", 2147483649.0);
    128 
    129 testConversion('f32', 'convert_i64_u', 'i64', 1, 1.0);
    130 testConversion('f32', 'convert_i64_u', 'i64', 0, 0.0);
    131 testConversion('f32', 'convert_i64_u', 'i64', "0x7fffffffffffffff", 9223372036854775807.0);
    132 testConversion('f32', 'convert_i64_u', 'i64', "0x8000000000000000", 9223372036854775808.0);
    133 testConversion('f32', 'convert_i64_u', 'i64', -1, 18446744073709551616.0);
    134 testConversion('f32', 'convert_i64_u', 'i64', "0xffff0000ffff0000", 18446462598732840000.0);
    135 
    136 // Interesting values at the boundaries.
    137 testConversion('f32', 'convert_i64_u', 'i64', "0x100404900000008", 72128280609685500);
    138 testConversion('f32', 'convert_i64_u', 'i64', "0x7fffff4000000001", 9223371487098962000);
    139 testConversion('f32', 'convert_i64_u', 'i64', "0x0020000020000001", 9007200328482816);
    140 testConversion('f32', 'convert_i64_u', 'i64', "0x7fffffbfffffffff", 9223371487098961920);
    141 testConversion('f32', 'convert_i64_u', 'i64', "0x8000008000000001", 9223373136366403584);
    142 testConversion('f32', 'convert_i64_u', 'i64', "0xfffffe8000000001", 18446742974197923840);
    143 
    144 testConversion('f64', 'convert_i64_u', 'i64', 1, 1.0);
    145 testConversion('f64', 'convert_i64_u', 'i64', 0, 0.0);
    146 testConversion('f64', 'convert_i64_u', 'i64', "0x7fffffffffffffff", 9223372036854775807.0);
    147 testConversion('f64', 'convert_i64_u', 'i64', "0x8000000000000000", 9223372036854775808.0);
    148 testConversion('f64', 'convert_i64_u', 'i64', -1, 18446744073709551616.0);
    149 testConversion('f64', 'convert_i64_u', 'i64', "0xffff0000ffff0000", 18446462603027743000.0);
    150 testConversion('f64', 'convert_i64_u', 'i64', "0xbf869c3369c26401", 13800889852755077000);
    151 testConversion('f64', 'convert_i64_u', 'i64', "0x7fffff4000000001", 9223371212221054976);
    152 testConversion('f64', 'convert_i64_u', 'i64', "0x8000008000000001", 9223372586610589696);
    153 testConversion('f64', 'convert_i64_u', 'i64', "0xfffffe8000000001", 18446742424442109952);
    154 
    155 testConversion('i64', 'trunc_f64_s', 'f64', 0.0, 0);
    156 testConversion('i64', 'trunc_f64_s', 'f64', "-0.0", 0);
    157 testConversion('i64', 'trunc_f64_s', 'f64', 1.0, 1);
    158 testConversion('i64', 'trunc_f64_s', 'f64', 1.1, 1);
    159 testConversion('i64', 'trunc_f64_s', 'f64', 1.5, 1);
    160 testConversion('i64', 'trunc_f64_s', 'f64', 1.99, 1);
    161 testConversion('i64', 'trunc_f64_s', 'f64', 40.1, 40);
    162 testConversion('i64', 'trunc_f64_s', 'f64', -1.0, -1);
    163 testConversion('i64', 'trunc_f64_s', 'f64', -1.1, -1);
    164 testConversion('i64', 'trunc_f64_s', 'f64', -1.5, -1);
    165 testConversion('i64', 'trunc_f64_s', 'f64', -1.99, -1);
    166 testConversion('i64', 'trunc_f64_s', 'f64', -2.0, -2);
    167 testConversion('i64', 'trunc_f64_s', 'f64', 4294967296.1, "0x100000000");
    168 testConversion('i64', 'trunc_f64_s', 'f64', -4294967296.8, "0xffffffff00000000");
    169 testConversion('i64', 'trunc_f64_s', 'f64', 9223372036854774784.8, "0x7ffffffffffffc00");
    170 testConversion('i64', 'trunc_f64_s', 'f64', -9223372036854775808.3, "0x8000000000000000");
    171 
    172 testConversion('i64', 'trunc_f64_u', 'f64', 0.0, 0);
    173 testConversion('i64', 'trunc_f64_u', 'f64', "-0.0", 0);
    174 testConversion('i64', 'trunc_f64_u', 'f64', 1.0, 1);
    175 testConversion('i64', 'trunc_f64_u', 'f64', 1.1, 1);
    176 testConversion('i64', 'trunc_f64_u', 'f64', 1.5, 1);
    177 testConversion('i64', 'trunc_f64_u', 'f64', 1.99, 1);
    178 testConversion('i64', 'trunc_f64_u', 'f64', -0.9, 0);
    179 testConversion('i64', 'trunc_f64_u', 'f64', 40.1, 40);
    180 testConversion('i64', 'trunc_f64_u', 'f64', 4294967295, "0xffffffff");
    181 testConversion('i64', 'trunc_f64_u', 'f64', 4294967296.1, "0x100000000");
    182 testConversion('i64', 'trunc_f64_u', 'f64', 1e8, "0x5f5e100");
    183 testConversion('i64', 'trunc_f64_u', 'f64', 1e16, "0x2386f26fc10000");
    184 testConversion('i64', 'trunc_f64_u', 'f64', 9223372036854775808, "0x8000000000000000");
    185 testConversion('i64', 'trunc_f64_u', 'f64', 18446744073709549568.1, -2048);
    186 
    187 testConversion('i64', 'trunc_f32_s', 'f32', 0.0, 0);
    188 testConversion('i64', 'trunc_f32_s', 'f32', "-0.0", 0);
    189 testConversion('i64', 'trunc_f32_s', 'f32', 1.0, 1);
    190 testConversion('i64', 'trunc_f32_s', 'f32', 1.1, 1);
    191 testConversion('i64', 'trunc_f32_s', 'f32', 1.5, 1);
    192 testConversion('i64', 'trunc_f32_s', 'f32', 1.99, 1);
    193 testConversion('i64', 'trunc_f32_s', 'f32', 40.1, 40);
    194 testConversion('i64', 'trunc_f32_s', 'f32', -1.0, -1);
    195 testConversion('i64', 'trunc_f32_s', 'f32', -1.1, -1);
    196 testConversion('i64', 'trunc_f32_s', 'f32', -1.5, -1);
    197 testConversion('i64', 'trunc_f32_s', 'f32', -1.99, -1);
    198 testConversion('i64', 'trunc_f32_s', 'f32', -2.0, -2);
    199 testConversion('i64', 'trunc_f32_s', 'f32', 4294967296.1, "0x100000000");
    200 testConversion('i64', 'trunc_f32_s', 'f32', -4294967296.8, "0xffffffff00000000");
    201 testConversion('i64', 'trunc_f32_s', 'f32', 9223371487098961920.0, "0x7fffff8000000000");
    202 testConversion('i64', 'trunc_f32_s', 'f32', -9223372036854775808.3, "0x8000000000000000");
    203 
    204 testConversion('i64', 'trunc_f32_u', 'f32', 0.0, 0);
    205 testConversion('i64', 'trunc_f32_u', 'f32', "-0.0", 0);
    206 testConversion('i64', 'trunc_f32_u', 'f32', 1.0, 1);
    207 testConversion('i64', 'trunc_f32_u', 'f32', 1.1, 1);
    208 testConversion('i64', 'trunc_f32_u', 'f32', 1.5, 1);
    209 testConversion('i64', 'trunc_f32_u', 'f32', 1.99, 1);
    210 testConversion('i64', 'trunc_f32_u', 'f32', -0.9, 0);
    211 testConversion('i64', 'trunc_f32_u', 'f32', 40.1, 40);
    212 testConversion('i64', 'trunc_f32_u', 'f32', 1e8, "0x5f5e100");
    213 testConversion('i64', 'trunc_f32_u', 'f32', 4294967296, "0x100000000");
    214 testConversion('i64', 'trunc_f32_u', 'f32', 18446742974197923840.0, "0xffffff0000000000");
    215 
    216 testTrap('i64', 'trunc_f64_s', 'f64', 9223372036854776000.0);
    217 testTrap('i64', 'trunc_f64_s', 'f64', -9223372036854778000.0);
    218 testTrap('i64', 'trunc_f64_s', 'f64', "nan");
    219 testTrap('i64', 'trunc_f64_s', 'f64', "inf");
    220 testTrap('i64', 'trunc_f64_s', 'f64', "-inf");
    221 
    222 testTrap('i64', 'trunc_f64_u', 'f64', -1);
    223 testTrap('i64', 'trunc_f64_u', 'f64', 18446744073709551616.0);
    224 testTrap('i64', 'trunc_f64_u', 'f64', "nan");
    225 testTrap('i64', 'trunc_f64_u', 'f64', "inf");
    226 testTrap('i64', 'trunc_f64_u', 'f64', "-inf");
    227 
    228 testTrap('i64', 'trunc_f32_s', 'f32', 9223372036854776000.0);
    229 testTrap('i64', 'trunc_f32_s', 'f32', -9223372586610630000.0);
    230 testTrap('i64', 'trunc_f32_s', 'f32', "nan");
    231 testTrap('i64', 'trunc_f32_s', 'f32', "inf");
    232 testTrap('i64', 'trunc_f32_s', 'f32', "-inf");
    233 
    234 testTrap('i64', 'trunc_f32_u', 'f32', 18446744073709551616.0);
    235 testTrap('i64', 'trunc_f32_u', 'f32', -1);
    236 testTrap('i64', 'trunc_f32_u', 'f32', "nan");
    237 testTrap('i64', 'trunc_f32_u', 'f32', "inf");
    238 testTrap('i64', 'trunc_f32_u', 'f32', "-inf");
    239 
    240 testConversion('i64', 'reinterpret_f64', 'f64', 40.09999999999968, "0x40440ccccccccca0");
    241 testConversion('f64', 'reinterpret_i64', 'i64', "0x40440ccccccccca0", 40.09999999999968);
    242 
    243 var u64max = '0xffffffffffffffff';
    244 var s64max = '0x7fffffffffffffff';
    245 var s64min = '-0x8000000000000000';
    246 var s32max = 2147483647;
    247 var s32min = -2147483648;
    248 
    249 testConversion('i32', 'trunc_sat_f32_s', 'f32', NaN, 0);
    250 testConversion('i32', 'trunc_sat_f32_s', 'f32', Infinity, s32max);
    251 testConversion('i32', 'trunc_sat_f32_s', 'f32', -Infinity, s32min);
    252 testConversion('i32', 'trunc_sat_f32_s', 'f32', p(2, 31), s32max);
    253 testConversion('i32', 'trunc_sat_f32_s', 'f32', -p(2, 31) - 256, s32min);
    254 
    255 testConversion('i32', 'trunc_sat_f64_s', 'f64', NaN, 0);
    256 testConversion('i32', 'trunc_sat_f64_s', 'f64', Infinity, s32max);
    257 testConversion('i32', 'trunc_sat_f64_s', 'f64', -Infinity, s32min);
    258 testConversion('i32', 'trunc_sat_f64_s', 'f64', p(2, 31), s32max);
    259 testConversion('i32', 'trunc_sat_f64_s', 'f64', -p(2, 31) - 1, s32min);
    260 
    261 testConversion('i32', 'trunc_sat_f32_u', 'f32', NaN, 0);
    262 testConversion('i32', 'trunc_sat_f32_u', 'f32', Infinity, -1);
    263 testConversion('i32', 'trunc_sat_f32_u', 'f32', -Infinity, 0);
    264 testConversion('i32', 'trunc_sat_f32_u', 'f32', -1, 0);
    265 testConversion('i32', 'trunc_sat_f32_u', 'f32', p(2, 32), -1);
    266 
    267 testConversion('i32', 'trunc_sat_f64_u', 'f64', NaN, 0);
    268 testConversion('i32', 'trunc_sat_f64_u', 'f64', Infinity, -1);
    269 testConversion('i32', 'trunc_sat_f64_u', 'f64', -Infinity, 0);
    270 testConversion('i32', 'trunc_sat_f64_u', 'f64', -1, 0);
    271 testConversion('i32', 'trunc_sat_f64_u', 'f64', p(2, 32), -1);
    272 
    273 testConversion('i64', 'trunc_sat_f64_s', 'f64', 9223372036854776000.0, s64max);
    274 testConversion('i64', 'trunc_sat_f64_s', 'f64', -9223372036854778000.0, s64min);
    275 testConversion('i64', 'trunc_sat_f64_s', 'f64', 'nan', '0');
    276 testConversion('i64', 'trunc_sat_f64_s', 'f64', 'inf', s64max);
    277 testConversion('i64', 'trunc_sat_f64_s', 'f64', '-inf', s64min);
    278 
    279 testConversion('i64', 'trunc_sat_f64_u', 'f64', -1, '0');
    280 testConversion('i64', 'trunc_sat_f64_u', 'f64', 18446744073709551616.0, u64max);
    281 testConversion('i64', 'trunc_sat_f64_u', 'f64', 'nan', '0');
    282 testConversion('i64', 'trunc_sat_f64_u', 'f64', 'inf', u64max);
    283 testConversion('i64', 'trunc_sat_f64_u', 'f64', '-inf', '0');
    284 
    285 testConversion('i64', 'trunc_sat_f32_s', 'f32', 9223372036854776000.0, s64max);
    286 testConversion('i64', 'trunc_sat_f32_s', 'f32', -9223372586610630000.0, s64min);
    287 testConversion('i64', 'trunc_sat_f32_s', 'f32', 'nan', '0');
    288 testConversion('i64', 'trunc_sat_f32_s', 'f32', 'inf', s64max);
    289 testConversion('i64', 'trunc_sat_f32_s', 'f32', '-inf', s64min);
    290 
    291 testConversion('i64', 'trunc_sat_f32_u', 'f32', 18446744073709551616.0, u64max);
    292 testConversion('i64', 'trunc_sat_f32_u', 'f32', -1, '0');
    293 testConversion('i64', 'trunc_sat_f32_u', 'f32', 'nan', '0');
    294 testConversion('i64', 'trunc_sat_f32_u', 'f32', 'inf', u64max);
    295 testConversion('i64', 'trunc_sat_f32_u', 'f32', '-inf', '0');
    296 
    297 testSignExtension('i32', 'extend8_s', 'i32', 0x7F, 0x7F);
    298 testSignExtension('i32', 'extend8_s', 'i32', 0x80, -0x80);
    299 testSignExtension('i32', 'extend16_s', 'i32', 0x7FFF, 0x7FFF);
    300 testSignExtension('i32', 'extend16_s', 'i32', 0x8000, -0x8000);
    301 testSignExtension('i64', 'extend8_s', 'i64', 0x7F, 0x7F);
    302 testSignExtension('i64', 'extend8_s', 'i64', 0x80, -0x80);
    303 testSignExtension('i64', 'extend16_s', 'i64', 0x7FFF, 0x7FFF);
    304 testSignExtension('i64', 'extend16_s', 'i64', 0x8000, -0x8000);
    305 testSignExtension('i64', 'extend_i32_s', 'i32', 0x7FFFFFFF, 0x7FFFFFFF);
    306 testSignExtension('i64', 'extend_i32_s', 'i32', "0x80000000", "0xFFFFFFFF80000000");
    307 
    308 // i32.trunc_s* : all values in ] -2**31 - 1; 2**31 [ are acceptable.
    309 // f32:
    310 testConversion('i32', 'trunc_f32_s', 'f32', 40.1, 40);
    311 testConversion('i32', 'trunc_f32_s', 'f32', p(2, 31) - 128, p(2, 31) - 128); // last f32 value exactly representable < 2**31.
    312 testConversion('i32', 'trunc_f32_s', 'f32', -p(2, 31), -p(2,31)); // last f32 value exactly representable > -2**31 - 1.
    313 
    314 testTrap('i32', 'trunc_f32_s', 'f32', 'nan');
    315 testTrap('i32', 'trunc_f32_s', 'f32', 'inf');
    316 testTrap('i32', 'trunc_f32_s', 'f32', '-inf');
    317 testTrap('i32', 'trunc_f32_s', 'f32', p(2, 31));
    318 testTrap('i32', 'trunc_f32_s', 'f32', -p(2,31) - 256);
    319 
    320 testConversion('i32', 'trunc_f64_s', 'f64', 40.1, 40);
    321 testConversion('i32', 'trunc_f64_s', 'f64', p(2,31) - 0.001, p(2,31) - 1); // example value near the top.
    322 testConversion('i32', 'trunc_f64_s', 'f64', -p(2,31) - 0.999, -p(2,31)); // example value near the bottom.
    323 
    324 // f64:
    325 testTrap('i32', 'trunc_f64_s', 'f64', 'nan');
    326 testTrap('i32', 'trunc_f64_s', 'f64', 'inf');
    327 testTrap('i32', 'trunc_f64_s', 'f64', '-inf');
    328 testTrap('i32', 'trunc_f64_s', 'f64', p(2,31));
    329 testTrap('i32', 'trunc_f64_s', 'f64', -p(2,31) - 1);
    330 
    331 // i32.trunc_u* : all values in ] -1; 2**32 [ are acceptable.
    332 // f32:
    333 testConversion('i32', 'trunc_f32_u', 'f32', 40.1, 40);
    334 testConversion('i32', 'trunc_f32_u', 'f32', p(2,31), p(2,31)|0);
    335 testConversion('i32', 'trunc_f32_u', 'f32', p(2,32) - 256, (p(2,32) - 256)|0); // last f32 value exactly representable < 2**32.
    336 testConversion('i32', 'trunc_f32_u', 'f32', -0.99, 0); // example value near the bottom.
    337 
    338 testTrap('i32', 'trunc_f32_u', 'f32', 'nan');
    339 testTrap('i32', 'trunc_f32_u', 'f32', 'inf');
    340 testTrap('i32', 'trunc_f32_u', 'f32', '-inf');
    341 testTrap('i32', 'trunc_f32_u', 'f32', -1);
    342 testTrap('i32', 'trunc_f32_u', 'f32', p(2,32));
    343 
    344 // f64:
    345 testConversion('i32', 'trunc_f64_u', 'f64', 40.1, 40);
    346 testConversion('i32', 'trunc_f64_u', 'f64', p(2,32) - 0.001, (p(2,32) - 1)|0); // example value near the top.
    347 testConversion('i32', 'trunc_f64_u', 'f64', -0.99999, 0); // example value near the bottom.
    348 
    349 testTrap('i32', 'trunc_f64_u', 'f64', 'nan');
    350 testTrap('i32', 'trunc_f64_u', 'f64', 'inf');
    351 testTrap('i32', 'trunc_f64_u', 'f64', '-inf');
    352 testTrap('i32', 'trunc_f64_u', 'f64', -1);
    353 testTrap('i32', 'trunc_f64_u', 'f64', p(2,32));
    354 
    355 // Other opcodes.
    356 testConversion('i32', 'reinterpret_f32', 'f32', 40.1, 1109419622);
    357 testConversion('f32', 'reinterpret_i32', 'i32', 40, 5.605193857299268e-44);
    358 
    359 testConversion('f32', 'convert_i32_s', 'i32', 40, 40);
    360 testConversion('f32', 'convert_i32_u', 'i32', 40, 40);
    361 
    362 testConversion('f64', 'convert_i32_s', 'i32', 40, 40);
    363 testConversion('f64', 'convert_i32_u', 'i32', 40, 40);
    364 
    365 testConversion('f32', 'demote_f64', 'f64', 40.1, 40.099998474121094);
    366 testConversion('f64', 'promote_f32', 'f32', 40.1, 40.099998474121094);
    367 
    368 // Non-canonical NaNs.
    369 
    370 // Wasm v1.1 spec 4.3.4 "Conversions", subsection demote(z): if z is a NaN but
    371 // not canonical, return any NaN.  That is, the sign is arbitrary and the
    372 // payload is arbitrary, except that the most significant bit of the payload
    373 // must be set.  We check simply that a quiet NaN is returned and ignore the
    374 // sign and payload.
    375 
    376 wasmFullPass(`
    377 (module
    378 (func (result i32)
    379  (i32.and
    380    (i32.const 0x7FC00000)
    381    (i32.reinterpret_f32
    382      (f32.demote_f64 (f64.const -nan:0x4444444444444)))))
    383 (export "run" (func 0)))`,
    384             0x7FC00000);
    385 
    386 // Wasm v1.1 spec 4.3.4 "Conversions", subsection promote(z): if z is a NaN but
    387 // not canonical, return any NaN.  See above.
    388 
    389 wasmFullPass(`
    390 (module
    391 (func (result i64)
    392   (i64.and
    393     (i64.const 0x7FF8000000000000)
    394     (i64.reinterpret_f64 (f64.promote_f32 (f32.const -nan:0x222222)))))
    395 (export "run" (func 0)))`,
    396             0x7FF8_0000_0000_0000n);