]> Cypherpunks.ru repositories - gostls13.git/blobdiff - src/cmd/compile/internal/gc/ssa.go
[dev.ssa] Merge branch 'master' into dev.ssa
[gostls13.git] / src / cmd / compile / internal / gc / ssa.go
index a107f91ef3e70a33b68a0476a07a5bad047c7657..ecff7c07dea5932da3ac84d5b769d838c3329979 100644 (file)
@@ -1137,6 +1137,7 @@ var opToSSA = map[opAndType]ssa.Op{
        opAndType{OEQ, TFUNC}:      ssa.OpEqPtr,
        opAndType{OEQ, TMAP}:       ssa.OpEqPtr,
        opAndType{OEQ, TCHAN}:      ssa.OpEqPtr,
+       opAndType{OEQ, TPTR32}:     ssa.OpEqPtr,
        opAndType{OEQ, TPTR64}:     ssa.OpEqPtr,
        opAndType{OEQ, TUINTPTR}:   ssa.OpEqPtr,
        opAndType{OEQ, TUNSAFEPTR}: ssa.OpEqPtr,
@@ -1157,6 +1158,7 @@ var opToSSA = map[opAndType]ssa.Op{
        opAndType{ONE, TFUNC}:      ssa.OpNeqPtr,
        opAndType{ONE, TMAP}:       ssa.OpNeqPtr,
        opAndType{ONE, TCHAN}:      ssa.OpNeqPtr,
+       opAndType{ONE, TPTR32}:     ssa.OpNeqPtr,
        opAndType{ONE, TPTR64}:     ssa.OpNeqPtr,
        opAndType{ONE, TUINTPTR}:   ssa.OpNeqPtr,
        opAndType{ONE, TUNSAFEPTR}: ssa.OpNeqPtr,
@@ -2594,9 +2596,11 @@ func (s *state) call(n *Node, k callKind) *ssa.Value {
        // Defer/go args
        if k != callNormal {
                // Write argsize and closure (args to Newproc/Deferproc).
+               argStart := Ctxt.FixedFrameSize()
                argsize := s.constInt32(Types[TUINT32], int32(stksize))
-               s.vars[&memVar] = s.newValue3I(ssa.OpStore, ssa.TypeMem, 4, s.sp, argsize, s.mem())
-               addr := s.entryNewValue1I(ssa.OpOffPtr, Ptrto(Types[TUINTPTR]), int64(Widthptr), s.sp)
+               addr := s.entryNewValue1I(ssa.OpOffPtr, Types[TUINTPTR], argStart, s.sp)
+               s.vars[&memVar] = s.newValue3I(ssa.OpStore, ssa.TypeMem, 4, addr, argsize, s.mem())
+               addr = s.entryNewValue1I(ssa.OpOffPtr, Ptrto(Types[TUINTPTR]), argStart+int64(Widthptr), s.sp)
                s.vars[&memVar] = s.newValue3I(ssa.OpStore, ssa.TypeMem, int64(Widthptr), addr, closure, s.mem())
                stksize += 2 * int64(Widthptr)
        }
@@ -2946,7 +2950,7 @@ func (s *state) check(cmp *ssa.Value, fn *Node) {
 // is started to load the return values.
 func (s *state) rtcall(fn *Node, returns bool, results []*Type, args ...*ssa.Value) []*ssa.Value {
        // Write args to the stack
-       var off int64 // TODO: arch-dependent starting offset?
+       off := Ctxt.FixedFrameSize()
        for _, arg := range args {
                t := arg.Type
                off = Rnd(off, t.Alignment())
@@ -3026,10 +3030,9 @@ func (s *state) insertWBmove(t *Type, left, right *ssa.Value, line int32) {
 
        aux := &ssa.ExternSymbol{Typ: Types[TBOOL], Sym: syslook("writeBarrier").Sym}
        flagaddr := s.newValue1A(ssa.OpAddr, Ptrto(Types[TUINT32]), aux, s.sb)
-       // TODO: select the .enabled field. It is currently first, so not needed for now.
-       // Load word, test byte, avoiding partial register write from load byte.
+       // Load word, test word, avoiding partial register write from load byte.
        flag := s.newValue2(ssa.OpLoad, Types[TUINT32], flagaddr, s.mem())
-       flag = s.newValue1(ssa.OpTrunc64to8, Types[TBOOL], flag)
+       flag = s.newValue2(ssa.OpNeq32, Types[TBOOL], flag, s.constInt32(Types[TUINT32], 0))
        b := s.endBlock()
        b.Kind = ssa.BlockIf
        b.Likely = ssa.BranchUnlikely
@@ -3077,10 +3080,9 @@ func (s *state) insertWBstore(t *Type, left, right *ssa.Value, line int32, skip
 
        aux := &ssa.ExternSymbol{Typ: Types[TBOOL], Sym: syslook("writeBarrier").Sym}
        flagaddr := s.newValue1A(ssa.OpAddr, Ptrto(Types[TUINT32]), aux, s.sb)
-       // TODO: select the .enabled field. It is currently first, so not needed for now.
-       // Load word, test byte, avoiding partial register write from load byte.
+       // Load word, test word, avoiding partial register write from load byte.
        flag := s.newValue2(ssa.OpLoad, Types[TUINT32], flagaddr, s.mem())
-       flag = s.newValue1(ssa.OpTrunc64to8, Types[TBOOL], flag)
+       flag = s.newValue2(ssa.OpNeq32, Types[TBOOL], flag, s.constInt32(Types[TUINT32], 0))
        b := s.endBlock()
        b.Kind = ssa.BlockIf
        b.Likely = ssa.BranchUnlikely
@@ -4093,7 +4095,7 @@ func AddAux(a *obj.Addr, v *ssa.Value) {
        AddAux2(a, v, v.AuxInt)
 }
 func AddAux2(a *obj.Addr, v *ssa.Value, offset int64) {
-       if a.Type != obj.TYPE_MEM {
+       if a.Type != obj.TYPE_MEM && a.Type != obj.TYPE_ADDR {
                v.Fatalf("bad AddAux addr %v", a)
        }
        // add integer offset