@@ -48,20 +48,15 @@ int TurboAssembler::RequiredStackSizeForCallerSaved(SaveFPRegsMode fp_mode,
4848 // However, we leave it in the argument list to mirror the prototype for
4949 // Push/PopCallerSaved().
5050
51- #if defined(V8_OS_WIN)
52- // X18 is excluded from caller-saved register list on Windows ARM64 which
53- // makes caller-saved registers in odd number. padreg is used accordingly
54- // to maintain the alignment.
51+ // X18 is excluded from caller-saved register list on ARM64 which makes
52+ // caller-saved registers in odd number. padreg is used accordingly to
53+ // maintain the alignment.
5554 DCHECK_EQ (list.Count () % 2 , 1 );
5655 if (exclusion.Is (no_reg)) {
5756 bytes += kXRegSizeInBits / 8 ;
5857 } else {
5958 bytes -= kXRegSizeInBits / 8 ;
6059 }
61- #else
62- DCHECK_EQ (list.Count () % 2 , 0 );
63- USE (exclusion);
64- #endif
6560
6661 bytes += list.Count () * kXRegSizeInBits / 8 ;
6762
@@ -77,21 +72,13 @@ int TurboAssembler::PushCallerSaved(SaveFPRegsMode fp_mode,
7772 int bytes = 0 ;
7873 auto list = kCallerSaved ;
7974
80- #if defined(V8_OS_WIN)
81- // X18 is excluded from caller-saved register list on Windows ARM64, use
82- // padreg accordingly to maintain alignment.
75+ // X18 is excluded from caller-saved register list on ARM64, use padreg
76+ // accordingly to maintain alignment.
8377 if (!exclusion.Is (no_reg)) {
8478 list.Remove (exclusion);
8579 } else {
8680 list.Combine (padreg);
8781 }
88- #else
89- if (!exclusion.Is (no_reg)) {
90- // Replace the excluded register with padding to maintain alignment.
91- list.Remove (exclusion);
92- list.Combine (padreg);
93- }
94- #endif
9582
9683 DCHECK_EQ (list.Count () % 2 , 0 );
9784 PushCPURegList (list);
@@ -115,21 +102,13 @@ int TurboAssembler::PopCallerSaved(SaveFPRegsMode fp_mode, Register exclusion) {
115102
116103 auto list = kCallerSaved ;
117104
118- #if defined(V8_OS_WIN)
119- // X18 is excluded from caller-saved register list on Windows ARM64, use
120- // padreg accordingly to maintain alignment.
105+ // X18 is excluded from caller-saved register list on ARM64, use padreg
106+ // accordingly to maintain alignment.
121107 if (!exclusion.Is (no_reg)) {
122108 list.Remove (exclusion);
123109 } else {
124110 list.Combine (padreg);
125111 }
126- #else
127- if (!exclusion.Is (no_reg)) {
128- // Replace the excluded register with padding to maintain alignment.
129- list.Remove (exclusion);
130- list.Combine (padreg);
131- }
132- #endif
133112
134113 DCHECK_EQ (list.Count () % 2 , 0 );
135114 PopCPURegList (list);
@@ -3408,14 +3387,20 @@ void MacroAssembler::Printf(const char * format,
34083387 TmpList ()->set_list (0 );
34093388 FPTmpList ()->set_list (0 );
34103389
3390+ // x18 is the platform register and is reserved for the use of platform ABIs.
3391+ // It is not part of the kCallerSaved list, but we add it here anyway to
3392+ // ensure `reg_list.Count() % 2 == 0` which is required in multiple spots.
3393+ CPURegList saved_registers = kCallerSaved ;
3394+ saved_registers.Combine (x18.code ());
3395+
34113396 // Preserve all caller-saved registers as well as NZCV.
34123397 // PushCPURegList asserts that the size of each list is a multiple of 16
34133398 // bytes.
3414- PushCPURegList (kCallerSaved );
3399+ PushCPURegList (saved_registers );
34153400 PushCPURegList (kCallerSavedV );
34163401
34173402 // We can use caller-saved registers as scratch values (except for argN).
3418- CPURegList tmp_list = kCallerSaved ;
3403+ CPURegList tmp_list = saved_registers ;
34193404 CPURegList fp_tmp_list = kCallerSavedV ;
34203405 tmp_list.Remove (arg0, arg1, arg2, arg3);
34213406 fp_tmp_list.Remove (arg0, arg1, arg2, arg3);
@@ -3435,7 +3420,8 @@ void MacroAssembler::Printf(const char * format,
34353420 // to PrintfNoPreserve as an argument.
34363421 Register arg_sp = temps.AcquireX ();
34373422 Add (arg_sp, sp,
3438- kCallerSaved .TotalSizeInBytes () + kCallerSavedV .TotalSizeInBytes ());
3423+ saved_registers.TotalSizeInBytes () +
3424+ kCallerSavedV .TotalSizeInBytes ());
34393425 if (arg0_sp) arg0 = Register::Create (arg_sp.code (), arg0.SizeInBits ());
34403426 if (arg1_sp) arg1 = Register::Create (arg_sp.code (), arg1.SizeInBits ());
34413427 if (arg2_sp) arg2 = Register::Create (arg_sp.code (), arg2.SizeInBits ());
@@ -3460,7 +3446,7 @@ void MacroAssembler::Printf(const char * format,
34603446 }
34613447
34623448 PopCPURegList (kCallerSavedV );
3463- PopCPURegList (kCallerSaved );
3449+ PopCPURegList (saved_registers );
34643450
34653451 TmpList ()->set_list (old_tmp_list);
34663452 FPTmpList ()->set_list (old_fp_tmp_list);
0 commit comments