Home | History | Annotate | Download | only in wasm
      1 // Copyright 2015 the V8 project authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style license that can be
      3 // found in the LICENSE file.
      4 
      5 // Flags: --expose-wasm
      6 
      7 function bytes() {
      8   var buffer = new ArrayBuffer(arguments.length);
      9   var view = new Uint8Array(buffer);
     10   for (var i = 0; i < arguments.length; i++) {
     11     var val = arguments[i];
     12     if ((typeof val) == "string") val = val.charCodeAt(0);
     13     view[i] = val | 0;
     14   }
     15   return buffer;
     16 }
     17 
     18 // Section declaration constants
     19 var kDeclMemory = 0x00;
     20 var kDeclSignatures = 0x01;
     21 var kDeclFunctions = 0x02;
     22 var kDeclGlobals = 0x03;
     23 var kDeclDataSegments = 0x04;
     24 var kDeclFunctionTable = 0x05;
     25 var kDeclEnd = 0x06;
     26 
     27 // Function declaration flags
     28 var kDeclFunctionName   = 0x01;
     29 var kDeclFunctionImport = 0x02;
     30 var kDeclFunctionLocals = 0x04;
     31 var kDeclFunctionExport = 0x08;
     32 
     33 // Local types
     34 var kAstStmt = 0;
     35 var kAstI32 = 1;
     36 var kAstI64 = 2;
     37 var kAstF32 = 3;
     38 var kAstF64 = 4;
     39 
     40 // Opcodes
     41 var kExprNop = 0x00;
     42 var kExprBlock = 0x01;
     43 var kExprLoop = 0x02;
     44 var kExprIf = 0x03;
     45 var kExprIfElse = 0x04;
     46 var kExprSelect = 0x05;
     47 var kExprBr = 0x06;
     48 var kExprBrIf = 0x07;
     49 var kExprTableSwitch = 0x08;
     50 var kExprReturn = 0x14;
     51 var kExprUnreachable = 0x15;
     52 
     53 var kExprI8Const = 0x09;
     54 var kExprI32Const = 0x0a;
     55 var kExprI64Const = 0x0b;
     56 var kExprF64Const = 0x0c;
     57 var kExprF32Const = 0x0d;
     58 var kExprGetLocal = 0x0e;
     59 var kExprSetLocal = 0x0f;
     60 var kExprLoadGlobal = 0x10;
     61 var kExprStoreGlobal = 0x11;
     62 var kExprCallFunction = 0x12;
     63 var kExprCallIndirect = 0x13;
     64 
     65 var kExprI32LoadMem8S = 0x20;
     66 var kExprI32LoadMem8U = 0x21;
     67 var kExprI32LoadMem16S = 0x22;
     68 var kExprI32LoadMem16U = 0x23;
     69 var kExprI64LoadMem8S = 0x24;
     70 var kExprI64LoadMem8U = 0x25;
     71 var kExprI64LoadMem16S = 0x26;
     72 var kExprI64LoadMem16U = 0x27;
     73 var kExprI64LoadMem32S = 0x28;
     74 var kExprI64LoadMem32U = 0x29;
     75 var kExprI32LoadMem = 0x2a;
     76 var kExprI64LoadMem = 0x2b;
     77 var kExprF32LoadMem = 0x2c;
     78 var kExprF64LoadMem = 0x2d;
     79 
     80 var kExprI32StoreMem8 = 0x2e;
     81 var kExprI32StoreMem16 = 0x2f;
     82 var kExprI64StoreMem8 = 0x30;
     83 var kExprI64StoreMem16 = 0x31;
     84 var kExprI64StoreMem32 = 0x32;
     85 var kExprI32StoreMem = 0x33;
     86 var kExprI64StoreMem = 0x34;
     87 var kExprF32StoreMem = 0x35;
     88 var kExprF64StoreMem = 0x36;
     89 
     90 var kExprMemorySize = 0x3b;
     91 var kExprGrowMemory = 0x39;
     92 
     93 var kExprI32Add = 0x40;
     94 var kExprI32Sub = 0x41;
     95 var kExprI32Mul = 0x42;
     96 var kExprI32DivS = 0x43;
     97 var kExprI32DivU = 0x44;
     98 var kExprI32RemS = 0x45;
     99 var kExprI32RemU = 0x46;
    100 var kExprI32And = 0x47;
    101 var kExprI32Ior = 0x48;
    102 var kExprI32Xor = 0x49;
    103 var kExprI32Shl = 0x4a;
    104 var kExprI32ShrU = 0x4b;
    105 var kExprI32ShrS = 0x4c;
    106 var kExprI32Eq = 0x4d;
    107 var kExprI32Ne = 0x4e;
    108 var kExprI32LtS = 0x4f;
    109 var kExprI32LeS = 0x50;
    110 var kExprI32LtU = 0x51;
    111 var kExprI32LeU = 0x52;
    112 var kExprI32GtS = 0x53;
    113 var kExprI32GeS = 0x54;
    114 var kExprI32GtU = 0x55;
    115 var kExprI32GeU = 0x56;
    116 var kExprI32Clz = 0x57;
    117 var kExprI32Ctz = 0x58;
    118 var kExprI32Popcnt = 0x59;
    119 var kExprBoolNot = 0x5a;
    120 var kExprI64Add = 0x5b;
    121 var kExprI64Sub = 0x5c;
    122 var kExprI64Mul = 0x5d;
    123 var kExprI64DivS = 0x5e;
    124 var kExprI64DivU = 0x5f;
    125 var kExprI64RemS = 0x60;
    126 var kExprI64RemU = 0x61;
    127 var kExprI64And = 0x62;
    128 var kExprI64Ior = 0x63;
    129 var kExprI64Xor = 0x64;
    130 var kExprI64Shl = 0x65;
    131 var kExprI64ShrU = 0x66;
    132 var kExprI64ShrS = 0x67;
    133 var kExprI64Eq = 0x68;
    134 var kExprI64Ne = 0x69;
    135 var kExprI64LtS = 0x6a;
    136 var kExprI64LeS = 0x6b;
    137 var kExprI64LtU = 0x6c;
    138 var kExprI64LeU = 0x6d;
    139 var kExprI64GtS = 0x6e;
    140 var kExprI64GeS = 0x6f;
    141 var kExprI64GtU = 0x70;
    142 var kExprI64GeU = 0x71;
    143 var kExprI64Clz = 0x72;
    144 var kExprI64Ctz = 0x73;
    145 var kExprI64Popcnt = 0x74;
    146 var kExprF32Add = 0x75;
    147 var kExprF32Sub = 0x76;
    148 var kExprF32Mul = 0x77;
    149 var kExprF32Div = 0x78;
    150 var kExprF32Min = 0x79;
    151 var kExprF32Max = 0x7a;
    152 var kExprF32Abs = 0x7b;
    153 var kExprF32Neg = 0x7c;
    154 var kExprF32CopySign = 0x7d;
    155 var kExprF32Ceil = 0x7e;
    156 var kExprF32Floor = 0x7f;
    157 var kExprF32Trunc = 0x80;
    158 var kExprF32NearestInt = 0x81;
    159 var kExprF32Sqrt = 0x82;
    160 var kExprF32Eq = 0x83;
    161 var kExprF32Ne = 0x84;
    162 var kExprF32Lt = 0x85;
    163 var kExprF32Le = 0x86;
    164 var kExprF32Gt = 0x87;
    165 var kExprF32Ge = 0x88;
    166 var kExprF64Add = 0x89;
    167 var kExprF64Sub = 0x8a;
    168 var kExprF64Mul = 0x8b;
    169 var kExprF64Div = 0x8c;
    170 var kExprF64Min = 0x8d;
    171 var kExprF64Max = 0x8e;
    172 var kExprF64Abs = 0x8f;
    173 var kExprF64Neg = 0x90;
    174 var kExprF64CopySign = 0x91;
    175 var kExprF64Ceil = 0x92;
    176 var kExprF64Floor = 0x93;
    177 var kExprF64Trunc = 0x94;
    178 var kExprF64NearestInt = 0x95;
    179 var kExprF64Sqrt = 0x96;
    180 var kExprF64Eq = 0x97;
    181 var kExprF64Ne = 0x98;
    182 var kExprF64Lt = 0x99;
    183 var kExprF64Le = 0x9a;
    184 var kExprF64Gt = 0x9b;
    185 var kExprF64Ge = 0x9c;
    186 var kExprI32SConvertF32 = 0x9d;
    187 var kExprI32SConvertF64 = 0x9e;
    188 var kExprI32UConvertF32 = 0x9f;
    189 var kExprI32UConvertF64 = 0xa0;
    190 var kExprI32ConvertI64 = 0xa1;
    191 var kExprI64SConvertF32 = 0xa2;
    192 var kExprI64SConvertF64 = 0xa3;
    193 var kExprI64UConvertF32 = 0xa4;
    194 var kExprI64UConvertF64 = 0xa5;
    195 var kExprI64SConvertI32 = 0xa6;
    196 var kExprI64UConvertI32 = 0xa7;
    197 var kExprF32SConvertI32 = 0xa8;
    198 var kExprF32UConvertI32 = 0xa9;
    199 var kExprF32SConvertI64 = 0xaa;
    200 var kExprF32UConvertI64 = 0xab;
    201 var kExprF32ConvertF64 = 0xac;
    202 var kExprF32ReinterpretI32 = 0xad;
    203 var kExprF64SConvertI32 = 0xae;
    204 var kExprF64UConvertI32 = 0xaf;
    205 var kExprF64SConvertI64 = 0xb0;
    206 var kExprF64UConvertI64 = 0xb1;
    207 var kExprF64ConvertF32 = 0xb2;
    208 var kExprF64ReinterpretI64 = 0xb3;
    209 var kExprI32ReinterpretF32 = 0xb4;
    210 var kExprI64ReinterpretF64 = 0xb5;
    211 
    212 var kTrapUnreachable          = 0;
    213 var kTrapMemOutOfBounds       = 1;
    214 var kTrapDivByZero            = 2;
    215 var kTrapDivUnrepresentable   = 3;
    216 var kTrapRemByZero            = 4;
    217 var kTrapFloatUnrepresentable = 5;
    218 var kTrapFuncInvalid          = 6;
    219 var kTrapFuncSigMismatch      = 7;
    220 
    221 var kTrapMsgs = [
    222   "unreachable",
    223   "memory access out of bounds",
    224   "divide by zero",
    225   "divide result unrepresentable",
    226   "remainder by zero",
    227   "integer result unrepresentable",
    228   "invalid function",
    229   "function signature mismatch"
    230 ];
    231 
    232 function assertTraps(trap, code) {
    233     var threwException = true;
    234     try {
    235       if (typeof code === 'function') {
    236         code();
    237       } else {
    238         eval(code);
    239       }
    240       threwException = false;
    241     } catch (e) {
    242       assertEquals("string", typeof e);
    243       assertEquals(kTrapMsgs[trap], e);
    244       // Success.
    245       return;
    246     }
    247     throw new MjsUnitAssertionError("Did not trap, expected: " + kTrapMsgs[trap]);
    248 }
    249