1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
|
# HG changeset patch
# Parent ee20da83ab99b4e34165c5eb76fe48208b659974
# User Marty Rosenberg <mrosenberg@mozilla.com>
make sm build when build as armhf.
diff --git a/js/src/jit/BaselineIC.cpp b/js/src/jit/BaselineIC.cpp
--- a/js/src/jit/BaselineIC.cpp
+++ b/js/src/jit/BaselineIC.cpp
@@ -1920,17 +1920,16 @@ ICCompare_Fallback::Compiler::generateSt
masm.pushValue(R0);
masm.pushValue(R1);
// Push arguments.
masm.pushValue(R1);
masm.pushValue(R0);
masm.push(BaselineStubReg);
masm.pushBaselineFramePtr(BaselineFrameReg, R0.scratchReg());
-
return tailCallVM(DoCompareFallbackInfo, masm);
}
//
// Compare_String
//
bool
diff --git a/js/src/jit/arm/MacroAssembler-arm.cpp b/js/src/jit/arm/MacroAssembler-arm.cpp
--- a/js/src/jit/arm/MacroAssembler-arm.cpp
+++ b/js/src/jit/arm/MacroAssembler-arm.cpp
@@ -3479,16 +3479,17 @@ MacroAssemblerARMCompat::setupABICall(ui
JS_ASSERT(!inCall_);
inCall_ = true;
args_ = args;
passedArgs_ = 0;
passedArgTypes_ = 0;
#ifdef JS_CODEGEN_ARM_HARDFP
usedIntSlots_ = 0;
usedFloatSlots_ = 0;
+ usedFloat32_ = false;
padding_ = 0;
#else
usedSlots_ = 0;
#endif
floatArgsInGPR[0] = MoveOperand();
floatArgsInGPR[1] = MoveOperand();
floatArgsInGPRValid[0] = false;
floatArgsInGPRValid[1] = false;
@@ -3521,41 +3522,55 @@ MacroAssemblerARMCompat::passABIArg(cons
{
MoveOperand to;
++passedArgs_;
if (!enoughMemory_)
return;
switch (type) {
case MoveOp::FLOAT32:
case MoveOp::DOUBLE: {
+ JS_ASSERT(!usedFloat32_);
+ if (type == MoveOp::FLOAT32)
+ usedFloat32_ = true;
FloatRegister fr;
if (GetFloatArgReg(usedIntSlots_, usedFloatSlots_, &fr)) {
if (from.isFloatReg() && from.floatReg() == fr) {
// Nothing to do; the value is in the right register already
+ usedFloatSlots_++;
+ if (type == MoveOp::FLOAT32)
+ passedArgTypes_ = (passedArgTypes_ << ArgType_Shift) | ArgType_Float32;
+ else
+ passedArgTypes_ = (passedArgTypes_ << ArgType_Shift) | ArgType_Double;
return;
}
to = MoveOperand(fr);
} else {
// If (and only if) the integer registers have started spilling, do we
// need to take the register's alignment into account
- uint32_t disp = GetFloatArgStackDisp(usedIntSlots_, usedFloatSlots_, &padding_);
+ uint32_t disp = INT_MAX;
+ if (type == MoveOp::FLOAT32)
+ disp = GetFloat32ArgStackDisp(usedIntSlots_, usedFloatSlots_, &padding_);
+ else
+ disp = GetDoubleArgStackDisp(usedIntSlots_, usedFloatSlots_, &padding_);
to = MoveOperand(sp, disp);
}
usedFloatSlots_++;
if (type == MoveOp::FLOAT32)
passedArgTypes_ = (passedArgTypes_ << ArgType_Shift) | ArgType_Float32;
else
passedArgTypes_ = (passedArgTypes_ << ArgType_Shift) | ArgType_Double;
break;
}
case MoveOp::GENERAL: {
Register r;
if (GetIntArgReg(usedIntSlots_, usedFloatSlots_, &r)) {
if (from.isGeneralReg() && from.reg() == r) {
// Nothing to do; the value is in the right register already
+ usedIntSlots_++;
+ passedArgTypes_ = (passedArgTypes_ << ArgType_Shift) | ArgType_General;
return;
}
to = MoveOperand(r);
} else {
uint32_t disp = GetIntArgStackDisp(usedIntSlots_, usedFloatSlots_, &padding_);
to = MoveOperand(sp, disp);
}
usedIntSlots_++;
diff --git a/js/src/jit/arm/MacroAssembler-arm.h b/js/src/jit/arm/MacroAssembler-arm.h
--- a/js/src/jit/arm/MacroAssembler-arm.h
+++ b/js/src/jit/arm/MacroAssembler-arm.h
@@ -443,16 +443,17 @@ class MacroAssemblerARMCompat : public M
// The actual number of arguments that were passed, used to assert that
// the initial number of arguments declared was correct.
uint32_t passedArgs_;
uint32_t passedArgTypes_;
#ifdef JS_CODEGEN_ARM_HARDFP
uint32_t usedIntSlots_;
uint32_t usedFloatSlots_;
+ bool usedFloat32_;
uint32_t padding_;
#else
// ARM treats arguments as a vector in registers/memory, that looks like:
// { r0, r1, r2, r3, [sp], [sp,+4], [sp,+8] ... }
// usedSlots_ keeps track of how many of these have been used.
// It bears a passing resemblance to passedArgs_, but a single argument
// can effectively use between one and three slots depending on its size and
// alignment requirements
|