diff options
Diffstat (limited to 'ThirdParty/tolua_runtime/luajit-2.1/dynasm/Examples/test_z_inst.c')
-rw-r--r-- | ThirdParty/tolua_runtime/luajit-2.1/dynasm/Examples/test_z_inst.c | 488 |
1 files changed, 488 insertions, 0 deletions
diff --git a/ThirdParty/tolua_runtime/luajit-2.1/dynasm/Examples/test_z_inst.c b/ThirdParty/tolua_runtime/luajit-2.1/dynasm/Examples/test_z_inst.c new file mode 100644 index 0000000..5a87cc1 --- /dev/null +++ b/ThirdParty/tolua_runtime/luajit-2.1/dynasm/Examples/test_z_inst.c @@ -0,0 +1,488 @@ +#include <assert.h> +#include <stdio.h> +#include <sys/mman.h> + +#include "../dasm_proto.h" +#include "../dasm_s390x.h" + +// DynASM directives. +|.arch s390x +|.actionlist actions +|.globals lab_ + +static void add(dasm_State *state) +{ + dasm_State ** Dst = &state; + + | ar r2,r3 + | br r14 +} + +/* +static void add_rrd(dasm_State *state) +{ + dasm_State **Dst = &state; + + | lgfi r4 , 0x02 + | maer r2 , r3 , r4 + | br r14 +} +*/ + +static void sub(dasm_State *state) +{ + dasm_State **Dst = &state; + + | sr r2,r3 + | br r14 +} + +static void mul(dasm_State *state) +{ + dasm_State **Dst = &state; + + | msr r2 , r3 + | br r14 +} + +static void rx(dasm_State *state) +{ + dasm_State **Dst = &state; + + int x = 1; + int y = 4095; + + | la r4, 4095(r2, r3) + | la r5, 4095(r4) + | la r1, x(r5) + | la r2, y(r1, r0) + | br r14 +} + +static void rxy(dasm_State *state) +{ + dasm_State **Dst = &state; + + int x = -524287; + int y = 524286; + + | lay r4, -524288(r2, r3) + | lay r5, 524287(r4) + | lay r1, x(r5) + | lay r2, y(r1, r0) + | br r14 +} + +static void lab(dasm_State *state) +{ + dasm_State **Dst = &state; + + // r1 = 0; do { r2 += r2; r1 += 1; } while(r1 < r3); + | la r1, 0(r0) + |1: + | agr r2, r2 + | la r1, 1(r1) + | cgr r1, r3 + | jl <1 + | br r14 +} + +static void labg(dasm_State *state) +{ + dasm_State **Dst = &state; + + // r1 = 0; do { r2 += r2; r1 += 1; } while(r1 < r3); + | la r1, 0(r0) + |1: + | agr r2, r2 + | la r1, 1(r1) + | cgr r1, r3 + | jgl <1 + | jgnl >1 + | stg r0, 0(r0) + |1: + | br r14 +} + +static void jmp_fwd(dasm_State *state) +{ + dasm_State **Dst = &state; + + // while(r2!=r3){r2 += 2}; + | j >1 + |1: + | cgr r2 , r3 + | jne >2 + | je >3 + |2: + | afi r2, 0x2 + | j <1 + |3: + | br r14 + +} + +static void add_imm16(dasm_State *state) +{ + dasm_State **Dst = &state; + + | ahi r2 , 0xf + | br r14 +} + +static void add_imm32(dasm_State *state) +{ + dasm_State **Dst = &state; + + | afi r2 , 0xe + | br r14 +} + +static void save(dasm_State *state) +{ + dasm_State **Dst = &state; + + |.define CFRAME_SPACE, 224 // Delta for sp, 8 byte aligned. + | + |// Register save area. + |.define SAVE_GPRS, 264(sp) // Save area for r6-r15 (10*8 bytes). + | + |// Argument save area, each slot is 8-bytes (32-bit types are sign/zero extended). + |.define RESERVED, 232(sp) // Reserved for compiler use. + |.define BACKCHAIN, 224(sp) + | + |// Current stack frame. + |.define SAVE_FPR15, 216(sp) + |.define SAVE_FPR14, 208(sp) + |.define SAVE_FPR13, 200(sp) + |.define SAVE_FPR12, 192(sp) + |.define SAVE_FPR11, 184(sp) + |.define SAVE_FPR10, 176(sp) + |.define SAVE_FPR9, 168(sp) + |.define SAVE_FPR8, 160(sp) + | + |// Callee save area. + |.define CALLEESAVE, 000(sp) + | + |.macro saveregs + | lay sp, -CFRAME_SPACE(sp) // Allocate stack frame. + | stmg r6, r15, SAVE_GPRS // Technically we restore r15 regardless. + | std f8, SAVE_FPR8 // f8-f15 are callee-saved. + | std f9, SAVE_FPR9 + | std f10, SAVE_FPR10 + | std f11, SAVE_FPR11 + | std f12, SAVE_FPR12 + | std f13, SAVE_FPR13 + | std f14, SAVE_FPR14 + | std f15, SAVE_FPR15 + |.endmacro + | + |.macro restoreregs + | ld f8, SAVE_FPR8 // f8-f15 are callee-saved. + | ld f9, SAVE_FPR9 + | ld f10, SAVE_FPR10 + | ld f11, SAVE_FPR11 + | ld f12, SAVE_FPR12 + | ld f13, SAVE_FPR13 + | ld f14, SAVE_FPR14 + | ld f15, SAVE_FPR15 + | lmg r6, r15, SAVE_GPRS // Restores the stack pointer. + |.endmacro + | + | saveregs + | lgfi r7, 0x10 // 16 + | lgfi r8, 0x20 // 32 + | agr r2, r3 + | agr r7, r8 + | msgr r2, r7 + | restoreregs + | br r14 +} + +static void labmul(dasm_State *state) +{ + dasm_State **Dst = &state; + + // Multiply using an add function. + // Only correct if input is positive. + |->mul_func: + | stmg r6, r14, 48(sp) + | lgr r6, r2 + | lgr r7, r3 + | cgfi r7, 0 + | je >3 + | cgfi r7, 1 + | je >2 + |1: + | lgr r3, r6 + | brasl r14, ->add_func + | lay r7, -1(r7) + | cgfi r7, 1 + | jh <1 + |2: + | lmg r6, r14, 48(sp) + | br r14 + |3: + | la r2, 0(r0) + | j <2 + + |->add_func: + | agr r2, r3 + | br r14 +} + +static void pc(dasm_State *state) { + dasm_State **Dst = &state; + int MAX = 10; + dasm_growpc(Dst, MAX+1); + + | j =>MAX + for (int i = 0; i <= MAX; i++) { + |=>i: + if (i == 0) { + | br r14 + } else { + | aghi r2, i + | j =>i-1 + } + } +} + +/* +static void load_test(dasm_State *state) +{ + dasm_State **Dst = &state; + + | ltdr r2 , r3 + | br r14 +} +*/ + + +static void test_mask(dasm_State *state) +{ + dasm_State **Dst = &state; + + |lay sp , -8(sp) + |stg r2, 4(sp) + |tm 4(sp),0x04 + |je >2 + |jne >1 +|1: + |ar r2,r3 + |br r14 +|2: + |sr r2,r3 + |br r14 +} + +static void ssa(dasm_State *state) { + dasm_State **Dst = &state; + + | lay sp, -16(sp) + | lay r0, -1(r0) + | stg r0, 8(sp) + | xc 8(8, sp), 8(sp) + | stg r2, 0(sp) + | mvc 13(2, sp), 6(sp) + | lg r2, 8(sp) + | la sp, 16(sp) + | br r14 +} + +static void ssa_act(dasm_State *state) { + dasm_State **Dst = &state; + + int xl = 8; + int d1 = 13; + int l1 = 2; + int d2 = 6; + + | lay sp, -16(sp) + | lay r0, -1(r0) + | stg r0, 8(sp) + | xc 8(xl, sp), 8(sp) + | stg r2, 0(sp) + | mvc d1(l1, sp), d2(sp) + | lg r2, 8(sp) + | la sp, 16(sp) + | br r14 +} + +typedef struct { + int a; + int b; +} SimpleStruct; + +static void type(dasm_State *state) { + dasm_State **Dst = &state; + + | .type SIMPLE, SimpleStruct + | lay sp, -8(sp) + | stg r2, 0(sp) + | xgr r2, r2 + | l r2, SIMPLE:sp->b + | la sp, 8(sp) + | br r14 +} + +static void sil(dasm_State *state) { + dasm_State **Dst = &state; + + | lay sp, -16(sp) + | xc 0(16, sp), 0(sp) + | mvghi 0(sp), 5 + | mvhi 8(sp), 7 + | mvhhi 12(sp), 11 + | lghi r2, 0 + | ag r2, 0(sp) // r2 += 5 + | a r2, 8(sp) // r2 += 7 + | ah r2, 12(sp) // r2 += 11 + | la sp, 16(sp) + | br r14 +} + +static void rrfe_rrd(dasm_State *state) { + dasm_State ** Dst = &state; + + | cefbr f0,r2 + | cefbr f2,r3 + | cefbr f4,r4 + | maebr f0 ,f2 ,f4 + | cfebr r2, 0, f0 + | br r14 +} + +static void rre(dasm_State *state) { + + dasm_State **Dst = &state; + + | lay sp , -8(sp) + | cefbr f0 , r2 + | cefbr f1 , r3 + | fidr f0 , f1 + | cfebr r2 ,0,f0 + | la sp, 8(sp) + | br r14 +} + +static void rsb(dasm_State *state) { + dasm_State **Dst = &state; + + | lay sp, -4(sp) + | lghi r3, 0x0706 + | lghi r4, 0 + | iill r4, 6 + | iilh r4, 7 + | st r4, 0(sp) + | lghi r2, 0 + | clm r3, 5, 0(sp) + | jne >1 + | lghi r2, 1 + |1: + | la sp, 4(sp) + | br r14 +} + +static void sqrt_rxe(dasm_State *state) +{ + dasm_State **Dst = &state; + + | lay sp , -8(sp) + | cefbr f0 , r2 + | stdy f0 , 0(sp) + | sqeb f0 ,0(r4,sp) + | cfebr r2 ,0, f0 + | la sp, 8(sp) + | br r14 + +} + +static void rxf(dasm_State *state) { + dasm_State **Dst = &state; + + | lay sp , -8(sp) + | cegbra f1 ,0, r2,0 + | cegbra f2 ,0,r3,0 + | ste f2 ,0(sp) + | maeb f1, f2, 0(sp) + | cfebr r2 ,0, f1 + | la sp, 8(sp) + | br r14 + +} + +typedef struct { + int64_t arg1; + int64_t arg2; + int64_t arg3; + void (*fn)(dasm_State *); + int64_t want; + const char *testname; +} test_table; + +test_table test[] = { + { 1, 2, 0, add, 3, "add"}, + {10, 5, 0, sub, 5, "sub"}, + { 2, 3, 0, mul, 6, "mul"}, + { 5, 7, 0, rx, 12298, "rx"}, + { 5, 7, 0, rxy, 10, "rxy"}, + { 2, 4, 0, lab, 32, "lab"}, + { 2, 4, 0, labg, 32, "labg"}, + { 2, 0, 0, add_imm16, 17, "imm16"}, + { 2, 0, 0, add_imm32, 16, "imm32"}, + { 7, 3, 0, save, 480, "save"}, + { 7, 3, 0, labmul, 21, "labmul0"}, + { 7, 0, 0, labmul, 0, "labmul1"}, + { 0, 0, 0, pc, 55, "pc"}, + { 2,12, 0, jmp_fwd, 12, "jmp_fwd"}, +// { 9,8, 0, add_rrd, 25, "add_rrd"}, +// { 2,4, 0, load_test, 4,"load_test"}, + {-1, 0, 0, ssa, 65535<<8, "ssa"}, + {-1, 0, 0, ssa_act, 65535<<8, "ssa_act"}, + {27, 0, 0, type, 27, "type"}, + { 0, 0, 0, sil, 23, "sil"}, + {15, 3,10, rrfe_rrd, 45, "rrfe_rrd"}, + { 0, 0, 0, rsb, 0, "rsb"}, + {12,10, 0, rre, 10, "rre"}, + {16,10, 0, sqrt_rxe, 4,"sqrt_rxe"}, + {16,10, 0, rxf, 116, "rxf"}, + { 4, 3, 0, test_mask, 1,"test_mask"} +}; + +static void *jitcode(dasm_State **state, size_t *size) +{ + int dasm_status = dasm_link(state, size); + assert(dasm_status == DASM_S_OK); + + void *ret = mmap(0, *size, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0); + dasm_encode(state, ret); + dasm_free(state); + + mprotect(ret, *size, PROT_READ | PROT_EXEC); + return (int *)ret; +} + +int main(int argc, char *argv[]) +{ + dasm_State *state; + for(int i = 0; i < sizeof(test)/sizeof(test[0]); i++) { + dasm_init(&state, 1); + void* labels[lab__MAX]; + dasm_setupglobal(&state, labels, lab__MAX); + dasm_setup(&state, actions); + test[i].fn(state); + size_t size; + int64_t (*fptr)(int64_t, int64_t, int64_t) = jitcode(&state, &size); + int64_t got = fptr(test[i].arg1, test[i].arg2, test[i].arg3); + + if (got != test[i].want) { + fprintf(stderr, "FAIL: test %s: want %ld, got %ld\n", test[i].testname, test[i].want, got); + exit(1); + } + munmap(fptr, size); + } + printf("all tests passed\n"); + return 0; +} + |