1*344aa361SAndroid Build Coastguard Worker/* 2*344aa361SAndroid Build Coastguard Worker * Copyright (c) 2015, Google Inc. All rights reserved 3*344aa361SAndroid Build Coastguard Worker * 4*344aa361SAndroid Build Coastguard Worker * Permission is hereby granted, free of charge, to any person obtaining 5*344aa361SAndroid Build Coastguard Worker * a copy of this software and associated documentation files 6*344aa361SAndroid Build Coastguard Worker * (the "Software"), to deal in the Software without restriction, 7*344aa361SAndroid Build Coastguard Worker * including without limitation the rights to use, copy, modify, merge, 8*344aa361SAndroid Build Coastguard Worker * publish, distribute, sublicense, and/or sell copies of the Software, 9*344aa361SAndroid Build Coastguard Worker * and to permit persons to whom the Software is furnished to do so, 10*344aa361SAndroid Build Coastguard Worker * subject to the following conditions: 11*344aa361SAndroid Build Coastguard Worker * 12*344aa361SAndroid Build Coastguard Worker * The above copyright notice and this permission notice shall be 13*344aa361SAndroid Build Coastguard Worker * included in all copies or substantial portions of the Software. 14*344aa361SAndroid Build Coastguard Worker * 15*344aa361SAndroid Build Coastguard Worker * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 16*344aa361SAndroid Build Coastguard Worker * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 17*344aa361SAndroid Build Coastguard Worker * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. 18*344aa361SAndroid Build Coastguard Worker * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY 19*344aa361SAndroid Build Coastguard Worker * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, 20*344aa361SAndroid Build Coastguard Worker * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE 21*344aa361SAndroid Build Coastguard Worker * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 22*344aa361SAndroid Build Coastguard Worker */ 23*344aa361SAndroid Build Coastguard Worker 24*344aa361SAndroid Build Coastguard Worker#include <asm.h> 25*344aa361SAndroid Build Coastguard Worker 26*344aa361SAndroid Build Coastguard Worker.altmacro 27*344aa361SAndroid Build Coastguard Worker 28*344aa361SAndroid Build Coastguard Worker.macro init_regs val=x0, reg=0 29*344aa361SAndroid Build Coastguard Worker fmov d\reg, \val 30*344aa361SAndroid Build Coastguard Worker add \val, \val, #1 31*344aa361SAndroid Build Coastguard Worker fmov v\reg&.d[1], \val 32*344aa361SAndroid Build Coastguard Worker.if \reg < 31 33*344aa361SAndroid Build Coastguard Worker add \val, \val, #1 34*344aa361SAndroid Build Coastguard Worker init_regs \val, %(\reg+1) 35*344aa361SAndroid Build Coastguard Worker.endif 36*344aa361SAndroid Build Coastguard Worker.endm 37*344aa361SAndroid Build Coastguard Worker 38*344aa361SAndroid Build Coastguard Worker/* clear reserved bits */ 39*344aa361SAndroid Build Coastguard Worker.macro fpcrval val, base 40*344aa361SAndroid Build Coastguard Worker add \val, \base, #1 41*344aa361SAndroid Build Coastguard Worker lsl \val, \val, #22 42*344aa361SAndroid Build Coastguard Worker bic \val, \val, #(~0 << 27) 43*344aa361SAndroid Build Coastguard Worker.endm 44*344aa361SAndroid Build Coastguard Worker 45*344aa361SAndroid Build Coastguard Worker/* clear reserved bits */ 46*344aa361SAndroid Build Coastguard Worker.macro fpsrval val, base 47*344aa361SAndroid Build Coastguard Worker add \val, \base, #2 48*344aa361SAndroid Build Coastguard Worker bic \val, \val, #(3 << 5) 49*344aa361SAndroid Build Coastguard Worker bic \val, \val, #((~0 << 8) ^ (~0 << 27)) 50*344aa361SAndroid Build Coastguard Worker.endm 51*344aa361SAndroid Build Coastguard Worker 52*344aa361SAndroid Build Coastguard WorkerFUNCTION(fptest_arch_init) 53*344aa361SAndroid Build Coastguard Worker init_regs 54*344aa361SAndroid Build Coastguard Worker fpcrval x9, x0 55*344aa361SAndroid Build Coastguard Worker msr fpcr, x9 56*344aa361SAndroid Build Coastguard Worker fpsrval x9, x0 57*344aa361SAndroid Build Coastguard Worker msr fpsr, x9 58*344aa361SAndroid Build Coastguard Worker ret 59*344aa361SAndroid Build Coastguard Worker 60*344aa361SAndroid Build Coastguard Worker.macro check_val errors, val1, val2 61*344aa361SAndroid Build Coastguard Worker cmp \val1, \val2 62*344aa361SAndroid Build Coastguard Worker cinc \errors, \errors, ne 63*344aa361SAndroid Build Coastguard Worker.endm 64*344aa361SAndroid Build Coastguard Worker 65*344aa361SAndroid Build Coastguard Worker.macro check_regs errors, val, tmp, reg=0 66*344aa361SAndroid Build Coastguard Worker fmov \tmp, d\reg 67*344aa361SAndroid Build Coastguard Worker check_val \errors, \val, \tmp 68*344aa361SAndroid Build Coastguard Worker add \val, \val, #1 69*344aa361SAndroid Build Coastguard Worker fmov \tmp, v\reg&.d[1] 70*344aa361SAndroid Build Coastguard Worker check_val \errors, \val, \tmp 71*344aa361SAndroid Build Coastguard Worker.if \reg < 31 72*344aa361SAndroid Build Coastguard Worker add \val, \val, #1 73*344aa361SAndroid Build Coastguard Worker check_regs \errors, \val, \tmp, %(\reg+1) 74*344aa361SAndroid Build Coastguard Worker.endif 75*344aa361SAndroid Build Coastguard Worker.endm 76*344aa361SAndroid Build Coastguard Worker 77*344aa361SAndroid Build Coastguard WorkerFUNCTION(fptest_arch_check_state) 78*344aa361SAndroid Build Coastguard Worker mov x9, x0 79*344aa361SAndroid Build Coastguard Worker mov x0, #0 80*344aa361SAndroid Build Coastguard Worker check_regs x0, x9, x10 81*344aa361SAndroid Build Coastguard Worker mrs x10, fpcr 82*344aa361SAndroid Build Coastguard Worker fpcrval x11, x9 83*344aa361SAndroid Build Coastguard Worker check_val x0, x11, x10 84*344aa361SAndroid Build Coastguard Worker mrs x10, fpsr 85*344aa361SAndroid Build Coastguard Worker fpsrval x11, x9 86*344aa361SAndroid Build Coastguard Worker check_val x0, x11, x10 87*344aa361SAndroid Build Coastguard Worker ret 88