1*4bdc9457SAndroid Build Coastguard Worker# Copyright 2020 Google LLC 2*4bdc9457SAndroid Build Coastguard Worker# 3*4bdc9457SAndroid Build Coastguard Worker# This source code is licensed under the BSD-style license found in the 4*4bdc9457SAndroid Build Coastguard Worker# LICENSE file in the root directory of this source tree. 5*4bdc9457SAndroid Build Coastguard Worker 6*4bdc9457SAndroid Build Coastguard Worker#include <xnnpack/assembly.h> 7*4bdc9457SAndroid Build Coastguard Worker 8*4bdc9457SAndroid Build Coastguard Worker# void xnn_f32_vrelu_ukernel__wasm32_shr_x1( 9*4bdc9457SAndroid Build Coastguard Worker# size_t n, 0 10*4bdc9457SAndroid Build Coastguard Worker# const float* x, 1 11*4bdc9457SAndroid Build Coastguard Worker# float* y, 2 12*4bdc9457SAndroid Build Coastguard Worker# const union params) 3 unused 13*4bdc9457SAndroid Build Coastguard Worker 14*4bdc9457SAndroid Build Coastguard Worker# locals 15*4bdc9457SAndroid Build Coastguard Worker# float v 4 16*4bdc9457SAndroid Build Coastguard Worker# float mask 5 17*4bdc9457SAndroid Build Coastguard Worker 18*4bdc9457SAndroid Build Coastguard WorkerBEGIN_FUNCTION xnn_f32_vrelu_ukernel__wasm32_shr_x1 19*4bdc9457SAndroid Build Coastguard Worker .functype xnn_f32_vrelu_ukernel__wasm32_shr_x1 (i32, i32, i32, i32) -> () 20*4bdc9457SAndroid Build Coastguard Worker .local i32, i32 # 4 - value, 5 - mask 21*4bdc9457SAndroid Build Coastguard Worker 22*4bdc9457SAndroid Build Coastguard Worker loop 23*4bdc9457SAndroid Build Coastguard Worker local.get 1 # src 24*4bdc9457SAndroid Build Coastguard Worker i32.load 0 # load float from src 25*4bdc9457SAndroid Build Coastguard Worker local.set 4 26*4bdc9457SAndroid Build Coastguard Worker 27*4bdc9457SAndroid Build Coastguard Worker local.get 1 # src += 4 28*4bdc9457SAndroid Build Coastguard Worker i32.const 4 29*4bdc9457SAndroid Build Coastguard Worker i32.add 30*4bdc9457SAndroid Build Coastguard Worker local.set 1 31*4bdc9457SAndroid Build Coastguard Worker 32*4bdc9457SAndroid Build Coastguard Worker local.get 4 # (v >> 31) - 1) & v 33*4bdc9457SAndroid Build Coastguard Worker i32.const 31 34*4bdc9457SAndroid Build Coastguard Worker i32.shr_u 35*4bdc9457SAndroid Build Coastguard Worker local.set 5 36*4bdc9457SAndroid Build Coastguard Worker 37*4bdc9457SAndroid Build Coastguard Worker local.get 5 38*4bdc9457SAndroid Build Coastguard Worker i32.const -1 39*4bdc9457SAndroid Build Coastguard Worker i32.add 40*4bdc9457SAndroid Build Coastguard Worker local.set 5 41*4bdc9457SAndroid Build Coastguard Worker 42*4bdc9457SAndroid Build Coastguard Worker local.get 4 43*4bdc9457SAndroid Build Coastguard Worker local.get 5 44*4bdc9457SAndroid Build Coastguard Worker i32.and 45*4bdc9457SAndroid Build Coastguard Worker local.set 4 46*4bdc9457SAndroid Build Coastguard Worker 47*4bdc9457SAndroid Build Coastguard Worker local.get 2 # dst 48*4bdc9457SAndroid Build Coastguard Worker local.get 4 49*4bdc9457SAndroid Build Coastguard Worker i32.store 0 # store float 50*4bdc9457SAndroid Build Coastguard Worker 51*4bdc9457SAndroid Build Coastguard Worker local.get 2 # dst += 4 52*4bdc9457SAndroid Build Coastguard Worker i32.const 4 53*4bdc9457SAndroid Build Coastguard Worker i32.add 54*4bdc9457SAndroid Build Coastguard Worker local.set 2 55*4bdc9457SAndroid Build Coastguard Worker 56*4bdc9457SAndroid Build Coastguard Worker local.get 0 57*4bdc9457SAndroid Build Coastguard Worker i32.const -4 58*4bdc9457SAndroid Build Coastguard Worker i32.add # count -= 4 59*4bdc9457SAndroid Build Coastguard Worker local.set 0 60*4bdc9457SAndroid Build Coastguard Worker 61*4bdc9457SAndroid Build Coastguard Worker local.get 0 62*4bdc9457SAndroid Build Coastguard Worker i32.const 0 # count > 0 63*4bdc9457SAndroid Build Coastguard Worker i32.gt_s 64*4bdc9457SAndroid Build Coastguard Worker br_if 0 # loop 65*4bdc9457SAndroid Build Coastguard Worker end_loop 66*4bdc9457SAndroid Build Coastguard WorkerEND_FUNCTION xnn_f32_vrelu_ukernel__wasm32_shr_x1