aboutsummaryrefslogtreecommitdiff
path: root/src/lj_crecord.c
diff options
context:
space:
mode:
authorMike Pall <mike>2010-12-31 01:00:54 +0100
committerMike Pall <mike>2010-12-31 01:00:54 +0100
commit65b194a2f89eb315029724af56354bb527021192 (patch)
treed932b57effed9283029f49f8ec82b3182d615cc0 /src/lj_crecord.c
parentdc4b82c33d04930bbc2e54673ebea41ffa3368fc (diff)
downloadluajit-65b194a2f89eb315029724af56354bb527021192.tar.gz
luajit-65b194a2f89eb315029724af56354bb527021192.tar.bz2
luajit-65b194a2f89eb315029724af56354bb527021192.zip
Copy destination type for CONV from ir->t to op2, too.
Diffstat (limited to 'src/lj_crecord.c')
-rw-r--r--src/lj_crecord.c31
1 files changed, 17 insertions, 14 deletions
diff --git a/src/lj_crecord.c b/src/lj_crecord.c
index 5844b9ed..23b92831 100644
--- a/src/lj_crecord.c
+++ b/src/lj_crecord.c
@@ -29,6 +29,9 @@
29/* Pass IR on to next optimization in chain (FOLD). */ 29/* Pass IR on to next optimization in chain (FOLD). */
30#define emitir(ot, a, b) (lj_ir_set(J, (ot), (a), (b)), lj_opt_fold(J)) 30#define emitir(ot, a, b) (lj_ir_set(J, (ot), (a), (b)), lj_opt_fold(J))
31 31
32#define emitconv(a, dt, st, flags) \
33 emitir(IRT(IR_CONV, (dt)), (a), (st)|((dt) << 5)|(flags))
34
32/* -- C type checks ------------------------------------------------------- */ 35/* -- C type checks ------------------------------------------------------- */
33 36
34static GCcdata *argv2cdata(jit_State *J, TRef tr, cTValue *o) 37static GCcdata *argv2cdata(jit_State *J, TRef tr, cTValue *o)
@@ -145,15 +148,14 @@ static void crec_ct_ct(jit_State *J, CType *d, CType *s, TRef dp, TRef sp)
145#if LJ_64 148#if LJ_64
146 /* Sign-extend 32 to 64 bit integer. */ 149 /* Sign-extend 32 to 64 bit integer. */
147 if (dsize == 8 && ssize < 8 && !(sinfo & CTF_UNSIGNED)) 150 if (dsize == 8 && ssize < 8 && !(sinfo & CTF_UNSIGNED))
148 sp = emitir(IRT(IR_CONV, dt), sp, IRT_INT|IRCONV_SEXT); 151 sp = emitconv(sp, dt, IRT_INT, IRCONV_SEXT);
149 /* All other conversions are no-ops on x64. */ 152 /* All other conversions are no-ops on x64. */
150#else 153#else
151 if (dsize == 8 && ssize < 8) /* Extend to 64 bit integer. */ 154 if (dsize == 8 && ssize < 8) /* Extend to 64 bit integer. */
152 sp = emitir(IRT(IR_CONV, dt), sp, 155 sp = emitconv(sp, dt, ssize < 4 ? IRT_INT : st,
153 (st < IRT_INT ? IRT_INT : st) | 156 (sinfo & CTF_UNSIGNED) ? 0 : IRCONV_SEXT);
154 ((sinfo & CTF_UNSIGNED) ? 0 : IRCONV_SEXT));
155 else if (dsize < 8 && ssize == 8) /* Truncate from 64 bit integer. */ 157 else if (dsize < 8 && ssize == 8) /* Truncate from 64 bit integer. */
156 sp = emitir(IRT(IR_CONV, dt < IRT_INT ? IRT_INT : dt), sp, st); 158 sp = emitconv(sp, dsize < 4 ? IRT_INT : dt, st, 0);
157#endif 159#endif
158 xstore: 160 xstore:
159 emitir(IRT(IR_XSTORE, dt), dp, sp); 161 emitir(IRT(IR_XSTORE, dt), dp, sp);
@@ -163,7 +165,7 @@ static void crec_ct_ct(jit_State *J, CType *d, CType *s, TRef dp, TRef sp)
163 /* fallthrough */ 165 /* fallthrough */
164 case CCX(I, F): 166 case CCX(I, F):
165 if (dt == IRT_CDATA || st == IRT_CDATA) goto err_nyi; 167 if (dt == IRT_CDATA || st == IRT_CDATA) goto err_nyi;
166 sp = emitir(IRT(IR_CONV, dsize < 4 ? IRT_INT : dt), sp, st|IRCONV_TRUNC); 168 sp = emitconv(sp, dsize < 4 ? IRT_INT : dt, st, IRCONV_TRUNC);
167 goto xstore; 169 goto xstore;
168 case CCX(I, P): 170 case CCX(I, P):
169 case CCX(I, A): 171 case CCX(I, A):
@@ -177,7 +179,7 @@ static void crec_ct_ct(jit_State *J, CType *d, CType *s, TRef dp, TRef sp)
177 case CCX(F, I): 179 case CCX(F, I):
178 conv_F_I: 180 conv_F_I:
179 if (dt == IRT_CDATA || st == IRT_CDATA) goto err_nyi; 181 if (dt == IRT_CDATA || st == IRT_CDATA) goto err_nyi;
180 sp = emitir(IRT(IR_CONV, dt), sp, st < IRT_INT ? IRT_INT : st); 182 sp = emitconv(sp, dt, ssize < 4 ? IRT_INT : st, 0);
181 goto xstore; 183 goto xstore;
182 case CCX(F, C): 184 case CCX(F, C):
183 sp = emitir(IRT(IR_XLOAD, st), sp, 0); /* Load re. */ 185 sp = emitir(IRT(IR_XLOAD, st), sp, 0); /* Load re. */
@@ -185,7 +187,7 @@ static void crec_ct_ct(jit_State *J, CType *d, CType *s, TRef dp, TRef sp)
185 case CCX(F, F): 187 case CCX(F, F):
186 conv_F_F: 188 conv_F_F:
187 if (dt == IRT_CDATA || st == IRT_CDATA) goto err_nyi; 189 if (dt == IRT_CDATA || st == IRT_CDATA) goto err_nyi;
188 if (dt != st) sp = emitir(IRT(IR_CONV, dt), sp, st); 190 if (dt != st) sp = emitconv(sp, dt, st, 0);
189 goto xstore; 191 goto xstore;
190 192
191 /* Destination is a complex number. */ 193 /* Destination is a complex number. */
@@ -206,8 +208,8 @@ static void crec_ct_ct(jit_State *J, CType *d, CType *s, TRef dp, TRef sp)
206 ptr = emitir(IRT(IR_ADD, IRT_PTR), sp, lj_ir_kintp(J, (ssize >> 1))); 208 ptr = emitir(IRT(IR_ADD, IRT_PTR), sp, lj_ir_kintp(J, (ssize >> 1)));
207 im = emitir(IRT(IR_XLOAD, st), ptr, 0); 209 im = emitir(IRT(IR_XLOAD, st), ptr, 0);
208 if (dt != st) { 210 if (dt != st) {
209 re = emitir(IRT(IR_CONV, dt), re, st); 211 re = emitconv(re, dt, st, 0);
210 im = emitir(IRT(IR_CONV, dt), im, st); 212 im = emitconv(im, dt, st, 0);
211 } 213 }
212 emitir(IRT(IR_XSTORE, dt), dp, re); 214 emitir(IRT(IR_XSTORE, dt), dp, re);
213 ptr = emitir(IRT(IR_ADD, IRT_PTR), dp, lj_ir_kintp(J, (dsize >> 1))); 215 ptr = emitir(IRT(IR_ADD, IRT_PTR), dp, lj_ir_kintp(J, (dsize >> 1)));
@@ -233,13 +235,13 @@ static void crec_ct_ct(jit_State *J, CType *d, CType *s, TRef dp, TRef sp)
233 case CCX(P, I): 235 case CCX(P, I):
234 if (st == IRT_CDATA) goto err_nyi; 236 if (st == IRT_CDATA) goto err_nyi;
235 if (!LJ_64 && ssize == 8) /* Truncate from 64 bit integer. */ 237 if (!LJ_64 && ssize == 8) /* Truncate from 64 bit integer. */
236 sp = emitir(IRT(IR_CONV, IRT_U32), sp, st); 238 sp = emitconv(sp, IRT_U32, st, 0);
237 goto xstore; 239 goto xstore;
238 case CCX(P, F): 240 case CCX(P, F):
239 if (st == IRT_CDATA) goto err_nyi; 241 if (st == IRT_CDATA) goto err_nyi;
240 /* The signed conversion is cheaper. x64 really has 47 bit pointers. */ 242 /* The signed conversion is cheaper. x64 really has 47 bit pointers. */
241 sp = emitir(IRT(IR_CONV, (LJ_64 && dsize == 8) ? IRT_I64 : IRT_U32), 243 sp = emitconv(sp, (LJ_64 && dsize == 8) ? IRT_I64 : IRT_U32,
242 sp, st|IRCONV_TRUNC); 244 st, IRCONV_TRUNC);
243 goto xstore; 245 goto xstore;
244 246
245 /* Destination is an array. */ 247 /* Destination is an array. */
@@ -274,7 +276,7 @@ static TRef crec_tv_ct(jit_State *J, CType *s, CTypeID sid, TRef sp)
274 goto err_nyi; /* NYI: copyval of >64 bit integers. */ 276 goto err_nyi; /* NYI: copyval of >64 bit integers. */
275 tr = emitir(IRT(IR_XLOAD, t), sp, 0); 277 tr = emitir(IRT(IR_XLOAD, t), sp, 0);
276 if (t == IRT_FLOAT || t == IRT_U32) { /* Keep uint32_t/float as numbers. */ 278 if (t == IRT_FLOAT || t == IRT_U32) { /* Keep uint32_t/float as numbers. */
277 tr = emitir(IRT(IR_CONV, IRT_NUM), tr, t); 279 tr = emitconv(tr, IRT_NUM, t, 0);
278 } else if (t == IRT_I64 || t == IRT_U64) { /* Box 64 bit integer. */ 280 } else if (t == IRT_I64 || t == IRT_U64) { /* Box 64 bit integer. */
279 TRef dp = emitir(IRTG(IR_CNEW, IRT_CDATA), lj_ir_kint(J, sid), TREF_NIL); 281 TRef dp = emitir(IRTG(IR_CNEW, IRT_CDATA), lj_ir_kint(J, sid), TREF_NIL);
280 TRef ptr = emitir(IRT(IR_ADD, IRT_PTR), dp, 282 TRef ptr = emitir(IRT(IR_ADD, IRT_PTR), dp,
@@ -567,5 +569,6 @@ void LJ_FASTCALL recff_ffi_new(jit_State *J, RecordFFData *rd)
567 569
568#undef IR 570#undef IR
569#undef emitir 571#undef emitir
572#undef emitconv
570 573
571#endif 574#endif