Main Page | Directories | File List | Globals

math64.c

Go to the documentation of this file.
00001 /*
00002  * kernel_libs/math/math64.c
00003  *
00004  * Copyright (c) 2003-2004 Lukasz Dembinski <dembol@nasa.com.pl>
00005  * All Rights Reserved
00006  * 
00007  * Date:        2004/01
00008  * Author:      Lukasz Dembinski
00009  * Info:        math64.c core file
00010  * Contact:     mailto: <dembol@nasa.com.pl>
00011  *
00012  */
00013 
00014 #include <agnix/agnix.h>
00015 #include <agnix/adi/chips/cpu.h>
00016 #include <agnix/console.h>
00017 
00018 void add_64_reg(u32 *value, u32 *op1, u32 *op2)
00019 {
00020     __asm__ (
00021     "  addl (%1), %%ebx\t\n"
00022     "  adcl 4(%1), %%ecx\t\n"
00023     "  movl %%ebx, (%0)\t\n"
00024     "  movl %%ecx, 4(%0)\t\n"
00025     :
00026     :"r"(value), "r"(op2), "b"(*op1), "c"(*(op1 + 4))
00027     );
00028 }
00029 
00030 void add_64_xmm2(u32 *value, u32 *op1, u32 *op2)
00031 {
00032     __asm__ __volatile__ (
00033     "  movq (%1), %%mm0\t\n"
00034     "  movq (%2), %%mm1\t\n"
00035     "  paddq %%mm0, %%mm1\t\n"
00036     "  movq %%mm0, (%0)"
00037     :
00038     :"r"(value), "r"(op1), "r"(op2)
00039     );
00040 }
00041 
00042 void add_64_64(u32 *value, u32 *op1, u32 *op2)
00043 {
00044     if (cpu_capable(X86_FEATURE_XMM2))
00045         add_64_xmm2(value, op1, op2);
00046     else
00047         add_64_reg(value, op1, op2); 
00048 }
00049 
00050 void add_64_32(u32 *value, u32 *op1, u32 op2)
00051 {
00052     __asm__ (
00053     "  addl %%eax, %%ebx\t\n"
00054     "  adcl $0, %%ecx\t\n"
00055     "  movl %%ebx, (%0)\t\n"
00056     "  movl %%ecx, 4(%0)\t\n"
00057     :
00058     :"r"(value), "a"(op2), "b"(*op1), "c"(*(op1 + 1))
00059     );
00060 }
00061 
00062 void sub_64_reg(u32 *value, u32 *op1, u32 *op2)
00063 {
00064     __asm__ (
00065     "  subl (%1), %%ebx\t\n"
00066     "  sbbl 4(%1), %%ecx\t\n"
00067     "  movl %%ebx, (%0)\t\n"
00068     "  movl %%ecx, 4(%0)\t\n"
00069     :
00070     :"r"(value), "r"(op2), "b"(*op1), "c"(*(op1 + 1))
00071     );
00072 }
00073 
00074 void sub_64_xmm2(u32 *value, u32 *op1, u32 *op2)
00075 {
00076     __asm__ __volatile__ (
00077     
00078     "  movq (%1), %%mm0\t\n"
00079     "  movq (%2), %%mm1\t\n"
00080     "  psubq %%mm0, %%mm1\t\n"
00081     "  movq %%mm0, (%0)"
00082     
00083     :"=r"(value)
00084     :"r"(op1), "r"(op2)
00085     );
00086 }
00087 
00088 void sub_64_64(u32 *value, u32 *op1, u32 *op2)
00089 {
00090     if (cpu_capable(X86_FEATURE_XMM2))
00091         sub_64_xmm2(value, op1, op2);
00092     else
00093         sub_64_reg(value, op1, op2); 
00094 }
00095 
00096 void sub_64_32(u32 *value, u32 *op1, u32 op2)
00097 {
00098     __asm__ (
00099     "  subl %%eax, %%ebx\t\n"
00100     "  sbbl $0, %%ecx\t\n"
00101     "  movl %%ebx, (%0)\t\n"
00102     "  movl %%ecx, 4(%0)\t\n"
00103     :
00104     :"r"(value), "a"(op2), "b"(*op1), "c"(*(op1 + 1))
00105     );
00106 }
00107 
00108 /* 64 bit divide */
00109 void div_64_32(u32 *value, u32 *op1, u32 op2)
00110 {
00111     __asm__ __volatile__ (
00112     
00113     "  divl %%ecx"
00114     
00115     :"=a"(*value)
00116     :"a"(op1[0]), "d"(op1[1]), "c"(op2)
00117     );
00118 }
00119 
00120 /* 32 bit mul */
00121 void mul_32_32(u32 *value, u32 op1, u32 op2)
00122 {
00123     __asm__ __volatile__ (
00124     "  mull %%ecx"
00125     :"=a"(value[0]), "=d"(value[1])
00126     :"a"(op1), "c"(op2)
00127     );
00128 }
00129 
Dokumentacje wygenerowano programem Doxygen 1.4.2 dla projektu Agnix