|
4 | 4 |
|
5 | 5 | // Lowering arithmetic
|
6 | 6 | (Add(64|32|16|8) x y) -> (ADD(Q|L|L|L) x y)
|
7 |
| -(AddPtr x y) && config.PtrSize == 8 -> (ADDQ x y) |
8 |
| -(AddPtr x y) && config.PtrSize == 4 -> (ADDL x y) |
| 7 | +(AddPtr x y) -> (ADDQ x y) |
9 | 8 | (Add(32|64)F x y) -> (ADDS(S|D) x y)
|
10 | 9 |
|
11 | 10 | (Sub(64|32|16|8) x y) -> (SUB(Q|L|L|L) x y)
|
12 |
| -(SubPtr x y) && config.PtrSize == 8 -> (SUBQ x y) |
13 |
| -(SubPtr x y) && config.PtrSize == 4 -> (SUBL x y) |
| 11 | +(SubPtr x y) -> (SUBQ x y) |
14 | 12 | (Sub(32|64)F x y) -> (SUBS(S|D) x y)
|
15 | 13 |
|
16 | 14 | (Mul(64|32|16|8) x y) -> (MUL(Q|L|L|L) x y)
|
|
76 | 74 | (Not x) -> (XORLconst [1] x)
|
77 | 75 |
|
78 | 76 | // Lowering pointer arithmetic
|
79 |
| -(OffPtr [off] ptr) && config.PtrSize == 8 && is32Bit(off) -> (ADDQconst [off] ptr) |
80 |
| -(OffPtr [off] ptr) && config.PtrSize == 8 -> (ADDQ (MOVQconst [off]) ptr) |
81 |
| -(OffPtr [off] ptr) && config.PtrSize == 4 -> (ADDLconst [off] ptr) |
| 77 | +(OffPtr [off] ptr) && is32Bit(off) -> (ADDQconst [off] ptr) |
| 78 | +(OffPtr [off] ptr) -> (ADDQ (MOVQconst [off]) ptr) |
82 | 79 |
|
83 | 80 | // Lowering other arithmetic
|
84 | 81 | (Ctz64 <t> x) -> (CMOVQEQ (Select0 <t> (BSFQ x)) (MOVQconst <t> [64]) (Select1 <types.TypeFlags> (BSFQ x)))
|
|
217 | 214 | (Geq(32|64)F x y) -> (SETGEF (UCOMIS(S|D) x y))
|
218 | 215 |
|
219 | 216 | (Eq(64|32|16|8|B) x y) -> (SETEQ (CMP(Q|L|W|B|B) x y))
|
220 |
| -(EqPtr x y) && config.PtrSize == 8 -> (SETEQ (CMPQ x y)) |
221 |
| -(EqPtr x y) && config.PtrSize == 4 -> (SETEQ (CMPL x y)) |
| 217 | +(EqPtr x y) -> (SETEQ (CMPQ x y)) |
222 | 218 | (Eq(32|64)F x y) -> (SETEQF (UCOMIS(S|D) x y))
|
223 | 219 |
|
224 | 220 | (Neq(64|32|16|8|B) x y) -> (SETNE (CMP(Q|L|W|B|B) x y))
|
225 |
| -(NeqPtr x y) && config.PtrSize == 8 -> (SETNE (CMPQ x y)) |
226 |
| -(NeqPtr x y) && config.PtrSize == 4 -> (SETNE (CMPL x y)) |
| 221 | +(NeqPtr x y) -> (SETNE (CMPQ x y)) |
227 | 222 | (Neq(32|64)F x y) -> (SETNEF (UCOMIS(S|D) x y))
|
228 | 223 |
|
229 | 224 | // Lowering loads
|
230 |
| -(Load <t> ptr mem) && (is64BitInt(t) || isPtr(t) && config.PtrSize == 8) -> (MOVQload ptr mem) |
231 |
| -(Load <t> ptr mem) && (is32BitInt(t) || isPtr(t) && config.PtrSize == 4) -> (MOVLload ptr mem) |
| 225 | +(Load <t> ptr mem) && (is64BitInt(t) || isPtr(t)) -> (MOVQload ptr mem) |
| 226 | +(Load <t> ptr mem) && is32BitInt(t) -> (MOVLload ptr mem) |
232 | 227 | (Load <t> ptr mem) && is16BitInt(t) -> (MOVWload ptr mem)
|
233 | 228 | (Load <t> ptr mem) && (t.IsBoolean() || is8BitInt(t)) -> (MOVBload ptr mem)
|
234 | 229 | (Load <t> ptr mem) && is32BitFloat(t) -> (MOVSSload ptr mem)
|
|
420 | 415 | (Const64 [val]) -> (MOVQconst [val])
|
421 | 416 | (Const32F [val]) -> (MOVSSconst [val])
|
422 | 417 | (Const64F [val]) -> (MOVSDconst [val])
|
423 |
| -(ConstNil) && config.PtrSize == 8 -> (MOVQconst [0]) |
424 |
| -(ConstNil) && config.PtrSize == 4 -> (MOVLconst [0]) |
| 418 | +(ConstNil) -> (MOVQconst [0]) |
425 | 419 | (ConstBool [b]) -> (MOVLconst [b])
|
426 | 420 |
|
427 | 421 | // Lowering calls
|
|
476 | 470 | (CMOV(QEQ|QGT|QGE|QCS|QLS|LEQ|LGT|LGE|LCS|LLS|WEQ|WGT|WGE|WCS|WLS) y _ (FlagLT_UGT)) -> y
|
477 | 471 |
|
478 | 472 | // Miscellaneous
|
479 |
| -(IsNonNil p) && config.PtrSize == 8 -> (SETNE (TESTQ p p)) |
480 |
| -(IsNonNil p) && config.PtrSize == 4 -> (SETNE (TESTL p p)) |
481 |
| -(IsInBounds idx len) && config.PtrSize == 8 -> (SETB (CMPQ idx len)) |
482 |
| -(IsInBounds idx len) && config.PtrSize == 4 -> (SETB (CMPL idx len)) |
483 |
| -(IsSliceInBounds idx len) && config.PtrSize == 8 -> (SETBE (CMPQ idx len)) |
484 |
| -(IsSliceInBounds idx len) && config.PtrSize == 4 -> (SETBE (CMPL idx len)) |
| 473 | +(IsNonNil p) -> (SETNE (TESTQ p p)) |
| 474 | +(IsInBounds idx len) -> (SETB (CMPQ idx len)) |
| 475 | +(IsSliceInBounds idx len) -> (SETBE (CMPQ idx len)) |
485 | 476 | (NilCheck ptr mem) -> (LoweredNilCheck ptr mem)
|
486 | 477 | (GetG mem) -> (LoweredGetG mem)
|
487 | 478 | (GetClosurePtr) -> (LoweredGetClosurePtr)
|
488 | 479 | (GetCallerPC) -> (LoweredGetCallerPC)
|
489 | 480 | (GetCallerSP) -> (LoweredGetCallerSP)
|
490 |
| -(Addr {sym} base) && config.PtrSize == 8 -> (LEAQ {sym} base) |
491 |
| -(Addr {sym} base) && config.PtrSize == 4 -> (LEAL {sym} base) |
492 |
| -(LocalAddr {sym} base _) && config.PtrSize == 8 -> (LEAQ {sym} base) |
493 |
| -(LocalAddr {sym} base _) && config.PtrSize == 4 -> (LEAL {sym} base) |
| 481 | +(Addr {sym} base) -> (LEAQ {sym} base) |
| 482 | +(LocalAddr {sym} base _) -> (LEAQ {sym} base) |
494 | 483 |
|
495 | 484 | (MOVBstore [off] {sym} ptr y:(SETL x) mem) && y.Uses == 1 -> (SETLstore [off] {sym} ptr x mem)
|
496 | 485 | (MOVBstore [off] {sym} ptr y:(SETLE x) mem) && y.Uses == 1 -> (SETLEstore [off] {sym} ptr x mem)
|
|
528 | 517 | (AtomicLoad8 ptr mem) -> (MOVBatomicload ptr mem)
|
529 | 518 | (AtomicLoad32 ptr mem) -> (MOVLatomicload ptr mem)
|
530 | 519 | (AtomicLoad64 ptr mem) -> (MOVQatomicload ptr mem)
|
531 |
| -(AtomicLoadPtr ptr mem) && config.PtrSize == 8 -> (MOVQatomicload ptr mem) |
532 |
| -(AtomicLoadPtr ptr mem) && config.PtrSize == 4 -> (MOVLatomicload ptr mem) |
| 520 | +(AtomicLoadPtr ptr mem) -> (MOVQatomicload ptr mem) |
533 | 521 |
|
534 | 522 | // Atomic stores. We use XCHG to prevent the hardware reordering a subsequent load.
|
535 | 523 | // TODO: most runtime uses of atomic stores don't need that property. Use normal stores for those?
|
536 | 524 | (AtomicStore8 ptr val mem) -> (Select1 (XCHGB <types.NewTuple(typ.UInt8,types.TypeMem)> val ptr mem))
|
537 | 525 | (AtomicStore32 ptr val mem) -> (Select1 (XCHGL <types.NewTuple(typ.UInt32,types.TypeMem)> val ptr mem))
|
538 | 526 | (AtomicStore64 ptr val mem) -> (Select1 (XCHGQ <types.NewTuple(typ.UInt64,types.TypeMem)> val ptr mem))
|
539 |
| -(AtomicStorePtrNoWB ptr val mem) && config.PtrSize == 8 -> (Select1 (XCHGQ <types.NewTuple(typ.BytePtr,types.TypeMem)> val ptr mem)) |
540 |
| -(AtomicStorePtrNoWB ptr val mem) && config.PtrSize == 4 -> (Select1 (XCHGL <types.NewTuple(typ.BytePtr,types.TypeMem)> val ptr mem)) |
| 527 | +(AtomicStorePtrNoWB ptr val mem) -> (Select1 (XCHGQ <types.NewTuple(typ.BytePtr,types.TypeMem)> val ptr mem)) |
541 | 528 |
|
542 | 529 | // Atomic exchanges.
|
543 | 530 | (AtomicExchange32 ptr val mem) -> (XCHGL val ptr mem)
|
|
0 commit comments