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_x2( 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 value0 4 16*4bdc9457SAndroid Build Coastguard Worker# float value1 5 17*4bdc9457SAndroid Build Coastguard Worker# float mask0 6 18*4bdc9457SAndroid Build Coastguard Worker# float mask1 7 19*4bdc9457SAndroid Build Coastguard Worker 20*4bdc9457SAndroid Build Coastguard Worker 21*4bdc9457SAndroid Build Coastguard WorkerBEGIN_FUNCTION xnn_f32_vrelu_ukernel__wasm32_shr_x2 22*4bdc9457SAndroid Build Coastguard Worker .functype xnn_f32_vrelu_ukernel__wasm32_shr_x2 (i32, i32, i32, i32) -> () 23*4bdc9457SAndroid Build Coastguard Worker .local i32, i32, i32, i32 24*4bdc9457SAndroid Build Coastguard Worker 25*4bdc9457SAndroid Build Coastguard Worker local.get 0 26*4bdc9457SAndroid Build Coastguard Worker i32.const 8 # count >= 8 27*4bdc9457SAndroid Build Coastguard Worker i32.ge_s 28*4bdc9457SAndroid Build Coastguard Worker if 29*4bdc9457SAndroid Build Coastguard Worker loop 30*4bdc9457SAndroid Build Coastguard Worker local.get 1 # src 31*4bdc9457SAndroid Build Coastguard Worker i32.load 0 # load float from src 32*4bdc9457SAndroid Build Coastguard Worker local.set 4 33*4bdc9457SAndroid Build Coastguard Worker local.get 1 # src 34*4bdc9457SAndroid Build Coastguard Worker i32.load 4 # load 2nd float from src + 4 35*4bdc9457SAndroid Build Coastguard Worker local.set 5 36*4bdc9457SAndroid Build Coastguard Worker 37*4bdc9457SAndroid Build Coastguard Worker local.get 1 # src += 8 38*4bdc9457SAndroid Build Coastguard Worker i32.const 8 39*4bdc9457SAndroid Build Coastguard Worker i32.add 40*4bdc9457SAndroid Build Coastguard Worker local.set 1 41*4bdc9457SAndroid Build Coastguard Worker 42*4bdc9457SAndroid Build Coastguard Worker local.get 4 # (v >> 31) - 1) & v 43*4bdc9457SAndroid Build Coastguard Worker i32.const 31 44*4bdc9457SAndroid Build Coastguard Worker i32.shr_u 45*4bdc9457SAndroid Build Coastguard Worker local.set 6 46*4bdc9457SAndroid Build Coastguard Worker local.get 5 # 2nd mask 47*4bdc9457SAndroid Build Coastguard Worker i32.const 31 48*4bdc9457SAndroid Build Coastguard Worker i32.shr_u 49*4bdc9457SAndroid Build Coastguard Worker local.set 7 50*4bdc9457SAndroid Build Coastguard Worker 51*4bdc9457SAndroid Build Coastguard Worker local.get 6 52*4bdc9457SAndroid Build Coastguard Worker i32.const -1 53*4bdc9457SAndroid Build Coastguard Worker i32.add 54*4bdc9457SAndroid Build Coastguard Worker local.set 6 55*4bdc9457SAndroid Build Coastguard Worker local.get 7 56*4bdc9457SAndroid Build Coastguard Worker i32.const -1 57*4bdc9457SAndroid Build Coastguard Worker i32.add 58*4bdc9457SAndroid Build Coastguard Worker local.set 7 59*4bdc9457SAndroid Build Coastguard Worker 60*4bdc9457SAndroid Build Coastguard Worker local.get 4 61*4bdc9457SAndroid Build Coastguard Worker local.get 6 62*4bdc9457SAndroid Build Coastguard Worker i32.and 63*4bdc9457SAndroid Build Coastguard Worker local.set 4 64*4bdc9457SAndroid Build Coastguard Worker local.get 5 65*4bdc9457SAndroid Build Coastguard Worker local.get 7 66*4bdc9457SAndroid Build Coastguard Worker i32.and 67*4bdc9457SAndroid Build Coastguard Worker local.set 5 68*4bdc9457SAndroid Build Coastguard Worker 69*4bdc9457SAndroid Build Coastguard Worker local.get 2 # dst 70*4bdc9457SAndroid Build Coastguard Worker local.get 4 71*4bdc9457SAndroid Build Coastguard Worker i32.store 0 # store float 72*4bdc9457SAndroid Build Coastguard Worker local.get 2 # dst 73*4bdc9457SAndroid Build Coastguard Worker local.get 5 74*4bdc9457SAndroid Build Coastguard Worker i32.store 4 # store 2nd float 75*4bdc9457SAndroid Build Coastguard Worker 76*4bdc9457SAndroid Build Coastguard Worker local.get 2 # dst += 8 77*4bdc9457SAndroid Build Coastguard Worker i32.const 8 78*4bdc9457SAndroid Build Coastguard Worker i32.add 79*4bdc9457SAndroid Build Coastguard Worker local.set 2 80*4bdc9457SAndroid Build Coastguard Worker 81*4bdc9457SAndroid Build Coastguard Worker local.get 0 82*4bdc9457SAndroid Build Coastguard Worker i32.const -8 83*4bdc9457SAndroid Build Coastguard Worker i32.add # count -= 8 84*4bdc9457SAndroid Build Coastguard Worker local.set 0 85*4bdc9457SAndroid Build Coastguard Worker 86*4bdc9457SAndroid Build Coastguard Worker local.get 0 87*4bdc9457SAndroid Build Coastguard Worker i32.const 8 # count >= 8 88*4bdc9457SAndroid Build Coastguard Worker i32.ge_s 89*4bdc9457SAndroid Build Coastguard Worker br_if 0 # loop 90*4bdc9457SAndroid Build Coastguard Worker end_loop 91*4bdc9457SAndroid Build Coastguard Worker end_if 92*4bdc9457SAndroid Build Coastguard Worker 93*4bdc9457SAndroid Build Coastguard Worker local.get 0 94*4bdc9457SAndroid Build Coastguard Worker i32.const 4 # if count >= 4 95*4bdc9457SAndroid Build Coastguard Worker i32.ge_s 96*4bdc9457SAndroid Build Coastguard Worker if 97*4bdc9457SAndroid Build Coastguard Worker local.get 1 # src 98*4bdc9457SAndroid Build Coastguard Worker i32.load 0 # load float from src 99*4bdc9457SAndroid Build Coastguard Worker local.set 4 100*4bdc9457SAndroid Build Coastguard Worker 101*4bdc9457SAndroid Build Coastguard Worker local.get 4 # (v >> 31) - 1) & v 102*4bdc9457SAndroid Build Coastguard Worker i32.const 31 103*4bdc9457SAndroid Build Coastguard Worker i32.shr_u 104*4bdc9457SAndroid Build Coastguard Worker local.set 5 105*4bdc9457SAndroid Build Coastguard Worker 106*4bdc9457SAndroid Build Coastguard Worker local.get 5 107*4bdc9457SAndroid Build Coastguard Worker i32.const -1 108*4bdc9457SAndroid Build Coastguard Worker i32.add 109*4bdc9457SAndroid Build Coastguard Worker local.set 5 110*4bdc9457SAndroid Build Coastguard Worker 111*4bdc9457SAndroid Build Coastguard Worker local.get 4 112*4bdc9457SAndroid Build Coastguard Worker local.get 5 113*4bdc9457SAndroid Build Coastguard Worker i32.and 114*4bdc9457SAndroid Build Coastguard Worker local.set 4 115*4bdc9457SAndroid Build Coastguard Worker 116*4bdc9457SAndroid Build Coastguard Worker local.get 2 # dst 117*4bdc9457SAndroid Build Coastguard Worker local.get 4 118*4bdc9457SAndroid Build Coastguard Worker i32.store 0 # store float 119*4bdc9457SAndroid Build Coastguard Worker end_if 120*4bdc9457SAndroid Build Coastguard WorkerEND_FUNCTION xnn_f32_vrelu_ukernel__wasm32_shr_x2 121