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 9// This file contains code generation tests related to the handling of10// map types.11 12// ------------------- //13// Access Const //14// ------------------- //15 16// Direct use of constants in fast map access calls (Issue #19015).17 18func AccessInt1(m map[int]int) int {19 // amd64:"MOV[LQ] [$]5"20 return m[5]21}22 23func AccessInt2(m map[int]int) bool {24 // amd64:"MOV[LQ] [$]5"25 _, ok := m[5]26 return ok27}28 29func AccessString1(m map[string]int) int {30 // amd64:`.*"abc"`31 return m["abc"]32}33 34func AccessString2(m map[string]int) bool {35 // amd64:`.*"abc"`36 _, ok := m["abc"]37 return ok38}39 40func AccessStringIntArray2(m map[string][16]int, k string) bool {41 // amd64:-"MOVUPS"42 _, ok := m[k]43 return ok44}45 46type Struct struct {47 A, B, C, D, E, F, G, H, I, J int48}49 50func AccessStringStruct2(m map[string]Struct, k string) bool {51 // amd64:-"MOVUPS"52 _, ok := m[k]53 return ok54}55 56func AccessIntArrayLarge2(m map[int][512]int, k int) bool {57 // amd64:-"REP",-"MOVSQ"58 _, ok := m[k]59 return ok60}61 62// ------------------- //63// String Conversion //64// ------------------- //65 66func LookupStringConversionSimple(m map[string]int, bytes []byte) int {67 // amd64:-`.*runtime\.slicebytetostring\(`68 return m[string(bytes)]69}70 71func LookupStringConversionStructLit(m map[struct{ string }]int, bytes []byte) int {72 // amd64:-`.*runtime\.slicebytetostring\(`73 return m[struct{ string }{string(bytes)}]74}75 76func LookupStringConversionArrayLit(m map[[2]string]int, bytes []byte) int {77 // amd64:-`.*runtime\.slicebytetostring\(`78 return m[[2]string{string(bytes), string(bytes)}]79}80 81func LookupStringConversionNestedLit(m map[[1]struct{ s [1]string }]int, bytes []byte) int {82 // amd64:-`.*runtime\.slicebytetostring\(`83 return m[[1]struct{ s [1]string }{struct{ s [1]string }{s: [1]string{string(bytes)}}}]84}85 86func LookupStringConversionKeyedArrayLit(m map[[2]string]int, bytes []byte) int {87 // amd64:-`.*runtime\.slicebytetostring\(`88 return m[[2]string{0: string(bytes)}]89}90 91func LookupStringConversion1(m map[string]int, bytes []byte) int {92 // amd64:-`.*runtime\.slicebytetostring\(`93 s := string(bytes)94 return m[s]95}96func LookupStringConversion2(m *map[string]int, bytes []byte) int {97 // amd64:-`.*runtime\.slicebytetostring\(`98 s := string(bytes)99 return (*m)[s]100}101func LookupStringConversion3(m map[string]int, bytes []byte) (int, bool) {102 // amd64:-`.*runtime\.slicebytetostring\(`103 s := string(bytes)104 r, ok := m[s]105 return r, ok106}107func DeleteStringConversion(m map[string]int, bytes []byte) {108 // amd64:-`.*runtime\.slicebytetostring\(`109 s := string(bytes)110 delete(m, s)111}112 113// ------------------- //114// Map Clear //115// ------------------- //116 117// Optimization of map clear idiom (Issue #20138).118 119func MapClearReflexive(m map[int]int) {120 // amd64:`.*runtime\.mapclear`121 // amd64:-`.*runtime\.(mapiterinit|mapIterStart)`122 for k := range m {123 delete(m, k)124 }125}126 127func MapClearIndirect(m map[int]int) {128 s := struct{ m map[int]int }{m: m}129 // amd64:`.*runtime\.mapclear`130 // amd64:-`.*runtime\.(mapiterinit|mapIterStart)`131 for k := range s.m {132 delete(s.m, k)133 }134}135 136func MapClearPointer(m map[*byte]int) {137 // amd64:`.*runtime\.mapclear`138 // amd64:-`.*runtime\.(mapiterinit|mapIterStart)`139 for k := range m {140 delete(m, k)141 }142}143 144func MapClearNotReflexive(m map[float64]int) {145 // amd64:`.*runtime\.(mapiterinit|mapIterStart)`146 // amd64:-`.*runtime\.mapclear`147 for k := range m {148 delete(m, k)149 }150}151 152func MapClearInterface(m map[interface{}]int) {153 // amd64:`.*runtime\.(mapiterinit|mapIterStart)`154 // amd64:-`.*runtime\.mapclear`155 for k := range m {156 delete(m, k)157 }158}159 160func MapClearSideEffect(m map[int]int) int {161 k := 0162 // amd64:`.*runtime\.(mapiterinit|mapIterStart)`163 // amd64:-`.*runtime\.mapclear`164 for k = range m {165 delete(m, k)166 }167 return k168}169 170func MapLiteralSizing(x int) (map[int]int, map[int]int) {171 // This is tested for internal/abi/maps.go:MapBucketCountBits={3,4,5}172 // amd64:"MOVL [$]33,"173 m := map[int]int{174 0: 0,175 1: 1,176 2: 2,177 3: 3,178 4: 4,179 5: 5,180 6: 6,181 7: 7,182 8: 8,183 9: 9,184 10: 10,185 11: 11,186 12: 12,187 13: 13,188 14: 14,189 15: 15,190 16: 16,191 17: 17,192 18: 18,193 19: 19,194 20: 20,195 21: 21,196 22: 22,197 23: 23,198 24: 24,199 25: 25,200 26: 26,201 27: 27,202 28: 28,203 29: 29,204 30: 30,205 31: 32,206 32: 32,207 }208 // amd64:"MOVL [$]33,"209 n := map[int]int{210 0: 0,211 1: 1,212 2: 2,213 3: 3,214 4: 4,215 5: 5,216 6: 6,217 7: 7,218 8: 8,219 9: 9,220 10: 10,221 11: 11,222 12: 12,223 13: 13,224 14: 14,225 15: 15,226 16: 16,227 17: 17,228 18: 18,229 19: 19,230 20: 20,231 21: 21,232 22: 22,233 23: 23,234 24: 24,235 25: 25,236 26: 26,237 27: 27,238 28: 28,239 29: 29,240 30: 30,241 31: 32,242 32: 32,243 }244 return m, n245}246 