operand.go (42523B)
1 // Copyright 2019 The CC 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 package cc // import "modernc.org/cc/v3" 6 7 import ( 8 "fmt" 9 "math" 10 "math/big" 11 ) 12 13 var ( 14 _ Value = (*Float128Value)(nil) 15 _ Value = (*InitializerValue)(nil) 16 _ Value = Complex128Value(0) 17 _ Value = Complex256Value{} 18 _ Value = Complex64Value(0) 19 _ Value = Float32Value(0) 20 _ Value = Float64Value(0) 21 _ Value = Int64Value(0) 22 _ Value = StringValue(0) 23 _ Value = Uint64Value(0) 24 _ Value = WideStringValue(0) 25 26 _ Operand = (*funcDesignator)(nil) 27 _ Operand = (*lvalue)(nil) 28 _ Operand = (*operand)(nil) 29 _ Operand = noOperand 30 31 noOperand = &operand{typ: noType} 32 ) 33 34 type Operand interface { 35 // IsAssingmentCompatible reports whether the operand can be 36 // assigned to lhs. [0], 6.5.16.1. 37 IsAssingmentCompatible(lhs Type) bool 38 ConvertTo(Type) Operand 39 Declarator() *Declarator 40 IsConst() bool 41 IsLValue() bool 42 IsNonZero() bool 43 IsZero() bool 44 Offset() uintptr // Valid only for non nil Declarator() value 45 Type() Type 46 Value() Value 47 convertFromInt(*context, Node, Type) Operand 48 convertTo(*context, Node, Type) Operand 49 convertToInt(*context, Node, Type) Operand 50 getABI() *ABI 51 integerPromotion(*context, Node) Operand 52 normalize(*context, Node) Operand 53 } 54 55 type Value interface { 56 IsConst() bool 57 IsNonZero() bool 58 IsZero() bool 59 add(b Value) Value 60 and(b Value) Value 61 cpl() Value 62 div(b Value) Value 63 eq(b Value) Value 64 ge(b Value) Value 65 gt(b Value) Value 66 le(b Value) Value 67 lsh(b Value) Value 68 lt(b Value) Value 69 mod(b Value) Value 70 mul(b Value) Value 71 neg() Value 72 neq(b Value) Value 73 or(b Value) Value 74 rsh(b Value) Value 75 sub(b Value) Value 76 xor(b Value) Value 77 } 78 79 type WideStringValue StringID 80 81 func (v WideStringValue) add(b Value) Value { panic(todo("")) } 82 func (v WideStringValue) and(b Value) Value { panic(todo("")) } 83 func (v WideStringValue) cpl() Value { panic(todo("")) } 84 func (v WideStringValue) div(b Value) Value { panic(todo("")) } 85 func (v WideStringValue) eq(b Value) Value { return boolValue(v == b.(WideStringValue)) } 86 func (v WideStringValue) IsConst() bool { return true } 87 func (v WideStringValue) IsNonZero() bool { return true } 88 func (v WideStringValue) IsZero() bool { return false } 89 func (v WideStringValue) lsh(b Value) Value { panic(todo("")) } 90 func (v WideStringValue) mod(b Value) Value { panic(todo("")) } 91 func (v WideStringValue) mul(b Value) Value { panic(todo("")) } 92 func (v WideStringValue) neg() Value { panic(todo("")) } 93 func (v WideStringValue) neq(b Value) Value { return boolValue(v != b.(WideStringValue)) } 94 func (v WideStringValue) or(b Value) Value { panic(todo("")) } 95 func (v WideStringValue) rsh(b Value) Value { panic(todo("")) } 96 func (v WideStringValue) sub(b Value) Value { panic(todo("")) } 97 func (v WideStringValue) xor(b Value) Value { panic(todo("")) } 98 99 func (v WideStringValue) le(b Value) Value { 100 return boolValue(StringID(v).String() <= StringID(b.(WideStringValue)).String()) 101 } 102 103 func (v WideStringValue) ge(b Value) Value { 104 return boolValue(StringID(v).String() >= StringID(b.(WideStringValue)).String()) 105 } 106 107 func (v WideStringValue) gt(b Value) Value { 108 return boolValue(StringID(v).String() > StringID(b.(WideStringValue)).String()) 109 } 110 111 func (v WideStringValue) lt(b Value) Value { 112 return boolValue(StringID(v).String() < StringID(b.(WideStringValue)).String()) 113 } 114 115 type StringValue StringID 116 117 func (v StringValue) add(b Value) Value { panic(todo("")) } 118 func (v StringValue) and(b Value) Value { panic(todo("")) } 119 func (v StringValue) cpl() Value { panic(todo("")) } 120 func (v StringValue) div(b Value) Value { panic(todo("")) } 121 func (v StringValue) eq(b Value) Value { return boolValue(v == b.(StringValue)) } 122 func (v StringValue) IsConst() bool { return true } 123 func (v StringValue) IsNonZero() bool { return true } 124 func (v StringValue) IsZero() bool { return false } 125 func (v StringValue) lsh(b Value) Value { panic(todo("")) } 126 func (v StringValue) mod(b Value) Value { panic(todo("")) } 127 func (v StringValue) mul(b Value) Value { panic(todo("")) } 128 func (v StringValue) neg() Value { panic(todo("")) } 129 func (v StringValue) neq(b Value) Value { return boolValue(v != b.(StringValue)) } 130 func (v StringValue) or(b Value) Value { panic(todo("")) } 131 func (v StringValue) rsh(b Value) Value { panic(todo("")) } 132 func (v StringValue) sub(b Value) Value { panic(todo("")) } 133 func (v StringValue) xor(b Value) Value { panic(todo("")) } 134 135 func (v StringValue) le(b Value) Value { 136 return boolValue(StringID(v).String() <= StringID(b.(StringValue)).String()) 137 } 138 139 func (v StringValue) ge(b Value) Value { 140 return boolValue(StringID(v).String() >= StringID(b.(StringValue)).String()) 141 } 142 143 func (v StringValue) gt(b Value) Value { 144 return boolValue(StringID(v).String() > StringID(b.(StringValue)).String()) 145 } 146 147 func (v StringValue) lt(b Value) Value { 148 return boolValue(StringID(v).String() < StringID(b.(StringValue)).String()) 149 } 150 151 type Int64Value int64 152 153 func (v Int64Value) add(b Value) Value { return v + b.(Int64Value) } 154 func (v Int64Value) and(b Value) Value { return v & b.(Int64Value) } 155 func (v Int64Value) cpl() Value { return ^v } 156 func (v Int64Value) eq(b Value) Value { return boolValue(v == b.(Int64Value)) } 157 func (v Int64Value) ge(b Value) Value { return boolValue(v >= b.(Int64Value)) } 158 func (v Int64Value) gt(b Value) Value { return boolValue(v > b.(Int64Value)) } 159 func (v Int64Value) IsConst() bool { return true } 160 func (v Int64Value) IsNonZero() bool { return v != 0 } 161 func (v Int64Value) IsZero() bool { return v == 0 } 162 func (v Int64Value) le(b Value) Value { return boolValue(v <= b.(Int64Value)) } 163 func (v Int64Value) lt(b Value) Value { return boolValue(v < b.(Int64Value)) } 164 func (v Int64Value) mul(b Value) Value { return v * b.(Int64Value) } 165 func (v Int64Value) neg() Value { return -v } 166 func (v Int64Value) neq(b Value) Value { return boolValue(v != b.(Int64Value)) } 167 func (v Int64Value) or(b Value) Value { return v | b.(Int64Value) } 168 func (v Int64Value) sub(b Value) Value { return v - b.(Int64Value) } 169 func (v Int64Value) xor(b Value) Value { return v ^ b.(Int64Value) } 170 171 func (v Int64Value) div(b Value) Value { 172 if b.IsZero() { 173 return nil 174 } 175 176 return v / b.(Int64Value) 177 } 178 179 func (v Int64Value) lsh(b Value) Value { 180 switch y := b.(type) { 181 case Int64Value: 182 return v << uint64(y) 183 case Uint64Value: 184 return v << y 185 default: 186 panic(todo("")) 187 } 188 } 189 190 func (v Int64Value) rsh(b Value) Value { 191 switch y := b.(type) { 192 case Int64Value: 193 return v >> uint64(y) 194 case Uint64Value: 195 return v >> y 196 default: 197 panic(todo("")) 198 } 199 } 200 201 func (v Int64Value) mod(b Value) Value { 202 if b.IsZero() { 203 return nil 204 } 205 206 return v % b.(Int64Value) 207 } 208 209 type Uint64Value uint64 210 211 func (v Uint64Value) add(b Value) Value { return v + b.(Uint64Value) } 212 func (v Uint64Value) and(b Value) Value { return v & b.(Uint64Value) } 213 func (v Uint64Value) cpl() Value { return ^v } 214 func (v Uint64Value) eq(b Value) Value { return boolValue(v == b.(Uint64Value)) } 215 func (v Uint64Value) ge(b Value) Value { return boolValue(v >= b.(Uint64Value)) } 216 func (v Uint64Value) gt(b Value) Value { return boolValue(v > b.(Uint64Value)) } 217 func (v Uint64Value) IsConst() bool { return true } 218 func (v Uint64Value) IsNonZero() bool { return v != 0 } 219 func (v Uint64Value) IsZero() bool { return v == 0 } 220 func (v Uint64Value) le(b Value) Value { return boolValue(v <= b.(Uint64Value)) } 221 func (v Uint64Value) lt(b Value) Value { return boolValue(v < b.(Uint64Value)) } 222 func (v Uint64Value) mul(b Value) Value { return v * b.(Uint64Value) } 223 func (v Uint64Value) neg() Value { return -v } 224 func (v Uint64Value) neq(b Value) Value { return boolValue(v != b.(Uint64Value)) } 225 func (v Uint64Value) or(b Value) Value { return v | b.(Uint64Value) } 226 func (v Uint64Value) sub(b Value) Value { return v - b.(Uint64Value) } 227 func (v Uint64Value) xor(b Value) Value { return v ^ b.(Uint64Value) } 228 229 func (v Uint64Value) div(b Value) Value { 230 if b.IsZero() { 231 return nil 232 } 233 234 return v / b.(Uint64Value) 235 } 236 237 func (v Uint64Value) lsh(b Value) Value { 238 switch y := b.(type) { 239 case Int64Value: 240 return v << uint64(y) 241 case Uint64Value: 242 return v << y 243 default: 244 panic(todo("")) 245 } 246 } 247 248 func (v Uint64Value) rsh(b Value) Value { 249 switch y := b.(type) { 250 case Int64Value: 251 return v >> uint64(y) 252 case Uint64Value: 253 return v >> y 254 default: 255 panic(todo("")) 256 } 257 } 258 259 func (v Uint64Value) mod(b Value) Value { 260 if b.IsZero() { 261 return nil 262 } 263 264 return v % b.(Uint64Value) 265 } 266 267 type Float32Value float32 268 269 func (v Float32Value) add(b Value) Value { return v + b.(Float32Value) } 270 func (v Float32Value) and(b Value) Value { panic(todo("")) } 271 func (v Float32Value) cpl() Value { panic(todo("")) } 272 func (v Float32Value) div(b Value) Value { return v / b.(Float32Value) } 273 func (v Float32Value) eq(b Value) Value { return boolValue(v == b.(Float32Value)) } 274 func (v Float32Value) ge(b Value) Value { return boolValue(v >= b.(Float32Value)) } 275 func (v Float32Value) gt(b Value) Value { return boolValue(v > b.(Float32Value)) } 276 func (v Float32Value) IsConst() bool { return true } 277 func (v Float32Value) IsNonZero() bool { return v != 0 } 278 func (v Float32Value) IsZero() bool { return !math.Signbit(float64(v)) && v == 0 } 279 func (v Float32Value) le(b Value) Value { return boolValue(v <= b.(Float32Value)) } 280 func (v Float32Value) lsh(b Value) Value { panic(todo("")) } 281 func (v Float32Value) lt(b Value) Value { return boolValue(v < b.(Float32Value)) } 282 func (v Float32Value) mod(b Value) Value { panic(todo("")) } 283 func (v Float32Value) mul(b Value) Value { return v * b.(Float32Value) } 284 func (v Float32Value) neg() Value { return -v } 285 func (v Float32Value) neq(b Value) Value { return boolValue(v != b.(Float32Value)) } 286 func (v Float32Value) or(b Value) Value { panic(todo("")) } 287 func (v Float32Value) rsh(b Value) Value { panic(todo("")) } 288 func (v Float32Value) sub(b Value) Value { return v - b.(Float32Value) } 289 func (v Float32Value) xor(b Value) Value { panic(todo("")) } 290 291 type Float64Value float64 292 293 func (v Float64Value) add(b Value) Value { return v + b.(Float64Value) } 294 func (v Float64Value) and(b Value) Value { panic(todo("")) } 295 func (v Float64Value) cpl() Value { panic(todo("")) } 296 func (v Float64Value) div(b Value) Value { return v / b.(Float64Value) } 297 func (v Float64Value) eq(b Value) Value { return boolValue(v == b.(Float64Value)) } 298 func (v Float64Value) ge(b Value) Value { return boolValue(v >= b.(Float64Value)) } 299 func (v Float64Value) gt(b Value) Value { return boolValue(v > b.(Float64Value)) } 300 func (v Float64Value) IsConst() bool { return true } 301 func (v Float64Value) IsNonZero() bool { return v != 0 } 302 func (v Float64Value) IsZero() bool { return !math.Signbit(float64(v)) && v == 0 } 303 func (v Float64Value) le(b Value) Value { return boolValue(v <= b.(Float64Value)) } 304 func (v Float64Value) lsh(b Value) Value { panic(todo("")) } 305 func (v Float64Value) lt(b Value) Value { return boolValue(v < b.(Float64Value)) } 306 func (v Float64Value) mod(b Value) Value { panic(todo("")) } 307 func (v Float64Value) mul(b Value) Value { return v * b.(Float64Value) } 308 func (v Float64Value) neg() Value { return -v } 309 func (v Float64Value) neq(b Value) Value { return boolValue(v != b.(Float64Value)) } 310 func (v Float64Value) or(b Value) Value { panic(todo("")) } 311 func (v Float64Value) rsh(b Value) Value { panic(todo("")) } 312 func (v Float64Value) sub(b Value) Value { return v - b.(Float64Value) } 313 func (v Float64Value) xor(b Value) Value { panic(todo("")) } 314 315 var float128Zero = &Float128Value{N: big.NewFloat(0)} 316 317 type Float128Value struct { 318 N *big.Float 319 NaN bool 320 } 321 322 func (v *Float128Value) add(b Value) Value { return v.safe(b, func(x, y *big.Float) { x.Add(x, y) }) } 323 func (v *Float128Value) and(b Value) Value { panic(todo("")) } 324 func (v *Float128Value) cpl() Value { panic(todo("")) } 325 func (v *Float128Value) div(b Value) Value { return v.safe(b, func(x, y *big.Float) { x.Quo(x, y) }) } 326 func (v *Float128Value) eq(b Value) Value { panic(todo("")) } 327 func (v *Float128Value) ge(b Value) Value { panic(todo("")) } 328 func (v *Float128Value) gt(b Value) Value { return boolValue(v.cmp(b, -1, 0)) } 329 func (v *Float128Value) IsNonZero() bool { panic(todo("")) } 330 func (v *Float128Value) IsConst() bool { return true } 331 func (v *Float128Value) IsZero() bool { return !v.NaN && !v.N.Signbit() && v.cmp(float128Zero, 0) } 332 func (v *Float128Value) le(b Value) Value { panic(todo("")) } 333 func (v *Float128Value) lsh(b Value) Value { panic(todo("")) } 334 func (v *Float128Value) lt(b Value) Value { panic(todo("")) } 335 func (v *Float128Value) mod(b Value) Value { panic(todo("")) } 336 func (v *Float128Value) mul(b Value) Value { return v.safe(b, func(x, y *big.Float) { x.Mul(x, y) }) } 337 func (v *Float128Value) neg() Value { return v.safe(nil, func(x, y *big.Float) { x.Neg(x) }) } 338 func (v *Float128Value) neq(b Value) Value { panic(todo("")) } 339 func (v *Float128Value) or(b Value) Value { panic(todo("")) } 340 func (v *Float128Value) rsh(b Value) Value { panic(todo("")) } 341 func (v *Float128Value) sub(b Value) Value { return v.safe(b, func(x, y *big.Float) { x.Sub(x, y) }) } 342 func (v *Float128Value) xor(b Value) Value { panic(todo("")) } 343 344 func (v *Float128Value) cmp(b Value, accept ...int) bool { 345 w := b.(*Float128Value) 346 if v.NaN || w.NaN { 347 return false 348 } 349 350 x := v.N.Cmp(w.N) 351 for _, v := range accept { 352 if v == x { 353 return true 354 } 355 } 356 return false 357 } 358 359 func (v *Float128Value) String() string { 360 switch { 361 case v == nil: 362 return "<nil>" 363 case v.NaN: 364 return "NaN" 365 default: 366 return fmt.Sprint(v.N) 367 } 368 } 369 370 func (v *Float128Value) safe(b Value, f func(*big.Float, *big.Float)) (ret Value) { 371 var w *Float128Value 372 if b != nil { 373 w = b.(*Float128Value) 374 } 375 if v.NaN || w != nil && w.NaN { 376 return &Float128Value{NaN: true} 377 } 378 379 r := &Float128Value{} 380 381 defer func() { 382 switch x := recover().(type) { 383 case big.ErrNaN: 384 r.N = nil 385 r.NaN = true 386 ret = r 387 case nil: 388 // ok 389 default: 390 panic(x) 391 } 392 }() 393 394 r.N = big.NewFloat(0).SetPrec(0).Set(v.N) 395 var wn *big.Float 396 if w != nil { 397 wn = w.N 398 } 399 f(r.N, wn) 400 return r 401 } 402 403 type Complex64Value complex64 404 405 func (v Complex64Value) add(b Value) Value { return v + b.(Complex64Value) } 406 func (v Complex64Value) and(b Value) Value { panic(todo("")) } 407 func (v Complex64Value) cpl() Value { panic(todo("")) } 408 func (v Complex64Value) div(b Value) Value { return v / b.(Complex64Value) } 409 func (v Complex64Value) eq(b Value) Value { return boolValue(v == b.(Complex64Value)) } 410 func (v Complex64Value) ge(b Value) Value { panic(todo("")) } 411 func (v Complex64Value) gt(b Value) Value { panic(todo("")) } 412 func (v Complex64Value) IsConst() bool { return true } 413 func (v Complex64Value) IsNonZero() bool { return v != 0 } 414 func (v Complex64Value) IsZero() bool { return v == 0 } 415 func (v Complex64Value) le(b Value) Value { panic(todo("")) } 416 func (v Complex64Value) lsh(b Value) Value { panic(todo("")) } 417 func (v Complex64Value) lt(b Value) Value { panic(todo("")) } 418 func (v Complex64Value) mod(b Value) Value { panic(todo("")) } 419 func (v Complex64Value) mul(b Value) Value { return v * b.(Complex64Value) } 420 func (v Complex64Value) neg() Value { return -v } 421 func (v Complex64Value) neq(b Value) Value { return boolValue(v != b.(Complex64Value)) } 422 func (v Complex64Value) or(b Value) Value { panic(todo("")) } 423 func (v Complex64Value) rsh(b Value) Value { panic(todo("")) } 424 func (v Complex64Value) sub(b Value) Value { return v - b.(Complex64Value) } 425 func (v Complex64Value) xor(b Value) Value { panic(todo("")) } 426 427 type Complex128Value complex128 428 429 func (v Complex128Value) add(b Value) Value { return v + b.(Complex128Value) } 430 func (v Complex128Value) and(b Value) Value { panic(todo("")) } 431 func (v Complex128Value) cpl() Value { panic(todo("")) } 432 func (v Complex128Value) div(b Value) Value { return v / b.(Complex128Value) } 433 func (v Complex128Value) eq(b Value) Value { return boolValue(v == b.(Complex128Value)) } 434 func (v Complex128Value) ge(b Value) Value { panic(todo("")) } 435 func (v Complex128Value) gt(b Value) Value { panic(todo("")) } 436 func (v Complex128Value) IsConst() bool { return true } 437 func (v Complex128Value) IsNonZero() bool { return v != 0 } 438 func (v Complex128Value) IsZero() bool { return v == 0 } 439 func (v Complex128Value) le(b Value) Value { panic(todo("")) } 440 func (v Complex128Value) lsh(b Value) Value { panic(todo("")) } 441 func (v Complex128Value) lt(b Value) Value { panic(todo("")) } 442 func (v Complex128Value) mod(b Value) Value { panic(todo("")) } 443 func (v Complex128Value) mul(b Value) Value { return v * b.(Complex128Value) } 444 func (v Complex128Value) neg() Value { return -v } 445 func (v Complex128Value) neq(b Value) Value { return boolValue(v != b.(Complex128Value)) } 446 func (v Complex128Value) or(b Value) Value { panic(todo("")) } 447 func (v Complex128Value) rsh(b Value) Value { panic(todo("")) } 448 func (v Complex128Value) sub(b Value) Value { return v - b.(Complex128Value) } 449 func (v Complex128Value) xor(b Value) Value { panic(todo("")) } 450 451 type Complex256Value struct { 452 Re, Im *Float128Value 453 } 454 455 func (v Complex256Value) add(b Value) Value { 456 w := b.(Complex256Value) 457 return Complex256Value{v.Re.add(w.Re).(*Float128Value), v.Im.add(w.Im).(*Float128Value)} 458 } 459 460 func (v Complex256Value) and(b Value) Value { panic(todo("")) } 461 func (v Complex256Value) cpl() Value { panic(todo("")) } 462 func (v Complex256Value) div(b Value) Value { panic(todo("")) } 463 func (v Complex256Value) eq(b Value) Value { panic(todo("")) } 464 func (v Complex256Value) ge(b Value) Value { panic(todo("")) } 465 func (v Complex256Value) gt(b Value) Value { panic(todo("")) } 466 func (v Complex256Value) IsConst() bool { return true } 467 func (v Complex256Value) IsNonZero() bool { panic(todo("")) } 468 func (v Complex256Value) IsZero() bool { return v.Re.IsZero() && v.Im.IsZero() } 469 func (v Complex256Value) le(b Value) Value { panic(todo("")) } 470 func (v Complex256Value) lsh(b Value) Value { panic(todo("")) } 471 func (v Complex256Value) lt(b Value) Value { panic(todo("")) } 472 func (v Complex256Value) mod(b Value) Value { panic(todo("")) } 473 func (v Complex256Value) mul(b Value) Value { panic(todo("")) } 474 func (v Complex256Value) neg() Value { panic(todo("")) } 475 func (v Complex256Value) neq(b Value) Value { panic(todo("")) } 476 func (v Complex256Value) or(b Value) Value { panic(todo("")) } 477 func (v Complex256Value) rsh(b Value) Value { panic(todo("")) } 478 func (v Complex256Value) sub(b Value) Value { panic(todo("")) } 479 func (v Complex256Value) xor(b Value) Value { panic(todo("")) } 480 481 type lvalue struct { 482 Operand 483 declarator *Declarator 484 } 485 486 func (o *lvalue) ConvertTo(to Type) (r Operand) { return o.convertTo(nil, nil, to) } 487 func (o *lvalue) Declarator() *Declarator { return o.declarator } 488 func (o *lvalue) IsLValue() bool { return true } 489 490 func (o *lvalue) IsConst() bool { 491 if v := o.Value(); v != nil { 492 return v.IsConst() 493 } 494 495 d := o.Declarator() 496 return d != nil && (d.Linkage != None || d.IsStatic()) 497 } 498 499 func (o *lvalue) convertTo(ctx *context, n Node, to Type) (r Operand) { 500 return &lvalue{Operand: o.Operand.convertTo(ctx, n, to), declarator: o.declarator} 501 } 502 503 type funcDesignator struct { 504 Operand 505 declarator *Declarator 506 } 507 508 func (o *funcDesignator) ConvertTo(to Type) (r Operand) { return o.convertTo(nil, nil, to) } 509 func (o *funcDesignator) Declarator() *Declarator { return o.declarator } 510 func (o *funcDesignator) IsLValue() bool { return false } 511 func (o *funcDesignator) IsConst() bool { return true } 512 513 func (o *funcDesignator) convertTo(ctx *context, n Node, to Type) (r Operand) { 514 return &lvalue{Operand: o.Operand.convertTo(ctx, n, to), declarator: o.declarator} 515 } 516 517 type operand struct { 518 abi *ABI 519 typ Type 520 value Value 521 offset uintptr 522 } 523 524 func (o *operand) ConvertTo(to Type) (r Operand) { return o.convertTo(nil, nil, to) } 525 func (o *operand) Declarator() *Declarator { return nil } 526 func (o *operand) Offset() uintptr { return o.offset } 527 func (o *operand) IsLValue() bool { return false } 528 func (o *operand) IsNonZero() bool { return o.value != nil && o.value.IsNonZero() } 529 func (o *operand) IsZero() bool { return o.value != nil && o.value.IsZero() } 530 func (o *operand) Type() Type { return o.typ } 531 func (o *operand) Value() Value { return o.value } 532 func (o *operand) getABI() *ABI { return o.abi } 533 534 // IsAssingmentCompatible implements Operand. 535 func (o *operand) IsAssingmentCompatible(lhs Type) bool { return lhs.isAssingmentCompatibleOperand(o) } 536 537 func (o *operand) IsConst() bool { 538 if v := o.Value(); v != nil { 539 return v.IsConst() 540 } 541 542 d := o.Declarator() 543 return d != nil && (d.Linkage != None || d.IsStatic()) 544 } 545 546 // [0]6.3.1.8 547 // 548 // Many operators that expect operands of arithmetic type cause conversions and 549 // yield result types in a similar way. The purpose is to determine a common 550 // real type for the operands and result. For the specified operands, each 551 // operand is converted, without change of type domain, to a type whose 552 // corresponding real type is the common real type. Unless explicitly stated 553 // otherwise, the common real type is also the corresponding real type of the 554 // result, whose type domain is the type domain of the operands if they are the 555 // same, and complex otherwise. This pattern is called the usual arithmetic 556 // conversions: 557 func usualArithmeticConversions(ctx *context, n Node, a, b Operand, normalize bool) (Operand, Operand) { 558 if a.Type().Kind() == Invalid || b.Type().Kind() == Invalid { 559 return noOperand, noOperand 560 } 561 562 abi := a.getABI() 563 if !a.Type().IsArithmeticType() { 564 if ctx != nil { 565 ctx.errNode(n, "not an arithmetic type: %s", a.Type()) 566 } 567 return noOperand, noOperand 568 } 569 570 if !b.Type().IsArithmeticType() { 571 if ctx != nil { 572 ctx.errNode(n, "not an arithmetic type: %s", b.Type()) 573 } 574 return noOperand, noOperand 575 } 576 577 if a.Type() == nil || b.Type() == nil { 578 return a, b 579 } 580 581 if normalize { 582 a = a.normalize(ctx, n) 583 b = b.normalize(ctx, n) 584 } 585 if a == noOperand || b == noOperand { 586 return noOperand, noOperand 587 } 588 589 at := a.Type() 590 bt := b.Type() 591 cplx := at.IsComplexType() || bt.IsComplexType() 592 593 // First, if the corresponding real type of either operand is long 594 // double, the other operand is converted, without change of type 595 // domain, to a type whose corresponding real type is long double. 596 if at.Kind() == ComplexLongDouble || bt.Kind() == ComplexLongDouble || at.Kind() == LongDouble || bt.Kind() == LongDouble { 597 switch { 598 case cplx: 599 return a.convertTo(ctx, n, abi.Type(ComplexLongDouble)), b.convertTo(ctx, n, abi.Type(ComplexLongDouble)) 600 default: 601 return a.convertTo(ctx, n, abi.Type(LongDouble)), b.convertTo(ctx, n, abi.Type(LongDouble)) 602 } 603 } 604 605 // Otherwise, if the corresponding real type of either operand is 606 // double, the other operand is converted, without change of type 607 // domain, to a type whose corresponding real type is double. 608 if at.Kind() == ComplexDouble || bt.Kind() == ComplexDouble || at.Kind() == Double || bt.Kind() == Double { 609 switch { 610 case cplx: 611 return a.convertTo(ctx, n, abi.Type(ComplexDouble)), b.convertTo(ctx, n, abi.Type(ComplexDouble)) 612 default: 613 return a.convertTo(ctx, n, abi.Type(Double)), b.convertTo(ctx, n, abi.Type(Double)) 614 } 615 } 616 617 // Otherwise, if the corresponding real type of either operand is 618 // float, the other operand is converted, without change of type 619 // domain, to a type whose corresponding real type is float. 620 if at.Kind() == ComplexFloat || bt.Kind() == ComplexFloat || at.Kind() == Float || bt.Kind() == Float { 621 switch { 622 case cplx: 623 return a.convertTo(ctx, n, abi.Type(ComplexFloat)), b.convertTo(ctx, n, abi.Type(ComplexFloat)) 624 default: 625 return a.convertTo(ctx, n, abi.Type(Float)), b.convertTo(ctx, n, abi.Type(Float)) 626 } 627 } 628 629 if cplx { 630 panic(internalErrorf("TODO %v, %v", at, bt)) 631 } 632 633 if !a.Type().IsIntegerType() || !b.Type().IsIntegerType() { 634 panic(todo("")) 635 } 636 637 // Otherwise, the integer promotions are performed on both operands. 638 a = a.integerPromotion(ctx, n) 639 b = b.integerPromotion(ctx, n) 640 at = a.Type() 641 bt = b.Type() 642 643 // Then the following rules are applied to the promoted operands: 644 645 // If both operands have the same type, then no further conversion is 646 // needed. 647 if at.Kind() == bt.Kind() { 648 return a, b 649 } 650 651 // Otherwise, if both operands have signed integer types or both have 652 // unsigned integer types, the operand with the type of lesser integer 653 // conversion rank is converted to the type of the operand with greater 654 // rank. 655 if abi.isSignedInteger(at.Kind()) == abi.isSignedInteger(bt.Kind()) { 656 t := a.Type() 657 if intConvRank[bt.Kind()] > intConvRank[at.Kind()] { 658 t = b.Type() 659 } 660 return a.convertTo(ctx, n, t), b.convertTo(ctx, n, t) 661 662 } 663 664 // Otherwise, if the operand that has unsigned integer type has rank 665 // greater or equal to the rank of the type of the other operand, then 666 // the operand with signed integer type is converted to the type of the 667 // operand with unsigned integer type. 668 switch { 669 case a.Type().IsSignedType(): // b is unsigned 670 if intConvRank[bt.Kind()] >= intConvRank[a.Type().Kind()] { 671 return a.convertTo(ctx, n, b.Type()), b 672 } 673 case b.Type().IsSignedType(): // a is unsigned 674 if intConvRank[at.Kind()] >= intConvRank[b.Type().Kind()] { 675 return a, b.convertTo(ctx, n, a.Type()) 676 } 677 default: 678 panic(fmt.Errorf("TODO %v %v", a.Type(), b.Type())) 679 } 680 681 // Otherwise, if the type of the operand with signed integer type can 682 // represent all of the values of the type of the operand with unsigned 683 // integer type, then the operand with unsigned integer type is 684 // converted to the type of the operand with signed integer type. 685 var signed Type 686 switch { 687 case abi.isSignedInteger(at.Kind()): // b is unsigned 688 signed = a.Type() 689 if at.Size() > bt.Size() { 690 return a, b.convertTo(ctx, n, a.Type()) 691 } 692 case abi.isSignedInteger(bt.Kind()): // a is unsigned 693 signed = b.Type() 694 if bt.Size() > at.Size() { 695 return a.convertTo(ctx, n, b.Type()), b 696 } 697 698 } 699 700 // Otherwise, both operands are converted to the unsigned integer type 701 // corresponding to the type of the operand with signed integer type. 702 var typ Type 703 switch signed.Kind() { 704 case Int: 705 //TODO if a.IsEnumConst || b.IsEnumConst { 706 //TODO return a, b 707 //TODO } 708 709 typ = abi.Type(UInt) 710 case Long: 711 typ = abi.Type(ULong) 712 case LongLong: 713 typ = abi.Type(ULongLong) 714 default: 715 panic(todo("")) 716 } 717 return a.convertTo(ctx, n, typ), b.convertTo(ctx, n, typ) 718 } 719 720 // [0]6.3.1.1-2 721 // 722 // If an int can represent all values of the original type, the value is 723 // converted to an int; otherwise, it is converted to an unsigned int. These 724 // are called the integer promotions. All other types are unchanged by the 725 // integer promotions. 726 func (o *operand) integerPromotion(ctx *context, n Node) Operand { 727 t := o.Type() 728 if t2 := integerPromotion(o.abi, t); t2.Kind() != t.Kind() { 729 return o.convertTo(ctx, n, t2) 730 } 731 732 return o 733 } 734 735 // [0]6.3.1.1-2 736 // 737 // If an int can represent all values of the original type, the value is 738 // converted to an int; otherwise, it is converted to an unsigned int. These 739 // are called the integer promotions. All other types are unchanged by the 740 // integer promotions. 741 func integerPromotion(abi *ABI, t Type) Type { 742 // github.com/gcc-mirror/gcc/gcc/testsuite/gcc.c-torture/execute/bf-sign-2.c 743 // 744 // This test checks promotion of bitfields. Bitfields 745 // should be promoted very much like chars and shorts: 746 // 747 // Bitfields (signed or unsigned) should be promoted to 748 // signed int if their value will fit in a signed int, 749 // otherwise to an unsigned int if their value will fit 750 // in an unsigned int, otherwise we don't promote them 751 // (ANSI/ISO does not specify the behavior of bitfields 752 // larger than an unsigned int). 753 if t.IsBitFieldType() { 754 f := t.BitField() 755 intBits := int(abi.Types[Int].Size) * 8 756 switch { 757 case t.IsSignedType(): 758 if f.BitFieldWidth() < intBits-1 { 759 return abi.Type(Int) 760 } 761 default: 762 if f.BitFieldWidth() < intBits { 763 return abi.Type(Int) 764 } 765 } 766 return t 767 } 768 769 switch t.Kind() { 770 case Invalid: 771 return t 772 case Char, SChar, UChar, Short, UShort: 773 return abi.Type(Int) 774 default: 775 return t 776 } 777 } 778 779 func (o *operand) convertTo(ctx *context, n Node, to Type) Operand { 780 if o.Type().Kind() == Invalid { 781 return o 782 } 783 784 v := o.Value() 785 r := &operand{abi: o.abi, typ: to, offset: o.offset, value: v} 786 switch v.(type) { 787 case nil, *InitializerValue: 788 return r 789 } 790 791 if o.Type().Kind() == to.Kind() { 792 return r.normalize(ctx, n) 793 } 794 795 if o.Type().IsIntegerType() { 796 return o.convertFromInt(ctx, n, to) 797 } 798 799 if to.IsIntegerType() { 800 return o.convertToInt(ctx, n, to) 801 } 802 803 switch o.Type().Kind() { 804 case Array: 805 switch to.Kind() { 806 case Ptr: 807 return r 808 default: 809 panic(todo("", n.Position())) 810 } 811 case ComplexFloat: 812 v := v.(Complex64Value) 813 switch to.Kind() { 814 case ComplexDouble: 815 r.value = Complex128Value(v) 816 case Float: 817 r.value = Float32Value(real(v)) 818 case Double: 819 r.value = Float64Value(real(v)) 820 case ComplexLongDouble: 821 panic(todo("", n.Position())) 822 default: 823 panic(todo("", n.Position())) 824 } 825 case ComplexDouble: 826 v := v.(Complex128Value) 827 switch to.Kind() { 828 case ComplexFloat: 829 r.value = Complex64Value(v) 830 case ComplexLongDouble: 831 //TODO panic(todo("", n.Position())) 832 r.value = nil 833 case Float: 834 r.value = Float32Value(real(v)) 835 case Double: 836 r.value = Float64Value(real(v)) 837 default: 838 //TODO panic(todo("", n.Position(), o.Type(), to)) 839 r.value = nil 840 } 841 case Float: 842 v := v.(Float32Value) 843 switch to.Kind() { 844 case ComplexFloat: 845 r.value = Complex64Value(complex(v, 0)) 846 case ComplexDouble: 847 r.value = Complex128Value(complex(v, 0)) 848 case Double: 849 r.value = Float64Value(v) 850 case ComplexLongDouble: 851 panic(todo("", n.Position())) 852 case LongDouble: 853 r.value = &Float128Value{N: big.NewFloat(float64(v))} 854 case Decimal32, Decimal64, Decimal128: 855 // ok 856 default: 857 panic(todo("695 %s", to.Kind())) 858 } 859 case Double: 860 v := v.(Float64Value) 861 switch to.Kind() { 862 case ComplexFloat: 863 r.value = Complex64Value(complex(v, 0)) 864 case ComplexDouble: 865 r.value = Complex128Value(complex(v, 0)) 866 case LongDouble: 867 f := float64(v) 868 switch { 869 case math.IsNaN(f): 870 r.value = &Float128Value{NaN: true} 871 default: 872 r.value = &Float128Value{N: big.NewFloat(f)} 873 } 874 case Float: 875 r.value = Float32Value(v) 876 case ComplexLongDouble: 877 panic(todo("", n.Position())) 878 case Vector: 879 r.value = nil 880 case Decimal32, Decimal64, Decimal128: 881 // ok 882 default: 883 panic(todo("", to.Kind())) 884 } 885 case LongDouble: 886 v := v.(*Float128Value) 887 switch to.Kind() { 888 case Double: 889 if v.NaN { 890 r.value = Float64Value(math.NaN()) 891 break 892 } 893 894 d, _ := v.N.Float64() 895 r.value = Float64Value(d) 896 case Float: 897 if v.NaN { 898 r.value = Float32Value(math.NaN()) 899 break 900 } 901 902 d, _ := v.N.Float64() 903 r.value = Float32Value(d) 904 case ComplexLongDouble: 905 if v.NaN { 906 r.value = Complex256Value{v, &Float128Value{NaN: true}} 907 break 908 } 909 910 r.value = Complex256Value{v, &Float128Value{N: big.NewFloat(0)}} 911 case Decimal32, Decimal64, Decimal128: 912 // ok 913 default: 914 panic(todo("813 %v", to.Kind())) 915 } 916 case Ptr: 917 switch to.Kind() { 918 case Void: 919 return noOperand 920 default: 921 panic(internalErrorf("%v: %v y-> %v %v", n.Position(), o.Type(), to, to.Kind())) 922 } 923 default: 924 panic(internalErrorf("%v: %v -> %v %v", n.Position(), o.Type(), to, to.Kind())) 925 } 926 return r.normalize(ctx, n) 927 } 928 929 type signedSaturationLimit struct { 930 fmin, fmax float64 931 min, max int64 932 } 933 934 type unsignedSaturationLimit struct { 935 fmax float64 936 max uint64 937 } 938 939 var ( 940 signedSaturationLimits = [...]signedSaturationLimit{ 941 1: {math.Nextafter(math.MinInt32, 0), math.Nextafter(math.MaxInt32, 0), math.MinInt32, math.MaxInt32}, 942 2: {math.Nextafter(math.MinInt32, 0), math.Nextafter(math.MaxInt32, 0), math.MinInt32, math.MaxInt32}, 943 4: {math.Nextafter(math.MinInt32, 0), math.Nextafter(math.MaxInt32, 0), math.MinInt32, math.MaxInt32}, 944 8: {math.Nextafter(math.MinInt64, 0), math.Nextafter(math.MaxInt64, 0), math.MinInt64, math.MaxInt64}, 945 } 946 947 unsignedSaturationLimits = [...]unsignedSaturationLimit{ 948 1: {math.Nextafter(math.MaxUint32, 0), math.MaxUint32}, 949 2: {math.Nextafter(math.MaxUint32, 0), math.MaxUint32}, 950 4: {math.Nextafter(math.MaxUint32, 0), math.MaxUint32}, 951 8: {math.Nextafter(math.MaxUint64, 0), math.MaxUint64}, 952 } 953 ) 954 955 func (o *operand) convertToInt(ctx *context, n Node, to Type) (r Operand) { 956 v := o.Value() 957 switch o.Type().Kind() { 958 case Float: 959 v := float64(v.(Float32Value)) 960 switch { 961 case to.IsSignedType(): 962 limits := &signedSaturationLimits[to.Size()] 963 if v > limits.fmax { 964 return (&operand{abi: o.abi, typ: to, value: Int64Value(limits.max)}).normalize(ctx, n) 965 } 966 967 if v < limits.fmin { 968 return (&operand{abi: o.abi, typ: to, value: Int64Value(limits.min)}).normalize(ctx, n) 969 } 970 971 return (&operand{abi: o.abi, typ: to, value: Int64Value(v)}).normalize(ctx, n) 972 default: 973 limits := &unsignedSaturationLimits[to.Size()] 974 if v > limits.fmax { 975 return (&operand{abi: o.abi, typ: to, value: Uint64Value(limits.max)}).normalize(ctx, n) 976 } 977 978 return (&operand{abi: o.abi, typ: to, value: Uint64Value(v)}).normalize(ctx, n) 979 } 980 case Double: 981 v := float64(v.(Float64Value)) 982 switch { 983 case to.IsSignedType(): 984 limits := &signedSaturationLimits[to.Size()] 985 if v > limits.fmax { 986 return (&operand{abi: o.abi, typ: to, value: Int64Value(limits.max)}).normalize(ctx, n) 987 } 988 989 if v < limits.fmin { 990 return (&operand{abi: o.abi, typ: to, value: Int64Value(limits.min)}).normalize(ctx, n) 991 } 992 993 return (&operand{abi: o.abi, typ: to, value: Int64Value(v)}).normalize(ctx, n) 994 default: 995 limits := &unsignedSaturationLimits[to.Size()] 996 if v > limits.fmax { 997 return (&operand{abi: o.abi, typ: to, value: Uint64Value(limits.max)}).normalize(ctx, n) 998 } 999 1000 return (&operand{abi: o.abi, typ: to, value: Uint64Value(v)}).normalize(ctx, n) 1001 } 1002 case LongDouble: 1003 panic(todo("", n.Position())) 1004 case Ptr: 1005 var v uint64 1006 switch x := o.Value().(type) { 1007 case Int64Value: 1008 v = uint64(x) 1009 case Uint64Value: 1010 v = uint64(x) 1011 case *InitializerValue: 1012 return (&operand{abi: o.abi, typ: to}) 1013 default: 1014 panic(internalErrorf("%v: %T", n.Position(), x)) 1015 } 1016 switch { 1017 case to.IsSignedType(): 1018 return (&operand{abi: o.abi, typ: to, value: Int64Value(v)}).normalize(ctx, n) 1019 default: 1020 return (&operand{abi: o.abi, typ: to, value: Uint64Value(v)}).normalize(ctx, n) 1021 } 1022 case Array: 1023 return &operand{abi: o.abi, typ: to} 1024 case Vector: 1025 if o.Type().Size() == to.Size() { 1026 return &operand{abi: o.abi, typ: to} 1027 } 1028 } 1029 if ctx != nil { 1030 ctx.errNode(n, "cannot convert %s to %s", o.Type(), to) 1031 } 1032 return &operand{abi: o.abi, typ: to} 1033 } 1034 1035 func (o *operand) convertFromInt(ctx *context, n Node, to Type) (r Operand) { 1036 var v uint64 1037 switch x := o.Value().(type) { 1038 case Int64Value: 1039 v = uint64(x) 1040 case Uint64Value: 1041 v = uint64(x) 1042 default: 1043 if ctx != nil { 1044 ctx.errNode(n, "conversion to integer: invalid value") 1045 } 1046 return &operand{abi: o.abi, typ: to} 1047 } 1048 1049 if to.IsIntegerType() { 1050 switch { 1051 case to.IsSignedType(): 1052 return (&operand{abi: o.abi, typ: to, value: Int64Value(v)}).normalize(ctx, n) 1053 default: 1054 return (&operand{abi: o.abi, typ: to, value: Uint64Value(v)}).normalize(ctx, n) 1055 } 1056 } 1057 1058 switch to.Kind() { 1059 case ComplexFloat: 1060 switch { 1061 case o.Type().IsSignedType(): 1062 return (&operand{abi: o.abi, typ: to, value: Complex64Value(complex(float64(int64(v)), 0))}).normalize(ctx, n) 1063 default: 1064 return (&operand{abi: o.abi, typ: to, value: Complex64Value(complex(float64(v), 0))}).normalize(ctx, n) 1065 } 1066 case ComplexDouble: 1067 switch { 1068 case o.Type().IsSignedType(): 1069 return (&operand{abi: o.abi, typ: to, value: Complex128Value(complex(float64(int64(v)), 0))}).normalize(ctx, n) 1070 default: 1071 return (&operand{abi: o.abi, typ: to, value: Complex128Value(complex(float64(v), 0))}).normalize(ctx, n) 1072 } 1073 case Float: 1074 switch { 1075 case o.Type().IsSignedType(): 1076 return (&operand{abi: o.abi, typ: to, value: Float32Value(float64(int64(v)))}).normalize(ctx, n) 1077 default: 1078 return (&operand{abi: o.abi, typ: to, value: Float32Value(float64(v))}).normalize(ctx, n) 1079 } 1080 case ComplexLongDouble: 1081 panic(todo("", n.Position())) 1082 case Double: 1083 switch { 1084 case o.Type().IsSignedType(): 1085 return (&operand{abi: o.abi, typ: to, value: Float64Value(int64(v))}).normalize(ctx, n) 1086 default: 1087 return (&operand{abi: o.abi, typ: to, value: Float64Value(v)}).normalize(ctx, n) 1088 } 1089 case LongDouble: 1090 switch { 1091 case o.Type().IsSignedType(): 1092 return (&operand{abi: o.abi, typ: to, value: &Float128Value{N: big.NewFloat(0).SetInt64(int64(v))}}).normalize(ctx, n) 1093 default: 1094 return (&operand{abi: o.abi, typ: to, value: &Float128Value{N: big.NewFloat(0).SetUint64(v)}}).normalize(ctx, n) 1095 } 1096 case Ptr: 1097 return (&operand{abi: o.abi, typ: to, value: Uint64Value(v)}).normalize(ctx, n) 1098 case Struct, Union, Array, Void, Int128, UInt128: 1099 return &operand{abi: o.abi, typ: to} 1100 case Vector: 1101 if o.Type().Size() == to.Size() { 1102 return &operand{abi: o.abi, typ: to} 1103 } 1104 } 1105 if ctx != nil { 1106 ctx.errNode(n, "cannot convert %s to %s", o.Type(), to) 1107 } 1108 return &operand{abi: o.abi, typ: to} 1109 } 1110 1111 func (o *operand) normalize(ctx *context, n Node) (r Operand) { 1112 if o.Type() == nil { 1113 ctx.errNode(n, "operand has unsupported, invalid or incomplete type") 1114 return noOperand 1115 } 1116 1117 if o.Type().IsIntegerType() { 1118 switch { 1119 case o.Type().IsSignedType(): 1120 if x, ok := o.value.(Uint64Value); ok { 1121 o.value = Int64Value(x) 1122 } 1123 default: 1124 if x, ok := o.value.(Int64Value); ok { 1125 o.value = Uint64Value(x) 1126 } 1127 } 1128 switch x := o.Value().(type) { 1129 case Int64Value: 1130 if v := convertInt64(int64(x), o.Type(), o.abi); v != int64(x) { 1131 o.value = Int64Value(v) 1132 } 1133 case Uint64Value: 1134 v := uint64(x) 1135 switch o.Type().Size() { 1136 case 1: 1137 v &= 0xff 1138 case 2: 1139 v &= 0xffff 1140 case 4: 1141 v &= 0xffffffff 1142 } 1143 if v != uint64(x) { 1144 o.value = Uint64Value(v) 1145 } 1146 case *InitializerValue, nil: 1147 // ok 1148 default: 1149 panic(internalErrorf("%T %v", x, x)) 1150 } 1151 return o 1152 } 1153 1154 switch o.Type().Kind() { 1155 case ComplexFloat: 1156 switch o.Value().(type) { 1157 case Complex64Value, nil: 1158 return o 1159 default: 1160 panic(todo("")) 1161 } 1162 case ComplexDouble: 1163 switch o.Value().(type) { 1164 case Complex128Value, nil: 1165 return o 1166 default: 1167 panic(todo("")) 1168 } 1169 case ComplexLongDouble: 1170 switch o.Value().(type) { 1171 case Complex256Value, nil: 1172 return o 1173 default: 1174 panic(todo("934 %v", o.Type().Kind())) 1175 } 1176 case Float: 1177 switch o.Value().(type) { 1178 case Float32Value, *InitializerValue, nil: 1179 return o 1180 default: 1181 panic(todo("")) 1182 } 1183 case Double: 1184 switch x := o.Value().(type) { 1185 case Float64Value, *InitializerValue, nil: 1186 return o 1187 default: 1188 panic(internalErrorf("%T %v", x, x)) 1189 } 1190 case LongDouble: 1191 switch x := o.Value().(type) { 1192 case *Float128Value, nil: 1193 return o 1194 default: 1195 panic(internalErrorf("%T %v TODO980 %v", x, x, n.Position())) 1196 } 1197 case Ptr: 1198 switch o.Value().(type) { 1199 case Int64Value, Uint64Value, *InitializerValue, StringValue, WideStringValue, nil: 1200 return o 1201 default: 1202 panic(todo("")) 1203 } 1204 case Array, Void, Function, Struct, Union, Vector, Decimal32, Decimal64, Decimal128: 1205 return o 1206 case ComplexChar, ComplexInt, ComplexLong, ComplexLongLong, ComplexShort, ComplexUInt, ComplexUShort: 1207 //TOD 1208 if ctx != nil { 1209 ctx.errNode(n, "unsupported type: %s", o.Type()) 1210 } 1211 return noOperand 1212 } 1213 panic(internalErrorf("%v, %v", o.Type(), o.Type().Kind())) 1214 } 1215 1216 func convertInt64(n int64, t Type, abi *ABI) int64 { 1217 k := t.Kind() 1218 if k == Enum { 1219 //TODO 1220 } 1221 signed := abi.isSignedInteger(k) 1222 switch sz := abi.size(k); sz { 1223 case 1: 1224 switch { 1225 case signed: 1226 switch { 1227 case int8(n) < 0: 1228 return n | ^math.MaxUint8 1229 default: 1230 return n & math.MaxUint8 1231 } 1232 default: 1233 return n & math.MaxUint8 1234 } 1235 case 2: 1236 switch { 1237 case signed: 1238 switch { 1239 case int16(n) < 0: 1240 return n | ^math.MaxUint16 1241 default: 1242 return n & math.MaxUint16 1243 } 1244 default: 1245 return n & math.MaxUint16 1246 } 1247 case 4: 1248 switch { 1249 case signed: 1250 switch { 1251 case int32(n) < 0: 1252 return n | ^math.MaxUint32 1253 default: 1254 return n & math.MaxUint32 1255 } 1256 default: 1257 return n & math.MaxUint32 1258 } 1259 default: 1260 return n 1261 } 1262 } 1263 1264 func boolValue(b bool) Value { 1265 if b { 1266 return Int64Value(1) 1267 } 1268 1269 return Int64Value(0) 1270 } 1271 1272 type initializer interface { 1273 List() []*Initializer 1274 IsConst() bool 1275 } 1276 1277 type InitializerValue struct { 1278 typ Type 1279 initializer initializer 1280 } 1281 1282 func (v *InitializerValue) List() []*Initializer { 1283 if v == nil || v.initializer == nil { 1284 return nil 1285 } 1286 1287 return v.initializer.List() 1288 } 1289 1290 func (v *InitializerValue) IsConst() bool { 1291 return v != nil && v.initializer != nil && v.initializer.IsConst() 1292 } 1293 func (v *InitializerValue) Type() Type { return v.typ } 1294 func (v *InitializerValue) add(b Value) Value { return nil } 1295 func (v *InitializerValue) and(b Value) Value { return nil } 1296 func (v *InitializerValue) cpl() Value { return nil } 1297 func (v *InitializerValue) div(b Value) Value { return nil } 1298 func (v *InitializerValue) eq(b Value) Value { return nil } 1299 func (v *InitializerValue) ge(b Value) Value { return nil } 1300 func (v *InitializerValue) gt(b Value) Value { return nil } 1301 func (v *InitializerValue) le(b Value) Value { return nil } 1302 func (v *InitializerValue) lsh(b Value) Value { return nil } 1303 func (v *InitializerValue) lt(b Value) Value { return nil } 1304 func (v *InitializerValue) mod(b Value) Value { return nil } 1305 func (v *InitializerValue) mul(b Value) Value { return nil } 1306 func (v *InitializerValue) neg() Value { return nil } 1307 func (v *InitializerValue) neq(b Value) Value { return nil } 1308 func (v *InitializerValue) or(b Value) Value { return nil } 1309 func (v *InitializerValue) rsh(b Value) Value { return nil } 1310 func (v *InitializerValue) sub(b Value) Value { return nil } 1311 func (v *InitializerValue) xor(b Value) Value { return nil } 1312 1313 func (v *InitializerValue) IsNonZero() bool { 1314 if v == nil { 1315 return false 1316 } 1317 1318 for _, v := range v.List() { 1319 if !v.AssignmentExpression.Operand.IsZero() { 1320 return true 1321 } 1322 } 1323 return false 1324 } 1325 1326 func (v *InitializerValue) IsZero() bool { 1327 if v == nil { 1328 return false 1329 } 1330 1331 for _, v := range v.List() { 1332 if !v.AssignmentExpression.Operand.IsZero() { 1333 return false 1334 } 1335 } 1336 return true 1337 }