@@ -109,6 +109,15 @@ let offset_addressing (Addrmode(base, ofs, cst)) delta =
109
109
let linear_addr reg ofs = Addrmode (Some reg, None , Coq_inl ofs)
110
110
let global_addr id ofs = Addrmode (None , None , Coq_inr (id, ofs))
111
111
112
+ (* Emit a 64-bit immediate add [dst <- src + imm]. *)
113
+
114
+ let emit_addimm64 dst src imm =
115
+ if Op. offset_in_range imm then
116
+ emit (Pleaq (dst, linear_addr src imm))
117
+ else begin
118
+ emit (Pmov_rr (dst, src)); emit (Paddq_ri (dst, Integers.Int64. repr imm))
119
+ end
120
+
112
121
(* Translate a builtin argument into an addressing mode *)
113
122
114
123
let addressing_of_builtin_arg = function
@@ -289,9 +298,9 @@ let expand_builtin_va_start_elf64 r =
289
298
emit (Pmovl_mr (linear_addr r _0z, RAX ));
290
299
emit (Pmovl_ri (RAX , coqint_of_camlint fp_offset));
291
300
emit (Pmovl_mr (linear_addr r _4z, RAX ));
292
- emit ( Pleaq ( RAX , linear_addr RSP (Z. of_uint64 overflow_arg_area)) );
301
+ emit_addimm64 RAX RSP (Z. of_uint64 overflow_arg_area);
293
302
emit (Pmovq_mr (linear_addr r _8z, RAX ));
294
- emit ( Pleaq ( RAX , linear_addr RSP (Z. of_uint64 reg_save_area)) );
303
+ emit_addimm64 RAX RSP (Z. of_uint64 reg_save_area);
295
304
emit (Pmovq_mr (linear_addr r _16z, RAX ))
296
305
297
306
let expand_builtin_va_start_win64 r =
@@ -302,7 +311,7 @@ let expand_builtin_va_start_win64 r =
302
311
let ofs =
303
312
Int64. (add ! current_function_stacksize
304
313
(mul 8L (of_int num_args))) in
305
- emit ( Pleaq ( RAX , linear_addr RSP (Z. of_uint64 ofs)) );
314
+ emit_addimm64 RAX RSP (Z. of_uint64 ofs);
306
315
emit (Pmovq_mr (linear_addr r _0z, RAX ))
307
316
308
317
(* FMA operations *)
@@ -550,10 +559,8 @@ let expand_instruction instr =
550
559
emit (Psubl_ri (RSP , sz'));
551
560
emit (Pcfi_adjust sz');
552
561
(* Stack chaining *)
553
- let addr1 = linear_addr RSP (Z. of_uint (sz + 8 )) in
554
- let addr2 = linear_addr RSP ofs_link in
555
- emit (Pleaq (RAX ,addr1));
556
- emit (Pmovq_mr (addr2, RAX ));
562
+ emit_addimm64 RAX RSP (Z. of_uint (sz + 8 ));
563
+ emit (Pmovq_mr (linear_addr RSP ofs_link, RAX ));
557
564
current_function_stacksize := Int64. of_int (sz + 8 )
558
565
end else if Archi. ptr64 then begin
559
566
let (sz, save_regs) = sp_adjustment_elf64 sz in
@@ -563,16 +570,14 @@ let expand_instruction instr =
563
570
emit (Pcfi_adjust sz');
564
571
if save_regs > = 0 then begin
565
572
(* Save the registers *)
566
- emit ( Pleaq ( R10 , linear_addr RSP (Z. of_uint save_regs)) );
573
+ emit_addimm64 R10 RSP (Z. of_uint save_regs);
567
574
emit (Pcall_s (intern_string " __compcert_va_saveregs" ,
568
575
{sig_args = [] ; sig_res = Tvoid ; sig_cc = cc_default}))
569
576
end ;
570
577
(* Stack chaining *)
571
578
let fullsz = sz + 8 in
572
- let addr1 = linear_addr RSP (Z. of_uint fullsz) in
573
- let addr2 = linear_addr RSP ofs_link in
574
- emit (Pleaq (RAX , addr1));
575
- emit (Pmovq_mr (addr2, RAX ));
579
+ emit_addimm64 RAX RSP (Z. of_uint fullsz);
580
+ emit (Pmovq_mr (linear_addr RSP ofs_link, RAX ));
576
581
current_function_stacksize := Int64. of_int fullsz
577
582
end else begin
578
583
let sz = sp_adjustment_32 sz in
0 commit comments