codekingpro/portable-devtools
114k
1// asmcheck2 3// Copyright 2018 The Go Authors. All rights reserved.4// Use of this source code is governed by a BSD-style5// license that can be found in the LICENSE file.6 7package codegen8 9import "math/bits"10 11// ------------------- //12// const rotates //13// ------------------- //14 15func rot64(x uint64) uint64 {16 var a uint6417 18 // amd64:"ROLQ [$]7"19 // ppc64x:"ROTL [$]7"20 // loong64: "ROTRV [$]57"21 // riscv64: "RORI [$]57"22 a += x<<7 | x>>5723 24 // amd64:"ROLQ [$]8"25 // arm64:"ROR [$]56"26 // s390x:"RISBGZ [$]0, [$]63, [$]8, "27 // ppc64x:"ROTL [$]8"28 // loong64: "ROTRV [$]56"29 // riscv64: "RORI [$]56"30 a += x<<8 + x>>5631 32 // amd64:"ROLQ [$]9"33 // arm64:"ROR [$]55"34 // s390x:"RISBGZ [$]0, [$]63, [$]9, "35 // ppc64x:"ROTL [$]9"36 // loong64: "ROTRV [$]55"37 // riscv64: "RORI [$]55"38 a += x<<9 ^ x>>5539 40 // amd64:"ROLQ [$]10"41 // arm64:"ROR [$]54"42 // s390x:"RISBGZ [$]0, [$]63, [$]10, "43 // ppc64x:"ROTL [$]10"44 // arm64:"ROR [$]54"45 // s390x:"RISBGZ [$]0, [$]63, [$]10, "46 // loong64: "ROTRV [$]54"47 // riscv64: "RORI [$]54"48 a += bits.RotateLeft64(x, 10)49 50 return a51}52 53func rot32(x uint32) uint32 {54 var a uint3255 56 // amd64:"ROLL [$]7"57 // arm:"MOVW R\\d+@>25"58 // ppc64x:"ROTLW [$]7"59 // loong64: "ROTR [$]25"60 // riscv64: "RORIW [$]25"61 a += x<<7 | x>>2562 63 // amd64:`ROLL [$]8`64 // arm:"MOVW R\\d+@>24"65 // arm64:"RORW [$]24"66 // s390x:"RLL [$]8"67 // ppc64x:"ROTLW [$]8"68 // loong64: "ROTR [$]24"69 // riscv64: "RORIW [$]24"70 a += x<<8 + x>>2471 72 // amd64:"ROLL [$]9"73 // arm:"MOVW R\\d+@>23"74 // arm64:"RORW [$]23"75 // s390x:"RLL [$]9"76 // ppc64x:"ROTLW [$]9"77 // loong64: "ROTR [$]23"78 // riscv64: "RORIW [$]23"79 a += x<<9 ^ x>>2380 81 // amd64:"ROLL [$]10"82 // arm:"MOVW R\\d+@>22"83 // arm64:"RORW [$]22"84 // s390x:"RLL [$]10"85 // ppc64x:"ROTLW [$]10"86 // arm64:"RORW [$]22"87 // s390x:"RLL [$]10"88 // loong64: "ROTR [$]22"89 // riscv64: "RORIW [$]22"90 a += bits.RotateLeft32(x, 10)91 92 return a93}94 95func rot16(x uint16) uint16 {96 var a uint1697 98 // amd64:"ROLW [$]7"99 // riscv64: "OR" "SLLI" "SRLI" -"AND"100 a += x<<7 | x>>9101 102 // amd64:`ROLW [$]8`103 // riscv64: "OR" "SLLI" "SRLI" -"AND"104 a += x<<8 + x>>8105 106 // amd64:"ROLW [$]9"107 // riscv64: "OR" "SLLI" "SRLI" -"AND"108 a += x<<9 ^ x>>7109 110 return a111}112 113func rot8(x uint8) uint8 {114 var a uint8115 116 // amd64:"ROLB [$]5"117 // riscv64: "OR" "SLLI" "SRLI" -"AND"118 a += x<<5 | x>>3119 120 // amd64:`ROLB [$]6`121 // riscv64: "OR" "SLLI" "SRLI" -"AND"122 a += x<<6 + x>>2123 124 // amd64:"ROLB [$]7"125 // riscv64: "OR" "SLLI" "SRLI" -"AND"126 a += x<<7 ^ x>>1127 128 return a129}130 131// ----------------------- //132// non-const rotates //133// ----------------------- //134 135func rot64nc(x uint64, z uint) uint64 {136 var a uint64137 138 z &= 63139 140 // amd64:"ROLQ" -"AND"141 // arm64:"ROR" "NEG" -"AND"142 // ppc64x:"ROTL" -"NEG" -"AND"143 // loong64: "ROTRV", -"AND"144 // riscv64: "ROL" -"AND"145 a += x<<z | x>>(64-z)146 147 // amd64:"RORQ" -"AND"148 // arm64:"ROR" -"NEG" -"AND"149 // ppc64x:"ROTL" "NEG" -"AND"150 // loong64: "ROTRV", -"AND"151 // riscv64: "ROR" -"AND"152 a += x>>z | x<<(64-z)153 154 return a155}156 157func rot32nc(x uint32, z uint) uint32 {158 var a uint32159 160 z &= 31161 162 // amd64:"ROLL" -"AND"163 // arm64:"ROR" "NEG" -"AND"164 // ppc64x:"ROTLW" -"NEG" -"AND"165 // loong64: "ROTR", -"AND"166 // riscv64: "ROLW" -"AND"167 a += x<<z | x>>(32-z)168 169 // amd64:"RORL" -"AND"170 // arm64:"ROR" -"NEG" -"AND"171 // ppc64x:"ROTLW" "NEG" -"AND"172 // loong64: "ROTR", -"AND"173 // riscv64: "RORW" -"AND"174 a += x>>z | x<<(32-z)175 176 return a177}178 179func rot16nc(x uint16, z uint) uint16 {180 var a uint16181 182 z &= 15183 184 // amd64:"ROLW" -"ANDQ"185 // riscv64: "OR" "SLL" "SRL" -"AND "186 a += x<<z | x>>(16-z)187 188 // amd64:"RORW" -"ANDQ"189 // riscv64: "OR" "SLL" "SRL" -"AND "190 a += x>>z | x<<(16-z)191 192 return a193}194 195func rot8nc(x uint8, z uint) uint8 {196 var a uint8197 198 z &= 7199 200 // amd64:"ROLB" -"ANDQ"201 // riscv64: "OR" "SLL" "SRL" -"AND "202 a += x<<z | x>>(8-z)203 204 // amd64:"RORB" -"ANDQ"205 // riscv64: "OR" "SLL" "SRL" -"AND "206 a += x>>z | x<<(8-z)207 208 return a209}210 211// Issue 18254: rotate after inlining212func f32(x uint32) uint32 {213 // amd64:"ROLL [$]7"214 return rot32nc(x, 7)215}216 217func doubleRotate(x uint64) uint64 {218 x = (x << 5) | (x >> 59)219 // amd64:"ROLQ [$]15"220 // arm64:"ROR [$]49"221 x = (x << 10) | (x >> 54)222 return x223}224 225// --------------------------------------- //226// Combined Rotate + Masking operations //227// --------------------------------------- //228 229func checkMaskedRotate32(a []uint32, r int) {230 i := 0231 232 // ppc64x: "RLWNM [$]16, R[0-9]+, [$]8, [$]15, R[0-9]+"233 a[i] = bits.RotateLeft32(a[i], 16) & 0xFF0000234 i++235 // ppc64x: "RLWNM [$]16, R[0-9]+, [$]8, [$]15, R[0-9]+"236 a[i] = bits.RotateLeft32(a[i]&0xFF, 16)237 i++238 // ppc64x: "RLWNM [$]4, R[0-9]+, [$]20, [$]27, R[0-9]+"239 a[i] = bits.RotateLeft32(a[i], 4) & 0xFF0240 i++241 // ppc64x: "RLWNM [$]16, R[0-9]+, [$]24, [$]31, R[0-9]+"242 a[i] = bits.RotateLeft32(a[i]&0xFF0000, 16)243 i++244 245 // ppc64x: "RLWNM R[0-9]+, R[0-9]+, [$]8, [$]15, R[0-9]+"246 a[i] = bits.RotateLeft32(a[i], r) & 0xFF0000247 i++248 // ppc64x: "RLWNM R[0-9]+, R[0-9]+, [$]16, [$]23, R[0-9]+"249 a[i] = bits.RotateLeft32(a[i], r) & 0xFF00250 i++251 252 // ppc64x: "RLWNM R[0-9]+, R[0-9]+, [$]20, [$]11, R[0-9]+"253 a[i] = bits.RotateLeft32(a[i], r) & 0xFFF00FFF254 i++255 // ppc64x: "RLWNM [$]4, R[0-9]+, [$]20, [$]11, R[0-9]+"256 a[i] = bits.RotateLeft32(a[i], 4) & 0xFFF00FFF257 i++258}259 260// combined arithmetic and rotate on arm64261func checkArithmeticWithRotate(a *[1000]uint64) {262 // arm64: "AND R[0-9]+@>51, R[0-9]+, R[0-9]+"263 a[2] = a[1] & bits.RotateLeft64(a[0], 13)264 // arm64: "ORR R[0-9]+@>51, R[0-9]+, R[0-9]+"265 a[5] = a[4] | bits.RotateLeft64(a[3], 13)266 // arm64: "EOR R[0-9]+@>51, R[0-9]+, R[0-9]+"267 a[8] = a[7] ^ bits.RotateLeft64(a[6], 13)268 // arm64: "MVN R[0-9]+@>51, R[0-9]+"269 a[10] = ^bits.RotateLeft64(a[9], 13)270 // arm64: "BIC R[0-9]+@>51, R[0-9]+, R[0-9]+"271 a[13] = a[12] &^ bits.RotateLeft64(a[11], 13)272 // arm64: "EON R[0-9]+@>51, R[0-9]+, R[0-9]+"273 a[16] = a[15] ^ ^bits.RotateLeft64(a[14], 13)274 // arm64: "ORN R[0-9]+@>51, R[0-9]+, R[0-9]+"275 a[19] = a[18] | ^bits.RotateLeft64(a[17], 13)276 // arm64: "TST R[0-9]+@>51, R[0-9]+"277 if a[18]&bits.RotateLeft64(a[19], 13) == 0 {278 a[20] = 1279 }280 281}282 