.ugen .verstamp 3 11 .extern _iob 448 .extern optarg 8 .extern optind 4 .extern opterr 4 .extern SINFINITY 4 .extern DINFINITY 8 .extern SQNAN 4 .extern DQNAN 8 .extern SSNAN 4 .extern DSNAN 8 .data .align 3 .align 0 $$19: .ascii " x = %16lx y = %16lx z = %16lx \X0A\X00" .data .align 3 .align 0 $$20: .ascii " x = %16lx y = %16lx z = %16lx \X0A\X00" .data .align 3 .align 0 $$21: .ascii " x = %16lx y = %16lx z = %16lx \X0A\X00" .text .align 4 .file 2 "div.c" .globl divide # 1 #include # 2 long int divide(numerat, divisor) # 3 unsigned long int numerat, divisor; # 4 { .ent divide 2 divide: .option O2 ldgp $gp, 0($27) .frame $sp, 0, $26, 0 .prologue 1 # 5 unsigned long int quotnt, q, d, n; # 6 int shift, i; # 7 # 8 shift = 0; bis $31, $31, $0 # 9 d = divisor; bis $17, $17, $18 # 10 n = numerat; bis $16, $16, $19 # 11 while (d + d < n) { addq $17, $17, $1 cmpult $1, $16, $2 beq $2, $33 addq $18, $18, $16 $32: # 12 d = d + d; bis $16, $16, $18 # 13 shift++; addl $0, 1, $0 addq $18, $18, $16 cmpult $16, $19, $3 bne $3, $32 $33: # 14 } # 15 q = 0; bis $31, $31, $16 # 16 for ( i = 0; i <= shift; i++){ bis $31, $31, $17 blt $0, $36 $34: # 17 q = q + q; addq $16, $16, $16 # 18 if (d <= n) { cmpule $18, $19, $4 beq $4, $35 # 19 n = n - d; subq $19, $18, $19 # 20 q = q + 1; addq $16, 1, $16 $35: # 21 } # 22 d = d/2; srl $18, 1, $18 addl $17, 1, $17 subq $17, $0, $5 ble $5, $34 $36: # 23 /* printf("i:%x n:%x d:%x, q:%x \n", i, n, d, q); */ # 24 } # 25 /* printf("remainder = %x ", n); */ # 26 return q; bis $16, $16, $0 .livereg 0xFC7F0002,0x3FC00000 ret $31, ($26), 1 .end divide .text .align 4 .file 2 "div.c" .globl main # 27 } # 28 # 29 main() { .ent main 2 main: .option O2 ldgp $gp, 0($27) lda $sp, -16($sp) stq $26, 0($sp) .mask 0x04000000, -16 .frame $sp, 16, $26, 0 .prologue 1 # 30 # 31 unsigned long m, n, x, y, z; # 32 # 33 m = 256; # 34 # 35 x = 144+5; # 36 y = 12; # 37 z = divide(x, y); ldiq $16, 149 ldiq $17, 12 .livereg 0x0001E002,0x00000000 jsr $26, divide ldgp $gp, 0($26) # 38 printf(" x = %16lx y = %16lx z = %16lx \n", x, y, z); lda $16, $$19 ldiq $17, 149 ldiq $18, 12 bis $0, $0, $19 .livereg 0x0001F802,0x00000000 jsr $26, printf ldgp $gp, 0($26) # 39 /* printf(" x = %16ld y = %16ld z = %16ld \n", x, y, z); */ # 40 # 41 x = 1003*997+5; # 42 y = 97*100; # 43 z = divide(x, y); ldiq $16, 999996 ldiq $17, 9700 .livereg 0x0001E002,0x00000000 jsr $26, divide ldgp $gp, 0($26) # 44 printf(" x = %16lx y = %16lx z = %16lx \n", x, y, z); lda $16, $$20 ldiq $17, 999996 ldiq $18, 9700 bis $0, $0, $19 .livereg 0x0001F802,0x00000000 jsr $26, printf ldgp $gp, 0($26) # 45 /* printf(" x = %16ld y = %16ld z = %16ld \n", x, y, z); */ # 46 # 47 x = 1003*997*m*m*m+5; # 48 y = 1003*m; # 49 z = divide(x, y); ldiq $16, 16777065005061 ldiq $17, 256768 .livereg 0x0001E002,0x00000000 jsr $26, divide ldgp $gp, 0($26) # 50 printf(" x = %16lx y = %16lx z = %16lx \n", x, y, z); lda $16, $$21 ldiq $17, 16777065005061 ldiq $18, 256768 bis $0, $0, $19 .livereg 0x0001F802,0x00000000 jsr $26, printf ldgp $gp, 0($26) # 51 /* printf(" x = %16ld y = %16ld z = %16ld \n", x, y, z); */ # 52 # 53 } bis $31, $31, $0 .livereg 0xFC7F0002,0x3FC00000 ldq $26, 0($sp) lda $sp, 16($sp) ret $31, ($26), 1 .end main