Commit 06de28d2 authored by Milad Farazmand's avatar Milad Farazmand Committed by Commit Bot

s390: [wasm-simd] Enable simd on the s390x architecture

This Cl enables simd on machines which support
VECTOR_ENHANCE_FACILITY_1. It also enables related tests to
match execution on x64.

LoadTransform tests must be skipped on the simulator until a future CL
matches behaviour between native BE and its simulator on LE.

Change-Id: Iaadc32e0388bf15d3d7c550062a373fb403b65c4
Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/2107053Reviewed-by: 's avatarClemens Backes <clemensb@chromium.org>
Reviewed-by: 's avatarZhi An Ng <zhin@chromium.org>
Reviewed-by: 's avatarDeepti Gandluri <gdeepti@chromium.org>
Commit-Queue: Milad Farazmand <miladfar@ca.ibm.com>
Cr-Commit-Position: refs/heads/master@{#66754}
parent 97014f60
...@@ -48,7 +48,9 @@ namespace internal { ...@@ -48,7 +48,9 @@ namespace internal {
bool CpuFeatures::SupportsOptimizer() { return true; } bool CpuFeatures::SupportsOptimizer() { return true; }
bool CpuFeatures::SupportsWasmSimd128() { return false; } bool CpuFeatures::SupportsWasmSimd128() {
return CpuFeatures::IsSupported(VECTOR_ENHANCE_FACILITY_1);
}
void RelocInfo::apply(intptr_t delta) { void RelocInfo::apply(intptr_t delta) {
// Absolute code pointer inside code object moves with the code object. // Absolute code pointer inside code object moves with the code object.
......
...@@ -615,4 +615,17 @@ ...@@ -615,4 +615,17 @@
'test-cpu-profiler/DeoptUntrackedFunction': [SKIP], 'test-cpu-profiler/DeoptUntrackedFunction': [SKIP],
}], # variant == turboprop }], # variant == turboprop
##############################################################################
['arch == s390x and simulator_run', {
# LoadTransform must also follow BE behaviour on sim (see http://crrev.com/c/2050811).
# Skip tests until V8_TARGET_BIG_ENDIAN also applies to the simulator.
'test-run-wasm-simd/RunWasm_I64x2Load*': [SKIP],
'test-run-wasm-simd/RunWasm_I32x4Load*': [SKIP],
'test-run-wasm-simd/RunWasm_I16x8Load*': [SKIP],
'test-run-wasm-simd/RunWasm_S64x2Load*': [SKIP],
'test-run-wasm-simd/RunWasm_S32x4Load*': [SKIP],
'test-run-wasm-simd/RunWasm_S16x8Load*': [SKIP],
'test-run-wasm-simd/RunWasm_S8x16Load*': [SKIP],
}], # 'arch == s390x and simulator_run'
] ]
...@@ -306,7 +306,7 @@ int64_t Less(double a, double b) { return a < b ? -1 : 0; } ...@@ -306,7 +306,7 @@ int64_t Less(double a, double b) { return a < b ? -1 : 0; }
int64_t LessEqual(double a, double b) { return a <= b ? -1 : 0; } int64_t LessEqual(double a, double b) { return a <= b ? -1 : 0; }
#if V8_TARGET_ARCH_X64 || V8_TARGET_ARCH_ARM64 #if V8_TARGET_ARCH_X64 || V8_TARGET_ARCH_ARM64 || V8_TARGET_ARCH_S390X
// Only used for qfma and qfms tests below. // Only used for qfma and qfms tests below.
// FMOperation holds the params (a, b, c) for a Multiply-Add or // FMOperation holds the params (a, b, c) for a Multiply-Add or
...@@ -391,7 +391,7 @@ bool ExpectFused(ExecutionTier tier) { ...@@ -391,7 +391,7 @@ bool ExpectFused(ExecutionTier tier) {
return (tier == ExecutionTier::kTurbofan || tier == ExecutionTier::kLiftoff); return (tier == ExecutionTier::kTurbofan || tier == ExecutionTier::kLiftoff);
#endif #endif
} }
#endif // V8_TARGET_ARCH_X64 || V8_TARGET_ARCH_ARM64 #endif // V8_TARGET_ARCH_X64 || V8_TARGET_ARCH_ARM64 || V8_TARGET_ARCH_S390X
} // namespace } // namespace
...@@ -880,7 +880,7 @@ WASM_SIMD_TEST(F32x4Le) { ...@@ -880,7 +880,7 @@ WASM_SIMD_TEST(F32x4Le) {
RunF32x4CompareOpTest(execution_tier, lower_simd, kExprF32x4Le, LessEqual); RunF32x4CompareOpTest(execution_tier, lower_simd, kExprF32x4Le, LessEqual);
} }
#if V8_TARGET_ARCH_X64 || V8_TARGET_ARCH_ARM64 #if V8_TARGET_ARCH_X64 || V8_TARGET_ARCH_ARM64 || V8_TARGET_ARCH_S390X
WASM_SIMD_TEST_NO_LOWERING(F32x4Qfma) { WASM_SIMD_TEST_NO_LOWERING(F32x4Qfma) {
FLAG_SCOPE(wasm_simd_post_mvp); FLAG_SCOPE(wasm_simd_post_mvp);
WasmRunner<int32_t, float, float, float> r(execution_tier, lower_simd); WasmRunner<int32_t, float, float, float> r(execution_tier, lower_simd);
...@@ -930,7 +930,7 @@ WASM_SIMD_TEST_NO_LOWERING(F32x4Qfms) { ...@@ -930,7 +930,7 @@ WASM_SIMD_TEST_NO_LOWERING(F32x4Qfms) {
} }
} }
} }
#endif // V8_TARGET_ARCH_X64 || V8_TARGET_ARCH_ARM64 #endif // V8_TARGET_ARCH_X64 || V8_TARGET_ARCH_ARM64 || V8_TARGET_ARCH_S390X
WASM_SIMD_TEST_NO_LOWERING(I64x2Splat) { WASM_SIMD_TEST_NO_LOWERING(I64x2Splat) {
WasmRunner<int32_t, int64_t> r(execution_tier, lower_simd); WasmRunner<int32_t, int64_t> r(execution_tier, lower_simd);
...@@ -1092,7 +1092,7 @@ WASM_SIMD_TEST_NO_LOWERING(I64x2Sub) { ...@@ -1092,7 +1092,7 @@ WASM_SIMD_TEST_NO_LOWERING(I64x2Sub) {
base::SubWithWraparound); base::SubWithWraparound);
} }
#if V8_TARGET_ARCH_X64 || V8_TARGET_ARCH_ARM64 #if V8_TARGET_ARCH_X64 || V8_TARGET_ARCH_ARM64 || V8_TARGET_ARCH_S390X
WASM_SIMD_TEST_NO_LOWERING(I64x2Eq) { WASM_SIMD_TEST_NO_LOWERING(I64x2Eq) {
RunI64x2BinOpTest(execution_tier, lower_simd, kExprI64x2Eq, Equal); RunI64x2BinOpTest(execution_tier, lower_simd, kExprI64x2Eq, Equal);
} }
...@@ -1134,7 +1134,7 @@ WASM_SIMD_TEST_NO_LOWERING(I64x2GeU) { ...@@ -1134,7 +1134,7 @@ WASM_SIMD_TEST_NO_LOWERING(I64x2GeU) {
RunI64x2BinOpTest(execution_tier, lower_simd, kExprI64x2GeU, RunI64x2BinOpTest(execution_tier, lower_simd, kExprI64x2GeU,
UnsignedGreaterEqual); UnsignedGreaterEqual);
} }
#endif // V8_TARGET_ARCH_X64 || V8_TARGET_ARCH_ARM64 #endif // V8_TARGET_ARCH_X64 || V8_TARGET_ARCH_ARM64 || V8_TARGET_ARCH_S390X
WASM_SIMD_TEST_NO_LOWERING(F64x2Splat) { WASM_SIMD_TEST_NO_LOWERING(F64x2Splat) {
WasmRunner<int32_t, double> r(execution_tier, lower_simd); WasmRunner<int32_t, double> r(execution_tier, lower_simd);
...@@ -1203,7 +1203,7 @@ WASM_SIMD_TEST_NO_LOWERING(F64x2ReplaceLane) { ...@@ -1203,7 +1203,7 @@ WASM_SIMD_TEST_NO_LOWERING(F64x2ReplaceLane) {
CHECK_EQ(1., ReadLittleEndianValue<double>(&g1[1])); CHECK_EQ(1., ReadLittleEndianValue<double>(&g1[1]));
} }
#if V8_TARGET_ARCH_X64 || V8_TARGET_ARCH_ARM64 #if V8_TARGET_ARCH_X64 || V8_TARGET_ARCH_ARM64 || V8_TARGET_ARCH_S390X
WASM_SIMD_TEST_NO_LOWERING(F64x2ExtractLaneWithI64x2) { WASM_SIMD_TEST_NO_LOWERING(F64x2ExtractLaneWithI64x2) {
WasmRunner<int64_t> r(execution_tier, lower_simd); WasmRunner<int64_t> r(execution_tier, lower_simd);
BUILD(r, WASM_IF_ELSE_L( BUILD(r, WASM_IF_ELSE_L(
...@@ -1223,7 +1223,7 @@ WASM_SIMD_TEST_NO_LOWERING(I64x2ExtractWithF64x2) { ...@@ -1223,7 +1223,7 @@ WASM_SIMD_TEST_NO_LOWERING(I64x2ExtractWithF64x2) {
WASM_I64V(1), WASM_I64V(0))); WASM_I64V(1), WASM_I64V(0)));
CHECK_EQ(1, r.Call()); CHECK_EQ(1, r.Call());
} }
#endif // V8_TARGET_ARCH_X64 || V8_TARGET_ARCH_ARM64 #endif // V8_TARGET_ARCH_X64 || V8_TARGET_ARCH_ARM64 || V8_TARGET_ARCH_S390X
bool IsExtreme(double x) { bool IsExtreme(double x) {
double abs_x = std::fabs(x); double abs_x = std::fabs(x);
...@@ -1486,7 +1486,7 @@ WASM_SIMD_TEST_NO_LOWERING(I64x2Mul) { ...@@ -1486,7 +1486,7 @@ WASM_SIMD_TEST_NO_LOWERING(I64x2Mul) {
base::MulWithWraparound); base::MulWithWraparound);
} }
#if V8_TARGET_ARCH_X64 #if V8_TARGET_ARCH_X64 || V8_TARGET_ARCH_S390X
WASM_SIMD_TEST_NO_LOWERING(I64x2MinS) { WASM_SIMD_TEST_NO_LOWERING(I64x2MinS) {
RunI64x2BinOpTest(execution_tier, lower_simd, kExprI64x2MinS, Minimum); RunI64x2BinOpTest(execution_tier, lower_simd, kExprI64x2MinS, Minimum);
} }
...@@ -1504,9 +1504,9 @@ WASM_SIMD_TEST_NO_LOWERING(I64x2MaxU) { ...@@ -1504,9 +1504,9 @@ WASM_SIMD_TEST_NO_LOWERING(I64x2MaxU) {
RunI64x2BinOpTest(execution_tier, lower_simd, kExprI64x2MaxU, RunI64x2BinOpTest(execution_tier, lower_simd, kExprI64x2MaxU,
UnsignedMaximum); UnsignedMaximum);
} }
#endif // V8_TARGET_ARCH_X64 #endif // V8_TARGET_ARCH_X64 || V8_TARGET_ARCH_S390X
#if V8_TARGET_ARCH_X64 || V8_TARGET_ARCH_ARM64 #if V8_TARGET_ARCH_X64 || V8_TARGET_ARCH_ARM64 || V8_TARGET_ARCH_S390X
WASM_SIMD_TEST_NO_LOWERING(F64x2Qfma) { WASM_SIMD_TEST_NO_LOWERING(F64x2Qfma) {
FLAG_SCOPE(wasm_simd_post_mvp); FLAG_SCOPE(wasm_simd_post_mvp);
WasmRunner<int32_t, double, double, double> r(execution_tier, lower_simd); WasmRunner<int32_t, double, double, double> r(execution_tier, lower_simd);
...@@ -1556,7 +1556,7 @@ WASM_SIMD_TEST_NO_LOWERING(F64x2Qfms) { ...@@ -1556,7 +1556,7 @@ WASM_SIMD_TEST_NO_LOWERING(F64x2Qfms) {
} }
} }
} }
#endif // V8_TARGET_ARCH_X64 || V8_TARGET_ARCH_ARM64 #endif // V8_TARGET_ARCH_X64 || V8_TARGET_ARCH_ARM64 || V8_TARGET_ARCH_S390X
WASM_SIMD_TEST(I32x4Splat) { WASM_SIMD_TEST(I32x4Splat) {
WasmRunner<int32_t, int32_t> r(execution_tier, lower_simd); WasmRunner<int32_t, int32_t> r(execution_tier, lower_simd);
...@@ -3044,9 +3044,9 @@ WASM_SIMD_COMPILED_TEST(S8x16MultiShuffleFuzz) { ...@@ -3044,9 +3044,9 @@ WASM_SIMD_COMPILED_TEST(S8x16MultiShuffleFuzz) {
CHECK_EQ(1, r.Call()); \ CHECK_EQ(1, r.Call()); \
} }
#if V8_TARGET_ARCH_X64 || V8_TARGET_ARCH_ARM64 #if V8_TARGET_ARCH_X64 || V8_TARGET_ARCH_ARM64 || V8_TARGET_ARCH_S390X
WASM_SIMD_BOOL_REDUCTION_TEST(64x2, 2, WASM_I64V) WASM_SIMD_BOOL_REDUCTION_TEST(64x2, 2, WASM_I64V)
#endif // V8_TARGET_ARCH_X64 || V8_TARGET_ARCH_ARM64 #endif // V8_TARGET_ARCH_X64 || V8_TARGET_ARCH_ARM64 || V8_TARGET_ARCH_S390X
WASM_SIMD_BOOL_REDUCTION_TEST(32x4, 4, WASM_I32V) WASM_SIMD_BOOL_REDUCTION_TEST(32x4, 4, WASM_I32V)
WASM_SIMD_BOOL_REDUCTION_TEST(16x8, 8, WASM_I32V) WASM_SIMD_BOOL_REDUCTION_TEST(16x8, 8, WASM_I32V)
WASM_SIMD_BOOL_REDUCTION_TEST(8x16, 16, WASM_I32V) WASM_SIMD_BOOL_REDUCTION_TEST(8x16, 16, WASM_I32V)
...@@ -3433,7 +3433,7 @@ WASM_SIMD_TEST_NO_LOWERING(I64x2Load32x2S) { ...@@ -3433,7 +3433,7 @@ WASM_SIMD_TEST_NO_LOWERING(I64x2Load32x2S) {
} }
#if V8_TARGET_ARCH_X64 || V8_TARGET_ARCH_IA32 || V8_TARGET_ARCH_ARM64 || \ #if V8_TARGET_ARCH_X64 || V8_TARGET_ARCH_IA32 || V8_TARGET_ARCH_ARM64 || \
V8_TARGET_ARCH_ARM V8_TARGET_ARCH_ARM || V8_TARGET_ARCH_S390X
#define WASM_SIMD_ANYTRUE_TEST(format, lanes, max, param_type) \ #define WASM_SIMD_ANYTRUE_TEST(format, lanes, max, param_type) \
WASM_SIMD_TEST(S##format##AnyTrue) { \ WASM_SIMD_TEST(S##format##AnyTrue) { \
FLAG_SCOPE(wasm_simd_post_mvp); \ FLAG_SCOPE(wasm_simd_post_mvp); \
...@@ -3448,9 +3448,9 @@ WASM_SIMD_TEST_NO_LOWERING(I64x2Load32x2S) { ...@@ -3448,9 +3448,9 @@ WASM_SIMD_TEST_NO_LOWERING(I64x2Load32x2S) {
DCHECK_EQ(1, r.Call(5)); \ DCHECK_EQ(1, r.Call(5)); \
DCHECK_EQ(0, r.Call(0)); \ DCHECK_EQ(0, r.Call(0)); \
} }
#if V8_TARGET_ARCH_X64 || V8_TARGET_ARCH_ARM64 #if V8_TARGET_ARCH_X64 || V8_TARGET_ARCH_ARM64 || V8_TARGET_ARCH_S390X
WASM_SIMD_ANYTRUE_TEST(64x2, 2, 0xffffffffffffffff, int64_t) WASM_SIMD_ANYTRUE_TEST(64x2, 2, 0xffffffffffffffff, int64_t)
#endif // V8_TARGET_ARCH_X64 || V8_TARGET_ARCH_ARM64 #endif // V8_TARGET_ARCH_X64 || V8_TARGET_ARCH_ARM64 || V8_TARGET_ARCH_S390X
WASM_SIMD_ANYTRUE_TEST(32x4, 4, 0xffffffff, int32_t) WASM_SIMD_ANYTRUE_TEST(32x4, 4, 0xffffffff, int32_t)
WASM_SIMD_ANYTRUE_TEST(16x8, 8, 0xffff, int32_t) WASM_SIMD_ANYTRUE_TEST(16x8, 8, 0xffff, int32_t)
WASM_SIMD_ANYTRUE_TEST(8x16, 16, 0xff, int32_t) WASM_SIMD_ANYTRUE_TEST(8x16, 16, 0xff, int32_t)
...@@ -3469,14 +3469,14 @@ WASM_SIMD_ANYTRUE_TEST(8x16, 16, 0xff, int32_t) ...@@ -3469,14 +3469,14 @@ WASM_SIMD_ANYTRUE_TEST(8x16, 16, 0xff, int32_t)
DCHECK_EQ(1, r.Call(0x1)); \ DCHECK_EQ(1, r.Call(0x1)); \
DCHECK_EQ(0, r.Call(0)); \ DCHECK_EQ(0, r.Call(0)); \
} }
#if V8_TARGET_ARCH_X64 || V8_TARGET_ARCH_ARM64 #if V8_TARGET_ARCH_X64 || V8_TARGET_ARCH_ARM64 || V8_TARGET_ARCH_S390X
WASM_SIMD_ALLTRUE_TEST(64x2, 2, 0xffffffffffffffff, int64_t) WASM_SIMD_ALLTRUE_TEST(64x2, 2, 0xffffffffffffffff, int64_t)
#endif // V8_TARGET_ARCH_X64 || V8_TARGET_ARCH_ARM64 #endif // V8_TARGET_ARCH_X64 || V8_TARGET_ARCH_ARM64 || V8_TARGET_ARCH_S390X
WASM_SIMD_ALLTRUE_TEST(32x4, 4, 0xffffffff, int32_t) WASM_SIMD_ALLTRUE_TEST(32x4, 4, 0xffffffff, int32_t)
WASM_SIMD_ALLTRUE_TEST(16x8, 8, 0xffff, int32_t) WASM_SIMD_ALLTRUE_TEST(16x8, 8, 0xffff, int32_t)
WASM_SIMD_ALLTRUE_TEST(8x16, 16, 0xff, int32_t) WASM_SIMD_ALLTRUE_TEST(8x16, 16, 0xff, int32_t)
#endif // V8_TARGET_ARCH_X64 || V8_TARGET_ARCH_IA32 || V8_TARGET_ARCH_ARM64 || #endif // V8_TARGET_ARCH_X64 || V8_TARGET_ARCH_IA32 || V8_TARGET_ARCH_ARM64 ||
// V8_TARGET_ARCH_ARM // V8_TARGET_ARCH_ARM || V8_TARGET_ARCH_S390X
WASM_SIMD_TEST(BitSelect) { WASM_SIMD_TEST(BitSelect) {
WasmRunner<int32_t, int32_t> r(execution_tier, lower_simd); WasmRunner<int32_t, int32_t> r(execution_tier, lower_simd);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment