#
# Autogenerated by generate-bytecode-expectations.
#

---
pool type: number
execute: yes
wrap: yes

---
snippet: "
  var x = 0; return x;
"
frame size: 1
parameter count: 1
bytecode array length: 5
bytecodes: [
  /*   30 E> */ B(StackCheck),
  /*   42 S> */ B(LdaZero),
  /*   42 E> */ B(Star), R(0),
  /*   55 S> */ B(Return),
]
constant pool: [
]
handlers: [
]

---
snippet: "
  var x = 0; return x + 3;
"
frame size: 2
parameter count: 1
bytecode array length: 11
bytecodes: [
  /*   30 E> */ B(StackCheck),
  /*   42 S> */ B(LdaZero),
  /*   42 E> */ B(Star), R(0),
  /*   45 S> */ B(Star), R(1),
                B(LdaSmi), U8(3),
                B(Add), R(1),
  /*   59 S> */ B(Return),
]
constant pool: [
]
handlers: [
]

---
snippet: "
  var x = 0; return x - 3;
"
frame size: 2
parameter count: 1
bytecode array length: 11
bytecodes: [
  /*   30 E> */ B(StackCheck),
  /*   42 S> */ B(LdaZero),
  /*   42 E> */ B(Star), R(0),
  /*   45 S> */ B(Star), R(1),
                B(LdaSmi), U8(3),
                B(Sub), R(1),
  /*   59 S> */ B(Return),
]
constant pool: [
]
handlers: [
]

---
snippet: "
  var x = 4; return x * 3;
"
frame size: 2
parameter count: 1
bytecode array length: 12
bytecodes: [
  /*   30 E> */ B(StackCheck),
  /*   42 S> */ B(LdaSmi), U8(4),
  /*   42 E> */ B(Star), R(0),
  /*   45 S> */ B(Star), R(1),
                B(LdaSmi), U8(3),
                B(Mul), R(1),
  /*   59 S> */ B(Return),
]
constant pool: [
]
handlers: [
]

---
snippet: "
  var x = 4; return x / 3;
"
frame size: 2
parameter count: 1
bytecode array length: 12
bytecodes: [
  /*   30 E> */ B(StackCheck),
  /*   42 S> */ B(LdaSmi), U8(4),
  /*   42 E> */ B(Star), R(0),
  /*   45 S> */ B(Star), R(1),
                B(LdaSmi), U8(3),
                B(Div), R(1),
  /*   59 S> */ B(Return),
]
constant pool: [
]
handlers: [
]

---
snippet: "
  var x = 4; return x % 3;
"
frame size: 2
parameter count: 1
bytecode array length: 12
bytecodes: [
  /*   30 E> */ B(StackCheck),
  /*   42 S> */ B(LdaSmi), U8(4),
  /*   42 E> */ B(Star), R(0),
  /*   45 S> */ B(Star), R(1),
                B(LdaSmi), U8(3),
                B(Mod), R(1),
  /*   59 S> */ B(Return),
]
constant pool: [
]
handlers: [
]

---
snippet: "
  var x = 1; return x | 2;
"
frame size: 2
parameter count: 1
bytecode array length: 12
bytecodes: [
  /*   30 E> */ B(StackCheck),
  /*   42 S> */ B(LdaSmi), U8(1),
  /*   42 E> */ B(Star), R(0),
  /*   45 S> */ B(Star), R(1),
                B(LdaSmi), U8(2),
                B(BitwiseOr), R(1),
  /*   59 S> */ B(Return),
]
constant pool: [
]
handlers: [
]

---
snippet: "
  var x = 1; return x ^ 2;
"
frame size: 2
parameter count: 1
bytecode array length: 12
bytecodes: [
  /*   30 E> */ B(StackCheck),
  /*   42 S> */ B(LdaSmi), U8(1),
  /*   42 E> */ B(Star), R(0),
  /*   45 S> */ B(Star), R(1),
                B(LdaSmi), U8(2),
                B(BitwiseXor), R(1),
  /*   59 S> */ B(Return),
]
constant pool: [
]
handlers: [
]

---
snippet: "
  var x = 1; return x & 2;
"
frame size: 2
parameter count: 1
bytecode array length: 12
bytecodes: [
  /*   30 E> */ B(StackCheck),
  /*   42 S> */ B(LdaSmi), U8(1),
  /*   42 E> */ B(Star), R(0),
  /*   45 S> */ B(Star), R(1),
                B(LdaSmi), U8(2),
                B(BitwiseAnd), R(1),
  /*   59 S> */ B(Return),
]
constant pool: [
]
handlers: [
]

---
snippet: "
  var x = 10; return x << 3;
"
frame size: 2
parameter count: 1
bytecode array length: 12
bytecodes: [
  /*   30 E> */ B(StackCheck),
  /*   42 S> */ B(LdaSmi), U8(10),
  /*   42 E> */ B(Star), R(0),
  /*   46 S> */ B(Star), R(1),
                B(LdaSmi), U8(3),
                B(ShiftLeft), R(1),
  /*   61 S> */ B(Return),
]
constant pool: [
]
handlers: [
]

---
snippet: "
  var x = 10; return x >> 3;
"
frame size: 2
parameter count: 1
bytecode array length: 12
bytecodes: [
  /*   30 E> */ B(StackCheck),
  /*   42 S> */ B(LdaSmi), U8(10),
  /*   42 E> */ B(Star), R(0),
  /*   46 S> */ B(Star), R(1),
                B(LdaSmi), U8(3),
                B(ShiftRight), R(1),
  /*   61 S> */ B(Return),
]
constant pool: [
]
handlers: [
]

---
snippet: "
  var x = 10; return x >>> 3;
"
frame size: 2
parameter count: 1
bytecode array length: 12
bytecodes: [
  /*   30 E> */ B(StackCheck),
  /*   42 S> */ B(LdaSmi), U8(10),
  /*   42 E> */ B(Star), R(0),
  /*   46 S> */ B(Star), R(1),
                B(LdaSmi), U8(3),
                B(ShiftRightLogical), R(1),
  /*   62 S> */ B(Return),
]
constant pool: [
]
handlers: [
]

---
snippet: "
  var x = 0; return (x, 3);
"
frame size: 1
parameter count: 1
bytecode array length: 7
bytecodes: [
  /*   30 E> */ B(StackCheck),
  /*   42 S> */ B(LdaZero),
  /*   42 E> */ B(Star), R(0),
  /*   45 S> */ B(LdaSmi), U8(3),
  /*   60 S> */ B(Return),
]
constant pool: [
]
handlers: [
]

