3 // Copyright 2018 The Go Authors. All rights reserved.
4 // Use of this source code is governed by a BSD-style
5 // license that can be found in the LICENSE file.
20 // Avoid zero/sign extensions following a load
21 // which has extended the value correctly.
22 // Note: No tests are done for int8 since
23 // an extra extension is usually needed due to
24 // no signed byte load.
26 func set16(x8 int8, u8 *uint8, y8 int8, z8 uint8) {
27 // Truncate not needed, load does sign/zero extend
29 // ppc64x:-"MOVBZ\tR\\d+,\\sR\\d+"
30 val16[0] = uint16(*u8)
32 // AND not needed due to size
34 sval16[1] = 255 & int16(x8+y8)
37 val16[1] = 255 & uint16(*u8+z8)
40 func shiftidx(u8 *uint8, x16 *int16, u16 *uint16) {
42 // ppc64x:-"MOVBZ\tR\\d+,\\sR\\d+"
43 val16[0] = uint16(sval16[*u8>>2])
45 // ppc64x:-"MOVH\tR\\d+,\\sR\\d+"
46 sval16[1] = int16(val16[*x16>>1])
48 // ppc64x:-"MOVHZ\tR\\d+,\\sR\\d+"
49 val16[1] = uint16(sval16[*u16>>2])
53 func setnox(x8 int8, u8 *uint8, y8 *int8, z8 *uint8, x16 *int16, u16 *uint16, x32 *int32, u32 *uint32) {
55 // ppc64x:-"MOVBZ\tR\\d+,\\sR\\d+"
56 val16[0] = uint16(*u8)
58 // AND not needed due to size
60 sval16[1] = 255 & int16(x8+*y8)
63 val16[1] = 255 & uint16(*u8+*z8)
65 // ppc64x:-"MOVH\tR\\d+,\\sR\\d+"
66 sval32[1] = int32(*x16)
68 // ppc64x:-"MOVBZ\tR\\d+,\\sR\\d+"
69 val32[0] = uint32(*u8)
71 // ppc64x:-"MOVHZ\tR\\d+,\\sR\\d+"
72 val32[1] = uint32(*u16)
74 // ppc64x:-"MOVH\tR\\d+,\\sR\\d+"
75 sval64[1] = int64(*x16)
77 // ppc64x:-"MOVW\tR\\d+,\\sR\\d+"
78 sval64[2] = int64(*x32)
80 // ppc64x:-"MOVBZ\tR\\d+,\\sR\\d+"
81 val64[0] = uint64(*u8)
83 // ppc64x:-"MOVHZ\tR\\d+,\\sR\\d+"
84 val64[1] = uint64(*u16)
86 // ppc64x:-"MOVWZ\tR\\d+,\\sR\\d+"
87 val64[2] = uint64(*u32)
90 func cmp16(u8 *uint8, x32 *int32, u32 *uint32, x64 *int64, u64 *uint64) bool {
92 // ppc64x:-"MOVBZ\tR\\d+,\\sR\\d+"
93 if uint16(*u8) == val16[0] {
97 // ppc64x:-"MOVHZ\tR\\d+,\\sR\\d+"
98 if uint16(*u32>>16) == val16[0] {
102 // ppc64x:-"MOVHZ\tR\\d+,\\sR\\d+"
103 if uint16(*u64>>48) == val16[0] {
107 // Verify the truncates are using the correct sign.
108 // ppc64x:-"MOVHZ\tR\\d+,\\sR\\d+"
109 if int16(*x32) == sval16[0] {
113 // ppc64x:-"MOVH\tR\\d+,\\sR\\d+"
114 if uint16(*u32) == val16[0] {
118 // ppc64x:-"MOVHZ\tR\\d+,\\sR\\d+"
119 if int16(*x64) == sval16[0] {
123 // ppc64x:-"MOVH\tR\\d+,\\sR\\d+"
124 if uint16(*u64) == val16[0] {
131 func cmp32(u8 *uint8, x16 *int16, u16 *uint16, x64 *int64, u64 *uint64) bool {
133 // ppc64x:-"MOVBZ\tR\\d+,\\sR\\d+"
134 if uint32(*u8) == val32[0] {
138 // ppc64x:-"MOVH\tR\\d+,\\sR\\d+"
139 if int32(*x16) == sval32[0] {
143 // ppc64x:-"MOVHZ\tR\\d+,\\sR\\d+"
144 if uint32(*u16) == val32[0] {
148 // Verify the truncates are using the correct sign.
149 // ppc64x:-"MOVWZ\tR\\d+,\\sR\\d+"
150 if int32(*x64) == sval32[0] {
154 // ppc64x:-"MOVW\tR\\d+,\\sR\\d+"
155 if uint32(*u64) == val32[0] {
162 func cmp64(u8 *uint8, x16 *int16, u16 *uint16, x32 *int32, u32 *uint32) bool {
164 // ppc64x:-"MOVBZ\tR\\d+,\\sR\\d+"
165 if uint64(*u8) == val64[0] {
169 // ppc64x:-"MOVH\tR\\d+,\\sR\\d+"
170 if int64(*x16) == sval64[0] {
174 // ppc64x:-"MOVHZ\tR\\d+,\\sR\\d+"
175 if uint64(*u16) == val64[0] {
179 // ppc64x:-"MOVW\tR\\d+,\\sR\\d+"
180 if int64(*x32) == sval64[0] {
184 // ppc64x:-"MOVWZ\tR\\d+,\\sR\\d+"
185 if uint64(*u32) == val64[0] {
191 // no unsign extension following 32 bits ops
193 func noUnsignEXT(t1, t2, t3, t4 uint32, k int64) uint64 {
196 // arm64:"RORW",-"MOVWU"
197 ret += uint64(bits.RotateLeft32(t1, 7))
199 // arm64:"MULW",-"MOVWU"
200 ret *= uint64(t1 * t2)
202 // arm64:"MNEGW",-"MOVWU"
203 ret += uint64(-t1 * t3)
205 // arm64:"UDIVW",-"MOVWU"
206 ret += uint64(t1 / t4)
209 ret += uint64(t2 % t3)
211 // arm64:"MSUBW",-"MOVWU"
212 ret += uint64(t1 - t2*t3)
214 // arm64:"MADDW",-"MOVWU"
215 ret += uint64(t3*t4 + t2)
217 // arm64:"REVW",-"MOVWU"
218 ret += uint64(bits.ReverseBytes32(t1))
220 // arm64:"RBITW",-"MOVWU"
221 ret += uint64(bits.Reverse32(t1))
223 // arm64:"CLZW",-"MOVWU"
224 ret += uint64(bits.LeadingZeros32(t1))
226 // arm64:"REV16W",-"MOVWU"
227 ret += uint64(((t1 & 0xff00ff00) >> 8) | ((t1 & 0x00ff00ff) << 8))
229 // arm64:"EXTRW",-"MOVWU"
230 ret += uint64((t1 << 25) | (t2 >> 7))
235 // no sign extension when the upper bits of the result are zero
237 func noSignEXT(x int) int64 {
246 ret += int64(int32(x & 0x7fffffff))
249 ret += int64(int16(x & 0x7fff))
252 ret += int64(int8(x & 0x7f))
257 // corner cases that sign extension must not be omitted
259 func shouldSignEXT(x int) int64 {
265 ret += int64(t1 & (-1))
268 ret += int64(int32(x & 0x80000000))
271 ret += int64(int32(x & 0x1100000011111111))
274 ret += int64(int16(x & 0x1100000000001111))
277 ret += int64(int8(x & 0x1100000000000011))