Use single index for param register allocation for windows callconv (… (#693)
* Use single index for param register allocation for windows callconv (#691) The used registers depend entirely on the parameter index (1st, 2nd, 3rd, 4th, ... param) and we cannot shift unused registers to other indexes, if they are not designated for the use for that parameter index.
This commit is contained in:
committed by
Benjamin Bouvier
parent
2f2626f4b3
commit
2a519092a0
@@ -115,9 +115,18 @@ impl ArgAssigner for Args {
|
||||
}
|
||||
|
||||
// Try to use an FPR.
|
||||
if ty.is_float() && self.fpr_used < self.fpr_limit {
|
||||
let reg = FPR.unit(self.fpr_used);
|
||||
self.fpr_used += 1;
|
||||
let fpr_offset = if self.call_conv == CallConv::WindowsFastcall {
|
||||
// Float and general registers on windows share the same parameter index.
|
||||
// The used register depends entirely on the parameter index: Even if XMM0
|
||||
// is not used for the first parameter, it cannot be used for the second parameter.
|
||||
debug_assert_eq!(self.fpr_limit, self.gpr.len());
|
||||
&mut self.gpr_used
|
||||
} else {
|
||||
&mut self.fpr_used
|
||||
};
|
||||
if ty.is_float() && *fpr_offset < self.fpr_limit {
|
||||
let reg = FPR.unit(*fpr_offset);
|
||||
*fpr_offset += 1;
|
||||
return ArgumentLoc::Reg(reg).into();
|
||||
}
|
||||
|
||||
|
||||
@@ -31,3 +31,9 @@ ebb0(v0: i64, v1: i64, v2: i64, v3: i64, v4: i64):
|
||||
return
|
||||
}
|
||||
; check: function %five_args(i64 [%rcx], i64 [%rdx], i64 [%r8], i64 [%r9], i64 [32], i64 fp [%rbp]) -> i64 fp [%rbp] windows_fastcall {
|
||||
|
||||
function %mixed_int_float(i64, f64, i64, f32) windows_fastcall {
|
||||
ebb0(v0: i64, v1: f64, v2: i64, v3: f32):
|
||||
return
|
||||
}
|
||||
; check: function %mixed_int_float(i64 [%rcx], f64 [%xmm1], i64 [%r8], f32 [%xmm3], i64 fp [%rbp]) -> i64 fp [%rbp] windows_fastcall {
|
||||
Reference in New Issue
Block a user