Subversion Repositories FlightCtrl

Rev

Rev 2301 | Blame | Compare with Previous | Last modification | View Log | RSS feed

   1                    # 1 "isqrt.S"
   1                    ;-----------------------------------------------------------------------------;
   0                    
   0                    
   2                    ;-----------------------------------------------------------------------------;
   3                    ; Fast integer squareroot routines for avr-gcc project          (C)ChaN, 2008
   4                    ; http://elm-chan.org/docs/avrlib/sqrt32.S
   5                    ;-----------------------------------------------------------------------------;
   6                    ; uint16_t isqrt32 (uint32_t n);
   7                    ; uint8_t isqrt16 (uint16_t n);
   8                    ; uint16_t ihypot (int16_t x, int16_t y);
   9                    
  10                    ;-----------------------------------------------------------------------------:
  11                    ; 32bit integer squareroot
  12                    ;-----------------------------------------------------------------------------;
  13                    ;   uint16_t isqrt32 (
  14                    ;     uint32_t n
  15                    ;   );
  16                    ;
  17                    ; Return Value:
  18                    ;   Squareroot of n.
  19                    ;
  20                    ; Size  = 53 words
  21                    ; Clock = 532..548 cycles
  22                    ; Stack = 0 byte
  23                    
  24                    .global isqrt32
  25                    .func isqrt32
  26                    
  27:isqrt.S       **** isqrt32:
  28:isqrt.S       ****         clr     r0
  29:isqrt.S       ****         clr     r18
  30:isqrt.S       ****         clr     r19
  31:isqrt.S       ****         clr     r20
  32:isqrt.S       ****         ldi     r21, 1
  33:isqrt.S       ****         clr     r27
  34:isqrt.S       ****         clr     r30
  35:isqrt.S       ****         clr     r31
  36:isqrt.S       ****         ldi     r26, 16
  37:isqrt.S       **** 1:      lsl     r22
  38:isqrt.S       ****         rol     r23
  39:isqrt.S       ****         rol     r24
  40:isqrt.S       ****         rol     r25
  41:isqrt.S       ****         rol     r0
  42:isqrt.S       ****         rol     r18
  43:isqrt.S       ****         rol     r19
  44:isqrt.S       ****         rol     r20
  45:isqrt.S       ****         lsl     r22
  46:isqrt.S       ****         rol     r23
  47:isqrt.S       ****         rol     r24
  48:isqrt.S       ****         rol     r25
  49:isqrt.S       ****         rol     r0
  50:isqrt.S       ****         rol     r18
  51:isqrt.S       ****         rol     r19
  52:isqrt.S       ****         rol     r20
  53:isqrt.S       ****         brpl    2f
  54:isqrt.S       ****         add     r0, r21
  55:isqrt.S       ****         adc     r18, r27
  56:isqrt.S       ****         adc     r19, r30
  57:isqrt.S       ****         adc     r20, r31
  58:isqrt.S       ****         rjmp    3f
  59:isqrt.S       **** 2:      sub     r0, r21
  60:isqrt.S       ****         sbc     r18, r27
  61:isqrt.S       ****         sbc     r19, r30
  62:isqrt.S       ****         sbc     r20, r31
  63:isqrt.S       **** 3:      lsl     r21
  64:isqrt.S       ****         rol     r27
  65:isqrt.S       ****         rol     r30
  66:isqrt.S       ****         andi    r21, 0b11111000
  67:isqrt.S       ****         ori     r21, 0b00000101
  68:isqrt.S       ****         sbrc    r20, 7
  69:isqrt.S       ****         subi    r21, 2
  70:isqrt.S       ****         dec     r26
  71:isqrt.S       ****         brne    1b
  72:isqrt.S       ****         lsr     r30
  73:isqrt.S       ****         ror     r27
  74:isqrt.S       ****         ror     r21
  75:isqrt.S       ****         lsr     r30
  76:isqrt.S       ****         ror     r27
  77:isqrt.S       ****         ror     r21
  78:isqrt.S       ****         mov     r24, r21
  79:isqrt.S       ****         mov     r25, r27
  80                            ret
  81                    .endfunc
  82                    
  83                    
  84                    
  85                    ;-----------------------------------------------------------------------------:
  86                    ; 16bit integer squareroot
  87                    ;-----------------------------------------------------------------------------;
  88                    ;   uint8_t isqrt16 (
  89                    ;     uint16_t n
  90                    ;   );
  91                    ;
  92                    ; Return Value:
  93                    ;   Squareroot of n.
  94                    ;
  95                    ; Size  = 33 words
  96                    ; Clock = 181..189 cycles
  97                    ; Stack = 0 byte
  98                    
  99                    .global isqrt16
 100                    .func isqrt16
 101                    
 102:isqrt.S       **** isqrt16:
 103:isqrt.S       ****         clr     r18
 104:isqrt.S       ****         clr     r19
 105:isqrt.S       ****         ldi     r20, 1
 106:isqrt.S       ****         clr     r21
 107:isqrt.S       ****         ldi     r22, 8
 108:isqrt.S       **** 1:      lsl     r24
 109:isqrt.S       ****         rol     r25
 110:isqrt.S       ****         rol     r18
 111:isqrt.S       ****         rol     r19
 112:isqrt.S       ****         lsl     r24
 113:isqrt.S       ****         rol     r25
 114:isqrt.S       ****         rol     r18
 115:isqrt.S       ****         rol     r19
 116:isqrt.S       ****         brpl    2f
 117:isqrt.S       ****         add     r18, r20
 118:isqrt.S       ****         adc     r19, r21
 119:isqrt.S       ****         rjmp    3f
 120:isqrt.S       **** 2:      sub     r18, r20
 121:isqrt.S       ****         sbc     r19, r21
 122:isqrt.S       **** 3:      lsl     r20
 123:isqrt.S       ****         rol     r21
 124:isqrt.S       ****         andi    r20, 0b11111000
 125:isqrt.S       ****         ori     r20, 0b00000101
 126:isqrt.S       ****         sbrc    r19, 7
 127:isqrt.S       ****         subi    r20, 2
 128:isqrt.S       ****         dec     r22
 129:isqrt.S       ****         brne    1b
 130:isqrt.S       ****         lsr     r21
 131:isqrt.S       ****         ror     r20
 132:isqrt.S       ****         lsr     r21
 133:isqrt.S       ****         ror     r20
 134:isqrt.S       ****         mov     r24, r20
 135                            ret
 136                    .endfunc
 137                    
 138                    
 139                    
 140                    ;-----------------------------------------------------------------------------:
 141                    ; 16bit integer hypot (megaAVR is required)
 142                    ;-----------------------------------------------------------------------------;
 143                    ;   uint16_t ihypot (
 144                    ;     int16_t x,
 145                    ;     int16_t y
 146                    ;   );
 147                    ;
 148                    ; Return Value:
 149                    ;   Squareroot of (x*x + y*y)
 150                    ;
 151                    ; Size  = 42 words
 152                    ; Clock = 581..597 cycles
 153                    ; Stack = 0 byte
 154                    
 155                    .global ihypot
 156                    .func ihypot
 157                    
 158:isqrt.S       **** ihypot:
 159:isqrt.S       ****         clr     r26
 160:isqrt.S       ****         sbrs    r25, 7
 161:isqrt.S       ****         rjmp    1f
 162:isqrt.S       ****         com     r24
 163:isqrt.S       ****         com     r25
 164:isqrt.S       ****         adc     r24, r26
 165:isqrt.S       ****         adc     r25, r26
 166:isqrt.S       **** 1:      sbrs    r23, 7
 167:isqrt.S       ****         rjmp    2f
 168:isqrt.S       ****         com     r22
 169:isqrt.S       ****         com     r23
 170:isqrt.S       ****         adc     r22, r26
 171:isqrt.S       ****         adc     r23, r26
 172:isqrt.S       **** 2:      mul     r22, r22
 173:isqrt.S       ****         movw    r18, r0
 174:isqrt.S       ****         mul     r23, r23
 175:isqrt.S       ****         movw    r20, r0
 176:isqrt.S       ****         mul     r22, r23
 177:isqrt.S       ****         add     r19, r0
 178:isqrt.S       ****         adc     r20, r1
 179:isqrt.S       ****         adc     r21, r26
 180:isqrt.S       ****         add     r19, r0
 181:isqrt.S       ****         adc     r20, r1
 182:isqrt.S       ****         adc     r21, r26
 183:isqrt.S       ****         mul     r24, r24
 184:isqrt.S       ****         movw    r30, r0
 185:isqrt.S       ****         mul     r25, r25
 186:isqrt.S       ****         add     r18, r30
 187:isqrt.S       ****         adc     r19, r31
 188:isqrt.S       ****         adc     r20, r0
 189:isqrt.S       ****         adc     r21, r1
 190:isqrt.S       ****         mul     r24, r25
 191:isqrt.S       ****         add     r19, r0
 192:isqrt.S       ****         adc     r20, r1
 193:isqrt.S       ****         adc     r21, r26
 194:isqrt.S       ****         add     r19, r0
 195:isqrt.S       ****         adc     r20, r1
 196:isqrt.S       ****         adc     r21, r26
 197:isqrt.S       ****         movw    r24, r20
 198:isqrt.S       ****         movw    r22, r18
 199:isqrt.S       ****         clr     r1
 200                            rjmp    isqrt32
DEFINED SYMBOLS
             isqrt.S:26     .text:00000000 isqrt32
             isqrt.S:101    .text:0000006a isqrt16
             isqrt.S:157    .text:000000ac ihypot

NO UNDEFINED SYMBOLS