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