tcg: Add signed multiword multiplication operations
Signed-off-by: Richard Henderson <rth@twiddle.net> Signed-off-by: Blue Swirl <blauwirbel@gmail.com>
This commit is contained in:
		
							parent
							
								
									d7156f7ce4
								
							
						
					
					
						commit
						4d3203fd0b
					
				| @ -375,6 +375,10 @@ is returned in two single-word outputs. | ||||
| Similar to mul, except two unsigned inputs T1 and T2 yielding the full | ||||
| double-word product T0.  The later is returned in two single-word outputs. | ||||
| 
 | ||||
| * muls2_i32/i64 t0_low, t0_high, t1, t2 | ||||
| 
 | ||||
| Similar to mulu2, except the two inputs T1 and T2 are signed. | ||||
| 
 | ||||
| ********* 64-bit target on 32-bit host support | ||||
| 
 | ||||
| The following opcodes are internal to TCG.  Thus they are to be implemented by | ||||
|  | ||||
| @ -75,6 +75,7 @@ typedef enum { | ||||
| #define TCG_TARGET_HAS_nor_i32          0 | ||||
| #define TCG_TARGET_HAS_deposit_i32      0 | ||||
| #define TCG_TARGET_HAS_movcond_i32      1 | ||||
| #define TCG_TARGET_HAS_muls2_i32        0 | ||||
| 
 | ||||
| enum { | ||||
|     TCG_AREG0 = TCG_REG_R6, | ||||
|  | ||||
| @ -98,6 +98,7 @@ typedef enum { | ||||
| #define TCG_TARGET_HAS_nor_i32          0 | ||||
| #define TCG_TARGET_HAS_deposit_i32      1 | ||||
| #define TCG_TARGET_HAS_movcond_i32      1 | ||||
| #define TCG_TARGET_HAS_muls2_i32        0 | ||||
| 
 | ||||
| /* optional instructions automatically implemented */ | ||||
| #define TCG_TARGET_HAS_neg_i32          0 /* sub rd, 0, rs */ | ||||
|  | ||||
| @ -95,6 +95,7 @@ typedef enum { | ||||
| #define TCG_TARGET_HAS_add2_i32         1 | ||||
| #define TCG_TARGET_HAS_sub2_i32         1 | ||||
| #define TCG_TARGET_HAS_mulu2_i32        1 | ||||
| #define TCG_TARGET_HAS_muls2_i32        0 | ||||
| 
 | ||||
| #if TCG_TARGET_REG_BITS == 64 | ||||
| #define TCG_TARGET_HAS_div2_i64         1 | ||||
| @ -120,6 +121,7 @@ typedef enum { | ||||
| #define TCG_TARGET_HAS_add2_i64         0 | ||||
| #define TCG_TARGET_HAS_sub2_i64         0 | ||||
| #define TCG_TARGET_HAS_mulu2_i64        0 | ||||
| #define TCG_TARGET_HAS_muls2_i64        0 | ||||
| #endif | ||||
| 
 | ||||
| #define TCG_TARGET_deposit_i32_valid(ofs, len) \ | ||||
|  | ||||
| @ -142,6 +142,8 @@ typedef enum { | ||||
| #define TCG_TARGET_HAS_sub2_i64         0 | ||||
| #define TCG_TARGET_HAS_mulu2_i32        0 | ||||
| #define TCG_TARGET_HAS_mulu2_i64        0 | ||||
| #define TCG_TARGET_HAS_muls2_i32        0 | ||||
| #define TCG_TARGET_HAS_muls2_i64        0 | ||||
| 
 | ||||
| #define TCG_TARGET_deposit_i32_valid(ofs, len) ((len) <= 16) | ||||
| #define TCG_TARGET_deposit_i64_valid(ofs, len) ((len) <= 16) | ||||
|  | ||||
| @ -87,6 +87,7 @@ typedef enum { | ||||
| #define TCG_TARGET_HAS_orc_i32          0 | ||||
| #define TCG_TARGET_HAS_eqv_i32          0 | ||||
| #define TCG_TARGET_HAS_nand_i32         0 | ||||
| #define TCG_TARGET_HAS_muls2_i32        0 | ||||
| 
 | ||||
| /* optional instructions only implemented on MIPS4, MIPS32 and Loongson 2 */ | ||||
| #if (defined(__mips_isa_rev) && (__mips_isa_rev >= 1)) || \ | ||||
|  | ||||
| @ -559,6 +559,7 @@ static TCGArg *tcg_constant_folding(TCGContext *s, uint16_t *tcg_opc_ptr, | ||||
|             swap_commutative(args[1], &args[3], &args[5]); | ||||
|             break; | ||||
|         CASE_OP_32_64(mulu2): | ||||
|         CASE_OP_32_64(muls2): | ||||
|             swap_commutative(args[0], &args[2], &args[3]); | ||||
|             break; | ||||
|         case INDEX_op_brcond2_i32: | ||||
|  | ||||
| @ -94,6 +94,7 @@ typedef enum { | ||||
| #define TCG_TARGET_HAS_nor_i32          1 | ||||
| #define TCG_TARGET_HAS_deposit_i32      1 | ||||
| #define TCG_TARGET_HAS_movcond_i32      1 | ||||
| #define TCG_TARGET_HAS_muls2_i32        0 | ||||
| 
 | ||||
| #define TCG_AREG0 TCG_REG_R27 | ||||
| 
 | ||||
|  | ||||
| @ -88,6 +88,7 @@ typedef enum { | ||||
| #define TCG_TARGET_HAS_add2_i32         0 | ||||
| #define TCG_TARGET_HAS_sub2_i32         0 | ||||
| #define TCG_TARGET_HAS_mulu2_i32        0 | ||||
| #define TCG_TARGET_HAS_muls2_i32        0 | ||||
| 
 | ||||
| #define TCG_TARGET_HAS_div_i64          1 | ||||
| #define TCG_TARGET_HAS_rot_i64          0 | ||||
| @ -112,6 +113,7 @@ typedef enum { | ||||
| #define TCG_TARGET_HAS_add2_i64         0 | ||||
| #define TCG_TARGET_HAS_sub2_i64         0 | ||||
| #define TCG_TARGET_HAS_mulu2_i64        0 | ||||
| #define TCG_TARGET_HAS_muls2_i64        0 | ||||
| 
 | ||||
| #define TCG_AREG0 TCG_REG_R27 | ||||
| 
 | ||||
|  | ||||
| @ -68,6 +68,7 @@ typedef enum TCGReg { | ||||
| #define TCG_TARGET_HAS_add2_i32         0 | ||||
| #define TCG_TARGET_HAS_sub2_i32         0 | ||||
| #define TCG_TARGET_HAS_mulu2_i32        0 | ||||
| #define TCG_TARGET_HAS_muls2_i32        0 | ||||
| 
 | ||||
| #if TCG_TARGET_REG_BITS == 64 | ||||
| #define TCG_TARGET_HAS_div2_i64         1 | ||||
| @ -93,6 +94,7 @@ typedef enum TCGReg { | ||||
| #define TCG_TARGET_HAS_add2_i64         0 | ||||
| #define TCG_TARGET_HAS_sub2_i64         0 | ||||
| #define TCG_TARGET_HAS_mulu2_i64        0 | ||||
| #define TCG_TARGET_HAS_muls2_i64        0 | ||||
| #endif | ||||
| 
 | ||||
| /* used for function call generation */ | ||||
|  | ||||
| @ -105,6 +105,7 @@ typedef enum { | ||||
| #define TCG_TARGET_HAS_add2_i32         1 | ||||
| #define TCG_TARGET_HAS_sub2_i32         1 | ||||
| #define TCG_TARGET_HAS_mulu2_i32        1 | ||||
| #define TCG_TARGET_HAS_muls2_i32        0 | ||||
| 
 | ||||
| #if TCG_TARGET_REG_BITS == 64 | ||||
| #define TCG_TARGET_HAS_div_i64          1 | ||||
| @ -130,6 +131,7 @@ typedef enum { | ||||
| #define TCG_TARGET_HAS_add2_i64         0 | ||||
| #define TCG_TARGET_HAS_sub2_i64         0 | ||||
| #define TCG_TARGET_HAS_mulu2_i64        0 | ||||
| #define TCG_TARGET_HAS_muls2_i64        0 | ||||
| #endif | ||||
| 
 | ||||
| #define TCG_AREG0 TCG_REG_I0 | ||||
|  | ||||
| @ -86,6 +86,7 @@ DEF(brcond_i32, 0, 2, 2, TCG_OPF_BB_END) | ||||
| DEF(add2_i32, 2, 4, 0, IMPL(TCG_TARGET_HAS_add2_i32)) | ||||
| DEF(sub2_i32, 2, 4, 0, IMPL(TCG_TARGET_HAS_sub2_i32)) | ||||
| DEF(mulu2_i32, 2, 2, 0, IMPL(TCG_TARGET_HAS_mulu2_i32)) | ||||
| DEF(muls2_i32, 2, 2, 0, IMPL(TCG_TARGET_HAS_muls2_i32)) | ||||
| DEF(brcond2_i32, 0, 4, 2, TCG_OPF_BB_END | IMPL(TCG_TARGET_REG_BITS == 32)) | ||||
| DEF(setcond2_i32, 1, 4, 1, IMPL(TCG_TARGET_REG_BITS == 32)) | ||||
| 
 | ||||
| @ -161,6 +162,7 @@ DEF(nor_i64, 1, 2, 0, IMPL64 | IMPL(TCG_TARGET_HAS_nor_i64)) | ||||
| DEF(add2_i64, 2, 4, 0, IMPL64 | IMPL(TCG_TARGET_HAS_add2_i64)) | ||||
| DEF(sub2_i64, 2, 4, 0, IMPL64 | IMPL(TCG_TARGET_HAS_sub2_i64)) | ||||
| DEF(mulu2_i64, 2, 2, 0, IMPL64 | IMPL(TCG_TARGET_HAS_mulu2_i64)) | ||||
| DEF(muls2_i64, 2, 2, 0, IMPL64 | IMPL(TCG_TARGET_HAS_muls2_i64)) | ||||
| 
 | ||||
| /* QEMU specific */ | ||||
| #if TARGET_LONG_BITS > TCG_TARGET_REG_BITS | ||||
|  | ||||
| @ -83,6 +83,7 @@ typedef uint64_t TCGRegSet; | ||||
| #define TCG_TARGET_HAS_add2_i64         0 | ||||
| #define TCG_TARGET_HAS_sub2_i64         0 | ||||
| #define TCG_TARGET_HAS_mulu2_i64        0 | ||||
| #define TCG_TARGET_HAS_muls2_i64        0 | ||||
| /* Turn some undef macros into true macros.  */ | ||||
| #define TCG_TARGET_HAS_add2_i32         1 | ||||
| #define TCG_TARGET_HAS_sub2_i32         1 | ||||
|  | ||||
| @ -76,6 +76,7 @@ | ||||
| #define TCG_TARGET_HAS_orc_i32          0 | ||||
| #define TCG_TARGET_HAS_rot_i32          1 | ||||
| #define TCG_TARGET_HAS_movcond_i32      0 | ||||
| #define TCG_TARGET_HAS_muls2_i32        0 | ||||
| 
 | ||||
| #if TCG_TARGET_REG_BITS == 64 | ||||
| #define TCG_TARGET_HAS_bswap16_i64      1 | ||||
| @ -100,6 +101,7 @@ | ||||
| #define TCG_TARGET_HAS_orc_i64          0 | ||||
| #define TCG_TARGET_HAS_rot_i64          1 | ||||
| #define TCG_TARGET_HAS_movcond_i64      0 | ||||
| #define TCG_TARGET_HAS_muls2_i64        0 | ||||
| 
 | ||||
| #define TCG_TARGET_HAS_add2_i32         0 | ||||
| #define TCG_TARGET_HAS_sub2_i32         0 | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user
	 Richard Henderson
						Richard Henderson