5
5
package arm64
6
6
7
7
import (
8
- "cmd/compile/internal/ir"
9
8
"cmd/compile/internal/objw"
10
- "cmd/compile/internal/types"
11
9
"cmd/internal/obj"
12
10
"cmd/internal/obj/arm64"
13
11
)
@@ -22,47 +20,20 @@ func padframe(frame int64) int64 {
22
20
}
23
21
24
22
func zerorange (pp * objw.Progs , p * obj.Prog , off , cnt int64 , _ * uint32 ) * obj.Prog {
25
- if cnt = = 0 {
26
- return p
23
+ if cnt % 8 ! = 0 {
24
+ panic ( "zeroed region not aligned" )
27
25
}
28
- if cnt < int64 (4 * types .PtrSize ) {
29
- for i := int64 (0 ); i < cnt ; i += int64 (types .PtrSize ) {
30
- p = pp .Append (p , arm64 .AMOVD , obj .TYPE_REG , arm64 .REGZERO , 0 , obj .TYPE_MEM , arm64 .REGSP , 8 + off + i )
31
- }
32
- } else if cnt <= int64 (128 * types .PtrSize ) {
33
- if cnt % (2 * int64 (types .PtrSize )) != 0 {
34
- p = pp .Append (p , arm64 .AMOVD , obj .TYPE_REG , arm64 .REGZERO , 0 , obj .TYPE_MEM , arm64 .REGSP , 8 + off )
35
- off += int64 (types .PtrSize )
36
- cnt -= int64 (types .PtrSize )
37
- }
38
- p = pp .Append (p , arm64 .AMOVD , obj .TYPE_REG , arm64 .REGSP , 0 , obj .TYPE_REG , arm64 .REG_R20 , 0 )
39
- p = pp .Append (p , arm64 .AADD , obj .TYPE_CONST , 0 , 8 + off , obj .TYPE_REG , arm64 .REG_R20 , 0 )
40
- p .Reg = arm64 .REG_R20
41
- p = pp .Append (p , obj .ADUFFZERO , obj .TYPE_NONE , 0 , 0 , obj .TYPE_MEM , 0 , 0 )
42
- p .To .Name = obj .NAME_EXTERN
43
- p .To .Sym = ir .Syms .Duffzero
44
- p .To .Offset = 4 * (64 - cnt / (2 * int64 (types .PtrSize )))
45
- } else {
46
- // Not using REGTMP, so this is async preemptible (async preemption clobbers REGTMP).
47
- // We are at the function entry, where no register is live, so it is okay to clobber
48
- // other registers
49
- const rtmp = arm64 .REG_R20
50
- p = pp .Append (p , arm64 .AMOVD , obj .TYPE_CONST , 0 , 8 + off - 8 , obj .TYPE_REG , rtmp , 0 )
51
- p = pp .Append (p , arm64 .AMOVD , obj .TYPE_REG , arm64 .REGSP , 0 , obj .TYPE_REG , arm64 .REGRT1 , 0 )
52
- p = pp .Append (p , arm64 .AADD , obj .TYPE_REG , rtmp , 0 , obj .TYPE_REG , arm64 .REGRT1 , 0 )
53
- p .Reg = arm64 .REGRT1
54
- p = pp .Append (p , arm64 .AMOVD , obj .TYPE_CONST , 0 , cnt , obj .TYPE_REG , rtmp , 0 )
55
- p = pp .Append (p , arm64 .AADD , obj .TYPE_REG , rtmp , 0 , obj .TYPE_REG , arm64 .REGRT2 , 0 )
56
- p .Reg = arm64 .REGRT1
57
- p = pp .Append (p , arm64 .AMOVD , obj .TYPE_REG , arm64 .REGZERO , 0 , obj .TYPE_MEM , arm64 .REGRT1 , int64 (types .PtrSize ))
58
- p .Scond = arm64 .C_XPRE
59
- p1 := p
60
- p = pp .Append (p , arm64 .ACMP , obj .TYPE_REG , arm64 .REGRT1 , 0 , obj .TYPE_NONE , 0 , 0 )
61
- p .Reg = arm64 .REGRT2
62
- p = pp .Append (p , arm64 .ABNE , obj .TYPE_NONE , 0 , 0 , obj .TYPE_BRANCH , 0 , 0 )
63
- p .To .SetTarget (p1 )
26
+ off += 8 // return address was ignored in offset calculation
27
+ for cnt >= 16 && off < 512 {
28
+ p = pp .Append (p , arm64 .ASTP , obj .TYPE_REGREG , arm64 .REGZERO , arm64 .REGZERO , obj .TYPE_MEM , arm64 .REGSP , off )
29
+ off += 16
30
+ cnt -= 16
31
+ }
32
+ for cnt != 0 {
33
+ p = pp .Append (p , arm64 .AMOVD , obj .TYPE_REG , arm64 .REGZERO , 0 , obj .TYPE_MEM , arm64 .REGSP , off )
34
+ off += 8
35
+ cnt -= 8
64
36
}
65
-
66
37
return p
67
38
}
68
39
0 commit comments