[Ups-cvs] ups/ups ci_compile.c,1.2,1.3 ci_compile.h,1.1.1.1,1.2 ci_opcodes.c,1.4,1.5 va_expr.c,1.4,1
Brought to you by:
ianedwards
Update of /cvsroot/ups/ups/ups In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv10973 Modified Files: ci_compile.c ci_compile.h ci_opcodes.c va_expr.c xc_machine.c xc_machine.h xc_opcodes.h xc_text.c Log Message: Make the C interpreter work on 64 bit platforms. Index: ci_compile.c =================================================================== RCS file: /cvsroot/ups/ups/ups/ci_compile.c,v retrieving revision 1.2 retrieving revision 1.3 diff -C2 -d -r1.2 -r1.3 *** ci_compile.c 15 Jul 2003 18:09:15 -0000 1.2 --- ci_compile.c 18 Feb 2004 10:56:27 -0000 1.3 *************** *** 1275,1279 **** * case. TODO: find out what's wrong and fix it. */ ! tx->tx_sp = max_sp + 4; ci_Catching_panics = FALSE; --- 1275,1279 ---- * case. TODO: find out what's wrong and fix it. */ ! tx->tx_sp = max_sp + sizeof(stackword_t); ci_Catching_panics = FALSE; Index: ci_compile.h =================================================================== RCS file: /cvsroot/ups/ups/ups/ci_compile.h,v retrieving revision 1.1.1.1 retrieving revision 1.2 diff -C2 -d -r1.1.1.1 -r1.2 *** ci_compile.h 26 Oct 2002 13:06:34 -0000 1.1.1.1 --- ci_compile.h 18 Feb 2004 10:56:28 -0000 1.2 *************** *** 120,123 **** --- 120,124 ---- void ci_code_word PROTO((text_t *tx, long word)); void ci_code_long PROTO((text_t *tx, long l)); + void ci_code_quad PROTO((text_t *tx, long q)); void ci_code_opcode PROTO((text_t *tx, opcode_t opcode)); void ci_code_generic_opcode PROTO((text_t *tx, opcode_t byte_opcode, Index: ci_opcodes.c =================================================================== RCS file: /cvsroot/ups/ups/ups/ci_opcodes.c,v retrieving revision 1.4 retrieving revision 1.5 diff -C2 -d -r1.4 -r1.5 *** ci_opcodes.c 16 Feb 2004 14:04:59 -0000 1.4 --- ci_opcodes.c 18 Feb 2004 10:56:28 -0000 1.5 *************** *** 45,49 **** #include "ci_types.h" ! typedef enum { OS_ZERO, OS_BYTE, OS_WORD, OS_LONG, OS_OTHER } operand_size_t; typedef struct { --- 45,49 ---- #include "ci_types.h" ! typedef enum { OS_ZERO, OS_BYTE, OS_WORD, OS_LONG, OS_QUAD, OS_OTHER } operand_size_t; typedef struct { *************** *** 126,129 **** --- 126,138 ---- void + ci_code_quad(tx, q) + text_t *tx; + long q; + { + ci_code_long(tx, q & 0xffffffff); + ci_code_long(tx, (q >> 32) & 0xffffffff); + } + + void ci_code_opcode(tx, opcode) text_t *tx; *************** *** 140,143 **** --- 149,153 ---- case OC_CHECK_SP_W: case OC_CHECK_SP_L: + case OC_CHECK_SP_Q: break; *************** *** 164,167 **** --- 174,178 ---- case OC_LINK_W: case OC_LINK_L: + case OC_LINK_Q: break; *************** *** 175,178 **** --- 186,190 ---- case OC_CALL_W: case OC_CALL_L: + case OC_CALL_Q: tmpspace = sizeof(stackword_t); break; *************** *** 213,216 **** --- 225,232 ---- typec = 'l'; break; + case OS_QUAD: + val = GETQUAD(pc); + typec = 'q'; + break; default: ci_panic("opcode botch in sg"); *************** *** 626,629 **** --- 642,646 ---- case OS_WORD: case OS_LONG: + case OS_QUAD: fputc(' ', fp); show_generic(fp, li, oi->oi_os, pc); *************** *** 678,681 **** --- 695,702 ---- pc += 4; break; + case OC_SWITCH_ON_CHAIN_Q: + val = GETQUAD(pc); + pc += 8; + break; default: ci_panic("bad opcode"); *************** *** 726,729 **** --- 747,751 ---- case OC_SWITCH_ON_CHAIN_W: case OC_SWITCH_ON_CHAIN_L: + case OC_SWITCH_ON_CHAIN_Q: pc = get_pc_after_switch_on_chain(pc, (int)(ma->ma_sp[0])); break; *************** *** 737,750 **** case OC_CALL_B: ! res = get_pc_after_call(ma, cf, *pc, sizeof(char), ! &cf, &pc); break; case OC_CALL_W: ! res = get_pc_after_call(ma, cf, (int)GETWORD(pc), sizeof(short), ! &cf, &pc); break; case OC_CALL_L: ! res = get_pc_after_call(ma, cf, (int)GETLONG(pc), sizeof(long), ! &cf, &pc); break; case OC_CALL_INDIRECT: --- 759,772 ---- case OC_CALL_B: ! res = get_pc_after_call(ma, cf, *pc, 1, &cf, &pc); break; case OC_CALL_W: ! res = get_pc_after_call(ma, cf, (int)GETWORD(pc), 2, &cf, &pc); break; case OC_CALL_L: ! res = get_pc_after_call(ma, cf, (int)GETLONG(pc), 4, &cf, &pc); ! break; ! case OC_CALL_Q: ! res = get_pc_after_call(ma, cf, (int)GETQUAD(pc), 8, &cf, &pc); break; case OC_CALL_INDIRECT: *************** *** 852,887 **** return 0; case OS_BYTE: ! return sizeof(char); case OS_WORD: ! return sizeof(short); case OS_LONG: ! return sizeof(long); case OS_OTHER: switch (opcode) { case OC_CALL_B: ! return sizeof(char) + 1 + WANT_TYPE_PUSHED; case OC_CALL_W: ! return sizeof(short) + 1 + WANT_TYPE_PUSHED; case OC_CALL_L: ! return sizeof(long) + 1 + WANT_TYPE_PUSHED; #if WANT_TYPE_PUSHED case OC_CALL_INDIRECT: ! return sizeof(char) + WANT_TYPE_PUSHED; #endif #if WANT_OLD_LINK case OC_LINK_B: ! return sizeof(char) + 1; case OC_LINK_W: ! return sizeof(short) + 1; case OC_LINK_L: ! return sizeof(long) + 1; #else /* Fix LINK ARG (CHAR -> LONG) : Dibyendu */ case OC_LINK_B: ! return sizeof(char) + 4; case OC_LINK_W: ! return sizeof(short) + 4; case OC_LINK_L: ! return sizeof(long) + 4; #endif case OC_PUSH_FLOAT_CONST: --- 874,917 ---- return 0; case OS_BYTE: ! return 1; case OS_WORD: ! return 2; case OS_LONG: ! return 4; ! case OS_QUAD: ! return 8; case OS_OTHER: switch (opcode) { case OC_CALL_B: ! return 1 + 1 + WANT_TYPE_PUSHED; case OC_CALL_W: ! return 2 + 1 + WANT_TYPE_PUSHED; case OC_CALL_L: ! return 4 + 1 + WANT_TYPE_PUSHED; ! case OC_CALL_Q: ! return 8 + 1 + WANT_TYPE_PUSHED; #if WANT_TYPE_PUSHED case OC_CALL_INDIRECT: ! return 1 + WANT_TYPE_PUSHED; #endif #if WANT_OLD_LINK case OC_LINK_B: ! return 1 + 1; case OC_LINK_W: ! return 2 + 1; case OC_LINK_L: ! return 4 + 1; ! case OC_LINK_8: ! return 8 + 1; #else /* Fix LINK ARG (CHAR -> LONG) : Dibyendu */ case OC_LINK_B: ! return 1 + 4; case OC_LINK_W: ! return 2 + 4; case OC_LINK_L: ! return 4 + 4; ! case OC_LINK_Q: ! return 8 + 4; #endif case OC_PUSH_FLOAT_CONST: *************** *** 897,901 **** case OC_JUMP_IF_ZERO: case OC_JUMP_IF_NON_ZERO: ! return sizeof(short); case OC_SWITCH_ON_TABLE: return 2 + 4 + GETWORD(text) * 2 + 2; --- 927,931 ---- case OC_JUMP_IF_ZERO: case OC_JUMP_IF_NON_ZERO: ! return 2; case OC_SWITCH_ON_TABLE: return 2 + 4 + GETWORD(text) * 2 + 2; *************** *** 907,910 **** --- 937,942 ---- case OC_SWITCH_ON_CHAIN_L: return 2 + 4 + GETWORD(text) * (4 + 2) + 2; + case OC_SWITCH_ON_CHAIN_Q: + return 2 + 4 + GETWORD(text) * (8 + 2) + 2; break; *************** *** 950,953 **** --- 982,986 ---- case OC_SWITCH_ON_CHAIN_W: case OC_SWITCH_ON_CHAIN_L: + case OC_SWITCH_ON_CHAIN_Q: opcode = (opcode_t)pc[-1]; ncase = GETWORD(pc); *************** *** 971,974 **** --- 1004,1011 ---- pc += 4; break; + case OC_SWITCH_ON_CHAIN_Q: + val = GETQUAD(pc); + pc += 8; + break; default: panic("bad opcode"); *************** *** 1002,1005 **** --- 1039,1045 ---- show_call(fp, li, (int)GETLONG(pc), pc[4], pc[5], 'l'); break; + case OC_CALL_Q: + show_call(fp, li, (int)GETQUAD(pc), pc[8], pc[9], 'q'); + break; #else case OC_CALL_B: *************** *** 1012,1015 **** --- 1052,1058 ---- show_call(fp, li, (int)GETLONG(pc), pc[4], 0, 'l'); break; + case OC_CALL_Q: + show_call(fp, li, (int)GETQUAD(pc), pc[8], 0, 'q'); + break; #endif #if WANT_TYPE_PUSHED *************** *** 1029,1032 **** --- 1072,1078 ---- fprintf(fp, "%d.l,%d", GETLONG(pc), pc[4]); break; + case OC_LINK_Q: + fprintf(fp, "%d.q,%d", GETQUAD(pc), pc[8]); + break; #else case OC_LINK_B: *************** *** 1044,1047 **** --- 1090,1098 ---- fprintf(fp, "%d.l,%ld", ival, GETLONG(pc)); break; + case OC_LINK_Q: + ival = GETQUAD(pc); + pc += 8; + fprintf(fp, "%d.q,%ld", ival, GETQUAD(pc)); + break; #endif *************** *** 1110,1120 **** ci_code_byte(tx, (long)arg); } ! else if (arg < MAX_WORD) { ci_code_opcode(tx, SHORT_FORM(byte_opcode)); ci_code_word(tx, (long)arg); } ! else { ci_code_opcode(tx, LONG_FORM(byte_opcode)); ci_code_long(tx, (long)arg); } } --- 1161,1175 ---- ci_code_byte(tx, (long)arg); } ! else if (arg <= MAX_WORD) { ci_code_opcode(tx, SHORT_FORM(byte_opcode)); ci_code_word(tx, (long)arg); } ! else if (arg <= MAX_LONG) { ci_code_opcode(tx, LONG_FORM(byte_opcode)); ci_code_long(tx, (long)arg); } + else { + ci_code_opcode(tx, QUAD_FORM(byte_opcode)); + ci_code_quad(tx, (long)arg); + } } Index: va_expr.c =================================================================== RCS file: /cvsroot/ups/ups/ups/va_expr.c,v retrieving revision 1.4 retrieving revision 1.5 diff -C2 -d -r1.4 -r1.5 *** va_expr.c 8 Jun 2003 15:04:18 -0000 1.4 --- va_expr.c 18 Feb 2004 10:56:29 -0000 1.5 *************** *** 1104,1117 **** case TY_INT: case TY_UINT: case TY_LONG: case TY_ULONG: if (is_signed_format(de->de_format)) { int_to_string(buf, sizeof(buf), ! (vlong)vl.vl_int, de->de_format); } else { int_to_string(buf, sizeof(buf), ! (vlong)(vl.vl_int & (unsigned)~0), de->de_format); } --- 1104,1128 ---- case TY_INT: case TY_UINT: + if (is_signed_format(de->de_format)) { + int_to_string(buf, sizeof(buf), + (vlong)vl.vl_int, + de->de_format); + } + else { + int_to_string(buf, sizeof(buf), + (vlong)(vl.vl_int & (unsigned int)~0), + de->de_format); + } + break; case TY_LONG: case TY_ULONG: if (is_signed_format(de->de_format)) { int_to_string(buf, sizeof(buf), ! (vlong)vl.vl_long, de->de_format); } else { int_to_string(buf, sizeof(buf), ! (vlong)(vl.vl_long & (unsigned long)~0), de->de_format); } *************** *** 1201,1206 **** case TY_INT: case TY_UINT: - case TY_LONG: - case TY_ULONG: case TY_ENUM: case TY_U_ENUM: --- 1212,1215 ---- *************** *** 1208,1211 **** --- 1217,1225 ---- Expr_value.vl_int = args[0]; break; + case TY_LONG: + case TY_ULONG: + argslots = 1; + Expr_value.vl_long = args[0]; + break; case TY_STRUCT: case TY_UNION: Index: xc_machine.c =================================================================== RCS file: /cvsroot/ups/ups/ups/xc_machine.c,v retrieving revision 1.3 retrieving revision 1.4 diff -C2 -d -r1.3 -r1.4 *** xc_machine.c 4 Nov 2002 14:56:20 -0000 1.3 --- xc_machine.c 18 Feb 2004 10:56:29 -0000 1.4 *************** *** 1173,1176 **** --- 1173,1182 ---- goto func_call; + CASE OC_CALL_Q: + fcf = cf; + func_index = GETQUAD(pc); + pc += 8; + goto func_call; + CASE OC_CALL_B: { extref_t *er; *************** *** 1380,1383 **** --- 1386,1406 ---- } #endif + goto stack_overflow; + + CASE OC_LINK_Q: + PUSH((stackword_t)fp, sp); + fp = sp; + sp = (stackword_t *)((char *)sp - GETQUAD(pc)); + pc += 8; + #if WANT_OLD_LINK + if ((char *)sp - *pc++ >= (char *)minsp) + BREAK; + #else + /* Fix LINK ARG (CHAR -> LONG) : Dibyendu */ + if (((char *)sp - GETLONG(pc)) >= (char *)minsp) { + pc += 4; + BREAK; + } + #endif stack_overflow: res = CI_ER_STACK_OVERFLOW; *************** *** 1398,1401 **** --- 1421,1428 ---- pc += 4; BREAK; + CASE OC_POPMANY_Q: + sp = (stackword_t *)((char *)sp + GETQUAD(pc)); + pc += 8; + BREAK; { *************** *** 1412,1415 **** --- 1439,1446 ---- nbytes = GETLONG(pc); pc += 4; + goto proc_memcpy; + CASE OC_PROC_MEMCPY_Q: + nbytes = GETQUAD(pc); + pc += 8; proc_memcpy: if (IS_CI_ADDR(sp[1])) { *************** *** 1467,1470 **** --- 1498,1506 ---- sp += 2; BREAK; + CASE OC_MEMCPY_Q: + memcpy((char *)sp[1], (char *)*sp, (size_t)GETQUAD(pc)); + pc += 8; + sp += 2; + BREAK; CASE OC_RESERVE_BYTES: { *************** *** 2097,2100 **** --- 2133,2140 ---- pc += 4; BREAK; + CASE OC_NEG_CONSTPUSH_Q: + PUSH(-GETQUAD(pc), sp); + pc += 8; + BREAK; CASE OC_CONSTPUSH_B: *************** *** 2109,2112 **** --- 2149,2156 ---- pc += 4; BREAK; + CASE OC_CONSTPUSH_Q: + PUSH(GETQUAD(pc), sp); + pc += 8; + BREAK; CASE OC_PUSH_FLOAT_CONST: *************** *** 2147,2150 **** --- 2191,2203 ---- pc += 4; BREAK; } + CASE OC_CHECK_SP_Q: { + int checkval; + + checkval = GETQUAD(pc); + if ((char *)fp - (char *)sp != checkval) + spfailed(checkval, (char *)fp - (char *)sp, + (pc - cf->cf_text_and_data) - 1); + pc += 8; + BREAK; } CASE OC_PROC_PUSH_FP_ADDR_B: *************** *** 2159,2162 **** --- 2212,2219 ---- pc += 4; BREAK; + CASE OC_PROC_PUSH_FP_ADDR_Q: + PUSH((stackword_t)(procfp + GETQUAD(pc)), sp); + pc += 8; + BREAK; CASE OC_PROC_PUSH_AP_ADDR_B: *************** *** 2171,2174 **** --- 2228,2235 ---- pc += 4; BREAK; + CASE OC_PROC_PUSH_AP_ADDR_Q: + PUSH((stackword_t)(procap + GETQUAD(pc)), sp); + pc += 8; + BREAK; CASE OC_PUSH_STACKADDR_B: *************** *** 2183,2186 **** --- 2244,2251 ---- pc += 4; BREAK; + CASE OC_PUSH_STACKADDR_Q: + PUSH((stackword_t)((char *)fp + GETQUAD(pc)), sp); + pc += 8; + BREAK; #if WANT_LL *************** *** 2208,2211 **** --- 2273,2284 ---- PUSH_LONGLONG(d0, sp); BREAK; } + CASE OC_PUSH_UNSIGNED_LONG_LONG_AT_ADDR_Q: { + stackword_t addr; + + addr = GETQUAD(pc); + pc += 8; + GET_LONGLONG(d0, (stackword_t *)addr); + PUSH_LONGLONG(d0, sp); + BREAK; } #endif *************** *** 2224,2227 **** --- 2297,2304 ---- pc += 4; BREAK; + CASE OC_PUSH_UNSIGNED_BYTE_AT_ADDR_Q: + PUSH(*(unsigned char *)GETQUAD(pc), sp); + pc += 8; + BREAK; CASE OC_PUSH_UNSIGNED_SHORT_AT_ADDR_B: { *************** *** 2239,2242 **** --- 2316,2323 ---- pc += 4; BREAK; + CASE OC_PUSH_UNSIGNED_SHORT_AT_ADDR_Q: + PUSH(*(unsigned short *)GETQUAD(pc), sp); + pc += 8; + BREAK; CASE OC_PUSH_UNSIGNED_LONG_AT_ADDR_B: { *************** *** 2254,2257 **** --- 2335,2342 ---- pc += 4; BREAK; + CASE OC_PUSH_UNSIGNED_LONG_AT_ADDR_Q: + PUSH(*(unsigned long *)GETQUAD(pc), sp); + pc += 8; + BREAK; #if WANT_LL *************** *** 2279,2282 **** --- 2364,2375 ---- PUSH_LONGLONG(d0, sp); BREAK; } + CASE OC_PUSH_UNSIGNED_LONG_LONG_AT_STACKADDR_Q: { + stackword_t addr; + + addr = (stackword_t)((char *)fp + GETQUAD(pc)); + pc += 8; + GET_LONGLONG(d0, (stackword_t *)addr); + PUSH_LONGLONG(d0, sp); + BREAK; } #endif *************** *** 2292,2295 **** --- 2385,2392 ---- pc += 4; BREAK; + CASE OC_PUSH_UNSIGNED_BYTE_AT_STACKADDR_Q: + PUSH(*(unsigned char *)((char *)fp + GETQUAD(pc)), sp); + pc += 8; + BREAK; CASE OC_PUSH_UNSIGNED_SHORT_AT_STACKADDR_B: *************** *** 2304,2307 **** --- 2401,2408 ---- pc += 4; BREAK; + CASE OC_PUSH_UNSIGNED_SHORT_AT_STACKADDR_Q: + PUSH(*(unsigned short *)((char *)fp + GETQUAD(pc)), sp); + pc += 8; + BREAK; CASE OC_PUSH_UNSIGNED_LONG_AT_STACKADDR_B: *************** *** 2316,2319 **** --- 2417,2424 ---- pc += 4; BREAK; + CASE OC_PUSH_UNSIGNED_LONG_AT_STACKADDR_Q: + PUSH(*(unsigned long *)((char *)fp + GETQUAD(pc)), sp); + pc += 8; + BREAK; #if WANT_LL *************** *** 2341,2344 **** --- 2446,2457 ---- PUSH_LONGLONG(d0, sp); BREAK; } + CASE OC_PUSH_SIGNED_LONG_LONG_AT_ADDR_Q: { + stackword_t addr; + + addr = GETQUAD(pc); + pc += 8; + GET_LONGLONG(d0, (stackword_t *)addr); + PUSH_LONGLONG(d0, sp); + BREAK; } #endif *************** *** 2357,2360 **** --- 2470,2477 ---- pc += 4; BREAK; + CASE OC_PUSH_SIGNED_BYTE_AT_ADDR_Q: + PUSH(*(char *)GETQUAD(pc), sp); + pc += 8; + BREAK; CASE OC_PUSH_SIGNED_SHORT_AT_ADDR_B: { *************** *** 2372,2375 **** --- 2489,2496 ---- pc += 4; BREAK; + CASE OC_PUSH_SIGNED_SHORT_AT_ADDR_Q: + PUSH(*(short *)GETQUAD(pc), sp); + pc += 8; + BREAK; CASE OC_PUSH_SIGNED_LONG_AT_ADDR_B: { *************** *** 2387,2390 **** --- 2508,2515 ---- pc += 4; BREAK; + CASE OC_PUSH_SIGNED_LONG_AT_ADDR_Q: + PUSH(*(long *)GETQUAD(pc), sp); + pc += 8; + BREAK; CASE OC_PUSH_FLOAT_AT_ADDR_B: { *************** *** 2411,2414 **** --- 2536,2547 ---- PUSH_FLOAT(d0, sp); BREAK; } + CASE OC_PUSH_FLOAT_AT_ADDR_Q: { + stackword_t addr; + + addr = GETQUAD(pc); + pc += 8; + GET_FLOAT(d0, (stackword_t *)addr); + PUSH_FLOAT(d0, sp); + BREAK; } CASE OC_PUSH_DOUBLE_AT_ADDR_B: { *************** *** 2435,2438 **** --- 2568,2579 ---- PUSH_DOUBLE(d0, sp); BREAK; } + CASE OC_PUSH_DOUBLE_AT_ADDR_Q: { + stackword_t addr; + + addr = GETQUAD(pc); + pc += 8; + GET_DOUBLE(d0, (stackword_t *)addr); + PUSH_DOUBLE(d0, sp); + BREAK; } #if WANT_LDBL *************** *** 2460,2463 **** --- 2601,2612 ---- PUSH_LDOUBLE(d0, sp); BREAK; } + CASE OC_PUSH_LONG_DOUBLE_AT_ADDR_Q: { + stackword_t addr; + + addr = GETQUAD(pc); + pc += 8; + GET_LDOUBLE(d0, (stackword_t *)addr); + PUSH_LDOUBLE(d0, sp); + BREAK; } #endif *************** *** 2486,2489 **** --- 2635,2646 ---- PUSH_LONGLONG(d0, sp); BREAK; } + CASE OC_PUSH_SIGNED_LONG_LONG_AT_STACKADDR_Q: { + stackword_t addr; + + addr = (stackword_t)((char *)fp + GETQUAD(pc)); + pc += 8; + GET_LONGLONG(d0, (stackword_t *)addr); + PUSH_LONGLONG(d0, sp); + BREAK; } #endif *************** *** 2499,2502 **** --- 2656,2663 ---- pc += 4; BREAK; + CASE OC_PUSH_SIGNED_BYTE_AT_STACKADDR_Q: + PUSH(*(char *)((char *)fp + GETQUAD(pc)), sp); + pc += 8; + BREAK; CASE OC_PUSH_SIGNED_SHORT_AT_STACKADDR_B: *************** *** 2511,2514 **** --- 2672,2679 ---- pc += 4; BREAK; + CASE OC_PUSH_SIGNED_SHORT_AT_STACKADDR_Q: + PUSH(*(short *)((char *)fp + GETQUAD(pc)), sp); + pc += 8; + BREAK; CASE OC_PUSH_SIGNED_LONG_AT_STACKADDR_B: *************** *** 2523,2526 **** --- 2688,2695 ---- pc += 4; BREAK; + CASE OC_PUSH_SIGNED_LONG_AT_STACKADDR_Q: + PUSH(*(long *)((char *)fp + GETQUAD(pc)), sp); + pc += 8; + BREAK; CASE OC_PUSH_FLOAT_AT_STACKADDR_B: { *************** *** 2547,2550 **** --- 2716,2727 ---- PUSH_FLOAT(d0, sp); BREAK; } + CASE OC_PUSH_FLOAT_AT_STACKADDR_Q: { + stackword_t addr; + + addr = (stackword_t)((char *)fp + GETQUAD(pc)); + pc += 8; + GET_FLOAT(d0, (stackword_t *)addr); + PUSH_FLOAT(d0, sp); + BREAK; } CASE OC_PUSH_DOUBLE_AT_STACKADDR_B: { *************** *** 2571,2574 **** --- 2748,2759 ---- PUSH_DOUBLE(d0, sp); BREAK; } + CASE OC_PUSH_DOUBLE_AT_STACKADDR_Q: { + stackword_t addr; + + addr = (stackword_t)((char *)fp + GETQUAD(pc)); + pc += 8; + GET_DOUBLE(d0, (stackword_t *)addr); + PUSH_DOUBLE(d0, sp); + BREAK; } #if WANT_LDBL *************** *** 2596,2599 **** --- 2781,2792 ---- PUSH_LDOUBLE(d0, sp); BREAK; } + CASE OC_PUSH_LONG_DOUBLE_AT_STACKADDR_Q: { + stackword_t addr; + + addr = (stackword_t)((char *)fp + GETQUAD(pc)); + pc += 8; + GET_LDOUBLE(d0, (stackword_t *)addr); + PUSH_LDOUBLE(d0, sp); + BREAK; } #endif *************** *** 2679,2682 **** --- 2872,2898 ---- BREAK; } + CASE OC_SWITCH_ON_CHAIN_Q: { + int ncase, minval, switchval, i; + + ncase = GETWORD(pc); + pc += 2; + minval = GETLONG(pc); + pc += 4; + switchval = POP(sp) - minval; + for (i = 0; i < ncase; ++i) { + int caseval; + + caseval = GETQUAD(pc); + pc += 8; + if (caseval == switchval) { + pc += (short)GETWORD(pc); + break; + } + pc += 2; + } + if (i == ncase) + pc += (short)GETWORD(pc); + BREAK; } + CASE OC_UNRESOLVED_JUMP: panic("bad opcode: unresolved jump"); Index: xc_machine.h =================================================================== RCS file: /cvsroot/ups/ups/ups/xc_machine.h,v retrieving revision 1.2 retrieving revision 1.3 diff -C2 -d -r1.2 -r1.3 *** xc_machine.h 16 Feb 2004 13:02:00 -0000 1.2 --- xc_machine.h 18 Feb 2004 10:56:29 -0000 1.3 *************** *** 207,210 **** --- 207,214 ---- #define GETLONG(pc) (UBYTE(*(pc)) | UBYTE((pc)[1] << 8) | \ UBYTE((pc)[2] << 16) | UBYTE((pc)[3] << 24)) + #define GETQUAD(pc) (UBYTE(*(pc)) | UBYTE((pc)[1] << 8) | \ + UBYTE((pc)[2] << 16) | UBYTE((pc)[3] << 24) | \ + UBYTE((pc)[4] << 32) | UBYTE((pc)[5] << 40) | \ + UBYTE((pc)[6] << 48) | UBYTE((pc)[7] << 56)) typedef struct { Index: xc_opcodes.h =================================================================== RCS file: /cvsroot/ups/ups/ups/xc_opcodes.h,v retrieving revision 1.2 retrieving revision 1.3 diff -C2 -d -r1.2 -r1.3 *** xc_opcodes.h 28 Oct 2002 09:46:15 -0000 1.2 --- xc_opcodes.h 18 Feb 2004 10:56:29 -0000 1.3 *************** *** 53,72 **** --- 53,77 ---- x(OC_CALL_W, 0, OS_OTHER), x(OC_CALL_L, 0, OS_OTHER), + x(OC_CALL_Q, 0, OS_OTHER), /* ----------------------- */ x(OC_POPMANY_B, 0, OS_BYTE), x(OC_POPMANY_W, 0, OS_WORD), x(OC_POPMANY_L, 0, OS_LONG), + x(OC_POPMANY_Q, 0, OS_QUAD), /* ----------------------- */ x(OC_LINK_B, 0, OS_OTHER), x(OC_LINK_W, 0, OS_OTHER), x(OC_LINK_L, 0, OS_OTHER), + x(OC_LINK_Q, 0, OS_OTHER), /* ----------------------- */ x(OC_PROC_MEMCPY_B, -(2 * STACKW_SIZE), OS_BYTE), x(OC_PROC_MEMCPY_W, -(2 * STACKW_SIZE), OS_WORD), x(OC_PROC_MEMCPY_L, -(2 * STACKW_SIZE), OS_LONG), + x(OC_PROC_MEMCPY_Q, -(2 * STACKW_SIZE), OS_QUAD), /* ----------------------- */ x(OC_MEMCPY_B, -(2 * STACKW_SIZE), OS_BYTE), x(OC_MEMCPY_W, -(2 * STACKW_SIZE), OS_WORD), x(OC_MEMCPY_L, -(2 * STACKW_SIZE), OS_LONG), + x(OC_MEMCPY_Q, -(2 * STACKW_SIZE), OS_QUAD), /* ----------------------- */ x(OC_PUSH_BYTES, 0, OS_LONG), *************** *** 163,170 **** --- 168,177 ---- x(OC_NEG_CONSTPUSH_W, STACKW_SIZE, OS_WORD), x(OC_NEG_CONSTPUSH_L, STACKW_SIZE, OS_LONG), + x(OC_NEG_CONSTPUSH_Q, STACKW_SIZE, OS_QUAD), /* ----------------------- */ x(OC_CONSTPUSH_B, STACKW_SIZE, OS_BYTE), x(OC_CONSTPUSH_W, STACKW_SIZE, OS_WORD), x(OC_CONSTPUSH_L, STACKW_SIZE, OS_LONG), + x(OC_CONSTPUSH_Q, STACKW_SIZE, OS_QUAD), /* ----------------------- */ x(OC_PUSH_FLOAT_CONST, FLOAT_NBYTES, OS_OTHER), *************** *** 174,177 **** --- 181,185 ---- x(OC_CHECK_SP_W, 0, OS_WORD), x(OC_CHECK_SP_L, 0, OS_LONG), + x(OC_CHECK_SP_Q, 0, OS_QUAD), /* ----------------------- */ *************** *** 179,190 **** --- 187,201 ---- x(OC_PROC_PUSH_FP_ADDR_W, STACKW_SIZE, OS_WORD), x(OC_PROC_PUSH_FP_ADDR_L, STACKW_SIZE, OS_LONG), + x(OC_PROC_PUSH_FP_ADDR_Q, STACKW_SIZE, OS_QUAD), /* ----------------------- */ x(OC_PROC_PUSH_AP_ADDR_B, STACKW_SIZE, OS_BYTE), x(OC_PROC_PUSH_AP_ADDR_W, STACKW_SIZE, OS_WORD), x(OC_PROC_PUSH_AP_ADDR_L, STACKW_SIZE, OS_LONG), + x(OC_PROC_PUSH_AP_ADDR_Q, STACKW_SIZE, OS_QUAD), /* ----------------------- */ x(OC_PUSH_STACKADDR_B, STACKW_SIZE, OS_BYTE), x(OC_PUSH_STACKADDR_W, STACKW_SIZE, OS_WORD), x(OC_PUSH_STACKADDR_L, STACKW_SIZE, OS_LONG), + x(OC_PUSH_STACKADDR_Q, STACKW_SIZE, OS_QUAD), /* ----------------------- */ *************** *** 194,197 **** --- 205,209 ---- x(OC_PUSH_SIGNED_LONG_LONG_AT_STACKADDR_W, LONGLONG_NBYTES, OS_WORD), x(OC_PUSH_SIGNED_LONG_LONG_AT_STACKADDR_L, LONGLONG_NBYTES, OS_LONG), + x(OC_PUSH_SIGNED_LONG_LONG_AT_STACKADDR_Q, LONGLONG_NBYTES, OS_QUAD), #endif *************** *** 199,218 **** --- 211,235 ---- x(OC_PUSH_SIGNED_BYTE_AT_STACKADDR_W, STACKW_SIZE, OS_WORD), x(OC_PUSH_SIGNED_BYTE_AT_STACKADDR_L, STACKW_SIZE, OS_LONG), + x(OC_PUSH_SIGNED_BYTE_AT_STACKADDR_Q, STACKW_SIZE, OS_QUAD), x(OC_PUSH_SIGNED_SHORT_AT_STACKADDR_B, STACKW_SIZE, OS_BYTE), x(OC_PUSH_SIGNED_SHORT_AT_STACKADDR_W, STACKW_SIZE, OS_WORD), x(OC_PUSH_SIGNED_SHORT_AT_STACKADDR_L, STACKW_SIZE, OS_LONG), + x(OC_PUSH_SIGNED_SHORT_AT_STACKADDR_Q, STACKW_SIZE, OS_QUAD), x(OC_PUSH_SIGNED_LONG_AT_STACKADDR_B, STACKW_SIZE, OS_BYTE), x(OC_PUSH_SIGNED_LONG_AT_STACKADDR_W, STACKW_SIZE, OS_WORD), x(OC_PUSH_SIGNED_LONG_AT_STACKADDR_L, STACKW_SIZE, OS_LONG), + x(OC_PUSH_SIGNED_LONG_AT_STACKADDR_Q, STACKW_SIZE, OS_QUAD), x(OC_PUSH_FLOAT_AT_STACKADDR_B, FLOAT_NBYTES, OS_BYTE), x(OC_PUSH_FLOAT_AT_STACKADDR_W, FLOAT_NBYTES, OS_WORD), x(OC_PUSH_FLOAT_AT_STACKADDR_L, FLOAT_NBYTES, OS_LONG), + x(OC_PUSH_FLOAT_AT_STACKADDR_Q, FLOAT_NBYTES, OS_QUAD), x(OC_PUSH_DOUBLE_AT_STACKADDR_B, DOUBLE_NBYTES, OS_BYTE), x(OC_PUSH_DOUBLE_AT_STACKADDR_W, DOUBLE_NBYTES, OS_WORD), x(OC_PUSH_DOUBLE_AT_STACKADDR_L, DOUBLE_NBYTES, OS_LONG), + x(OC_PUSH_DOUBLE_AT_STACKADDR_Q, DOUBLE_NBYTES, OS_QUAD), #if WANT_LDBL *************** *** 220,223 **** --- 237,241 ---- x(OC_PUSH_LONG_DOUBLE_AT_STACKADDR_W, LDOUBLE_NBYTES, OS_WORD), x(OC_PUSH_LONG_DOUBLE_AT_STACKADDR_L, LDOUBLE_NBYTES, OS_LONG), + x(OC_PUSH_LONG_DOUBLE_AT_STACKADDR_Q, LDOUBLE_NBYTES, OS_QUAD), #endif /* ----------------------- */ *************** *** 226,229 **** --- 244,248 ---- x(OC_PUSH_UNSIGNED_LONG_LONG_AT_STACKADDR_W, LONGLONG_NBYTES, OS_WORD), x(OC_PUSH_UNSIGNED_LONG_LONG_AT_STACKADDR_L, LONGLONG_NBYTES, OS_LONG), + x(OC_PUSH_UNSIGNED_LONG_LONG_AT_STACKADDR_Q, LONGLONG_NBYTES, OS_QUAD), #endif *************** *** 231,242 **** --- 250,264 ---- x(OC_PUSH_UNSIGNED_BYTE_AT_STACKADDR_W, STACKW_SIZE, OS_WORD), x(OC_PUSH_UNSIGNED_BYTE_AT_STACKADDR_L, STACKW_SIZE, OS_LONG), + x(OC_PUSH_UNSIGNED_BYTE_AT_STACKADDR_Q, STACKW_SIZE, OS_QUAD), x(OC_PUSH_UNSIGNED_SHORT_AT_STACKADDR_B, STACKW_SIZE, OS_BYTE), x(OC_PUSH_UNSIGNED_SHORT_AT_STACKADDR_W, STACKW_SIZE, OS_WORD), x(OC_PUSH_UNSIGNED_SHORT_AT_STACKADDR_L, STACKW_SIZE, OS_LONG), + x(OC_PUSH_UNSIGNED_SHORT_AT_STACKADDR_Q, STACKW_SIZE, OS_QUAD), x(OC_PUSH_UNSIGNED_LONG_AT_STACKADDR_B, STACKW_SIZE, OS_BYTE), x(OC_PUSH_UNSIGNED_LONG_AT_STACKADDR_W, STACKW_SIZE, OS_WORD), x(OC_PUSH_UNSIGNED_LONG_AT_STACKADDR_L, STACKW_SIZE, OS_LONG), + x(OC_PUSH_UNSIGNED_LONG_AT_STACKADDR_Q, STACKW_SIZE, OS_QUAD), /* ----------------------- */ *************** *** 246,249 **** --- 268,272 ---- x(OC_PUSH_UNSIGNED_LONG_LONG_AT_ADDR_W, LONGLONG_NBYTES, OS_WORD), x(OC_PUSH_UNSIGNED_LONG_LONG_AT_ADDR_L, LONGLONG_NBYTES, OS_LONG), + x(OC_PUSH_UNSIGNED_LONG_LONG_AT_ADDR_Q, LONGLONG_NBYTES, OS_QUAD), #endif *************** *** 251,262 **** --- 274,288 ---- x(OC_PUSH_UNSIGNED_BYTE_AT_ADDR_W, STACKW_SIZE, OS_WORD), x(OC_PUSH_UNSIGNED_BYTE_AT_ADDR_L, STACKW_SIZE, OS_LONG), + x(OC_PUSH_UNSIGNED_BYTE_AT_ADDR_Q, STACKW_SIZE, OS_QUAD), x(OC_PUSH_UNSIGNED_SHORT_AT_ADDR_B, STACKW_SIZE, OS_BYTE), x(OC_PUSH_UNSIGNED_SHORT_AT_ADDR_W, STACKW_SIZE, OS_WORD), x(OC_PUSH_UNSIGNED_SHORT_AT_ADDR_L, STACKW_SIZE, OS_LONG), + x(OC_PUSH_UNSIGNED_SHORT_AT_ADDR_Q, STACKW_SIZE, OS_QUAD), x(OC_PUSH_UNSIGNED_LONG_AT_ADDR_B, STACKW_SIZE, OS_BYTE), x(OC_PUSH_UNSIGNED_LONG_AT_ADDR_W, STACKW_SIZE, OS_WORD), x(OC_PUSH_UNSIGNED_LONG_AT_ADDR_L, STACKW_SIZE, OS_LONG), + x(OC_PUSH_UNSIGNED_LONG_AT_ADDR_Q, STACKW_SIZE, OS_QUAD), /* ----------------------- */ #if WANT_LL *************** *** 264,267 **** --- 290,294 ---- x(OC_PUSH_SIGNED_LONG_LONG_AT_ADDR_W, LONGLONG_NBYTES, OS_WORD), x(OC_PUSH_SIGNED_LONG_LONG_AT_ADDR_L, LONGLONG_NBYTES, OS_LONG), + x(OC_PUSH_SIGNED_LONG_LONG_AT_ADDR_Q, LONGLONG_NBYTES, OS_QUAD), #endif *************** *** 269,288 **** --- 296,320 ---- x(OC_PUSH_SIGNED_BYTE_AT_ADDR_W, STACKW_SIZE, OS_WORD), x(OC_PUSH_SIGNED_BYTE_AT_ADDR_L, STACKW_SIZE, OS_LONG), + x(OC_PUSH_SIGNED_BYTE_AT_ADDR_Q, STACKW_SIZE, OS_QUAD), x(OC_PUSH_SIGNED_SHORT_AT_ADDR_B, STACKW_SIZE, OS_BYTE), x(OC_PUSH_SIGNED_SHORT_AT_ADDR_W, STACKW_SIZE, OS_WORD), x(OC_PUSH_SIGNED_SHORT_AT_ADDR_L, STACKW_SIZE, OS_LONG), + x(OC_PUSH_SIGNED_SHORT_AT_ADDR_Q, STACKW_SIZE, OS_QUAD), x(OC_PUSH_SIGNED_LONG_AT_ADDR_B, STACKW_SIZE, OS_BYTE), x(OC_PUSH_SIGNED_LONG_AT_ADDR_W, STACKW_SIZE, OS_WORD), x(OC_PUSH_SIGNED_LONG_AT_ADDR_L, STACKW_SIZE, OS_LONG), + x(OC_PUSH_SIGNED_LONG_AT_ADDR_Q, STACKW_SIZE, OS_QUAD), x(OC_PUSH_FLOAT_AT_ADDR_B, FLOAT_NBYTES, OS_BYTE), x(OC_PUSH_FLOAT_AT_ADDR_W, FLOAT_NBYTES, OS_WORD), x(OC_PUSH_FLOAT_AT_ADDR_L, FLOAT_NBYTES, OS_LONG), + x(OC_PUSH_FLOAT_AT_ADDR_Q, FLOAT_NBYTES, OS_QUAD), x(OC_PUSH_DOUBLE_AT_ADDR_B, DOUBLE_NBYTES, OS_BYTE), x(OC_PUSH_DOUBLE_AT_ADDR_W, DOUBLE_NBYTES, OS_WORD), x(OC_PUSH_DOUBLE_AT_ADDR_L, DOUBLE_NBYTES, OS_LONG), + x(OC_PUSH_DOUBLE_AT_ADDR_Q, DOUBLE_NBYTES, OS_QUAD), #if WANT_LDBL *************** *** 290,293 **** --- 322,326 ---- x(OC_PUSH_LONG_DOUBLE_AT_ADDR_W, LDOUBLE_NBYTES, OS_WORD), x(OC_PUSH_LONG_DOUBLE_AT_ADDR_L, LDOUBLE_NBYTES, OS_LONG), + x(OC_PUSH_LONG_DOUBLE_AT_ADDR_Q, LDOUBLE_NBYTES, OS_QUAD), #endif /* ----------------------- */ *************** *** 326,329 **** --- 359,363 ---- x(OC_SWITCH_ON_CHAIN_W, -STACKW_SIZE, OS_OTHER), x(OC_SWITCH_ON_CHAIN_L, -STACKW_SIZE, OS_OTHER), + x(OC_SWITCH_ON_CHAIN_Q, -STACKW_SIZE, OS_OTHER), x(OC_PUSH_WORD_RETVAL, STACKW_SIZE, OS_ZERO), *************** *** 613,616 **** --- 647,651 ---- #define SHORT_FORM_OFFSET 1 #define LONG_FORM_OFFSET 2 + #define QUAD_FORM_OFFSET 3 #define FLOAT_FORM_OFFSET 3 #define DOUBLE_FORM_OFFSET 4 *************** *** 619,630 **** #endif ! #define N_OPCODE_SIZES 3 #define BYTE_FORM(o) ((opcode_t)((int)(o) + BYTE_FORM_OFFSET)) #define SHORT_FORM(o) ((opcode_t)((int)(o) + SHORT_FORM_OFFSET)) #define LONG_FORM(o) ((opcode_t)((int)(o) + LONG_FORM_OFFSET)) #define MAX_BYTE 0xff #define MAX_WORD 0xffff #endif --- 654,667 ---- #endif ! #define N_OPCODE_SIZES 4 #define BYTE_FORM(o) ((opcode_t)((int)(o) + BYTE_FORM_OFFSET)) #define SHORT_FORM(o) ((opcode_t)((int)(o) + SHORT_FORM_OFFSET)) #define LONG_FORM(o) ((opcode_t)((int)(o) + LONG_FORM_OFFSET)) + #define QUAD_FORM(o) ((opcode_t)((int)(o) + QUAD_FORM_OFFSET)) #define MAX_BYTE 0xff #define MAX_WORD 0xffff + #define MAX_LONG 0xffffffff #endif Index: xc_text.c =================================================================== RCS file: /cvsroot/ups/ups/ups/xc_text.c,v retrieving revision 1.6 retrieving revision 1.7 diff -C2 -d -r1.6 -r1.7 *** xc_text.c 16 Feb 2004 13:02:00 -0000 1.6 --- xc_text.c 18 Feb 2004 10:56:29 -0000 1.7 *************** *** 1250,1253 **** --- 1250,1254 ---- case OC_LINK_W: case OC_LINK_L: + case OC_LINK_Q: break; default: *************** *** 1620,1623 **** --- 1621,1625 ---- case OC_SWITCH_ON_CHAIN_W: case OC_SWITCH_ON_CHAIN_L: + case OC_SWITCH_ON_CHAIN_Q: jbuf.ju_type = JT_BRANCH; jbuf.ju_addr = pack_textloc(ma, cf, text - 1); *************** *** 1629,1632 **** --- 1631,1635 ---- case OC_CALL_W: case OC_CALL_L: + case OC_CALL_Q: case OC_CALL_INDIRECT: if (want_calls) { |