|
|
1.1 root 1: 1 00000000 LL0:
2: 2 00000000 .data
3: 3 0000032c * .text
4: 4 00000000 .align 1
5: 5 00000000 .globl _pipe_9
6: 6 00000000 _pipe_9:
7: 7 0002C9B0 0000 .word L215
8: 8 0002C9B2 # #include "fpp_defs.h"
9: 9 0002C9B2 #
10: 10 0002C9B2 # /*****************************************************************************
11: 11 0002C9B2 # *
12: 12 0002C9B2 # * PIPELINE TEST #9
13: 13 0002C9B2 # *
14: 14 0002C9B2 # * LDF(op1), MULF(op2), CVFL r0, SUBF operand[r0], STF
15: 15 0002C9B2 # *
16: 16 0002C9B2 # * -where the operands are the fmacro1 MULF data patterns. The SUBF operand's
17: 17 0002C9B2 # * address is based on the result of the CVFL.
18: 18 0002C9B2 # * -The load, multiply, and convert will be done twice. The first time will
19: 19 0002C9B2 # * be to get the index and the data to subtract. The data to subtract will
20: 20 0002C9B2 # * be the same as the accumulator so we'll expect a reasult of zero. The
21: 21 0002C9B2 # * data will be stored based on the 1st CVFL result.
22: 22 0002C9B2 # * -If the 2nd CVFL doesn't get done before the SUBF operand is fetched then
23: 23 0002C9B2 # * we won't get a final accumulator of zero.
24: 24 0002C9B2 # * -For size reasons, only the MULF data with a result between -100 and +100
25: 25 0002C9B2 # * will be used for this test.
26: 26 0002C9B2 # *****************************************************************************/
27: 27 0002C9B2 # pipe_9()
28: 28 0002C9B2 # {
29: 29 0002C9B2 13 017d jbr L217
30: 30 0002C9B5 L218:
31: 31 0002C9B5 # asm(".globl _pipeline_9_t");
32: 32 0002C9B5 .globl _pipeline_9_t
33: 33 0002C9B5 # asm("_pipeline_9_t:");
34: 34 0002C9B5 _pipeline_9_t:
35: 35 0002C9B5 # if( (cycle == 1) && (prt_hdrs) ) /* print headers on 1st cycle */
36: 36 0002C9B5 1d effffffff5 01 cmpl _cycle,$1
37: 37 0002C9BC 21 15 jneq L219
38: 38 0002C9BE 5d efffffffec tstl _prt_hdrs
39: 39 0002C9C4 31 0d jeql L219
40: 40 0002C9C6 # writes(" PIPE_9 ");
41: 41 0002C9C6 .data 1
42: 42 0000032c * L221:
43: 43 0000032c * 20504950455F392000 .ascii " PIPE_9 \0"
44: 44 00000335 * .text
45: 45 0002C9C6 dd 8f0000032c pushl $L221
46: 46 0002C9CC fe 08 efffffffdd callf $8,_writes
47: 47 0002C9D3 # force_loop = FALSE; /* clear force_loop flag */
48: 48 0002C9D3 L219:
49: 49 0002C9D3 4d efffffffd7 clrl _force_loop
50: 50 0002C9D9 # for( index = 0; index <= max_mulf_1_index; index++ ) {
51: 51 0002C9D9 4d efffffffd1 clrl _index
52: 52 0002C9DF L224:
53: 53 0002C9DF 1d efffffffcb efffffffc6 cmpl _index,_max_mulf_1_index
54: 54 0002C9EA 51 03 13 013c jgtr L223
55: 55 0002C9EF # sgl_value_1 = mulf_1_data[index].op_1; /* get the data */
56: 56 0002C9EF 5c 0c efffffffba 50 mull3 $12,_index,r0
57: 57 0002C9F7 0d e000000000 efffffffae movl _mulf_1_data(r0),_sgl_value_1
58: 58 0002CA02 # sgl_value_2 = mulf_1_data[index].op_2; /* operands */
59: 59 0002CA02 5c 0c efffffffa7 50 mull3 $12,_index,r0
60: 60 0002CA0A 0d e000000004 efffffff9b movl _mulf_1_data+4(r0),_sgl_value_2
61: 61 0002CA15 # sgl_expected = mulf_1_data[index].exp;
62: 62 0002CA15 5c 0c efffffff94 50 mull3 $12,_index,r0
63: 63 0002CA1D 0d e000000008 efffffff88 movl _mulf_1_data+8(r0),_sgl_expected
64: 64 0002CA28 # asm("ldf _sgl_value_1");
65: 65 0002CA28 06 efffffff82 ldf _sgl_value_1
66: 66 0002CA2E # asm("mulf _sgl_value_2");
67: 67 0002CA2E e6 efffffff7c mulf _sgl_value_2
68: 68 0002CA34 # asm("cvfl _index2");
69: 69 0002CA34 86 efffffff76 cvfl _index2
70: 70 0002CA3A # asm("nop");
71: 71 0002CA3A 10 nop
72: 72 0002CA3B # if( (index2 >= -99) && (index2 <= 99) ) {
73: 73 0002CA3B 1d efffffff6f 889d cmpl _index2,$-99
74: 74 0002CA43 81 03 13 00da jlss L225
75: 75 0002CA48 1d efffffff62 8863 cmpl _index2,$99
76: 76 0002CA50 41 f3 jgtr L225
77: 77 0002CA52 # if( index2 ) {
78: 78 0002CA52 5d efffffff58 tstl _index2
79: 79 0002CA58 31 1d jeql L226
80: 80 0002CA5A # sgl_value_5 = 0; /* set a dummy index */
81: 81 0002CA5A 4d efffffff50 clrl _sgl_value_5
82: 82 0002CA60 # adr_pipe_ops[sgl_value_5] = 0;
83: 83 0002CA60 0d efffffff4a 50 movl _sgl_value_5,r0
84: 84 0002CA67 48 02 50 50 shll $2,r0,r0
85: 85 0002CA6B 1c 50 efffffff3e 50 addl3 r0,_adr_pipe_ops,r0
86: 86 0002CA73 4d 60 clrl (r0)
87: 87 0002CA75 # } else {
88: 88 0002CA75 11 21 jbr L227
89: 89 0002CA77 L226:
90: 90 0002CA77 # sgl_value_5 = 6; /* set a dummy index */
91: 91 0002CA77 0d 06 efffffff32 movl $6,_sgl_value_5
92: 92 0002CA7E # adr_pipe_ops[sgl_value_5] = 0xabadbabe;
93: 93 0002CA7E 0d efffffff2c 50 movl _sgl_value_5,r0
94: 94 0002CA85 48 02 50 50 shll $2,r0,r0
95: 95 0002CA89 1c 50 efffffff20 50 addl3 r0,_adr_pipe_ops,r0
96: 96 0002CA91 0d 8fabadbabe 60 movl $-1414677826,(r0)
97: 97 0002CA98 # }
98: 98 0002CA98 L227:
99: 99 0002CA98 # asm("movl _index2,r0"); /* save the index */
100: 100 0002CA98 0d efffffff12 50 movl _index2,r0
101: 101 0002CA9F # asm("stf _pipe_ops[r0]"); /* save the Acc's value */
102: 102 0002CA9F 26 40efffffff0a stf _pipe_ops[r0]
103: 103 0002CAA6 # asm("stf _sgl_value_4"); /* save this value */
104: 104 0002CAA6 26 efffffff04 stf _sgl_value_4
105: 105 0002CAAC # /*
106: 106 0002CAAC # * This is the start of the LOOP ON ERROR section
107: 107 0002CAAC # */
108: 108 0002CAAC # asm("_pipe9_1_lp:");
109: 109 0002CAAC _pipe9_1_lp:
110: 110 0002CAAC # asm("movl _sgl_value_5,r0"); /* save the bum index */
111: 111 0002CAAC 0d effffffefe 50 movl _sgl_value_5,r0
112: 112 0002CAB3 # asm("ldf _sgl_value_1");
113: 113 0002CAB3 06 effffffef7 ldf _sgl_value_1
114: 114 0002CAB9 # asm("mulf _sgl_value_2");
115: 115 0002CAB9 e6 effffffef1 mulf _sgl_value_2
116: 116 0002CABF # asm("cvfl r0"); /* set up the index to use */
117: 117 0002CABF 86 50 cvfl r0
118: 118 0002CAC1 # asm("subf _pipe_ops[r0]"); /* subtract saved value */
119: 119 0002CAC1 d6 40effffffee8 subf _pipe_ops[r0]
120: 120 0002CAC8 # asm("stf _sgl_st_acc");
121: 121 0002CAC8 26 effffffee2 stf _sgl_st_acc
122: 122 0002CACE # asm("movl r0,_sgl_value_6"); /* save the index used */
123: 123 0002CACE 0d 50 effffffedb movl r0,_sgl_value_6
124: 124 0002CAD5 # if( force_loop )
125: 125 0002CAD5 5d effffffed5 tstl _force_loop
126: 126 0002CADB 31 02 jeql L228
127: 127 0002CADD # asm("brb _pipe9_1_lp");; /* loop on the error */
128: 128 0002CADD 11 cd brb _pipe9_1_lp
129: 129 0002CADF L228:
130: 130 0002CADF # /*
131: 131 0002CADF # * Verify the results
132: 132 0002CADF # */
133: 133 0002CADF # if( sgl_st_acc ) { /* the Acc s/b cleared */
134: 134 0002CADF 5d effffffecb tstl _sgl_st_acc
135: 135 0002CAE5 31 3b jeql L229
136: 136 0002CAE7 # errcnt++; /* bump the error count */
137: 137 0002CAE7 6d effffffec3 incl _errcnt
138: 138 0002CAED # if ( prt_error )
139: 139 0002CAED 5d effffffebd tstl _prt_error
140: 140 0002CAF3 31 07 jeql L230
141: 141 0002CAF5 # pipe9_print(); /* print the error mesage */
142: 142 0002CAF5 fe 04 ef0000003a callf $4,_pipe9_print
143: 143 0002CAFC # if ( halt_flg )
144: 144 0002CAFC L230:
145: 145 0002CAFC 5d effffffeae tstl _halt_flg
146: 146 0002CB02 31 09 jeql L232
147: 147 0002CB04 # pipe9_halt( 1 ); /* halt on the error */
148: 148 0002CB04 dd 01 pushl $1
149: 149 0002CB06 fe 08 ef00000181 callf $8,_pipe9_halt
150: 150 0002CB0D # if ( loop_on_err ) {
151: 151 0002CB0D L232:
152: 152 0002CB0D 5d effffffe9d tstl _loop_on_err
153: 153 0002CB13 31 0d jeql L234
154: 154 0002CB15 # force_loop = 1;
155: 155 0002CB15 0d 01 effffffe94 movl $1,_force_loop
156: 156 0002CB1C # asm("jmp _pipe9_1_lp");;
157: 157 0002CB1C 71 efffffff8a jmp _pipe9_1_lp
158: 158 0002CB22 # }
159: 159 0002CB22 # }
160: 160 0002CB22 L234:
161: 161 0002CB22 # }
162: 162 0002CB22 L229:
163: 163 0002CB22 # };
164: 164 0002CB22 L225:
165: 165 0002CB22 L222:
166: 166 0002CB22 6d effffffe88 incl _index
167: 167 0002CB28 13 feb4 jbr L224
168: 168 0002CB2B L223:
169: 169 0002CB2B # asm("jmp *return"); /* return to the test monitor */
170: 170 0002CB2B 71 fffffffe7f jmp *return
171: 171 0002CB31 # }
172: 172 0002CB31 40 ret#2
173: 173 0002CB32 .set L215,0x0
174: 174 0002CB32 L217:
175: 175 0002CB32 13 fe80 jbr L218
176: 176 0002CB35 .data
177: 177 0000032c * .text
178: 178 0002CB35 00 .align 1
179: 179 0002CB36 .globl _pipe9_print
180: 180 0002CB36 _pipe9_print:
181: 181 0002CB36 0000 .word L235
182: 182 0002CB38 #
183: 183 0002CB38 #
184: 184 0002CB38 #
185: 185 0002CB38 #
186: 186 0002CB38 # /***************************************************************************
187: 187 0002CB38 # *
188: 188 0002CB38 # * print an error message of the form
189: 189 0002CB38 # *
190: 190 0002CB38 # * cycle: xx Test xx, (Pipe 9), error
191: 191 0002CB38 # * test sequence = LDF(op1), MULF(op2), CVFL r0, SUBF operand[r0], STF
192: 192 0002CB38 # * op #1 = xxxxxxxx, final Acc = xxxxxxxx, data index = xxxxxxxx
193: 193 0002CB38 # * op #2 = xxxxxxxx, expected Acc = xxxxxxxx
194: 194 0002CB38 # * op #3 = xxxxxxxx, CVFL result = xxxxxxxx
195: 195 0002CB38 # * int expected = xxxxxxxx
196: 196 0002CB38 # ***************************************************************************/
197: 197 0002CB38 # pipe9_print()
198: 198 0002CB38 # {
199: 199 0002CB38 13 0150 jbr L237
200: 200 0002CB3B L238:
201: 201 0002CB3B # writes("\n"); /* start a new print line */
202: 202 0002CB3B .data 1
203: 203 00000335 * L239:
204: 204 00000335 * 0A00 .ascii "\12\0"
205: 205 00000337 * .text
206: 206 0002CB3B dd 8f00000335 pushl $L239
207: 207 0002CB41 fe 08 effffffe68 callf $8,_writes
208: 208 0002CB48 # writes("cycle: ");
209: 209 0002CB48 .data 1
210: 210 00000337 * L240:
211: 211 00000337 * 6379636C653A2000 .ascii "cycle: \0"
212: 212 0000033f * .text
213: 213 0002CB48 dd 8f00000337 pushl $L240
214: 214 0002CB4E fe 08 effffffe5b callf $8,_writes
215: 215 0002CB55 # writed( cycle );
216: 216 0002CB55 dd effffffe55 pushl _cycle
217: 217 0002CB5B fe 08 effffffe4e callf $8,_writed
218: 218 0002CB62 # writes(" Test ");
219: 219 0002CB62 .data 1
220: 220 0000033f * L242:
221: 221 0000033f * 2020546573742000 .ascii " Test \0"
222: 222 00000347 * .text
223: 223 0002CB62 dd 8f0000033f pushl $L242
224: 224 0002CB68 fe 08 effffffe41 callf $8,_writes
225: 225 0002CB6F # writed( test_no );
226: 226 0002CB6F dd effffffe3b pushl _test_no
227: 227 0002CB75 fe 08 effffffe34 callf $8,_writed
228: 228 0002CB7C # writes(" (Pipe 9), error\n");
229: 229 0002CB7C .data 1
230: 230 00000347 * L243:
231: 231 00000347 * 20202028506970652039292C2 .ascii " (Pipe 9), error\12\0"
232: 06572726F720A00
233: 232 0000035b * .text
234: 233 0002CB7C dd 8f00000347 pushl $L243
235: 234 0002CB82 fe 08 effffffe27 callf $8,_writes
236: 235 0002CB89 # writes(" LDF(op1), MULF(op2), CVFL(r0), SUBF(op3), STF\n");
237: 236 0002CB89 .data 1
238: 237 0000035b * L244:
239: 238 0000035b * 204C4446286F7031292C204D5 .ascii " LDF(op1), MULF(op2), CVFL(r0), SUBF(op3), STF\12\0"
240: 54C46286F7032292C20435646
241: 4C287230292C2053554246286
242: F7033292C205354460A00
243: 239 0000038b * .text
244: 240 0002CB89 dd 8f0000035b pushl $L244
245: 241 0002CB8F fe 08 effffffe1a callf $8,_writes
246: 242 0002CB96 # writes("operand 1 = ");
247: 243 0002CB96 .data 1
248: 244 0000038b * L245:
249: 245 0000038b * 6F706572616E642031203D200 .ascii "operand 1 = \0"
250: 0
251: 246 00000398 * .text
252: 247 0002CB96 dd 8f0000038b pushl $L245
253: 248 0002CB9C fe 08 effffffe0d callf $8,_writes
254: 249 0002CBA3 # write32h( sgl_value_1 );
255: 250 0002CBA3 dd effffffe07 pushl _sgl_value_1
256: 251 0002CBA9 fe 08 effffffe00 callf $8,_write32h
257: 252 0002CBB0 # writes(", final Acc = ");
258: 253 0002CBB0 .data 1
259: 254 00000398 * L247:
260: 255 00000398 * 2C202020202066696E616C204 .ascii ", final Acc = \0"
261: 16363203D2000
262: 256 000003ab * .text
263: 257 0002CBB0 dd 8f00000398 pushl $L247
264: 258 0002CBB6 fe 08 effffffdf3 callf $8,_writes
265: 259 0002CBBD # write32h( sgl_st_acc );
266: 260 0002CBBD dd effffffded pushl _sgl_st_acc
267: 261 0002CBC3 fe 08 effffffde6 callf $8,_write32h
268: 262 0002CBCA # writes(", data index = ");
269: 263 0002CBCA .data 1
270: 264 000003ab * L248:
271: 265 000003ab * 2C2020206461746120696E646 .ascii ", data index = \0"
272: 578203D2000
273: 266 000003bd * .text
274: 267 0002CBCA dd 8f000003ab pushl $L248
275: 268 0002CBD0 fe 08 effffffdd9 callf $8,_writes
276: 269 0002CBD7 # writed( index );
277: 270 0002CBD7 dd effffffdd3 pushl _index
278: 271 0002CBDD fe 08 effffffdcc callf $8,_writed
279: 272 0002CBE4 # writec('\n');
280: 273 0002CBE4 dd 0a pushl $10
281: 274 0002CBE6 fe 08 effffffdc3 callf $8,_writec
282: 275 0002CBED # writes("operand 2 = ");
283: 276 0002CBED .data 1
284: 277 000003bd * L250:
285: 278 000003bd * 6F706572616E642032203D200 .ascii "operand 2 = \0"
286: 0
287: 279 000003ca * .text
288: 280 0002CBED dd 8f000003bd pushl $L250
289: 281 0002CBF3 fe 08 effffffdb6 callf $8,_writes
290: 282 0002CBFA # write32h( sgl_value_2 );
291: 283 0002CBFA dd effffffdb0 pushl _sgl_value_2
292: 284 0002CC00 fe 08 effffffda9 callf $8,_write32h
293: 285 0002CC07 # writes(", expected Acc = ");
294: 286 0002CC07 .data 1
295: 287 000003ca * L251:
296: 288 000003ca * 2C20206578706563746564204 .ascii ", expected Acc = \0"
297: 16363203D2000
298: 289 000003dd * .text
299: 290 0002CC07 dd 8f000003ca pushl $L251
300: 291 0002CC0D fe 08 effffffd9c callf $8,_writes
301: 292 0002CC14 # write32h( sgl_expected );
302: 293 0002CC14 dd effffffd96 pushl _sgl_expected
303: 294 0002CC1A fe 08 effffffd8f callf $8,_write32h
304: 295 0002CC21 # writec('\n');
305: 296 0002CC21 dd 0a pushl $10
306: 297 0002CC23 fe 08 effffffd86 callf $8,_writec
307: 298 0002CC2A # writes("operand 3 = ");
308: 299 0002CC2A .data 1
309: 300 000003dd * L252:
310: 301 000003dd * 6F706572616E642033203D200 .ascii "operand 3 = \0"
311: 0
312: 302 000003ea * .text
313: 303 0002CC2A dd 8f000003dd pushl $L252
314: 304 0002CC30 fe 08 effffffd79 callf $8,_writes
315: 305 0002CC37 # write32h( sgl_value_4 );
316: 306 0002CC37 dd effffffd73 pushl _sgl_value_4
317: 307 0002CC3D fe 08 effffffd6c callf $8,_write32h
318: 308 0002CC44 # writes(", CVFL result = ");
319: 309 0002CC44 .data 1
320: 310 000003ea * L253:
321: 311 000003ea * 2C2020204356464C207265737 .ascii ", CVFL result = \0"
322: 56C74203D2000
323: 312 000003fd * .text
324: 313 0002CC44 dd 8f000003ea pushl $L253
325: 314 0002CC4A fe 08 effffffd5f callf $8,_writes
326: 315 0002CC51 # write32h( sgl_value_6 );
327: 316 0002CC51 dd effffffd59 pushl _sgl_value_6
328: 317 0002CC57 fe 08 effffffd52 callf $8,_write32h
329: 318 0002CC5E # writec('\n');
330: 319 0002CC5E dd 0a pushl $10
331: 320 0002CC60 fe 08 effffffd49 callf $8,_writec
332: 321 0002CC67 # writes(" int expected = ");
333: 322 0002CC67 .data 1
334: 323 000003fd * L254:
335: 324 000003fd * 2020202020202020202020202 .ascii " int expected = \0"
336: 020202020202020202020696E
337: 74206578706563746564203D2
338: 000
339: 325 00000424 * .text
340: 326 0002CC67 dd 8f000003fd pushl $L254
341: 327 0002CC6D fe 08 effffffd3c callf $8,_writes
342: 328 0002CC74 # write32h( index2 );
343: 329 0002CC74 dd effffffd36 pushl _index2
344: 330 0002CC7A fe 08 effffffd2f callf $8,_write32h
345: 331 0002CC81 # writec('\n');
346: 332 0002CC81 dd 0a pushl $10
347: 333 0002CC83 fe 08 effffffd26 callf $8,_writec
348: 334 0002CC8A #
349: 335 0002CC8A #
350: 336 0002CC8A # }
351: 337 0002CC8A 40 ret#2
352: 338 0002CC8B .set L235,0x0
353: 339 0002CC8B L237:
354: 340 0002CC8B 13 fead jbr L238
355: 341 0002CC8E .data
356: 342 0000032c * .text
357: 343 0002CC8E .align 1
358: 344 0002CC8E .globl _pipe9_halt
359: 345 0002CC8E _pipe9_halt:
360: 346 0002CC8E 0000 .word L255
361: 347 0002CC90 #
362: 348 0002CC90 #
363: 349 0002CC90 #
364: 350 0002CC90 # /*
365: 351 0002CC90 # **************************************************************************
366: 352 0002CC90 # *
367: 353 0002CC90 # * HALT ON AN ERROR
368: 354 0002CC90 # *
369: 355 0002CC90 # **************************************************************************
370: 356 0002CC90 # */
371: 357 0002CC90 # pipe9_halt()
372: 358 0002CC90 # {
373: 359 0002CC90 11 47 jbr L257
374: 360 0002CC92 L258:
375: 361 0002CC92 # asm("movl _test_no,r0"); /* r0 = test number */
376: 362 0002CC92 0d effffffd18 50 movl _test_no,r0
377: 363 0002CC99 # asm("movl $1,r1"); /* r1 = subtest number */
378: 364 0002CC99 0d 01 51 movl $1,r1
379: 365 0002CC9C # asm("movl $1,r2"); /* r2 = error code */
380: 366 0002CC9C 0d 01 52 movl $1,r2
381: 367 0002CC9F # asm("movl _cycle,r3"); /* r3 = cycle count */
382: 368 0002CC9F 0d effffffd0b 53 movl _cycle,r3
383: 369 0002CCA6 # asm("movl _sgl_value_1,r4"); /* r4 = sgl operand #1 */
384: 370 0002CCA6 0d effffffd04 54 movl _sgl_value_1,r4
385: 371 0002CCAD # asm("movl _sgl_value_2,r5"); /* r5 = sgl operand #2 */
386: 372 0002CCAD 0d effffffcfd 55 movl _sgl_value_2,r5
387: 373 0002CCB4 # asm("movl _sgl_st_acc,r6"); /* r6 = sgl stored */
388: 374 0002CCB4 0d effffffcf6 56 movl _sgl_st_acc,r6
389: 375 0002CCBB # asm("movl _sgl_expected,r7"); /* r7 = sgl expected */
390: 376 0002CCBB 0d effffffcef 57 movl _sgl_expected,r7
391: 377 0002CCC2 # asm("movl _sgl_value_6,r8"); /* r8 = CVFL int actual */
392: 378 0002CCC2 0d effffffce8 58 movl _sgl_value_6,r8
393: 379 0002CCC9 # asm("movl _index2,r9"); /* r9 = CVFL int expected */
394: 380 0002CCC9 0d effffffce1 59 movl _index2,r9
395: 381 0002CCD0 # asm("movl _index,r10"); /* r10 = data index */
396: 382 0002CCD0 0d effffffcda 5a movl _index,r10
397: 383 0002CCD7 # asm("halt"); /* HALT ... */
398: 384 0002CCD7 00 halt
399: 385 0002CCD8 # }
400: 386 0002CCD8 40 ret#2
401: 387 0002CCD9 .set L255,0x0
402: 388 0002CCD9 L257:
403: 389 0002CCD9 11 b7 jbr L258
404: 390 0002CCDB .data
405: 390 0005968B .data
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.