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
|
Without ChangeLog change.
From 7ba6eb5405cb66c97398f8cdb6d5f9e919ba6131 Mon Sep 17 00:00:00 2001
From: "rgabor@webkit.org"
<rgabor@webkit.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Date: Tue, 12 Mar 2013 15:28:10 +0000
Subject: [PATCH] https://bugs.webkit.org/show_bug.cgi?id=112141 LLInt CLoop
backend misses Double2Ints() on 32bit architectures
Reviewed by Filip Pizlo.
Implement Double2Ints() in CLoop backend of LLInt on 32bit architectures.
* llint/LowLevelInterpreter.cpp:
(LLInt):
(JSC::LLInt::Double2Ints):
* offlineasm/cloop.rb:
git-svn-id: http://svn.webkit.org/repository/webkit/trunk@145551 268f45cc-cd09-0410-ab3c-d52691b4dbfc
---
Source/JavaScriptCore/ChangeLog | 14 ++++++++++++++
Source/JavaScriptCore/llint/LowLevelInterpreter.cpp | 11 +++++++++++
Source/JavaScriptCore/offlineasm/cloop.rb | 2 +-
3 files changed, 26 insertions(+), 1 deletion(-)
diff --git a/Source/JavaScriptCore/llint/LowLevelInterpreter.cpp b/Source/JavaScriptCore/llint/LowLevelInterpreter.cpp
index d3c73b0..186c659 100644
--- a/Source/JavaScriptCore/llint/LowLevelInterpreter.cpp
+++ b/Source/JavaScriptCore/llint/LowLevelInterpreter.cpp
@@ -117,6 +117,17 @@ static double Ints2Double(uint32_t lo, uint32_t hi)
u.ival64 = (static_cast<uint64_t>(hi) << 32) | lo;
return u.dval;
}
+
+static void Double2Ints(double val, uint32_t& lo, uint32_t& hi)
+{
+ union {
+ double dval;
+ uint64_t ival64;
+ } u;
+ u.dval = val;
+ hi = static_cast<uint32_t>(u.ival64 >> 32);
+ lo = static_cast<uint32_t>(u.ival64);
+}
#endif // USE(JSVALUE32_64)
} // namespace LLint
diff --git a/Source/JavaScriptCore/offlineasm/cloop.rb b/Source/JavaScriptCore/offlineasm/cloop.rb
index 14cacb9..f6bd552 100644
--- a/Source/JavaScriptCore/offlineasm/cloop.rb
+++ b/Source/JavaScriptCore/offlineasm/cloop.rb
@@ -1025,7 +1025,7 @@ class Instruction
# 32-bit instruction: f2dii dblOp int32LoOp int32HiOp (based on ARMv7)
# Encode a 64-bit double into 2 32-bit ints (low and high).
when "fd2ii"
- $asm.putc "Double2Ints(#{operands[0].clValue(:double)}, #{operands[1].clValue}, #{operands[2].clValue});"
+ $asm.putc "Double2Ints(#{operands[0].clValue(:double)}, #{operands[1].clValue(:uint32)}, #{operands[2].clValue(:uint32)});"
# 64-bit instruction: fq2d int64Op dblOp (based on X64)
# Copy a bit-encoded double in a 64-bit int register to a double register.
--
1.8.2.1
|