1 // Copyright 2016 The Go Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style 3 // license that can be found in the LICENSE file. 4 5 #include "textflag.h" 6 7 TEXT Exp2(SB),NOSPLIT,$0 8 BR exp2(SB) 9 10 TEXT Frexp(SB),NOSPLIT,$0 11 BR frexp(SB) 12 13 TEXT Hypot(SB),NOSPLIT,$0 14 BR hypot(SB) 15 16 TEXT Ldexp(SB),NOSPLIT,$0 17 BR ldexp(SB) 18 19 TEXT Log2(SB),NOSPLIT,$0 20 BR log2(SB) 21 22 TEXT Modf(SB),NOSPLIT,$0 23 BR modf(SB) 24 25 TEXT Mod(SB),NOSPLIT,$0 26 BR mod(SB) 27 28 TEXT Remainder(SB),NOSPLIT,$0 29 BR remainder(SB) 30 31 //if go assembly use vector instruction 32 TEXT hasVectorFacility(SB),NOSPLIT,$24-1 33 MOVD $x-24(SP), R1 34 XC $24, 0(R1), 0(R1) // clear the storage 35 MOVD $2, R0 // R0 is the number of double words stored -1 36 WORD $0xB2B01000 // STFLE 0(R1) 37 XOR R0, R0 // reset the value of R0 38 MOVBZ z-8(SP), R1 39 AND $0x40, R1 40 BEQ novector 41 vectorinstalled: 42 // check if the vector instruction has been enabled 43 VLEIB $0, $0xF, V16 44 VLGVB $0, V16, R1 45 CMPBNE R1, $0xF, novector 46 MOVB $1, ret+0(FP) // have vx 47 RET 48 novector: 49 MOVB $0, ret+0(FP) // no vx 50 RET 51 52 TEXT Log10(SB),NOSPLIT,$0 53 MOVD log10vectorfacility+0x00(SB),R1 54 BR (R1) 55 56 TEXT log10TrampolineSetup(SB),NOSPLIT, $0 57 MOVB hasVX(SB), R1 58 CMPBEQ R1, $1, vectorimpl // vectorfacility = 1, vector supported 59 MOVD $log10vectorfacility+0x00(SB), R1 60 MOVD $log10(SB), R2 61 MOVD R2, 0(R1) 62 BR log10(SB) 63 vectorimpl: 64 MOVD $log10vectorfacility+0x00(SB), R1 65 MOVD $log10Asm(SB), R2 66 MOVD R2, 0(R1) 67 BR log10Asm(SB) 68 69 GLOBL log10vectorfacility+0x00(SB), NOPTR, $8 70 DATA log10vectorfacility+0x00(SB)/8, $log10TrampolineSetup(SB) 71 72 73 TEXT Cos(SB),NOSPLIT,$0 74 MOVD cosvectorfacility+0x00(SB),R1 75 BR (R1) 76 77 TEXT cosTrampolineSetup(SB),NOSPLIT, $0 78 MOVB hasVX(SB), R1 79 CMPBEQ R1, $1, vectorimpl // vectorfacility = 1, vector supported 80 MOVD $cosvectorfacility+0x00(SB), R1 81 MOVD $cos(SB), R2 82 MOVD R2, 0(R1) 83 BR cos(SB) 84 vectorimpl: 85 MOVD $cosvectorfacility+0x00(SB), R1 86 MOVD $cosAsm(SB), R2 87 MOVD R2, 0(R1) 88 BR cosAsm(SB) 89 90 GLOBL cosvectorfacility+0x00(SB), NOPTR, $8 91 DATA cosvectorfacility+0x00(SB)/8, $cosTrampolineSetup(SB) 92 93 94 TEXT Cosh(SB),NOSPLIT,$0 95 MOVD coshvectorfacility+0x00(SB),R1 96 BR (R1) 97 98 TEXT coshTrampolineSetup(SB),NOSPLIT, $0 99 MOVB hasVX(SB), R1 100 CMPBEQ R1, $1, vectorimpl // vectorfacility = 1, vector supported 101 MOVD $coshvectorfacility+0x00(SB), R1 102 MOVD $cosh(SB), R2 103 MOVD R2, 0(R1) 104 BR cosh(SB) 105 vectorimpl: 106 MOVD $coshvectorfacility+0x00(SB), R1 107 MOVD $coshAsm(SB), R2 108 MOVD R2, 0(R1) 109 BR coshAsm(SB) 110 111 GLOBL coshvectorfacility+0x00(SB), NOPTR, $8 112 DATA coshvectorfacility+0x00(SB)/8, $coshTrampolineSetup(SB) 113 114 115 TEXT Sin(SB),NOSPLIT,$0 116 MOVD sinvectorfacility+0x00(SB),R1 117 BR (R1) 118 119 TEXT sinTrampolineSetup(SB),NOSPLIT, $0 120 MOVB hasVX(SB), R1 121 CMPBEQ R1, $1, vectorimpl // vectorfacility = 1, vector supported 122 MOVD $sinvectorfacility+0x00(SB), R1 123 MOVD $sin(SB), R2 124 MOVD R2, 0(R1) 125 BR sin(SB) 126 vectorimpl: 127 MOVD $sinvectorfacility+0x00(SB), R1 128 MOVD $sinAsm(SB), R2 129 MOVD R2, 0(R1) 130 BR sinAsm(SB) 131 132 GLOBL sinvectorfacility+0x00(SB), NOPTR, $8 133 DATA sinvectorfacility+0x00(SB)/8, $sinTrampolineSetup(SB) 134 135 136 TEXT Sinh(SB),NOSPLIT,$0 137 MOVD sinhvectorfacility+0x00(SB),R1 138 BR (R1) 139 140 TEXT sinhTrampolineSetup(SB),NOSPLIT, $0 141 MOVB hasVX(SB), R1 142 CMPBEQ R1, $1, vectorimpl // vectorfacility = 1, vector supported 143 MOVD $sinhvectorfacility+0x00(SB), R1 144 MOVD $sinh(SB), R2 145 MOVD R2, 0(R1) 146 BR sinh(SB) 147 vectorimpl: 148 MOVD $sinhvectorfacility+0x00(SB), R1 149 MOVD $sinhAsm(SB), R2 150 MOVD R2, 0(R1) 151 BR sinhAsm(SB) 152 153 GLOBL sinhvectorfacility+0x00(SB), NOPTR, $8 154 DATA sinhvectorfacility+0x00(SB)/8, $sinhTrampolineSetup(SB) 155 156 157 TEXT Tanh(SB),NOSPLIT,$0 158 MOVD tanhvectorfacility+0x00(SB),R1 159 BR (R1) 160 161 TEXT tanhTrampolineSetup(SB),NOSPLIT, $0 162 MOVB hasVX(SB), R1 163 CMPBEQ R1, $1, vectorimpl // vectorfacility = 1, vector supported 164 MOVD $tanhvectorfacility+0x00(SB), R1 165 MOVD $tanh(SB), R2 166 MOVD R2, 0(R1) 167 BR tanh(SB) 168 vectorimpl: 169 MOVD $tanhvectorfacility+0x00(SB), R1 170 MOVD $tanhAsm(SB), R2 171 MOVD R2, 0(R1) 172 BR tanhAsm(SB) 173 174 GLOBL tanhvectorfacility+0x00(SB), NOPTR, $8 175 DATA tanhvectorfacility+0x00(SB)/8, $tanhTrampolineSetup(SB) 176 177 178 TEXT Log1p(SB),NOSPLIT,$0 179 MOVD log1pvectorfacility+0x00(SB),R1 180 BR (R1) 181 182 TEXT log1pTrampolineSetup(SB),NOSPLIT, $0 183 MOVB hasVX(SB), R1 184 CMPBEQ R1, $1, vectorimpl // vectorfacility = 1, vector supported 185 MOVD $log1pvectorfacility+0x00(SB), R1 186 MOVD $log1p(SB), R2 187 MOVD R2, 0(R1) 188 BR log1p(SB) 189 vectorimpl: 190 MOVD $log1pvectorfacility+0x00(SB), R1 191 MOVD $log1pAsm(SB), R2 192 MOVD R2, 0(R1) 193 BR log1pAsm(SB) 194 195 GLOBL log1pvectorfacility+0x00(SB), NOPTR, $8 196 DATA log1pvectorfacility+0x00(SB)/8, $log1pTrampolineSetup(SB) 197 198 199 TEXT Atanh(SB),NOSPLIT,$0 200 MOVD atanhvectorfacility+0x00(SB),R1 201 BR (R1) 202 203 TEXT atanhTrampolineSetup(SB),NOSPLIT, $0 204 MOVB hasVX(SB), R1 205 CMPBEQ R1, $1, vectorimpl // vectorfacility = 1, vector supported 206 MOVD $atanhvectorfacility+0x00(SB), R1 207 MOVD $atanh(SB), R2 208 MOVD R2, 0(R1) 209 BR atanh(SB) 210 vectorimpl: 211 MOVD $atanhvectorfacility+0x00(SB), R1 212 MOVD $atanhAsm(SB), R2 213 MOVD R2, 0(R1) 214 BR atanhAsm(SB) 215 216 GLOBL atanhvectorfacility+0x00(SB), NOPTR, $8 217 DATA atanhvectorfacility+0x00(SB)/8, $atanhTrampolineSetup(SB) 218 219 220 TEXT Acos(SB),NOSPLIT,$0 221 MOVD acosvectorfacility+0x00(SB),R1 222 BR (R1) 223 224 TEXT acosTrampolineSetup(SB),NOSPLIT, $0 225 MOVB hasVX(SB), R1 226 CMPBEQ R1, $1, vectorimpl // vectorfacility = 1, vector supported 227 MOVD $acosvectorfacility+0x00(SB), R1 228 MOVD $acos(SB), R2 229 MOVD R2, 0(R1) 230 BR acos(SB) 231 vectorimpl: 232 MOVD $acosvectorfacility+0x00(SB), R1 233 MOVD $acosAsm(SB), R2 234 MOVD R2, 0(R1) 235 BR acosAsm(SB) 236 237 GLOBL acosvectorfacility+0x00(SB), NOPTR, $8 238 DATA acosvectorfacility+0x00(SB)/8, $acosTrampolineSetup(SB) 239 240 241 TEXT Asin(SB),NOSPLIT,$0 242 MOVD asinvectorfacility+0x00(SB),R1 243 BR (R1) 244 245 TEXT asinTrampolineSetup(SB),NOSPLIT, $0 246 MOVB hasVX(SB), R1 247 CMPBEQ R1, $1, vectorimpl // vectorfacility = 1, vector supported 248 MOVD $asinvectorfacility+0x00(SB), R1 249 MOVD $asin(SB), R2 250 MOVD R2, 0(R1) 251 BR asin(SB) 252 vectorimpl: 253 MOVD $asinvectorfacility+0x00(SB), R1 254 MOVD $asinAsm(SB), R2 255 MOVD R2, 0(R1) 256 BR asinAsm(SB) 257 258 GLOBL asinvectorfacility+0x00(SB), NOPTR, $8 259 DATA asinvectorfacility+0x00(SB)/8, $asinTrampolineSetup(SB) 260 261 262 TEXT Asinh(SB),NOSPLIT,$0 263 MOVD asinhvectorfacility+0x00(SB),R1 264 BR (R1) 265 266 TEXT asinhTrampolineSetup(SB),NOSPLIT, $0 267 MOVB hasVX(SB), R1 268 CMPBEQ R1, $1, vectorimpl // vectorfacility = 1, vector supported 269 MOVD $asinhvectorfacility+0x00(SB), R1 270 MOVD $asinh(SB), R2 271 MOVD R2, 0(R1) 272 BR asinh(SB) 273 vectorimpl: 274 MOVD $asinhvectorfacility+0x00(SB), R1 275 MOVD $asinhAsm(SB), R2 276 MOVD R2, 0(R1) 277 BR asinhAsm(SB) 278 279 GLOBL asinhvectorfacility+0x00(SB), NOPTR, $8 280 DATA asinhvectorfacility+0x00(SB)/8, $asinhTrampolineSetup(SB) 281 282 283 TEXT Acosh(SB),NOSPLIT,$0 284 MOVD acoshvectorfacility+0x00(SB),R1 285 BR (R1) 286 287 TEXT acoshTrampolineSetup(SB),NOSPLIT, $0 288 MOVB hasVX(SB), R1 289 CMPBEQ R1, $1, vectorimpl // vectorfacility = 1, vector supported 290 MOVD $acoshvectorfacility+0x00(SB), R1 291 MOVD $acosh(SB), R2 292 MOVD R2, 0(R1) 293 BR acosh(SB) 294 vectorimpl: 295 MOVD $acoshvectorfacility+0x00(SB), R1 296 MOVD $acoshAsm(SB), R2 297 MOVD R2, 0(R1) 298 BR acoshAsm(SB) 299 300 GLOBL acoshvectorfacility+0x00(SB), NOPTR, $8 301 DATA acoshvectorfacility+0x00(SB)/8, $acoshTrampolineSetup(SB) 302 303 304 TEXT Erf(SB),NOSPLIT,$0 305 MOVD erfvectorfacility+0x00(SB),R1 306 BR (R1) 307 308 TEXT erfTrampolineSetup(SB),NOSPLIT, $0 309 MOVB hasVX(SB), R1 310 CMPBEQ R1, $1, vectorimpl // vectorfacility = 1, vector supported 311 MOVD $erfvectorfacility+0x00(SB), R1 312 MOVD $erf(SB), R2 313 MOVD R2, 0(R1) 314 BR erf(SB) 315 vectorimpl: 316 MOVD $erfvectorfacility+0x00(SB), R1 317 MOVD $erfAsm(SB), R2 318 MOVD R2, 0(R1) 319 BR erfAsm(SB) 320 321 GLOBL erfvectorfacility+0x00(SB), NOPTR, $8 322 DATA erfvectorfacility+0x00(SB)/8, $erfTrampolineSetup(SB) 323 324 325 TEXT Erfc(SB),NOSPLIT,$0 326 MOVD erfcvectorfacility+0x00(SB),R1 327 BR (R1) 328 329 TEXT erfcTrampolineSetup(SB),NOSPLIT, $0 330 MOVB hasVX(SB), R1 331 CMPBEQ R1, $1, vectorimpl // vectorfacility = 1, vector supported 332 MOVD $erfcvectorfacility+0x00(SB), R1 333 MOVD $erfc(SB), R2 334 MOVD R2, 0(R1) 335 BR erfc(SB) 336 vectorimpl: 337 MOVD $erfcvectorfacility+0x00(SB), R1 338 MOVD $erfcAsm(SB), R2 339 MOVD R2, 0(R1) 340 BR erfcAsm(SB) 341 342 GLOBL erfcvectorfacility+0x00(SB), NOPTR, $8 343 DATA erfcvectorfacility+0x00(SB)/8, $erfcTrampolineSetup(SB) 344 345 346 TEXT Atan(SB),NOSPLIT,$0 347 MOVD atanvectorfacility+0x00(SB),R1 348 BR (R1) 349 350 TEXT atanTrampolineSetup(SB),NOSPLIT, $0 351 MOVB hasVX(SB), R1 352 CMPBEQ R1, $1, vectorimpl // vectorfacility = 1, vector supported 353 MOVD $atanvectorfacility+0x00(SB), R1 354 MOVD $atan(SB), R2 355 MOVD R2, 0(R1) 356 BR atan(SB) 357 vectorimpl: 358 MOVD $atanvectorfacility+0x00(SB), R1 359 MOVD $atanAsm(SB), R2 360 MOVD R2, 0(R1) 361 BR atanAsm(SB) 362 363 GLOBL atanvectorfacility+0x00(SB), NOPTR, $8 364 DATA atanvectorfacility+0x00(SB)/8, $atanTrampolineSetup(SB) 365 366 367 TEXT Atan2(SB),NOSPLIT,$0 368 MOVD atan2vectorfacility+0x00(SB),R1 369 BR (R1) 370 371 TEXT atan2TrampolineSetup(SB),NOSPLIT, $0 372 MOVB hasVX(SB), R1 373 CMPBEQ R1, $1, vectorimpl // vectorfacility = 1, vector supported 374 MOVD $atan2vectorfacility+0x00(SB), R1 375 MOVD $atan2(SB), R2 376 MOVD R2, 0(R1) 377 BR atan2(SB) 378 vectorimpl: 379 MOVD $atan2vectorfacility+0x00(SB), R1 380 MOVD $atan2Asm(SB), R2 381 MOVD R2, 0(R1) 382 BR atan2Asm(SB) 383 384 GLOBL atan2vectorfacility+0x00(SB), NOPTR, $8 385 DATA atan2vectorfacility+0x00(SB)/8, $atan2TrampolineSetup(SB) 386 387 388 TEXT Cbrt(SB),NOSPLIT,$0 389 MOVD cbrtvectorfacility+0x00(SB),R1 390 BR (R1) 391 392 TEXT cbrtTrampolineSetup(SB),NOSPLIT, $0 393 MOVB hasVX(SB), R1 394 CMPBEQ R1, $1, vectorimpl // vectorfacility = 1, vector supported 395 MOVD $cbrtvectorfacility+0x00(SB), R1 396 MOVD $cbrt(SB), R2 397 MOVD R2, 0(R1) 398 BR cbrt(SB) 399 vectorimpl: 400 MOVD $cbrtvectorfacility+0x00(SB), R1 401 MOVD $cbrtAsm(SB), R2 402 MOVD R2, 0(R1) 403 BR cbrtAsm(SB) 404 405 GLOBL cbrtvectorfacility+0x00(SB), NOPTR, $8 406 DATA cbrtvectorfacility+0x00(SB)/8, $cbrtTrampolineSetup(SB) 407 408 409 TEXT Log(SB),NOSPLIT,$0 410 MOVD logvectorfacility+0x00(SB),R1 411 BR (R1) 412 413 TEXT logTrampolineSetup(SB),NOSPLIT, $0 414 MOVB hasVX(SB), R1 415 CMPBEQ R1, $1, vectorimpl // vectorfacility = 1, vector supported 416 MOVD $logvectorfacility+0x00(SB), R1 417 MOVD $log(SB), R2 418 MOVD R2, 0(R1) 419 BR log(SB) 420 vectorimpl: 421 MOVD $logvectorfacility+0x00(SB), R1 422 MOVD $logAsm(SB), R2 423 MOVD R2, 0(R1) 424 BR logAsm(SB) 425 426 GLOBL logvectorfacility+0x00(SB), NOPTR, $8 427 DATA logvectorfacility+0x00(SB)/8, $logTrampolineSetup(SB) 428 429 430 TEXT Tan(SB),NOSPLIT,$0 431 MOVD tanvectorfacility+0x00(SB),R1 432 BR (R1) 433 434 TEXT tanTrampolineSetup(SB),NOSPLIT, $0 435 MOVB hasVX(SB), R1 436 CMPBEQ R1, $1, vectorimpl // vectorfacility = 1, vector supported 437 MOVD $tanvectorfacility+0x00(SB), R1 438 MOVD $tan(SB), R2 439 MOVD R2, 0(R1) 440 BR tan(SB) 441 vectorimpl: 442 MOVD $tanvectorfacility+0x00(SB), R1 443 MOVD $tanAsm(SB), R2 444 MOVD R2, 0(R1) 445 BR tanAsm(SB) 446 447 GLOBL tanvectorfacility+0x00(SB), NOPTR, $8 448 DATA tanvectorfacility+0x00(SB)/8, $tanTrampolineSetup(SB) 449 450 TEXT Exp(SB),NOSPLIT,$0 451 MOVD expvectorfacility+0x00(SB),R1 452 BR (R1) 453 454 TEXT expTrampolineSetup(SB),NOSPLIT, $0 455 MOVB hasVX(SB), R1 456 CMPBEQ R1, $1, vectorimpl // vectorfacility = 1, vector supported 457 MOVD $expvectorfacility+0x00(SB), R1 458 MOVD $exp(SB), R2 459 MOVD R2, 0(R1) 460 BR exp(SB) 461 vectorimpl: 462 MOVD $expvectorfacility+0x00(SB), R1 463 MOVD $expAsm(SB), R2 464 MOVD R2, 0(R1) 465 BR expAsm(SB) 466 467 GLOBL expvectorfacility+0x00(SB), NOPTR, $8 468 DATA expvectorfacility+0x00(SB)/8, $expTrampolineSetup(SB) 469 470 471 TEXT Expm1(SB),NOSPLIT,$0 472 MOVD expm1vectorfacility+0x00(SB),R1 473 BR (R1) 474 475 TEXT expm1TrampolineSetup(SB),NOSPLIT, $0 476 MOVB hasVX(SB), R1 477 CMPBEQ R1, $1, vectorimpl // vectorfacility = 1, vector supported 478 MOVD $expm1vectorfacility+0x00(SB), R1 479 MOVD $expm1(SB), R2 480 MOVD R2, 0(R1) 481 BR expm1(SB) 482 vectorimpl: 483 MOVD $expm1vectorfacility+0x00(SB), R1 484 MOVD $expm1Asm(SB), R2 485 MOVD R2, 0(R1) 486 BR expm1Asm(SB) 487 488 GLOBL expm1vectorfacility+0x00(SB), NOPTR, $8 489 DATA expm1vectorfacility+0x00(SB)/8, $expm1TrampolineSetup(SB) 490 491 492 TEXT Pow(SB),NOSPLIT,$0 493 MOVD powvectorfacility+0x00(SB),R1 494 BR (R1) 495 496 TEXT powTrampolineSetup(SB),NOSPLIT, $0 497 MOVB hasVX(SB), R1 498 CMPBEQ R1, $1, vectorimpl // vectorfacility = 1, vector supported 499 MOVD $powvectorfacility+0x00(SB), R1 500 MOVD $pow(SB), R2 501 MOVD R2, 0(R1) 502 BR pow(SB) 503 vectorimpl: 504 MOVD $powvectorfacility+0x00(SB), R1 505 MOVD $powAsm(SB), R2 506 MOVD R2, 0(R1) 507 BR powAsm(SB) 508 509 GLOBL powvectorfacility+0x00(SB), NOPTR, $8 510 DATA powvectorfacility+0x00(SB)/8, $powTrampolineSetup(SB) 511 512 513