Status report.
int TestBasic(int a, int b, int c){ for (int i = 0; i < 30000; i++) a += i; return a;}
Becomes AngelScript bytecode:
Temps: 2, 3 0 0 * SUSPEND 1 0 * PUSH 3- 3,5 - 2 3 * SetV4 v1, 0x0 (i:0, f:0) 4 3 * 1: 4 3 * SUSPEND 5 3 * CMPIi v1, 30000 7 3 * TS 8 3 * ClrHi 9 3 * JZ +5 (d:16)- 4,8 - 11 3 * ADDi v0, v0, v1 13 3 * 3: 13 3 * IncVi v1 14 3 * JMP -12 (d:4)- 5,5 - 16 3 * 2: 16 3 * CpyVtoR4 v0 17 3 * 0: 17 0 * RET 3
Which becomes ARM native code:
0x00000000 0xe92d4000 stmdb sp!, {lr}0x00000004 0xe5903060 ldr r3, [r0, #0x60]0x00000008 0xe243300c sub r3, r3, #0xc0x0000000c 0xe5803060 str r3, [r0, #0x60]0x00000010 0xe3a01000 mov r1, #0x00x00000014 0xe5d0301c ldrb r3, [r0, #0x1c]0x00000018 0xe3530000 cmp r3, #0x00x0000001c 0xe5903028 ldr r3, [r0, #0x28]0x00000020 0xe5031004 str r1, [r3, #-0x4]0x00000024 0xe5901020 ldr r1, [r0, #0x20]0x00000028 0xe2811010 add r1, r1, #0x100x0000002c 0xe5801020 str r1, [r0, #0x20]0x00000030 0x08bd4000 ldmiaeq sp!, {lr}0x00000034 0x0a000000 beq 0x00x00000038 0xe8bd8000 ldmia sp!, {pc}0x0000003c 0xe92d4010 stmdb sp!, {r4, lr}0x00000040 0xe5903028 ldr r3, [r0, #0x28]0x00000044 0xe5131004 ldr r1, [r3, #-0x4]0x00000048 0xe59f3040 ldr r3, [pc, #0x40]0x0000004c 0xe1510003 cmp r1, r30x00000050 0x03a0c000 moveq r12, #0x00x00000054 0xb3e0c001 mvnlt r12, #0x10x00000058 0xc3a0c001 movgt r12, #0x10x0000005c 0xe1b0c00c movs r12, r120x00000060 0x43a0c001 movmi r12, #0x10x00000064 0x53a0c000 movpl r12, #0x00x00000068 0xe20cc0ff and r12, r12, #0xff0x0000006c 0xe1b0c00c movs r12, r120x00000070 0xe5903020 ldr r3, [r0, #0x20]0x00000074 0x02833014 addeq r3, r3, #0x140x00000078 0xe5904028 ldr r4, [r0, #0x28]0x0000007c 0xe580c030 str r12, [r0, #0x30]0x00000080 0xe283301c add r3, r3, #0x1c0x00000084 0xe5803020 str r3, [r0, #0x20]0x00000088 0xe8bd4010 ldmia sp!, {r4, lr}0x0000008c 0xea000000 b 0x00x00000090 0x00007530 andeq r7, r0, r00x00000094 0x0a00000e beq 0xe0x00000098 0xe92d4000 stmdb sp!, {lr}0x0000009c 0xe590c028 ldr r12, [r0, #0x28]0x000000a0 0xe51c1004 ldr r1, [r12, #-0x4]0x000000a4 0xe59c2000 ldr r2, [r12]0x000000a8 0xe0822001 add r2, r2, r10x000000ac 0xe2811001 add r1, r1, #0x10x000000b0 0xe590c028 ldr r12, [r0, #0x28]0x000000b4 0xe50c1004 str r1, [r12, #-0x4]0x000000b8 0xe58c2000 str r2, [r12]0x000000bc 0xe590c020 ldr r12, [r0, #0x20]0x000000c0 0xe24cc01c sub r12, r12, #0x1c0x000000c4 0xe580c020 str r12, [r0, #0x20]0x000000c8 0xe8bd4000 ldmia sp!, {lr}0x000000cc 0xeaffffff b 0xffffff0x000000d0 0xeaffffd9 b 0xffffd90x000000d4 0xe92d4000 stmdb sp!, {lr}0x000000d8 0xe5901028 ldr r1, [r0, #0x28]0x000000dc 0xe5912000 ldr r2, [r1]0x000000e0 0xe1a0c002 mov r12, r20x000000e4 0xe5901028 ldr r1, [r0, #0x28]0x000000e8 0xe580c030 str r12, [r0, #0x30]0x000000ec 0xe590c020 ldr r12, [r0, #0x20]0x000000f0 0xe28cc004 add r12, r12, #0x40x000000f4 0xe580c020 str r12, [r0, #0x20]0x000000f8 0xe8bd8000 ldmia sp!, {pc}
There are some oddities here and there, and obviously I have not started doing any sort of optimization yet. But that tiny script works in the JIT and I do get the correct result back from it. Hooooray! \o/
Branching took forever to get working, and will still need a lot more work (as will the rest of it).
I should really go to bed, but I have not even had supper yet... It's dangerous being "really close" to getting something to work ;)
Bytecode and native code mixed in case you are interested in following what happens (note that some instructions are patched up in a postprocessing step, and the epilogue printout isn't always an epilogue, just a data flush which is why it comes up twice):
New section: 0, 4, (pos: 1)--------------- ; adding 0xe92d4000 stmdb sp!, {lr} v1 (first written to: 1, written to at all: 1, score: 1, native: 1)---------------PUSH ; adding 0xe5903060 ldr r3, [r0, #0x60] ; adding 0xe243300c sub r3, r3, #0xc ; adding 0xe5803060 str r3, [r0, #0x60]SetV4 v1, 0x0 (0, 0.000000) ; adding 0xe3a01000 mov r1, #0x0SUSPEND ; adding 0xe5d0301c ldrb r3, [r0, #0x1c] ; adding 0xe3530000 cmp r3, #0x0=================Epilogue ; adding 0xe5903028 ldr r3, [r0, #0x28] ; adding 0xe5031004 str r1, [r3, #-0x4] ; adding 0xe5901020 ldr r1, [r0, #0x20] ; adding 0xe2811010 add r1, r1, #0x10 ; adding 0xe5801020 str r1, [r0, #0x20]================= ; adding 0x08bd4000 ldmiaeq sp!, {lr} ; adding 0x0a000000 beq 0x0=================Epilogue================= ; adding 0xe8bd8000 ldmia sp!, {pc}New section: 4, 9, (pos: 5)--------------- ; adding 0xe92d4000 stmdb sp!, {lr} ; adding 0xe5903028 ldr r3, [r0, #0x28] v1073741828 (first written to: 1, written to at all: 1, score: 4, native: 12) ; adding 0xe5131004 ldr r1, [r3, #-0x4] v1 (first written to: 0, written to at all: 0, score: 1, native: 1)---------------CMPIi v1, 0x7530 (30000, 0.000000) ; adding 0xe59f3000 ldr r3, [pc] ; adding 0xe1510003 cmp r1, r3 ; adding 0x03a0c000 moveq r12, #0x0 ; adding 0xb3e0c001 mvnlt r12, #0x1 ; adding 0xc3a0c001 movgt r12, #0x1TS ; adding 0xe1b0c00c movs r12, r12 ; adding 0x43a0c001 movmi r12, #0x1 ; adding 0x53a0c000 movpl r12, #0x0ClrHi ; adding 0xe20cc0ff and r12, r12, #0xffJZ 0x5 (5, 0.000000) ; adding 0xe1b0c00c movs r12, r12 ; adding 0xe5903020 ldr r3, [r0, #0x20] ; adding 0x02833014 addeq r3, r3, #0x14=================Epilogue ; adding 0xe5904028 ldr r4, [r0, #0x28] ; adding 0xe580c030 str r12, [r0, #0x30] ; adding 0xe283301c add r3, r3, #0x1c ; adding 0xe5803020 str r3, [r0, #0x20]================= ; adding 0xe8bd4010 ldmia sp!, {r4, lr} ; adding 0xea000000 b 0x0 ; adding 0x00007530 andeq r7, r0, r0 ; adding 0x0a000410 beq 0x410New section: 11, 14, (pos: 11)--------------- ; adding 0xe92d4000 stmdb sp!, {lr} ; adding 0xe590c028 ldr r12, [r0, #0x28] ; adding 0xe51c1004 ldr r1, [r12, #-0x4] v1 (first written to: 0, written to at all: 0, score: 2, native: 1) ; adding 0xe59c2000 ldr r2, [r12] v0 (first written to: 0, written to at all: 1, score: 2, native: 2)---------------ADDi v0, v0, v1 ; adding 0xe0822001 add r2, r2, r1IncVi v1 ; adding 0xe2811001 add r1, r1, #0x1JMP 0xfffffff4 (-12, 1.#QNAN0)=================Epilogue ; adding 0xe590c028 ldr r12, [r0, #0x28] ; adding 0xe50c1004 str r1, [r12, #-0x4] ; adding 0xe58c2000 str r2, [r12] ; adding 0xe590c020 ldr r12, [r0, #0x20] ; adding 0xe24cc01c sub r12, r12, #0x1c ; adding 0xe580c020 str r12, [r0, #0x20]================= ; adding 0xe8bd4000 ldmia sp!, {lr} ; adding 0xeaffffff b 0xffffff ; adding 0xea000404 b 0x404New section: 16, 18, (pos: 16)--------------- ; adding 0xe92d4000 stmdb sp!, {lr} ; adding 0xe5901028 ldr r1, [r0, #0x28] v1073741828 (first written to: 1, written to at all: 1, score: 1, native: 12) ; adding 0xe5912000 ldr r2, [r1] v0 (first written to: 0, written to at all: 0, score: 1, native: 2)---------------CpyVtoR4 v0 ; adding 0xe1a0c002 mov r12, r2RET =================Epilogue ; adding 0xe5901028 ldr r1, [r0, #0x28] ; adding 0xe580c030 str r12, [r0, #0x30] ; adding 0xe590c020 ldr r12, [r0, #0x20] ; adding 0xe28cc004 add r12, r12, #0x4 ; adding 0xe580c020 str r12, [r0, #0x20]================= ; adding 0xe8bd8000 ldmia sp!, {pc}