Index: vm/port/src/lil/em64t/pim/lil_code_generator_em64t.cpp =================================================================== --- vm/port/src/lil/em64t/pim/lil_code_generator_em64t.cpp (revision 517276) +++ vm/port/src/lil/em64t/pim/lil_code_generator_em64t.cpp (working copy) @@ -325,8 +325,12 @@ } #endif LilType t; + unsigned gp_param_cnt = 0; +#ifdef _WIN64 +#define fp_param_cnt gp_param_cnt +#else unsigned fp_param_cnt = 0; - unsigned gp_param_cnt = 0; +#endif for (unsigned i = 0; i < n; i++) { t = lil_sig_get_arg_type(lil_cs_get_sig(cs), i); if (context.is_fp_type(t)) { @@ -348,7 +352,7 @@ return new(mem) LcgEM64TLoc(LLK_FStk, offset); } else { return new(mem) LcgEM64TLoc(LLK_Fr, - LcgEM64TContext::FR_OUTPUTS_OFFSET + fp_param_cnt); + LcgEM64TContext::FR_OUTPUTS_OFFSET + fp_param_cnt); } } else { unsigned gp_on_stack = gp_param_cnt > LcgEM64TContext::MAX_GR_OUTPUTS @@ -362,7 +366,10 @@ // skip rip offset += LcgEM64TContext::GR_SIZE; // skip size allocated for preceding inputs - offset += gp_on_stack + fp_on_stack ; + offset += gp_on_stack; +#ifndef _WIN64 + offset += fp_on_stack; +#endif return new(mem) LcgEM64TLoc(LLK_FStk, offset); } } else { // if (context.is_fp_type(t)) @@ -388,7 +395,10 @@ // skip rip offset += LcgEM64TContext::GR_SIZE; // skip size allocated for preceding inputs - offset += gp_on_stack + fp_on_stack ; + offset += gp_on_stack; +#ifndef _WIN64 + offset += fp_on_stack; +#endif return new(mem) LcgEM64TLoc(LLK_GStk, offset); } } @@ -400,8 +410,12 @@ assert(n <= context.get_num_outputs()); LilType t; + unsigned gp_param_cnt = 0; +#ifdef _WIN64 +#define fp_param_cnt gp_param_cnt +#else unsigned fp_param_cnt = 0; - unsigned gp_param_cnt = 0; +#endif for (unsigned i = 0; i < n; i++) { t = lil_sig_get_arg_type(out_sig, i); if (context.is_fp_type(t)) { @@ -425,7 +439,10 @@ unsigned fp_on_stack = fp_param_cnt > LcgEM64TContext::MAX_FR_OUTPUTS ? (fp_param_cnt - LcgEM64TContext::MAX_FR_OUTPUTS) * LcgEM64TContext::FR_SIZE : 0; - int32 offset = gp_on_stack + fp_on_stack; + int32 offset = gp_on_stack; +#ifndef _WIN64 + offset += fp_on_stack; +#endif return new(mem) LcgEM64TLoc(LLK_FStk, offset); } } else { @@ -439,7 +456,10 @@ unsigned fp_on_stack = fp_param_cnt > LcgEM64TContext::MAX_FR_OUTPUTS ? (fp_param_cnt - LcgEM64TContext::MAX_FR_OUTPUTS) * LcgEM64TContext::FR_SIZE : 0; - int32 offset = gp_on_stack + fp_on_stack; + int32 offset = gp_on_stack; +#ifndef _WIN64 + offset += fp_on_stack; +#endif return new(mem) LcgEM64TLoc(LLK_GStk, offset); } } Index: vm/port/src/lil/em64t/pim/include/lil_code_generator_em64t.h =================================================================== --- vm/port/src/lil/em64t/pim/include/lil_code_generator_em64t.h (revision 517276) +++ vm/port/src/lil/em64t/pim/include/lil_code_generator_em64t.h (working copy) @@ -151,11 +151,21 @@ unsigned n_inputs; // total number of inputs unsigned n_gr_inputs; // total number of GRs reserved for inputs +#ifdef _WIN64 + // Windows x64 has 4 slots for both integer and float inputs +#define n_fr_inputs n_gr_inputs +#else unsigned n_fr_inputs; // total number of FRs reserved for inputs +#endif unsigned n_outputs; // total number of outputs unsigned n_gr_outputs; // total number of GRs reserved for outputs +#ifdef _WIN64 + // Windows x64 has 4 slots for both integer and float inputs +#define n_fr_outputs n_gr_outputs +#else unsigned n_fr_outputs; // total number of FRs reserved for outputs +#endif /// Number of GR registers currently allocated for temporary needs. unsigned m_tmp_grs_used; Index: vm/port/src/lil/lil.cpp =================================================================== --- vm/port/src/lil/lil.cpp (revision 517276) +++ vm/port/src/lil/lil.cpp (working copy) @@ -569,7 +569,7 @@ *src += start; char specifier = lil_parse_percent(src, va); if (specifier=='i') { - v->index = va_arg(va->val, int); + v->index = va_arg(va->val, POINTER_SIZE_INT); return true; } else { if (specifier) error(src, "bad specifier for variable index", "");