target-s390: Convert CSP
Signed-off-by: Richard Henderson <rth@twiddle.net>
This commit is contained in:
		
							parent
							
								
									204504e2fa
								
							
						
					
					
						commit
						3d596f4912
					
				| @ -99,7 +99,7 @@ DEF_HELPER_FLAGS_2(tprot, TCG_CALL_NO_RWG, i32, i64, i64) | |||||||
| DEF_HELPER_FLAGS_2(iske, TCG_CALL_NO_RWG_SE, i64, env, i64) | DEF_HELPER_FLAGS_2(iske, TCG_CALL_NO_RWG_SE, i64, env, i64) | ||||||
| DEF_HELPER_FLAGS_3(sske, TCG_CALL_NO_RWG, void, env, i64, i64) | DEF_HELPER_FLAGS_3(sske, TCG_CALL_NO_RWG, void, env, i64, i64) | ||||||
| DEF_HELPER_FLAGS_2(rrbe, TCG_CALL_NO_RWG, i32, env, i64) | DEF_HELPER_FLAGS_2(rrbe, TCG_CALL_NO_RWG, i32, env, i64) | ||||||
| DEF_HELPER_3(csp, i32, env, i32, i32) | DEF_HELPER_3(csp, i32, env, i32, i64) | ||||||
| DEF_HELPER_4(mvcs, i32, env, i64, i64, i64) | DEF_HELPER_4(mvcs, i32, env, i64, i64, i64) | ||||||
| DEF_HELPER_4(mvcp, i32, env, i64, i64, i64) | DEF_HELPER_4(mvcp, i32, env, i64, i64, i64) | ||||||
| DEF_HELPER_4(sigp, i32, env, i64, i32, i64) | DEF_HELPER_4(sigp, i32, env, i64, i32, i64) | ||||||
|  | |||||||
| @ -614,6 +614,8 @@ | |||||||
|     C(0xf300, UNPK,    SS_a,  Z,   la1, a2, 0, 0, unpk, 0) |     C(0xf300, UNPK,    SS_a,  Z,   la1, a2, 0, 0, unpk, 0) | ||||||
| 
 | 
 | ||||||
| #ifndef CONFIG_USER_ONLY | #ifndef CONFIG_USER_ONLY | ||||||
|  | /* COMPARE AND SWAP AND PURGE */ | ||||||
|  |     C(0xb250, CSP,     RRE,   Z,   0, ra2, 0, 0, csp, 0) | ||||||
| /* DIAGNOSE (KVM hypercall) */ | /* DIAGNOSE (KVM hypercall) */ | ||||||
|     C(0x8300, DIAG,    RX_a,  Z,   0, 0, 0, 0, diag, 0) |     C(0x8300, DIAG,    RX_a,  Z,   0, 0, 0, 0, diag, 0) | ||||||
| /* INSERT STORAGE KEY EXTENDED */ | /* INSERT STORAGE KEY EXTENDED */ | ||||||
|  | |||||||
| @ -984,16 +984,16 @@ uint32_t HELPER(rrbe)(CPUS390XState *env, uint64_t r2) | |||||||
| } | } | ||||||
| 
 | 
 | ||||||
| /* compare and swap and purge */ | /* compare and swap and purge */ | ||||||
| uint32_t HELPER(csp)(CPUS390XState *env, uint32_t r1, uint32_t r2) | uint32_t HELPER(csp)(CPUS390XState *env, uint32_t r1, uint64_t r2) | ||||||
| { | { | ||||||
|     uint32_t cc; |     uint32_t cc; | ||||||
|     uint32_t o1 = env->regs[r1]; |     uint32_t o1 = env->regs[r1]; | ||||||
|     uint64_t a2 = get_address_31fix(env, r2) & ~3ULL; |     uint64_t a2 = r2 & ~3ULL; | ||||||
|     uint32_t o2 = cpu_ldl_data(env, a2); |     uint32_t o2 = cpu_ldl_data(env, a2); | ||||||
| 
 | 
 | ||||||
|     if (o1 == o2) { |     if (o1 == o2) { | ||||||
|         cpu_stl_data(env, a2, env->regs[(r1 + 1) & 15]); |         cpu_stl_data(env, a2, env->regs[(r1 + 1) & 15]); | ||||||
|         if (env->regs[r2] & 0x3) { |         if (r2 & 0x3) { | ||||||
|             /* flush TLB / ALB */ |             /* flush TLB / ALB */ | ||||||
|             tlb_flush(env, 1); |             tlb_flush(env, 1); | ||||||
|         } |         } | ||||||
|  | |||||||
| @ -1033,18 +1033,6 @@ static void disas_b2(CPUS390XState *env, DisasContext *s, int op, | |||||||
|     LOG_DISAS("disas_b2: op 0x%x r1 %d r2 %d\n", op, r1, r2); |     LOG_DISAS("disas_b2: op 0x%x r1 %d r2 %d\n", op, r1, r2); | ||||||
| 
 | 
 | ||||||
|     switch (op) { |     switch (op) { | ||||||
|     case 0x50: /* CSP      R1,R2      [RRE] */ |  | ||||||
|         /* Compare And Swap And Purge */ |  | ||||||
|         check_privileged(s); |  | ||||||
|         r1 = (insn >> 4) & 0xf; |  | ||||||
|         r2 = insn & 0xf; |  | ||||||
|         tmp32_1 = tcg_const_i32(r1); |  | ||||||
|         tmp32_2 = tcg_const_i32(r2); |  | ||||||
|         gen_helper_csp(cc_op, cpu_env, tmp32_1, tmp32_2); |  | ||||||
|         set_cc_static(s); |  | ||||||
|         tcg_temp_free_i32(tmp32_1); |  | ||||||
|         tcg_temp_free_i32(tmp32_2); |  | ||||||
|         break; |  | ||||||
|     case 0x78: /* STCKE    D2(B2)     [S] */ |     case 0x78: /* STCKE    D2(B2)     [S] */ | ||||||
|         /* Store Clock Extended */ |         /* Store Clock Extended */ | ||||||
|         decode_rs(s, insn, &r1, &r3, &b2, &d2); |         decode_rs(s, insn, &r1, &r3, &b2, &d2); | ||||||
| @ -1901,6 +1889,18 @@ static ExitStatus op_csg(DisasContext *s, DisasOps *o) | |||||||
|     return NO_EXIT; |     return NO_EXIT; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | #ifndef CONFIG_USER_ONLY | ||||||
|  | static ExitStatus op_csp(DisasContext *s, DisasOps *o) | ||||||
|  | { | ||||||
|  |     TCGv_i32 r1 = tcg_const_i32(get_field(s->fields, r1)); | ||||||
|  |     check_privileged(s); | ||||||
|  |     gen_helper_csp(cc_op, cpu_env, r1, o->in2); | ||||||
|  |     tcg_temp_free_i32(r1); | ||||||
|  |     set_cc_static(s); | ||||||
|  |     return NO_EXIT; | ||||||
|  | } | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
| static ExitStatus op_cds(DisasContext *s, DisasOps *o) | static ExitStatus op_cds(DisasContext *s, DisasOps *o) | ||||||
| { | { | ||||||
|     int r3 = get_field(s->fields, r3); |     int r3 = get_field(s->fields, r3); | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user
	 Richard Henderson
						Richard Henderson