@@ -48,6 +48,7 @@ import {
48
48
relopbranchTable , mathIntrinsicTable ,
49
49
simdCreateLoadOps , simdCreateSizes ,
50
50
simdCreateStoreOps , simdShiftTable ,
51
+ bitmaskTable , createScalarTable ,
51
52
} from "./jiterpreter-tables" ;
52
53
import { mono_log_error , mono_log_info } from "./logging" ;
53
54
@@ -3156,13 +3157,6 @@ function append_simd_4_load(builder: WasmBuilder, ip: MintOpcodePtr) {
3156
3157
append_ldloc ( builder , getArgU16 ( ip , 4 ) , WasmOpcode . PREFIX_simd , WasmSimdOpcode . v128_load ) ;
3157
3158
}
3158
3159
3159
- function append_stloc_simd_zero ( builder : WasmBuilder , offset : number ) {
3160
- builder . local ( "pLocals" ) ;
3161
- builder . appendSimd ( WasmSimdOpcode . v128_const ) ;
3162
- builder . appendBytes ( new Uint8Array ( sizeOfV128 ) ) ;
3163
- append_stloc_tail ( builder , offset , WasmOpcode . PREFIX_simd , WasmSimdOpcode . v128_store ) ;
3164
- }
3165
-
3166
3160
function emit_simd_2 ( builder : WasmBuilder , ip : MintOpcodePtr , index : SimdIntrinsic2 ) : boolean {
3167
3161
const simple = < WasmSimdOpcode > cwraps . mono_jiterp_get_simd_opcode ( 1 , index ) ;
3168
3162
if ( simple ) {
@@ -3172,35 +3166,33 @@ function emit_simd_2(builder: WasmBuilder, ip: MintOpcodePtr, index: SimdIntrins
3172
3166
return true ;
3173
3167
}
3174
3168
3169
+ const bitmask = bitmaskTable [ index ] ;
3170
+ if ( bitmask ) {
3171
+ append_simd_2_load ( builder , ip ) ;
3172
+ builder . appendSimd ( bitmask ) ;
3173
+ append_stloc_tail ( builder , getArgU16 ( ip , 1 ) , WasmOpcode . i32_store ) ;
3174
+ return true ;
3175
+ }
3176
+
3175
3177
switch ( index ) {
3176
3178
case SimdIntrinsic2 . V128_I1_CREATE_SCALAR :
3177
- // Zero then write scalar component
3178
- builder . local ( "pLocals" ) ;
3179
- append_stloc_simd_zero ( builder , getArgU16 ( ip , 1 ) ) ;
3180
- append_ldloc ( builder , getArgU16 ( ip , 2 ) , WasmOpcode . i32_load8_s ) ;
3181
- append_stloc_tail ( builder , getArgU16 ( ip , 1 ) , WasmOpcode . i32_store8 ) ;
3182
- return true ;
3183
3179
case SimdIntrinsic2 . V128_I2_CREATE_SCALAR :
3184
- // Zero then write scalar component
3185
- builder . local ( "pLocals" ) ;
3186
- append_stloc_simd_zero ( builder , getArgU16 ( ip , 1 ) ) ;
3187
- append_ldloc ( builder , getArgU16 ( ip , 2 ) , WasmOpcode . i32_load16_s ) ;
3188
- append_stloc_tail ( builder , getArgU16 ( ip , 1 ) , WasmOpcode . i32_store16 ) ;
3189
- return true ;
3190
3180
case SimdIntrinsic2 . V128_I4_CREATE_SCALAR :
3191
- // Zero then write scalar component
3181
+ case SimdIntrinsic2 . V128_I8_CREATE_SCALAR : {
3182
+ const tableEntry = createScalarTable [ index ] ;
3192
3183
builder . local ( "pLocals" ) ;
3193
- append_stloc_simd_zero ( builder , getArgU16 ( ip , 1 ) ) ;
3194
- append_ldloc ( builder , getArgU16 ( ip , 2 ) , WasmOpcode . i32_load ) ;
3195
- append_stloc_tail ( builder , getArgU16 ( ip , 1 ) , WasmOpcode . i32_store ) ;
3196
- return true ;
3197
- case SimdIntrinsic2 . V128_I8_CREATE_SCALAR :
3198
- // Zero then write scalar component
3199
- builder . local ( "pLocals" ) ;
3200
- append_stloc_simd_zero ( builder , getArgU16 ( ip , 1 ) ) ;
3201
- append_ldloc ( builder , getArgU16 ( ip , 2 ) , WasmOpcode . i64_load ) ;
3202
- append_stloc_tail ( builder , getArgU16 ( ip , 1 ) , WasmOpcode . i64_store ) ;
3184
+ // Make a zero vector
3185
+ builder . i52_const ( 0 ) ;
3186
+ builder . appendSimd ( WasmSimdOpcode . i64x2_splat ) ;
3187
+ // Load the scalar value
3188
+ append_ldloc ( builder , getArgU16 ( ip , 2 ) , tableEntry [ 0 ] ) ;
3189
+ // Replace the first lane
3190
+ builder . appendSimd ( tableEntry [ 1 ] ) ;
3191
+ builder . appendU8 ( 0 ) ;
3192
+ // Store result
3193
+ append_stloc_tail ( builder , getArgU16 ( ip , 1 ) , WasmOpcode . PREFIX_simd , WasmSimdOpcode . v128_store ) ;
3203
3194
return true ;
3195
+ }
3204
3196
3205
3197
case SimdIntrinsic2 . V128_I1_CREATE :
3206
3198
append_simd_2_load ( builder , ip , WasmSimdOpcode . v128_load8_splat ) ;
0 commit comments