source: code/trunk/vendor/modernc.org/cc/v3/operand.go@ 822

Last change on this file since 822 was 822, checked in by yakumo.izuru, 22 months ago

Prefer immortal.run over runit and rc.d, use vendored modules
for convenience.

Signed-off-by: Izuru Yakumo <yakumo.izuru@…>

File size: 41.5 KB
Line 
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
5package cc // import "modernc.org/cc/v3"
6
7import (
8 "fmt"
9 "math"
10 "math/big"
11)
12
13var (
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
34type 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
55type 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
79type WideStringValue StringID
80
81func (v WideStringValue) add(b Value) Value { panic(todo("")) }
82func (v WideStringValue) and(b Value) Value { panic(todo("")) }
83func (v WideStringValue) cpl() Value { panic(todo("")) }
84func (v WideStringValue) div(b Value) Value { panic(todo("")) }
85func (v WideStringValue) eq(b Value) Value { return boolValue(v == b.(WideStringValue)) }
86func (v WideStringValue) IsConst() bool { return true }
87func (v WideStringValue) IsNonZero() bool { return true }
88func (v WideStringValue) IsZero() bool { return false }
89func (v WideStringValue) lsh(b Value) Value { panic(todo("")) }
90func (v WideStringValue) mod(b Value) Value { panic(todo("")) }
91func (v WideStringValue) mul(b Value) Value { panic(todo("")) }
92func (v WideStringValue) neg() Value { panic(todo("")) }
93func (v WideStringValue) neq(b Value) Value { return boolValue(v != b.(WideStringValue)) }
94func (v WideStringValue) or(b Value) Value { panic(todo("")) }
95func (v WideStringValue) rsh(b Value) Value { panic(todo("")) }
96func (v WideStringValue) sub(b Value) Value { panic(todo("")) }
97func (v WideStringValue) xor(b Value) Value { panic(todo("")) }
98
99func (v WideStringValue) le(b Value) Value {
100 return boolValue(StringID(v).String() <= StringID(b.(WideStringValue)).String())
101}
102
103func (v WideStringValue) ge(b Value) Value {
104 return boolValue(StringID(v).String() >= StringID(b.(WideStringValue)).String())
105}
106
107func (v WideStringValue) gt(b Value) Value {
108 return boolValue(StringID(v).String() > StringID(b.(WideStringValue)).String())
109}
110
111func (v WideStringValue) lt(b Value) Value {
112 return boolValue(StringID(v).String() < StringID(b.(WideStringValue)).String())
113}
114
115type StringValue StringID
116
117func (v StringValue) add(b Value) Value { panic(todo("")) }
118func (v StringValue) and(b Value) Value { panic(todo("")) }
119func (v StringValue) cpl() Value { panic(todo("")) }
120func (v StringValue) div(b Value) Value { panic(todo("")) }
121func (v StringValue) eq(b Value) Value { return boolValue(v == b.(StringValue)) }
122func (v StringValue) IsConst() bool { return true }
123func (v StringValue) IsNonZero() bool { return true }
124func (v StringValue) IsZero() bool { return false }
125func (v StringValue) lsh(b Value) Value { panic(todo("")) }
126func (v StringValue) mod(b Value) Value { panic(todo("")) }
127func (v StringValue) mul(b Value) Value { panic(todo("")) }
128func (v StringValue) neg() Value { panic(todo("")) }
129func (v StringValue) neq(b Value) Value { return boolValue(v != b.(StringValue)) }
130func (v StringValue) or(b Value) Value { panic(todo("")) }
131func (v StringValue) rsh(b Value) Value { panic(todo("")) }
132func (v StringValue) sub(b Value) Value { panic(todo("")) }
133func (v StringValue) xor(b Value) Value { panic(todo("")) }
134
135func (v StringValue) le(b Value) Value {
136 return boolValue(StringID(v).String() <= StringID(b.(StringValue)).String())
137}
138
139func (v StringValue) ge(b Value) Value {
140 return boolValue(StringID(v).String() >= StringID(b.(StringValue)).String())
141}
142
143func (v StringValue) gt(b Value) Value {
144 return boolValue(StringID(v).String() > StringID(b.(StringValue)).String())
145}
146
147func (v StringValue) lt(b Value) Value {
148 return boolValue(StringID(v).String() < StringID(b.(StringValue)).String())
149}
150
151type Int64Value int64
152
153func (v Int64Value) add(b Value) Value { return v + b.(Int64Value) }
154func (v Int64Value) and(b Value) Value { return v & b.(Int64Value) }
155func (v Int64Value) cpl() Value { return ^v }
156func (v Int64Value) eq(b Value) Value { return boolValue(v == b.(Int64Value)) }
157func (v Int64Value) ge(b Value) Value { return boolValue(v >= b.(Int64Value)) }
158func (v Int64Value) gt(b Value) Value { return boolValue(v > b.(Int64Value)) }
159func (v Int64Value) IsConst() bool { return true }
160func (v Int64Value) IsNonZero() bool { return v != 0 }
161func (v Int64Value) IsZero() bool { return v == 0 }
162func (v Int64Value) le(b Value) Value { return boolValue(v <= b.(Int64Value)) }
163func (v Int64Value) lt(b Value) Value { return boolValue(v < b.(Int64Value)) }
164func (v Int64Value) mul(b Value) Value { return v * b.(Int64Value) }
165func (v Int64Value) neg() Value { return -v }
166func (v Int64Value) neq(b Value) Value { return boolValue(v != b.(Int64Value)) }
167func (v Int64Value) or(b Value) Value { return v | b.(Int64Value) }
168func (v Int64Value) sub(b Value) Value { return v - b.(Int64Value) }
169func (v Int64Value) xor(b Value) Value { return v ^ b.(Int64Value) }
170
171func (v Int64Value) div(b Value) Value {
172 if b.IsZero() {
173 return nil
174 }
175
176 return v / b.(Int64Value)
177}
178
179func (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
190func (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
201func (v Int64Value) mod(b Value) Value {
202 if b.IsZero() {
203 return nil
204 }
205
206 return v % b.(Int64Value)
207}
208
209type Uint64Value uint64
210
211func (v Uint64Value) add(b Value) Value { return v + b.(Uint64Value) }
212func (v Uint64Value) and(b Value) Value { return v & b.(Uint64Value) }
213func (v Uint64Value) cpl() Value { return ^v }
214func (v Uint64Value) eq(b Value) Value { return boolValue(v == b.(Uint64Value)) }
215func (v Uint64Value) ge(b Value) Value { return boolValue(v >= b.(Uint64Value)) }
216func (v Uint64Value) gt(b Value) Value { return boolValue(v > b.(Uint64Value)) }
217func (v Uint64Value) IsConst() bool { return true }
218func (v Uint64Value) IsNonZero() bool { return v != 0 }
219func (v Uint64Value) IsZero() bool { return v == 0 }
220func (v Uint64Value) le(b Value) Value { return boolValue(v <= b.(Uint64Value)) }
221func (v Uint64Value) lt(b Value) Value { return boolValue(v < b.(Uint64Value)) }
222func (v Uint64Value) mul(b Value) Value { return v * b.(Uint64Value) }
223func (v Uint64Value) neg() Value { return -v }
224func (v Uint64Value) neq(b Value) Value { return boolValue(v != b.(Uint64Value)) }
225func (v Uint64Value) or(b Value) Value { return v | b.(Uint64Value) }
226func (v Uint64Value) sub(b Value) Value { return v - b.(Uint64Value) }
227func (v Uint64Value) xor(b Value) Value { return v ^ b.(Uint64Value) }
228
229func (v Uint64Value) div(b Value) Value {
230 if b.IsZero() {
231 return nil
232 }
233
234 return v / b.(Uint64Value)
235}
236
237func (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
248func (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
259func (v Uint64Value) mod(b Value) Value {
260 if b.IsZero() {
261 return nil
262 }
263
264 return v % b.(Uint64Value)
265}
266
267type Float32Value float32
268
269func (v Float32Value) add(b Value) Value { return v + b.(Float32Value) }
270func (v Float32Value) and(b Value) Value { panic(todo("")) }
271func (v Float32Value) cpl() Value { panic(todo("")) }
272func (v Float32Value) div(b Value) Value { return v / b.(Float32Value) }
273func (v Float32Value) eq(b Value) Value { return boolValue(v == b.(Float32Value)) }
274func (v Float32Value) ge(b Value) Value { return boolValue(v >= b.(Float32Value)) }
275func (v Float32Value) gt(b Value) Value { return boolValue(v > b.(Float32Value)) }
276func (v Float32Value) IsConst() bool { return true }
277func (v Float32Value) IsNonZero() bool { return v != 0 }
278func (v Float32Value) IsZero() bool { return !math.Signbit(float64(v)) && v == 0 }
279func (v Float32Value) le(b Value) Value { return boolValue(v <= b.(Float32Value)) }
280func (v Float32Value) lsh(b Value) Value { panic(todo("")) }
281func (v Float32Value) lt(b Value) Value { return boolValue(v < b.(Float32Value)) }
282func (v Float32Value) mod(b Value) Value { panic(todo("")) }
283func (v Float32Value) mul(b Value) Value { return v * b.(Float32Value) }
284func (v Float32Value) neg() Value { return -v }
285func (v Float32Value) neq(b Value) Value { return boolValue(v != b.(Float32Value)) }
286func (v Float32Value) or(b Value) Value { panic(todo("")) }
287func (v Float32Value) rsh(b Value) Value { panic(todo("")) }
288func (v Float32Value) sub(b Value) Value { return v - b.(Float32Value) }
289func (v Float32Value) xor(b Value) Value { panic(todo("")) }
290
291type Float64Value float64
292
293func (v Float64Value) add(b Value) Value { return v + b.(Float64Value) }
294func (v Float64Value) and(b Value) Value { panic(todo("")) }
295func (v Float64Value) cpl() Value { panic(todo("")) }
296func (v Float64Value) div(b Value) Value { return v / b.(Float64Value) }
297func (v Float64Value) eq(b Value) Value { return boolValue(v == b.(Float64Value)) }
298func (v Float64Value) ge(b Value) Value { return boolValue(v >= b.(Float64Value)) }
299func (v Float64Value) gt(b Value) Value { return boolValue(v > b.(Float64Value)) }
300func (v Float64Value) IsConst() bool { return true }
301func (v Float64Value) IsNonZero() bool { return v != 0 }
302func (v Float64Value) IsZero() bool { return !math.Signbit(float64(v)) && v == 0 }
303func (v Float64Value) le(b Value) Value { return boolValue(v <= b.(Float64Value)) }
304func (v Float64Value) lsh(b Value) Value { panic(todo("")) }
305func (v Float64Value) lt(b Value) Value { return boolValue(v < b.(Float64Value)) }
306func (v Float64Value) mod(b Value) Value { panic(todo("")) }
307func (v Float64Value) mul(b Value) Value { return v * b.(Float64Value) }
308func (v Float64Value) neg() Value { return -v }
309func (v Float64Value) neq(b Value) Value { return boolValue(v != b.(Float64Value)) }
310func (v Float64Value) or(b Value) Value { panic(todo("")) }
311func (v Float64Value) rsh(b Value) Value { panic(todo("")) }
312func (v Float64Value) sub(b Value) Value { return v - b.(Float64Value) }
313func (v Float64Value) xor(b Value) Value { panic(todo("")) }
314
315var float128Zero = &Float128Value{N: big.NewFloat(0)}
316
317type Float128Value struct {
318 N *big.Float
319 NaN bool
320}
321
322func (v *Float128Value) add(b Value) Value { return v.safe(b, func(x, y *big.Float) { x.Add(x, y) }) }
323func (v *Float128Value) and(b Value) Value { panic(todo("")) }
324func (v *Float128Value) cpl() Value { panic(todo("")) }
325func (v *Float128Value) div(b Value) Value { return v.safe(b, func(x, y *big.Float) { x.Quo(x, y) }) }
326func (v *Float128Value) eq(b Value) Value { panic(todo("")) }
327func (v *Float128Value) ge(b Value) Value { panic(todo("")) }
328func (v *Float128Value) gt(b Value) Value { return boolValue(v.cmp(b, -1, 0)) }
329func (v *Float128Value) IsNonZero() bool { panic(todo("")) }
330func (v *Float128Value) IsConst() bool { return true }
331func (v *Float128Value) IsZero() bool { return !v.NaN && !v.N.Signbit() && v.cmp(float128Zero, 0) }
332func (v *Float128Value) le(b Value) Value { panic(todo("")) }
333func (v *Float128Value) lsh(b Value) Value { panic(todo("")) }
334func (v *Float128Value) lt(b Value) Value { panic(todo("")) }
335func (v *Float128Value) mod(b Value) Value { panic(todo("")) }
336func (v *Float128Value) mul(b Value) Value { return v.safe(b, func(x, y *big.Float) { x.Mul(x, y) }) }
337func (v *Float128Value) neg() Value { return v.safe(nil, func(x, y *big.Float) { x.Neg(x) }) }
338func (v *Float128Value) neq(b Value) Value { panic(todo("")) }
339func (v *Float128Value) or(b Value) Value { panic(todo("")) }
340func (v *Float128Value) rsh(b Value) Value { panic(todo("")) }
341func (v *Float128Value) sub(b Value) Value { return v.safe(b, func(x, y *big.Float) { x.Sub(x, y) }) }
342func (v *Float128Value) xor(b Value) Value { panic(todo("")) }
343
344func (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
359func (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
370func (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
403type Complex64Value complex64
404
405func (v Complex64Value) add(b Value) Value { return v + b.(Complex64Value) }
406func (v Complex64Value) and(b Value) Value { panic(todo("")) }
407func (v Complex64Value) cpl() Value { panic(todo("")) }
408func (v Complex64Value) div(b Value) Value { return v / b.(Complex64Value) }
409func (v Complex64Value) eq(b Value) Value { return boolValue(v == b.(Complex64Value)) }
410func (v Complex64Value) ge(b Value) Value { panic(todo("")) }
411func (v Complex64Value) gt(b Value) Value { panic(todo("")) }
412func (v Complex64Value) IsConst() bool { return true }
413func (v Complex64Value) IsNonZero() bool { return v != 0 }
414func (v Complex64Value) IsZero() bool { return v == 0 }
415func (v Complex64Value) le(b Value) Value { panic(todo("")) }
416func (v Complex64Value) lsh(b Value) Value { panic(todo("")) }
417func (v Complex64Value) lt(b Value) Value { panic(todo("")) }
418func (v Complex64Value) mod(b Value) Value { panic(todo("")) }
419func (v Complex64Value) mul(b Value) Value { return v * b.(Complex64Value) }
420func (v Complex64Value) neg() Value { return -v }
421func (v Complex64Value) neq(b Value) Value { return boolValue(v != b.(Complex64Value)) }
422func (v Complex64Value) or(b Value) Value { panic(todo("")) }
423func (v Complex64Value) rsh(b Value) Value { panic(todo("")) }
424func (v Complex64Value) sub(b Value) Value { return v - b.(Complex64Value) }
425func (v Complex64Value) xor(b Value) Value { panic(todo("")) }
426
427type Complex128Value complex128
428
429func (v Complex128Value) add(b Value) Value { return v + b.(Complex128Value) }
430func (v Complex128Value) and(b Value) Value { panic(todo("")) }
431func (v Complex128Value) cpl() Value { panic(todo("")) }
432func (v Complex128Value) div(b Value) Value { return v / b.(Complex128Value) }
433func (v Complex128Value) eq(b Value) Value { return boolValue(v == b.(Complex128Value)) }
434func (v Complex128Value) ge(b Value) Value { panic(todo("")) }
435func (v Complex128Value) gt(b Value) Value { panic(todo("")) }
436func (v Complex128Value) IsConst() bool { return true }
437func (v Complex128Value) IsNonZero() bool { return v != 0 }
438func (v Complex128Value) IsZero() bool { return v == 0 }
439func (v Complex128Value) le(b Value) Value { panic(todo("")) }
440func (v Complex128Value) lsh(b Value) Value { panic(todo("")) }
441func (v Complex128Value) lt(b Value) Value { panic(todo("")) }
442func (v Complex128Value) mod(b Value) Value { panic(todo("")) }
443func (v Complex128Value) mul(b Value) Value { return v * b.(Complex128Value) }
444func (v Complex128Value) neg() Value { return -v }
445func (v Complex128Value) neq(b Value) Value { return boolValue(v != b.(Complex128Value)) }
446func (v Complex128Value) or(b Value) Value { panic(todo("")) }
447func (v Complex128Value) rsh(b Value) Value { panic(todo("")) }
448func (v Complex128Value) sub(b Value) Value { return v - b.(Complex128Value) }
449func (v Complex128Value) xor(b Value) Value { panic(todo("")) }
450
451type Complex256Value struct {
452 Re, Im *Float128Value
453}
454
455func (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
460func (v Complex256Value) and(b Value) Value { panic(todo("")) }
461func (v Complex256Value) cpl() Value { panic(todo("")) }
462func (v Complex256Value) div(b Value) Value { panic(todo("")) }
463func (v Complex256Value) eq(b Value) Value { panic(todo("")) }
464func (v Complex256Value) ge(b Value) Value { panic(todo("")) }
465func (v Complex256Value) gt(b Value) Value { panic(todo("")) }
466func (v Complex256Value) IsConst() bool { return true }
467func (v Complex256Value) IsNonZero() bool { panic(todo("")) }
468func (v Complex256Value) IsZero() bool { return v.Re.IsZero() && v.Im.IsZero() }
469func (v Complex256Value) le(b Value) Value { panic(todo("")) }
470func (v Complex256Value) lsh(b Value) Value { panic(todo("")) }
471func (v Complex256Value) lt(b Value) Value { panic(todo("")) }
472func (v Complex256Value) mod(b Value) Value { panic(todo("")) }
473func (v Complex256Value) mul(b Value) Value { panic(todo("")) }
474func (v Complex256Value) neg() Value { panic(todo("")) }
475func (v Complex256Value) neq(b Value) Value { panic(todo("")) }
476func (v Complex256Value) or(b Value) Value { panic(todo("")) }
477func (v Complex256Value) rsh(b Value) Value { panic(todo("")) }
478func (v Complex256Value) sub(b Value) Value { panic(todo("")) }
479func (v Complex256Value) xor(b Value) Value { panic(todo("")) }
480
481type lvalue struct {
482 Operand
483 declarator *Declarator
484}
485
486func (o *lvalue) ConvertTo(to Type) (r Operand) { return o.convertTo(nil, nil, to) }
487func (o *lvalue) Declarator() *Declarator { return o.declarator }
488func (o *lvalue) IsLValue() bool { return true }
489
490func (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
499func (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
503type funcDesignator struct {
504 Operand
505 declarator *Declarator
506}
507
508func (o *funcDesignator) ConvertTo(to Type) (r Operand) { return o.convertTo(nil, nil, to) }
509func (o *funcDesignator) Declarator() *Declarator { return o.declarator }
510func (o *funcDesignator) IsLValue() bool { return false }
511func (o *funcDesignator) IsConst() bool { return true }
512
513func (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
517type operand struct {
518 abi *ABI
519 typ Type
520 value Value
521 offset uintptr
522}
523
524func (o *operand) ConvertTo(to Type) (r Operand) { return o.convertTo(nil, nil, to) }
525func (o *operand) Declarator() *Declarator { return nil }
526func (o *operand) Offset() uintptr { return o.offset }
527func (o *operand) IsLValue() bool { return false }
528func (o *operand) IsNonZero() bool { return o.value != nil && o.value.IsNonZero() }
529func (o *operand) IsZero() bool { return o.value != nil && o.value.IsZero() }
530func (o *operand) Type() Type { return o.typ }
531func (o *operand) Value() Value { return o.value }
532func (o *operand) getABI() *ABI { return o.abi }
533
534// IsAssingmentCompatible implements Operand.
535func (o *operand) IsAssingmentCompatible(lhs Type) bool { return lhs.isAssingmentCompatibleOperand(o) }
536
537func (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:
557func 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.
726func (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.
741func 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
779func (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
929type signedSaturationLimit struct {
930 fmin, fmax float64
931 min, max int64
932}
933
934type unsignedSaturationLimit struct {
935 fmax float64
936 max uint64
937}
938
939var (
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
955func (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
1035func (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
1111func (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
1216func 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
1264func boolValue(b bool) Value {
1265 if b {
1266 return Int64Value(1)
1267 }
1268
1269 return Int64Value(0)
1270}
1271
1272type initializer interface {
1273 List() []*Initializer
1274 IsConst() bool
1275}
1276
1277type InitializerValue struct {
1278 typ Type
1279 initializer initializer
1280}
1281
1282func (v *InitializerValue) List() []*Initializer {
1283 if v == nil || v.initializer == nil {
1284 return nil
1285 }
1286
1287 return v.initializer.List()
1288}
1289
1290func (v *InitializerValue) IsConst() bool {
1291 return v != nil && v.initializer != nil && v.initializer.IsConst()
1292}
1293func (v *InitializerValue) Type() Type { return v.typ }
1294func (v *InitializerValue) add(b Value) Value { return nil }
1295func (v *InitializerValue) and(b Value) Value { return nil }
1296func (v *InitializerValue) cpl() Value { return nil }
1297func (v *InitializerValue) div(b Value) Value { return nil }
1298func (v *InitializerValue) eq(b Value) Value { return nil }
1299func (v *InitializerValue) ge(b Value) Value { return nil }
1300func (v *InitializerValue) gt(b Value) Value { return nil }
1301func (v *InitializerValue) le(b Value) Value { return nil }
1302func (v *InitializerValue) lsh(b Value) Value { return nil }
1303func (v *InitializerValue) lt(b Value) Value { return nil }
1304func (v *InitializerValue) mod(b Value) Value { return nil }
1305func (v *InitializerValue) mul(b Value) Value { return nil }
1306func (v *InitializerValue) neg() Value { return nil }
1307func (v *InitializerValue) neq(b Value) Value { return nil }
1308func (v *InitializerValue) or(b Value) Value { return nil }
1309func (v *InitializerValue) rsh(b Value) Value { return nil }
1310func (v *InitializerValue) sub(b Value) Value { return nil }
1311func (v *InitializerValue) xor(b Value) Value { return nil }
1312
1313func (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
1326func (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}
Note: See TracBrowser for help on using the repository browser.