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_3(sske, TCG_CALL_NO_RWG, void, env, i64, 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(mvcp, i32, env, i64, i64, 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) | ||||
| 
 | ||||
| #ifndef CONFIG_USER_ONLY | ||||
| /* COMPARE AND SWAP AND PURGE */ | ||||
|     C(0xb250, CSP,     RRE,   Z,   0, ra2, 0, 0, csp, 0) | ||||
| /* DIAGNOSE (KVM hypercall) */ | ||||
|     C(0x8300, DIAG,    RX_a,  Z,   0, 0, 0, 0, diag, 0) | ||||
| /* INSERT STORAGE KEY EXTENDED */ | ||||
|  | ||||
| @ -984,16 +984,16 @@ uint32_t HELPER(rrbe)(CPUS390XState *env, uint64_t r2) | ||||
| } | ||||
| 
 | ||||
| /* 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 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); | ||||
| 
 | ||||
|     if (o1 == o2) { | ||||
|         cpu_stl_data(env, a2, env->regs[(r1 + 1) & 15]); | ||||
|         if (env->regs[r2] & 0x3) { | ||||
|         if (r2 & 0x3) { | ||||
|             /* flush TLB / ALB */ | ||||
|             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); | ||||
| 
 | ||||
|     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] */ | ||||
|         /* Store Clock Extended */ | ||||
|         decode_rs(s, insn, &r1, &r3, &b2, &d2); | ||||
| @ -1901,6 +1889,18 @@ static ExitStatus op_csg(DisasContext *s, DisasOps *o) | ||||
|     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) | ||||
| { | ||||
|     int r3 = get_field(s->fields, r3); | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user
	 Richard Henderson
						Richard Henderson