CVS: sml-dist primop-list,NONE,1.1.2.1

David MacQueen <[email protected]> Wed, 21 Jun 2006 16:02:45 -0700
Newsgroups gmane.comp.lang.sml.smlnj.commits
Message-ID <[email protected]>
Update of /cvsroot/smlnj/sml-dist
In directory sc8-pr-cvs8.sourceforge.net:/tmp/cvs-serv9980

Added Files:
      Tag: primop-branch-2
	primop-list 
Log Message:
adding primop-list file

--- NEW FILE: primop-list ---
Catalog of Primops
(from Semant/statenv/prim.sml)

Hypothesis: all primops that are contained in the environment are created
here.


callcc,	 	 P.CALLCC,     	('a cont -> 'a) -> 'a
throw,	 	 P.THROW,      	'a cont -> 'a -> 'b
capture,	 P.CAPTURE,     ('a ccont -> 'a) -> 'a
isolate,	 P.ISOLATE,     ('a -> unit) -> 'a cont
cthrow,	 	 P.THROW,      	('a ccont -> 'a -> 'b
!,		 P.DEREF,      	'a ref -> 'a
:=,	         P.ASSIGN,      'a ref * 'a -> unit
makeref,	 P.MAKEREF,     'a -> 'a ref
boxed,	 	 P.BOXED,      	'a -> bool
unboxed,	 P.UNBOXED,     'a -> bool
cast,          	 P.CAST,      	'a -> -b
=,		 P.POLYEQL,     ''a * ''a -> bool
<>,	         P.POLYNEQ,     ''a * ''a -> bool
ptreql,	 	 P.PTREQL,      'a * 'a -> bool
ptrneq,	 	 P.PTRNEQ,      'a * 'a -> bool
getvar,	 	 P.GETVAR,      unit -> 'a
setvar,	 	 P.SETVAR,      'a -> unit
setpseudo,	 P.SETPSEUDO,   'a * int -> unit
getpseudo,	 P.GETPSEUDO,   int -> 'a
mkspecial,       P.MKSPECIAL,   int * 'a -> 'b
getspecial,      P.GETSPECIAL,  'a -> int
setspecial,      P.SETSPECIAL,  'a * int -> unit
gethdlr,	 P.GETHDLR,     unit -> 'a cont
sethdlr,	 P.SETHDLR,     'a cont -> unit
gettag, 	 P.GETTAG,      'a -> int
setmark,	 P.SETMARK,     'a -> unit
dispose,	 P.DISPOSE,     'a -> unit
compose,	 P.INLCOMPOSE,  ('b -> 'c) * ('a -> 'b) -> 'a -> 'c
before,	 	 P.INLBEFORE,   'a * 'b -> 'a
ignore,          P.INLIGNORE,   'a -> unit
identity,        P.INLIDENTITY, 'a -> 'a
 		 
length,	 	 P.LENGTH,     	'a -> int
objlength,	 P.OBJLENGTH,   'a -> int

unboxedupdate,   P.UNBOXEDUPDATE, 'a array * int * 'a -> unit
			 
inlnot,	 	 P.INLNOT,      	         bool -> bool
floor,           P.ROUND{floor=true,
                         fromkind=P.FLOAT 64,
                         tokind=P.INT 31},     	 real -> int
round,           P.ROUND{floor=false, 
                         fromkind=P.FLOAT 64,
                         tokind=P.INT 31},     	 real -> int
real,            P.REAL{fromkind=P.INT 31,
                        tokind=P.FLOAT 64},      int -> real
real32,          P.REAL{fromkind=P.INT 32,
 			tokind=P.FLOAT 64},      int32 -> real
			 
ordof,           P.NUMSUBSCRIPT{kind=P.INT 8,
                                checked=false,
                                immutable=true}, 'a * int -> 'b
store,           P.NUMUPDATE{kind=P.INT 8,
                             checked=false},     'a * int * 'b -> unit
inlbyteof,       P.NUMSUBSCRIPT{kind=P.INT 8,
                                checked=true,
                                immutable=false}, 'a * int -> 'b
inlstore,        P.NUMUPDATE{kind=P.INT 8,
                             checked=true},      'a * int * 'b -> unit
inlordof,        P.NUMSUBSCRIPT{kind=P.INT 8,
                                checked=true,
                                immutable=true}, 'a * int -> 'b

(*** polymorphic array and vector ***)
mkarray,         P.INLMKARRAY,          int * 'a -> 'a array
arrSub, 	 P.SUBSCRIPT,      	'a array * int -> 'a
arrChkSub,	 P.INLSUBSCRIPT,      	'a array * int -> 'a
vecSub,	 	 P.SUBSCRIPTV,      	'a vector * int -> 'a
vecChkSub,	 P.INLSUBSCRIPTV,      	'a vector * int -> 'a
arrUpdate,	 P.UPDATE,      	'a array * int * 'a -> unit
arrChkUpdate,  	 P.INLUPDATE,      	'a array * int * 'a -> unit

(* new array representations *)
newArray0,	 P.NEW_ARRAY0,		unit -> 'a
getSeqData,	 P.GET_SEQ_DATA,	'a -> 'b
recordSub,	 P.SUBSCRIPT_REC,	'a * int -> 'b
raw64Sub,	 P.SUBSCRIPT_RAW64,	'a * int -> real

(* *** conversion primops ***
 *   There are certain duplicates for the same primop (but with
 *   different types).  In such a case, the canonical name
 *   of the primop has been extended using a simple suffix
 *   scheme. *)
test_32_31_w,  P.TEST(32,31),  		word32 -> int
test_32_31_i,  P.TEST(32,31),  		int32 -> int

testu_31_31,   P.TESTU(31,31),      	word -> int

testu_32_31,   P.TESTU(32,31),      	word32 -> int

testu_32_32,   P.TESTU(32,32),   	word32 -> int32

copy_32_32_ii, P.COPY(32,32),   	int32 -> int32
copy_32_32_wi, P.COPY(32,32),   	word32 -> int32
copy_32_32_iw, P.COPY(32,32),   	int32 -> word32
copy_32_32_ww, P.COPY(32,32),   	word32 -> word32

copy_31_31_ii, P.COPY(31,31),   	int -> int
copy_31_31_wi, P.COPY(31,31),   	word -> int
copy_31_31_iw, P.COPY(31,31),   	int -> word

copy_31_32_i,  P.COPY(31,32),  		word -> int32
copy_31_32_w,  P.COPY(31,32),  		word -> word32

copy_8_32_i,   P.COPY(8,32),     	word8 -> int32
copy_8_32_w,   P.COPY(8,32),     	word8 -> word32

copy_8_31,     P.COPY(8,31),     	word8 -> int

extend_31_32_ii, P.EXTEND(31,32), 	int -> int32
extend_31_32_iw, P.EXTEND(31,32), 	int -> word32
extend_31_32_wi, P.EXTEND(31,32), 	word -> int32
extend_31_32_ww, P.EXTEND(31,32), 	word -> word32

extend_8_31,   P.EXTEND(8,31),   	word8 -> int

extend_8_32_i, P.EXTEND(8,32), 		word8 -> int32
extend_8_32_w, P.EXTEND(8,32), 		word8 -> word32

trunc_32_31_i, P.TRUNC(32,31),   	int32 -> word
trunc_32_31_w, P.TRUNC(32,31),   	word32 -> word

trunc_31_8,    P.TRUNC(31,8),   	int -> word8

trunc_32_8_i,  P.TRUNC(32,8),   	int32 -> word8
trunc_32_8_w,  P.TRUNC(32,8),   	word32 -> word8

(* conversion primops involving intinf *)
test_inf_31,   P.TEST_INF 31,         inf_i 
test_inf_32,   P.TEST_INF 32,         inf_i32
test_inf_64,   P.TEST_INF 64,         inf_i64
copy_8_inf,    P.COPY_INF 8,          w8_inf
copy_8_inf_w,  P.COPY_INF 8,          w8_inf
copy_31_inf_w, P.COPY_INF 31,         w_inf 
copy_32_inf_w, P.COPY_INF 32,         w32_inf
copy_64_inf_w, P.COPY_INF 64,         w64_inf
copy_31_inf_i, P.COPY_INF 31,         i_inf 
copy_32_inf_i, P.COPY_INF 32,         i32_inf
copy_64_inf_i, P.COPY_INF 64,         i64_inf
extend_8_inf,  P.EXTEND_INF 8,        w8_inf
extend_8_inf_w,  P.EXTEND_INF 8,      w8_inf
extend_31_inf_w, P.EXTEND_INF 31,     w_inf
extend_32_inf_w, P.EXTEND_INF 32,     w32_inf
extend_64_inf_w, P.EXTEND_INF 64,     w64_inf
extend_31_inf_i, P.EXTEND_INF 31,     i_inf
extend_32_inf_i, P.EXTEND_INF 32,     i32_inf
extend_64_inf_i, P.EXTEND_INF 64,     i64_inf
trunc_inf_8,   P.TRUNC_INF 8,         inf_w8
trunc_inf_31,  P.TRUNC_INF 31,        inf_w
trunc_inf_32,  P.TRUNC_INF 32,        inf_w32
trunc_inf_64,  P.TRUNC_INF 64,        inf_w64

(* primops to go between abstract and concrete representation of
 * 64-bit ints and words *)
w64p,          P.CVT64,               w64_pw32
p64w,          P.CVT64,               pw32_w64
i64p,          P.CVT64,               i64_pw32
p64i,          P.CVT64,               pw32_i64

(* *** integer 31 primops ***
 *   Many of the i31 primops are being abused for different types
 *   (mostly Word8.word and also for char).  In these cases
 *   there are suffixed alternative versions of the primop
 *   (i.e., same primop, different type). *)
i31add, 	 int31 P.+,      	ii_i
i31add_8, 	 int31 P.+,      	w8w8_w8

i31sub,	 	 int31 P.-,      	ii_i
i31sub_8,	 int31 P.-,      	w8w8_w8

i31mul,	 	 int31 P.*,      	ii_i
i31mul_8,	 int31 P.*,      	w8w8_w8

i31div,	 	 int31 P.DIV,      	ii_i
i31div_8,	 int31 P.DIV,      	w8w8_w8

i31mod,          int31 P.MOD,      	ii_i
i31mod_8,        int31 P.MOD,           w8w8_w8

i31quot,	 int31 P./,      	ii_i

i31rem,	 	 int31 P.REM,      	ii_i

i31orb,	 	 bits31 P.ORB,      	ii_i
i31orb_8,	 bits31 P.ORB,      	w8w8_w8

i31andb,	 bits31 P.ANDB,      	ii_i
i31andb_8,	 bits31 P.ANDB,      	w8w8_w8

i31xorb,	 bits31 P.XORB,      	ii_i
i31xorb_8,	 bits31 P.XORB,      	w8w8_w8

i31notb,	 bits31 P.NOTB,      	i_i
i31notb_8,	 bits31 P.NOTB,      	w8_w8

i31neg,	 	 int31 P.~,      	i_i
i31neg_8,	 int31 P.~,      	w8_w8

i31lshift,	 bits31 P.LSHIFT,      	ii_i
i31lshift_8,	 bits31 P.LSHIFT,      	w8w_w8

i31rshift,	 bits31 P.RSHIFT,      	ii_i
i31rshift_8,	 bits31 P.RSHIFT,      	w8w_w8

i31lt,	 	 int31cmp P.<,		ii_b
i31lt_8,	 int31cmp P.<,		w8w8_b
i31lt_c,	 int31cmp P.<,		cc_b

i31le,	 	 int31cmp P.<=,		ii_b
i31le_8,	 int31cmp P.<=,		w8w8_b
i31le_c,	 int31cmp P.<=,		cc_b

i31gt,	 	 int31cmp P.>,		ii_b
i31gt_8,	 int31cmp P.>,		w8w8_b
i31gt_c,	 int31cmp P.>,		cc_b

i31ge, 	 	 int31cmp P.>=,		ii_b
i31ge_8, 	 int31cmp P.>=,		w8w8_b
i31ge_c, 	 int31cmp P.>=,		cc_b

i31ltu,	 	 word31cmp P.LTU,      	ii_b
i31geu,	 	 word31cmp P.GEU,      	ii_b
i31eq,	 	 int31cmp P.EQL,      	ii_b
i31ne,	 	 int31cmp P.NEQ,      	ii_b

i31min,	 	 P.INLMIN (P.INT 31),  	ii_i
i31min_8,	 P.INLMIN (P.INT 31),  	w8w8_w8
i31max,	 	 P.INLMAX (P.INT 31),  	ii_i
i31max_8,	 P.INLMAX (P.INT 31),  	w8w8_w8

i31abs,	 	 P.INLABS (P.INT 31), 	i_i

(*** integer 32 primops ***)
i32mul,       int32 P.*,      		i32i32_i32
i32div,       int32 P.DIV,      	i32i32_i32
i32mod,       int32 P.MOD,      	i32i32_i32
i32quot,      int32 P./,      		i32i32_i32
i32rem,       int32 P.REM,      	i32i32_i32
i32add,       int32 P.+,      		i32i32_i32
i32sub,       int32 P.-,      		i32i32_i32
i32orb,       bits32 P.ORB,      	i32i32_i32
i32andb,      bits32 P.ANDB,      	i32i32_i32
i32xorb,      bits32 P.XORB,      	i32i32_i32
i32lshift,    bits32 P.LSHIFT,      	i32i32_i32
i32rshift,    bits32 P.RSHIFT,      	i32i32_i32
i32neg,       int32 P.~,      		i32_i32
i32lt,        int32cmp P.<,		i32i32_b
i32le,        int32cmp P.<=,		i32i32_b
i32gt,        int32cmp P.>,		i32i32_b
i32ge,        int32cmp P.>=,		i32i32_b
i32eq,        int32cmp P.EQL,		i32i32_b
i32ne,        int32cmp P.NEQ,		i32i32_b

i32min,	 P.INLMIN (P.INT 32),  		i32i32_i32
i32max,	 P.INLMAX (P.INT 32),  		i32i32_i32
i32abs,	 P.INLABS (P.INT 32), 		i32_i32

(*** float 64 primops ***)
f64add, 	 purefloat64 (P.+),      f64f64_f64
f64sub,	 	 purefloat64 (P.-),      f64f64_f64
f64div, 	 purefloat64 (P./),      f64f64_f64
f64mul,	 	 purefloat64 (P.* ),     f64f64_f64
f64neg,	 	 purefloat64 P.~,      	 f64_f64
f64ge,	 	 float64cmp (P.>=),      f64f64_b
f64gt,	  	 float64cmp (P.>),       f64f64_b
f64le,	 	 float64cmp (P.<=),      f64f64_b
f64lt,	 	 float64cmp (P.<),       f64f64_b
f64eq,	 	 float64cmp P.EQL,       f64f64_b
f64ne,	 	 float64cmp P.NEQ,       f64f64_b
f64abs,	 	 purefloat64 P.ABS,      f64_f64

f64sin,	 	 purefloat64 P.FSIN,	 f64_f64
f64cos,	 	 purefloat64 P.FCOS,	 f64_f64
f64tan,		 purefloat64 P.FTAN,	 f64_f64
f64sqrt,	 purefloat64 P.FSQRT,    f64_f64

f64min,	 	 P.INLMIN (P.FLOAT 64),  f64f64_f64
f64max,	 	 P.INLMAX (P.FLOAT 64),  f64f64_f64

(*** float64 array ***)	
f64Sub,	 sub (P.FLOAT 64),       numSubTy
f64chkSub,	 chkSub (P.FLOAT 64),    numSubTy
f64Update,	 update (P.FLOAT 64),    numUpdTy
f64chkUpdate,    chkUpdate (P.FLOAT 64), numUpdTy

(*** word8 primops ***)
w8orb,		word31 P.ORB,      	w8w8_w8
w8xorb,		word31 P.XORB,      	w8w8_w8
w8andb,		word31 P.ANDB,      	w8w8_w8
	 		
w8gt,		word8cmp P.>,           w8w8_b
w8ge,		word8cmp P.>=,          w8w8_b
w8lt,		word8cmp P.<,           w8w8_b
w8le,		word8cmp P.<=,          w8w8_b
w8eq,		word8cmp P.EQL,      	w8w8_b
w8ne,		word8cmp P.NEQ,      	w8w8_b

(*** word8 array and vector ***)
w8Sub,		sub (P.UINT 8),      	numSubTy
w8chkSub,	chkSub (P.UINT 8),      numSubTy
w8subv,		subv (P.UINT 8),        numSubTy
w8chkSubv,	chkSubv (P.UINT 8),     numSubTy
w8update,	update (P.UINT 8),      numUpdTy
w8chkUpdate, 	chkUpdate (P.UINT 8),   numUpdTy

(* word31 primops *)
w31mul,		word31 (P.* ),      	ww_w
w31div,		word31 (P./),      	ww_w
w31mod,		word31 (P.REM),      	ww_w
w31add,		word31 (P.+),      	ww_w
w31sub,		word31 (P.-),      	ww_w
w31orb,		word31 P.ORB,      	ww_w
w31xorb,	word31 P.XORB,      	ww_w
w31andb,	word31 P.ANDB,      	ww_w
w31notb,	word31 P.NOTB,      	w_w
w31neg,      	word31 P.~,             w_w
w31rshift,	word31 P.RSHIFT,        ww_w
w31rshiftl,  	word31 P.RSHIFTL,       ww_w
w31lshift,	word31 P.LSHIFT,        ww_w
w31gt,		word31cmp (P.>),        ww_b
w31ge,		word31cmp (P.>=),       ww_b
w31lt,		word31cmp (P.<),        ww_b
w31le,		word31cmp (P.<=),       ww_b
w31eq,		word31cmp P.EQL,        ww_b
w31ne,		word31cmp P.NEQ,        ww_b
w31ChkRshift, 	P.INLRSHIFT(P.UINT 31), ww_w
w31ChkRshiftl,	P.INLRSHIFTL(P.UINT 31),ww_w
w31ChkLshift, 	P.INLLSHIFT(P.UINT 31), ww_w

w31min,		P.INLMIN (P.UINT 31), 	ww_w
w31max,		P.INLMAX (P.UINT 31), 	ww_w

(* (pseudo-)word8 primops *)
w31mul_8,	word31 (P.* ),      	w8w8_w8
w31div_8,	word31 (P./),      	w8w8_w8
w31mod_8,	word31 (P.REM),      	w8w8_w8
w31add_8,	word31 (P.+),      	w8w8_w8
w31sub_8,	word31 (P.-),      	w8w8_w8
w31orb_8,	word31 P.ORB,      	w8w8_w8
w31xorb_8,	word31 P.XORB,      	w8w8_w8
w31andb_8,	word31 P.ANDB,      	w8w8_w8
w31notb_8,	word31 P.NOTB,      	w8_w8
w31neg_8,    	word31 P.~,             w8_w8
w31rshift_8,	word31 P.RSHIFT,        w8w_w8
w31rshiftl_8,	word31 P.RSHIFTL,       w8w_w8
w31lshift_8,	word31 P.LSHIFT,        w8w_w8
w31gt_8,	word31cmp (P.>),        w8w8_b
w31ge_8,	word31cmp (P.>=),       w8w8_b
w31lt_8,	word31cmp (P.<),        w8w8_b
w31le_8,	word31cmp (P.<=),       w8w8_b
w31eq_8,	word31cmp P.EQL,        w8w8_b
w31ne_8,	word31cmp P.NEQ,        w8w8_b
w31ChkRshift_8, P.INLRSHIFT(P.UINT 31), w8w_w8
w31ChkRshiftl_8,P.INLRSHIFTL(P.UINT 31),w8w_w8
w31ChkLshift_8, P.INLLSHIFT(P.UINT 31), w8w_w8

w31min_8,	P.INLMIN (P.UINT 31), 	w8w8_w8
w31max_8,	P.INLMAX (P.UINT 31), 	w8w8_w8

(*** word32 primops ***)
w32mul,		word32 (P.* ),      	w32w32_w32
w32div,		word32 (P./),      	w32w32_w32
w32mod,		word32 (P.REM),      	w32w32_w32
w32add,		word32 (P.+),      	w32w32_w32
w32sub,		word32 (P.-),      	w32w32_w32
w32orb,		word32 P.ORB,      	w32w32_w32
w32xorb,	word32 P.XORB,      	w32w32_w32
w32andb,	word32 P.ANDB,      	w32w32_w32
w32notb,	word32 P.NOTB,      	w32_w32
w32neg,		word32 P.~,      	w32_w32
w32rshift,	word32 P.RSHIFT,     	w32w_w32
w32rshiftl,   	word32 P.RSHIFTL,    	w32w_w32
w32lshift,	word32 P.LSHIFT,     	w32w_w32
w32gt,		word32cmp (P.>),        w32w32_b
w32ge,		word32cmp (P.>=),       w32w32_b
w32lt,		word32cmp (P.<),        w32w32_b
w32le,		word32cmp (P.<=),       w32w32_b
w32eq,		word32cmp P.EQL,     	w32w32_b
w32ne,		word32cmp P.NEQ,     	w32w32_b
w32ChkRshift,  	P.INLRSHIFT(P.UINT 32), w32w_w32
w32ChkRshiftl,	P.INLRSHIFTL(P.UINT 32),w32w_w32
w32ChkLshift, 	P.INLLSHIFT(P.UINT 32), w32w_w32

w32min,	 	P.INLMIN (P.UINT 32), 	w32w32_w32
w32max,		P.INLMAX (P.UINT 32), 	w32w32_w32

(* experimental C FFI primops *)
raww8l,       P.RAW_LOAD (P.UINT 8),    w32_w32
rawi8l,       P.RAW_LOAD (P.INT 8),     w32_i32
raww16l,      P.RAW_LOAD (P.UINT 16),   w32_w32
rawi16l,      P.RAW_LOAD (P.INT 16),    w32_i32
raww32l,      P.RAW_LOAD (P.UINT 32),   w32_w32
rawi32l,      P.RAW_LOAD (P.INT 32),    w32_i32
rawf32l,      P.RAW_LOAD (P.FLOAT 32),  w32_f64
rawf64l,      P.RAW_LOAD (P.FLOAT 64),  w32_f64
raww8s,       P.RAW_STORE (P.UINT 8),   w32w32_u
rawi8s,       P.RAW_STORE (P.INT 8),    w32i32_u
raww16s,      P.RAW_STORE (P.UINT 16),  w32w32_u
rawi16s,      P.RAW_STORE (P.INT 16),   w32i32_u
raww32s,      P.RAW_STORE (P.UINT 32),  w32w32_u
rawi32s,      P.RAW_STORE (P.INT 32),   w32i32_u
rawf32s,      P.RAW_STORE (P.FLOAT 32), w32f64_u
rawf64s,      P.RAW_STORE (P.FLOAT 64), w32f64_u
rawccall,     P.RAW_CCALL NONE,         rccType

(* Support for direct construction of C objects on ML heap.
 * rawrecord builds a record holding C objects on the heap.
 * rawselectxxx index on this record.  They are of type:
 *    'a * Word32.word -> Word32.word
 * The 'a is to guarantee that the compiler will treat
 * the record as a ML object, in case it passes thru a gc boundary.
 * rawupdatexxx writes to the record.
 *) 
rawrecord,    P.RAW_RECORD{fblock = false},	i_x
rawrecord64,  P.RAW_RECORD{fblock = true},	i_x

rawselectw8,  P.RAW_LOAD (P.UINT 8),		xw32_w32
rawselecti8,  P.RAW_LOAD (P.INT 8), 		xw32_i32
rawselectw16, P.RAW_LOAD (P.UINT 16), 		xw32_w32
rawselecti16, P.RAW_LOAD (P.INT 16), 		xw32_i32
rawselectw32, P.RAW_LOAD (P.UINT 32), 		xw32_w32
rawselecti32, P.RAW_LOAD (P.INT 32), 		xw32_i32
rawselectf32, P.RAW_LOAD (P.FLOAT 32), 		xw32_f64
rawselectf64, P.RAW_LOAD (P.FLOAT 64), 		xw32_f64

rawupdatew8,  P.RAW_STORE (P.UINT 8), 		xw32w32_u
rawupdatei8,  P.RAW_STORE (P.INT 8), 		xw32i32_u
rawupdatew16, P.RAW_STORE (P.UINT 16), 		xw32w32_u
rawupdatei16, P.RAW_STORE (P.INT 16),	 	xw32i32_u
rawupdatew32, P.RAW_STORE (P.UINT 32), 		xw32w32_u
rawupdatei32, P.RAW_STORE (P.INT 32), 		xw32i32_u
rawupdatef32, P.RAW_STORE (P.FLOAT 32), 	xw32f64_u
rawupdatef64, P.RAW_STORE (P.FLOAT 64), 	xw32f64_u


All the advantages of Linux Managed Hosting--Without the Cost and Risk!
Fully trained technicians. The highest number of Red Hat certifications in
the hosting industry. Fanatical Support. Click to learn more
http://sel.as-us.falkag.net/sel?cmd=lnk&kid=107521&bid=248729&dat=121642