@@ -319,11 +319,7 @@ func progedit(ctxt *obj.Link, p *obj.Prog, newprog obj.ProgAlloc) {
319
319
320
320
// Rewrite BR/BL to symbol as TYPE_BRANCH.
321
321
switch p .As {
322
- case AB ,
323
- ABL ,
324
- obj .ARET ,
325
- obj .ADUFFZERO ,
326
- obj .ADUFFCOPY :
322
+ case AB , ABL , obj .ARET :
327
323
if p .To .Sym != nil {
328
324
p .To .Type = obj .TYPE_BRANCH
329
325
}
@@ -400,39 +396,6 @@ func progedit(ctxt *obj.Link, p *obj.Prog, newprog obj.ProgAlloc) {
400
396
401
397
// Rewrite p, if necessary, to access global data via the global offset table.
402
398
func (c * ctxt7 ) rewriteToUseGot (p * obj.Prog ) {
403
- if p .As == obj .ADUFFCOPY || p .As == obj .ADUFFZERO {
404
- // ADUFFxxx $offset
405
- // becomes
406
- // MOVD runtime.duffxxx@GOT, REGTMP
407
- // ADD $offset, REGTMP
408
- // CALL REGTMP
409
- var sym * obj.LSym
410
- if p .As == obj .ADUFFZERO {
411
- sym = c .ctxt .LookupABI ("runtime.duffzero" , obj .ABIInternal )
412
- } else {
413
- sym = c .ctxt .LookupABI ("runtime.duffcopy" , obj .ABIInternal )
414
- }
415
- offset := p .To .Offset
416
- p .As = AMOVD
417
- p .From .Type = obj .TYPE_MEM
418
- p .From .Name = obj .NAME_GOTREF
419
- p .From .Sym = sym
420
- p .To .Type = obj .TYPE_REG
421
- p .To .Reg = REGTMP
422
- p .To .Name = obj .NAME_NONE
423
- p .To .Offset = 0
424
- p .To .Sym = nil
425
- p1 := obj .Appendp (p , c .newprog )
426
- p1 .As = AADD
427
- p1 .From .Type = obj .TYPE_CONST
428
- p1 .From .Offset = offset
429
- p1 .To .Type = obj .TYPE_REG
430
- p1 .To .Reg = REGTMP
431
- p2 := obj .Appendp (p1 , c .newprog )
432
- p2 .As = obj .ACALL
433
- p2 .To .Type = obj .TYPE_REG
434
- p2 .To .Reg = REGTMP
435
- }
436
399
437
400
// We only care about global data: NAME_EXTERN means a global
438
401
// symbol in the Go sense, and p.Sym.Local is true for a few
@@ -543,9 +506,7 @@ func preprocess(ctxt *obj.Link, cursym *obj.LSym, newprog obj.ProgAlloc) {
543
506
case obj .ATEXT :
544
507
p .Mark |= LEAF
545
508
546
- case ABL ,
547
- obj .ADUFFZERO ,
548
- obj .ADUFFCOPY :
509
+ case ABL :
549
510
c .cursym .Func ().Text .Mark &^= LEAF
550
511
}
551
512
}
@@ -912,110 +873,7 @@ func preprocess(ctxt *obj.Link, cursym *obj.LSym, newprog obj.ProgAlloc) {
912
873
p .From .Type = obj .TYPE_MEM
913
874
p .From .Reg = REGSP
914
875
}
915
-
916
- case obj .ADUFFCOPY :
917
- // ADR ret_addr, R27
918
- // STP (FP, R27), -24(SP)
919
- // SUB 24, SP, FP
920
- // DUFFCOPY
921
- // ret_addr:
922
- // SUB 8, SP, FP
923
-
924
- q1 := p
925
- // copy DUFFCOPY from q1 to q4
926
- q4 := obj .Appendp (p , c .newprog )
927
- q4 .Pos = p .Pos
928
- q4 .As = obj .ADUFFCOPY
929
- q4 .To = p .To
930
-
931
- q1 .As = AADR
932
- q1 .From .Type = obj .TYPE_BRANCH
933
- q1 .To .Type = obj .TYPE_REG
934
- q1 .To .Reg = REG_R27
935
-
936
- q2 := obj .Appendp (q1 , c .newprog )
937
- q2 .Pos = p .Pos
938
- q2 .As = ASTP
939
- q2 .From .Type = obj .TYPE_REGREG
940
- q2 .From .Reg = REGFP
941
- q2 .From .Offset = int64 (REG_R27 )
942
- q2 .To .Type = obj .TYPE_MEM
943
- q2 .To .Reg = REGSP
944
- q2 .To .Offset = - 24
945
-
946
- // maintain FP for DUFFCOPY
947
- q3 := obj .Appendp (q2 , c .newprog )
948
- q3 .Pos = p .Pos
949
- q3 .As = ASUB
950
- q3 .From .Type = obj .TYPE_CONST
951
- q3 .From .Offset = 24
952
- q3 .Reg = REGSP
953
- q3 .To .Type = obj .TYPE_REG
954
- q3 .To .Reg = REGFP
955
-
956
- q5 := obj .Appendp (q4 , c .newprog )
957
- q5 .Pos = p .Pos
958
- q5 .As = ASUB
959
- q5 .From .Type = obj .TYPE_CONST
960
- q5 .From .Offset = 8
961
- q5 .Reg = REGSP
962
- q5 .To .Type = obj .TYPE_REG
963
- q5 .To .Reg = REGFP
964
- q1 .From .SetTarget (q5 )
965
- p = q5
966
-
967
- case obj .ADUFFZERO :
968
- // ADR ret_addr, R27
969
- // STP (FP, R27), -24(SP)
970
- // SUB 24, SP, FP
971
- // DUFFZERO
972
- // ret_addr:
973
- // SUB 8, SP, FP
974
-
975
- q1 := p
976
- // copy DUFFZERO from q1 to q4
977
- q4 := obj .Appendp (p , c .newprog )
978
- q4 .Pos = p .Pos
979
- q4 .As = obj .ADUFFZERO
980
- q4 .To = p .To
981
-
982
- q1 .As = AADR
983
- q1 .From .Type = obj .TYPE_BRANCH
984
- q1 .To .Type = obj .TYPE_REG
985
- q1 .To .Reg = REG_R27
986
-
987
- q2 := obj .Appendp (q1 , c .newprog )
988
- q2 .Pos = p .Pos
989
- q2 .As = ASTP
990
- q2 .From .Type = obj .TYPE_REGREG
991
- q2 .From .Reg = REGFP
992
- q2 .From .Offset = int64 (REG_R27 )
993
- q2 .To .Type = obj .TYPE_MEM
994
- q2 .To .Reg = REGSP
995
- q2 .To .Offset = - 24
996
-
997
- // maintain FP for DUFFZERO
998
- q3 := obj .Appendp (q2 , c .newprog )
999
- q3 .Pos = p .Pos
1000
- q3 .As = ASUB
1001
- q3 .From .Type = obj .TYPE_CONST
1002
- q3 .From .Offset = 24
1003
- q3 .Reg = REGSP
1004
- q3 .To .Type = obj .TYPE_REG
1005
- q3 .To .Reg = REGFP
1006
-
1007
- q5 := obj .Appendp (q4 , c .newprog )
1008
- q5 .Pos = p .Pos
1009
- q5 .As = ASUB
1010
- q5 .From .Type = obj .TYPE_CONST
1011
- q5 .From .Offset = 8
1012
- q5 .Reg = REGSP
1013
- q5 .To .Type = obj .TYPE_REG
1014
- q5 .To .Reg = REGFP
1015
- q1 .From .SetTarget (q5 )
1016
- p = q5
1017
876
}
1018
-
1019
877
if p .To .Type == obj .TYPE_REG && p .To .Reg == REGSP && p .Spadj == 0 {
1020
878
f := c .cursym .Func ()
1021
879
if f .FuncFlag & abi .FuncFlagSPWrite == 0 {
0 commit comments