Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- # define FETCH_LL(a1, a2) \
- u1 = *pc++; \
- a1 = framep[u1 & 65535];\
- a2 = framep[u1 >> 16]
- # define LOAD_OFFSET_AND_FETCH_LL(a1, a2, i1) \
- SAVE_EXPC; \
- i1 = (intptr_t)*pc++; \
- FETCH_LL(a1, a2)
- # define FETCH_LB(a1, a2) \
- a1 = framep[*pc++]; \
- a2 = *pc++
- # define LOAD_OFFSET_AND_FETCH_LB(a1, a2, i1) \
- SAVE_EXPC; \
- i1 = (intptr_t)*pc++; \
- FETCH_LB(a1, a2)
- // Superwords not in the instruction set. These are selected by a table
- // driven peephole optimizer, see comments and code in core/WordcodeTranslator.cpp.
- INSTR(get2locals) {
- u1 = *pc++;
- *(++sp) = framep[u1 & 65535];
- *(++sp) = framep[u1 >> 16];
- NEXT;
- }
- INSTR(get3locals) {
- u1 = *pc++;
- *(++sp) = framep[u1 & 1023];
- u1 >>= 10;
- *(++sp) = framep[u1 & 1023];
- *(++sp) = framep[u1 >> 10];
- NEXT;
- }
- INSTR(get4locals) {
- u1 = *pc++;
- *(++sp) = framep[u1 & 255];
- u1 >>= 8;
- *(++sp) = framep[u1 & 255];
- u1 >>= 8;
- *(++sp) = framep[u1 & 255];
- *(++sp) = framep[u1 >> 8];
- NEXT;
- }
- INSTR(get5locals) {
- u1 = *pc++;
- *(++sp) = framep[u1 & 63];
- u1 >>= 6;
- *(++sp) = framep[u1 & 63];
- u1 >>= 6;
- *(++sp) = framep[u1 & 63];
- u1 >>= 6;
- *(++sp) = framep[u1 & 63];
- *(++sp) = framep[u1 >> 6];
- NEXT;
- }
- INSTR(storelocal) {
- framep[*pc++] = *sp;
- NEXT;
- }
- INSTR(add_ll) {
- FETCH_LL(a1,a2);
- ++sp;
- goto add_two_values_into_tos_impl;
- }
- INSTR(add_set_lll) {
- u1 = *pc++;
- a1=framep[u1 & 1023];
- u1 >>= 10;
- a2=framep[u1 & 1023];
- ADD_TWO_VALUES_AND_NEXT(a1, a2, framep[u1 >> 10]);
- }
- INSTR(subtract_ll) {
- FETCH_LL(a1,a2);
- ++sp;
- goto sub_two_values_and_next;
- }
- INSTR(multiply_ll) {
- FETCH_LL(a1,a2);
- ++sp;
- goto mul_two_values_and_next;
- }
- INSTR(divide_ll) {
- FETCH_LL(a1,a2);
- ++sp;
- goto div_two_values_and_next;
- }
- INSTR(modulo_ll) {
- FETCH_LL(a1,a2);
- ++sp;
- goto mod_two_values_and_next;
- }
- INSTR(bitand_ll) {
- FETCH_LL(a1,a2);
- ++sp;
- goto bitand_two_values_and_next;
- }
- INSTR(bitor_ll) {
- FETCH_LL(a1,a2);
- ++sp;
- goto bitor_two_values_and_next;
- }
- INSTR(bitxor_ll) {
- FETCH_LL(a1,a2);
- ++sp;
- goto bitxor_two_values_and_next;
- }
- // OPTIMIZEME - redundant type check in superword.
- // As long as ext_pushbits is only used for integer data we know that
- // a2 is an int in the cases below, so the macros need not check.
- INSTR(add_lb) {
- FETCH_LB(a1, a2);
- ++sp;
- goto add_two_values_into_tos_impl;
- }
- INSTR(subtract_lb) {
- FETCH_LB(a1, a2);
- ++sp;
- goto sub_two_values_and_next;
- }
- INSTR(multiply_lb) {
- FETCH_LB(a1, a2);
- ++sp;
- goto mul_two_values_and_next;
- }
- INSTR(divide_lb) {
- FETCH_LB(a1, a2);
- ++sp;
- goto div_two_values_and_next;
- }
- INSTR(bitand_lb) {
- FETCH_LB(a1, a2);
- ++sp;
- goto bitand_two_values_and_next;
- }
- INSTR(bitor_lb) {
- FETCH_LB(a1, a2);
- ++sp;
- goto bitor_two_values_and_next;
- }
- INSTR(bitxor_lb) {
- FETCH_LB(a1, a2);
- ++sp;
- goto bitxor_two_values_and_next;
- }
- INSTR(iflt_ll) {
- LOAD_OFFSET_AND_FETCH_LL(a1,a2,i1);
- goto compare_lt_and_branch_impl;
- }
- INSTR(ifnlt_ll) {
- LOAD_OFFSET_AND_FETCH_LL(a1,a2,i1);
- goto compare_nlt_and_branch_impl;
- }
- INSTR(ifle_ll) {
- LOAD_OFFSET_AND_FETCH_LL(a1,a2,i1);
- goto compare_le_and_branch_impl;
- }
- INSTR(ifnle_ll) {
- LOAD_OFFSET_AND_FETCH_LL(a1,a2,i1);
- goto compare_nle_and_branch_impl;
- }
- INSTR(ifgt_ll) {
- LOAD_OFFSET_AND_FETCH_LL(a1,a2,i1);
- goto compare_gt_and_branch_impl;
- }
- INSTR(ifngt_ll) {
- LOAD_OFFSET_AND_FETCH_LL(a1,a2,i1);
- goto compare_ngt_and_branch_impl;
- }
- INSTR(ifge_ll) {
- LOAD_OFFSET_AND_FETCH_LL(a1,a2,i1);
- goto compare_ge_and_branch_impl;
- }
- INSTR(ifnge_ll) {
- LOAD_OFFSET_AND_FETCH_LL(a1,a2,i1);
- goto compare_nge_and_branch_impl;
- }
- INSTR(ifeq_ll) {
- LOAD_OFFSET_AND_FETCH_LL(a1,a2,i1);
- goto compare_eq_and_branch_impl;
- }
- INSTR(ifne_ll) {
- LOAD_OFFSET_AND_FETCH_LL(a1,a2,i1);
- goto compare_ne_and_branch_impl;
- }
- INSTR(ifstricteq_ll) {
- LOAD_OFFSET_AND_FETCH_LL(a1,a2,i1);
- goto compare_stricteq_and_branch_impl;
- }
- INSTR(ifstrictne_ll) {
- LOAD_OFFSET_AND_FETCH_LL(a1,a2,i1);
- goto compare_strictne_and_branch_impl;
- }
- INSTR(iflt_lb) {
- LOAD_OFFSET_AND_FETCH_LB(a1,a2,i1);
- goto compare_lt_and_branch_impl;
- }
- INSTR(ifnlt_lb) {
- LOAD_OFFSET_AND_FETCH_LB(a1,a2,i1);
- goto compare_nlt_and_branch_impl;
- }
- INSTR(ifle_lb) {
- LOAD_OFFSET_AND_FETCH_LB(a1,a2,i1);
- goto compare_le_and_branch_impl;
- }
- INSTR(ifnle_lb) {
- LOAD_OFFSET_AND_FETCH_LB(a1,a2,i1);
- goto compare_nle_and_branch_impl;
- }
- INSTR(ifgt_lb) {
- LOAD_OFFSET_AND_FETCH_LB(a1,a2,i1);
- goto compare_gt_and_branch_impl;
- }
- INSTR(ifngt_lb) {
- LOAD_OFFSET_AND_FETCH_LB(a1,a2,i1);
- goto compare_ngt_and_branch_impl;
- }
- INSTR(ifge_lb) {
- LOAD_OFFSET_AND_FETCH_LB(a1,a2,i1);
- goto compare_ge_and_branch_impl;
- }
- INSTR(ifnge_lb) {
- LOAD_OFFSET_AND_FETCH_LB(a1,a2,i1);
- goto compare_nge_and_branch_impl;
- }
- INSTR(ifeq_lb) {
- LOAD_OFFSET_AND_FETCH_LB(a1,a2,i1);
- goto compare_eq_and_branch_impl;
- }
- INSTR(ifne_lb) {
- LOAD_OFFSET_AND_FETCH_LB(a1,a2,i1);
- goto compare_ne_and_branch_impl;
- }
- INSTR(ifstricteq_lb) {
- LOAD_OFFSET_AND_FETCH_LB(a1,a2,i1);
- goto compare_stricteq_and_branch_impl;
- }
- INSTR(ifstrictne_lb) {
- LOAD_OFFSET_AND_FETCH_LB(a1,a2,i1);
- goto compare_strictne_and_branch_impl;
- }
- INSTR(swap_pop) {
- sp[-1] = sp[0];
- --sp;
- NEXT;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement