Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1153)

Unified Diff: src/assembler.cc

Issue 1738623003: [wasm] Int64Lowering of FXXXConvertI64 instructions. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Another try on windows. Created 4 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: src/assembler.cc
diff --git a/src/assembler.cc b/src/assembler.cc
index 5c8c2ce16d97cf646fd774a4b8c1bcc960c75702..3fbff975c610aaec2f876858f061fe912e986563 100644
--- a/src/assembler.cc
+++ b/src/assembler.cc
@@ -1147,66 +1147,112 @@ ExternalReference ExternalReference::compute_output_frames_function(
Redirect(isolate, FUNCTION_ADDR(Deoptimizer::ComputeOutputFrames)));
}
-static void f32_trunc_wrapper(float* param) { *param = truncf(*param); }
+static void wasm_f32_trunc_wrapper(float* param) { *param = truncf(*param); }
titzer 2016/02/28 15:26:03 Can we extract these wrappers to a header/cc file
ahaas 2016/03/02 14:02:56 Done. I only extracted the static functions, the o
titzer 2016/03/02 14:06:20 The goal there is to introduce an interface betwee
-ExternalReference ExternalReference::f32_trunc_wrapper_function(
- Isolate* isolate) {
- return ExternalReference(Redirect(isolate, FUNCTION_ADDR(f32_trunc_wrapper)));
+ExternalReference ExternalReference::wasm_f32_trunc(Isolate* isolate) {
+ return ExternalReference(
+ Redirect(isolate, FUNCTION_ADDR(wasm_f32_trunc_wrapper)));
}
-static void f32_floor_wrapper(float* param) { *param = floorf(*param); }
+static void wasm_f32_floor_wrapper(float* param) { *param = floorf(*param); }
-ExternalReference ExternalReference::f32_floor_wrapper_function(
- Isolate* isolate) {
- return ExternalReference(Redirect(isolate, FUNCTION_ADDR(f32_floor_wrapper)));
+ExternalReference ExternalReference::wasm_f32_floor(Isolate* isolate) {
+ return ExternalReference(
+ Redirect(isolate, FUNCTION_ADDR(wasm_f32_floor_wrapper)));
}
-static void f32_ceil_wrapper(float* param) { *param = ceilf(*param); }
+static void wasm_f32_ceil_wrapper(float* param) { *param = ceilf(*param); }
-ExternalReference ExternalReference::f32_ceil_wrapper_function(
- Isolate* isolate) {
- return ExternalReference(Redirect(isolate, FUNCTION_ADDR(f32_ceil_wrapper)));
+ExternalReference ExternalReference::wasm_f32_ceil(Isolate* isolate) {
+ return ExternalReference(
+ Redirect(isolate, FUNCTION_ADDR(wasm_f32_ceil_wrapper)));
}
-static void f32_nearest_int_wrapper(float* param) {
+static void wasm_f32_nearest_int_wrapper(float* param) {
*param = nearbyintf(*param);
}
-ExternalReference ExternalReference::f32_nearest_int_wrapper_function(
- Isolate* isolate) {
+ExternalReference ExternalReference::wasm_f32_nearest_int(Isolate* isolate) {
return ExternalReference(
- Redirect(isolate, FUNCTION_ADDR(f32_nearest_int_wrapper)));
+ Redirect(isolate, FUNCTION_ADDR(wasm_f32_nearest_int_wrapper)));
}
-static void f64_trunc_wrapper(double* param) { *param = trunc(*param); }
+static void wasm_f64_trunc_wrapper(double* param) { *param = trunc(*param); }
-ExternalReference ExternalReference::f64_trunc_wrapper_function(
- Isolate* isolate) {
- return ExternalReference(Redirect(isolate, FUNCTION_ADDR(f64_trunc_wrapper)));
+ExternalReference ExternalReference::wasm_f64_trunc(Isolate* isolate) {
+ return ExternalReference(
+ Redirect(isolate, FUNCTION_ADDR(wasm_f64_trunc_wrapper)));
}
-static void f64_floor_wrapper(double* param) { *param = floor(*param); }
+static void wasm_f64_floor_wrapper(double* param) { *param = floor(*param); }
-ExternalReference ExternalReference::f64_floor_wrapper_function(
- Isolate* isolate) {
- return ExternalReference(Redirect(isolate, FUNCTION_ADDR(f64_floor_wrapper)));
+ExternalReference ExternalReference::wasm_f64_floor(Isolate* isolate) {
+ return ExternalReference(
+ Redirect(isolate, FUNCTION_ADDR(wasm_f64_floor_wrapper)));
}
-static void f64_ceil_wrapper(double* param) { *param = ceil(*param); }
+static void wasm_f64_ceil_wrapper(double* param) { *param = ceil(*param); }
-ExternalReference ExternalReference::f64_ceil_wrapper_function(
- Isolate* isolate) {
- return ExternalReference(Redirect(isolate, FUNCTION_ADDR(f64_ceil_wrapper)));
+ExternalReference ExternalReference::wasm_f64_ceil(Isolate* isolate) {
+ return ExternalReference(
+ Redirect(isolate, FUNCTION_ADDR(wasm_f64_ceil_wrapper)));
}
-static void f64_nearest_int_wrapper(double* param) {
+static void wasm_f64_nearest_int_wrapper(double* param) {
*param = nearbyint(*param);
}
-ExternalReference ExternalReference::f64_nearest_int_wrapper_function(
- Isolate* isolate) {
+ExternalReference ExternalReference::wasm_f64_nearest_int(Isolate* isolate) {
+ return ExternalReference(
+ Redirect(isolate, FUNCTION_ADDR(wasm_f64_nearest_int_wrapper)));
+}
+
+static void wasm_int64_to_float32_wrapper(int64_t* input, float* output) {
+ *output = static_cast<float>(*input);
+}
+
+ExternalReference ExternalReference::wasm_int64_to_float32(Isolate* isolate) {
+ return ExternalReference(
+ Redirect(isolate, FUNCTION_ADDR(wasm_int64_to_float32_wrapper)));
+}
+
+static void wasm_uint64_to_float32_wrapper(uint64_t* input, float* output) {
+ uint64_t value = *input;
+
+#if V8_CC_MSVC
+ // static_cast<float> is compiled to static_cast<float>(static_cast<double>)
+ // by MSVC. Since static_cast<double> can loose information which may be
+ // required for correct rounding, we take the OR of the 11 LSB and store them
+ // the resulting value in a bit which is representable in float64 but not
+ // representable in float32 (I picked 30 because it sounded good).
+ if (value & 0x8000000000000000) {
+ value |= (((value & 0x7ff) != 0 ? 1 : 0) << 30);
+ }
+#endif
+ *output = static_cast<float>(value);
+}
+
+ExternalReference ExternalReference::wasm_uint64_to_float32(Isolate* isolate) {
+ return ExternalReference(
+ Redirect(isolate, FUNCTION_ADDR(wasm_uint64_to_float32_wrapper)));
+}
+
+static void wasm_int64_to_float64_wrapper(int64_t* input, double* output) {
+ *output = static_cast<double>(*input);
+}
+
+ExternalReference ExternalReference::wasm_int64_to_float64(Isolate* isolate) {
+ return ExternalReference(
+ Redirect(isolate, FUNCTION_ADDR(wasm_int64_to_float64_wrapper)));
+}
+
+static void wasm_uint64_to_float64_wrapper(uint64_t* input, double* output) {
+ *output = static_cast<double>(*input);
+}
+
+ExternalReference ExternalReference::wasm_uint64_to_float64(Isolate* isolate) {
return ExternalReference(
- Redirect(isolate, FUNCTION_ADDR(f64_nearest_int_wrapper)));
+ Redirect(isolate, FUNCTION_ADDR(wasm_uint64_to_float64_wrapper)));
}
ExternalReference ExternalReference::log_enter_external_function(
« no previous file with comments | « src/assembler.h ('k') | src/compiler/wasm-compiler.h » ('j') | src/compiler/wasm-compiler.cc » ('J')

Powered by Google App Engine
This is Rietveld 408576698