| // Copyright 2016 The Go Authors. All rights reserved. | |
| // Use of this source code is governed by a BSD-style | |
| // license that can be found in the LICENSE file. | |
| // +build !math_big_pure_go,ppc64le | |
| #include "textflag.h" | |
| // This file provides fast assembly versions for the elementary | |
| // arithmetic operations on vectors implemented in arith.go. | |
| // func divWW(x1, x0, y Word) (q, r Word) | |
| TEXT ·divWW(SB), NOSPLIT, $0 | |
| MOVD x1+0(FP), R4 | |
| MOVD x0+8(FP), R5 | |
| MOVD y+16(FP), R6 | |
| CMPU R4, R6 | |
| BGE divbigger | |
| // from the programmer's note in ch. 3 of the ISA manual, p.74 | |
| DIVDEU R6, R4, R3 | |
| DIVDU R6, R5, R7 | |
| MULLD R6, R3, R8 | |
| MULLD R6, R7, R20 | |
| SUB R20, R5, R10 | |
| ADD R7, R3, R3 | |
| SUB R8, R10, R4 | |
| CMPU R4, R10 | |
| BLT adjust | |
| CMPU R4, R6 | |
| BLT end | |
| adjust: | |
| MOVD $1, R21 | |
| ADD R21, R3, R3 | |
| SUB R6, R4, R4 | |
| end: | |
| MOVD R3, q+24(FP) | |
| MOVD R4, r+32(FP) | |
| RET | |
| divbigger: | |
| MOVD $-1, R7 | |
| MOVD R7, q+24(FP) | |
| MOVD R7, r+32(FP) | |
| RET | |