libc and ape support for amd64
This commit is contained in:
parent
d4fb753c9c
commit
ed9e9f98e9
51 changed files with 2016 additions and 0 deletions
80
amd64/include/ape/float.h
Normal file
80
amd64/include/ape/float.h
Normal file
|
@ -0,0 +1,80 @@
|
|||
#ifndef __FLOAT
|
||||
#define __FLOAT
|
||||
/* IEEE, default rounding */
|
||||
|
||||
#define FLT_ROUNDS 1
|
||||
#define FLT_RADIX 2
|
||||
|
||||
#define FLT_DIG 6
|
||||
#define FLT_EPSILON 1.19209290e-07
|
||||
#define FLT_MANT_DIG 24
|
||||
#define FLT_MAX 3.40282347e+38
|
||||
#define FLT_MAX_10_EXP 38
|
||||
#define FLT_MAX_EXP 128
|
||||
#define FLT_MIN 1.17549435e-38
|
||||
#define FLT_MIN_10_EXP -37
|
||||
#define FLT_MIN_EXP -125
|
||||
|
||||
#define DBL_DIG 15
|
||||
#define DBL_EPSILON 2.2204460492503131e-16
|
||||
#define DBL_MANT_DIG 53
|
||||
#define DBL_MAX 1.797693134862315708145e+308
|
||||
#define DBL_MAX_10_EXP 308
|
||||
#define DBL_MAX_EXP 1024
|
||||
#define DBL_MIN 2.225073858507201383090233e-308
|
||||
#define DBL_MIN_10_EXP -307
|
||||
#define DBL_MIN_EXP -1021
|
||||
#define LDBL_MANT_DIG DBL_MANT_DIG
|
||||
#define LDBL_EPSILON DBL_EPSILON
|
||||
#define LDBL_DIG DBL_DIG
|
||||
#define LDBL_MIN_EXP DBL_MIN_EXP
|
||||
#define LDBL_MIN DBL_MIN
|
||||
#define LDBL_MIN_10_EXP DBL_MIN_10_EXP
|
||||
#define LDBL_MAX_EXP DBL_MAX_EXP
|
||||
#define LDBL_MAX DBL_MAX
|
||||
#define LDBL_MAX_10_EXP DBL_MAX_10_EXP
|
||||
|
||||
typedef union FPdbleword FPdbleword;
|
||||
union FPdbleword
|
||||
{
|
||||
double x;
|
||||
struct { /* little endian */
|
||||
long lo;
|
||||
long hi;
|
||||
};
|
||||
};
|
||||
|
||||
#ifdef _RESEARCH_SOURCE
|
||||
/* define stuff needed for floating conversion */
|
||||
#define IEEE_8087 1
|
||||
#define Sudden_Underflow 1
|
||||
#endif
|
||||
#ifdef _PLAN9_SOURCE
|
||||
/* MXCSR */
|
||||
/* fcr */
|
||||
#define FPFTZ (1<<15) /* amd64 */
|
||||
#define FPINEX (1<<12)
|
||||
#define FPUNFL (1<<11)
|
||||
#define FPOVFL (1<<10)
|
||||
#define FPZDIV (1<<9)
|
||||
#define FPDNRM (1<<8) /* amd64 */
|
||||
#define FPINVAL (1<<7)
|
||||
#define FPDAZ (1<<6) /* amd64 */
|
||||
#define FPRNR (0<<13)
|
||||
#define FPRZ (3<<13)
|
||||
#define FPRPINF (2<<13)
|
||||
#define FPRNINF (1<<13)
|
||||
#define FPRMASK (3<<13)
|
||||
#define FPPEXT 0
|
||||
#define FPPSGL 0
|
||||
#define FPPDBL 0
|
||||
#define FPPMASK 0
|
||||
/* fsr */
|
||||
#define FPAINEX (1<<5)
|
||||
#define FPAUNFL (1<<4)
|
||||
#define FPAOVFL (1<<3)
|
||||
#define FPAZDIV (1<<2)
|
||||
#define FPADNRM (1<<1) /* not in plan 9 */
|
||||
#define FPAINVAL (1<<0)
|
||||
#endif
|
||||
#endif /* __FLOAT */
|
21
amd64/include/ape/inttypes.h
Normal file
21
amd64/include/ape/inttypes.h
Normal file
|
@ -0,0 +1,21 @@
|
|||
#ifndef _SUSV2_SOURCE
|
||||
#error "inttypes.h is SUSV2"
|
||||
#endif
|
||||
|
||||
#ifndef _INTTYPES_H_
|
||||
#define _INTTYPES_H_ 1
|
||||
|
||||
|
||||
typedef char int8_t;
|
||||
typedef short int16_t;
|
||||
typedef int int32_t;
|
||||
typedef long long int64_t;
|
||||
typedef unsigned char uint8_t;
|
||||
typedef unsigned short uint16_t;
|
||||
typedef unsigned int uint32_t;
|
||||
typedef unsigned long long uint64_t;
|
||||
|
||||
typedef long long intptr_t;
|
||||
typedef unsigned long long uintptr_t;
|
||||
|
||||
#endif
|
78
amd64/include/ape/math.h
Normal file
78
amd64/include/ape/math.h
Normal file
|
@ -0,0 +1,78 @@
|
|||
#ifndef __MATH
|
||||
#define __MATH
|
||||
#pragma lib "/$M/lib/ape/libap.a"
|
||||
|
||||
/* a HUGE_VAL appropriate for IEEE double-precision */
|
||||
/* the correct value, 1.797693134862316e+308, causes a ken overflow */
|
||||
#define HUGE_VAL 1.79769313486231e+308
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
extern double acos(double);
|
||||
extern double asin(double);
|
||||
extern double atan(double);
|
||||
extern double atan2(double, double);
|
||||
extern double cos(double);
|
||||
extern double hypot(double, double);
|
||||
extern double sin(double);
|
||||
extern double tan(double);
|
||||
extern double cosh(double);
|
||||
extern double sinh(double);
|
||||
extern double tanh(double);
|
||||
extern double exp(double);
|
||||
extern double frexp(double, int *);
|
||||
extern double ldexp(double, int);
|
||||
extern double log(double);
|
||||
extern double log10(double);
|
||||
extern double modf(double, double *);
|
||||
extern double pow(double, double);
|
||||
extern double sqrt(double);
|
||||
extern double ceil(double);
|
||||
extern double fabs(double);
|
||||
extern double floor(double);
|
||||
extern double fmod(double, double);
|
||||
extern double NaN(void);
|
||||
extern int isNaN(double);
|
||||
extern double Inf(int);
|
||||
extern int isInf(double, int);
|
||||
|
||||
#ifdef _RESEARCH_SOURCE
|
||||
/* does >> treat left operand as unsigned ? */
|
||||
#define Unsigned_Shifts 1
|
||||
#define M_E 2.7182818284590452354 /* e */
|
||||
#define M_LOG2E 1.4426950408889634074 /* log 2e */
|
||||
#define M_LOG10E 0.43429448190325182765 /* log 10e */
|
||||
#define M_LN2 0.69314718055994530942 /* log e2 */
|
||||
#define M_LN10 2.30258509299404568402 /* log e10 */
|
||||
#define M_PI 3.14159265358979323846 /* pi */
|
||||
#define M_PI_2 1.57079632679489661923 /* pi/2 */
|
||||
#define M_PI_4 0.78539816339744830962 /* pi/4 */
|
||||
#define M_1_PI 0.31830988618379067154 /* 1/pi */
|
||||
#define M_2_PI 0.63661977236758134308 /* 2/pi */
|
||||
#define M_2_SQRTPI 1.12837916709551257390 /* 2/sqrt(pi) */
|
||||
#define M_SQRT2 1.41421356237309504880 /* sqrt(2) */
|
||||
#define M_SQRT1_2 0.70710678118654752440 /* 1/sqrt(2) */
|
||||
|
||||
extern double hypot(double, double);
|
||||
extern double erf(double);
|
||||
extern double erfc(double);
|
||||
extern double j0(double);
|
||||
extern double y0(double);
|
||||
extern double j1(double);
|
||||
extern double y1(double);
|
||||
extern double jn(int, double);
|
||||
extern double yn(int, double);
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#define isnan(x) isNaN(x)
|
||||
#define isinf(x) isInf(x, 0)
|
||||
|
||||
#endif /* __MATH */
|
18
amd64/include/ape/stdarg.h
Normal file
18
amd64/include/ape/stdarg.h
Normal file
|
@ -0,0 +1,18 @@
|
|||
#ifndef __STDARG
|
||||
#define __STDARG
|
||||
|
||||
typedef char *va_list;
|
||||
|
||||
#define va_start(list, start) list = (sizeof(start)<8 ? (char *)((long long *)&(start)+1) : \
|
||||
(char *)(&(start)+1))
|
||||
#define va_end(list)
|
||||
#define va_arg(list, mode)\
|
||||
((sizeof(mode) == 1)?\
|
||||
((mode*)(list += 8))[-8]:\
|
||||
(sizeof(mode) == 2)?\
|
||||
((mode*)(list += 8))[-4]:\
|
||||
(sizeof(mode) == 4)?\
|
||||
((mode*)(list += 8))[-2]:\
|
||||
((mode*)(list += sizeof(mode)))[-1])
|
||||
|
||||
#endif /* __STDARG */
|
38
amd64/include/ape/ureg.h
Normal file
38
amd64/include/ape/ureg.h
Normal file
|
@ -0,0 +1,38 @@
|
|||
#ifndef __UREG_H
|
||||
#define __UREG_H
|
||||
#if !defined(_PLAN9_SOURCE)
|
||||
This header file is an extension to ANSI/POSIX
|
||||
#endif
|
||||
|
||||
struct Ureg {
|
||||
unsigned long long ax;
|
||||
unsigned long long bx;
|
||||
unsigned long long cx;
|
||||
unsigned long long dx;
|
||||
unsigned long long si;
|
||||
unsigned long long di;
|
||||
unsigned long long bp;
|
||||
unsigned long long r8;
|
||||
unsigned long long r9;
|
||||
unsigned long long r10;
|
||||
unsigned long long r11;
|
||||
unsigned long long r12;
|
||||
unsigned long long r13;
|
||||
unsigned long long r14;
|
||||
unsigned long long r15;
|
||||
|
||||
unsigned short ds;
|
||||
unsigned short es;
|
||||
unsigned short fs;
|
||||
unsigned short gs;
|
||||
|
||||
unsigned long long type;
|
||||
unsigned long long error; /* error code (or zero) */
|
||||
unsigned long long pc; /* pc */
|
||||
unsigned long long cs; /* old context */
|
||||
unsigned long long flags; /* old flags */
|
||||
unsigned long long sp; /* sp */
|
||||
unsigned long long ss; /* old stack segment */
|
||||
};
|
||||
|
||||
#endif
|
3
sys/src/ape/lib/9/amd64/getcallerpc.s
Normal file
3
sys/src/ape/lib/9/amd64/getcallerpc.s
Normal file
|
@ -0,0 +1,3 @@
|
|||
TEXT getcallerpc(SB), 1, $0
|
||||
MOVQ -8(RARG), AX
|
||||
RET
|
38
sys/src/ape/lib/9/amd64/getfcr.s
Normal file
38
sys/src/ape/lib/9/amd64/getfcr.s
Normal file
|
@ -0,0 +1,38 @@
|
|||
|
||||
TEXT setfcr(SB), $4
|
||||
XORL $(0x3F<<7),RARG /* bits are cleared in csr to enable them */
|
||||
ANDL $0xFFC0, RARG /* just the fcr bits */
|
||||
WAIT /* is this needed? */
|
||||
STMXCSR 0(SP)
|
||||
MOVL 0(SP), AX
|
||||
ANDL $~0x3F, AX
|
||||
ORL RARG, AX
|
||||
MOVL AX, 0(SP)
|
||||
LDMXCSR 0(SP)
|
||||
RET
|
||||
|
||||
TEXT getfcr(SB), $4
|
||||
WAIT
|
||||
STMXCSR 0(SP)
|
||||
MOVWLZX 0(SP), AX
|
||||
ANDL $0xFFC0, AX
|
||||
XORL $(0x3F<<7),AX
|
||||
RET
|
||||
|
||||
TEXT getfsr(SB), $4
|
||||
WAIT
|
||||
STMXCSR 0(SP)
|
||||
MOVL 0(SP), AX
|
||||
ANDL $0x3F, AX
|
||||
RET
|
||||
|
||||
TEXT setfsr(SB), $4
|
||||
ANDL $0x3F, RARG
|
||||
WAIT
|
||||
STMXCSR 0(SP)
|
||||
MOVL 0(SP), AX
|
||||
ANDL $~0x3F, AX
|
||||
ORL RARG, AX
|
||||
MOVL AX, 0(SP)
|
||||
LDMXCSR 0(SP)
|
||||
RET
|
11
sys/src/ape/lib/ap/amd64/_seek.c
Normal file
11
sys/src/ape/lib/ap/amd64/_seek.c
Normal file
|
@ -0,0 +1,11 @@
|
|||
extern long __SEEK(long long*, int, long long, int);
|
||||
|
||||
long long
|
||||
_SEEK(int fd, long long o, int p)
|
||||
{
|
||||
long long l;
|
||||
|
||||
if(__SEEK(&l, fd, o, p) < 0)
|
||||
l = -1;
|
||||
return l;
|
||||
}
|
5
sys/src/ape/lib/ap/amd64/cycles.s
Normal file
5
sys/src/ape/lib/ap/amd64/cycles.s
Normal file
|
@ -0,0 +1,5 @@
|
|||
TEXT _cycles(SB),1,$0 /* time stamp counter; cycles since power up */
|
||||
RDTSC
|
||||
MOVL AX, 0(RARG) /* lo */
|
||||
MOVL DX, 4(RARG) /* hi */
|
||||
RET
|
26
sys/src/ape/lib/ap/amd64/lock.c
Normal file
26
sys/src/ape/lib/ap/amd64/lock.c
Normal file
|
@ -0,0 +1,26 @@
|
|||
#define _LOCK_EXTENSION
|
||||
#include "../plan9/sys9.h"
|
||||
#include <lock.h>
|
||||
|
||||
int tas(int*);
|
||||
|
||||
void
|
||||
lock(Lock *lk)
|
||||
{
|
||||
while(tas(&lk->val))
|
||||
_SLEEP(0);
|
||||
}
|
||||
|
||||
int
|
||||
canlock(Lock *lk)
|
||||
{
|
||||
if(tas(&lk->val))
|
||||
return 0;
|
||||
return 1;
|
||||
}
|
||||
|
||||
void
|
||||
unlock(Lock *lk)
|
||||
{
|
||||
lk->val = 0;
|
||||
}
|
26
sys/src/ape/lib/ap/amd64/main9.s
Normal file
26
sys/src/ape/lib/ap/amd64/main9.s
Normal file
|
@ -0,0 +1,26 @@
|
|||
#define NPRIVATES 16
|
||||
|
||||
GLOBL _tos(SB), $8
|
||||
GLOBL _errnoloc(SB), $8
|
||||
GLOBL _privates(SB), $8
|
||||
GLOBL _nprivates(SB), $8
|
||||
|
||||
TEXT _main(SB), 1, $(32+NPRIVATES*8)
|
||||
|
||||
/* _tos = arg */
|
||||
MOVQ AX, _tos(SB)
|
||||
LEAQ 24(SP), AX
|
||||
MOVQ AX, _errnoloc(SB)
|
||||
LEAQ 32(SP), AX
|
||||
MOVQ AX, _privates(SB)
|
||||
MOVQ $NPRIVATES, _nprivates(SB)
|
||||
CALL _envsetup(SB)
|
||||
MOVL inargc-8(FP), RARG
|
||||
LEAQ inargv+0(FP), AX
|
||||
MOVQ AX, 8(SP)
|
||||
MOVQ environ(SB), AX
|
||||
MOVQ AX, 16(SP)
|
||||
CALL main(SB)
|
||||
MOVQ AX, RARG
|
||||
CALL exit(SB)
|
||||
RET
|
45
sys/src/ape/lib/ap/amd64/main9p.s
Normal file
45
sys/src/ape/lib/ap/amd64/main9p.s
Normal file
|
@ -0,0 +1,45 @@
|
|||
#define NPRIVATES 16
|
||||
|
||||
GLOBL _tos(SB), $8
|
||||
GLOBL _privates(SB), $8
|
||||
GLOBL _nprivates(SB), $8
|
||||
|
||||
TEXT _mainp(SB), 1, $(3*8+NPRIVATES*8)
|
||||
|
||||
/* _tos = arg */
|
||||
MOVQ AX, _tos(SB)
|
||||
LEAQ 8(SP), AX
|
||||
MOVQ AX, _privates(SB)
|
||||
MOVQ $NPRIVATES, _nprivates(SB)
|
||||
|
||||
/* _profmain(); */
|
||||
CALL _profmain(SB)
|
||||
|
||||
/* _tos->prof.pp = _tos->prof.next; */
|
||||
MOVQ _tos+0(SB),DX
|
||||
MOVQ 4(DX),CX
|
||||
MOVQ CX,(DX)
|
||||
|
||||
CALL _envsetup(SB)
|
||||
|
||||
/* main(argc, argv, environ); */
|
||||
MOVL inargc-8(FP), RARG
|
||||
LEAQ inargv+0(FP), AX
|
||||
MOVQ AX, 8(SP)
|
||||
MOVQ environ(SB), AX
|
||||
MOVQ AX, 16(SP)
|
||||
CALL main(SB)
|
||||
|
||||
loop:
|
||||
MOVL AX, RARG
|
||||
CALL exit(SB)
|
||||
MOVQ $_profin(SB), AX /* force loading of profile */
|
||||
MOVL $0, AX
|
||||
JMP loop
|
||||
|
||||
TEXT _savearg(SB), 1, $0
|
||||
RET
|
||||
|
||||
TEXT _callpc(SB), 1, $0
|
||||
MOVQ 8(RARG), AX
|
||||
RET
|
20
sys/src/ape/lib/ap/amd64/mkfile
Normal file
20
sys/src/ape/lib/ap/amd64/mkfile
Normal file
|
@ -0,0 +1,20 @@
|
|||
APE=/sys/src/ape
|
||||
objtype=amd64
|
||||
<$APE/config
|
||||
LIB=/$objtype/lib/ape/libap.a
|
||||
OFILES=\
|
||||
_seek.$O\
|
||||
cycles.$O\
|
||||
lock.$O\
|
||||
main9.$O\
|
||||
main9p.$O\
|
||||
notetramp.$O\
|
||||
setjmp.$O\
|
||||
strchr.$O\
|
||||
strlen.$O\
|
||||
tas.$O\
|
||||
|
||||
</sys/src/cmd/mksyslib
|
||||
|
||||
CFLAGS=-c -D_POSIX_SOURCE -D_PLAN9_SOURCE
|
||||
|
81
sys/src/ape/lib/ap/amd64/notetramp.c
Normal file
81
sys/src/ape/lib/ap/amd64/notetramp.c
Normal file
|
@ -0,0 +1,81 @@
|
|||
#include "../plan9/lib.h"
|
||||
#include "../plan9/sys9.h"
|
||||
#include <signal.h>
|
||||
#include <setjmp.h>
|
||||
|
||||
/* A stack to hold pcs when signals nest */
|
||||
#define MAXSIGSTACK 20
|
||||
typedef struct Pcstack Pcstack;
|
||||
static struct Pcstack {
|
||||
int sig;
|
||||
void (*hdlr)(int, char*, Ureg*);
|
||||
unsigned long long restorepc;
|
||||
Ureg *u;
|
||||
} pcstack[MAXSIGSTACK];
|
||||
static int nstack = 0;
|
||||
|
||||
static void notecont(Ureg*, char*);
|
||||
|
||||
void
|
||||
_notetramp(int sig, void (*hdlr)(int, char*, Ureg*), Ureg *u)
|
||||
{
|
||||
Pcstack *p;
|
||||
|
||||
if(nstack >= MAXSIGSTACK)
|
||||
_NOTED(1); /* nesting too deep; just do system default */
|
||||
p = &pcstack[nstack];
|
||||
p->restorepc = u->pc;
|
||||
p->sig = sig;
|
||||
p->hdlr = hdlr;
|
||||
p->u = u;
|
||||
nstack++;
|
||||
u->pc = (unsigned long long) notecont;
|
||||
_NOTED(2); /* NSAVE: clear note but hold state */
|
||||
}
|
||||
|
||||
static void
|
||||
notecont(Ureg *u, char *s)
|
||||
{
|
||||
Pcstack *p;
|
||||
void(*f)(int, char*, Ureg*);
|
||||
|
||||
p = &pcstack[nstack-1];
|
||||
f = p->hdlr;
|
||||
u->pc = p->restorepc;
|
||||
nstack--;
|
||||
(*f)(p->sig, s, u);
|
||||
_NOTED(3); /* NRSTR */
|
||||
}
|
||||
|
||||
#define JMPBUFPC 1
|
||||
#define JMPBUFSP 0
|
||||
|
||||
extern sigset_t _psigblocked;
|
||||
|
||||
typedef struct {
|
||||
sigset_t set;
|
||||
sigset_t blocked;
|
||||
unsigned long long jmpbuf[2];
|
||||
} sigjmp_buf_amd64;
|
||||
|
||||
void
|
||||
siglongjmp(sigjmp_buf j, int ret)
|
||||
{
|
||||
struct Ureg *u;
|
||||
sigjmp_buf_amd64 *jb;
|
||||
|
||||
jb = (sigjmp_buf_amd64*)j;
|
||||
|
||||
if(jb->set)
|
||||
_psigblocked = jb->blocked;
|
||||
if(nstack == 0 || pcstack[nstack-1].u->sp > jb->jmpbuf[JMPBUFSP])
|
||||
longjmp((void*)jb->jmpbuf, ret);
|
||||
u = pcstack[nstack-1].u;
|
||||
nstack--;
|
||||
u->ax = ret;
|
||||
if(ret == 0)
|
||||
u->ax = 1;
|
||||
u->pc = jb->jmpbuf[JMPBUFPC];
|
||||
u->sp = jb->jmpbuf[JMPBUFSP] + 8;
|
||||
_NOTED(3); /* NRSTR */
|
||||
}
|
27
sys/src/ape/lib/ap/amd64/setjmp.s
Normal file
27
sys/src/ape/lib/ap/amd64/setjmp.s
Normal file
|
@ -0,0 +1,27 @@
|
|||
TEXT longjmp(SB), $0
|
||||
MOVL r+8(FP), AX
|
||||
CMPL AX, $0
|
||||
JNE ok /* ansi: "longjmp(0) => longjmp(1)" */
|
||||
MOVL $1, AX /* bless their pointed heads */
|
||||
ok:
|
||||
MOVQ 0(RARG), SP /* restore sp */
|
||||
MOVQ 8(RARG), BX /* put return pc on the stack */
|
||||
MOVQ BX, 0(SP)
|
||||
RET
|
||||
|
||||
TEXT setjmp(SB), $0
|
||||
MOVQ SP, 0(RARG) /* store sp */
|
||||
MOVQ 0(SP), BX /* store return pc */
|
||||
MOVQ BX, 8(RARG)
|
||||
MOVL $0, AX /* return 0 */
|
||||
RET
|
||||
|
||||
TEXT sigsetjmp(SB), $0
|
||||
MOVL savemask+8(FP), BX
|
||||
MOVL BX, 0(RARG)
|
||||
MOVL $_psigblocked(SB), 4(RARG)
|
||||
MOVQ SP, 8(RARG) /* store sp */
|
||||
MOVQ 0(SP), BX /* store return pc */
|
||||
MOVQ BX, 16(RARG)
|
||||
MOVL $0, AX /* return 0 */
|
||||
RET
|
38
sys/src/ape/lib/ap/amd64/strchr.s
Normal file
38
sys/src/ape/lib/ap/amd64/strchr.s
Normal file
|
@ -0,0 +1,38 @@
|
|||
TEXT strchr(SB), $0
|
||||
|
||||
MOVQ RARG, DI
|
||||
MOVB c+8(FP), AX
|
||||
CMPB AX, $0
|
||||
JEQ l2 /**/
|
||||
|
||||
/*
|
||||
* char is not null
|
||||
*/
|
||||
l1:
|
||||
MOVB (DI), BX
|
||||
CMPB BX, $0
|
||||
JEQ ret0
|
||||
ADDQ $1, DI
|
||||
CMPB AX, BX
|
||||
JNE l1
|
||||
|
||||
MOVQ DI, AX
|
||||
SUBQ $1, AX
|
||||
RET
|
||||
|
||||
/*
|
||||
* char is null
|
||||
*/
|
||||
l2:
|
||||
MOVQ $-1, CX
|
||||
CLD
|
||||
|
||||
REPN; SCASB
|
||||
|
||||
MOVQ DI, AX
|
||||
SUBQ $1, AX
|
||||
RET
|
||||
|
||||
ret0:
|
||||
MOVQ $0, AX
|
||||
RET
|
16
sys/src/ape/lib/ap/amd64/strlen.s
Normal file
16
sys/src/ape/lib/ap/amd64/strlen.s
Normal file
|
@ -0,0 +1,16 @@
|
|||
TEXT strlen(SB),$0
|
||||
|
||||
MOVL $0, AX
|
||||
MOVQ $-1, CX
|
||||
CLD
|
||||
/*
|
||||
* look for end of string
|
||||
*/
|
||||
|
||||
MOVQ RARG, DI
|
||||
REPN; SCASB
|
||||
|
||||
MOVQ DI, AX
|
||||
SUBQ RARG, AX
|
||||
SUBQ $1, AX
|
||||
RET
|
5
sys/src/ape/lib/ap/amd64/tas.s
Normal file
5
sys/src/ape/lib/ap/amd64/tas.s
Normal file
|
@ -0,0 +1,5 @@
|
|||
TEXT tas(SB),$0
|
||||
|
||||
MOVL $0xdeadead,AX
|
||||
XCHGL AX,(RARG)
|
||||
RET
|
14
sys/src/libc/amd64/_seek.c
Normal file
14
sys/src/libc/amd64/_seek.c
Normal file
|
@ -0,0 +1,14 @@
|
|||
#include <u.h>
|
||||
#include <libc.h>
|
||||
|
||||
extern int _seek(vlong*, int, vlong, int);
|
||||
|
||||
vlong
|
||||
seek(int fd, vlong o, int p)
|
||||
{
|
||||
vlong l;
|
||||
|
||||
if(_seek(&l, fd, o, p) < 0)
|
||||
l = -1LL;
|
||||
return l;
|
||||
}
|
4
sys/src/libc/amd64/argv0.s
Normal file
4
sys/src/libc/amd64/argv0.s
Normal file
|
@ -0,0 +1,4 @@
|
|||
GLOBL argv0(SB), $8
|
||||
GLOBL _tos(SB), $8
|
||||
GLOBL _privates(SB), $8
|
||||
GLOBL _nprivates(SB), $4
|
69
sys/src/libc/amd64/atom.s
Normal file
69
sys/src/libc/amd64/atom.s
Normal file
|
@ -0,0 +1,69 @@
|
|||
TEXT ainc(SB), 1, $0 /* int ainc(int *); */
|
||||
ainclp:
|
||||
MOVL (RARG), AX /* exp */
|
||||
MOVL AX, BX
|
||||
INCL BX /* new */
|
||||
LOCK; CMPXCHGL BX, (RARG)
|
||||
JNZ ainclp
|
||||
MOVL BX, AX
|
||||
RET
|
||||
|
||||
TEXT adec(SB), 1, $0 /* int adec(int*); */
|
||||
adeclp:
|
||||
MOVL (RARG), AX
|
||||
MOVL AX, BX
|
||||
DECL BX
|
||||
LOCK; CMPXCHGL BX, (RARG)
|
||||
JNZ adeclp
|
||||
MOVL BX, AX
|
||||
RET
|
||||
|
||||
/*
|
||||
* int cas32(u32int *p, u32int ov, u32int nv);
|
||||
* int cas(uint *p, int ov, int nv);
|
||||
* int casl(ulong *p, ulong ov, ulong nv);
|
||||
*/
|
||||
|
||||
TEXT cas32(SB), 1, $0
|
||||
TEXT cas(SB), 1, $0
|
||||
TEXT casul(SB), 1, $0
|
||||
TEXT casl(SB), 1, $0 /* back compat */
|
||||
MOVL exp+8(FP), AX
|
||||
MOVL new+16(FP), BX
|
||||
LOCK; CMPXCHGL BX, (RARG)
|
||||
MOVL $1, AX /* use CMOVLEQ etc. here? */
|
||||
JNZ _cas32r0
|
||||
_cas32r1:
|
||||
RET
|
||||
_cas32r0:
|
||||
DECL AX
|
||||
RET
|
||||
|
||||
/*
|
||||
* int cas64(u64int *p, u64int ov, u64int nv);
|
||||
* int casp(void **p, void *ov, void *nv);
|
||||
*/
|
||||
|
||||
TEXT cas64(SB), 1, $0
|
||||
TEXT casp(SB), 1, $0
|
||||
MOVQ exp+8(FP), AX
|
||||
MOVQ new+16(FP), BX
|
||||
LOCK; CMPXCHGQ BX, (RARG)
|
||||
MOVL $1, AX /* use CMOVLEQ etc. here? */
|
||||
JNZ _cas64r0
|
||||
_cas64r1:
|
||||
RET
|
||||
_cas64r0:
|
||||
DECL AX
|
||||
RET
|
||||
|
||||
TEXT fas64(SB), 1, $-4
|
||||
TEXT fasp(SB), 1, $-4
|
||||
MOVQ p+8(FP), AX
|
||||
LOCK; XCHGQ AX, (RARG) /* */
|
||||
RET
|
||||
|
||||
TEXT fas32(SB), 1, $-4
|
||||
MOVL p+8(FP), AX
|
||||
LOCK; XCHGL AX, (RARG) /* */
|
||||
RET
|
5
sys/src/libc/amd64/cycles.s
Normal file
5
sys/src/libc/amd64/cycles.s
Normal file
|
@ -0,0 +1,5 @@
|
|||
TEXT cycles(SB),1,$0 /* time stamp counter; cycles since power up */
|
||||
RDTSC
|
||||
MOVL AX, 0(RARG) /* lo */
|
||||
MOVL DX, 4(RARG) /* hi */
|
||||
RET
|
3
sys/src/libc/amd64/getcallerpc.s
Normal file
3
sys/src/libc/amd64/getcallerpc.s
Normal file
|
@ -0,0 +1,3 @@
|
|||
TEXT getcallerpc(SB), 1, $0
|
||||
MOVQ -8(RARG), AX
|
||||
RET
|
38
sys/src/libc/amd64/getfcr.s
Normal file
38
sys/src/libc/amd64/getfcr.s
Normal file
|
@ -0,0 +1,38 @@
|
|||
|
||||
TEXT setfcr(SB), $4
|
||||
XORL $(0x3F<<7),RARG /* bits are cleared in csr to enable them */
|
||||
ANDL $0xFFC0, RARG /* just the fcr bits */
|
||||
WAIT /* is this needed? */
|
||||
STMXCSR 0(SP)
|
||||
MOVL 0(SP), AX
|
||||
ANDL $~0x3F, AX
|
||||
ORL RARG, AX
|
||||
MOVL AX, 0(SP)
|
||||
LDMXCSR 0(SP)
|
||||
RET
|
||||
|
||||
TEXT getfcr(SB), $4
|
||||
WAIT
|
||||
STMXCSR 0(SP)
|
||||
MOVWLZX 0(SP), AX
|
||||
ANDL $0xFFC0, AX
|
||||
XORL $(0x3F<<7),AX
|
||||
RET
|
||||
|
||||
TEXT getfsr(SB), $4
|
||||
WAIT
|
||||
STMXCSR 0(SP)
|
||||
MOVL 0(SP), AX
|
||||
ANDL $0x3F, AX
|
||||
RET
|
||||
|
||||
TEXT setfsr(SB), $4
|
||||
ANDL $0x3F, RARG
|
||||
WAIT
|
||||
STMXCSR 0(SP)
|
||||
MOVL 0(SP), AX
|
||||
ANDL $~0x3F, AX
|
||||
ORL RARG, AX
|
||||
MOVL AX, 0(SP)
|
||||
LDMXCSR 0(SP)
|
||||
RET
|
19
sys/src/libc/amd64/main9.s
Normal file
19
sys/src/libc/amd64/main9.s
Normal file
|
@ -0,0 +1,19 @@
|
|||
#define NPRIVATES 16
|
||||
|
||||
TEXT _main(SB), 1, $(2*8+NPRIVATES*8)
|
||||
MOVQ AX, _tos(SB)
|
||||
LEAQ 16(SP), AX
|
||||
MOVQ AX, _privates(SB)
|
||||
MOVL $NPRIVATES, _nprivates(SB)
|
||||
MOVL inargc-8(FP), RARG
|
||||
LEAQ inargv+0(FP), AX
|
||||
MOVQ AX, 8(SP)
|
||||
CALL main(SB)
|
||||
|
||||
loop:
|
||||
MOVQ $_exits<>(SB), RARG
|
||||
CALL exits(SB)
|
||||
JMP loop
|
||||
|
||||
DATA _exits<>+0(SB)/4, $"main"
|
||||
GLOBL _exits<>+0(SB), $5
|
41
sys/src/libc/amd64/main9p.s
Normal file
41
sys/src/libc/amd64/main9p.s
Normal file
|
@ -0,0 +1,41 @@
|
|||
#define NPRIVATES 16
|
||||
|
||||
TEXT _mainp(SB), 1, $(2*8+NPRIVATES*8)
|
||||
MOVQ AX, _tos(SB) /* _tos = arg */
|
||||
LEAQ 16(SP), AX
|
||||
MOVQ AX, _privates(SB)
|
||||
MOVL $NPRIVATES, _nprivates(SB)
|
||||
|
||||
CALL _profmain(SB) /* _profmain(); */
|
||||
|
||||
MOVQ _tos+0(SB), DX /* _tos->prof.pp = _tos->prof.next; */
|
||||
MOVQ 8(DX), CX
|
||||
MOVQ CX, (DX)
|
||||
|
||||
MOVL inargc-8(FP), RARG /* main(argc, argv); */
|
||||
LEAQ inargv+0(FP), AX
|
||||
MOVQ AX, 8(SP)
|
||||
CALL main(SB)
|
||||
|
||||
loop:
|
||||
MOVQ $_exits<>(SB), RARG
|
||||
CALL exits(SB)
|
||||
MOVQ $_profin(SB), AX /* force loading of profile */
|
||||
JMP loop
|
||||
|
||||
TEXT _savearg(SB), 1, $0
|
||||
MOVQ RARG, AX
|
||||
RET
|
||||
|
||||
TEXT _saveret(SB), 1, $0
|
||||
RET
|
||||
|
||||
TEXT _restorearg(SB), 1, $0
|
||||
RET /* we want RARG in RARG */
|
||||
|
||||
TEXT _callpc(SB), 1, $0
|
||||
MOVQ 8(RARG), AX
|
||||
RET
|
||||
|
||||
DATA _exits<>+0(SB)/4, $"main"
|
||||
GLOBL _exits<>+0(SB), $5
|
58
sys/src/libc/amd64/memccpy.s
Normal file
58
sys/src/libc/amd64/memccpy.s
Normal file
|
@ -0,0 +1,58 @@
|
|||
TEXT memccpy(SB),$0
|
||||
|
||||
MOVL n+24(FP), CX
|
||||
CMPL CX, $0
|
||||
JEQ none
|
||||
MOVQ p2+8(FP), DI
|
||||
MOVBLZX c+16(FP), AX
|
||||
CLD
|
||||
/*
|
||||
* find the character in the second string
|
||||
*/
|
||||
|
||||
REPN; SCASB
|
||||
JEQ found
|
||||
|
||||
/*
|
||||
* if not found, set count to 'n'
|
||||
*/
|
||||
none:
|
||||
MOVL $0, AX
|
||||
MOVL n+24(FP), BX
|
||||
JMP memcpy
|
||||
|
||||
/*
|
||||
* if found, set count to bytes thru character
|
||||
*/
|
||||
found:
|
||||
MOVQ DI, AX
|
||||
SUBQ p2+8(FP), AX
|
||||
MOVQ AX, BX
|
||||
ADDQ RARG, AX
|
||||
|
||||
/*
|
||||
* copy the memory
|
||||
*/
|
||||
|
||||
memcpy:
|
||||
MOVQ RARG, DI
|
||||
MOVQ p2+8(FP), SI
|
||||
/*
|
||||
* copy whole longs, if aligned
|
||||
*/
|
||||
MOVQ DI, DX
|
||||
ORQ SI, DX
|
||||
ANDL $3, DX
|
||||
JNE c3
|
||||
MOVL BX, CX
|
||||
SHRQ $2, CX
|
||||
REP; MOVSL
|
||||
/*
|
||||
* copy the rest, by bytes
|
||||
*/
|
||||
ANDL $3, BX
|
||||
c3:
|
||||
MOVL BX, CX
|
||||
REP; MOVSB
|
||||
|
||||
RET
|
23
sys/src/libc/amd64/memchr.s
Normal file
23
sys/src/libc/amd64/memchr.s
Normal file
|
@ -0,0 +1,23 @@
|
|||
TEXT memchr(SB),$0
|
||||
|
||||
MOVL n+16(FP), CX
|
||||
CMPL CX, $0
|
||||
JEQ none
|
||||
MOVQ RARG, DI
|
||||
MOVBLZX c+8(FP), AX
|
||||
CLD
|
||||
/*
|
||||
* SCASB is memchr instruction
|
||||
*/
|
||||
|
||||
REPN; SCASB
|
||||
JEQ found
|
||||
|
||||
none:
|
||||
MOVL $0, AX
|
||||
RET
|
||||
|
||||
found:
|
||||
MOVQ DI, AX
|
||||
SUBQ $1, AX
|
||||
RET
|
52
sys/src/libc/amd64/memcmp.s
Normal file
52
sys/src/libc/amd64/memcmp.s
Normal file
|
@ -0,0 +1,52 @@
|
|||
TEXT memcmp(SB),$0
|
||||
|
||||
MOVL n+16(FP), BX
|
||||
CMPL BX, $0
|
||||
JEQ none
|
||||
MOVQ RARG, DI
|
||||
MOVQ p2+8(FP), SI
|
||||
CLD
|
||||
MOVQ DI, CX
|
||||
ORQ SI, CX
|
||||
ANDL $3, CX
|
||||
JNE c3
|
||||
/*
|
||||
* first by longs
|
||||
*/
|
||||
|
||||
MOVL BX, CX
|
||||
SHRQ $2, CX
|
||||
|
||||
REP; CMPSL
|
||||
JNE found
|
||||
|
||||
/*
|
||||
* then by bytes
|
||||
*/
|
||||
ANDL $3, BX
|
||||
c3:
|
||||
MOVL BX, CX
|
||||
REP; CMPSB
|
||||
JNE found1
|
||||
|
||||
none:
|
||||
MOVQ $0, AX
|
||||
RET
|
||||
|
||||
/*
|
||||
* if long found,
|
||||
* back up and look by bytes
|
||||
*/
|
||||
found:
|
||||
MOVL $4, CX
|
||||
SUBQ CX, DI
|
||||
SUBQ CX, SI
|
||||
REP; CMPSB
|
||||
|
||||
found1:
|
||||
JLS lt
|
||||
MOVQ $-1, AX
|
||||
RET
|
||||
lt:
|
||||
MOVQ $1, AX
|
||||
RET
|
81
sys/src/libc/amd64/memcpy.s
Normal file
81
sys/src/libc/amd64/memcpy.s
Normal file
|
@ -0,0 +1,81 @@
|
|||
TEXT memcpy(SB), $0
|
||||
MOVQ RARG, DI
|
||||
MOVQ DI, AX /* return value */
|
||||
MOVQ p2+8(FP), SI
|
||||
MOVL n+16(FP), BX
|
||||
CMPL BX, $0
|
||||
JGT _ok
|
||||
JEQ _return /* nothing to do if n == 0 */
|
||||
MOVL $0, SI /* fault if n < 0 */
|
||||
|
||||
/*
|
||||
* check and set for backwards:
|
||||
* (p2 < p1) && ((p2+n) > p1)
|
||||
*/
|
||||
_ok:
|
||||
CMPQ SI, DI
|
||||
JGT _forward
|
||||
JEQ _return /* nothing to do if p2 == p1 */
|
||||
MOVQ SI, DX
|
||||
ADDQ BX, DX
|
||||
CMPQ DX, DI
|
||||
JGT _back
|
||||
|
||||
/*
|
||||
* copy whole longs if aligned
|
||||
*/
|
||||
_forward:
|
||||
CLD
|
||||
MOVQ SI, DX
|
||||
ORQ DI, DX
|
||||
ANDL $3, DX
|
||||
JNE c3f
|
||||
MOVQ BX, CX
|
||||
SHRQ $2, CX
|
||||
ANDL $3, BX
|
||||
REP; MOVSL
|
||||
|
||||
/*
|
||||
* copy the rest, by bytes
|
||||
*/
|
||||
JEQ _return /* flags set by above ANDL */
|
||||
c3f:
|
||||
MOVL BX, CX
|
||||
REP; MOVSB
|
||||
|
||||
RET
|
||||
|
||||
/*
|
||||
* whole thing backwards has
|
||||
* adjusted addresses
|
||||
*/
|
||||
_back:
|
||||
ADDQ BX, DI
|
||||
ADDQ BX, SI
|
||||
STD
|
||||
SUBQ $4, DI
|
||||
SUBQ $4, SI
|
||||
/*
|
||||
* copy whole longs, if aligned
|
||||
*/
|
||||
MOVQ DI, DX
|
||||
ORQ SI, DX
|
||||
ANDL $3, DX
|
||||
JNE c3b
|
||||
MOVL BX, CX
|
||||
SHRQ $2, CX
|
||||
ANDL $3, BX
|
||||
REP; MOVSL
|
||||
/*
|
||||
* copy the rest, by bytes
|
||||
*/
|
||||
JEQ _return /* flags set by above ANDL */
|
||||
|
||||
c3b:
|
||||
ADDQ $3, DI
|
||||
ADDQ $3, SI
|
||||
MOVL BX, CX
|
||||
REP; MOVSB
|
||||
|
||||
_return:
|
||||
RET
|
81
sys/src/libc/amd64/memmove.s
Normal file
81
sys/src/libc/amd64/memmove.s
Normal file
|
@ -0,0 +1,81 @@
|
|||
TEXT memmove(SB), $0
|
||||
MOVQ RARG, DI
|
||||
MOVQ DI, AX /* return value */
|
||||
MOVQ p2+8(FP), SI
|
||||
MOVL n+16(FP), BX
|
||||
CMPL BX, $0
|
||||
JGT _ok
|
||||
JEQ _return /* nothing to do if n == 0 */
|
||||
MOVL $0, SI /* fault if n < 0 */
|
||||
|
||||
/*
|
||||
* check and set for backwards:
|
||||
* (p2 < p1) && ((p2+n) > p1)
|
||||
*/
|
||||
_ok:
|
||||
CMPQ SI, DI
|
||||
JGT _forward
|
||||
JEQ _return /* nothing to do if p2 == p1 */
|
||||
MOVQ SI, DX
|
||||
ADDQ BX, DX
|
||||
CMPQ DX, DI
|
||||
JGT _back
|
||||
|
||||
/*
|
||||
* copy whole longs if aligned
|
||||
*/
|
||||
_forward:
|
||||
CLD
|
||||
MOVQ SI, DX
|
||||
ORQ DI, DX
|
||||
ANDL $3, DX
|
||||
JNE c3f
|
||||
MOVQ BX, CX
|
||||
SHRQ $2, CX
|
||||
ANDL $3, BX
|
||||
REP; MOVSL
|
||||
|
||||
/*
|
||||
* copy the rest, by bytes
|
||||
*/
|
||||
JEQ _return /* flags set by above ANDL */
|
||||
c3f:
|
||||
MOVL BX, CX
|
||||
REP; MOVSB
|
||||
|
||||
RET
|
||||
|
||||
/*
|
||||
* whole thing backwards has
|
||||
* adjusted addresses
|
||||
*/
|
||||
_back:
|
||||
ADDQ BX, DI
|
||||
ADDQ BX, SI
|
||||
STD
|
||||
SUBQ $4, DI
|
||||
SUBQ $4, SI
|
||||
/*
|
||||
* copy whole longs, if aligned
|
||||
*/
|
||||
MOVQ DI, DX
|
||||
ORQ SI, DX
|
||||
ANDL $3, DX
|
||||
JNE c3b
|
||||
MOVL BX, CX
|
||||
SHRQ $2, CX
|
||||
ANDL $3, BX
|
||||
REP; MOVSL
|
||||
/*
|
||||
* copy the rest, by bytes
|
||||
*/
|
||||
JEQ _return /* flags set by above ANDL */
|
||||
|
||||
c3b:
|
||||
ADDQ $3, DI
|
||||
ADDQ $3, SI
|
||||
MOVL BX, CX
|
||||
REP; MOVSB
|
||||
|
||||
_return:
|
||||
RET
|
41
sys/src/libc/amd64/memset.s
Normal file
41
sys/src/libc/amd64/memset.s
Normal file
|
@ -0,0 +1,41 @@
|
|||
TEXT memset(SB),$0
|
||||
|
||||
CLD
|
||||
MOVQ RARG, DI
|
||||
MOVBLZX c+8(FP), AX
|
||||
MOVL n+16(FP), BX
|
||||
/*
|
||||
* if not enough bytes, just set bytes
|
||||
*/
|
||||
CMPL BX, $9
|
||||
JLS c3
|
||||
/*
|
||||
* if not aligned, just set bytes
|
||||
*/
|
||||
MOVQ RARG, CX
|
||||
ANDL $3,CX
|
||||
JNE c3
|
||||
/*
|
||||
* build word in AX
|
||||
*/
|
||||
MOVB AL, AH
|
||||
MOVL AX, CX
|
||||
SHLL $16, CX
|
||||
ORL CX, AX
|
||||
/*
|
||||
* set whole longs
|
||||
*/
|
||||
c1:
|
||||
MOVQ BX, CX
|
||||
SHRQ $2, CX
|
||||
ANDL $3, BX
|
||||
REP; STOSL
|
||||
/*
|
||||
* set the rest, by bytes
|
||||
*/
|
||||
c3:
|
||||
MOVL BX, CX
|
||||
REP; STOSB
|
||||
ret:
|
||||
MOVQ RARG,AX
|
||||
RET
|
41
sys/src/libc/amd64/mkfile
Normal file
41
sys/src/libc/amd64/mkfile
Normal file
|
@ -0,0 +1,41 @@
|
|||
objtype=amd64
|
||||
</$objtype/mkfile
|
||||
|
||||
LIB=/$objtype/lib/libc.a
|
||||
SFILES=\
|
||||
argv0.s\
|
||||
atom.s\
|
||||
cycles.s\
|
||||
getfcr.s\
|
||||
main9.s\
|
||||
main9p.s\
|
||||
memccpy.s\
|
||||
memchr.s\
|
||||
memcmp.s\
|
||||
memcpy.s\
|
||||
memmove.s\
|
||||
memset.s\
|
||||
muldiv.s\
|
||||
setjmp.s\
|
||||
sqrt.s\
|
||||
strcat.s\
|
||||
strchr.s\
|
||||
strcpy.s\
|
||||
strlen.s\
|
||||
tas.s\
|
||||
|
||||
CFILES=\
|
||||
_seek.c\
|
||||
getcallerpc.c\
|
||||
notejmp.c\
|
||||
|
||||
HFILES=/sys/include/libc.h
|
||||
|
||||
OFILES=${CFILES:%.c=%.$O} ${SFILES:%.s=%.$O}
|
||||
|
||||
UPDATE=mkfile\
|
||||
$HFILES\
|
||||
$CFILES\
|
||||
$SFILES\
|
||||
|
||||
</sys/src/cmd/mksyslib
|
12
sys/src/libc/amd64/muldiv.s
Normal file
12
sys/src/libc/amd64/muldiv.s
Normal file
|
@ -0,0 +1,12 @@
|
|||
TEXT umuldiv(SB), $0
|
||||
MOVL RARG, AX
|
||||
MULL b+8(FP)
|
||||
DIVL c+16(FP)
|
||||
RET
|
||||
|
||||
TEXT muldiv(SB), $0
|
||||
MOVL RARG, AX
|
||||
IMULL b+8(FP)
|
||||
IDIVL c+16(FP)
|
||||
RET
|
||||
END
|
16
sys/src/libc/amd64/notejmp.c
Normal file
16
sys/src/libc/amd64/notejmp.c
Normal file
|
@ -0,0 +1,16 @@
|
|||
#include <u.h>
|
||||
#include <libc.h>
|
||||
#include <ureg.h>
|
||||
|
||||
void
|
||||
notejmp(void *vr, jmp_buf j, int ret)
|
||||
{
|
||||
struct Ureg *r = vr;
|
||||
|
||||
r->ax = ret;
|
||||
if(ret == 0)
|
||||
r->ax = 1;
|
||||
r->pc = j[JMPBUFPC];
|
||||
r->sp = j[JMPBUFSP] + 8;
|
||||
noted(NCONT);
|
||||
}
|
17
sys/src/libc/amd64/setjmp.s
Normal file
17
sys/src/libc/amd64/setjmp.s
Normal file
|
@ -0,0 +1,17 @@
|
|||
TEXT longjmp(SB), $0
|
||||
MOVL r+8(FP), AX
|
||||
CMPL AX, $0
|
||||
JNE ok /* ansi: "longjmp(0) => longjmp(1)" */
|
||||
MOVL $1, AX /* bless their pointed heads */
|
||||
ok:
|
||||
MOVQ 0(RARG), SP /* restore sp */
|
||||
MOVQ 8(RARG), BX /* put return pc on the stack */
|
||||
MOVQ BX, 0(SP)
|
||||
RET
|
||||
|
||||
TEXT setjmp(SB), $0
|
||||
MOVQ SP, 0(RARG) /* store sp */
|
||||
MOVQ 0(SP), BX /* store return pc */
|
||||
MOVQ BX, 8(RARG)
|
||||
MOVL $0, AX /* return 0 */
|
||||
RET
|
4
sys/src/libc/amd64/sqrt.s
Normal file
4
sys/src/libc/amd64/sqrt.s
Normal file
|
@ -0,0 +1,4 @@
|
|||
TEXT sqrt(SB), $0
|
||||
MOVSD a+0(FP), X0
|
||||
SQRTSD X0, X0
|
||||
RET
|
48
sys/src/libc/amd64/strcat.s
Normal file
48
sys/src/libc/amd64/strcat.s
Normal file
|
@ -0,0 +1,48 @@
|
|||
TEXT strcat(SB),$0
|
||||
|
||||
MOVL $0, AX
|
||||
MOVQ $-1, CX
|
||||
CLD
|
||||
|
||||
/*
|
||||
* find length of second string
|
||||
*/
|
||||
|
||||
MOVQ p2+8(FP), DI
|
||||
REPN; SCASB
|
||||
|
||||
MOVQ DI, BX
|
||||
SUBQ p2+8(FP), BX
|
||||
|
||||
/*
|
||||
* find end of first string
|
||||
*/
|
||||
|
||||
MOVQ RARG, DI
|
||||
REPN; SCASB
|
||||
|
||||
/*
|
||||
* copy the memory
|
||||
*/
|
||||
SUBQ $1, DI
|
||||
MOVQ p2+8(FP), SI
|
||||
/*
|
||||
* copy whole longs, if aligned
|
||||
*/
|
||||
MOVQ DI, CX
|
||||
ORQ SI, CX
|
||||
ANDL $3, CX
|
||||
JNE c3
|
||||
MOVQ BX, CX
|
||||
SHRQ $2, CX
|
||||
REP; MOVSL
|
||||
/*
|
||||
* copy the rest, by bytes
|
||||
*/
|
||||
ANDL $3, BX
|
||||
c3:
|
||||
MOVQ BX, CX
|
||||
REP; MOVSB
|
||||
|
||||
MOVQ RARG, AX
|
||||
RET
|
38
sys/src/libc/amd64/strchr.s
Normal file
38
sys/src/libc/amd64/strchr.s
Normal file
|
@ -0,0 +1,38 @@
|
|||
TEXT strchr(SB), $0
|
||||
|
||||
MOVQ RARG, DI
|
||||
MOVB c+8(FP), AX
|
||||
CMPB AX, $0
|
||||
JEQ l2 /**/
|
||||
|
||||
/*
|
||||
* char is not null
|
||||
*/
|
||||
l1:
|
||||
MOVB (DI), BX
|
||||
CMPB BX, $0
|
||||
JEQ ret0
|
||||
ADDQ $1, DI
|
||||
CMPB AX, BX
|
||||
JNE l1
|
||||
|
||||
MOVQ DI, AX
|
||||
SUBQ $1, AX
|
||||
RET
|
||||
|
||||
/*
|
||||
* char is null
|
||||
*/
|
||||
l2:
|
||||
MOVQ $-1, CX
|
||||
CLD
|
||||
|
||||
REPN; SCASB
|
||||
|
||||
MOVQ DI, AX
|
||||
SUBQ $1, AX
|
||||
RET
|
||||
|
||||
ret0:
|
||||
MOVQ $0, AX
|
||||
RET
|
40
sys/src/libc/amd64/strcpy.s
Normal file
40
sys/src/libc/amd64/strcpy.s
Normal file
|
@ -0,0 +1,40 @@
|
|||
TEXT strcpy(SB),$0
|
||||
|
||||
MOVL $0, AX
|
||||
MOVQ $-1, CX
|
||||
CLD
|
||||
/*
|
||||
* find end of second string
|
||||
*/
|
||||
|
||||
MOVQ p2+8(FP), DI
|
||||
REPN; SCASB
|
||||
|
||||
MOVQ DI, BX
|
||||
SUBQ p2+8(FP), BX
|
||||
|
||||
/*
|
||||
* copy the memory
|
||||
*/
|
||||
MOVQ RARG, DI
|
||||
MOVQ p2+8(FP), SI
|
||||
/*
|
||||
* copy whole longs, if aligned
|
||||
*/
|
||||
MOVQ DI, CX
|
||||
ORQ SI, CX
|
||||
ANDL $3, CX
|
||||
JNE c3
|
||||
MOVQ BX, CX
|
||||
SHRQ $2, CX
|
||||
REP; MOVSL
|
||||
/*
|
||||
* copy the rest, by bytes
|
||||
*/
|
||||
ANDL $3, BX
|
||||
c3:
|
||||
MOVL BX, CX
|
||||
REP; MOVSB
|
||||
|
||||
MOVQ RARG, AX
|
||||
RET
|
16
sys/src/libc/amd64/strlen.s
Normal file
16
sys/src/libc/amd64/strlen.s
Normal file
|
@ -0,0 +1,16 @@
|
|||
TEXT strlen(SB),$0
|
||||
|
||||
MOVL $0, AX
|
||||
MOVQ $-1, CX
|
||||
CLD
|
||||
/*
|
||||
* look for end of string
|
||||
*/
|
||||
|
||||
MOVQ RARG, DI
|
||||
REPN; SCASB
|
||||
|
||||
MOVQ DI, AX
|
||||
SUBQ RARG, AX
|
||||
SUBQ $1, AX
|
||||
RET
|
5
sys/src/libc/amd64/tas.s
Normal file
5
sys/src/libc/amd64/tas.s
Normal file
|
@ -0,0 +1,5 @@
|
|||
TEXT _tas(SB), 1, $0
|
||||
|
||||
MOVL $0xdeaddead,AX
|
||||
XCHGL AX,(RARG)
|
||||
RET
|
20
sys/src/libmp/amd64/mkfile
Normal file
20
sys/src/libmp/amd64/mkfile
Normal file
|
@ -0,0 +1,20 @@
|
|||
objtype=amd64
|
||||
</$objtype/mkfile
|
||||
|
||||
LIB=/$objtype/lib/libmp.a
|
||||
SFILES=\
|
||||
mpdigdiv.s\
|
||||
mpvecadd.s\
|
||||
mpvecdigmuladd.s\
|
||||
mpvecdigmulsub.s\
|
||||
mpvecsub.s\
|
||||
|
||||
HFILES=/$objtype/include/u.h /sys/include/mp.h ../port/dat.h
|
||||
|
||||
OFILES=${SFILES:%.s=%.$O}
|
||||
|
||||
UPDATE=mkfile\
|
||||
$HFILES\
|
||||
$SFILES\
|
||||
|
||||
</sys/src/cmd/mksyslib
|
21
sys/src/libmp/amd64/mpdigdiv.s
Normal file
21
sys/src/libmp/amd64/mpdigdiv.s
Normal file
|
@ -0,0 +1,21 @@
|
|||
TEXT mpdigdiv(SB),$0
|
||||
|
||||
/* MOVL dividend+0(FP),BX */
|
||||
MOVL 0(RARG),AX
|
||||
MOVL 4(RARG),DX
|
||||
MOVL divisor+8(FP),BX
|
||||
MOVQ quotient+16(FP),DI
|
||||
XORL CX,CX
|
||||
CMPL DX,BX /* dividend >= 2^32 * divisor */
|
||||
JHS _divovfl
|
||||
CMPL BX,CX /* divisor == 0 */
|
||||
JE _divovfl
|
||||
DIVL BX /* AX = DX:AX/BX */
|
||||
MOVL AX,0(DI)
|
||||
RET
|
||||
|
||||
/* return all 1's */
|
||||
_divovfl:
|
||||
NOTL CX
|
||||
MOVL CX,0(DI)
|
||||
RET
|
54
sys/src/libmp/amd64/mpvecadd.s
Normal file
54
sys/src/libmp/amd64/mpvecadd.s
Normal file
|
@ -0,0 +1,54 @@
|
|||
/*
|
||||
* mpvecadd(mpdigit *a, int alen, mpdigit *b, int blen, mpdigit *sum)
|
||||
*
|
||||
* sum[0:alen] = a[0:alen-1] + b[0:blen-1]
|
||||
*
|
||||
* prereq: alen >= blen, sum has room for alen+1 digits
|
||||
*/
|
||||
TEXT mpvecadd(SB),$0
|
||||
|
||||
MOVL alen+8(FP),DX
|
||||
MOVL blen+24(FP),CX
|
||||
/* MOVL a+0(FP),SI */
|
||||
MOVQ RARG, SI
|
||||
MOVQ b+16(FP),BX
|
||||
SUBL CX,DX
|
||||
MOVQ sum+32(FP),DI
|
||||
XORL BP,BP /* this also sets carry to 0 */
|
||||
|
||||
/* skip addition if b is zero */
|
||||
TESTL CX,CX
|
||||
JZ _add1
|
||||
|
||||
/* sum[0:blen-1],carry = a[0:blen-1] + b[0:blen-1] */
|
||||
_addloop1:
|
||||
MOVL (SI)(BP*4), AX
|
||||
ADCL (BX)(BP*4), AX
|
||||
MOVL AX,(DI)(BP*4)
|
||||
INCL BP
|
||||
LOOP _addloop1
|
||||
|
||||
_add1:
|
||||
/* jump if alen > blen */
|
||||
INCL DX
|
||||
MOVL DX,CX
|
||||
LOOP _addloop2
|
||||
|
||||
/* sum[alen] = carry */
|
||||
_addend:
|
||||
JC _addcarry
|
||||
MOVL $0,(DI)(BP*4)
|
||||
RET
|
||||
_addcarry:
|
||||
MOVL $1,(DI)(BP*4)
|
||||
RET
|
||||
|
||||
/* sum[blen:alen-1],carry = a[blen:alen-1] + 0 */
|
||||
_addloop2:
|
||||
MOVL (SI)(BP*4),AX
|
||||
ADCL $0,AX
|
||||
MOVL AX,(DI)(BP*4)
|
||||
INCL BP
|
||||
LOOP _addloop2
|
||||
JMP _addend
|
||||
|
53
sys/src/libmp/amd64/mpvecdigmuladd.s
Normal file
53
sys/src/libmp/amd64/mpvecdigmuladd.s
Normal file
|
@ -0,0 +1,53 @@
|
|||
/*
|
||||
* mpvecdigmul(mpdigit *b, int n, mpdigit m, mpdigit *p)
|
||||
*
|
||||
* p += b*m
|
||||
*
|
||||
* each step look like:
|
||||
* hi,lo = m*b[i]
|
||||
* lo += oldhi + carry
|
||||
* hi += carry
|
||||
* p[i] += lo
|
||||
* oldhi = hi
|
||||
*
|
||||
* the registers are:
|
||||
* hi = DX - constrained by hardware
|
||||
* lo = AX - constrained by hardware
|
||||
* b+n = SI - can't be BP
|
||||
* p+n = DI - can't be BP
|
||||
* i-n = BP
|
||||
* m = BX
|
||||
* oldhi = CX
|
||||
*
|
||||
*/
|
||||
TEXT mpvecdigmuladd(SB),$0
|
||||
|
||||
/* MOVQ b+0(FP),SI */
|
||||
MOVQ RARG,SI
|
||||
MOVL n+8(FP),CX
|
||||
MOVL m+16(FP),BX
|
||||
MOVQ p+24(FP),DI
|
||||
MOVL CX,BP
|
||||
NEGQ BP /* BP = -n */
|
||||
SHLL $2,CX
|
||||
ADDQ CX,SI /* SI = b + n */
|
||||
ADDQ CX,DI /* DI = p + n */
|
||||
XORL CX,CX
|
||||
_muladdloop:
|
||||
MOVL (SI)(BP*4),AX /* lo = b[i] */
|
||||
MULL BX /* hi, lo = b[i] * m */
|
||||
ADDL CX,AX /* lo += oldhi */
|
||||
JCC _muladdnocarry1
|
||||
INCL DX /* hi += carry */
|
||||
_muladdnocarry1:
|
||||
ADDL AX,(DI)(BP*4) /* p[i] += lo */
|
||||
JCC _muladdnocarry2
|
||||
INCL DX /* hi += carry */
|
||||
_muladdnocarry2:
|
||||
MOVL DX,CX /* oldhi = hi */
|
||||
INCQ BP /* i++ */
|
||||
JNZ _muladdloop
|
||||
XORL AX,AX
|
||||
ADDL CX,(DI)(BP*4) /* p[n] + oldhi */
|
||||
ADCL AX,AX /* return carry out of p[n] */
|
||||
RET
|
53
sys/src/libmp/amd64/mpvecdigmulsub.s
Normal file
53
sys/src/libmp/amd64/mpvecdigmulsub.s
Normal file
|
@ -0,0 +1,53 @@
|
|||
/*
|
||||
* mpvecdigmulsub(mpdigit *b, int n, mpdigit m, mpdigit *p)
|
||||
*
|
||||
* p -= b*m
|
||||
*
|
||||
* each step look like:
|
||||
* hi,lo = m*b[i]
|
||||
* lo += oldhi + carry
|
||||
* hi += carry
|
||||
* p[i] += lo
|
||||
* oldhi = hi
|
||||
*
|
||||
* the registers are:
|
||||
* hi = DX - constrained by hardware
|
||||
* lo = AX - constrained by hardware
|
||||
* b = SI - can't be BP
|
||||
* p = DI - can't be BP
|
||||
* i = BP
|
||||
* n = CX - constrained by LOOP instr
|
||||
* m = BX
|
||||
* oldhi = R8
|
||||
*
|
||||
*/
|
||||
TEXT mpvecdigmulsub(SB),$0
|
||||
|
||||
/* MOVL b+0(FP),SI */
|
||||
MOVQ RARG,SI
|
||||
MOVL n+8(FP),CX
|
||||
MOVL m+16(FP),BX
|
||||
MOVQ p+24(FP),DI
|
||||
XORL BP,BP
|
||||
MOVL BP,R8
|
||||
_mulsubloop:
|
||||
MOVL (SI)(BP*4),AX /* lo = b[i] */
|
||||
MULL BX /* hi, lo = b[i] * m */
|
||||
ADDL R8,AX /* lo += oldhi */
|
||||
JCC _mulsubnocarry1
|
||||
INCL DX /* hi += carry */
|
||||
_mulsubnocarry1:
|
||||
SUBL AX,(DI)(BP*4)
|
||||
JCC _mulsubnocarry2
|
||||
INCL DX /* hi += carry */
|
||||
_mulsubnocarry2:
|
||||
MOVL DX,R8
|
||||
INCL BP
|
||||
LOOP _mulsubloop
|
||||
SUBL R8,(DI)(BP*4)
|
||||
JCC _mulsubnocarry3
|
||||
MOVQ $-1,AX
|
||||
RET
|
||||
_mulsubnocarry3:
|
||||
MOVQ $1,AX
|
||||
RET
|
45
sys/src/libmp/amd64/mpvecsub.s
Normal file
45
sys/src/libmp/amd64/mpvecsub.s
Normal file
|
@ -0,0 +1,45 @@
|
|||
/*
|
||||
* mpvecsub(mpdigit *a, int alen, mpdigit *b, int blen, mpdigit *diff)
|
||||
*
|
||||
* diff[0:alen-1] = a[0:alen-1] - b[0:blen-1]
|
||||
*
|
||||
* prereq: alen >= blen, diff has room for alen digits
|
||||
*/
|
||||
TEXT mpvecsub(SB),$0
|
||||
|
||||
/* MOVQ a+0(FP),SI */
|
||||
MOVQ RARG, SI
|
||||
MOVQ b+16(FP),BX
|
||||
MOVL alen+8(FP),DX
|
||||
MOVL blen+24(FP),CX
|
||||
MOVQ diff+32(FP),DI
|
||||
SUBL CX,DX
|
||||
XORL BP,BP /* this also sets carry to 0 */
|
||||
|
||||
/* skip subraction if b is zero */
|
||||
TESTL CX,CX
|
||||
JZ _sub1
|
||||
|
||||
/* diff[0:blen-1],borrow = a[0:blen-1] - b[0:blen-1] */
|
||||
_subloop1:
|
||||
MOVL (SI)(BP*4),AX
|
||||
SBBL (BX)(BP*4),AX
|
||||
MOVL AX,(DI)(BP*4)
|
||||
INCL BP
|
||||
LOOP _subloop1
|
||||
|
||||
_sub1:
|
||||
INCL DX
|
||||
MOVL DX,CX
|
||||
LOOP _subloop2
|
||||
RET
|
||||
|
||||
/* diff[blen:alen-1] = a[blen:alen-1] - 0 */
|
||||
_subloop2:
|
||||
MOVL (SI)(BP*4),AX
|
||||
SBBL $0,AX
|
||||
MOVL AX,(DI)(BP*4)
|
||||
INCL BP
|
||||
LOOP _subloop2
|
||||
RET
|
||||
|
212
sys/src/libsec/amd64/md5block.s
Normal file
212
sys/src/libsec/amd64/md5block.s
Normal file
|
@ -0,0 +1,212 @@
|
|||
/*
|
||||
* rfc1321 requires that I include this. The code is new. The constants
|
||||
* all come from the rfc (hence the copyright). We trade a table for the
|
||||
* macros in rfc. The total size is a lot less. -- presotto
|
||||
*
|
||||
* Copyright (C) 1991-2, RSA Data Security, Inc. Created 1991. All
|
||||
* rights reserved.
|
||||
*
|
||||
* License to copy and use this software is granted provided that it
|
||||
* is identified as the "RSA Data Security, Inc. MD5 Message-Digest
|
||||
* Algorithm" in all material mentioning or referencing this software
|
||||
* or this function.
|
||||
*
|
||||
* License is also granted to make and use derivative works provided
|
||||
* that such works are identified as "derived from the RSA Data
|
||||
* Security, Inc. MD5 Message-Digest Algorithm" in all material
|
||||
* mentioning or referencing the derived work.
|
||||
*
|
||||
* RSA Data Security, Inc. makes no representations concerning either
|
||||
* the merchantability of this software or the suitability of this
|
||||
* software forany particular purpose. It is provided "as is"
|
||||
* without express or implied warranty of any kind.
|
||||
* These notices must be retained in any copies of any part of this
|
||||
* documentation and/or software.
|
||||
*/
|
||||
#define S11 7
|
||||
#define S12 12
|
||||
#define S13 17
|
||||
#define S14 22
|
||||
|
||||
#define S21 5
|
||||
#define S22 9
|
||||
#define S23 14
|
||||
#define S24 20
|
||||
|
||||
#define S31 4
|
||||
#define S32 11
|
||||
#define S33 16
|
||||
#define S34 23
|
||||
|
||||
#define S41 6
|
||||
#define S42 10
|
||||
#define S43 15
|
||||
#define S44 21
|
||||
|
||||
/*
|
||||
* SI is data
|
||||
* a += FN(B,C,D);
|
||||
* a += x[sh] + t[sh];
|
||||
* a = (a << S11) | (a >> (32 - S11));
|
||||
* a += b;
|
||||
*/
|
||||
|
||||
#define BODY1(off,V,FN,SH,A,B,C,D)\
|
||||
FN(B,C,D)\
|
||||
LEAL V(A)(DI*1),A;\
|
||||
ADDL (off)(BP),A;\
|
||||
ROLL $SH,A;\
|
||||
ADDL B,A;\
|
||||
|
||||
#define BODY(off,V,FN,SH,A,B,C,D)\
|
||||
FN(B,C,D)\
|
||||
LEAL V(A)(DI*1),A;\
|
||||
ADDL (off)(BP),A;\
|
||||
ROLL $SH,A;\
|
||||
ADDL B,A;\
|
||||
|
||||
/*
|
||||
* fn1 = ((c ^ d) & b) ^ d
|
||||
*/
|
||||
#define FN1(B,C,D)\
|
||||
MOVL C,DI;\
|
||||
XORL D,DI;\
|
||||
ANDL B,DI;\
|
||||
XORL D,DI;\
|
||||
|
||||
/*
|
||||
* fn2 = ((b ^ c) & d) ^ c;
|
||||
*/
|
||||
#define FN2(B,C,D)\
|
||||
MOVL B,DI;\
|
||||
XORL C,DI;\
|
||||
ANDL D,DI;\
|
||||
XORL C,DI;\
|
||||
|
||||
/*
|
||||
* fn3 = b ^ c ^ d;
|
||||
*/
|
||||
#define FN3(B,C,D)\
|
||||
MOVL B,DI;\
|
||||
XORL C,DI;\
|
||||
XORL D,DI;\
|
||||
|
||||
/*
|
||||
* fn4 = c ^ (b | ~d);
|
||||
*/
|
||||
#define FN4(B,C,D)\
|
||||
MOVL D,DI;\
|
||||
XORL $-1,DI;\
|
||||
ORL B,DI;\
|
||||
XORL C,DI;\
|
||||
|
||||
#define LEN 8
|
||||
#define STATE 16
|
||||
|
||||
TEXT _md5block+0(SB), $0
|
||||
|
||||
MOVQ RARG,R8
|
||||
MOVLQZX len+LEN(FP),BX
|
||||
ADDQ BX,R8
|
||||
|
||||
mainloop:
|
||||
MOVQ state+STATE(FP),SI
|
||||
MOVL (SI),AX
|
||||
MOVL 4(SI),BX
|
||||
MOVL 8(SI),CX
|
||||
MOVL 12(SI),DX
|
||||
|
||||
BODY1( 0*4,0xd76aa478,FN1,S11,AX,BX,CX,DX)
|
||||
BODY1( 1*4,0xe8c7b756,FN1,S12,DX,AX,BX,CX)
|
||||
BODY1( 2*4,0x242070db,FN1,S13,CX,DX,AX,BX)
|
||||
BODY1( 3*4,0xc1bdceee,FN1,S14,BX,CX,DX,AX)
|
||||
|
||||
BODY1( 4*4,0xf57c0faf,FN1,S11,AX,BX,CX,DX)
|
||||
BODY1( 5*4,0x4787c62a,FN1,S12,DX,AX,BX,CX)
|
||||
BODY1( 6*4,0xa8304613,FN1,S13,CX,DX,AX,BX)
|
||||
BODY1( 7*4,0xfd469501,FN1,S14,BX,CX,DX,AX)
|
||||
|
||||
BODY1( 8*4,0x698098d8,FN1,S11,AX,BX,CX,DX)
|
||||
BODY1( 9*4,0x8b44f7af,FN1,S12,DX,AX,BX,CX)
|
||||
BODY1(10*4,0xffff5bb1,FN1,S13,CX,DX,AX,BX)
|
||||
BODY1(11*4,0x895cd7be,FN1,S14,BX,CX,DX,AX)
|
||||
|
||||
BODY1(12*4,0x6b901122,FN1,S11,AX,BX,CX,DX)
|
||||
BODY1(13*4,0xfd987193,FN1,S12,DX,AX,BX,CX)
|
||||
BODY1(14*4,0xa679438e,FN1,S13,CX,DX,AX,BX)
|
||||
BODY1(15*4,0x49b40821,FN1,S14,BX,CX,DX,AX)
|
||||
|
||||
|
||||
BODY( 1*4,0xf61e2562,FN2,S21,AX,BX,CX,DX)
|
||||
BODY( 6*4,0xc040b340,FN2,S22,DX,AX,BX,CX)
|
||||
BODY(11*4,0x265e5a51,FN2,S23,CX,DX,AX,BX)
|
||||
BODY( 0*4,0xe9b6c7aa,FN2,S24,BX,CX,DX,AX)
|
||||
|
||||
BODY( 5*4,0xd62f105d,FN2,S21,AX,BX,CX,DX)
|
||||
BODY(10*4,0x02441453,FN2,S22,DX,AX,BX,CX)
|
||||
BODY(15*4,0xd8a1e681,FN2,S23,CX,DX,AX,BX)
|
||||
BODY( 4*4,0xe7d3fbc8,FN2,S24,BX,CX,DX,AX)
|
||||
|
||||
BODY( 9*4,0x21e1cde6,FN2,S21,AX,BX,CX,DX)
|
||||
BODY(14*4,0xc33707d6,FN2,S22,DX,AX,BX,CX)
|
||||
BODY( 3*4,0xf4d50d87,FN2,S23,CX,DX,AX,BX)
|
||||
BODY( 8*4,0x455a14ed,FN2,S24,BX,CX,DX,AX)
|
||||
|
||||
BODY(13*4,0xa9e3e905,FN2,S21,AX,BX,CX,DX)
|
||||
BODY( 2*4,0xfcefa3f8,FN2,S22,DX,AX,BX,CX)
|
||||
BODY( 7*4,0x676f02d9,FN2,S23,CX,DX,AX,BX)
|
||||
BODY(12*4,0x8d2a4c8a,FN2,S24,BX,CX,DX,AX)
|
||||
|
||||
|
||||
BODY( 5*4,0xfffa3942,FN3,S31,AX,BX,CX,DX)
|
||||
BODY( 8*4,0x8771f681,FN3,S32,DX,AX,BX,CX)
|
||||
BODY(11*4,0x6d9d6122,FN3,S33,CX,DX,AX,BX)
|
||||
BODY(14*4,0xfde5380c,FN3,S34,BX,CX,DX,AX)
|
||||
|
||||
BODY( 1*4,0xa4beea44,FN3,S31,AX,BX,CX,DX)
|
||||
BODY( 4*4,0x4bdecfa9,FN3,S32,DX,AX,BX,CX)
|
||||
BODY( 7*4,0xf6bb4b60,FN3,S33,CX,DX,AX,BX)
|
||||
BODY(10*4,0xbebfbc70,FN3,S34,BX,CX,DX,AX)
|
||||
|
||||
BODY(13*4,0x289b7ec6,FN3,S31,AX,BX,CX,DX)
|
||||
BODY( 0*4,0xeaa127fa,FN3,S32,DX,AX,BX,CX)
|
||||
BODY( 3*4,0xd4ef3085,FN3,S33,CX,DX,AX,BX)
|
||||
BODY( 6*4,0x04881d05,FN3,S34,BX,CX,DX,AX)
|
||||
|
||||
BODY( 9*4,0xd9d4d039,FN3,S31,AX,BX,CX,DX)
|
||||
BODY(12*4,0xe6db99e5,FN3,S32,DX,AX,BX,CX)
|
||||
BODY(15*4,0x1fa27cf8,FN3,S33,CX,DX,AX,BX)
|
||||
BODY( 2*4,0xc4ac5665,FN3,S34,BX,CX,DX,AX)
|
||||
|
||||
|
||||
BODY( 0*4,0xf4292244,FN4,S41,AX,BX,CX,DX)
|
||||
BODY( 7*4,0x432aff97,FN4,S42,DX,AX,BX,CX)
|
||||
BODY(14*4,0xab9423a7,FN4,S43,CX,DX,AX,BX)
|
||||
BODY( 5*4,0xfc93a039,FN4,S44,BX,CX,DX,AX)
|
||||
|
||||
BODY(12*4,0x655b59c3,FN4,S41,AX,BX,CX,DX)
|
||||
BODY( 3*4,0x8f0ccc92,FN4,S42,DX,AX,BX,CX)
|
||||
BODY(10*4,0xffeff47d,FN4,S43,CX,DX,AX,BX)
|
||||
BODY( 1*4,0x85845dd1,FN4,S44,BX,CX,DX,AX)
|
||||
|
||||
BODY( 8*4,0x6fa87e4f,FN4,S41,AX,BX,CX,DX)
|
||||
BODY(15*4,0xfe2ce6e0,FN4,S42,DX,AX,BX,CX)
|
||||
BODY( 6*4,0xa3014314,FN4,S43,CX,DX,AX,BX)
|
||||
BODY(13*4,0x4e0811a1,FN4,S44,BX,CX,DX,AX)
|
||||
|
||||
BODY( 4*4,0xf7537e82,FN4,S41,AX,BX,CX,DX)
|
||||
BODY(11*4,0xbd3af235,FN4,S42,DX,AX,BX,CX)
|
||||
BODY( 2*4,0x2ad7d2bb,FN4,S43,CX,DX,AX,BX)
|
||||
BODY( 9*4,0xeb86d391,FN4,S44,BX,CX,DX,AX)
|
||||
|
||||
ADDQ $(16*4),BP
|
||||
MOVQ state+STATE(FP),DI
|
||||
ADDL AX,0(DI)
|
||||
ADDL BX,4(DI)
|
||||
ADDL CX,8(DI)
|
||||
ADDL DX,12(DI)
|
||||
|
||||
CMPQ BP,R8
|
||||
JCS mainloop
|
||||
|
||||
RET
|
19
sys/src/libsec/amd64/mkfile
Normal file
19
sys/src/libsec/amd64/mkfile
Normal file
|
@ -0,0 +1,19 @@
|
|||
objtype=amd64
|
||||
</$objtype/mkfile
|
||||
|
||||
LIB=/$objtype/lib/libsec.a
|
||||
FILES=\
|
||||
md5block\
|
||||
sha1block\
|
||||
|
||||
HFILES=/sys/include/libsec.h
|
||||
|
||||
SFILES=${FILES:%=%.s}
|
||||
|
||||
OFILES=${FILES:%=%.$O}
|
||||
|
||||
UPDATE=mkfile\
|
||||
$HFILES\
|
||||
$SFILES\
|
||||
|
||||
</sys/src/cmd/mksyslib
|
197
sys/src/libsec/amd64/sha1block.s
Normal file
197
sys/src/libsec/amd64/sha1block.s
Normal file
|
@ -0,0 +1,197 @@
|
|||
/* x = (wp[off-f] ^ wp[off-8] ^ wp[off-14] ^ wp[off-16]) <<< 1;
|
||||
* wp[off] = x;
|
||||
* x += A <<< 5;
|
||||
* E += 0xca62c1d6 + x;
|
||||
* x = FN(B,C,D);
|
||||
* E += x;
|
||||
* B >>> 2
|
||||
*/
|
||||
#define BSWAPDI BYTE $0x0f; BYTE $0xcf;
|
||||
|
||||
#define BODY(off,FN,V,A,B,C,D,E)\
|
||||
MOVL (off-64)(BP),DI;\
|
||||
XORL (off-56)(BP),DI;\
|
||||
XORL (off-32)(BP),DI;\
|
||||
XORL (off-12)(BP),DI;\
|
||||
ROLL $1,DI;\
|
||||
MOVL DI,off(BP);\
|
||||
LEAL V(DI)(E*1),E;\
|
||||
MOVL A,DI;\
|
||||
ROLL $5,DI;\
|
||||
ADDL DI,E;\
|
||||
FN(B,C,D)\
|
||||
ADDL DI,E;\
|
||||
RORL $2,B;\
|
||||
|
||||
#define BODY0(off,FN,V,A,B,C,D,E)\
|
||||
MOVLQZX off(BX),DI;\
|
||||
BSWAPDI;\
|
||||
MOVL DI,off(BP);\
|
||||
LEAL V(DI)(E*1),E;\
|
||||
MOVL A,DI;\
|
||||
ROLL $5,DI;\
|
||||
ADDL DI,E;\
|
||||
FN(B,C,D)\
|
||||
ADDL DI,E;\
|
||||
RORL $2,B;\
|
||||
|
||||
/*
|
||||
* fn1 = (((C^D)&B)^D);
|
||||
*/
|
||||
#define FN1(B,C,D)\
|
||||
MOVL C,DI;\
|
||||
XORL D,DI;\
|
||||
ANDL B,DI;\
|
||||
XORL D,DI;\
|
||||
|
||||
/*
|
||||
* fn24 = B ^ C ^ D
|
||||
*/
|
||||
#define FN24(B,C,D)\
|
||||
MOVL B,DI;\
|
||||
XORL C,DI;\
|
||||
XORL D,DI;\
|
||||
|
||||
/*
|
||||
* fn3 = ((B ^ C) & (D ^= B)) ^ B
|
||||
* D ^= B to restore D
|
||||
*/
|
||||
#define FN3(B,C,D)\
|
||||
MOVL B,DI;\
|
||||
XORL C,DI;\
|
||||
XORL B,D;\
|
||||
ANDL D,DI;\
|
||||
XORL B,DI;\
|
||||
XORL B,D;\
|
||||
|
||||
/*
|
||||
* stack offsets
|
||||
* void sha1block(uchar *DATA, int LEN, ulong *STATE)
|
||||
*/
|
||||
#define DATA 0
|
||||
#define LEN 8
|
||||
#define STATE 16
|
||||
|
||||
/*
|
||||
* stack offsets for locals
|
||||
* ulong w[80];
|
||||
* uchar *edata;
|
||||
* ulong *w15, *w40, *w60, *w80;
|
||||
* register local
|
||||
* ulong *wp = BP
|
||||
* ulong a = eax, b = ebx, c = ecx, d = edx, e = esi
|
||||
* ulong tmp = edi
|
||||
*/
|
||||
#define Rpdata R8
|
||||
#define WARRAY (-8-(80*4))
|
||||
#define TMP1 (-16-(80*4))
|
||||
#define TMP2 (-24-(80*4))
|
||||
#define W15 (-32-(80*4))
|
||||
#define W40 (-40-(80*4))
|
||||
#define W60 (-48-(80*4))
|
||||
#define W80 (-56-(80*4))
|
||||
#define EDATA (-64-(80*4))
|
||||
|
||||
TEXT _sha1block+0(SB),$384
|
||||
|
||||
MOVQ RARG, Rpdata
|
||||
MOVLQZX len+LEN(FP),BX
|
||||
ADDQ BX, RARG
|
||||
MOVQ RARG,edata+EDATA(SP)
|
||||
|
||||
LEAQ aw15+(WARRAY+15*4)(SP),DI
|
||||
MOVQ DI,w15+W15(SP)
|
||||
LEAQ aw40+(WARRAY+40*4)(SP),DX
|
||||
MOVQ DX,w40+W40(SP)
|
||||
LEAQ aw60+(WARRAY+60*4)(SP),CX
|
||||
MOVQ CX,w60+W60(SP)
|
||||
LEAQ aw80+(WARRAY+80*4)(SP),DI
|
||||
MOVQ DI,w80+W80(SP)
|
||||
|
||||
mainloop:
|
||||
LEAQ warray+WARRAY(SP),BP
|
||||
|
||||
MOVQ state+STATE(FP),DI
|
||||
MOVL (DI),AX
|
||||
MOVL 4(DI),BX
|
||||
MOVL BX,tmp1+TMP1(SP)
|
||||
MOVL 8(DI),CX
|
||||
MOVL 12(DI),DX
|
||||
MOVL 16(DI),SI
|
||||
|
||||
MOVQ Rpdata,BX
|
||||
|
||||
loop1:
|
||||
BODY0(0,FN1,0x5a827999,AX,tmp1+TMP1(SP),CX,DX,SI)
|
||||
MOVL SI,tmp2+TMP2(SP)
|
||||
BODY0(4,FN1,0x5a827999,SI,AX,tmp1+TMP1(SP),CX,DX)
|
||||
MOVL tmp1+TMP1(SP),SI
|
||||
BODY0(8,FN1,0x5a827999,DX,tmp2+TMP2(SP),AX,SI,CX)
|
||||
BODY0(12,FN1,0x5a827999,CX,DX,tmp2+TMP2(SP),AX,SI)
|
||||
MOVL SI,tmp1+TMP1(SP)
|
||||
BODY0(16,FN1,0x5a827999,SI,CX,DX,tmp2+TMP2(SP),AX)
|
||||
MOVL tmp2+TMP2(SP),SI
|
||||
|
||||
ADDQ $20,BX
|
||||
ADDQ $20,BP
|
||||
CMPQ BP,w15+W15(SP)
|
||||
JCS loop1
|
||||
|
||||
BODY0(0,FN1,0x5a827999,AX,tmp1+TMP1(SP),CX,DX,SI)
|
||||
ADDQ $4,BX
|
||||
MOVQ BX,R8
|
||||
MOVQ tmp1+TMP1(SP),BX
|
||||
|
||||
BODY(4,FN1,0x5a827999,SI,AX,BX,CX,DX)
|
||||
BODY(8,FN1,0x5a827999,DX,SI,AX,BX,CX)
|
||||
BODY(12,FN1,0x5a827999,CX,DX,SI,AX,BX)
|
||||
BODY(16,FN1,0x5a827999,BX,CX,DX,SI,AX)
|
||||
|
||||
ADDQ $20,BP
|
||||
|
||||
loop2:
|
||||
BODY(0,FN24,0x6ed9eba1,AX,BX,CX,DX,SI)
|
||||
BODY(4,FN24,0x6ed9eba1,SI,AX,BX,CX,DX)
|
||||
BODY(8,FN24,0x6ed9eba1,DX,SI,AX,BX,CX)
|
||||
BODY(12,FN24,0x6ed9eba1,CX,DX,SI,AX,BX)
|
||||
BODY(16,FN24,0x6ed9eba1,BX,CX,DX,SI,AX)
|
||||
|
||||
ADDQ $20,BP
|
||||
CMPQ BP,w40+W40(SP)
|
||||
JCS loop2
|
||||
|
||||
loop3:
|
||||
BODY(0,FN3,0x8f1bbcdc,AX,BX,CX,DX,SI)
|
||||
BODY(4,FN3,0x8f1bbcdc,SI,AX,BX,CX,DX)
|
||||
BODY(8,FN3,0x8f1bbcdc,DX,SI,AX,BX,CX)
|
||||
BODY(12,FN3,0x8f1bbcdc,CX,DX,SI,AX,BX)
|
||||
BODY(16,FN3,0x8f1bbcdc,BX,CX,DX,SI,AX)
|
||||
|
||||
ADDQ $20,BP
|
||||
CMPQ BP,w60+W60(SP)
|
||||
JCS loop3
|
||||
|
||||
loop4:
|
||||
BODY(0,FN24,0xca62c1d6,AX,BX,CX,DX,SI)
|
||||
BODY(4,FN24,0xca62c1d6,SI,AX,BX,CX,DX)
|
||||
BODY(8,FN24,0xca62c1d6,DX,SI,AX,BX,CX)
|
||||
BODY(12,FN24,0xca62c1d6,CX,DX,SI,AX,BX)
|
||||
BODY(16,FN24,0xca62c1d6,BX,CX,DX,SI,AX)
|
||||
|
||||
ADDQ $20,BP
|
||||
CMPQ BP,w80+W80(SP)
|
||||
JCS loop4
|
||||
|
||||
MOVQ state+STATE(FP),DI
|
||||
ADDL AX,0(DI)
|
||||
ADDL BX,4(DI)
|
||||
ADDL CX,8(DI)
|
||||
ADDL DX,12(DI)
|
||||
ADDL SI,16(DI)
|
||||
|
||||
MOVQ edata+EDATA(SP),DI
|
||||
CMPQ Rpdata,DI
|
||||
JCS mainloop
|
||||
|
||||
RET
|
||||
END
|
Loading…
Reference in a new issue