| 211 | |
| 212 | |
| 213 | void Compiler::compileBasicBlock(BasicBlock& _basicBlock, RuntimeManager& _runtimeManager, |
| 214 | Arith256& _arith, Memory& _memory, Ext& _ext, GasMeter& _gasMeter) |
| 215 | { |
| 216 | m_builder.SetInsertPoint(_basicBlock.llvm()); |
| 217 | LocalStack stack{m_builder, _runtimeManager}; |
| 218 | |
| 219 | for (auto it = _basicBlock.begin(); it != _basicBlock.end(); ++it) |
| 220 | { |
| 221 | auto inst = Instruction(*it); |
| 222 | |
| 223 | _gasMeter.count(inst); |
| 224 | |
| 225 | switch (inst) |
| 226 | { |
| 227 | |
| 228 | case Instruction::ADD: |
| 229 | { |
| 230 | auto lhs = stack.pop(); |
| 231 | auto rhs = stack.pop(); |
| 232 | auto result = m_builder.CreateAdd(lhs, rhs); |
| 233 | stack.push(result); |
| 234 | break; |
| 235 | } |
| 236 | |
| 237 | case Instruction::SUB: |
| 238 | { |
| 239 | auto lhs = stack.pop(); |
| 240 | auto rhs = stack.pop(); |
| 241 | auto result = m_builder.CreateSub(lhs, rhs); |
| 242 | stack.push(result); |
| 243 | break; |
| 244 | } |
| 245 | |
| 246 | case Instruction::MUL: |
| 247 | { |
| 248 | auto lhs = stack.pop(); |
| 249 | auto rhs = stack.pop(); |
| 250 | auto res = m_builder.CreateMul(lhs, rhs); |
| 251 | stack.push(res); |
| 252 | break; |
| 253 | } |
| 254 | |
| 255 | case Instruction::DIV: |
| 256 | { |
| 257 | auto d = stack.pop(); |
| 258 | auto n = stack.pop(); |
| 259 | auto divByZero = m_builder.CreateICmpEQ(n, Constant::get(0)); |
| 260 | n = m_builder.CreateSelect(divByZero, Constant::get(1), n); // protect against hardware signal |
| 261 | auto r = m_builder.CreateUDiv(d, n); |
| 262 | r = m_builder.CreateSelect(divByZero, Constant::get(0), r); |
| 263 | stack.push(r); |
| 264 | break; |
| 265 | } |
| 266 | |
| 267 | case Instruction::SDIV: |
| 268 | { |
| 269 | auto d = stack.pop(); |
| 270 | auto n = stack.pop(); |
nothing calls this directly
no test coverage detected