From 6707c9bdc82621c939e17541820f4a543125b38c Mon Sep 17 00:00:00 2001 From: Zoltan Herczeg Date: Wed, 12 Feb 2025 08:47:00 +0000 Subject: [PATCH] Add more buffer tests --- GNUmakefile | 2 +- sljit_src/sljitNativeARM_32.c | 12 +- sljit_src/sljitNativeARM_64.c | 12 +- sljit_src/sljitNativeARM_T2_32.c | 12 +- sljit_src/sljitNativeMIPS_common.c | 12 +- sljit_src/sljitNativeRISCV_common.c | 12 +- test_src/sljitTest.c | 260 +----------------- test_src/sljitTestBuffers.h | 401 ++++++++++++++++++++++++++++ 8 files changed, 448 insertions(+), 275 deletions(-) create mode 100644 test_src/sljitTestBuffers.h diff --git a/GNUmakefile b/GNUmakefile index dbb359e1..abbea242 100644 --- a/GNUmakefile +++ b/GNUmakefile @@ -77,7 +77,7 @@ $(BINDIR)/regexMain.o : $(REGEXDIR)/regexMain.c $(BINDIR)/.keep $(SLJIT_HEADERS) $(BINDIR)/regexJIT.o : $(REGEXDIR)/regexJIT.c $(BINDIR)/.keep $(SLJIT_HEADERS) $(REGEXDIR)/regexJIT.h $(CC) $(CPPFLAGS) $(REGEX_CFLAGS) -c -o $@ $(REGEXDIR)/regexJIT.c -$(BINDIR)/sljit_test: $(BINDIR)/.keep $(BINDIR)/sljitMain.o $(TESTDIR)/sljitTest.c $(SRCDIR)/sljitLir.c $(SLJIT_LIR_FILES) $(SLJIT_HEADERS) $(TESTDIR)/sljitConfigPre.h $(TESTDIR)/sljitConfigPost.h $(TESTDIR)/sljitTestCall.h $(TESTDIR)/sljitTestFloat.h $(TESTDIR)/sljitTestSimd.h +$(BINDIR)/sljit_test: $(BINDIR)/.keep $(BINDIR)/sljitMain.o $(TESTDIR)/sljitTest.c $(SRCDIR)/sljitLir.c $(SLJIT_LIR_FILES) $(SLJIT_HEADERS) $(TESTDIR)/sljitConfigPre.h $(TESTDIR)/sljitConfigPost.h $(TESTDIR)/sljitTestBuffers.h $(TESTDIR)/sljitTestCall.h $(TESTDIR)/sljitTestFloat.h $(TESTDIR)/sljitTestSimd.h $(CC) $(CPPFLAGS) -DSLJIT_HAVE_CONFIG_PRE=1 -I$(TESTDIR) $(CFLAGS) $(LDFLAGS) $(BINDIR)/sljitMain.o $(TESTDIR)/sljitTest.c $(SRCDIR)/sljitLir.c -o $@ -lm -lpthread $(EXTRA_LIBS) $(BINDIR)/regex_test: $(BINDIR)/.keep $(BINDIR)/regexMain.o $(BINDIR)/regexJIT.o $(BINDIR)/sljitLir.o diff --git a/sljit_src/sljitNativeARM_32.c b/sljit_src/sljitNativeARM_32.c index 3aa682d1..7d498cd7 100644 --- a/sljit_src/sljitNativeARM_32.c +++ b/sljit_src/sljitNativeARM_32.c @@ -2644,9 +2644,10 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_op_src(struct sljit_compiler *comp case SLJIT_FAST_RETURN: SLJIT_ASSERT(reg_map[TMP_REG2] == 14); - if (FAST_IS_REG(src)) - FAIL_IF(push_inst(compiler, MOV | RD(TMP_REG2) | RM(src))); - else + if (FAST_IS_REG(src)) { + if (src != TMP_REG2) + FAIL_IF(push_inst(compiler, MOV | RD(TMP_REG2) | RM(src))); + } else FAIL_IF(emit_op_mem(compiler, WORD_SIZE | LOAD_DATA, TMP_REG2, src, srcw, TMP_REG1)); return push_inst(compiler, BX | RM(TMP_REG2)); @@ -2676,8 +2677,11 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_op_dst(struct sljit_compiler *comp case SLJIT_FAST_ENTER: SLJIT_ASSERT(reg_map[TMP_REG2] == 14); - if (FAST_IS_REG(dst)) + if (FAST_IS_REG(dst)) { + if (dst == TMP_REG2) + return SLJIT_SUCCESS; return push_inst(compiler, MOV | RD(dst) | RM(TMP_REG2)); + } break; case SLJIT_GET_RETURN_ADDRESS: size = GET_SAVED_REGISTERS_SIZE(compiler->scratches, compiler->saveds - SLJIT_KEPT_SAVEDS_COUNT(compiler->options), 0); diff --git a/sljit_src/sljitNativeARM_64.c b/sljit_src/sljitNativeARM_64.c index b517b72f..043a90b6 100644 --- a/sljit_src/sljitNativeARM_64.c +++ b/sljit_src/sljitNativeARM_64.c @@ -1878,9 +1878,10 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_op_src(struct sljit_compiler *comp switch (op) { case SLJIT_FAST_RETURN: - if (FAST_IS_REG(src)) - FAIL_IF(push_inst(compiler, MOV | RD(TMP_LR) | RM(src))); - else + if (FAST_IS_REG(src)) { + if (src != TMP_LR) + FAIL_IF(push_inst(compiler, MOV | RD(TMP_LR) | RM(src))); + } else FAIL_IF(emit_op_mem(compiler, WORD_SIZE, TMP_LR, src, srcw, TMP_REG1)); return push_inst(compiler, RET | RN(TMP_LR)); @@ -1920,8 +1921,11 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_op_dst(struct sljit_compiler *comp switch (op) { case SLJIT_FAST_ENTER: - if (FAST_IS_REG(dst)) + if (FAST_IS_REG(dst)) { + if (dst == TMP_LR) + return SLJIT_SUCCESS; return push_inst(compiler, MOV | RD(dst) | RM(TMP_LR)); + } break; case SLJIT_GET_RETURN_ADDRESS: dst_r = FAST_IS_REG(dst) ? dst : TMP_REG1; diff --git a/sljit_src/sljitNativeARM_T2_32.c b/sljit_src/sljitNativeARM_T2_32.c index b4970b73..e942980e 100644 --- a/sljit_src/sljitNativeARM_T2_32.c +++ b/sljit_src/sljitNativeARM_T2_32.c @@ -2210,9 +2210,10 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_op_src(struct sljit_compiler *comp case SLJIT_FAST_RETURN: SLJIT_ASSERT(reg_map[TMP_REG2] == 14); - if (FAST_IS_REG(src)) - FAIL_IF(push_inst16(compiler, MOV | SET_REGS44(TMP_REG2, src))); - else + if (FAST_IS_REG(src)) { + if (src != TMP_REG2) + FAIL_IF(push_inst16(compiler, MOV | SET_REGS44(TMP_REG2, src))); + } else FAIL_IF(emit_op_mem(compiler, WORD_SIZE, TMP_REG2, src, srcw, TMP_REG2)); return push_inst16(compiler, BX | RN3(TMP_REG2)); @@ -2241,8 +2242,11 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_op_dst(struct sljit_compiler *comp case SLJIT_FAST_ENTER: SLJIT_ASSERT(reg_map[TMP_REG2] == 14); - if (FAST_IS_REG(dst)) + if (FAST_IS_REG(dst)) { + if (dst == TMP_REG2) + return SLJIT_SUCCESS; return push_inst16(compiler, MOV | SET_REGS44(dst, TMP_REG2)); + } break; case SLJIT_GET_RETURN_ADDRESS: size = GET_SAVED_REGISTERS_SIZE(compiler->scratches, compiler->saveds - SLJIT_KEPT_SAVEDS_COUNT(compiler->options), 0); diff --git a/sljit_src/sljitNativeMIPS_common.c b/sljit_src/sljitNativeMIPS_common.c index 4a90a741..146e4ecd 100644 --- a/sljit_src/sljitNativeMIPS_common.c +++ b/sljit_src/sljitNativeMIPS_common.c @@ -2805,9 +2805,10 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_op_src(struct sljit_compiler *comp switch (op) { case SLJIT_FAST_RETURN: - if (FAST_IS_REG(src)) - FAIL_IF(push_inst(compiler, ADDU_W | S(src) | TA(0) | DA(RETURN_ADDR_REG), RETURN_ADDR_REG)); - else + if (FAST_IS_REG(src)) { + if (DR(src) != RETURN_ADDR_REG) + FAIL_IF(push_inst(compiler, ADDU_W | S(src) | TA(0) | DA(RETURN_ADDR_REG), RETURN_ADDR_REG)); + } else FAIL_IF(emit_op_mem(compiler, WORD_DATA | LOAD_DATA, RETURN_ADDR_REG, src, srcw)); FAIL_IF(push_inst(compiler, JR | SA(RETURN_ADDR_REG), UNMOVABLE_INS)); @@ -2839,8 +2840,11 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_op_dst(struct sljit_compiler *comp switch (op) { case SLJIT_FAST_ENTER: - if (FAST_IS_REG(dst)) + if (FAST_IS_REG(dst)) { + if (DR(dst) == RETURN_ADDR_REG) + return SLJIT_SUCCESS; return push_inst(compiler, ADDU_W | SA(RETURN_ADDR_REG) | TA(0) | D(dst), UNMOVABLE_INS); + } break; case SLJIT_GET_RETURN_ADDRESS: dst_ar = DR(FAST_IS_REG(dst) ? dst : TMP_REG2); diff --git a/sljit_src/sljitNativeRISCV_common.c b/sljit_src/sljitNativeRISCV_common.c index 6a089733..2e32f215 100644 --- a/sljit_src/sljitNativeRISCV_common.c +++ b/sljit_src/sljitNativeRISCV_common.c @@ -2864,9 +2864,10 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_op_src(struct sljit_compiler *comp switch (op) { case SLJIT_FAST_RETURN: - if (FAST_IS_REG(src)) - FAIL_IF(push_inst(compiler, ADDI | RD(RETURN_ADDR_REG) | RS1(src) | IMM_I(0))); - else + if (FAST_IS_REG(src)) { + if (src != RETURN_ADDR_REG) + FAIL_IF(push_inst(compiler, ADDI | RD(RETURN_ADDR_REG) | RS1(src) | IMM_I(0))); + } else FAIL_IF(emit_op_mem(compiler, WORD_DATA | LOAD_DATA, RETURN_ADDR_REG, src, srcw)); return push_inst(compiler, JALR | RD(TMP_ZERO) | RS1(RETURN_ADDR_REG) | IMM_I(0)); @@ -2893,8 +2894,11 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_op_dst(struct sljit_compiler *comp switch (op) { case SLJIT_FAST_ENTER: - if (FAST_IS_REG(dst)) + if (FAST_IS_REG(dst)) { + if (dst == RETURN_ADDR_REG) + return SLJIT_SUCCESS; return push_inst(compiler, ADDI | RD(dst) | RS1(RETURN_ADDR_REG) | IMM_I(0)); + } SLJIT_ASSERT(RETURN_ADDR_REG == TMP_REG2); break; diff --git a/test_src/sljitTest.c b/test_src/sljitTest.c index 8badc53f..e0b761fc 100644 --- a/test_src/sljitTest.c +++ b/test_src/sljitTest.c @@ -9628,260 +9628,10 @@ static void test78(void) successful_tests++; } -static void test79(void) -{ - /* Test aligned labels. */ - executable_code code; - struct sljit_compiler *compiler = sljit_create_compiler(NULL); - struct sljit_label *label[12]; - struct sljit_jump *jump[3]; - sljit_s32 i; - sljit_uw buf[8]; - sljit_uw addr[2]; - - if (verbose) - printf("Run test79\n"); - - for (i = 0; i < 8; i++) - buf[i] = ~(sljit_uw)0; - - FAILED(!compiler, "cannot create compiler\n"); - - sljit_emit_enter(compiler, 0, SLJIT_ARGS1V(P), 5, 5, 2 * sizeof(sljit_sw)); - - /* buf[0] */ - sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R1, 0, SLJIT_S0, 0); - jump[0] = sljit_emit_mov_addr(compiler, SLJIT_MOV_ADDR, SLJIT_MEM1(SLJIT_R1), 0); - - sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_IMM, 0); - /* buf[1] */ - sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S0), sizeof(sljit_sw), SLJIT_IMM, 85603); - - label[0] = sljit_emit_aligned_label(compiler, SLJIT_LABEL_ALIGN_16, NULL); - label[1] = sljit_emit_label(compiler); - /* buf[2] */ - sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S0), 2 * sizeof(sljit_sw), SLJIT_R0, 0); - - label[2] = sljit_emit_label(compiler); - label[3] = sljit_emit_aligned_label(compiler, SLJIT_LABEL_ALIGN_16, NULL); - sljit_emit_op2(compiler, SLJIT_ADD, SLJIT_R0, 0, SLJIT_R0, 0, SLJIT_IMM, 1000); - sljit_set_label(sljit_emit_cmp(compiler, SLJIT_LESS_EQUAL, SLJIT_R0, 0, SLJIT_IMM, 17000), label[1]); - - label[4] = sljit_emit_aligned_label(compiler, SLJIT_LABEL_ALIGN_2, NULL); - sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R4, 0, SLJIT_IMM, 46789); - - /* The SLJIT_JUMP_IF_NON_ZERO is the default. */ - jump[1] = sljit_emit_op2cmpz(compiler, SLJIT_SUB, SLJIT_S1, 0, SLJIT_R4, 0, SLJIT_IMM, 578); - sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_MEM0(), 0); - - label[5] = sljit_emit_aligned_label(compiler, SLJIT_LABEL_ALIGN_8, NULL); - label[6] = sljit_emit_label(compiler); - sljit_set_label(jump[1], label[6]); - - /* buf[3] */ - sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S0), 3 * sizeof(sljit_sw), SLJIT_R4, 0); - /* buf[4] */ - sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S0), 4 * sizeof(sljit_sw), SLJIT_S1, 0); - - sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R1, 0, SLJIT_S0, 0); - sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_S1, 0, SLJIT_IMM, (5 * sizeof(sljit_sw)) >> 1); - /* buf[5] */ - sljit_set_label(sljit_emit_mov_addr(compiler, SLJIT_MOV_ADDR, SLJIT_MEM2(SLJIT_R1, SLJIT_S1), 1), label[3]); - - label[7] = sljit_emit_aligned_label(compiler, SLJIT_LABEL_ALIGN_4, NULL); - sljit_set_label(jump[0], label[7]); - sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R1, 0, SLJIT_IMM, 69743); - - label[8] = sljit_emit_aligned_label(compiler, SLJIT_LABEL_ALIGN_1, NULL); - /* buf[6] */ - sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S0), 6 * sizeof(sljit_sw), SLJIT_R1, 0); - - label[9] = sljit_emit_aligned_label(compiler, SLJIT_LABEL_ALIGN_16, NULL); - jump[3] = sljit_emit_jump(compiler, SLJIT_JUMP); - sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_MEM0(), 0); - sljit_set_label(jump[3], sljit_emit_label(compiler)); - - /* buf[7] */ - sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S0), 7 * sizeof(sljit_sw), SLJIT_IMM, 50923); - - sljit_emit_return_void(compiler); - - label[10] = sljit_emit_aligned_label(compiler, SLJIT_LABEL_ALIGN_8, NULL); - sljit_emit_op0(compiler, SLJIT_NOP); - sljit_emit_op0(compiler, SLJIT_NOP); - label[11] = sljit_emit_aligned_label(compiler, SLJIT_LABEL_ALIGN_8, NULL); - - code.code = sljit_generate_code(compiler, 0, NULL); - CHECK(compiler); - - FAILED((sljit_get_label_abs_addr(label[0]) & 0xf) != 0, "test79 case 1 failed\n"); - FAILED(label[2] == label[3], "test79 case 2 failed\n"); - FAILED((sljit_get_label_abs_addr(label[3]) & 0xf) != 0, "test79 case 3 failed\n"); - FAILED((sljit_get_label_abs_addr(label[4]) & 0x1) != 0, "test79 case 4 failed\n"); - FAILED((sljit_get_label_abs_addr(label[5]) & 0x7) != 0, "test79 case 5 failed\n"); - FAILED(label[5] != label[6], "test79 case 6 failed\n"); - FAILED((sljit_get_label_abs_addr(label[7]) & 0x3) != 0, "test79 case 7 failed\n"); - FAILED(label[7] == label[8], "test79 case 8 failed\n"); - FAILED((sljit_get_label_abs_addr(label[9]) & 0xf) != 0, "test79 case 9 failed\n"); - FAILED((sljit_get_label_abs_addr(label[10]) & 0x7) != 0, "test79 case 10 failed\n"); - FAILED((sljit_get_label_abs_addr(label[11]) & 0x7) != 0, "test79 case 11 failed\n"); - - addr[0] = sljit_get_label_addr(label[7]); - addr[1] = sljit_get_label_addr(label[3]); - - sljit_free_compiler(compiler); - - code.func1((sljit_sw)&buf); - - FAILED(buf[0] != addr[0], "test79 case 12 failed\n"); - FAILED(buf[1] != 85603, "test79 case 13 failed\n"); - FAILED(buf[2] != 17000, "test79 case 14 failed\n"); - FAILED(buf[3] != 46789, "test79 case 15 failed\n"); - FAILED(buf[4] != 46211, "test79 case 16 failed\n"); - FAILED(buf[5] != addr[1], "test79 case 17 failed\n"); - FAILED(buf[6] != 69743, "test79 case 18 failed\n"); - FAILED(buf[7] != 50923, "test79 case 19 failed\n"); - - sljit_free_code(code.code, NULL); - successful_tests++; -} - -static void test80(void) -{ - /* Test read-only buffers. */ - executable_code code; - struct sljit_compiler *compiler = sljit_create_compiler(NULL); - struct sljit_read_only_buffer ro_buffers[4]; - struct sljit_jump *jump[4]; - struct sljit_label *label; - sljit_sw executable_offset; - sljit_sw buf[3]; - sljit_sw *ptr_sw; - sljit_u8 *ptr_u8; - sljit_s32 *ptr_s32; - - if (verbose) - printf("Run test80\n"); - - buf[0] = -1; - buf[1] = -1; - buf[2] = -1; - - ro_buffers[0].next = ro_buffers + 1; - ro_buffers[0].size = 8 * sizeof(sljit_sw); - ro_buffers[1].next = ro_buffers + 2; - ro_buffers[1].size = 0; - ro_buffers[2].next = NULL; - ro_buffers[2].size = 1; - ro_buffers[3].next = NULL; - ro_buffers[3].size = 5 * 4; - - sljit_emit_enter(compiler, 0, SLJIT_ARGS3V(P, P, P), 5, 5, 2 * sizeof(sljit_sw)); - - jump[0] = sljit_emit_cmp(compiler, SLJIT_EQUAL, SLJIT_S1, 0, SLJIT_IMM, -1); - - jump[1] = sljit_emit_mov_addr(compiler, SLJIT_MOV_ABS_ADDR, SLJIT_R0, 0); - /* buf[0] */ - sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S0), 0, SLJIT_MEM2(SLJIT_R0, SLJIT_S1), SLJIT_WORD_SHIFT); - - jump[2] = sljit_emit_mov_addr(compiler, SLJIT_MOV_ABS_ADDR, SLJIT_R1, 0); - sljit_emit_op1(compiler, SLJIT_MOV_U8, SLJIT_TMP_DEST_REG, 0, SLJIT_MEM1(SLJIT_R1), 0); - /* buf[1] */ - sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S0), sizeof(sljit_sw), SLJIT_TMP_DEST_REG, 0); - - jump[3] = sljit_emit_jump(compiler, SLJIT_JUMP); - sljit_set_label(jump[0], sljit_emit_label(compiler)); - - label = sljit_emit_aligned_label(compiler, SLJIT_LABEL_ALIGN_SW, ro_buffers); - sljit_set_label(jump[1], ro_buffers[0].u.label); - sljit_set_label(jump[2], ro_buffers[2].u.label); - - /* buf[0] */ - sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S0), 0, SLJIT_IMM, 58961); - - sljit_set_label(jump[3], sljit_emit_label(compiler)); - - jump[0] = sljit_emit_cmp(compiler, SLJIT_EQUAL, SLJIT_S2, 0, SLJIT_IMM, -1); - - jump[1] = sljit_emit_mov_addr(compiler, SLJIT_MOV_ABS_ADDR, SLJIT_R0, 0); - sljit_emit_op1(compiler, SLJIT_MOV_S32, SLJIT_R1, 0, SLJIT_MEM2(SLJIT_R0, SLJIT_S2), 2); - /* buf[2] */ - sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S0), 2 * sizeof(sljit_sw), SLJIT_R1, 0); - - jump[2] = sljit_emit_jump(compiler, SLJIT_JUMP); - sljit_set_label(jump[0], sljit_emit_label(compiler)); - - sljit_emit_aligned_label(compiler, SLJIT_LABEL_ALIGN_4, ro_buffers + 3); - sljit_set_label(jump[1], ro_buffers[3].u.label); - - /* buf[2] */ - sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S0), 2 * sizeof(sljit_sw), SLJIT_IMM, 63901); - - sljit_set_label(jump[2], sljit_emit_label(compiler)); - - sljit_emit_return_void(compiler); - - code.code = sljit_generate_code(compiler, 0, NULL); - CHECK(compiler); - - executable_offset = sljit_get_executable_offset(compiler); - FAILED(label != ro_buffers[0].u.label, "test80 case 1 failed\n"); - FAILED(ro_buffers[1].u.label != ro_buffers[2].u.label, "test80 case 2 failed\n"); - ro_buffers[0].u.addr = sljit_get_label_abs_addr(ro_buffers[0].u.label); - ro_buffers[2].u.addr = sljit_get_label_abs_addr(ro_buffers[2].u.label); - ro_buffers[3].u.addr = sljit_get_label_abs_addr(ro_buffers[3].u.label); - FAILED((ro_buffers[0].u.addr & ((1 << SLJIT_LABEL_ALIGN_SW) - 1)) != 0, "test80 case 3 failed\n"); - FAILED((ro_buffers[3].u.addr & 0x3) != 0, "test80 case 4 failed\n"); - - sljit_free_compiler(compiler); - - code.func3((sljit_sw)&buf, -1, -1); - - FAILED(buf[0] != 58961, "test80 case 4 failed\n"); - FAILED(buf[1] != -1, "test80 case 5 failed\n"); - FAILED(buf[2] != 63901, "test80 case 6 failed\n"); - - ptr_sw = (sljit_sw*)sljit_read_only_buffer_start_writing(ro_buffers[0].u.addr, ro_buffers[0].size, executable_offset); - ptr_sw[0] = 85372; - ptr_sw[4] = -92714; - ptr_sw[7] = 60824; - sljit_read_only_buffer_end_writing(ro_buffers[0].u.addr, ro_buffers[0].size, executable_offset); - - ptr_u8 = (sljit_u8*)sljit_read_only_buffer_start_writing(ro_buffers[2].u.addr, ro_buffers[2].size, executable_offset); - ptr_u8[0] = 174; - sljit_read_only_buffer_end_writing(ro_buffers[2].u.addr, ro_buffers[2].size, executable_offset); - - ptr_s32 = (sljit_s32*)sljit_read_only_buffer_start_writing(ro_buffers[3].u.addr, ro_buffers[3].size, executable_offset); - ptr_s32[0] = -82561; - ptr_s32[1] = 73610; - ptr_s32[4] = -38219; - sljit_read_only_buffer_end_writing(ro_buffers[3].u.addr, ro_buffers[3].size, executable_offset); - - code.func3((sljit_sw)&buf, 0, 0); - - FAILED(buf[0] != 85372, "test80 case 7 failed\n"); - FAILED(buf[1] != 174, "test80 case 8 failed\n"); - FAILED(buf[2] != -82561, "test80 case 9 failed\n"); - - code.func3((sljit_sw)&buf, 4, 1); - - FAILED(buf[0] != -92714, "test80 case 10 failed\n"); - FAILED(buf[1] != 174, "test80 case 11 failed\n"); - FAILED(buf[2] != 73610, "test80 case 12 failed\n"); - - code.func3((sljit_sw)&buf, 7, 4); - - FAILED(buf[0] != 60824, "test80 case 13 failed\n"); - FAILED(buf[1] != 174, "test80 case 14 failed\n"); - FAILED(buf[2] != -38219, "test80 case 15 failed\n"); - - sljit_free_code(code.code, NULL); - successful_tests++; -} - #include "sljitTestCall.h" #include "sljitTestFloat.h" #include "sljitTestSimd.h" +#include "sljitTestBuffers.h" #include "sljitTestSerialize.h" int sljit_test(int argc, char* argv[]) @@ -9975,8 +9725,6 @@ int sljit_test(int argc, char* argv[]) test76(); test77(); test78(); - test79(); - test80(); if (verbose) printf("---- Call tests ----\n"); @@ -10050,6 +9798,10 @@ int sljit_test(int argc, char* argv[]) if (verbose) printf("---- Serialize tests ----\n"); + test_buffer1(); + test_buffer2(); + test_buffer3(); + test_serialize1(); test_serialize2(); test_serialize3(); @@ -10059,7 +9811,7 @@ int sljit_test(int argc, char* argv[]) sljit_free_unused_memory_exec(); #endif /* SLJIT_EXECUTABLE_ALLOCATOR */ -# define TEST_COUNT 131 +# define TEST_COUNT 132 printf("SLJIT tests: "); if (successful_tests == TEST_COUNT) diff --git a/test_src/sljitTestBuffers.h b/test_src/sljitTestBuffers.h new file mode 100644 index 00000000..3920c29d --- /dev/null +++ b/test_src/sljitTestBuffers.h @@ -0,0 +1,401 @@ +/* + * Stack-less Just-In-Time compiler + * + * Copyright Zoltan Herczeg (hzmester@freemail.hu). All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, are + * permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this list of + * conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, this list + * of conditions and the following disclaimer in the documentation and/or other materials + * provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER(S) AND CONTRIBUTORS ``AS IS'' AND ANY + * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT + * SHALL THE COPYRIGHT HOLDER(S) OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED + * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR + * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +static void test_buffer1(void) +{ + /* Test aligned labels. */ + executable_code code; + struct sljit_compiler *compiler = sljit_create_compiler(NULL); + struct sljit_label *label[12]; + struct sljit_jump *jump[3]; + sljit_s32 i; + sljit_uw buf[8]; + sljit_uw addr[2]; + + if (verbose) + printf("Run test_buffer1\n"); + + for (i = 0; i < 8; i++) + buf[i] = ~(sljit_uw)0; + + FAILED(!compiler, "cannot create compiler\n"); + + sljit_emit_enter(compiler, 0, SLJIT_ARGS1V(P), 5, 5, 2 * sizeof(sljit_sw)); + + /* buf[0] */ + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R1, 0, SLJIT_S0, 0); + jump[0] = sljit_emit_mov_addr(compiler, SLJIT_MOV_ADDR, SLJIT_MEM1(SLJIT_R1), 0); + + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_IMM, 0); + /* buf[1] */ + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S0), sizeof(sljit_sw), SLJIT_IMM, 85603); + + label[0] = sljit_emit_aligned_label(compiler, SLJIT_LABEL_ALIGN_16, NULL); + label[1] = sljit_emit_label(compiler); + /* buf[2] */ + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S0), 2 * sizeof(sljit_sw), SLJIT_R0, 0); + + label[2] = sljit_emit_label(compiler); + label[3] = sljit_emit_aligned_label(compiler, SLJIT_LABEL_ALIGN_16, NULL); + sljit_emit_op2(compiler, SLJIT_ADD, SLJIT_R0, 0, SLJIT_R0, 0, SLJIT_IMM, 1000); + sljit_set_label(sljit_emit_cmp(compiler, SLJIT_LESS_EQUAL, SLJIT_R0, 0, SLJIT_IMM, 17000), label[1]); + + label[4] = sljit_emit_aligned_label(compiler, SLJIT_LABEL_ALIGN_2, NULL); + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R4, 0, SLJIT_IMM, 46789); + + /* The SLJIT_JUMP_IF_NON_ZERO is the default. */ + jump[1] = sljit_emit_op2cmpz(compiler, SLJIT_SUB, SLJIT_S1, 0, SLJIT_R4, 0, SLJIT_IMM, 578); + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_MEM0(), 0); + + label[5] = sljit_emit_aligned_label(compiler, SLJIT_LABEL_ALIGN_8, NULL); + label[6] = sljit_emit_label(compiler); + sljit_set_label(jump[1], label[6]); + + /* buf[3] */ + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S0), 3 * sizeof(sljit_sw), SLJIT_R4, 0); + /* buf[4] */ + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S0), 4 * sizeof(sljit_sw), SLJIT_S1, 0); + + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R1, 0, SLJIT_S0, 0); + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_S1, 0, SLJIT_IMM, (5 * sizeof(sljit_sw)) >> 1); + /* buf[5] */ + sljit_set_label(sljit_emit_mov_addr(compiler, SLJIT_MOV_ADDR, SLJIT_MEM2(SLJIT_R1, SLJIT_S1), 1), label[3]); + + label[7] = sljit_emit_aligned_label(compiler, SLJIT_LABEL_ALIGN_4, NULL); + sljit_set_label(jump[0], label[7]); + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R1, 0, SLJIT_IMM, 69743); + + label[8] = sljit_emit_aligned_label(compiler, SLJIT_LABEL_ALIGN_1, NULL); + /* buf[6] */ + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S0), 6 * sizeof(sljit_sw), SLJIT_R1, 0); + + label[9] = sljit_emit_aligned_label(compiler, SLJIT_LABEL_ALIGN_16, NULL); + jump[3] = sljit_emit_jump(compiler, SLJIT_JUMP); + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_MEM0(), 0); + sljit_set_label(jump[3], sljit_emit_label(compiler)); + + /* buf[7] */ + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S0), 7 * sizeof(sljit_sw), SLJIT_IMM, 50923); + + sljit_emit_return_void(compiler); + + label[10] = sljit_emit_aligned_label(compiler, SLJIT_LABEL_ALIGN_8, NULL); + sljit_emit_op0(compiler, SLJIT_NOP); + sljit_emit_op0(compiler, SLJIT_NOP); + label[11] = sljit_emit_aligned_label(compiler, SLJIT_LABEL_ALIGN_8, NULL); + + code.code = sljit_generate_code(compiler, 0, NULL); + CHECK(compiler); + + FAILED((sljit_get_label_abs_addr(label[0]) & 0xf) != 0, "test_buffer1 case 1 failed\n"); + FAILED(label[2] == label[3], "test_buffer1 case 2 failed\n"); + FAILED((sljit_get_label_abs_addr(label[3]) & 0xf) != 0, "test_buffer1 case 3 failed\n"); + FAILED((sljit_get_label_abs_addr(label[4]) & 0x1) != 0, "test_buffer1 case 4 failed\n"); + FAILED((sljit_get_label_abs_addr(label[5]) & 0x7) != 0, "test_buffer1 case 5 failed\n"); + FAILED(label[5] != label[6], "test_buffer1 case 6 failed\n"); + FAILED((sljit_get_label_abs_addr(label[7]) & 0x3) != 0, "test_buffer1 case 7 failed\n"); + FAILED(label[7] == label[8], "test_buffer1 case 8 failed\n"); + FAILED((sljit_get_label_abs_addr(label[9]) & 0xf) != 0, "test_buffer1 case 9 failed\n"); + FAILED((sljit_get_label_abs_addr(label[10]) & 0x7) != 0, "test_buffer1 case 10 failed\n"); + FAILED((sljit_get_label_abs_addr(label[11]) & 0x7) != 0, "test_buffer1 case 11 failed\n"); + + addr[0] = sljit_get_label_addr(label[7]); + addr[1] = sljit_get_label_addr(label[3]); + + sljit_free_compiler(compiler); + + code.func1((sljit_sw)&buf); + + FAILED(buf[0] != addr[0], "test_buffer1 case 12 failed\n"); + FAILED(buf[1] != 85603, "test_buffer1 case 13 failed\n"); + FAILED(buf[2] != 17000, "test_buffer1 case 14 failed\n"); + FAILED(buf[3] != 46789, "test_buffer1 case 15 failed\n"); + FAILED(buf[4] != 46211, "test_buffer1 case 16 failed\n"); + FAILED(buf[5] != addr[1], "test_buffer1 case 17 failed\n"); + FAILED(buf[6] != 69743, "test_buffer1 case 18 failed\n"); + FAILED(buf[7] != 50923, "test_buffer1 case 19 failed\n"); + + sljit_free_code(code.code, NULL); + successful_tests++; +} + +static void test_buffer2(void) +{ + /* Test read-only buffers. */ + executable_code code; + struct sljit_compiler *compiler = sljit_create_compiler(NULL); + struct sljit_read_only_buffer ro_buffers[4]; + struct sljit_jump *jump[4]; + struct sljit_label *label; + sljit_sw executable_offset; + sljit_sw buf[3]; + sljit_sw *ptr_sw; + sljit_u8 *ptr_u8; + sljit_s32 *ptr_s32; + + if (verbose) + printf("Run test_buffer2\n"); + + buf[0] = -1; + buf[1] = -1; + buf[2] = -1; + + ro_buffers[0].next = ro_buffers + 1; + ro_buffers[0].size = 8 * sizeof(sljit_sw); + ro_buffers[1].next = ro_buffers + 2; + ro_buffers[1].size = 0; + ro_buffers[2].next = NULL; + ro_buffers[2].size = 1; + ro_buffers[3].next = NULL; + ro_buffers[3].size = 5 * 4; + + sljit_emit_enter(compiler, 0, SLJIT_ARGS3V(P, P, P), 5, 5, 2 * sizeof(sljit_sw)); + + jump[0] = sljit_emit_cmp(compiler, SLJIT_EQUAL, SLJIT_S1, 0, SLJIT_IMM, -1); + + jump[1] = sljit_emit_mov_addr(compiler, SLJIT_MOV_ABS_ADDR, SLJIT_R0, 0); + /* buf[0] */ + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S0), 0, SLJIT_MEM2(SLJIT_R0, SLJIT_S1), SLJIT_WORD_SHIFT); + + jump[2] = sljit_emit_mov_addr(compiler, SLJIT_MOV_ABS_ADDR, SLJIT_R1, 0); + sljit_emit_op1(compiler, SLJIT_MOV_U8, SLJIT_TMP_DEST_REG, 0, SLJIT_MEM1(SLJIT_R1), 0); + /* buf[1] */ + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S0), sizeof(sljit_sw), SLJIT_TMP_DEST_REG, 0); + + jump[3] = sljit_emit_jump(compiler, SLJIT_JUMP); + sljit_set_label(jump[0], sljit_emit_label(compiler)); + + label = sljit_emit_aligned_label(compiler, SLJIT_LABEL_ALIGN_SW, ro_buffers); + sljit_set_label(jump[1], ro_buffers[0].u.label); + sljit_set_label(jump[2], ro_buffers[2].u.label); + + /* buf[0] */ + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S0), 0, SLJIT_IMM, 58961); + + sljit_set_label(jump[3], sljit_emit_label(compiler)); + + jump[0] = sljit_emit_cmp(compiler, SLJIT_EQUAL, SLJIT_S2, 0, SLJIT_IMM, -1); + + jump[1] = sljit_emit_mov_addr(compiler, SLJIT_MOV_ABS_ADDR, SLJIT_R0, 0); + sljit_emit_op1(compiler, SLJIT_MOV_S32, SLJIT_R1, 0, SLJIT_MEM2(SLJIT_R0, SLJIT_S2), 2); + /* buf[2] */ + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S0), 2 * sizeof(sljit_sw), SLJIT_R1, 0); + + jump[2] = sljit_emit_jump(compiler, SLJIT_JUMP); + sljit_set_label(jump[0], sljit_emit_label(compiler)); + + sljit_emit_aligned_label(compiler, SLJIT_LABEL_ALIGN_4, ro_buffers + 3); + sljit_set_label(jump[1], ro_buffers[3].u.label); + + /* buf[2] */ + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S0), 2 * sizeof(sljit_sw), SLJIT_IMM, 63901); + + sljit_set_label(jump[2], sljit_emit_label(compiler)); + + sljit_emit_return_void(compiler); + + code.code = sljit_generate_code(compiler, 0, NULL); + CHECK(compiler); + + executable_offset = sljit_get_executable_offset(compiler); + FAILED(label != ro_buffers[0].u.label, "test_buffer2 case 1 failed\n"); + FAILED(ro_buffers[1].u.label != ro_buffers[2].u.label, "test_buffer2 case 2 failed\n"); + ro_buffers[0].u.addr = sljit_get_label_abs_addr(ro_buffers[0].u.label); + ro_buffers[2].u.addr = sljit_get_label_abs_addr(ro_buffers[2].u.label); + ro_buffers[3].u.addr = sljit_get_label_abs_addr(ro_buffers[3].u.label); + FAILED((ro_buffers[0].u.addr & ((1 << SLJIT_LABEL_ALIGN_SW) - 1)) != 0, "test_buffer2 case 3 failed\n"); + FAILED((ro_buffers[3].u.addr & 0x3) != 0, "test_buffer2 case 4 failed\n"); + + sljit_free_compiler(compiler); + + code.func3((sljit_sw)&buf, -1, -1); + + FAILED(buf[0] != 58961, "test_buffer2 case 4 failed\n"); + FAILED(buf[1] != -1, "test_buffer2 case 5 failed\n"); + FAILED(buf[2] != 63901, "test_buffer2 case 6 failed\n"); + + ptr_sw = (sljit_sw*)sljit_read_only_buffer_start_writing(ro_buffers[0].u.addr, ro_buffers[0].size, executable_offset); + ptr_sw[0] = 85372; + ptr_sw[4] = -92714; + ptr_sw[7] = 60824; + sljit_read_only_buffer_end_writing(ro_buffers[0].u.addr, ro_buffers[0].size, executable_offset); + + ptr_u8 = (sljit_u8*)sljit_read_only_buffer_start_writing(ro_buffers[2].u.addr, ro_buffers[2].size, executable_offset); + ptr_u8[0] = 174; + sljit_read_only_buffer_end_writing(ro_buffers[2].u.addr, ro_buffers[2].size, executable_offset); + + ptr_s32 = (sljit_s32*)sljit_read_only_buffer_start_writing(ro_buffers[3].u.addr, ro_buffers[3].size, executable_offset); + ptr_s32[0] = -82561; + ptr_s32[1] = 73610; + ptr_s32[4] = -38219; + sljit_read_only_buffer_end_writing(ro_buffers[3].u.addr, ro_buffers[3].size, executable_offset); + + code.func3((sljit_sw)&buf, 0, 0); + + FAILED(buf[0] != 85372, "test_buffer2 case 7 failed\n"); + FAILED(buf[1] != 174, "test_buffer2 case 8 failed\n"); + FAILED(buf[2] != -82561, "test_buffer2 case 9 failed\n"); + + code.func3((sljit_sw)&buf, 4, 1); + + FAILED(buf[0] != -92714, "test_buffer2 case 10 failed\n"); + FAILED(buf[1] != 174, "test_buffer2 case 11 failed\n"); + FAILED(buf[2] != 73610, "test_buffer2 case 12 failed\n"); + + code.func3((sljit_sw)&buf, 7, 4); + + FAILED(buf[0] != 60824, "test_buffer2 case 13 failed\n"); + FAILED(buf[1] != 174, "test_buffer2 case 14 failed\n"); + FAILED(buf[2] != -38219, "test_buffer2 case 15 failed\n"); + + sljit_free_code(code.code, NULL); + successful_tests++; +} + +static void test_buffer3(void) +{ + /* Test read-only buffers. */ + executable_code code; + struct sljit_compiler *compiler = sljit_create_compiler(NULL); + struct sljit_read_only_buffer ro_buffers[2]; + struct sljit_jump *jump[4]; + struct sljit_label *label[8]; + sljit_sw executable_offset; + sljit_sw buf[2]; + sljit_uw *ptr_uw; + + if (verbose) + printf("Run test_buffer3\n"); + + ro_buffers[0].next = ro_buffers + 1; + ro_buffers[0].size = 4 * sizeof(sljit_sw); + ro_buffers[1].next = NULL; + ro_buffers[1].size = 3 * sizeof(sljit_sw); + + sljit_emit_enter(compiler, 0, SLJIT_ARGS3V(P, P, P), 5, 5, 2 * sizeof(sljit_sw)); + + jump[0] = sljit_emit_mov_addr(compiler, SLJIT_MOV_ABS_ADDR, SLJIT_TMP_MEM_REG, 0); + sljit_emit_ijump(compiler, SLJIT_JUMP, SLJIT_MEM2(SLJIT_TMP_MEM_REG, SLJIT_S1), SLJIT_WORD_SHIFT); + + label[0] = sljit_emit_label(compiler); + /* buf[0] */ + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S0), 0, SLJIT_IMM, 83974); + jump[1] = sljit_emit_jump(compiler, SLJIT_JUMP); + + label[1] = sljit_emit_label(compiler); + /* buf[0] */ + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S0), 0, SLJIT_IMM, 65803); + jump[2] = sljit_emit_jump(compiler, SLJIT_JUMP); + + label[2] = sljit_emit_label(compiler); + /* buf[0] */ + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S0), 0, SLJIT_IMM, -38405); + jump[3] = sljit_emit_jump(compiler, SLJIT_JUMP); + + label[3] = sljit_emit_label(compiler); + /* buf[0] */ + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S0), 0, SLJIT_IMM, 74198); + + label[4] = sljit_emit_label(compiler); + sljit_set_label(jump[1], label[4]); + sljit_set_label(jump[2], label[4]); + sljit_set_label(jump[3], label[4]); + + jump[1] = sljit_emit_mov_addr(compiler, SLJIT_MOV_ABS_ADDR, SLJIT_TMP_MEM_REG, 0); + sljit_emit_ijump(compiler, SLJIT_FAST_CALL, SLJIT_MEM2(SLJIT_TMP_MEM_REG, SLJIT_S2), 0); + + sljit_emit_return_void(compiler); + + label[4] = sljit_emit_label(compiler); + sljit_emit_op_dst(compiler, SLJIT_FAST_ENTER, SLJIT_TMP_DEST_REG, 0); + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_IMM, 63891); + /* buf[1] */ + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S0), sizeof(sljit_sw), SLJIT_R0, 0); + sljit_emit_op_src(compiler, SLJIT_FAST_RETURN, SLJIT_TMP_DEST_REG, 0); + + label[5] = sljit_emit_label(compiler); + sljit_emit_op_dst(compiler, SLJIT_FAST_ENTER, SLJIT_TMP_DEST_REG, 0); + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R1, 0, SLJIT_IMM, -27019); + /* buf[1] */ + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S0), sizeof(sljit_sw), SLJIT_R1, 0); + sljit_emit_op_src(compiler, SLJIT_FAST_RETURN, SLJIT_TMP_DEST_REG, 0); + + label[6] = sljit_emit_label(compiler); + sljit_emit_op_dst(compiler, SLJIT_FAST_ENTER, SLJIT_TMP_DEST_REG, 0); + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R2, 0, SLJIT_IMM, 95486); + /* buf[1] */ + sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S0), sizeof(sljit_sw), SLJIT_R2, 0); + sljit_emit_op_src(compiler, SLJIT_FAST_RETURN, SLJIT_TMP_DEST_REG, 0); + + label[7] = sljit_emit_aligned_label(compiler, SLJIT_LABEL_ALIGN_SW, ro_buffers); + sljit_set_label(jump[0], ro_buffers[0].u.label); + sljit_set_label(jump[1], ro_buffers[1].u.label); + + code.code = sljit_generate_code(compiler, 0, NULL); + CHECK(compiler); + + executable_offset = sljit_get_executable_offset(compiler); + ro_buffers[0].u.addr = sljit_get_label_abs_addr(ro_buffers[0].u.label); + ro_buffers[1].u.addr = sljit_get_label_abs_addr(ro_buffers[1].u.label); + + ptr_uw = (sljit_uw*)sljit_read_only_buffer_start_writing(ro_buffers[0].u.addr, ro_buffers[0].size, executable_offset); + ptr_uw[0] = sljit_get_label_addr(label[0]); + ptr_uw[1] = sljit_get_label_addr(label[1]); + ptr_uw[2] = sljit_get_label_addr(label[2]); + ptr_uw[3] = sljit_get_label_addr(label[3]); + sljit_read_only_buffer_end_writing(ro_buffers[0].u.addr, ro_buffers[0].size, executable_offset); + + ptr_uw = (sljit_uw*)sljit_read_only_buffer_start_writing(ro_buffers[1].u.addr, ro_buffers[1].size, executable_offset); + ptr_uw[0] = sljit_get_label_addr(label[4]); + ptr_uw[1] = sljit_get_label_addr(label[5]); + ptr_uw[2] = sljit_get_label_addr(label[6]); + sljit_read_only_buffer_end_writing(ro_buffers[1].u.addr, ro_buffers[1].size, executable_offset); + + sljit_free_compiler(compiler); + + code.func3((sljit_sw)&buf, 0, 0); + + FAILED(buf[0] != 83974, "test_buffer2 case 1 failed\n"); + FAILED(buf[1] != 63891, "test_buffer2 case 2 failed\n"); + + code.func3((sljit_sw)&buf, 3, sizeof(sljit_uw)); + + FAILED(buf[0] != 74198, "test_buffer2 case 3 failed\n"); + FAILED(buf[1] != -27019, "test_buffer2 case 4 failed\n"); + + code.func3((sljit_sw)&buf, 1, 2 * sizeof(sljit_uw)); + + FAILED(buf[0] != 65803, "test_buffer2 case 5 failed\n"); + FAILED(buf[1] != 95486, "test_buffer2 case 6 failed\n"); + + code.func3((sljit_sw)&buf, 2, 0); + + FAILED(buf[0] != -38405, "test_buffer2 case 7 failed\n"); + FAILED(buf[1] != 63891, "test_buffer2 case 8 failed\n"); + + sljit_free_code(code.code, NULL); + successful_tests++; +}