2 * Sources of the "COMPARE" group instructions
5 /* $Id: do_comp.c,v 2.6 1994/06/24 10:46:13 ceriel Exp $ */
23 PRIVATE compare_obj();
28 /* CMI w: Compare w byte integers, Push negative, zero, positive for <, = or > */
29 register long t = spop(arg_wi(l));
30 register long s = spop(l);
32 LOG(("@T6 DoCMI(%ld)", l));
34 wpush((long)(t < s ? 1 : t > s ? -1 : 0));
40 /* CMF w: Compare w byte reals */
42 double t = fpop(arg_wf(l));
45 LOG(("@T6 DoCMF(%ld)", l));
47 wpush((long)(t < s ? 1 : t > s ? -1 : 0));
56 /* CMU w: Compare w byte unsigneds */
57 register unsigned long t = upop(arg_wi(l));
58 register unsigned long s = upop(l);
60 LOG(("@T6 DoCMU(%ld)", l));
62 wpush((long)(t < s ? 1 : t > s ? -1 : 0));
68 /* CMS w: Compare w byte values, can only be used for bit for bit equality test */
70 LOG(("@T6 DoCMS(%ld)", l));
72 compare_obj(arg_w(l));
77 /* CMP -: Compare pointers */
84 wpush((long)(t < s ? 1 : t > s ? -1 : 0));
89 /* TLT -: True if less, i.e. iff top of stack < 0 */
92 wpush((long)(wpop() < 0 ? 1 : 0));
97 /* TLE -: True if less or equal, i.e. iff top of stack <= 0 */
100 wpush((long)(wpop() <= 0 ? 1 : 0));
105 /* TEQ -: True if equal, i.e. iff top of stack = 0 */
106 LOG(("@T6 DoTEQ()"));
108 wpush((long)(wpop() == 0 ? 1 : 0));
113 /* TNE -: True if not equal, i.e. iff top of stack non zero */
114 LOG(("@T6 DoTNE()"));
116 wpush((long)(wpop() != 0 ? 1 : 0));
121 /* TGE -: True if greater or equal, i.e. iff top of stack >= 0 */
122 LOG(("@T6 DoTGE()"));
124 wpush((long)(wpop() >= 0 ? 1 : 0));
129 /* TGT -: True if greater, i.e. iff top of stack > 0 */
130 LOG(("@T6 DoTGT()"));
132 wpush((long)(wpop() > 0 ? 1 : 0));
135 /********************************************************
138 * Two 'obj_size' sized objects are bytewise *
139 * compared; as soon as one byte is different *
140 * 1 is returned, otherwise 0. No type checking *
141 * is performed. Checking for undefined bytes *
142 * is done when LOGGING is defined. *
143 ********************************************************/
145 PRIVATE compare_obj(obj_size)
148 register ptr addr1; /* ADDRess in object highest on st. */
149 register ptr addr2; /* ADDRess in object deeper in st. */
150 register int comp_res = 0; /* COMPare RESult */
152 for ( addr1 = SP, addr2 = SP + obj_size;
153 addr1 < SP + obj_size;
157 if (!st_sh(addr1) || !st_sh(addr2)) {
159 /* Let's say undefined's are not equal: */
164 if (stack_loc(addr1) != stack_loc(addr2)) {
169 st_dec(2 * obj_size);
170 wpush((long) comp_res);