Files
2025-02-Numerical/lib/nr/cpp/recipes/mpops.cpp
2025-09-12 18:55:25 +09:00

130 lines
2.1 KiB
C++

#include "nr.h"
namespace {
unsigned char lobyte(unsigned short x)
{return (x & 0xff);}
unsigned char hibyte(unsigned short x)
{return ((x >> 8) & 0xff);}
}
void NR::mpadd(Vec_O_UCHR &w, Vec_I_UCHR &u, Vec_I_UCHR &v)
{
int j,n_min,p_min;
unsigned short ireg=0;
int n=u.size();
int m=v.size();
int p=w.size();
n_min=MIN(n,m);
p_min=MIN(n_min,p-1);
for (j=p_min-1;j>=0;j--) {
ireg=u[j]+v[j]+hibyte(ireg);
w[j+1]=lobyte(ireg);
}
w[0]=hibyte(ireg);
if (p > p_min+1)
for (j=p_min+1;j<p;j++) w[j]=0;
}
void NR::mpsub(int &is, Vec_O_UCHR &w, Vec_I_UCHR &u, Vec_I_UCHR &v)
{
int j,n_min,p_min;
unsigned short ireg=256;
int n=u.size();
int m=v.size();
int p=w.size();
n_min=MIN(n,m);
p_min=MIN(n_min,p);
for (j=p_min-1;j>=0;j--) {
ireg=255+u[j]-v[j]+hibyte(ireg);
w[j]=lobyte(ireg);
}
is=hibyte(ireg)-1;
if (p > p_min)
for (j=p_min;j<p;j++) w[j]=0;
}
void NR::mpsad(Vec_O_UCHR &w, Vec_I_UCHR &u, const int iv)
{
int j;
unsigned short ireg;
int n=u.size();
int p=w.size();
ireg=256*iv;
for (j=n-1;j>=0;j--) {
ireg=u[j]+hibyte(ireg);
if (j+1 < p) w[j+1]=lobyte(ireg);
}
w[0]=hibyte(ireg);
for (j=n+1;j<p;j++) w[j]=0;
}
void NR::mpsmu(Vec_O_UCHR &w, Vec_I_UCHR &u, const int iv)
{
int j;
unsigned short ireg=0;
int n=u.size();
int p=w.size();
for (j=n-1;j>=0;j--) {
ireg=u[j]*iv+hibyte(ireg);
if (j < p-1) w[j+1]=lobyte(ireg);
}
w[0]=hibyte(ireg);
for (j=n+1;j<p;j++) w[j]=0;
}
void NR::mpsdv(Vec_O_UCHR &w, Vec_I_UCHR &u, const int iv, int &ir)
{
int i,j,p_min;
int n=u.size();
int p=w.size();
p_min=MIN(n,p);
ir=0;
for (j=0;j<p_min;j++) {
i=256*ir+u[j];
w[j]=(unsigned char) (i/iv);
ir=i % iv;
}
if (p > p_min)
for (j=p_min;j<p;j++) w[j]=0;
}
void NR::mpneg(Vec_IO_UCHR &u)
{
int j;
unsigned short ireg=256;
int n=u.size();
for (j=n-1;j>=0;j--) {
ireg=255-u[j]+hibyte(ireg);
u[j]=lobyte(ireg);
}
}
void NR::mpmov(Vec_O_UCHR &u, Vec_I_UCHR &v)
{
int j,n_min;
int n=u.size();
int m=v.size();
n_min=MIN(n,m);
for (j=0;j<n_min;j++) u[j]=v[j];
if (n > n_min)
for(j=n_min;j<n-1;j++) u[j]=0;
}
void NR::mplsh(Vec_IO_UCHR &u)
{
int j;
int n=u.size();
for (j=0;j<n-1;j++) u[j]=u[j+1];
u[n-1]=0;
}