Commit b3249f630e95f3235da438ee1a6cd1b867084e9c
1 parent
9c29504e
target-alpha: convert byte manipulation instructions to TCG
Signed-off-by: Aurelien Jarno <aurelien@aurel32.net> git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@5246 c046a42c-6fe2-441c-8c8c-71466251a162
Showing
5 changed files
with
167 additions
and
266 deletions
target-alpha/helper.h
| @@ -9,3 +9,21 @@ DEF_HELPER(uint64_t, helper_amask, (uint64_t)) | @@ -9,3 +9,21 @@ DEF_HELPER(uint64_t, helper_amask, (uint64_t)) | ||
| 9 | DEF_HELPER(uint64_t, helper_ctpop, (uint64_t)) | 9 | DEF_HELPER(uint64_t, helper_ctpop, (uint64_t)) |
| 10 | DEF_HELPER(uint64_t, helper_ctlz, (uint64_t)) | 10 | DEF_HELPER(uint64_t, helper_ctlz, (uint64_t)) |
| 11 | DEF_HELPER(uint64_t, helper_cttz, (uint64_t)) | 11 | DEF_HELPER(uint64_t, helper_cttz, (uint64_t)) |
| 12 | + | ||
| 13 | +DEF_HELPER(uint64_t, helper_mskbl, (int64_t, uint64_t)) | ||
| 14 | +DEF_HELPER(uint64_t, helper_insbl, (int64_t, uint64_t)) | ||
| 15 | +DEF_HELPER(uint64_t, helper_mskwl, (int64_t, uint64_t)) | ||
| 16 | +DEF_HELPER(uint64_t, helper_inswl, (int64_t, uint64_t)) | ||
| 17 | +DEF_HELPER(uint64_t, helper_mskll, (int64_t, uint64_t)) | ||
| 18 | +DEF_HELPER(uint64_t, helper_insll, (int64_t, uint64_t)) | ||
| 19 | +DEF_HELPER(uint64_t, helper_zap, (int64_t, uint64_t)) | ||
| 20 | +DEF_HELPER(uint64_t, helper_zapnot, (int64_t, uint64_t)) | ||
| 21 | +DEF_HELPER(uint64_t, helper_mskql, (int64_t, uint64_t)) | ||
| 22 | +DEF_HELPER(uint64_t, helper_insql, (int64_t, uint64_t)) | ||
| 23 | +DEF_HELPER(uint64_t, helper_mskwh, (int64_t, uint64_t)) | ||
| 24 | +DEF_HELPER(uint64_t, helper_inswh, (int64_t, uint64_t)) | ||
| 25 | +DEF_HELPER(uint64_t, helper_msklh, (int64_t, uint64_t)) | ||
| 26 | +DEF_HELPER(uint64_t, helper_inslh, (int64_t, uint64_t)) | ||
| 27 | +DEF_HELPER(uint64_t, helper_mskqh, (int64_t, uint64_t)) | ||
| 28 | +DEF_HELPER(uint64_t, helper_insqh, (int64_t, uint64_t)) | ||
| 29 | + |
target-alpha/op.c
| @@ -243,145 +243,6 @@ void OPPROTO op_umulh (void) | @@ -243,145 +243,6 @@ void OPPROTO op_umulh (void) | ||
| 243 | RETURN(); | 243 | RETURN(); |
| 244 | } | 244 | } |
| 245 | 245 | ||
| 246 | -/* Logical */ | ||
| 247 | -void OPPROTO op_mskbl (void) | ||
| 248 | -{ | ||
| 249 | - helper_mskbl(); | ||
| 250 | - RETURN(); | ||
| 251 | -} | ||
| 252 | - | ||
| 253 | -void OPPROTO op_extbl (void) | ||
| 254 | -{ | ||
| 255 | - helper_extbl(); | ||
| 256 | - RETURN(); | ||
| 257 | -} | ||
| 258 | - | ||
| 259 | -void OPPROTO op_insbl (void) | ||
| 260 | -{ | ||
| 261 | - helper_insbl(); | ||
| 262 | - RETURN(); | ||
| 263 | -} | ||
| 264 | - | ||
| 265 | -void OPPROTO op_mskwl (void) | ||
| 266 | -{ | ||
| 267 | - helper_mskwl(); | ||
| 268 | - RETURN(); | ||
| 269 | -} | ||
| 270 | - | ||
| 271 | -void OPPROTO op_extwl (void) | ||
| 272 | -{ | ||
| 273 | - helper_extwl(); | ||
| 274 | - RETURN(); | ||
| 275 | -} | ||
| 276 | - | ||
| 277 | -void OPPROTO op_inswl (void) | ||
| 278 | -{ | ||
| 279 | - helper_inswl(); | ||
| 280 | - RETURN(); | ||
| 281 | -} | ||
| 282 | - | ||
| 283 | -void OPPROTO op_mskll (void) | ||
| 284 | -{ | ||
| 285 | - helper_mskll(); | ||
| 286 | - RETURN(); | ||
| 287 | -} | ||
| 288 | - | ||
| 289 | -void OPPROTO op_extll (void) | ||
| 290 | -{ | ||
| 291 | - helper_extll(); | ||
| 292 | - RETURN(); | ||
| 293 | -} | ||
| 294 | - | ||
| 295 | -void OPPROTO op_insll (void) | ||
| 296 | -{ | ||
| 297 | - helper_insll(); | ||
| 298 | - RETURN(); | ||
| 299 | -} | ||
| 300 | - | ||
| 301 | -void OPPROTO op_zap (void) | ||
| 302 | -{ | ||
| 303 | - helper_zap(); | ||
| 304 | - RETURN(); | ||
| 305 | -} | ||
| 306 | - | ||
| 307 | -void OPPROTO op_zapnot (void) | ||
| 308 | -{ | ||
| 309 | - helper_zapnot(); | ||
| 310 | - RETURN(); | ||
| 311 | -} | ||
| 312 | - | ||
| 313 | -void OPPROTO op_mskql (void) | ||
| 314 | -{ | ||
| 315 | - helper_mskql(); | ||
| 316 | - RETURN(); | ||
| 317 | -} | ||
| 318 | - | ||
| 319 | -void OPPROTO op_extql (void) | ||
| 320 | -{ | ||
| 321 | - helper_extql(); | ||
| 322 | - RETURN(); | ||
| 323 | -} | ||
| 324 | - | ||
| 325 | -void OPPROTO op_insql (void) | ||
| 326 | -{ | ||
| 327 | - helper_insql(); | ||
| 328 | - RETURN(); | ||
| 329 | -} | ||
| 330 | - | ||
| 331 | -void OPPROTO op_mskwh (void) | ||
| 332 | -{ | ||
| 333 | - helper_mskwh(); | ||
| 334 | - RETURN(); | ||
| 335 | -} | ||
| 336 | - | ||
| 337 | -void OPPROTO op_inswh (void) | ||
| 338 | -{ | ||
| 339 | - helper_inswh(); | ||
| 340 | - RETURN(); | ||
| 341 | -} | ||
| 342 | - | ||
| 343 | -void OPPROTO op_extwh (void) | ||
| 344 | -{ | ||
| 345 | - helper_extwh(); | ||
| 346 | - RETURN(); | ||
| 347 | -} | ||
| 348 | - | ||
| 349 | -void OPPROTO op_msklh (void) | ||
| 350 | -{ | ||
| 351 | - helper_msklh(); | ||
| 352 | - RETURN(); | ||
| 353 | -} | ||
| 354 | - | ||
| 355 | -void OPPROTO op_inslh (void) | ||
| 356 | -{ | ||
| 357 | - helper_inslh(); | ||
| 358 | - RETURN(); | ||
| 359 | -} | ||
| 360 | - | ||
| 361 | -void OPPROTO op_extlh (void) | ||
| 362 | -{ | ||
| 363 | - helper_extlh(); | ||
| 364 | - RETURN(); | ||
| 365 | -} | ||
| 366 | - | ||
| 367 | -void OPPROTO op_mskqh (void) | ||
| 368 | -{ | ||
| 369 | - helper_mskqh(); | ||
| 370 | - RETURN(); | ||
| 371 | -} | ||
| 372 | - | ||
| 373 | -void OPPROTO op_insqh (void) | ||
| 374 | -{ | ||
| 375 | - helper_insqh(); | ||
| 376 | - RETURN(); | ||
| 377 | -} | ||
| 378 | - | ||
| 379 | -void OPPROTO op_extqh (void) | ||
| 380 | -{ | ||
| 381 | - helper_extqh(); | ||
| 382 | - RETURN(); | ||
| 383 | -} | ||
| 384 | - | ||
| 385 | /* Tests */ | 246 | /* Tests */ |
| 386 | void OPPROTO op_cmpult (void) | 247 | void OPPROTO op_cmpult (void) |
| 387 | { | 248 | { |
target-alpha/op_helper.c
| @@ -243,133 +243,91 @@ static always_inline uint64_t byte_zap (uint64_t op, uint8_t mskb) | @@ -243,133 +243,91 @@ static always_inline uint64_t byte_zap (uint64_t op, uint8_t mskb) | ||
| 243 | return op & ~mask; | 243 | return op & ~mask; |
| 244 | } | 244 | } |
| 245 | 245 | ||
| 246 | -void helper_mskbl (void) | 246 | +uint64_t helper_mskbl(uint64_t val, uint64_t mask) |
| 247 | { | 247 | { |
| 248 | - T0 = byte_zap(T0, 0x01 << (T1 & 7)); | 248 | + return byte_zap(val, 0x01 << (mask & 7)); |
| 249 | } | 249 | } |
| 250 | 250 | ||
| 251 | -void helper_extbl (void) | 251 | +uint64_t helper_insbl(uint64_t val, uint64_t mask) |
| 252 | { | 252 | { |
| 253 | - T0 >>= (T1 & 7) * 8; | ||
| 254 | - T0 = byte_zap(T0, 0xFE); | 253 | + val <<= (mask & 7) * 8; |
| 254 | + return byte_zap(val, ~(0x01 << (mask & 7))); | ||
| 255 | } | 255 | } |
| 256 | 256 | ||
| 257 | -void helper_insbl (void) | 257 | +uint64_t helper_mskwl(uint64_t val, uint64_t mask) |
| 258 | { | 258 | { |
| 259 | - T0 <<= (T1 & 7) * 8; | ||
| 260 | - T0 = byte_zap(T0, ~(0x01 << (T1 & 7))); | 259 | + return byte_zap(val, 0x03 << (mask & 7)); |
| 261 | } | 260 | } |
| 262 | 261 | ||
| 263 | -void helper_mskwl (void) | 262 | +uint64_t helper_inswl(uint64_t val, uint64_t mask) |
| 264 | { | 263 | { |
| 265 | - T0 = byte_zap(T0, 0x03 << (T1 & 7)); | 264 | + val <<= (mask & 7) * 8; |
| 265 | + return byte_zap(val, ~(0x03 << (mask & 7))); | ||
| 266 | } | 266 | } |
| 267 | 267 | ||
| 268 | -void helper_extwl (void) | 268 | +uint64_t helper_mskll(uint64_t val, uint64_t mask) |
| 269 | { | 269 | { |
| 270 | - T0 >>= (T1 & 7) * 8; | ||
| 271 | - T0 = byte_zap(T0, 0xFC); | 270 | + return byte_zap(val, 0x0F << (mask & 7)); |
| 272 | } | 271 | } |
| 273 | 272 | ||
| 274 | -void helper_inswl (void) | 273 | +uint64_t helper_insll(uint64_t val, uint64_t mask) |
| 275 | { | 274 | { |
| 276 | - T0 <<= (T1 & 7) * 8; | ||
| 277 | - T0 = byte_zap(T0, ~(0x03 << (T1 & 7))); | 275 | + val <<= (mask & 7) * 8; |
| 276 | + return byte_zap(val, ~(0x0F << (mask & 7))); | ||
| 278 | } | 277 | } |
| 279 | 278 | ||
| 280 | -void helper_mskll (void) | 279 | +uint64_t helper_zap(uint64_t val, uint64_t mask) |
| 281 | { | 280 | { |
| 282 | - T0 = byte_zap(T0, 0x0F << (T1 & 7)); | 281 | + return byte_zap(val, mask); |
| 283 | } | 282 | } |
| 284 | 283 | ||
| 285 | -void helper_extll (void) | 284 | +uint64_t helper_zapnot(uint64_t val, uint64_t mask) |
| 286 | { | 285 | { |
| 287 | - T0 >>= (T1 & 7) * 8; | ||
| 288 | - T0 = byte_zap(T0, 0xF0); | 286 | + return byte_zap(val, ~mask); |
| 289 | } | 287 | } |
| 290 | 288 | ||
| 291 | -void helper_insll (void) | 289 | +uint64_t helper_mskql(uint64_t val, uint64_t mask) |
| 292 | { | 290 | { |
| 293 | - T0 <<= (T1 & 7) * 8; | ||
| 294 | - T0 = byte_zap(T0, ~(0x0F << (T1 & 7))); | 291 | + return byte_zap(val, 0xFF << (mask & 7)); |
| 295 | } | 292 | } |
| 296 | 293 | ||
| 297 | -void helper_zap (void) | 294 | +uint64_t helper_insql(uint64_t val, uint64_t mask) |
| 298 | { | 295 | { |
| 299 | - T0 = byte_zap(T0, T1); | 296 | + val <<= (mask & 7) * 8; |
| 297 | + return byte_zap(val, ~(0xFF << (mask & 7))); | ||
| 300 | } | 298 | } |
| 301 | 299 | ||
| 302 | -void helper_zapnot (void) | 300 | +uint64_t helper_mskwh(uint64_t val, uint64_t mask) |
| 303 | { | 301 | { |
| 304 | - T0 = byte_zap(T0, ~T1); | 302 | + return byte_zap(val, (0x03 << (mask & 7)) >> 8); |
| 305 | } | 303 | } |
| 306 | 304 | ||
| 307 | -void helper_mskql (void) | 305 | +uint64_t helper_inswh(uint64_t val, uint64_t mask) |
| 308 | { | 306 | { |
| 309 | - T0 = byte_zap(T0, 0xFF << (T1 & 7)); | 307 | + val >>= 64 - ((mask & 7) * 8); |
| 308 | + return byte_zap(val, ~((0x03 << (mask & 7)) >> 8)); | ||
| 310 | } | 309 | } |
| 311 | 310 | ||
| 312 | -void helper_extql (void) | 311 | +uint64_t helper_msklh(uint64_t val, uint64_t mask) |
| 313 | { | 312 | { |
| 314 | - T0 >>= (T1 & 7) * 8; | ||
| 315 | - T0 = byte_zap(T0, 0x00); | 313 | + return byte_zap(val, (0x0F << (mask & 7)) >> 8); |
| 316 | } | 314 | } |
| 317 | 315 | ||
| 318 | -void helper_insql (void) | 316 | +uint64_t helper_inslh(uint64_t val, uint64_t mask) |
| 319 | { | 317 | { |
| 320 | - T0 <<= (T1 & 7) * 8; | ||
| 321 | - T0 = byte_zap(T0, ~(0xFF << (T1 & 7))); | 318 | + val >>= 64 - ((mask & 7) * 8); |
| 319 | + return byte_zap(val, ~((0x0F << (mask & 7)) >> 8)); | ||
| 322 | } | 320 | } |
| 323 | 321 | ||
| 324 | -void helper_mskwh (void) | 322 | +uint64_t helper_mskqh(uint64_t val, uint64_t mask) |
| 325 | { | 323 | { |
| 326 | - T0 = byte_zap(T0, (0x03 << (T1 & 7)) >> 8); | 324 | + return byte_zap(val, (0xFF << (mask & 7)) >> 8); |
| 327 | } | 325 | } |
| 328 | 326 | ||
| 329 | -void helper_inswh (void) | 327 | +uint64_t helper_insqh(uint64_t val, uint64_t mask) |
| 330 | { | 328 | { |
| 331 | - T0 >>= 64 - ((T1 & 7) * 8); | ||
| 332 | - T0 = byte_zap(T0, ~((0x03 << (T1 & 7)) >> 8)); | ||
| 333 | -} | ||
| 334 | - | ||
| 335 | -void helper_extwh (void) | ||
| 336 | -{ | ||
| 337 | - T0 <<= 64 - ((T1 & 7) * 8); | ||
| 338 | - T0 = byte_zap(T0, ~0x07); | ||
| 339 | -} | ||
| 340 | - | ||
| 341 | -void helper_msklh (void) | ||
| 342 | -{ | ||
| 343 | - T0 = byte_zap(T0, (0x0F << (T1 & 7)) >> 8); | ||
| 344 | -} | ||
| 345 | - | ||
| 346 | -void helper_inslh (void) | ||
| 347 | -{ | ||
| 348 | - T0 >>= 64 - ((T1 & 7) * 8); | ||
| 349 | - T0 = byte_zap(T0, ~((0x0F << (T1 & 7)) >> 8)); | ||
| 350 | -} | ||
| 351 | - | ||
| 352 | -void helper_extlh (void) | ||
| 353 | -{ | ||
| 354 | - T0 <<= 64 - ((T1 & 7) * 8); | ||
| 355 | - T0 = byte_zap(T0, ~0x0F); | ||
| 356 | -} | ||
| 357 | - | ||
| 358 | -void helper_mskqh (void) | ||
| 359 | -{ | ||
| 360 | - T0 = byte_zap(T0, (0xFF << (T1 & 7)) >> 8); | ||
| 361 | -} | ||
| 362 | - | ||
| 363 | -void helper_insqh (void) | ||
| 364 | -{ | ||
| 365 | - T0 >>= 64 - ((T1 & 7) * 8); | ||
| 366 | - T0 = byte_zap(T0, ~((0xFF << (T1 & 7)) >> 8)); | ||
| 367 | -} | ||
| 368 | - | ||
| 369 | -void helper_extqh (void) | ||
| 370 | -{ | ||
| 371 | - T0 <<= 64 - ((T1 & 7) * 8); | ||
| 372 | - T0 = byte_zap(T0, 0x00); | 329 | + val >>= 64 - ((mask & 7) * 8); |
| 330 | + return byte_zap(val, ~((0xFF << (mask & 7)) >> 8)); | ||
| 373 | } | 331 | } |
| 374 | 332 | ||
| 375 | void helper_cmpbge (void) | 333 | void helper_cmpbge (void) |
target-alpha/op_helper.h
| @@ -33,29 +33,6 @@ void helper_subqv (void); | @@ -33,29 +33,6 @@ void helper_subqv (void); | ||
| 33 | void helper_sublv (void); | 33 | void helper_sublv (void); |
| 34 | void helper_mullv (void); | 34 | void helper_mullv (void); |
| 35 | void helper_mulqv (void); | 35 | void helper_mulqv (void); |
| 36 | -void helper_mskbl (void); | ||
| 37 | -void helper_extbl (void); | ||
| 38 | -void helper_insbl (void); | ||
| 39 | -void helper_mskwl (void); | ||
| 40 | -void helper_extwl (void); | ||
| 41 | -void helper_inswl (void); | ||
| 42 | -void helper_mskll (void); | ||
| 43 | -void helper_extll (void); | ||
| 44 | -void helper_insll (void); | ||
| 45 | -void helper_zap (void); | ||
| 46 | -void helper_zapnot (void); | ||
| 47 | -void helper_mskql (void); | ||
| 48 | -void helper_extql (void); | ||
| 49 | -void helper_insql (void); | ||
| 50 | -void helper_mskwh (void); | ||
| 51 | -void helper_inswh (void); | ||
| 52 | -void helper_extwh (void); | ||
| 53 | -void helper_msklh (void); | ||
| 54 | -void helper_inslh (void); | ||
| 55 | -void helper_extlh (void); | ||
| 56 | -void helper_mskqh (void); | ||
| 57 | -void helper_insqh (void); | ||
| 58 | -void helper_extqh (void); | ||
| 59 | void helper_cmpbge (void); | 36 | void helper_cmpbge (void); |
| 60 | void helper_cmov_fir (int freg); | 37 | void helper_cmov_fir (int freg); |
| 61 | 38 |
target-alpha/translate.c
| @@ -468,6 +468,93 @@ static always_inline void gen_itf (DisasContext *ctx, | @@ -468,6 +468,93 @@ static always_inline void gen_itf (DisasContext *ctx, | ||
| 468 | gen_store_fir(ctx, rc, 0); | 468 | gen_store_fir(ctx, rc, 0); |
| 469 | } | 469 | } |
| 470 | 470 | ||
| 471 | +/* EXTWH, EXTWH, EXTLH, EXTQH */ | ||
| 472 | +static always_inline void gen_ext_h(void (*tcg_gen_ext_i64)(TCGv t0, TCGv t1), | ||
| 473 | + int ra, int rb, int rc, | ||
| 474 | + int islit, int8_t lit) | ||
| 475 | +{ | ||
| 476 | + if (unlikely(rc == 31)) | ||
| 477 | + return; | ||
| 478 | + | ||
| 479 | + if (ra != 31) { | ||
| 480 | + if (islit) | ||
| 481 | + tcg_gen_shli_i64(cpu_ir[rc], cpu_ir[ra], 64 - ((lit & 7) * 8)); | ||
| 482 | + else if (rb != 31) { | ||
| 483 | + TCGv tmp1, tmp2; | ||
| 484 | + tmp1 = tcg_temp_new(TCG_TYPE_I64); | ||
| 485 | + tcg_gen_andi_i64(tmp1, cpu_ir[rb], 7); | ||
| 486 | + tcg_gen_shli_i64(tmp1, tmp1, 3); | ||
| 487 | + tmp2 = tcg_const_i64(64); | ||
| 488 | + tcg_gen_sub_i64(tmp1, tmp2, tmp1); | ||
| 489 | + tcg_temp_free(tmp2); | ||
| 490 | + if (tcg_gen_ext_i64) { | ||
| 491 | + tcg_gen_shl_i64(tmp1, cpu_ir[ra], tmp1); | ||
| 492 | + tcg_gen_ext_i64(cpu_ir[rc], tmp1); | ||
| 493 | + } else | ||
| 494 | + tcg_gen_shl_i64(cpu_ir[rc], cpu_ir[ra], tmp1); | ||
| 495 | + tcg_temp_free(tmp1); | ||
| 496 | + } else | ||
| 497 | + tcg_gen_mov_i64(cpu_ir[rc], cpu_ir[ra]); | ||
| 498 | + } else | ||
| 499 | + tcg_gen_movi_i64(cpu_ir[rc], 0); | ||
| 500 | +} | ||
| 501 | + | ||
| 502 | +/* EXTBL, EXTWL, EXTWL, EXTLL, EXTQL */ | ||
| 503 | +static always_inline void gen_ext_l(void (*tcg_gen_ext_i64)(TCGv t0, TCGv t1), | ||
| 504 | + int ra, int rb, int rc, | ||
| 505 | + int islit, int8_t lit) | ||
| 506 | +{ | ||
| 507 | + if (unlikely(rc == 31)) | ||
| 508 | + return; | ||
| 509 | + | ||
| 510 | + if (ra != 31) { | ||
| 511 | + if (islit) | ||
| 512 | + tcg_gen_shri_i64(cpu_ir[rc], cpu_ir[ra], (lit & 7) * 8); | ||
| 513 | + else if (rb != 31) { | ||
| 514 | + TCGv tmp = tcg_temp_new(TCG_TYPE_I64); | ||
| 515 | + tcg_gen_andi_i64(tmp, cpu_ir[rb], 7); | ||
| 516 | + tcg_gen_shli_i64(tmp, tmp, 3); | ||
| 517 | + if (tcg_gen_ext_i64) { | ||
| 518 | + tcg_gen_shr_i64(tmp, cpu_ir[ra], tmp); | ||
| 519 | + tcg_gen_ext_i64(cpu_ir[rc], tmp); | ||
| 520 | + } else | ||
| 521 | + tcg_gen_shr_i64(cpu_ir[rc], cpu_ir[ra], tmp); | ||
| 522 | + tcg_temp_free(tmp); | ||
| 523 | + } else | ||
| 524 | + tcg_gen_mov_i64(cpu_ir[rc], cpu_ir[ra]); | ||
| 525 | + } else | ||
| 526 | + tcg_gen_movi_i64(cpu_ir[rc], 0); | ||
| 527 | +} | ||
| 528 | + | ||
| 529 | +/* Code to call byte manipulation helpers, used by: | ||
| 530 | + INSWH, INSLH, INSQH, INSBL, INSWL, INSLL, INSQL, | ||
| 531 | + MSKWH, MSKLH, MSKQH, MSKBL, MSKWL, MSKLL, MSKQL, | ||
| 532 | + ZAP, ZAPNOT | ||
| 533 | + | ||
| 534 | + WARNING: it assumes that when ra31 is used, the result is 0. | ||
| 535 | +*/ | ||
| 536 | +static always_inline void gen_byte_manipulation(void *helper, | ||
| 537 | + int ra, int rb, int rc, | ||
| 538 | + int islit, uint8_t lit) | ||
| 539 | +{ | ||
| 540 | + if (unlikely(rc == 31)) | ||
| 541 | + return; | ||
| 542 | + | ||
| 543 | + if (ra != 31) { | ||
| 544 | + if (islit || rb == 31) { | ||
| 545 | + TCGv tmp = tcg_temp_new(TCG_TYPE_I64); | ||
| 546 | + if (islit) | ||
| 547 | + tcg_gen_movi_i64(tmp, lit); | ||
| 548 | + else | ||
| 549 | + tcg_gen_movi_i64(tmp, 0); | ||
| 550 | + tcg_gen_helper_1_2(helper, cpu_ir[rc], cpu_ir[ra], tmp); | ||
| 551 | + tcg_temp_free(tmp); | ||
| 552 | + } else | ||
| 553 | + tcg_gen_helper_1_2(helper, cpu_ir[rc], cpu_ir[ra], cpu_ir[rb]); | ||
| 554 | + } else | ||
| 555 | + tcg_gen_movi_i64(cpu_ir[rc], 0); | ||
| 556 | +} | ||
| 557 | + | ||
| 471 | static always_inline int translate_one (DisasContext *ctx, uint32_t insn) | 558 | static always_inline int translate_one (DisasContext *ctx, uint32_t insn) |
| 472 | { | 559 | { |
| 473 | uint32_t palcode; | 560 | uint32_t palcode; |
| @@ -1101,51 +1188,51 @@ static always_inline int translate_one (DisasContext *ctx, uint32_t insn) | @@ -1101,51 +1188,51 @@ static always_inline int translate_one (DisasContext *ctx, uint32_t insn) | ||
| 1101 | switch (fn7) { | 1188 | switch (fn7) { |
| 1102 | case 0x02: | 1189 | case 0x02: |
| 1103 | /* MSKBL */ | 1190 | /* MSKBL */ |
| 1104 | - gen_arith3(ctx, &gen_op_mskbl, ra, rb, rc, islit, lit); | 1191 | + gen_byte_manipulation(helper_mskbl, ra, rb, rc, islit, lit); |
| 1105 | break; | 1192 | break; |
| 1106 | case 0x06: | 1193 | case 0x06: |
| 1107 | /* EXTBL */ | 1194 | /* EXTBL */ |
| 1108 | - gen_arith3(ctx, &gen_op_extbl, ra, rb, rc, islit, lit); | 1195 | + gen_ext_l(&tcg_gen_ext8u_i64, ra, rb, rc, islit, lit); |
| 1109 | break; | 1196 | break; |
| 1110 | case 0x0B: | 1197 | case 0x0B: |
| 1111 | /* INSBL */ | 1198 | /* INSBL */ |
| 1112 | - gen_arith3(ctx, &gen_op_insbl, ra, rb, rc, islit, lit); | 1199 | + gen_byte_manipulation(helper_insbl, ra, rb, rc, islit, lit); |
| 1113 | break; | 1200 | break; |
| 1114 | case 0x12: | 1201 | case 0x12: |
| 1115 | /* MSKWL */ | 1202 | /* MSKWL */ |
| 1116 | - gen_arith3(ctx, &gen_op_mskwl, ra, rb, rc, islit, lit); | 1203 | + gen_byte_manipulation(helper_mskwl, ra, rb, rc, islit, lit); |
| 1117 | break; | 1204 | break; |
| 1118 | case 0x16: | 1205 | case 0x16: |
| 1119 | /* EXTWL */ | 1206 | /* EXTWL */ |
| 1120 | - gen_arith3(ctx, &gen_op_extwl, ra, rb, rc, islit, lit); | 1207 | + gen_ext_l(&tcg_gen_ext16u_i64, ra, rb, rc, islit, lit); |
| 1121 | break; | 1208 | break; |
| 1122 | case 0x1B: | 1209 | case 0x1B: |
| 1123 | /* INSWL */ | 1210 | /* INSWL */ |
| 1124 | - gen_arith3(ctx, &gen_op_inswl, ra, rb, rc, islit, lit); | 1211 | + gen_byte_manipulation(helper_inswl, ra, rb, rc, islit, lit); |
| 1125 | break; | 1212 | break; |
| 1126 | case 0x22: | 1213 | case 0x22: |
| 1127 | /* MSKLL */ | 1214 | /* MSKLL */ |
| 1128 | - gen_arith3(ctx, &gen_op_mskll, ra, rb, rc, islit, lit); | 1215 | + gen_byte_manipulation(helper_mskll, ra, rb, rc, islit, lit); |
| 1129 | break; | 1216 | break; |
| 1130 | case 0x26: | 1217 | case 0x26: |
| 1131 | /* EXTLL */ | 1218 | /* EXTLL */ |
| 1132 | - gen_arith3(ctx, &gen_op_extll, ra, rb, rc, islit, lit); | 1219 | + gen_ext_l(&tcg_gen_ext32u_i64, ra, rb, rc, islit, lit); |
| 1133 | break; | 1220 | break; |
| 1134 | case 0x2B: | 1221 | case 0x2B: |
| 1135 | /* INSLL */ | 1222 | /* INSLL */ |
| 1136 | - gen_arith3(ctx, &gen_op_insll, ra, rb, rc, islit, lit); | 1223 | + gen_byte_manipulation(helper_insll, ra, rb, rc, islit, lit); |
| 1137 | break; | 1224 | break; |
| 1138 | case 0x30: | 1225 | case 0x30: |
| 1139 | /* ZAP */ | 1226 | /* ZAP */ |
| 1140 | - gen_arith3(ctx, &gen_op_zap, ra, rb, rc, islit, lit); | 1227 | + gen_byte_manipulation(helper_zap, ra, rb, rc, islit, lit); |
| 1141 | break; | 1228 | break; |
| 1142 | case 0x31: | 1229 | case 0x31: |
| 1143 | /* ZAPNOT */ | 1230 | /* ZAPNOT */ |
| 1144 | - gen_arith3(ctx, &gen_op_zapnot, ra, rb, rc, islit, lit); | 1231 | + gen_byte_manipulation(helper_zapnot, ra, rb, rc, islit, lit); |
| 1145 | break; | 1232 | break; |
| 1146 | case 0x32: | 1233 | case 0x32: |
| 1147 | /* MSKQL */ | 1234 | /* MSKQL */ |
| 1148 | - gen_arith3(ctx, &gen_op_mskql, ra, rb, rc, islit, lit); | 1235 | + gen_byte_manipulation(helper_mskql, ra, rb, rc, islit, lit); |
| 1149 | break; | 1236 | break; |
| 1150 | case 0x34: | 1237 | case 0x34: |
| 1151 | /* SRL */ | 1238 | /* SRL */ |
| @@ -1166,7 +1253,7 @@ static always_inline int translate_one (DisasContext *ctx, uint32_t insn) | @@ -1166,7 +1253,7 @@ static always_inline int translate_one (DisasContext *ctx, uint32_t insn) | ||
| 1166 | break; | 1253 | break; |
| 1167 | case 0x36: | 1254 | case 0x36: |
| 1168 | /* EXTQL */ | 1255 | /* EXTQL */ |
| 1169 | - gen_arith3(ctx, &gen_op_extql, ra, rb, rc, islit, lit); | 1256 | + gen_ext_l(NULL, ra, rb, rc, islit, lit); |
| 1170 | break; | 1257 | break; |
| 1171 | case 0x39: | 1258 | case 0x39: |
| 1172 | /* SLL */ | 1259 | /* SLL */ |
| @@ -1187,7 +1274,7 @@ static always_inline int translate_one (DisasContext *ctx, uint32_t insn) | @@ -1187,7 +1274,7 @@ static always_inline int translate_one (DisasContext *ctx, uint32_t insn) | ||
| 1187 | break; | 1274 | break; |
| 1188 | case 0x3B: | 1275 | case 0x3B: |
| 1189 | /* INSQL */ | 1276 | /* INSQL */ |
| 1190 | - gen_arith3(ctx, &gen_op_insql, ra, rb, rc, islit, lit); | 1277 | + gen_byte_manipulation(helper_insql, ra, rb, rc, islit, lit); |
| 1191 | break; | 1278 | break; |
| 1192 | case 0x3C: | 1279 | case 0x3C: |
| 1193 | /* SRA */ | 1280 | /* SRA */ |
| @@ -1208,39 +1295,39 @@ static always_inline int translate_one (DisasContext *ctx, uint32_t insn) | @@ -1208,39 +1295,39 @@ static always_inline int translate_one (DisasContext *ctx, uint32_t insn) | ||
| 1208 | break; | 1295 | break; |
| 1209 | case 0x52: | 1296 | case 0x52: |
| 1210 | /* MSKWH */ | 1297 | /* MSKWH */ |
| 1211 | - gen_arith3(ctx, &gen_op_mskwh, ra, rb, rc, islit, lit); | 1298 | + gen_byte_manipulation(helper_mskwh, ra, rb, rc, islit, lit); |
| 1212 | break; | 1299 | break; |
| 1213 | case 0x57: | 1300 | case 0x57: |
| 1214 | /* INSWH */ | 1301 | /* INSWH */ |
| 1215 | - gen_arith3(ctx, &gen_op_inswh, ra, rb, rc, islit, lit); | 1302 | + gen_byte_manipulation(helper_inswh, ra, rb, rc, islit, lit); |
| 1216 | break; | 1303 | break; |
| 1217 | case 0x5A: | 1304 | case 0x5A: |
| 1218 | /* EXTWH */ | 1305 | /* EXTWH */ |
| 1219 | - gen_arith3(ctx, &gen_op_extwh, ra, rb, rc, islit, lit); | 1306 | + gen_ext_h(&tcg_gen_ext16u_i64, ra, rb, rc, islit, lit); |
| 1220 | break; | 1307 | break; |
| 1221 | case 0x62: | 1308 | case 0x62: |
| 1222 | /* MSKLH */ | 1309 | /* MSKLH */ |
| 1223 | - gen_arith3(ctx, &gen_op_msklh, ra, rb, rc, islit, lit); | 1310 | + gen_byte_manipulation(helper_msklh, ra, rb, rc, islit, lit); |
| 1224 | break; | 1311 | break; |
| 1225 | case 0x67: | 1312 | case 0x67: |
| 1226 | /* INSLH */ | 1313 | /* INSLH */ |
| 1227 | - gen_arith3(ctx, &gen_op_inslh, ra, rb, rc, islit, lit); | 1314 | + gen_byte_manipulation(helper_inslh, ra, rb, rc, islit, lit); |
| 1228 | break; | 1315 | break; |
| 1229 | case 0x6A: | 1316 | case 0x6A: |
| 1230 | /* EXTLH */ | 1317 | /* EXTLH */ |
| 1231 | - gen_arith3(ctx, &gen_op_extlh, ra, rb, rc, islit, lit); | 1318 | + gen_ext_h(&tcg_gen_ext16u_i64, ra, rb, rc, islit, lit); |
| 1232 | break; | 1319 | break; |
| 1233 | case 0x72: | 1320 | case 0x72: |
| 1234 | /* MSKQH */ | 1321 | /* MSKQH */ |
| 1235 | - gen_arith3(ctx, &gen_op_mskqh, ra, rb, rc, islit, lit); | 1322 | + gen_byte_manipulation(helper_mskqh, ra, rb, rc, islit, lit); |
| 1236 | break; | 1323 | break; |
| 1237 | case 0x77: | 1324 | case 0x77: |
| 1238 | /* INSQH */ | 1325 | /* INSQH */ |
| 1239 | - gen_arith3(ctx, &gen_op_insqh, ra, rb, rc, islit, lit); | 1326 | + gen_byte_manipulation(helper_insqh, ra, rb, rc, islit, lit); |
| 1240 | break; | 1327 | break; |
| 1241 | case 0x7A: | 1328 | case 0x7A: |
| 1242 | /* EXTQH */ | 1329 | /* EXTQH */ |
| 1243 | - gen_arith3(ctx, &gen_op_extqh, ra, rb, rc, islit, lit); | 1330 | + gen_ext_h(NULL, ra, rb, rc, islit, lit); |
| 1244 | break; | 1331 | break; |
| 1245 | default: | 1332 | default: |
| 1246 | goto invalid_opc; | 1333 | goto invalid_opc; |