Skip to content

Commit 4793d91

Browse files
authored
[wasm] Implement Vector128.Abs intrinsics (#78067)
* [wasm] Implement Vector128.Abs intrinsics C# code iv = Vector128.Abs(Vector128.Create(System.Random.Shared.Next())); fv = Vector128.Abs(Vector128.Create(System.Random.Shared.NextSingle())); dv = Vector128.Abs(Vector128.Create(System.Random.Shared.NextDouble())); is emitted as: ... i32x4.splat [SIMD] i32x4.abs [SIMD] v128.store offset:16 [SIMD] ... f32x4.splat [SIMD] f32x4.abs [SIMD] v128.store [SIMD] ... f64x2.splat [SIMD] f64x2.abs [SIMD] v128.store offset:80 [SIMD] ... * Review feedback
1 parent dd7fdb7 commit 4793d91

File tree

3 files changed

+22
-12
lines changed

3 files changed

+22
-12
lines changed

src/mono/mono/mini/llvm-intrinsics.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -261,6 +261,8 @@ INTRINS_OVR(WASM_BITMASK_V16, wasm_bitmask, Wasm, sse_i1_t)
261261
INTRINS_OVR(WASM_BITMASK_V8, wasm_bitmask, Wasm, sse_i2_t)
262262
INTRINS_OVR(WASM_BITMASK_V4, wasm_bitmask, Wasm, sse_i4_t)
263263
INTRINS_OVR(WASM_BITMASK_V2, wasm_bitmask, Wasm, sse_i8_t)
264+
INTRINS_OVR(WASM_FABS_V4, fabs, Generic, sse_r4_t)
265+
INTRINS_OVR(WASM_FABS_V2, fabs, Generic, sse_r8_t)
264266
INTRINS(WASM_DOT, wasm_dot, Wasm)
265267
INTRINS(WASM_SHUFFLE, wasm_shuffle, Wasm)
266268
INTRINS(WASM_SWIZZLE, wasm_swizzle, Wasm)

src/mono/mono/mini/mini-llvm.c

Lines changed: 14 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -9289,18 +9289,6 @@ MONO_RESTORE_WARNING
92899289
break;
92909290
}
92919291

9292-
case OP_VECTOR_IABS: {
9293-
// %sub = sub <16 x i8> zeroinitializer, %arg
9294-
// %cmp = icmp sgt <16 x i8> %arg, zeroinitializer
9295-
// %abs = select <16 x i1> %cmp, <16 x i8> %arg, <16 x i8> %sub
9296-
LLVMTypeRef typ = type_to_sse_type (ins->inst_c1);
9297-
LLVMValueRef sub = LLVMBuildSub(builder, LLVMConstNull(typ), lhs, "");
9298-
LLVMValueRef cmp = LLVMBuildICmp(builder, LLVMIntSGT, lhs, LLVMConstNull(typ), "");
9299-
LLVMValueRef abs = LLVMBuildSelect (builder, cmp, lhs, sub, "");
9300-
values [ins->dreg] = convert (ctx, abs, typ);
9301-
break;
9302-
}
9303-
93049292
case OP_SSSE3_ALIGNR: {
93059293
LLVMTypeRef ret_t = simd_class_to_llvm_type (ctx, ins->klass);
93069294
LLVMValueRef zero = LLVMConstNull (v128_i1_t);
@@ -9605,6 +9593,20 @@ MONO_RESTORE_WARNING
96059593
}
96069594
#endif
96079595

9596+
#if defined(TARGET_X86) || defined(TARGET_AMD64) || defined(TARGET_WASM)
9597+
case OP_VECTOR_IABS: {
9598+
// %sub = sub <16 x i8> zeroinitializer, %arg
9599+
// %cmp = icmp sgt <16 x i8> %arg, zeroinitializer
9600+
// %abs = select <16 x i1> %cmp, <16 x i8> %arg, <16 x i8> %sub
9601+
LLVMTypeRef typ = type_to_sse_type (ins->inst_c1);
9602+
LLVMValueRef sub = LLVMBuildSub(builder, LLVMConstNull(typ), lhs, "");
9603+
LLVMValueRef cmp = LLVMBuildICmp(builder, LLVMIntSGT, lhs, LLVMConstNull(typ), "");
9604+
LLVMValueRef abs = LLVMBuildSelect (builder, cmp, lhs, sub, "");
9605+
values [ins->dreg] = convert (ctx, abs, typ);
9606+
break;
9607+
}
9608+
#endif
9609+
96089610
case OP_XCOMPARE_FP: {
96099611
LLVMRealPredicate pred = fpcond_to_llvm_cond [ins->inst_c0];
96109612
LLVMValueRef cmp = LLVMBuildFCmp (builder, pred, lhs, rhs, "");

src/mono/mono/mini/simd-intrinsics.c

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1157,6 +1157,12 @@ emit_sri_vector (MonoCompile *cfg, MonoMethod *cmethod, MonoMethodSignature *fsi
11571157
} else {
11581158
return emit_simd_ins_for_sig (cfg, klass, OP_VECTOR_IABS, -1, arg0_type, fsig, args);
11591159
}
1160+
#elif defined(TARGET_WASM)
1161+
if (type_enum_is_float(arg0_type)) {
1162+
return emit_simd_ins_for_sig (cfg, klass, OP_XOP_X_X, arg0_type == MONO_TYPE_R8 ? INTRINS_WASM_FABS_V2 : INTRINS_WASM_FABS_V4, -1, fsig, args);
1163+
} else {
1164+
return emit_simd_ins_for_sig (cfg, klass, OP_VECTOR_IABS, -1, arg0_type, fsig, args);
1165+
}
11601166
#else
11611167
return NULL;
11621168
#endif

0 commit comments

Comments
 (0)