fp.isa revision 7370
14120Sgblack@eecs.umich.edu// -*- mode:c++ -*- 24120Sgblack@eecs.umich.edu 34120Sgblack@eecs.umich.edu// Copyright (c) 2010 ARM Limited 44120Sgblack@eecs.umich.edu// All rights reserved 57087Snate@binkert.org// 67087Snate@binkert.org// The license below extends only to copyright in the software and shall 77087Snate@binkert.org// not be construed as granting a license to any other intellectual 87087Snate@binkert.org// property including but not limited to intellectual property relating 97087Snate@binkert.org// to a hardware implementation of the functionality of the software 107087Snate@binkert.org// licensed hereunder. You may use the software subject to the license 117087Snate@binkert.org// terms below provided that you ensure that this notice is replicated 127087Snate@binkert.org// unmodified and in its entirety in all distributions of the software, 134120Sgblack@eecs.umich.edu// modified or unmodified, in source code or in binary form. 147087Snate@binkert.org// 157087Snate@binkert.org// Redistribution and use in source and binary forms, with or without 167087Snate@binkert.org// modification, are permitted provided that the following conditions are 177087Snate@binkert.org// met: redistributions of source code must retain the above copyright 187087Snate@binkert.org// notice, this list of conditions and the following disclaimer; 197087Snate@binkert.org// redistributions in binary form must reproduce the above copyright 207087Snate@binkert.org// notice, this list of conditions and the following disclaimer in the 217087Snate@binkert.org// documentation and/or other materials provided with the distribution; 224120Sgblack@eecs.umich.edu// neither the name of the copyright holders nor the names of its 237087Snate@binkert.org// contributors may be used to endorse or promote products derived from 244120Sgblack@eecs.umich.edu// this software without specific prior written permission. 254120Sgblack@eecs.umich.edu// 264120Sgblack@eecs.umich.edu// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 274120Sgblack@eecs.umich.edu// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 284120Sgblack@eecs.umich.edu// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 294120Sgblack@eecs.umich.edu// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 304120Sgblack@eecs.umich.edu// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 314120Sgblack@eecs.umich.edu// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 324120Sgblack@eecs.umich.edu// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 334120Sgblack@eecs.umich.edu// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 344120Sgblack@eecs.umich.edu// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 354120Sgblack@eecs.umich.edu// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 364120Sgblack@eecs.umich.edu// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 374120Sgblack@eecs.umich.edu// 384120Sgblack@eecs.umich.edu// Authors: Gabe Black 394120Sgblack@eecs.umich.edu 404120Sgblack@eecs.umich.edulet {{ 414120Sgblack@eecs.umich.edu 424120Sgblack@eecs.umich.edu header_output = "" 434166Sgblack@eecs.umich.edu decoder_output = "" 444166Sgblack@eecs.umich.edu exec_output = "" 458229Snate@binkert.org 464166Sgblack@eecs.umich.edu vmsrIop = InstObjParams("vmsr", "Vmsr", "RegRegOp", 4710299Salexandru.dutu@amd.com { "code": "MiscDest = Op1;", 484120Sgblack@eecs.umich.edu "predicate_test": predicateTest }, []) 495956Sgblack@eecs.umich.edu header_output += RegRegOpDeclare.subst(vmsrIop); 505956Sgblack@eecs.umich.edu decoder_output += RegRegOpConstructor.subst(vmsrIop); 514120Sgblack@eecs.umich.edu exec_output += PredOpExecute.subst(vmsrIop); 524120Sgblack@eecs.umich.edu 537073Sgblack@eecs.umich.edu vmrsIop = InstObjParams("vmrs", "Vmrs", "RegRegOp", 547073Sgblack@eecs.umich.edu { "code": "Dest = MiscOp1;", 557073Sgblack@eecs.umich.edu "predicate_test": predicateTest }, []) 567073Sgblack@eecs.umich.edu header_output += RegRegOpDeclare.subst(vmrsIop); 574166Sgblack@eecs.umich.edu decoder_output += RegRegOpConstructor.subst(vmrsIop); 584166Sgblack@eecs.umich.edu exec_output += PredOpExecute.subst(vmrsIop); 594166Sgblack@eecs.umich.edu 604166Sgblack@eecs.umich.edu vmovImmSCode = ''' 615962Sgblack@eecs.umich.edu FpDest.uw = bits(imm, 31, 0); 625962Sgblack@eecs.umich.edu ''' 635962Sgblack@eecs.umich.edu vmovImmSIop = InstObjParams("vmov", "VmovImmS", "RegImmOp", 645956Sgblack@eecs.umich.edu { "code": vmovImmSCode, 655956Sgblack@eecs.umich.edu "predicate_test": predicateTest }, []) 664166Sgblack@eecs.umich.edu header_output += RegImmOpDeclare.subst(vmovImmSIop); 675956Sgblack@eecs.umich.edu decoder_output += RegImmOpConstructor.subst(vmovImmSIop); 685956Sgblack@eecs.umich.edu exec_output += PredOpExecute.subst(vmovImmSIop); 695956Sgblack@eecs.umich.edu 705956Sgblack@eecs.umich.edu vmovImmDCode = ''' 715973Sgblack@eecs.umich.edu FpDestP0.uw = bits(imm, 31, 0); 725973Sgblack@eecs.umich.edu FpDestP1.uw = bits(imm, 63, 32); 734166Sgblack@eecs.umich.edu ''' 744166Sgblack@eecs.umich.edu vmovImmDIop = InstObjParams("vmov", "VmovImmD", "RegImmOp", 755962Sgblack@eecs.umich.edu { "code": vmovImmDCode, 765962Sgblack@eecs.umich.edu "predicate_test": predicateTest }, []) 7711320Ssteve.reinhardt@amd.com header_output += RegImmOpDeclare.subst(vmovImmDIop); 785962Sgblack@eecs.umich.edu decoder_output += RegImmOpConstructor.subst(vmovImmDIop); 795962Sgblack@eecs.umich.edu exec_output += PredOpExecute.subst(vmovImmDIop); 805962Sgblack@eecs.umich.edu 815956Sgblack@eecs.umich.edu vmovImmQCode = ''' 825958Sgblack@eecs.umich.edu FpDestP0.uw = bits(imm, 31, 0); 835958Sgblack@eecs.umich.edu FpDestP1.uw = bits(imm, 63, 32); 845956Sgblack@eecs.umich.edu FpDestP2.uw = bits(imm, 31, 0); 854166Sgblack@eecs.umich.edu FpDestP3.uw = bits(imm, 63, 32); 865956Sgblack@eecs.umich.edu ''' 875956Sgblack@eecs.umich.edu vmovImmQIop = InstObjParams("vmov", "VmovImmQ", "RegImmOp", 885956Sgblack@eecs.umich.edu { "code": vmovImmQCode, 895956Sgblack@eecs.umich.edu "predicate_test": predicateTest }, []) 905956Sgblack@eecs.umich.edu header_output += RegImmOpDeclare.subst(vmovImmQIop); 914166Sgblack@eecs.umich.edu decoder_output += RegImmOpConstructor.subst(vmovImmQIop); 926709Svince@csl.cornell.edu exec_output += PredOpExecute.subst(vmovImmQIop); 936709Svince@csl.cornell.edu 946709Svince@csl.cornell.edu vmovRegSCode = ''' 956709Svince@csl.cornell.edu FpDest.uw = FpOp1.uw; 966709Svince@csl.cornell.edu ''' 976709Svince@csl.cornell.edu vmovRegSIop = InstObjParams("vmov", "VmovRegS", "RegRegOp", 986709Svince@csl.cornell.edu { "code": vmovRegSCode, 996709Svince@csl.cornell.edu "predicate_test": predicateTest }, []) 1006709Svince@csl.cornell.edu header_output += RegRegOpDeclare.subst(vmovRegSIop); 1016709Svince@csl.cornell.edu decoder_output += RegRegOpConstructor.subst(vmovRegSIop); 1025956Sgblack@eecs.umich.edu exec_output += PredOpExecute.subst(vmovRegSIop); 1034166Sgblack@eecs.umich.edu 1047532Ssteve.reinhardt@amd.com vmovRegDCode = ''' 1055958Sgblack@eecs.umich.edu FpDestP0.uw = FpOp1P0.uw; 1066701Sgblack@eecs.umich.edu FpDestP1.uw = FpOp1P1.uw; 1079552Sandreas.hansson@arm.com ''' 1089552Sandreas.hansson@arm.com vmovRegDIop = InstObjParams("vmov", "VmovRegD", "RegRegOp", 1095958Sgblack@eecs.umich.edu { "code": vmovRegDCode, 1105956Sgblack@eecs.umich.edu "predicate_test": predicateTest }, []) 1115956Sgblack@eecs.umich.edu header_output += RegRegOpDeclare.subst(vmovRegDIop); 1125956Sgblack@eecs.umich.edu decoder_output += RegRegOpConstructor.subst(vmovRegDIop); 1135956Sgblack@eecs.umich.edu exec_output += PredOpExecute.subst(vmovRegDIop); 1145956Sgblack@eecs.umich.edu 1155956Sgblack@eecs.umich.edu vmovRegQCode = ''' 1165956Sgblack@eecs.umich.edu FpDestP0.uw = FpOp1P0.uw; 1175956Sgblack@eecs.umich.edu FpDestP1.uw = FpOp1P1.uw; 1185973Sgblack@eecs.umich.edu FpDestP2.uw = FpOp1P2.uw; 1195973Sgblack@eecs.umich.edu FpDestP3.uw = FpOp1P3.uw; 1205973Sgblack@eecs.umich.edu ''' 1215973Sgblack@eecs.umich.edu vmovRegQIop = InstObjParams("vmov", "VmovRegQ", "RegRegOp", 1225973Sgblack@eecs.umich.edu { "code": vmovRegQCode, 1235973Sgblack@eecs.umich.edu "predicate_test": predicateTest }, []) 1245973Sgblack@eecs.umich.edu header_output += RegRegOpDeclare.subst(vmovRegQIop); 1255973Sgblack@eecs.umich.edu decoder_output += RegRegOpConstructor.subst(vmovRegQIop); 1265973Sgblack@eecs.umich.edu exec_output += PredOpExecute.subst(vmovRegQIop); 1275973Sgblack@eecs.umich.edu 1285956Sgblack@eecs.umich.edu vmovCoreRegBCode = ''' 1295956Sgblack@eecs.umich.edu FpDest.uw = insertBits(FpDest.uw, imm * 8, imm * 8 + 7, Op1.ub); 1307532Ssteve.reinhardt@amd.com ''' 1315958Sgblack@eecs.umich.edu vmovCoreRegBIop = InstObjParams("vmov", "VmovCoreRegB", "RegRegImmOp", 1325973Sgblack@eecs.umich.edu { "code": vmovCoreRegBCode, 1336701Sgblack@eecs.umich.edu "predicate_test": predicateTest }, []) 1346701Sgblack@eecs.umich.edu header_output += RegRegImmOpDeclare.subst(vmovCoreRegBIop); 1355958Sgblack@eecs.umich.edu decoder_output += RegRegImmOpConstructor.subst(vmovCoreRegBIop); 1364166Sgblack@eecs.umich.edu exec_output += PredOpExecute.subst(vmovCoreRegBIop); 13710299Salexandru.dutu@amd.com 13810299Salexandru.dutu@amd.com vmovCoreRegHCode = ''' 13910299Salexandru.dutu@amd.com FpDest.uw = insertBits(FpDest.uw, imm * 16, imm * 16 + 15, Op1.uh); 14010299Salexandru.dutu@amd.com ''' 14110299Salexandru.dutu@amd.com vmovCoreRegHIop = InstObjParams("vmov", "VmovCoreRegH", "RegRegImmOp", 14210299Salexandru.dutu@amd.com { "code": vmovCoreRegHCode, 14310299Salexandru.dutu@amd.com "predicate_test": predicateTest }, []) 14410299Salexandru.dutu@amd.com header_output += RegRegImmOpDeclare.subst(vmovCoreRegHIop); 1454166Sgblack@eecs.umich.edu decoder_output += RegRegImmOpConstructor.subst(vmovCoreRegHIop); 1464120Sgblack@eecs.umich.edu exec_output += PredOpExecute.subst(vmovCoreRegHIop); 1474120Sgblack@eecs.umich.edu 148 vmovCoreRegWCode = ''' 149 FpDest.uw = Op1.uw; 150 ''' 151 vmovCoreRegWIop = InstObjParams("vmov", "VmovCoreRegW", "RegRegOp", 152 { "code": vmovCoreRegWCode, 153 "predicate_test": predicateTest }, []) 154 header_output += RegRegOpDeclare.subst(vmovCoreRegWIop); 155 decoder_output += RegRegOpConstructor.subst(vmovCoreRegWIop); 156 exec_output += PredOpExecute.subst(vmovCoreRegWIop); 157 158 vmovRegCoreUBCode = ''' 159 Dest = bits(FpOp1.uw, imm * 8, imm * 8 + 7); 160 ''' 161 vmovRegCoreUBIop = InstObjParams("vmov", "VmovRegCoreUB", "RegRegImmOp", 162 { "code": vmovRegCoreUBCode, 163 "predicate_test": predicateTest }, []) 164 header_output += RegRegImmOpDeclare.subst(vmovRegCoreUBIop); 165 decoder_output += RegRegImmOpConstructor.subst(vmovRegCoreUBIop); 166 exec_output += PredOpExecute.subst(vmovRegCoreUBIop); 167 168 vmovRegCoreUHCode = ''' 169 Dest = bits(FpOp1.uw, imm * 16, imm * 16 + 15); 170 ''' 171 vmovRegCoreUHIop = InstObjParams("vmov", "VmovRegCoreUH", "RegRegImmOp", 172 { "code": vmovRegCoreUHCode, 173 "predicate_test": predicateTest }, []) 174 header_output += RegRegImmOpDeclare.subst(vmovRegCoreUHIop); 175 decoder_output += RegRegImmOpConstructor.subst(vmovRegCoreUHIop); 176 exec_output += PredOpExecute.subst(vmovRegCoreUHIop); 177 178 vmovRegCoreSBCode = ''' 179 Dest = sext<8>(bits(FpOp1.uw, imm * 8, imm * 8 + 7)); 180 ''' 181 vmovRegCoreSBIop = InstObjParams("vmov", "VmovRegCoreSB", "RegRegImmOp", 182 { "code": vmovRegCoreSBCode, 183 "predicate_test": predicateTest }, []) 184 header_output += RegRegImmOpDeclare.subst(vmovRegCoreSBIop); 185 decoder_output += RegRegImmOpConstructor.subst(vmovRegCoreSBIop); 186 exec_output += PredOpExecute.subst(vmovRegCoreSBIop); 187 188 vmovRegCoreSHCode = ''' 189 Dest = sext<16>(bits(FpOp1.uw, imm * 16, imm * 16 + 15)); 190 ''' 191 vmovRegCoreSHIop = InstObjParams("vmov", "VmovRegCoreSH", "RegRegImmOp", 192 { "code": vmovRegCoreSHCode, 193 "predicate_test": predicateTest }, []) 194 header_output += RegRegImmOpDeclare.subst(vmovRegCoreSHIop); 195 decoder_output += RegRegImmOpConstructor.subst(vmovRegCoreSHIop); 196 exec_output += PredOpExecute.subst(vmovRegCoreSHIop); 197 198 vmovRegCoreWCode = ''' 199 Dest = FpOp1.uw; 200 ''' 201 vmovRegCoreWIop = InstObjParams("vmov", "VmovRegCoreW", "RegRegOp", 202 { "code": vmovRegCoreWCode, 203 "predicate_test": predicateTest }, []) 204 header_output += RegRegOpDeclare.subst(vmovRegCoreWIop); 205 decoder_output += RegRegOpConstructor.subst(vmovRegCoreWIop); 206 exec_output += PredOpExecute.subst(vmovRegCoreWIop); 207 208 vmov2Reg2CoreCode = ''' 209 FpDestP0.uw = Op1.uw; 210 FpDestP1.uw = Op2.uw; 211 ''' 212 vmov2Reg2CoreIop = InstObjParams("vmov", "Vmov2Reg2Core", "RegRegRegOp", 213 { "code": vmov2Reg2CoreCode, 214 "predicate_test": predicateTest }, []) 215 header_output += RegRegRegOpDeclare.subst(vmov2Reg2CoreIop); 216 decoder_output += RegRegRegOpConstructor.subst(vmov2Reg2CoreIop); 217 exec_output += PredOpExecute.subst(vmov2Reg2CoreIop); 218 219 vmov2Core2RegCode = ''' 220 Dest.uw = FpOp2P0.uw; 221 Op1.uw = FpOp2P1.uw; 222 ''' 223 vmov2Core2RegIop = InstObjParams("vmov", "Vmov2Core2Reg", "RegRegRegOp", 224 { "code": vmov2Core2RegCode, 225 "predicate_test": predicateTest }, []) 226 header_output += RegRegRegOpDeclare.subst(vmov2Core2RegIop); 227 decoder_output += RegRegRegOpConstructor.subst(vmov2Core2RegIop); 228 exec_output += PredOpExecute.subst(vmov2Core2RegIop); 229 230 vmulSCode = ''' 231 FpDest = FpOp1 * FpOp2; 232 if ((isinf(FpOp1) && FpOp2 == 0) || (isinf(FpOp2) && FpOp1 == 0)) { 233 FpDest = NAN; 234 } 235 ''' 236 vmulSIop = InstObjParams("vmuls", "VmulS", "RegRegRegOp", 237 { "code": vmulSCode, 238 "predicate_test": predicateTest }, []) 239 header_output += RegRegRegOpDeclare.subst(vmulSIop); 240 decoder_output += RegRegRegOpConstructor.subst(vmulSIop); 241 exec_output += PredOpExecute.subst(vmulSIop); 242 243 vmulDCode = ''' 244 IntDoubleUnion cOp1, cOp2, cDest; 245 cOp1.bits = ((uint64_t)FpOp1P0.uw | ((uint64_t)FpOp1P1.uw << 32)); 246 cOp2.bits = ((uint64_t)FpOp2P0.uw | ((uint64_t)FpOp2P1.uw << 32)); 247 cDest.fp = cOp1.fp * cOp2.fp; 248 if ((isinf(cOp1.fp) && cOp2.fp == 0) || 249 (isinf(cOp2.fp) && cOp1.fp == 0)) { 250 cDest.fp = NAN; 251 } 252 FpDestP0.uw = cDest.bits; 253 FpDestP1.uw = cDest.bits >> 32; 254 ''' 255 vmulDIop = InstObjParams("vmuld", "VmulD", "RegRegRegOp", 256 { "code": vmulDCode, 257 "predicate_test": predicateTest }, []) 258 header_output += RegRegRegOpDeclare.subst(vmulDIop); 259 decoder_output += RegRegRegOpConstructor.subst(vmulDIop); 260 exec_output += PredOpExecute.subst(vmulDIop); 261 262 vnegSCode = ''' 263 FpDest = -FpOp1; 264 ''' 265 vnegSIop = InstObjParams("vnegs", "VnegS", "RegRegOp", 266 { "code": vnegSCode, 267 "predicate_test": predicateTest }, []) 268 header_output += RegRegOpDeclare.subst(vnegSIop); 269 decoder_output += RegRegOpConstructor.subst(vnegSIop); 270 exec_output += PredOpExecute.subst(vnegSIop); 271 272 vnegDCode = ''' 273 IntDoubleUnion cOp1, cDest; 274 cOp1.bits = ((uint64_t)FpOp1P0.uw | ((uint64_t)FpOp1P1.uw << 32)); 275 cDest.fp = -cOp1.fp; 276 FpDestP0.uw = cDest.bits; 277 FpDestP1.uw = cDest.bits >> 32; 278 ''' 279 vnegDIop = InstObjParams("vnegd", "VnegD", "RegRegOp", 280 { "code": vnegDCode, 281 "predicate_test": predicateTest }, []) 282 header_output += RegRegOpDeclare.subst(vnegDIop); 283 decoder_output += RegRegOpConstructor.subst(vnegDIop); 284 exec_output += PredOpExecute.subst(vnegDIop); 285 286 vabsSCode = ''' 287 FpDest = fabsf(FpOp1); 288 ''' 289 vabsSIop = InstObjParams("vabss", "VabsS", "RegRegOp", 290 { "code": vabsSCode, 291 "predicate_test": predicateTest }, []) 292 header_output += RegRegOpDeclare.subst(vabsSIop); 293 decoder_output += RegRegOpConstructor.subst(vabsSIop); 294 exec_output += PredOpExecute.subst(vabsSIop); 295 296 vabsDCode = ''' 297 IntDoubleUnion cOp1, cDest; 298 cOp1.bits = ((uint64_t)FpOp1P0.uw | ((uint64_t)FpOp1P1.uw << 32)); 299 cDest.fp = fabs(cOp1.fp); 300 FpDestP0.uw = cDest.bits; 301 FpDestP1.uw = cDest.bits >> 32; 302 ''' 303 vabsDIop = InstObjParams("vabsd", "VabsD", "RegRegOp", 304 { "code": vabsDCode, 305 "predicate_test": predicateTest }, []) 306 header_output += RegRegOpDeclare.subst(vabsDIop); 307 decoder_output += RegRegOpConstructor.subst(vabsDIop); 308 exec_output += PredOpExecute.subst(vabsDIop); 309 310 vaddSCode = ''' 311 FpDest = FpOp1 + FpOp2; 312 ''' 313 vaddSIop = InstObjParams("vadds", "VaddS", "RegRegRegOp", 314 { "code": vaddSCode, 315 "predicate_test": predicateTest }, []) 316 header_output += RegRegRegOpDeclare.subst(vaddSIop); 317 decoder_output += RegRegRegOpConstructor.subst(vaddSIop); 318 exec_output += PredOpExecute.subst(vaddSIop); 319 320 vaddDCode = ''' 321 IntDoubleUnion cOp1, cOp2, cDest; 322 cOp1.bits = ((uint64_t)FpOp1P0.uw | ((uint64_t)FpOp1P1.uw << 32)); 323 cOp2.bits = ((uint64_t)FpOp2P0.uw | ((uint64_t)FpOp2P1.uw << 32)); 324 cDest.fp = cOp1.fp + cOp2.fp; 325 FpDestP0.uw = cDest.bits; 326 FpDestP1.uw = cDest.bits >> 32; 327 ''' 328 vaddDIop = InstObjParams("vaddd", "VaddD", "RegRegRegOp", 329 { "code": vaddDCode, 330 "predicate_test": predicateTest }, []) 331 header_output += RegRegRegOpDeclare.subst(vaddDIop); 332 decoder_output += RegRegRegOpConstructor.subst(vaddDIop); 333 exec_output += PredOpExecute.subst(vaddDIop); 334 335 vsubSCode = ''' 336 FpDest = FpOp1 - FpOp2; 337 ''' 338 vsubSIop = InstObjParams("vsubs", "VsubS", "RegRegRegOp", 339 { "code": vsubSCode, 340 "predicate_test": predicateTest }, []) 341 header_output += RegRegRegOpDeclare.subst(vsubSIop); 342 decoder_output += RegRegRegOpConstructor.subst(vsubSIop); 343 exec_output += PredOpExecute.subst(vsubSIop); 344 345 vsubDCode = ''' 346 IntDoubleUnion cOp1, cOp2, cDest; 347 cOp1.bits = ((uint64_t)FpOp1P0.uw | ((uint64_t)FpOp1P1.uw << 32)); 348 cOp2.bits = ((uint64_t)FpOp2P0.uw | ((uint64_t)FpOp2P1.uw << 32)); 349 cDest.fp = cOp1.fp - cOp2.fp; 350 FpDestP0.uw = cDest.bits; 351 FpDestP1.uw = cDest.bits >> 32; 352 ''' 353 vsubDIop = InstObjParams("vsubd", "VsubD", "RegRegRegOp", 354 { "code": vsubDCode, 355 "predicate_test": predicateTest }, []) 356 header_output += RegRegRegOpDeclare.subst(vsubDIop); 357 decoder_output += RegRegRegOpConstructor.subst(vsubDIop); 358 exec_output += PredOpExecute.subst(vsubDIop); 359 360 vdivSCode = ''' 361 FpDest = FpOp1 / FpOp2; 362 ''' 363 vdivSIop = InstObjParams("vdivs", "VdivS", "RegRegRegOp", 364 { "code": vdivSCode, 365 "predicate_test": predicateTest }, []) 366 header_output += RegRegRegOpDeclare.subst(vdivSIop); 367 decoder_output += RegRegRegOpConstructor.subst(vdivSIop); 368 exec_output += PredOpExecute.subst(vdivSIop); 369 370 vdivDCode = ''' 371 IntDoubleUnion cOp1, cOp2, cDest; 372 cOp1.bits = ((uint64_t)FpOp1P0.uw | ((uint64_t)FpOp1P1.uw << 32)); 373 cOp2.bits = ((uint64_t)FpOp2P0.uw | ((uint64_t)FpOp2P1.uw << 32)); 374 cDest.fp = cOp1.fp / cOp2.fp; 375 FpDestP0.uw = cDest.bits; 376 FpDestP1.uw = cDest.bits >> 32; 377 ''' 378 vdivDIop = InstObjParams("vdivd", "VdivD", "RegRegRegOp", 379 { "code": vdivDCode, 380 "predicate_test": predicateTest }, []) 381 header_output += RegRegRegOpDeclare.subst(vdivDIop); 382 decoder_output += RegRegRegOpConstructor.subst(vdivDIop); 383 exec_output += PredOpExecute.subst(vdivDIop); 384 385 vsqrtSCode = ''' 386 FpDest = sqrtf(FpOp1); 387 if (FpOp1 < 0) { 388 FpDest = NAN; 389 } 390 ''' 391 vsqrtSIop = InstObjParams("vsqrts", "VsqrtS", "RegRegOp", 392 { "code": vsqrtSCode, 393 "predicate_test": predicateTest }, []) 394 header_output += RegRegOpDeclare.subst(vsqrtSIop); 395 decoder_output += RegRegOpConstructor.subst(vsqrtSIop); 396 exec_output += PredOpExecute.subst(vsqrtSIop); 397 398 vsqrtDCode = ''' 399 IntDoubleUnion cOp1, cDest; 400 cOp1.bits = ((uint64_t)FpOp1P0.uw | ((uint64_t)FpOp1P1.uw << 32)); 401 cDest.fp = sqrt(cOp1.fp); 402 if (cOp1.fp < 0) { 403 cDest.fp = NAN; 404 } 405 FpDestP0.uw = cDest.bits; 406 FpDestP1.uw = cDest.bits >> 32; 407 ''' 408 vsqrtDIop = InstObjParams("vsqrtd", "VsqrtD", "RegRegOp", 409 { "code": vsqrtDCode, 410 "predicate_test": predicateTest }, []) 411 header_output += RegRegOpDeclare.subst(vsqrtDIop); 412 decoder_output += RegRegOpConstructor.subst(vsqrtDIop); 413 exec_output += PredOpExecute.subst(vsqrtDIop); 414 415 vmlaSCode = ''' 416 float mid = FpOp1 * FpOp2; 417 if ((isinf(FpOp1) && FpOp2 == 0) || (isinf(FpOp2) && FpOp1 == 0)) { 418 mid = NAN; 419 } 420 FpDest = FpDest + mid; 421 ''' 422 vmlaSIop = InstObjParams("vmlas", "VmlaS", "RegRegRegOp", 423 { "code": vmlaSCode, 424 "predicate_test": predicateTest }, []) 425 header_output += RegRegRegOpDeclare.subst(vmlaSIop); 426 decoder_output += RegRegRegOpConstructor.subst(vmlaSIop); 427 exec_output += PredOpExecute.subst(vmlaSIop); 428 429 vmlaDCode = ''' 430 IntDoubleUnion cOp1, cOp2, cDest; 431 cOp1.bits = ((uint64_t)FpOp1P0.uw | ((uint64_t)FpOp1P1.uw << 32)); 432 cOp2.bits = ((uint64_t)FpOp2P0.uw | ((uint64_t)FpOp2P1.uw << 32)); 433 cDest.bits = ((uint64_t)FpDestP0.uw | ((uint64_t)FpDestP1.uw << 32)); 434 double mid = cOp1.fp * cOp2.fp; 435 if ((isinf(cOp1.fp) && cOp2.fp == 0) || 436 (isinf(cOp2.fp) && cOp1.fp == 0)) { 437 mid = NAN; 438 } 439 cDest.fp = cDest.fp + mid; 440 FpDestP0.uw = cDest.bits; 441 FpDestP1.uw = cDest.bits >> 32; 442 ''' 443 vmlaDIop = InstObjParams("vmlad", "VmlaD", "RegRegRegOp", 444 { "code": vmlaDCode, 445 "predicate_test": predicateTest }, []) 446 header_output += RegRegRegOpDeclare.subst(vmlaDIop); 447 decoder_output += RegRegRegOpConstructor.subst(vmlaDIop); 448 exec_output += PredOpExecute.subst(vmlaDIop); 449 450 vmlsSCode = ''' 451 float mid = FpOp1 * FpOp2; 452 if ((isinf(FpOp1) && FpOp2 == 0) || (isinf(FpOp2) && FpOp1 == 0)) { 453 mid = NAN; 454 } 455 FpDest = FpDest - mid; 456 ''' 457 vmlsSIop = InstObjParams("vmlss", "VmlsS", "RegRegRegOp", 458 { "code": vmlsSCode, 459 "predicate_test": predicateTest }, []) 460 header_output += RegRegRegOpDeclare.subst(vmlsSIop); 461 decoder_output += RegRegRegOpConstructor.subst(vmlsSIop); 462 exec_output += PredOpExecute.subst(vmlsSIop); 463 464 vmlsDCode = ''' 465 IntDoubleUnion cOp1, cOp2, cDest; 466 cOp1.bits = ((uint64_t)FpOp1P0.uw | ((uint64_t)FpOp1P1.uw << 32)); 467 cOp2.bits = ((uint64_t)FpOp2P0.uw | ((uint64_t)FpOp2P1.uw << 32)); 468 cDest.bits = ((uint64_t)FpDestP0.uw | ((uint64_t)FpDestP1.uw << 32)); 469 double mid = cOp1.fp * cOp2.fp; 470 if ((isinf(cOp1.fp) && cOp2.fp == 0) || 471 (isinf(cOp2.fp) && cOp1.fp == 0)) { 472 mid = NAN; 473 } 474 cDest.fp = cDest.fp - mid; 475 FpDestP0.uw = cDest.bits; 476 FpDestP1.uw = cDest.bits >> 32; 477 ''' 478 vmlsDIop = InstObjParams("vmlsd", "VmlsD", "RegRegRegOp", 479 { "code": vmlsDCode, 480 "predicate_test": predicateTest }, []) 481 header_output += RegRegRegOpDeclare.subst(vmlsDIop); 482 decoder_output += RegRegRegOpConstructor.subst(vmlsDIop); 483 exec_output += PredOpExecute.subst(vmlsDIop); 484}}; 485