diff options
author | Mike Pall <mike> | 2010-12-31 01:00:54 +0100 |
---|---|---|
committer | Mike Pall <mike> | 2010-12-31 01:00:54 +0100 |
commit | 65b194a2f89eb315029724af56354bb527021192 (patch) | |
tree | d932b57effed9283029f49f8ec82b3182d615cc0 /src/lj_crecord.c | |
parent | dc4b82c33d04930bbc2e54673ebea41ffa3368fc (diff) | |
download | luajit-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.c | 31 |
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 | ||
34 | static GCcdata *argv2cdata(jit_State *J, TRef tr, cTValue *o) | 37 | static 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 |