1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
|
;
; /*
; * To get lock routine, compile this into a .s, then SUBSTITUTE
; * a LOAD AND CLEAR WORD instruction for the load and store of
; * l->key.
; *
; */
; typedef struct Lock {
; int key;
; int pid;
; } Lock;
;
; int
; mutexlock(Lock *l)
; {
; int key;
;
; key = l->key;
; l->key = 0;
; return key != 0;
; }
.LEVEL 1.1
.SPACE $TEXT$,SORT=8
.SUBSPA $CODE$,QUAD=0,ALIGN=8,ACCESS=0x2c,CODE_ONLY,SORT=24
mutexlock
.PROC
.CALLINFO FRAME=0,ARGS_SAVED
.ENTRY
; SUBSTITUTED LDW 0(%r26),%r31
; SUBSTITUTED STWS %r0,0(%r26)
LDCWS 0(%r26),%r31 ; SUBSTITUTED
COMICLR,= 0,%r31,%r28
LDI 1,%r28
.EXIT
BV,N %r0(%r2)
.PROCEND
;
; JIT help
;
.SPACE $TEXT$,SORT=8
.SUBSPA $CODE$,QUAD=0,ALIGN=8,ACCESS=0x2c,CODE_ONLY,SORT=24
calldata
.PROC
.CALLINFO CALLER,FRAME=16,SAVE_RP
.ENTRY
STW %r2,-20(%r30)
LDO 64(%r30),%r30
ADDIL LR'dataptr-$global$,%r27
LDW RR'dataptr-$global$(%r1),%r31
BLE 0(%sr5,%r31)
COPY %r31,%r2
LDW -84(%r30),%r2
BV %r0(%r2)
.EXIT
LDO -64(%r30),%r30
.PROCEND
.SPACE $PRIVATE$
.SUBSPA $SHORTBSS$
dataptr .COMM 4
.SUBSPA $SHORTDATA$,QUAD=1,ALIGN=8,ACCESS=0x1f,SORT=24
dyncall
.WORD $$dyncall
.EXPORT calldata
.EXPORT dyncall
.IMPORT $$dyncall,MILLICODE
.SPACE $TEXT$
.SUBSPA $CODE$
.SPACE $PRIVATE$,SORT=16
.SUBSPA $DATA$,QUAD=1,ALIGN=8,ACCESS=0x1f,SORT=16
.SPACE $TEXT$
.SUBSPA $CODE$
.EXPORT mutexlock,ENTRY,PRIV_LEV=3,ARGW0=GR,RTNVAL=GR
.code
; segflush(addr,len)
.proc
.callinfo
.export segflush,entry
segflush
.enter
ldsid (0,%arg0),%r1
mtsp %r1,%sr0
ldo -1(%arg1),%arg1
copy %arg0,%arg2
copy %arg1,%arg3
fdc %arg1(0,%arg0)
loop1
addib,>,n -16,%arg1,loop1
fdc %arg1(0,%arg0)
fdc 0(0,%arg0)
sync
fic %arg3(%sr0,%arg2)
loop2
addib,>,n -16,%arg3,loop2
fic %arg3(%sr0,%arg2)
fic 0(%sr0,%arg2)
sync
nop
nop
nop
nop
nop
nop
nop
.leave
.procend
.end
|