BYTE instruction implementation (with bug on BYTE 0)

This commit is contained in:
Paweł Bylica 2014-10-02 17:30:39 +02:00
parent 710b734236
commit 320add062e
3 changed files with 122 additions and 11 deletions

View file

@ -345,24 +345,29 @@ std::unique_ptr<llvm::Module> Compiler::compile(const dev::bytes& bytecode)
case Instruction::BYTE:
{
auto byteNum = stack.pop();
// TODO
//auto value = stack.pop();
const auto byteNum = stack.pop();
auto value = stack.pop();
/*
if (byteNum < 32) - use select
{
value <<= byteNum*8;
value >>= (31-byteNum)*8;
push value
}
else
{
push 0
value <<= byteNum*8
value >>= 31*8
push value
}
else push 0
*/
// TODO: Shifting by 0 gives wrong results as of this bug http://llvm.org/bugs/show_bug.cgi?id=16439
auto shbits = builder.CreateShl(byteNum, builder.getIntN(256, 3));
value = builder.CreateShl(value, shbits);
value = builder.CreateLShr(value, builder.getIntN(256, 31 * 8));
auto byteNumValid = builder.CreateICmpULT(byteNum, builder.getIntN(256, 32));
value = builder.CreateSelect(byteNumValid, value, builder.getIntN(256, 0));
stack.push(value);
break;
}

1
evmcc/bytecode/byte.evm Normal file
View file

@ -0,0 +1 @@
7f112233445566778899001122334455667788990011223344556677889900aabb6000137f112233445566778899001122334455667788990011223344556677889900aabb6001137f112233445566778899001122334455667788990011223344556677889900aabb6002137f112233445566778899001122334455667788990011223344556677889900aabb6003137f112233445566778899001122334455667788990011223344556677889900aabb6004137f112233445566778899001122334455667788990011223344556677889900aabb6005137f112233445566778899001122334455667788990011223344556677889900aabb6006137f112233445566778899001122334455667788990011223344556677889900aabb6007137f112233445566778899001122334455667788990011223344556677889900aabb6008137f112233445566778899001122334455667788990011223344556677889900aabb6009137f112233445566778899001122334455667788990011223344556677889900aabb600a137f112233445566778899001122334455667788990011223344556677889900aabb600b137f112233445566778899001122334455667788990011223344556677889900aabb600c137f112233445566778899001122334455667788990011223344556677889900aabb600d137f112233445566778899001122334455667788990011223344556677889900aabb600e137f112233445566778899001122334455667788990011223344556677889900aabb600f137f112233445566778899001122334455667788990011223344556677889900aabb6010137f112233445566778899001122334455667788990011223344556677889900aabb6011137f112233445566778899001122334455667788990011223344556677889900aabb6012137f112233445566778899001122334455667788990011223344556677889900aabb6013137f112233445566778899001122334455667788990011223344556677889900aabb6014137f112233445566778899001122334455667788990011223344556677889900aabb6015137f112233445566778899001122334455667788990011223344556677889900aabb6016137f112233445566778899001122334455667788990011223344556677889900aabb6017137f112233445566778899001122334455667788990011223344556677889900aabb6018137f112233445566778899001122334455667788990011223344556677889900aabb6019137f112233445566778899001122334455667788990011223344556677889900aabb601a137f112233445566778899001122334455667788990011223344556677889900aabb601b137f112233445566778899001122334455667788990011223344556677889900aabb601c137f112233445566778899001122334455667788990011223344556677889900aabb601d137f112233445566778899001122334455667788990011223344556677889900aabb601e137f112233445566778899001122334455667788990011223344556677889900aabb601f137f112233445566778899001122334455667788990011223344556677889900aabb6020137f112233445566778899001122334455667788990011223344556677889900aabb6107de13

105
evmcc/lll/byte.lll Normal file
View file

@ -0,0 +1,105 @@
(asm
0x112233445566778899001122334455667788990011223344556677889900aabb
0
BYTE
0x112233445566778899001122334455667788990011223344556677889900aabb
1
BYTE
0x112233445566778899001122334455667788990011223344556677889900aabb
2
BYTE
0x112233445566778899001122334455667788990011223344556677889900aabb
3
BYTE
0x112233445566778899001122334455667788990011223344556677889900aabb
4
BYTE
0x112233445566778899001122334455667788990011223344556677889900aabb
5
BYTE
0x112233445566778899001122334455667788990011223344556677889900aabb
6
BYTE
0x112233445566778899001122334455667788990011223344556677889900aabb
7
BYTE
0x112233445566778899001122334455667788990011223344556677889900aabb
8
BYTE
0x112233445566778899001122334455667788990011223344556677889900aabb
9
BYTE
0x112233445566778899001122334455667788990011223344556677889900aabb
10
BYTE
0x112233445566778899001122334455667788990011223344556677889900aabb
11
BYTE
0x112233445566778899001122334455667788990011223344556677889900aabb
12
BYTE
0x112233445566778899001122334455667788990011223344556677889900aabb
13
BYTE
0x112233445566778899001122334455667788990011223344556677889900aabb
14
BYTE
0x112233445566778899001122334455667788990011223344556677889900aabb
15
BYTE
0x112233445566778899001122334455667788990011223344556677889900aabb
16
BYTE
0x112233445566778899001122334455667788990011223344556677889900aabb
17
BYTE
0x112233445566778899001122334455667788990011223344556677889900aabb
18
BYTE
0x112233445566778899001122334455667788990011223344556677889900aabb
19
BYTE
0x112233445566778899001122334455667788990011223344556677889900aabb
20
BYTE
0x112233445566778899001122334455667788990011223344556677889900aabb
21
BYTE
0x112233445566778899001122334455667788990011223344556677889900aabb
22
BYTE
0x112233445566778899001122334455667788990011223344556677889900aabb
23
BYTE
0x112233445566778899001122334455667788990011223344556677889900aabb
24
BYTE
0x112233445566778899001122334455667788990011223344556677889900aabb
25
BYTE
0x112233445566778899001122334455667788990011223344556677889900aabb
26
BYTE
0x112233445566778899001122334455667788990011223344556677889900aabb
27
BYTE
0x112233445566778899001122334455667788990011223344556677889900aabb
28
BYTE
0x112233445566778899001122334455667788990011223344556677889900aabb
29
BYTE
0x112233445566778899001122334455667788990011223344556677889900aabb
30
BYTE
0x112233445566778899001122334455667788990011223344556677889900aabb
31
BYTE
0x112233445566778899001122334455667788990011223344556677889900aabb
32
BYTE
0x112233445566778899001122334455667788990011223344556677889900aabb
2014
BYTE
)