338 #if defined( __arm__ ) && !defined( __thumb__ ) && \ |
338 #if defined( __arm__ ) && !defined( __thumb__ ) && \ |
339 !( defined( __CC_ARM ) || defined( __ARMCC__ ) ) |
339 !( defined( __CC_ARM ) || defined( __ARMCC__ ) ) |
340 #define FT_MULFIX_ASSEMBLER FT_MulFix_arm |
340 #define FT_MULFIX_ASSEMBLER FT_MulFix_arm |
341 |
341 |
342 /* documentation is in freetype.h */ |
342 /* documentation is in freetype.h */ |
|
343 // Xeli: Got this snippet from a 2.4.6 source |
343 |
344 |
344 static __inline__ FT_Int32 |
345 static __inline__ FT_Int32 |
345 FT_MulFix_arm( FT_Int32 a, |
346 FT_MulFix_arm( FT_Int32 a, |
346 FT_Int32 b ) |
347 FT_Int32 b ) |
347 { |
348 { |
348 register FT_Int32 t, t2; |
349 register FT_Int32 t, t2; |
349 |
350 |
350 <<<<<<< Updated upstream |
|
351 |
351 |
352 __asm__ __volatile__ ( |
352 __asm__ __volatile__ ( |
353 "smull %1, %2, %4, %3\n\t" /* (lo=%1,hi=%2) = a*b */ |
353 "smull %1, %2, %4, %3\n\t" /* (lo=%1,hi=%2) = a*b */ |
354 "mov %0, %2, asr #31\n\t" /* %0 = (hi >> 31) */ |
354 "mov %0, %2, asr #31\n\t" /* %0 = (hi >> 31) */ |
355 "add %0, %0, #0x8000\n\t" /* %0 += 0x8000 */ |
355 "add %0, %0, #0x8000\n\t" /* %0 += 0x8000 */ |
356 "adds %1, %1, %0\n\t" /* %1 += %0 */ |
356 "adds %1, %1, %0\n\t" /* %1 += %0 */ |
357 "adc %2, %2, #0\n\t" /* %2 += carry */ |
357 "adc %2, %2, #0\n\t" /* %2 += carry */ |
358 "mov %0, %1, lsr #16\n\t" /* %0 = %1 >> 16 */ |
358 "mov %0, %1, lsr #16\n\t" /* %0 = %1 >> 16 */ |
359 "orr %0, %0, %2, lsl #16\n\t" /* %0 |= %2 << 16 */ |
359 "orr %0, %0, %2, lsl #16\n\t" /* %0 |= %2 << 16 */ |
360 ======= |
|
361 #warning Should this be __asm__ ? |
|
362 asm __volatile__ ( |
|
363 "smull %1, %2, %4, %3\n\t" /* (lo=%1,hi=%2) = a*b */ |
|
364 "mov %0, %2, asr #31\n\t" /* %0 = (hi >> 31) */ |
|
365 "add %0, %0, #0x8000\n\t" /* %0 += 0x8000 */ |
|
366 "adds %1, %1, %0\n\t" /* %1 += %0 */ |
|
367 "adc %2, %2, #0\n\t" /* %2 += carry */ |
|
368 "mov %0, %1, lsr #16\n\t" /* %0 = %1 >> 16 */ |
|
369 "orr %0, %2, lsl #16\n\t" /* %0 |= %2 << 16 */ |
|
370 >>>>>>> Stashed changes |
|
371 : "=r"(a), "=&r"(t2), "=&r"(t) |
360 : "=r"(a), "=&r"(t2), "=&r"(t) |
372 : "r"(a), "r"(b) ); |
361 : "r"(a), "r"(b) ); |
373 return a; |
362 return a; |
374 } |
363 } |
375 |
364 |